]> git.immae.eu Git - perso/Immae/Config/Nix.git/commitdiff
Squash changes containing private information
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Tue, 3 Oct 2023 23:35:06 +0000 (01:35 +0200)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Wed, 4 Oct 2023 00:11:48 +0000 (02:11 +0200)
There were a lot of changes since the previous commit, but a lot of them
contained personnal information about users. All thos changes got
stashed into a single commit (history is kept in a different place) and
private information was moved in a separate private repository

945 files changed:
.envrc
.gitconfig [deleted file]
.gitignore
.gitmodules [deleted file]
DOCUMENTATION.md
Makefile
default.nix
deploy/flake.lock [new file with mode: 0644]
deploy/flake.nix [new file with mode: 0644]
environments/default.nix [deleted file]
environments/immae-eu.nix [deleted file]
flake.lock [new file with mode: 0644]
flake.nix [new file with mode: 0644]
flakes/backports/flake.lock
flakes/backports/flake.nix
flakes/copanier/default.nix [new file with mode: 0644]
flakes/copanier/fix_reduce.patch [new file with mode: 0644]
flakes/copanier/flake.lock [new file with mode: 0644]
flakes/copanier/flake.nix [new file with mode: 0644]
flakes/copanier/poetry.lock [new file with mode: 0644]
flakes/copanier/pyproject.toml [new file with mode: 0644]
flakes/diaspora/default.nix [new file with mode: 0644]
flakes/diaspora/flake.lock [new file with mode: 0644]
flakes/diaspora/flake.nix [new file with mode: 0644]
flakes/diaspora/gemset.nix [moved from pkgs/webapps/diaspora/gemset.nix with 100% similarity]
flakes/diaspora/gemset_ldap.nix [moved from pkgs/webapps/diaspora/gemset_ldap.nix with 100% similarity]
flakes/diaspora/ldap.patch [moved from pkgs/webapps/diaspora/ldap.patch with 100% similarity]
flakes/etherpad-lite/default.nix [moved from pkgs/webapps/etherpad-lite/default.nix with 77% similarity]
flakes/etherpad-lite/etherpad_cleanup.sql [new file with mode: 0644]
flakes/etherpad-lite/flake.lock [new file with mode: 0644]
flakes/etherpad-lite/flake.nix [new file with mode: 0644]
flakes/etherpad-lite/libreoffice_patch.diff [moved from pkgs/webapps/etherpad-lite/libreoffice_patch.diff with 100% similarity]
flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_adminpads/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_adminpads/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_align/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_align/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_bookmark/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_bookmark/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_colors/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_colors/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_comments_page/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_comments_page/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_cursortrace/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_cursortrace/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_embedmedia/fix.patch [moved from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/fix.patch with 100% similarity]
flakes/etherpad-lite/modules/ep_embedmedia/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_embedmedia/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_font_family/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_font_family/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_font_size/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_font_size/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_headings2/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_headings2/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_immae_buttons/ep.json [moved from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/ep.json with 100% similarity]
flakes/etherpad-lite/modules/ep_immae_buttons/hooks.js [moved from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/hooks.js with 100% similarity]
flakes/etherpad-lite/modules/ep_immae_buttons/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_immae_buttons/package.json [moved from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/package.json with 100% similarity]
flakes/etherpad-lite/modules/ep_immae_buttons/static/js/main.js [moved from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/static/js/main.js with 100% similarity]
flakes/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs [moved from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs with 100% similarity]
flakes/etherpad-lite/modules/ep_ldapauth/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_ldapauth/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_line_height/fix.patch [moved from pkgs/webapps/etherpad-lite/modules/ep_line_height/fix.patch with 100% similarity]
flakes/etherpad-lite/modules/ep_line_height/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_line_height/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_markdown/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_markdown/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_mypads/fix_ldap.patch [moved from pkgs/webapps/etherpad-lite/modules/ep_mypads/fix_ldap.patch with 100% similarity]
flakes/etherpad-lite/modules/ep_mypads/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_mypads/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_page_view/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_page_view/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_previewimages/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_previewimages/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_private_pad/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_private_pad/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_ruler/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_ruler/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_scrollto/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_scrollto/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_subscript_and_superscript/font.patch [moved from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/font.patch with 100% similarity]
flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix with 100% similarity]
flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.json [moved from pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.json with 100% similarity]
flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix [moved from pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix with 100% similarity]
flakes/etherpad-lite/node-packages.nix [moved from pkgs/webapps/etherpad-lite/node-packages.nix with 100% similarity]
flakes/files-watcher/flake.nix
flakes/flake.lock [new file with mode: 0644]
flakes/flake.nix [new file with mode: 0644]
flakes/grocy/default.nix [moved from pkgs/webapps/grocy/default.nix with 83% similarity]
flakes/grocy/flake.lock [new file with mode: 0644]
flakes/grocy/flake.nix [new file with mode: 0644]
flakes/grocy/php-packages.nix [moved from pkgs/webapps/grocy/php-packages.nix with 100% similarity]
flakes/grocy/yarn-packages.nix [moved from pkgs/webapps/grocy/yarn-packages.nix with 100% similarity]
flakes/grocy/yarn.patch [moved from pkgs/webapps/grocy/yarn.patch with 100% similarity]
flakes/lib/flake.lock
flakes/lib/flake.nix
flakes/loginctl-linger/flake.nix [new file with mode: 0644]
flakes/mastodon/default.nix [moved from pkgs/webapps/mastodon/default.nix with 82% similarity]
flakes/mastodon/flake.lock [new file with mode: 0644]
flakes/mastodon/flake.nix [new file with mode: 0644]
flakes/mastodon/gemset.nix [moved from pkgs/webapps/mastodon/gemset.nix with 100% similarity]
flakes/mastodon/yarn-packages.nix [moved from pkgs/webapps/mastodon/yarn-packages.nix with 100% similarity]
flakes/mediagoblin/bower-packages.nix [moved from pkgs/webapps/mediagoblin/bower-packages.nix with 100% similarity]
flakes/mediagoblin/default.nix [moved from pkgs/webapps/mediagoblin/default.nix with 89% similarity]
flakes/mediagoblin/flake.lock [new file with mode: 0644]
flakes/mediagoblin/flake.nix [new file with mode: 0644]
flakes/mediagoblin/ldap_fix.py [moved from pkgs/webapps/mediagoblin/ldap_fix.py with 100% similarity]
flakes/mediagoblin/plugins/basicsearch/default.nix [moved from pkgs/webapps/mediagoblin/plugins/basicsearch/default.nix with 100% similarity]
flakes/multi-apache-container/flake.lock [new file with mode: 0644]
flakes/multi-apache-container/flake.nix [new file with mode: 0644]
flakes/mypackages/flake.lock [new file with mode: 0644]
flakes/mypackages/flake.nix [new file with mode: 0644]
flakes/mypackages/lib/default.nix [new file with mode: 0644]
flakes/mypackages/lib/flake-parts-lib.nix [new file with mode: 0644]
flakes/mypackages/lib/node-env.nix [moved from lib/node-env.nix with 90% similarity]
flakes/mypackages/lib/private/default.nix [moved from lib/private/default.nix with 97% similarity]
flakes/mypackages/overlays/bitlbee-discord/default.nix [moved from overlays/bitlbee-discord/default.nix with 60% similarity]
flakes/mypackages/overlays/bitlbee/bitlbee_long_nicks.patch [moved from overlays/bitlbee/bitlbee_long_nicks.patch with 100% similarity]
flakes/mypackages/overlays/bitlbee/default.nix [moved from overlays/bitlbee/default.nix with 100% similarity]
flakes/mypackages/overlays/databases/mysql/default.nix [new file with mode: 0644]
flakes/mypackages/overlays/databases/postgresql/default.nix [moved from overlays/databases/postgresql/default.nix with 100% similarity]
flakes/mypackages/overlays/default.nix [new file with mode: 0644]
flakes/mypackages/overlays/gitolite/default.nix [moved from overlays/gitolite/default.nix with 100% similarity]
flakes/mypackages/overlays/gitolite/invite [moved from overlays/gitolite/invite with 100% similarity]
flakes/mypackages/overlays/gitweb/default.nix [moved from overlays/gitweb/default.nix with 100% similarity]
flakes/mypackages/overlays/gitweb/theme/git-favicon.png [moved from overlays/gitweb/theme/git-favicon.png with 100% similarity]
flakes/mypackages/overlays/gitweb/theme/git-logo.png [moved from overlays/gitweb/theme/git-logo.png with 100% similarity]
flakes/mypackages/overlays/gitweb/theme/gitweb.css [moved from overlays/gitweb/theme/gitweb.css with 100% similarity]
flakes/mypackages/overlays/gitweb/theme/gitweb.js [moved from overlays/gitweb/theme/gitweb.js with 100% similarity]
flakes/mypackages/overlays/goaccess/default.nix [moved from overlays/goaccess/default.nix with 100% similarity]
flakes/mypackages/overlays/kanboard/default.nix [new file with mode: 0644]
flakes/mypackages/overlays/morph/default.nix [new file with mode: 0644]
flakes/mypackages/overlays/morph/dry-run.patch [moved from overlays/morph/dry-run.patch with 100% similarity]
flakes/mypackages/overlays/morph/verbose_nix.patch [moved from overlays/morph/verbose_nix.patch with 100% similarity]
flakes/mypackages/overlays/php-packages/mysqli_patch.patch [moved from overlays/php-packages/mysqli_patch.patch with 100% similarity]
flakes/mypackages/overlays/postfix/default.nix [moved from overlays/postfix/default.nix with 100% similarity]
flakes/mypackages/overlays/taskwarrior/TW-1778_patch.diff [moved from overlays/taskwarrior/TW-1778_patch.diff with 100% similarity]
flakes/mypackages/overlays/taskwarrior/default.nix [moved from overlays/taskwarrior/default.nix with 100% similarity]
flakes/mypackages/overlays/ympd/default.nix [new file with mode: 0644]
flakes/mypackages/overlays/ympd/ympd-password-env.patch [moved from overlays/ympd/ympd-password-env.patch with 100% similarity]
flakes/mypackages/pkgs/bash-libs/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/boinctui/default.nix [moved from pkgs/boinctui/default.nix with 63% similarity]
flakes/mypackages/pkgs/cnagios/default.nix [moved from pkgs/cnagios/default.nix with 60% similarity]
flakes/mypackages/pkgs/commento/default.nix [moved from pkgs/commento/default.nix with 100% similarity]
flakes/mypackages/pkgs/composer-env/default.nix [moved from pkgs/composer-env/default.nix with 80% similarity]
flakes/mypackages/pkgs/crypto/cardano-cli/default.nix [moved from pkgs/crypto/cardano-cli/default.nix with 100% similarity]
flakes/mypackages/pkgs/crypto/cardano/default.nix [moved from pkgs/crypto/cardano/default.nix with 68% similarity]
flakes/mypackages/pkgs/crypto/iota-cli-app/default.nix [moved from pkgs/crypto/iota-cli-app/default.nix with 54% similarity]
flakes/mypackages/pkgs/crypto/iota-cli-app/node-packages.nix [moved from pkgs/crypto/iota-cli-app/node-packages.nix with 100% similarity]
flakes/mypackages/pkgs/crypto/sia/default.nix [moved from pkgs/crypto/sia/default.nix with 100% similarity]
flakes/mypackages/pkgs/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/dovecot/plugins/deleted_to_trash/default.nix [moved from pkgs/dovecot/plugins/deleted_to_trash/default.nix with 58% similarity]
flakes/mypackages/pkgs/dovecot/plugins/deleted_to_trash/fix_mbox.patch [moved from pkgs/dovecot/plugins/deleted_to_trash/fix_mbox.patch with 100% similarity]
flakes/mypackages/pkgs/flrn/default.nix [moved from pkgs/flrn/default.nix with 57% similarity]
flakes/mypackages/pkgs/fluent-bit/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/fluentd/Gemfile [new file with mode: 0644]
flakes/mypackages/pkgs/fluentd/Gemfile.lock [new file with mode: 0644]
flakes/mypackages/pkgs/fluentd/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/fluentd/gemset.nix [new file with mode: 0644]
flakes/mypackages/pkgs/gearmand/default.nix [moved from pkgs/gearmand/default.nix with 77% similarity]
flakes/mypackages/pkgs/genius/default.nix [moved from pkgs/genius/default.nix with 82% similarity]
flakes/mypackages/pkgs/ical2html/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/monitoring-plugins/default.nix [moved from pkgs/monitoring-plugins/default.nix with 94% similarity]
flakes/mypackages/pkgs/mtop/default.nix [moved from pkgs/mtop/default.nix with 90% similarity]
flakes/mypackages/pkgs/mutt-ics/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/muttprint/0.73-4.diff.gz [moved from pkgs/muttprint/0.73-4.diff.gz with 100% similarity]
flakes/mypackages/pkgs/muttprint/default.nix [moved from pkgs/muttprint/default.nix with 100% similarity]
flakes/mypackages/pkgs/muttprint/regex.patch [moved from pkgs/muttprint/regex.patch with 100% similarity]
flakes/mypackages/pkgs/muttprint/two_edge.patch [moved from pkgs/muttprint/two_edge.patch with 100% similarity]
flakes/mypackages/pkgs/naemon-livestatus/default.nix [moved from pkgs/naemon-livestatus/default.nix with 56% similarity]
flakes/mypackages/pkgs/naemon/default.nix [moved from pkgs/naemon/default.nix with 70% similarity]
flakes/mypackages/pkgs/nagios-cli/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/nagnu/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/nb/default.nix [moved from pkgs/nb/default.nix with 80% similarity]
flakes/mypackages/pkgs/note/default.nix [moved from pkgs/note/default.nix with 88% similarity]
flakes/mypackages/pkgs/notmuch/notmuch-python/default.nix [moved from pkgs/notmuch/notmuch-python/default.nix with 100% similarity]
flakes/mypackages/pkgs/notmuch/notmuch-vim/default.nix [moved from pkgs/notmuch/notmuch-vim/default.nix with 100% similarity]
flakes/mypackages/pkgs/perl-ical-parser-html/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/pgpid/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/predixy/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/proftpd/default.nix [moved from pkgs/proftpd/default.nix with 56% similarity]
flakes/mypackages/pkgs/pure-ftpd/default.nix [moved from pkgs/pure-ftpd/default.nix with 92% similarity]
flakes/mypackages/pkgs/riotkit-do/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/rrsync_sudo/default.nix [moved from pkgs/rrsync_sudo/default.nix with 100% similarity]
flakes/mypackages/pkgs/rrsync_sudo/sudo.patch [moved from pkgs/rrsync_sudo/sudo.patch with 100% similarity]
flakes/mypackages/pkgs/shaarli/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/shaarli/shaarli_ldap.patch [moved from overlays/shaarli/shaarli_ldap.patch with 100% similarity]
flakes/mypackages/pkgs/signaldctl/default.nix [moved from pkgs/signaldctl/default.nix with 100% similarity]
flakes/mypackages/pkgs/slang_1/default.nix [moved from pkgs/slang_1/default.nix with 100% similarity]
flakes/mypackages/pkgs/status_engine/host_perfdata.patch [moved from pkgs/status_engine/host_perfdata.patch with 100% similarity]
flakes/mypackages/pkgs/status_engine/interface.nix [moved from pkgs/status_engine/interface.nix with 63% similarity]
flakes/mypackages/pkgs/status_engine/interface_composer.lock [moved from pkgs/status_engine/interface_composer.lock with 100% similarity]
flakes/mypackages/pkgs/status_engine/interface_php_packages.nix [moved from pkgs/status_engine/interface_php_packages.nix with 100% similarity]
flakes/mypackages/pkgs/status_engine/module.nix [new file with mode: 0644]
flakes/mypackages/pkgs/status_engine/worker.nix [new file with mode: 0644]
flakes/mypackages/pkgs/status_engine/worker_composer.lock [new file with mode: 0644]
flakes/mypackages/pkgs/status_engine/worker_php_packages.nix [new file with mode: 0644]
flakes/mypackages/pkgs/telegram-history-dump/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/telegramircd/default.nix [moved from pkgs/telegramircd/default.nix with 62% similarity]
flakes/mypackages/pkgs/telethon_sync/default.nix [moved from pkgs/telethon_sync/default.nix with 100% similarity]
flakes/mypackages/pkgs/terminal-velocity/default.nix [moved from pkgs/terminal-velocity/default.nix with 94% similarity]
flakes/mypackages/pkgs/terminal-velocity/fix_build.patch [moved from pkgs/terminal-velocity/fix_build.patch with 100% similarity]
flakes/mypackages/pkgs/terminal-velocity/python3_support.patch [moved from pkgs/terminal-velocity/python3_support.patch with 100% similarity]
flakes/mypackages/pkgs/terminal-velocity/sort_found_notes.patch [moved from pkgs/terminal-velocity/sort_found_notes.patch with 100% similarity]
flakes/mypackages/pkgs/tiv/default.nix [moved from pkgs/tiv/default.nix with 86% similarity]
flakes/mypackages/pkgs/tiv/tiv_builder.sh [moved from pkgs/tiv/tiv_builder.sh with 100% similarity]
flakes/mypackages/pkgs/twins/default.nix [moved from pkgs/twins/default.nix with 100% similarity]
flakes/mypackages/pkgs/umami/build-geo.patch [moved from pkgs/umami/build-geo.patch with 100% similarity]
flakes/mypackages/pkgs/umami/default.nix [moved from pkgs/umami/default.nix with 100% similarity]
flakes/mypackages/pkgs/unicode/default.nix [moved from pkgs/unicode/default.nix with 100% similarity]
flakes/mypackages/pkgs/upcmd/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/adminer/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/apache-theme/default.nix [moved from pkgs/webapps/apache-theme/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/.htaccess [moved from pkgs/webapps/apache-theme/theme/.htaccess with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/footer.html [moved from pkgs/webapps/apache-theme/theme/footer.html with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/header.html [moved from pkgs/webapps/apache-theme/theme/header.html with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/archive.png [moved from pkgs/webapps/apache-theme/theme/icons/archive.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/audio.png [moved from pkgs/webapps/apache-theme/theme/icons/audio.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/authors.png [moved from pkgs/webapps/apache-theme/theme/icons/authors.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bin.png [moved from pkgs/webapps/apache-theme/theme/icons/bin.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/blank.png [moved from pkgs/webapps/apache-theme/theme/icons/blank.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bmp.png [moved from pkgs/webapps/apache-theme/theme/icons/bmp.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/c.png [moved from pkgs/webapps/apache-theme/theme/icons/c.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/calc.png [moved from pkgs/webapps/apache-theme/theme/icons/calc.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cd.png [moved from pkgs/webapps/apache-theme/theme/icons/cd.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/copying.png [moved from pkgs/webapps/apache-theme/theme/icons/copying.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cpp.png [moved from pkgs/webapps/apache-theme/theme/icons/cpp.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/css.png [moved from pkgs/webapps/apache-theme/theme/icons/css.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/deb.png [moved from pkgs/webapps/apache-theme/theme/icons/deb.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/default.png [moved from pkgs/webapps/apache-theme/theme/icons/default.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/diff.png [moved from pkgs/webapps/apache-theme/theme/icons/diff.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/doc.png [moved from pkgs/webapps/apache-theme/theme/icons/doc.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/draw.png [moved from pkgs/webapps/apache-theme/theme/icons/draw.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/eps.png [moved from pkgs/webapps/apache-theme/theme/icons/eps.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/exe.png [moved from pkgs/webapps/apache-theme/theme/icons/exe.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-home.png [moved from pkgs/webapps/apache-theme/theme/icons/folder-home.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-open.png [moved from pkgs/webapps/apache-theme/theme/icons/folder-open.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-page.png [moved from pkgs/webapps/apache-theme/theme/icons/folder-page.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png [moved from pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent.png [moved from pkgs/webapps/apache-theme/theme/icons/folder-parent.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder.png [moved from pkgs/webapps/apache-theme/theme/icons/folder.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gif.png [moved from pkgs/webapps/apache-theme/theme/icons/gif.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gzip.png [moved from pkgs/webapps/apache-theme/theme/icons/gzip.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/h.png [moved from pkgs/webapps/apache-theme/theme/icons/h.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/hpp.png [moved from pkgs/webapps/apache-theme/theme/icons/hpp.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/html.png [moved from pkgs/webapps/apache-theme/theme/icons/html.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ico.png [moved from pkgs/webapps/apache-theme/theme/icons/ico.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/image.png [moved from pkgs/webapps/apache-theme/theme/icons/image.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/install.png [moved from pkgs/webapps/apache-theme/theme/icons/install.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/java.png [moved from pkgs/webapps/apache-theme/theme/icons/java.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/jpg.png [moved from pkgs/webapps/apache-theme/theme/icons/jpg.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/js.png [moved from pkgs/webapps/apache-theme/theme/icons/js.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/json.png [moved from pkgs/webapps/apache-theme/theme/icons/json.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/log.png [moved from pkgs/webapps/apache-theme/theme/icons/log.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/makefile.png [moved from pkgs/webapps/apache-theme/theme/icons/makefile.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/markdown.png [moved from pkgs/webapps/apache-theme/theme/icons/markdown.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/package.png [moved from pkgs/webapps/apache-theme/theme/icons/package.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pdf.png [moved from pkgs/webapps/apache-theme/theme/icons/pdf.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/php.png [moved from pkgs/webapps/apache-theme/theme/icons/php.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/playlist.png [moved from pkgs/webapps/apache-theme/theme/icons/playlist.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/png.png [moved from pkgs/webapps/apache-theme/theme/icons/png.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pres.png [moved from pkgs/webapps/apache-theme/theme/icons/pres.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ps.png [moved from pkgs/webapps/apache-theme/theme/icons/ps.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/psd.png [moved from pkgs/webapps/apache-theme/theme/icons/psd.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/py.png [moved from pkgs/webapps/apache-theme/theme/icons/py.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rar.png [moved from pkgs/webapps/apache-theme/theme/icons/rar.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rb.png [moved from pkgs/webapps/apache-theme/theme/icons/rb.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/readme.png [moved from pkgs/webapps/apache-theme/theme/icons/readme.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rpm.png [moved from pkgs/webapps/apache-theme/theme/icons/rpm.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rss.png [moved from pkgs/webapps/apache-theme/theme/icons/rss.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rtf.png [moved from pkgs/webapps/apache-theme/theme/icons/rtf.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/script.png [moved from pkgs/webapps/apache-theme/theme/icons/script.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/source.png [moved from pkgs/webapps/apache-theme/theme/icons/source.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/sql.png [moved from pkgs/webapps/apache-theme/theme/icons/sql.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tar.png [moved from pkgs/webapps/apache-theme/theme/icons/tar.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tex.png [moved from pkgs/webapps/apache-theme/theme/icons/tex.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/text.png [moved from pkgs/webapps/apache-theme/theme/icons/text.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tiff.png [moved from pkgs/webapps/apache-theme/theme/icons/tiff.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/unknown.png [moved from pkgs/webapps/apache-theme/theme/icons/unknown.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/vcal.png [moved from pkgs/webapps/apache-theme/theme/icons/vcal.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/video.png [moved from pkgs/webapps/apache-theme/theme/icons/video.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/xml.png [moved from pkgs/webapps/apache-theme/theme/icons/xml.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/zip.png [moved from pkgs/webapps/apache-theme/theme/icons/zip.png with 100% similarity]
flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css [moved from pkgs/webapps/apache-theme/theme/style.css with 97% similarity]
flakes/mypackages/pkgs/webapps/awl/default.nix [moved from pkgs/webapps/awl/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/davical/default.nix [moved from pkgs/webapps/davical/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/dokuwiki/default.nix [moved from pkgs/webapps/dokuwiki/default.nix with 79% similarity]
flakes/mypackages/pkgs/webapps/dokuwiki/plugins/farmer.nix [moved from pkgs/webapps/dokuwiki/plugins/farmer.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/dokuwiki/plugins/todo.nix [moved from pkgs/webapps/dokuwiki/plugins/todo.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/infcloud/default.nix [moved from pkgs/webapps/infcloud/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/infcloud/infcloud_config.js [moved from pkgs/webapps/infcloud/infcloud_config.js with 100% similarity]
flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report.php.diff [moved from pkgs/webapps/mantisbt_2/bug_report.php.diff with 100% similarity]
flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report_page.php.diff [moved from pkgs/webapps/mantisbt_2/bug_report_page.php.diff with 100% similarity]
flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add.php.diff [moved from pkgs/webapps/mantisbt_2/bugnote_add.php.diff with 100% similarity]
flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff [moved from pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff with 100% similarity]
flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix [moved from pkgs/webapps/mantisbt_2/default.nix with 96% similarity]
flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/slack/default.nix [moved from pkgs/webapps/mantisbt_2/plugins/slack/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff [moved from pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff with 100% similarity]
flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix [moved from pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix with 92% similarity]
flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/nextcloud/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/phpbb/default.nix [moved from pkgs/webapps/phpbb/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/phpbb/extensions/adduser.nix [moved from pkgs/webapps/phpbb/extensions/adduser.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/phpbb/extensions/autosubscribe.nix [moved from pkgs/webapps/phpbb/extensions/autosubscribe.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/phpbb/extensions/mailinglist.nix [moved from pkgs/webapps/phpbb/extensions/mailinglist.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/phpbb/extensions/markdown.nix [moved from pkgs/webapps/phpbb/extensions/markdown.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/phpbb/extensions/mchat.nix [moved from pkgs/webapps/phpbb/extensions/mchat.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/phpbb/extensions/monitoranswers.nix [moved from pkgs/webapps/phpbb/extensions/monitoranswers.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/phpbb/langs/fr.nix [moved from pkgs/webapps/phpbb/langs/fr.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/phpldapadmin/default.nix [moved from pkgs/webapps/phpldapadmin/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-align-button.patch [moved from pkgs/webapps/phpldapadmin/ldap-align-button.patch with 100% similarity]
flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-fix-password.patch [moved from pkgs/webapps/phpldapadmin/ldap-fix-password.patch with 100% similarity]
flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch [moved from pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch with 100% similarity]
flakes/mypackages/pkgs/webapps/rompr/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/roundcubemail/add_all.patch [moved from pkgs/webapps/roundcubemail/add_all.patch with 100% similarity]
flakes/mypackages/pkgs/webapps/roundcubemail/default.nix [moved from pkgs/webapps/roundcubemail/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix [moved from pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/roundcubemail/plugins/carddav/default.nix [moved from pkgs/webapps/roundcubemail/plugins/carddav/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix [moved from pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix [moved from pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix [moved from pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix [moved from pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix [moved from pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix [moved from pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/spip/default.nix [moved from pkgs/webapps/spip/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/spip/spip_ldap_patch.patch [moved from pkgs/webapps/spip/spip_ldap_patch.patch with 100% similarity]
flakes/mypackages/pkgs/webapps/spip/spip_mes_options.php [moved from pkgs/webapps/spip/spip_mes_options.php with 100% similarity]
flakes/mypackages/pkgs/webapps/ttrss/default.nix [moved from pkgs/webapps/ttrss/default.nix with 93% similarity]
flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch [moved from pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch with 100% similarity]
flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch [moved from pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch with 100% similarity]
flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix [new file with mode: 0644]
flakes/mypackages/pkgs/webapps/wallabag/default.nix [moved from pkgs/webapps/wallabag/default.nix with 100% similarity]
flakes/mypackages/pkgs/webapps/wallabag/ldap.patch [moved from pkgs/webapps/wallabag/ldap.patch with 100% similarity]
flakes/mypackages/pkgs/webapps/yourls/default.nix [moved from pkgs/webapps/yourls/default.nix with 63% similarity]
flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix [new file with mode: 0644]
flakes/myuids/flake.nix
flakes/naemon/flake.nix [new file with mode: 0644]
flakes/naemon/naemon.cfg [moved from modules/naemon/naemon.cfg with 100% similarity]
flakes/openarc/flake.lock
flakes/openarc/flake.nix
flakes/opendmarc/flake.lock
flakes/opendmarc/flake.nix
flakes/openfoodnetwork/default.nix [new file with mode: 0644]
flakes/openfoodnetwork/gemset.nix [new file with mode: 0644]
flakes/paste/flake.nix
flakes/paste/paste/paste.py
flakes/peertube/flake.lock
flakes/peertube/flake.nix
flakes/private/buildbot/buildslist/bower.nix [moved from pkgs/python-packages/buildbot/plugins/buildslist/bower.nix with 100% similarity]
flakes/private/buildbot/buildslist/default.nix [moved from pkgs/python-packages/buildbot/plugins/buildslist/default.nix with 88% similarity]
flakes/private/buildbot/buildslist/yarn-packages.nix [moved from pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix with 100% similarity]
flakes/private/buildbot/common/build_helpers.py [moved from modules/private/buildbot/common/build_helpers.py with 62% similarity]
flakes/private/buildbot/common/libvirt.py [moved from modules/private/buildbot/common/libvirt.py with 100% similarity]
flakes/private/buildbot/common/master.cfg [moved from modules/private/buildbot/common/master.cfg with 67% similarity]
flakes/private/buildbot/flake.lock [new file with mode: 0644]
flakes/private/buildbot/flake.nix [new file with mode: 0644]
flakes/private/buildbot/test_project/__init__.py [new file with mode: 0644]
flakes/private/chatons/flake.lock [new file with mode: 0644]
flakes/private/chatons/flake.nix [new file with mode: 0644]
flakes/private/environment-dummy/flake.nix [new file with mode: 0644]
flakes/private/environment-dummy/ldap.conf [new file with mode: 0644]
flakes/private/environment-dummy/vars.yml [new file with mode: 0644]
flakes/private/environment/flake.nix [new file with mode: 0644]
flakes/private/mail-relay/filter-rewrite-from.py [moved from modules/private/mail/filter-rewrite-from.py with 100% similarity]
flakes/private/mail-relay/flake.lock [new file with mode: 0644]
flakes/private/mail-relay/flake.nix [new file with mode: 0644]
flakes/private/milters/flake.lock [new file with mode: 0644]
flakes/private/milters/flake.nix [new file with mode: 0644]
flakes/private/milters/verify_from.py [moved from modules/private/mail/verify_from.py with 100% similarity]
flakes/private/monitoring/flake.lock [new file with mode: 0644]
flakes/private/monitoring/flake.nix [new file with mode: 0644]
flakes/private/monitoring/myplugins.nix [moved from modules/private/monitoring/myplugins.nix with 88% similarity]
flakes/private/monitoring/nagios-cli.cfg [moved from modules/private/monitoring/nagios-cli.cfg with 100% similarity]
flakes/private/monitoring/objects_common.nix [moved from modules/private/monitoring/objects_common.nix with 82% similarity]
flakes/private/monitoring/plugins/check_backup_age [moved from modules/private/monitoring/plugins/check_backup_age with 100% similarity]
flakes/private/monitoring/plugins/check_bandwidth [moved from modules/private/monitoring/plugins/check_bandwidth with 95% similarity]
flakes/private/monitoring/plugins/check_command [moved from modules/private/monitoring/plugins/check_command with 100% similarity]
flakes/private/monitoring/plugins/check_emails [moved from modules/private/monitoring/plugins/check_emails with 100% similarity]
flakes/private/monitoring/plugins/check_eriomem [moved from modules/private/monitoring/plugins/check_eriomem with 100% similarity]
flakes/private/monitoring/plugins/check_ftp_database [moved from modules/private/monitoring/plugins/check_ftp_database with 100% similarity]
flakes/private/monitoring/plugins/check_git [moved from modules/private/monitoring/plugins/check_git with 100% similarity]
flakes/private/monitoring/plugins/check_imap_connection [moved from modules/private/monitoring/plugins/check_imap_connection with 100% similarity]
flakes/private/monitoring/plugins/check_last_file_date [moved from modules/private/monitoring/plugins/check_last_file_date with 100% similarity]
flakes/private/monitoring/plugins/check_mem.sh [moved from modules/private/monitoring/plugins/check_mem.sh with 56% similarity]
flakes/private/monitoring/plugins/check_mysql_replication [moved from modules/private/monitoring/plugins/check_mysql_replication with 100% similarity]
flakes/private/monitoring/plugins/check_openldap_replication [moved from modules/private/monitoring/plugins/check_openldap_replication with 100% similarity]
flakes/private/monitoring/plugins/check_ovh_sms [moved from modules/private/monitoring/plugins/check_ovh_sms with 100% similarity]
flakes/private/monitoring/plugins/check_postgres_database_count [moved from modules/private/monitoring/plugins/check_postgres_database_count with 100% similarity]
flakes/private/monitoring/plugins/check_postgres_replication [moved from modules/private/monitoring/plugins/check_postgres_replication with 100% similarity]
flakes/private/monitoring/plugins/check_redis_replication [moved from modules/private/monitoring/plugins/check_redis_replication with 100% similarity]
flakes/private/monitoring/plugins/check_zfs_snapshot [moved from modules/private/monitoring/plugins/check_zfs_snapshot with 100% similarity]
flakes/private/monitoring/plugins/notify_by_apprise [new file with mode: 0755]
flakes/private/monitoring/plugins/notify_by_email [moved from modules/private/monitoring/plugins/notify_by_email with 100% similarity]
flakes/private/monitoring/plugins/notify_by_slack [moved from modules/private/monitoring/plugins/notify_by_slack with 100% similarity]
flakes/private/monitoring/plugins/send_nrdp.sh [moved from modules/private/monitoring/plugins/send_nrdp.sh with 100% similarity]
flakes/private/monitoring/send_mails [moved from modules/private/monitoring/send_mails with 100% similarity]
flakes/private/monitoring/to_objects.nix [moved from modules/private/monitoring/to_objects.nix with 88% similarity]
flakes/private/openarc/flake.lock
flakes/private/openarc/flake.nix
flakes/private/opendmarc/flake.lock
flakes/private/opendmarc/flake.nix
flakes/private/openldap/flake.nix [new file with mode: 0644]
flakes/private/openldap/immae.ldif [new file with mode: 0644]
flakes/private/openldap/immae.schema [moved from modules/private/databases/openldap/immae.schema with 98% similarity]
flakes/private/paste/flake.lock
flakes/private/paste/flake.nix
flakes/private/peertube/flake.lock
flakes/private/peertube/flake.nix
flakes/private/php/flake.lock [new file with mode: 0644]
flakes/private/php/flake.nix [new file with mode: 0644]
flakes/private/ssh/flake.lock [new file with mode: 0644]
flakes/private/ssh/flake.nix [new file with mode: 0644]
flakes/private/ssh/ldap_authorized_keys.sh [moved from modules/private/ssh/ldap_authorized_keys.sh with 71% similarity]
flakes/private/system/flake.lock [new file with mode: 0644]
flakes/private/system/flake.nix [new file with mode: 0644]
flakes/private/system/public_keys/Immae.pub [moved from nixops/public_keys/Immae.pub with 100% similarity]
flakes/rsync_backup/flake.nix
flakes/secrets/flake.nix
flakes/surfer/default.nix [moved from pkgs/webapps/surfer/default.nix with 71% similarity]
flakes/surfer/flake.lock [new file with mode: 0644]
flakes/surfer/flake.nix [new file with mode: 0644]
flakes/surfer/node-packages.nix [moved from pkgs/webapps/surfer/node-packages.nix with 100% similarity]
flakes/taskwarrior-web/Gemfile.lock [moved from pkgs/webapps/taskwarrior-web/Gemfile.lock with 100% similarity]
flakes/taskwarrior-web/default.nix [moved from pkgs/webapps/taskwarrior-web/default.nix with 75% similarity]
flakes/taskwarrior-web/fixes.patch [moved from pkgs/webapps/taskwarrior-web/fixes.patch with 56% similarity]
flakes/taskwarrior-web/flake.lock [new file with mode: 0644]
flakes/taskwarrior-web/flake.nix [new file with mode: 0644]
flakes/taskwarrior-web/gemset.nix [moved from pkgs/webapps/taskwarrior-web/gemset.nix with 100% similarity]
flakes/taskwarrior-web/thin.patch [moved from pkgs/webapps/taskwarrior-web/thin.patch with 100% similarity]
lib/default.nix [deleted file]
lib/flake-compat-patched.nix [deleted file]
lib/flake-compat.nix [deleted file]
modules/default.nix [deleted file]
modules/naemon/default.nix [deleted file]
modules/private/buildbot/projects/caldance/__init__.py [deleted file]
modules/private/buildbot/projects/cryptoportfolio/__init__.py [deleted file]
modules/private/buildbot/projects/denise/__init__.py [deleted file]
modules/private/buildbot/projects/immaeEu/__init__.py [deleted file]
modules/private/buildbot/projects/immaeEu/scripts/lacells_download [deleted file]
modules/private/buildbot/projects/test/__init__.py [deleted file]
modules/private/certificates.nix [deleted file]
modules/private/databases/openldap/default.nix [deleted file]
modules/private/databases/openldap/eldiron_schemas.nix [deleted file]
modules/private/default.nix [deleted file]
modules/private/dns.nix [deleted file]
modules/private/environment.nix [deleted file]
modules/private/gemini/default.nix [deleted file]
modules/private/gitolite/default.nix [deleted file]
modules/private/gitolite/ldap_gitolite.sh [deleted file]
modules/private/irc.nix [deleted file]
modules/private/loginctl-linger.nix [deleted file]
modules/private/mail/default.nix [deleted file]
modules/private/mail/milters.nix [deleted file]
modules/private/mail/opensmtpd.nix [deleted file]
modules/private/monitoring/default.nix [deleted file]
modules/private/monitoring/objects_backup-2.nix [deleted file]
modules/private/monitoring/objects_dilion.nix [deleted file]
modules/private/monitoring/objects_eban.nix [deleted file]
modules/private/monitoring/objects_eldiron.nix [deleted file]
modules/private/monitoring/objects_master.nix [deleted file]
modules/private/monitoring/objects_monitoring-1.nix [deleted file]
modules/private/monitoring/objects_quatresaisons.nix [deleted file]
modules/private/monitoring/objects_tiboqorl-fr.nix [deleted file]
modules/private/monitoring/plugins/notify_eban_url [deleted file]
modules/private/pub/default.nix [deleted file]
modules/private/pub/ldap_pub.sh [deleted file]
modules/private/ssh/default.nix [deleted file]
modules/private/system.nix [deleted file]
modules/private/system/dilion/vms.nix [deleted file]
modules/private/system/eldiron.nix [deleted file]
modules/private/system/quatresaisons.nix [deleted file]
modules/private/system/quatresaisons/databases.nix [deleted file]
modules/private/system/quatresaisons/landing.yml [deleted file]
modules/private/system/quatresaisons/landing_4c.yml [deleted file]
modules/private/system/quatresaisons/nextcloud.nix [deleted file]
modules/private/websites/bakeer/cloud.nix [deleted file]
modules/private/websites/capitaines/discourse_static/discourse.png [deleted file]
modules/private/websites/capitaines/discourse_static/index.html [deleted file]
modules/private/websites/capitaines/landing_pages.nix [deleted file]
modules/private/websites/capitaines/mastodon_static/index.html [deleted file]
modules/private/websites/capitaines/mastodon_static/oops.png [deleted file]
modules/private/websites/chloe/app/default.nix [deleted file]
modules/private/websites/chloe/config/chmod.php [deleted file]
modules/private/websites/chloe/config/connect.php [deleted file]
modules/private/websites/chloe/config/ldap.php [deleted file]
modules/private/websites/chloe/integration.nix [deleted file]
modules/private/websites/chloe/production.nix [deleted file]
modules/private/websites/cip-ca/sympa.nix [deleted file]
modules/private/websites/commons/adminer.nix [deleted file]
modules/private/websites/connexionswing/app/default.nix [deleted file]
modules/private/websites/connexionswing/app/php-packages.nix [deleted file]
modules/private/websites/connexionswing/integration.nix [deleted file]
modules/private/websites/connexionswing/production.nix [deleted file]
modules/private/websites/denise/aventuriers.nix [deleted file]
modules/private/websites/denise/bingo.nix [deleted file]
modules/private/websites/denise/denisejerome.nix [deleted file]
modules/private/websites/denise/evariste.nix [deleted file]
modules/private/websites/denise/oms.nix [deleted file]
modules/private/websites/denise/production.nix [deleted file]
modules/private/websites/emilia/atelierfringant.nix [deleted file]
modules/private/websites/emilia/moodle.nix [deleted file]
modules/private/websites/emilia/moodle/pause.html [deleted file]
modules/private/websites/florian/app.nix [deleted file]
modules/private/websites/florian/app/default.nix [deleted file]
modules/private/websites/florian/app/php-packages.nix [deleted file]
modules/private/websites/florian/integration.nix [deleted file]
modules/private/websites/florian/production.nix [deleted file]
modules/private/websites/immae/chatons/immae-eu.properties [deleted file]
modules/private/websites/immae/chatons/service-etherpad.properties [deleted file]
modules/private/websites/immae/temp.nix [deleted file]
modules/private/websites/isabelle/aten_app/default.nix [deleted file]
modules/private/websites/isabelle/aten_app/php-packages.nix [deleted file]
modules/private/websites/isabelle/aten_app/yarn-packages.nix [deleted file]
modules/private/websites/isabelle/aten_integration.nix [deleted file]
modules/private/websites/isabelle/aten_production.nix [deleted file]
modules/private/websites/isabelle/config/chmod.php [deleted file]
modules/private/websites/isabelle/config/connect.php [deleted file]
modules/private/websites/isabelle/config/ldap.php [deleted file]
modules/private/websites/isabelle/iridologie.nix [deleted file]
modules/private/websites/isabelle/iridologie_app/default.nix [deleted file]
modules/private/websites/jerome/naturaloutil.nix [deleted file]
modules/private/websites/leila/production.nix [deleted file]
modules/private/websites/ludivine/app/default.nix [deleted file]
modules/private/websites/ludivine/app/php-packages.nix [deleted file]
modules/private/websites/ludivine/integration.nix [deleted file]
modules/private/websites/ludivine/production.nix [deleted file]
modules/private/websites/nassime/production.nix [deleted file]
modules/private/websites/nath/villon.nix [deleted file]
modules/private/websites/papa/maison_bbc.nix [deleted file]
modules/private/websites/papa/maison_bbc_static/data.json [deleted file]
modules/private/websites/papa/maison_bbc_static/favicon.ico [deleted file]
modules/private/websites/papa/maison_bbc_static/index.html [deleted file]
modules/private/websites/papa/maison_bbc_static/lamaison.png [deleted file]
modules/private/websites/papa/surveillance.nix [deleted file]
modules/private/websites/patrick_fodella/altermondia.nix [deleted file]
modules/private/websites/patrick_fodella/ecolyeu.nix [deleted file]
modules/private/websites/piedsjaloux/app/default.nix [deleted file]
modules/private/websites/piedsjaloux/app/php-packages.nix [deleted file]
modules/private/websites/piedsjaloux/integration.nix [deleted file]
modules/private/websites/piedsjaloux/production.nix [deleted file]
modules/private/websites/ressourcerie_banon/cloud.nix [deleted file]
modules/private/websites/ressourcerie_banon/cryptpad.nix [deleted file]
modules/private/websites/ressourcerie_banon/production.nix [deleted file]
modules/private/websites/richie/production.nix [deleted file]
modules/private/websites/syden/peertube.nix [deleted file]
modules/private/websites/telio_tortay/production.nix [deleted file]
modules/private/websites/tools/assets/default.nix [deleted file]
modules/private/websites/tools/cloud/default.nix [deleted file]
modules/private/websites/tools/cloud/farm.nix [deleted file]
modules/private/websites/tools/cryptpad/default.nix [deleted file]
modules/private/websites/tools/dav/default.nix [deleted file]
modules/private/websites/tools/db/default.nix [deleted file]
modules/private/websites/tools/git/default.nix [deleted file]
modules/private/websites/tools/im/default.nix [deleted file]
modules/private/websites/tools/mail/default.nix [deleted file]
modules/private/websites/tools/tools/adminer.nix [deleted file]
modules/private/websites/tools/tools/csp_reports.nix [deleted file]
modules/private/websites/tools/tools/dokuwiki.nix [deleted file]
modules/private/websites/tools/tools/landing.nix [deleted file]
modules/private/websites/tools/tools/landing/report_csp_violation.php [deleted file]
modules/private/websites/tools/tools/webhooks.nix [deleted file]
modules/webapps/diaspora.nix [deleted file]
modules/webapps/etherpad-lite.nix [deleted file]
modules/webapps/mastodon.nix [deleted file]
modules/webapps/mediagoblin.nix [deleted file]
modules/websites/default.nix [deleted file]
modules/websites/httpd-service-builder.nix [deleted file]
modules/websites/httpd-service-builder.patch [deleted file]
modules/websites/php-application.nix [deleted file]
modules/zrepl.nix [deleted file]
nix/README.md [deleted file]
nix/sources.json [deleted file]
nix/sources.nix [deleted file]
nixops/.gitignore [deleted file]
nixops/.sops.yaml [deleted file]
nixops/Makefile [deleted file]
nixops/default.nix [deleted file]
nixops/scripts/with_env [deleted file]
nixops/secrets [deleted submodule]
overlays/bonfire/default.nix [deleted file]
overlays/bugwarrior/default.nix [deleted file]
overlays/bugwarrior/mantisbt.patch [deleted file]
overlays/bundix/default.nix [deleted file]
overlays/databases/mysql/default.nix [deleted file]
overlays/default.nix [deleted file]
overlays/doing/default.nix [deleted file]
overlays/dwm/default.nix [deleted file]
overlays/dwm/dwm_config.h [deleted file]
overlays/elinks/default.nix [deleted file]
overlays/elinks/elinks.json [deleted file]
overlays/kanboard/default.nix [deleted file]
overlays/khal/default.nix [deleted file]
overlays/ledger/default.nix [deleted file]
overlays/lesspipe/default.nix [deleted file]
overlays/morph/default.nix [deleted file]
overlays/neomutt/default.nix [deleted file]
overlays/neomutt/tx.patch [deleted file]
overlays/nix-direnv/default.nix [deleted file]
overlays/nixops/default.nix [deleted file]
overlays/nixops/fix_glibc.patch [deleted file]
overlays/nixops/hetzner_cloud.patch [deleted file]
overlays/pass/default.nix [deleted file]
overlays/pass/pass-fix-pass-init.patch [deleted file]
overlays/pelican/default.nix [deleted file]
overlays/php-packages/default.nix [deleted file]
overlays/procps-ng/default.nix [deleted file]
overlays/python-packages/buildbot.nix [deleted file]
overlays/python-packages/default.nix [deleted file]
overlays/sc-im/default.nix [deleted file]
overlays/shaarli/default.nix [deleted file]
overlays/slrn/default.nix [deleted file]
overlays/vcsh/default.nix [deleted file]
overlays/weechat/default.nix [deleted file]
overlays/ympd/default.nix [deleted file]
overlays/ympd/ympd.json [deleted file]
pkgs/cnagios/cnagios.json [deleted file]
pkgs/crypto/cardano/daedalus.json [deleted file]
pkgs/crypto/iota-cli-app/iota-cli-app.json [deleted file]
pkgs/default.nix [deleted file]
pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json [deleted file]
pkgs/flrn/flrn.json [deleted file]
pkgs/mutt-ics/default.nix [deleted file]
pkgs/mutt-ics/mutt-ics.json [deleted file]
pkgs/naemon-livestatus/naemon-livestatus.json [deleted file]
pkgs/naemon/naemon.json [deleted file]
pkgs/nagios-cli/default.nix [deleted file]
pkgs/nagios-cli/nagios-cli.json [deleted file]
pkgs/nagnu/default.nix [deleted file]
pkgs/nagnu/nagnu.json [deleted file]
pkgs/pgloader/default.nix [deleted file]
pkgs/predixy/default.nix [deleted file]
pkgs/predixy/predixy.json [deleted file]
pkgs/python-packages/blivet/default.nix [deleted file]
pkgs/python-packages/blivet/fix_path.patch [deleted file]
pkgs/python-packages/blivet/poetry.lock [deleted file]
pkgs/python-packages/blivet/pyproject.toml [deleted file]
pkgs/python-packages/buildbot/plugins/default.nix [deleted file]
pkgs/python-packages/default.nix [deleted file]
pkgs/python-packages/pymilter.nix [deleted file]
pkgs/python-packages/wokkel.nix [deleted file]
pkgs/status_engine/module.json [deleted file]
pkgs/status_engine/module.nix [deleted file]
pkgs/status_engine/worker.json [deleted file]
pkgs/status_engine/worker.nix [deleted file]
pkgs/status_engine/worker_composer.lock [deleted file]
pkgs/status_engine/worker_php_packages.nix [deleted file]
pkgs/telegram-history-dump/default.nix [deleted file]
pkgs/telegram-history-dump/telegram-history-dump.json [deleted file]
pkgs/telegramircd/telegramircd.json [deleted file]
pkgs/webapps/adminer/default.nix [deleted file]
pkgs/webapps/default.nix [deleted file]
pkgs/webapps/diaspora/default.nix [deleted file]
pkgs/webapps/diaspora/diaspora.json [deleted file]
pkgs/webapps/dokuwiki/dokuwiki.json [deleted file]
pkgs/webapps/etherpad-lite/etherpad-lite.json [deleted file]
pkgs/webapps/grocy/grocy.json [deleted file]
pkgs/webapps/mastodon/mastodon.json [deleted file]
pkgs/webapps/mediagoblin/tempita.json [deleted file]
pkgs/webapps/nextcloud/apps/apporder.nix [deleted file]
pkgs/webapps/nextcloud/apps/audioplayer.nix [deleted file]
pkgs/webapps/nextcloud/apps/bookmarks.nix [deleted file]
pkgs/webapps/nextcloud/apps/calendar.nix [deleted file]
pkgs/webapps/nextcloud/apps/carnet.nix [deleted file]
pkgs/webapps/nextcloud/apps/circles.nix [deleted file]
pkgs/webapps/nextcloud/apps/contacts.nix [deleted file]
pkgs/webapps/nextcloud/apps/cookbook.nix [deleted file]
pkgs/webapps/nextcloud/apps/deck.nix [deleted file]
pkgs/webapps/nextcloud/apps/extract.nix [deleted file]
pkgs/webapps/nextcloud/apps/files_markdown.nix [deleted file]
pkgs/webapps/nextcloud/apps/files_readmemd.nix [deleted file]
pkgs/webapps/nextcloud/apps/flowupload.nix [deleted file]
pkgs/webapps/nextcloud/apps/gpxedit.nix [deleted file]
pkgs/webapps/nextcloud/apps/gpxpod.nix [deleted file]
pkgs/webapps/nextcloud/apps/impersonate.nix [deleted file]
pkgs/webapps/nextcloud/apps/keeweb.nix [deleted file]
pkgs/webapps/nextcloud/apps/maps.nix [deleted file]
pkgs/webapps/nextcloud/apps/metadata.nix [deleted file]
pkgs/webapps/nextcloud/apps/music.nix [deleted file]
pkgs/webapps/nextcloud/apps/notes.nix [deleted file]
pkgs/webapps/nextcloud/apps/ocsms.nix [deleted file]
pkgs/webapps/nextcloud/apps/passman.nix [deleted file]
pkgs/webapps/nextcloud/apps/polls.nix [deleted file]
pkgs/webapps/nextcloud/apps/social.nix [deleted file]
pkgs/webapps/nextcloud/apps/spreed.nix [deleted file]
pkgs/webapps/nextcloud/apps/tasks.nix [deleted file]
pkgs/webapps/nextcloud/default.nix [deleted file]
pkgs/webapps/rompr/default.nix [deleted file]
pkgs/webapps/rompr/rompr.json [deleted file]
pkgs/webapps/taskwarrior-web/taskwarrior-web.json [deleted file]
pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json [deleted file]
pkgs/webapps/ttrss/plugins/af_feedmod/default.nix [deleted file]
pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json [deleted file]
pkgs/webapps/ttrss/plugins/auth_ldap/default.nix [deleted file]
pkgs/webapps/ttrss/plugins/feediron/default.nix [deleted file]
pkgs/webapps/ttrss/plugins/feediron/feediron.json [deleted file]
pkgs/webapps/ttrss/plugins/ff_instagram/default.nix [deleted file]
pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json [deleted file]
pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix [deleted file]
pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json [deleted file]
pkgs/webapps/yourls/plugins/ldap/default.nix [deleted file]
pkgs/webapps/yourls/plugins/ldap/ldap.json [deleted file]
pkgs/webapps/yourls/yourls.json [deleted file]
scripts/fetch_version [deleted file]
scripts/make-nur
scripts/refresh_flakes [new file with mode: 0755]
scripts/setup [moved from nixops/scripts/setup with 100% similarity]
scripts/update_flake [new file with mode: 0755]
scripts/with_env [new file with mode: 0755]
shell.nix [deleted file]
systems/backup-2/base.nix [moved from modules/private/system/backup-2.nix with 70% similarity]
systems/backup-2/databases/mariadb_replication.nix [moved from modules/private/databases/mariadb_replication.nix with 89% similarity]
systems/backup-2/databases/openldap_replication.nix [moved from modules/private/databases/openldap_replication.nix with 96% similarity]
systems/backup-2/databases/postgresql_replication.nix [moved from modules/private/databases/postgresql_replication.nix with 88% similarity]
systems/backup-2/databases/redis_replication.nix [moved from modules/private/databases/redis_replication.nix with 98% similarity]
systems/backup-2/databases/utils.nix [moved from modules/private/databases/utils.nix with 96% similarity]
systems/backup-2/flake.lock [new file with mode: 0644]
systems/backup-2/flake.nix [new file with mode: 0644]
systems/backup-2/mail/relay.nix [moved from modules/private/mail/relay.nix with 68% similarity]
systems/backup-2/monitoring.nix [new file with mode: 0644]
systems/dilion/base.nix [moved from modules/private/system/dilion.nix with 50% similarity]
systems/dilion/flake.lock [new file with mode: 0644]
systems/dilion/flake.nix [new file with mode: 0644]
systems/dilion/monitoring.nix [new file with mode: 0644]
systems/dilion/ssh_ldap_regular.sh [moved from modules/private/ssh/ldap_regular.sh with 100% similarity]
systems/dilion/vms.nix [new file with mode: 0644]
systems/dilion/vms/base_configuration.nix [moved from modules/private/system/dilion/vms/base_configuration.nix with 52% similarity]
systems/dilion/vms/base_image.nix [moved from modules/private/system/dilion/vms/base_image.nix with 82% similarity]
systems/dilion/vms/buildbot_configuration.nix [moved from modules/private/system/dilion/vms/buildbot_configuration.nix with 87% similarity]
systems/eldiron/base.nix [new file with mode: 0644]
systems/eldiron/buildbot/default.nix [moved from modules/private/buildbot/default.nix with 70% similarity]
systems/eldiron/coturn.nix [new file with mode: 0644]
systems/eldiron/databases/default.nix [moved from modules/private/databases/default.nix with 82% similarity]
systems/eldiron/databases/mariadb.nix [moved from modules/private/databases/mariadb.nix with 92% similarity]
systems/eldiron/databases/openldap/default.nix [new file with mode: 0644]
systems/eldiron/databases/postgresql.nix [moved from modules/private/databases/postgresql.nix with 81% similarity]
systems/eldiron/databases/redis.nix [moved from modules/private/databases/redis.nix with 56% similarity]
systems/eldiron/dns.nix [new file with mode: 0644]
systems/eldiron/duply_backup.nix [moved from modules/duply_backup/default.nix with 83% similarity]
systems/eldiron/ejabberd/default.nix [moved from modules/private/ejabberd/default.nix with 54% similarity]
systems/eldiron/ejabberd/ejabberd.yml [moved from modules/private/ejabberd/ejabberd.yml with 100% similarity]
systems/eldiron/ejabberd/warn_xmpp_email.py [new file with mode: 0755]
systems/eldiron/flake.lock [new file with mode: 0644]
systems/eldiron/flake.nix [new file with mode: 0644]
systems/eldiron/ftp.nix [moved from modules/private/ftp.nix with 68% similarity]
systems/eldiron/ftp_sync.sh [moved from modules/private/ftp_sync.sh with 91% similarity]
systems/eldiron/gemini/default.nix [new file with mode: 0644]
systems/eldiron/gemini/public/index.gmi [moved from modules/private/gemini/public/index.gmi with 100% similarity]
systems/eldiron/gitolite/default.nix [new file with mode: 0644]
systems/eldiron/gitolite/gitolite_ldap_groups.sh [moved from modules/private/gitolite/gitolite_ldap_groups.sh with 84% similarity]
systems/eldiron/gitolite/ldap_gitolite.sh [new file with mode: 0644]
systems/eldiron/irc.nix [new file with mode: 0644]
systems/eldiron/mail/default.nix [new file with mode: 0644]
systems/eldiron/mail/dovecot.nix [moved from modules/private/mail/dovecot.nix with 77% similarity]
systems/eldiron/mail/postfix.nix [moved from modules/private/mail/postfix.nix with 71% similarity]
systems/eldiron/mail/rspamd.nix [moved from modules/private/mail/rspamd.nix with 97% similarity]
systems/eldiron/mail/scan_reported_mails [moved from modules/private/mail/scan_reported_mails with 100% similarity]
systems/eldiron/mail/sieve_bin/imapsieve_copy [moved from modules/private/mail/sieve_bin/imapsieve_copy with 100% similarity]
systems/eldiron/mail/sieve_scripts/backup.sieve [moved from modules/private/mail/sieve_scripts/backup.sieve with 100% similarity]
systems/eldiron/mail/sieve_scripts/report_ham.sieve [moved from modules/private/mail/sieve_scripts/report_ham.sieve with 100% similarity]
systems/eldiron/mail/sieve_scripts/report_spam.sieve [moved from modules/private/mail/sieve_scripts/report_spam.sieve with 100% similarity]
systems/eldiron/mail/sympa.nix [moved from modules/private/mail/sympa.nix with 84% similarity]
systems/eldiron/monitoring.nix [new file with mode: 0644]
systems/eldiron/mpd.nix [moved from modules/private/mpd.nix with 100% similarity]
systems/eldiron/pub/default.nix [new file with mode: 0644]
systems/eldiron/pub/ldap_pub.sh [new file with mode: 0644]
systems/eldiron/pub/restrict [moved from modules/private/pub/restrict with 82% similarity]
systems/eldiron/pub/tmux.restrict.conf [moved from modules/private/pub/tmux.restrict.conf with 100% similarity]
systems/eldiron/tasks/default.nix [moved from modules/private/tasks/default.nix with 88% similarity]
systems/eldiron/tasks/www/index.php [moved from modules/private/tasks/www/index.php with 100% similarity]
systems/eldiron/vpn/default.nix [moved from modules/private/vpn/default.nix with 61% similarity]
systems/eldiron/vpn/tinc/host-down [moved from modules/private/vpn/tinc/host-down with 100% similarity]
systems/eldiron/vpn/tinc/host-up [moved from modules/private/vpn/tinc/host-up with 100% similarity]
systems/eldiron/vpn/tinc/tinc-down [moved from modules/private/vpn/tinc/tinc-down with 100% similarity]
systems/eldiron/vpn/tinc/tinc-up [moved from modules/private/vpn/tinc/tinc-up with 100% similarity]
systems/eldiron/vpn/tinc/tinc.conf [moved from modules/private/vpn/tinc/tinc.conf with 100% similarity]
systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html [moved from modules/private/websites/_www/googleb6d69446ff4ca3e5.html with 100% similarity]
systems/eldiron/websites/_www/index.htm [moved from modules/private/websites/_www/index.htm with 100% similarity]
systems/eldiron/websites/_www/maintenance_immae.html [moved from modules/private/websites/_www/maintenance_immae.html with 100% similarity]
systems/eldiron/websites/_www/nossl.html [moved from modules/private/websites/_www/nossl.html with 100% similarity]
systems/eldiron/websites/assets/default.nix [new file with mode: 0644]
systems/eldiron/websites/assets/static/favicon.png [moved from modules/private/websites/tools/assets/static/favicon.png with 100% similarity]
systems/eldiron/websites/assets/static/logger.png [moved from modules/private/websites/tools/assets/static/logger.png with 100% similarity]
systems/eldiron/websites/assets/static/logger.txt [moved from modules/private/websites/tools/assets/static/logger.txt with 100% similarity]
systems/eldiron/websites/assets/static/logo.jpg [moved from modules/private/websites/tools/assets/static/logo.jpg with 100% similarity]
systems/eldiron/websites/assets/static/logo.txt [moved from modules/private/websites/tools/assets/static/logo.txt with 100% similarity]
systems/eldiron/websites/assets/static/logo_big.jpg [moved from modules/private/websites/tools/assets/static/logo_big.jpg with 100% similarity]
systems/eldiron/websites/assets/static/logo_big.txt [moved from modules/private/websites/tools/assets/static/logo_big.txt with 100% similarity]
systems/eldiron/websites/assets/static/logo_center.jpg [moved from modules/private/websites/tools/assets/static/logo_center.jpg with 100% similarity]
systems/eldiron/websites/assets/static/logo_center.txt [moved from modules/private/websites/tools/assets/static/logo_center.txt with 100% similarity]
systems/eldiron/websites/assets/static/monitoring.png [moved from modules/private/websites/tools/assets/static/monitoring.png with 100% similarity]
systems/eldiron/websites/assets/static/monitoring.txt [moved from modules/private/websites/tools/assets/static/monitoring.txt with 100% similarity]
systems/eldiron/websites/assets/static/photos/ct.jpg [moved from modules/private/websites/tools/assets/static/photos/ct.jpg with 100% similarity]
systems/eldiron/websites/assets/static/photos/fretlink.jpg [moved from modules/private/websites/tools/assets/static/photos/fretlink.jpg with 100% similarity]
systems/eldiron/websites/assets/static/photos/raton.jpg [moved from modules/private/websites/tools/assets/static/photos/raton.jpg with 100% similarity]
systems/eldiron/websites/cloud/add-htaccess.php [new file with mode: 0644]
systems/eldiron/websites/cloud/default.nix [new file with mode: 0644]
systems/eldiron/websites/cloud/farm.nix [new file with mode: 0644]
systems/eldiron/websites/commento/default.nix [moved from modules/private/websites/tools/commento/default.nix with 63% similarity]
systems/eldiron/websites/cryptpad/default.nix [new file with mode: 0644]
systems/eldiron/websites/cryptpad/farm.nix [moved from modules/private/websites/tools/cryptpad/farm.nix with 96% similarity]
systems/eldiron/websites/dav/davical.nix [moved from modules/private/websites/tools/dav/davical.nix with 93% similarity]
systems/eldiron/websites/dav/default.nix [new file with mode: 0644]
systems/eldiron/websites/dav/www/index.html [moved from modules/private/websites/tools/dav/www/index.html with 100% similarity]
systems/eldiron/websites/db/default.nix [new file with mode: 0644]
systems/eldiron/websites/default.nix [moved from modules/private/websites/default.nix with 73% similarity]
systems/eldiron/websites/diaspora/default.nix [moved from modules/private/websites/tools/diaspora/default.nix with 73% similarity]
systems/eldiron/websites/ether/default.nix [moved from modules/private/websites/tools/ether/default.nix with 79% similarity]
systems/eldiron/websites/games/codenames/codenames.patch [moved from modules/private/websites/tools/games/codenames/codenames.patch with 100% similarity]
systems/eldiron/websites/games/codenames/default.nix [moved from modules/private/websites/tools/games/codenames/default.nix with 58% similarity]
systems/eldiron/websites/games/codenames/deps.nix [moved from modules/private/websites/tools/games/codenames/deps.nix with 100% similarity]
systems/eldiron/websites/games/codenames/elm-srcs.nix [moved from modules/private/websites/tools/games/codenames/elm-srcs.nix with 100% similarity]
systems/eldiron/websites/games/codenames/frontend.nix [moved from modules/private/websites/tools/games/codenames/frontend.nix with 100% similarity]
systems/eldiron/websites/games/codenames/greenapid.nix [moved from modules/private/websites/tools/games/codenames/greenapid.nix with 100% similarity]
systems/eldiron/websites/games/codenames/greenapid.patch [moved from modules/private/websites/tools/games/codenames/greenapid.patch with 100% similarity]
systems/eldiron/websites/games/codenames/immae-assets.patch [new file with mode: 0644]
systems/eldiron/websites/games/codenames/node-packages.nix [moved from modules/private/websites/tools/games/codenames/node-packages.nix with 99% similarity]
systems/eldiron/websites/games/codenames/registry.dat [moved from modules/private/websites/tools/games/codenames/registry.dat with 100% similarity]
systems/eldiron/websites/games/codenames/shell.nix [moved from modules/private/websites/tools/games/codenames/shell.nix with 100% similarity]
systems/eldiron/websites/games/codenames/wordlists/french.txt [moved from modules/private/websites/tools/games/codenames/wordlists/french.txt with 100% similarity]
systems/eldiron/websites/games/terraforming-mars/default.nix [moved from modules/private/websites/tools/games/terraforming-mars/default.nix with 51% similarity]
systems/eldiron/websites/games/terraforming-mars/immae-assets.patch [new file with mode: 0644]
systems/eldiron/websites/games/terraforming-mars/node-packages.nix [moved from modules/private/websites/tools/games/terraforming-mars/node-packages.nix with 100% similarity]
systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix [moved from modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix with 73% similarity]
systems/eldiron/websites/git/cgit_js.html [new file with mode: 0644]
systems/eldiron/websites/git/default.nix [new file with mode: 0644]
systems/eldiron/websites/git/gitweb.nix [moved from modules/private/websites/tools/git/gitweb.nix with 95% similarity]
systems/eldiron/websites/git/mantisbt.nix [moved from modules/private/websites/tools/git/mantisbt.nix with 89% similarity]
systems/eldiron/websites/im/default.nix [new file with mode: 0644]
systems/eldiron/websites/im/www/converse.html [moved from modules/private/websites/tools/im/www/converse.html with 90% similarity]
systems/eldiron/websites/im/www/index.html [moved from modules/private/websites/tools/im/www/index.html with 100% similarity]
systems/eldiron/websites/immae/matrix/client [moved from modules/private/websites/immae/matrix/client with 65% similarity]
systems/eldiron/websites/immae/matrix/server [moved from modules/private/websites/immae/matrix/server with 100% similarity]
systems/eldiron/websites/immae/production.nix [moved from modules/private/websites/immae/production.nix with 56% similarity]
systems/eldiron/websites/immae/release.nix [moved from modules/private/websites/immae/release.nix with 82% similarity]
systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt [moved from modules/private/websites/immae/eurl/certificates/2021-certificate.crt with 100% similarity]
systems/eldiron/websites/kanboard/farm.nix [new file with mode: 0644]
systems/eldiron/websites/mail/default.nix [new file with mode: 0644]
systems/eldiron/websites/mail/mta-sts.nix [moved from modules/private/websites/tools/mail/mta-sts.nix with 61% similarity]
systems/eldiron/websites/mail/rainloop.nix [moved from modules/private/websites/tools/mail/rainloop.nix with 87% similarity]
systems/eldiron/websites/mail/roundcubemail.nix [moved from modules/private/websites/tools/mail/roundcubemail.nix with 94% similarity]
systems/eldiron/websites/mail/www/index.html [moved from modules/private/websites/tools/mail/www/index.html with 100% similarity]
systems/eldiron/websites/mastodon/default.nix [moved from modules/private/websites/tools/mastodon/default.nix with 60% similarity]
systems/eldiron/websites/mgoblin/default.nix [moved from modules/private/websites/tools/mgoblin/default.nix with 70% similarity]
systems/eldiron/websites/moomin.txt [moved from modules/private/websites/moomin.txt with 100% similarity]
systems/eldiron/websites/nossl/index.html [moved from modules/websites/nosslVhost/index.html with 100% similarity]
systems/eldiron/websites/peertube/default.nix [moved from modules/private/websites/tools/peertube/default.nix with 57% similarity]
systems/eldiron/websites/performance/default.nix [moved from modules/private/websites/tools/performance/default.nix with 79% similarity]
systems/eldiron/websites/stats/default.nix [moved from modules/private/websites/tools/stats/default.nix with 95% similarity]
systems/eldiron/websites/tools/adminer.nix [new file with mode: 0644]
systems/eldiron/websites/tools/default.nix [moved from modules/private/websites/tools/tools/default.nix with 62% similarity]
systems/eldiron/websites/tools/dmarc_reports.nix [moved from modules/private/websites/tools/tools/dmarc_reports.nix with 86% similarity]
systems/eldiron/websites/tools/dmarc_reports/api.php [moved from modules/private/websites/tools/tools/dmarc_reports/api.php with 100% similarity]
systems/eldiron/websites/tools/dmarc_reports/app.js [moved from modules/private/websites/tools/tools/dmarc_reports/app.js with 100% similarity]
systems/eldiron/websites/tools/dmarc_reports/default.css [moved from modules/private/websites/tools/tools/dmarc_reports/default.css with 100% similarity]
systems/eldiron/websites/tools/dmarc_reports/index.html [moved from modules/private/websites/tools/tools/dmarc_reports/index.html with 100% similarity]
systems/eldiron/websites/tools/dokuwiki.nix [new file with mode: 0644]
systems/eldiron/websites/tools/grocy.nix [moved from modules/private/websites/tools/tools/grocy.nix with 86% similarity]
systems/eldiron/websites/tools/kanboard.nix [moved from modules/private/websites/tools/tools/kanboard.nix with 56% similarity]
systems/eldiron/websites/tools/landing.nix [new file with mode: 0644]
systems/eldiron/websites/tools/landing/ldap_password.php [moved from modules/private/websites/tools/tools/landing/ldap_password.php with 80% similarity]
systems/eldiron/websites/tools/landing/ldap_ssh_keys.php [moved from modules/private/websites/tools/tools/landing/ldap_ssh_keys.php with 75% similarity]
systems/eldiron/websites/tools/landing/myip.php [moved from modules/private/websites/tools/tools/landing/myip.php with 100% similarity]
systems/eldiron/websites/tools/landing/node-packages.nix [moved from modules/private/websites/tools/tools/landing/node-packages.nix with 100% similarity]
systems/eldiron/websites/tools/landing/yarn-packages.nix [moved from modules/private/websites/tools/tools/landing/yarn-packages.nix with 100% similarity]
systems/eldiron/websites/tools/ldap.nix [moved from modules/private/websites/tools/tools/ldap.nix with 74% similarity]
systems/eldiron/websites/tools/phpbb.nix [moved from modules/private/websites/tools/tools/phpbb.nix with 71% similarity]
systems/eldiron/websites/tools/rompr.nix [moved from modules/private/websites/tools/tools/rompr.nix with 75% similarity]
systems/eldiron/websites/tools/shaarli.nix [moved from modules/private/websites/tools/tools/shaarli.nix with 57% similarity]
systems/eldiron/websites/tools/ttrss.nix [moved from modules/private/websites/tools/tools/ttrss.nix with 72% similarity]
systems/eldiron/websites/tools/wallabag.nix [moved from modules/private/websites/tools/tools/wallabag.nix with 76% similarity]
systems/eldiron/websites/tools/webhooks.nix [new file with mode: 0644]
systems/eldiron/websites/tools/ympd.nix [moved from modules/private/websites/tools/tools/ympd.nix with 70% similarity]
systems/eldiron/websites/tools/yourls.nix [moved from modules/private/websites/tools/tools/yourls.nix with 64% similarity]
systems/eldiron/websites/visio/default.nix [new file with mode: 0644]
systems/eldiron/websites/vpn/default.nix [moved from modules/private/websites/tools/vpn/default.nix with 78% similarity]
systems/eldiron/websites/vpn/www/index.html [moved from modules/private/websites/tools/vpn/www/index.html with 100% similarity]
systems/eldiron/websites/vpn/www/style.css [moved from modules/private/websites/tools/vpn/www/style.css with 100% similarity]
systems/eldiron/webstats/default.nix [moved from modules/webapps/webstats/default.nix with 90% similarity]
systems/eldiron/webstats/goaccess.conf [moved from modules/webapps/webstats/goaccess.conf with 100% similarity]
systems/monitoring-1/base.nix [moved from modules/private/system/monitoring-1.nix with 75% similarity]
systems/monitoring-1/flake.lock [new file with mode: 0644]
systems/monitoring-1/flake.nix [new file with mode: 0644]
systems/monitoring-1/monitoring-master.nix [new file with mode: 0644]
systems/monitoring-1/monitoring.nix [new file with mode: 0644]
systems/monitoring-1/monitoring/master.nix [new file with mode: 0644]
systems/monitoring-1/monitoring/phare.nix [moved from modules/private/monitoring/objects_phare.nix with 53% similarity]
systems/monitoring-1/monitoring/ulminfo-fr.nix [moved from modules/private/monitoring/objects_ulminfo-fr.nix with 50% similarity]
systems/monitoring-1/status.nix [moved from modules/private/monitoring/status.nix with 84% similarity]
systems/monitoring-1/status/app.py [moved from modules/private/monitoring/status/app.py with 100% similarity]
systems/monitoring-1/status_engine.nix [moved from modules/private/monitoring/status_engine.nix with 89% similarity]
systems/quatresaisons/flake.lock [new file with mode: 0644]
systems/quatresaisons/flake.nix [new file with mode: 0644]
systems/zoldene/Immae.pub [new file with mode: 0644]
systems/zoldene/base.nix [new file with mode: 0644]
systems/zoldene/disko.nix [new file with mode: 0644]
systems/zoldene/flake.lock [new file with mode: 0644]
systems/zoldene/flake.nix [new file with mode: 0644]
systems/zoldene/logging.nix [new file with mode: 0644]

diff --git a/.envrc b/.envrc
index 438d807e29908d3c4855a7978433a504c952f38e..4718a18d217614ff29d457baef735fe6ef0c5e51 100644 (file)
--- a/.envrc
+++ b/.envrc
@@ -1,13 +1,25 @@
 # vim: filetype=bash
 # vim: filetype=bash
-export NIX_PATH=nixpkgs=$(cat $(expand_path nix/sources.json) | jq -r '."nixpkgs-nixops".url')
-NIX_PATH=$NIX_PATH:nixpkgs-nix=$(cat $(expand_path nix/sources.json) | jq -r '."nixpkgs-nix".url')
+export DIRENV_FLAKE_DONT_ADD_SOURCES_ROOT=y
+nix_direnv_watch_file() {
+  nix_watches+=("$@")
+  filtered=()
+  for i in "$@"; do
+    case "$i" in
+      */flake.lock)
+        ;;
+      *)
+        filtered+=("$i")
+    esac
+  done
+  watch_file "${filtered[@]}"
+}
 
 
-export NIXOPS_ENV_LOADED=1
+if nix eval './deploy#sops-vars-file' 2>/dev/null >/dev/null; then
+  export DEVSHELL_NO_MOTD=1
+  cd deploy
+  use flake . --no-warn-dirty
+  cd ..
+  unset DEVSHELL_NO_MOTD
+fi
 
 
-PATH_add $(expand_path scripts)
-PATH_add $(expand_path nixops/scripts)
-
-use nix
-watch_file $(expand_path nix/sources.json)
-
-clean_nix_shell
+use flake . --no-warn-dirty
diff --git a/.gitconfig b/.gitconfig
deleted file mode 100644 (file)
index 7aa8870..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-; git config --local include.path '../.gitconfig'
-[push]
-  recurseSubmodules = on-demand
-; Find a way to include this file automatically?
-; git -C nixops/secrets config --local diff.gpgdiffer.textconv "gpg --quiet -d"
-[diff "gpgdiffer"]
-       textconv = "gpg --quiet -d"
-[diff "sopsdiffer"]
-       textconv = "sops -d"
index ff9c9cf74e7ede68b0b8a56135ff815f9a230b1b..0c17e7a7d7640aeb7bdfa4eb91b5148edf546fbe 100644 (file)
@@ -1,4 +1,5 @@
 /result*
 /versions_log
 .direnv/
 /result*
 /versions_log
 .direnv/
-/nixops/.gcroots
+/deploy/.gcroots
+/deploy/history
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644 (file)
index c2d9b18..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "nixops/secrets"]
-       path = nixops/secrets
-       url = gitolite@git.immae.eu:perso/Immae/Config/Nix/Nixops/Secrets
index 6c68680bf891a1eaab93b482da3715fa59b7cf0f..fcd0b15164863fa040b7d12f907c87aa441f0b54 100644 (file)
@@ -1,7 +1,7 @@
 Get Started
 ===========
 
 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.
 
   The script won’t do anything without asking first, you may stop at any
   step.
 
@@ -43,8 +43,7 @@ The directory is divided in several sections:
   of hosts. They tend to be less used now. But sometimes they need to
   have an identity (mostly to be able to send e-mails) The subsection
   "roles" (ou=roles,ou=hosts,dc=immae,dc=eu) was from a Puppet age and
   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
 - The "groups" section (ou=groups,dc=immae,dc=eu) contains the generic
   groups of users not associated to a service.
 - The "group_users" and "users" sections contain the users (usually with
@@ -58,7 +57,7 @@ How does nixpkgs resolve
 To build nixops machines
 ------------------------
 
 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
 contains three paths: nixpkgs, nixpkgsNext, nixpkgsPrevious. Only the
 first one is actually used most of the time. Derivations that need
 pinned nixpkgs should declare it in `nix/sources.json` (it’s the case
@@ -236,13 +235,18 @@ Nextcloud
 ---------
 
 - Do not skip major versions!
 ---------
 
 - 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 :
   ```
 - 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 :
   ```
 - Upgrade
 - Run the upgrade task :
@@ -256,6 +260,22 @@ Nextcloud
 - Issues :
   https://docs.nextcloud.com/server/16/admin_manual/maintenance/manual_upgrade.html
 
 - 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
 ------
 
 Flakes
 ------
 
index 50fa09f444082d2d542e8663dfbc68839d07be80..6282df21cdcb79a8e2a5166d5bbe1402c8571160 100644 (file)
--- a/Makefile
+++ b/Makefile
-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:
 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
 
 .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
index 1f43cdd93883294eb3e4b67df4a1d66b7b98fd72..d0bc6189bbc0f005317133369456168eb73d45e6 100644 (file)
@@ -1,11 +1,9 @@
-{ sources ? import ./nix/sources.nix, pkgs ? import sources.nixpkgs {} }:
+{}:
 let
 let
-  mypkgs = pkgs.callPackage ./pkgs {};
+  mypackages = builtins.getFlake "path:${builtins.toString ./flakes/mypackages}";
 in
 {
 in
 {
-  lib = pkgs.callPackage ./lib {};
-  modules = import ./modules;
-  overlays = import ./overlays;
-  pkgs = mypkgs;
-  environments = pkgs.callPackage ./environments {};
-} // mypkgs
+  lib = mypackages.mylibs;
+  overlays = mypackages.overlays;
+  pkgs = mypackages.packages."${builtins.currentSystem}";
+} // mypackages.packages."${builtins.currentSystem}"
diff --git a/deploy/flake.lock b/deploy/flake.lock
new file mode 100644 (file)
index 0000000..afa2ec5
--- /dev/null
@@ -0,0 +1,9816 @@
+{
+  "nodes": {
+    "backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_6",
+        "nixpkgs": "nixpkgs_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_8",
+        "nixpkgs": "nixpkgs_18"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_3": {
+      "inputs": {
+        "flake-utils": "flake-utils_20",
+        "nixpkgs": "nixpkgs_34"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_4": {
+      "inputs": {
+        "flake-utils": "flake-utils_34",
+        "nixpkgs": "nixpkgs_57"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_5": {
+      "inputs": {
+        "flake-utils": "flake-utils_37",
+        "nixpkgs": "nixpkgs_65"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_6": {
+      "inputs": {
+        "flake-utils": "flake-utils_39",
+        "nixpkgs": "nixpkgs_72"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_7": {
+      "inputs": {
+        "flake-utils": "flake-utils_61",
+        "nixpkgs": "nixpkgs_101"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "buildslist": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585697026,
+        "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
+        "ref": "master",
+        "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
+        "revCount": 4,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      }
+    },
+    "buildslist_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585697026,
+        "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
+        "ref": "master",
+        "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
+        "revCount": 4,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      }
+    },
+    "chatons": {
+      "inputs": {
+        "environment": "environment"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "chatons_2": {
+      "inputs": {
+        "environment": "environment_18"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "colmena": {
+      "inputs": {
+        "flake-compat": "flake-compat",
+        "flake-utils": "flake-utils_3",
+        "nixpkgs": "nixpkgs_4",
+        "stable": "stable"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_2": {
+      "inputs": {
+        "flake-compat": "flake-compat_2",
+        "flake-utils": "flake-utils_7",
+        "nixpkgs": "nixpkgs_13",
+        "stable": "stable_2"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_3": {
+      "inputs": {
+        "flake-compat": "flake-compat_3",
+        "flake-utils": "flake-utils_10",
+        "nixpkgs": "nixpkgs_20",
+        "stable": "stable_3"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_4": {
+      "inputs": {
+        "flake-compat": "flake-compat_4",
+        "flake-utils": "flake-utils_32",
+        "nixpkgs": "nixpkgs_51",
+        "stable": "stable_4"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_5": {
+      "inputs": {
+        "flake-compat": "flake-compat_5",
+        "flake-utils": "flake-utils_35",
+        "nixpkgs": "nixpkgs_59",
+        "stable": "stable_5"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_6": {
+      "inputs": {
+        "flake-compat": "flake-compat_6",
+        "flake-utils": "flake-utils_38",
+        "nixpkgs": "nixpkgs_67",
+        "stable": "stable_6"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_7": {
+      "inputs": {
+        "flake-compat": "flake-compat_7",
+        "flake-utils": "flake-utils_45",
+        "nixpkgs": "nixpkgs_81",
+        "stable": "stable_7"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "copanier": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1633895178,
+        "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
+        "type": "github"
+      },
+      "original": {
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "type": "github"
+      }
+    },
+    "copanier_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1633895178,
+        "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
+        "type": "github"
+      },
+      "original": {
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "type": "github"
+      }
+    },
+    "devshell": {
+      "inputs": {
+        "nixpkgs": "nixpkgs",
+        "systems": "systems"
+      },
+      "locked": {
+        "lastModified": 1688380630,
+        "narHash": "sha256-8ilApWVb1mAi4439zS3iFeIT0ODlbrifm/fegWwgHjA=",
+        "owner": "numtide",
+        "repo": "devshell",
+        "rev": "f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "devshell",
+        "type": "github"
+      }
+    },
+    "diaspora": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1551139311,
+        "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
+        "owner": "diaspora",
+        "repo": "diaspora",
+        "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
+        "type": "github"
+      },
+      "original": {
+        "owner": "diaspora",
+        "ref": "v0.7.10.0",
+        "repo": "diaspora",
+        "type": "github"
+      }
+    },
+    "diaspora_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1551139311,
+        "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
+        "owner": "diaspora",
+        "repo": "diaspora",
+        "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
+        "type": "github"
+      },
+      "original": {
+        "owner": "diaspora",
+        "ref": "v0.7.10.0",
+        "repo": "diaspora",
+        "type": "github"
+      }
+    },
+    "disko": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_5"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_2": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_14"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_3": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_21"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_4": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_52"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_5": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_60"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_6": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_68"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_7": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_82"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "dns-nix": {
+      "inputs": {
+        "flake-utils": "flake-utils_9",
+        "nixpkgs": [
+          "main-flake",
+          "n-eldiron",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1635273082,
+        "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=",
+        "owner": "kirelagin",
+        "repo": "dns.nix",
+        "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "kirelagin",
+        "repo": "dns.nix",
+        "type": "github"
+      }
+    },
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_16": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_17": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_18": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_19": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_20": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_21": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_22": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_23": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_24": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_25": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_26": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_27": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_28": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_29": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_30": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_31": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_32": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_33": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "etherpad-lite": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1587951095,
+        "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
+        "owner": "ether",
+        "repo": "etherpad-lite",
+        "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ether",
+        "ref": "1.8.3",
+        "repo": "etherpad-lite",
+        "type": "github"
+      }
+    },
+    "etherpad-lite_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1587951095,
+        "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
+        "owner": "ether",
+        "repo": "etherpad-lite",
+        "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ether",
+        "ref": "1.8.3",
+        "repo": "etherpad-lite",
+        "type": "github"
+      }
+    },
+    "files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "flake-compat": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_7": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_2"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_10": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_13"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_11": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_15"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_12": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_16"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_13": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_18"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_14": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_19"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_15": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_20"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_16": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_21"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_17": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_22"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_18": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_23"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_19": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_24"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_2": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_3"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_20": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_25"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_21": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_27"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_22": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_28"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_3": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_5"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_4": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_6"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_5": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_7"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_6": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_9"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_7": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_10"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_8": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_11"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_9": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_12"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_10": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_11": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_12": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_13": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_14": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_15": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_16": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_17": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_18": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_19": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_2": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_20": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_21": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_22": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_23": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_24": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_25": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_26": {
+      "locked": {
+        "lastModified": 1649676176,
+        "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_27": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_28": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_29": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_3": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_30": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_31": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_32": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_33": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_34": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_35": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_36": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_37": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_38": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_39": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_4": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_40": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_41": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_42": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_43": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_44": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_45": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_46": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_47": {
+      "locked": {
+        "lastModified": 1649676176,
+        "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_48": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_49": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_5": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_50": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_51": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_52": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_53": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_54": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_55": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_56": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_57": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_58": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_59": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_6": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_60": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_61": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_62": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_63": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_7": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_8": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_9": {
+      "locked": {
+        "lastModified": 1614513358,
+        "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "grocy": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585166193,
+        "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      }
+    },
+    "grocy_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585166193,
+        "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      }
+    },
+    "impermanence": {
+      "locked": {
+        "lastModified": 1684264534,
+        "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=",
+        "owner": "nix-community",
+        "repo": "impermanence",
+        "rev": "89253fb1518063556edd5e54509c30ac3089d5e6",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "ref": "master",
+        "repo": "impermanence",
+        "type": "github"
+      }
+    },
+    "landing-page": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1691524124,
+        "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=",
+        "ref": "main",
+        "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf",
+        "revCount": 573,
+        "type": "git",
+        "url": "https://github.com/bastienwirtz/homer.git"
+      },
+      "original": {
+        "ref": "main",
+        "type": "git",
+        "url": "https://github.com/bastienwirtz/homer.git"
+      }
+    },
+    "loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "loginctl-linger_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "loginctl-linger_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "mail-relay": {
+      "inputs": {
+        "environment": "environment_3",
+        "secrets": "secrets"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      }
+    },
+    "mail-relay_2": {
+      "inputs": {
+        "environment": "environment_20",
+        "secrets": "secrets_15"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      }
+    },
+    "main-flake": {
+      "inputs": {
+        "n-backup-2": "n-backup-2",
+        "n-dilion": "n-dilion",
+        "n-eldiron": "n-eldiron",
+        "n-monitoring-1": "n-monitoring-1",
+        "n-quatresaisons": "n-quatresaisons",
+        "n-zoldene": "n-zoldene",
+        "s-backports": "s-backports",
+        "s-copanier": "s-copanier",
+        "s-diaspora": "s-diaspora",
+        "s-etherpad-lite": "s-etherpad-lite",
+        "s-fiche": "s-fiche",
+        "s-files-watcher": "s-files-watcher",
+        "s-grocy": "s-grocy",
+        "s-lib": "s-lib",
+        "s-loginctl-linger": "s-loginctl-linger",
+        "s-mastodon": "s-mastodon",
+        "s-mediagoblin": "s-mediagoblin",
+        "s-multi-apache-container": "s-multi-apache-container",
+        "s-mypackages": "s-mypackages",
+        "s-myuids": "s-myuids",
+        "s-naemon": "s-naemon",
+        "s-openarc": "s-openarc",
+        "s-opendmarc": "s-opendmarc",
+        "s-paste": "s-paste",
+        "s-peertube": "s-peertube",
+        "s-private-buildbot": "s-private-buildbot",
+        "s-private-chatons": "s-private-chatons",
+        "s-private-environment": "s-private-environment",
+        "s-private-mail-relay": "s-private-mail-relay",
+        "s-private-milters": "s-private-milters",
+        "s-private-monitoring": "s-private-monitoring",
+        "s-private-openarc": "s-private-openarc",
+        "s-private-opendmarc": "s-private-opendmarc",
+        "s-private-openldap": "s-private-openldap",
+        "s-private-paste": "s-private-paste",
+        "s-private-peertube": "s-private-peertube",
+        "s-private-php": "s-private-php",
+        "s-private-ssh": "s-private-ssh",
+        "s-private-system": "s-private-system",
+        "s-rsync_backup": "s-rsync_backup",
+        "s-secrets": "s-secrets",
+        "s-surfer": "s-surfer",
+        "s-taskwarrior-web": "s-taskwarrior-web",
+        "secrets": [
+          "secrets"
+        ]
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-LBw8FCxHXW6b1WFvsEnmLmNpZjow6+N4Q+3zAfcudIU=",
+        "path": "../flakes",
+        "type": "path"
+      },
+      "original": {
+        "path": "../flakes",
+        "type": "path"
+      }
+    },
+    "mastodon": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1582790581,
+        "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
+        "owner": "tootsuite",
+        "repo": "mastodon",
+        "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tootsuite",
+        "ref": "v2.9.4",
+        "repo": "mastodon",
+        "type": "github"
+      }
+    },
+    "mastodon_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1582790581,
+        "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
+        "owner": "tootsuite",
+        "repo": "mastodon",
+        "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tootsuite",
+        "ref": "v2.9.4",
+        "repo": "mastodon",
+        "type": "github"
+      }
+    },
+    "mediagoblin": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1531090939,
+        "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "revCount": 4805,
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      },
+      "original": {
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      }
+    },
+    "mediagoblin_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1531090939,
+        "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "revCount": 4805,
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      },
+      "original": {
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      }
+    },
+    "milters": {
+      "inputs": {
+        "environment": "environment_4",
+        "files-watcher": "files-watcher",
+        "openarc": "openarc",
+        "opendmarc": "opendmarc",
+        "secrets": "secrets_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      }
+    },
+    "monitoring": {
+      "inputs": {
+        "environment": "environment_5",
+        "naemon": "naemon",
+        "nixpkgs-lib": "nixpkgs-lib",
+        "secrets": "secrets_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "monitoring_2": {
+      "inputs": {
+        "environment": "environment_9",
+        "naemon": "naemon_2",
+        "nixpkgs-lib": "nixpkgs-lib_4",
+        "secrets": "secrets_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "monitoring_3": {
+      "inputs": {
+        "environment": "environment_21",
+        "naemon": "naemon_4",
+        "nixpkgs-lib": "nixpkgs-lib_14",
+        "secrets": "secrets_16"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "monitoring_4": {
+      "inputs": {
+        "environment": "environment_24",
+        "naemon": "naemon_5",
+        "nixpkgs-lib": "nixpkgs-lib_17",
+        "secrets": "secrets_18"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "multi-apache-container": {
+      "inputs": {
+        "files-watcher": "files-watcher_11",
+        "myuids": "myuids_25"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      }
+    },
+    "my-lib": {
+      "inputs": {
+        "colmena": "colmena",
+        "disko": "disko",
+        "flake-parts": "flake-parts",
+        "nixos-anywhere": "nixos-anywhere",
+        "nixpkgs": "nixpkgs_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_2": {
+      "inputs": {
+        "colmena": "colmena_2",
+        "disko": "disko_2",
+        "flake-parts": "flake-parts_3",
+        "nixos-anywhere": "nixos-anywhere_2",
+        "nixpkgs": "nixpkgs_16"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_3": {
+      "inputs": {
+        "colmena": "colmena_3",
+        "disko": "disko_3",
+        "flake-parts": "flake-parts_5",
+        "nixos-anywhere": "nixos-anywhere_3",
+        "nixpkgs": "nixpkgs_23"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_4": {
+      "inputs": {
+        "colmena": "colmena_4",
+        "disko": "disko_4",
+        "flake-parts": "flake-parts_11",
+        "nixos-anywhere": "nixos-anywhere_4",
+        "nixpkgs": "nixpkgs_54"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_5": {
+      "inputs": {
+        "colmena": "colmena_5",
+        "disko": "disko_5",
+        "flake-parts": "flake-parts_13",
+        "nixos-anywhere": "nixos-anywhere_5",
+        "nixpkgs": "nixpkgs_62"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_6": {
+      "inputs": {
+        "colmena": "colmena_6",
+        "disko": "disko_6",
+        "flake-parts": "flake-parts_15",
+        "nixos-anywhere": "nixos-anywhere_6",
+        "nixpkgs": "nixpkgs_70"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_2",
+        "nixpkgs": "nixpkgs_12",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_10": {
+      "inputs": {
+        "flake-parts": "flake-parts_17",
+        "nixpkgs": "nixpkgs_77",
+        "webapps-ttrss": "webapps-ttrss_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_11": {
+      "inputs": {
+        "flake-parts": "flake-parts_18",
+        "nixpkgs": "nixpkgs_79",
+        "webapps-ttrss": "webapps-ttrss_12"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_12": {
+      "inputs": {
+        "flake-parts": "flake-parts_21",
+        "nixpkgs": "nixpkgs_102",
+        "webapps-ttrss": "webapps-ttrss_14"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_13": {
+      "inputs": {
+        "flake-parts": "flake-parts_22",
+        "nixpkgs": "nixpkgs_103",
+        "webapps-ttrss": "webapps-ttrss_15"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_2": {
+      "inputs": {
+        "flake-parts": "flake-parts_4",
+        "nixpkgs": "nixpkgs_19",
+        "webapps-ttrss": "webapps-ttrss_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_3": {
+      "inputs": {
+        "flake-parts": "flake-parts_6",
+        "nixpkgs": "nixpkgs_35",
+        "webapps-ttrss": "webapps-ttrss_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_4": {
+      "inputs": {
+        "flake-parts": "flake-parts_7",
+        "nixpkgs": "nixpkgs_38",
+        "webapps-ttrss": "webapps-ttrss_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_5": {
+      "inputs": {
+        "flake-parts": "flake-parts_8",
+        "nixpkgs": "nixpkgs_40",
+        "webapps-ttrss": "webapps-ttrss_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_6": {
+      "inputs": {
+        "flake-parts": "flake-parts_10",
+        "nixpkgs": "nixpkgs_48",
+        "webapps-ttrss": "webapps-ttrss_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_7": {
+      "inputs": {
+        "flake-parts": "flake-parts_12",
+        "nixpkgs": "nixpkgs_58",
+        "webapps-ttrss": "webapps-ttrss_8"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_8": {
+      "inputs": {
+        "flake-parts": "flake-parts_14",
+        "nixpkgs": "nixpkgs_66",
+        "webapps-ttrss": "webapps-ttrss_9"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_9": {
+      "inputs": {
+        "flake-parts": "flake-parts_16",
+        "nixpkgs": "nixpkgs_73",
+        "webapps-ttrss": "webapps-ttrss_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_16": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_17": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_18": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_19": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_20": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_21": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_22": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_23": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_24": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_25": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_26": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_27": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_28": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_29": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_30": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_31": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_32": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_33": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_34": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_35": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_36": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_37": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_38": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_39": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_40": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_41": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_42": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "n-backup-2": {
+      "inputs": {
+        "chatons": "chatons",
+        "environment": "environment_2",
+        "loginctl-linger": "loginctl-linger",
+        "mail-relay": "mail-relay",
+        "milters": "milters",
+        "monitoring": "monitoring",
+        "my-lib": "my-lib",
+        "myuids": "myuids_3",
+        "nixpkgs": "nixpkgs_8",
+        "openarc": "openarc_3",
+        "opendmarc": "opendmarc_2",
+        "openldap": "openldap",
+        "rsync_backup": "rsync_backup",
+        "secrets": "secrets_6",
+        "system": "system"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=",
+        "path": "../systems/backup-2",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/backup-2",
+        "type": "path"
+      }
+    },
+    "n-dilion": {
+      "inputs": {
+        "environment": "environment_8",
+        "files-watcher": "files-watcher_4",
+        "loginctl-linger": "loginctl-linger_2",
+        "monitoring": "monitoring_2",
+        "my-lib": "my-lib_2",
+        "myuids": "myuids_7",
+        "nixpkgs": "nixpkgs_17",
+        "secrets": "secrets_8",
+        "ssh": "ssh",
+        "system": "system_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=",
+        "path": "../systems/dilion",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/dilion",
+        "type": "path"
+      }
+    },
+    "n-eldiron": {
+      "inputs": {
+        "dns-nix": "dns-nix",
+        "my-lib": "my-lib_3",
+        "nixpkgs": "nixpkgs_24",
+        "private-buildbot": "private-buildbot",
+        "private-chatons": "private-chatons",
+        "private-environment": "private-environment",
+        "private-milters": "private-milters",
+        "private-monitoring": "private-monitoring",
+        "private-openarc": "private-openarc",
+        "private-opendmarc": "private-opendmarc",
+        "private-openldap": "private-openldap",
+        "private-paste": "private-paste",
+        "private-peertube": "private-peertube",
+        "private-php": "private-php",
+        "private-ssh": "private-ssh",
+        "private-system": "private-system",
+        "public-copanier": "public-copanier",
+        "public-diaspora": "public-diaspora",
+        "public-etherpad-lite": "public-etherpad-lite",
+        "public-fiche": "public-fiche",
+        "public-files-watcher": "public-files-watcher",
+        "public-grocy": "public-grocy",
+        "public-loginctl-linger": "public-loginctl-linger",
+        "public-mastodon": "public-mastodon",
+        "public-mediagoblin": "public-mediagoblin",
+        "public-multi-apache-container": "public-multi-apache-container",
+        "public-mypackages": "public-mypackages",
+        "public-myuids": "public-myuids",
+        "public-openarc": "public-openarc",
+        "public-opendmarc": "public-opendmarc",
+        "public-peertube": "public-peertube",
+        "public-secrets": "public-secrets",
+        "public-surfer": "public-surfer",
+        "public-taskwarrior-web": "public-taskwarrior-web"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=",
+        "path": "../systems/eldiron",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/eldiron",
+        "type": "path"
+      }
+    },
+    "n-monitoring-1": {
+      "inputs": {
+        "chatons": "chatons_2",
+        "environment": "environment_19",
+        "files-watcher": "files-watcher_9",
+        "loginctl-linger": "loginctl-linger_3",
+        "mail-relay": "mail-relay_2",
+        "monitoring": "monitoring_3",
+        "my-lib": "my-lib_4",
+        "myuids": "myuids_23",
+        "nixpkgs": "nixpkgs_55",
+        "php": "php",
+        "secrets": "secrets_17",
+        "system": "system_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=",
+        "path": "../systems/monitoring-1",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/monitoring-1",
+        "type": "path"
+      }
+    },
+    "n-quatresaisons": {
+      "inputs": {
+        "environment": "environment_23",
+        "files-watcher": "files-watcher_10",
+        "landing-page": "landing-page",
+        "monitoring": "monitoring_4",
+        "multi-apache-container": "multi-apache-container",
+        "my-lib": "my-lib_5",
+        "myuids": "myuids_26",
+        "nixpkgs": "nixpkgs_63",
+        "php": "php_2",
+        "secrets": "secrets_19",
+        "system": "system_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=",
+        "path": "../systems/quatresaisons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/quatresaisons",
+        "type": "path"
+      }
+    },
+    "n-zoldene": {
+      "inputs": {
+        "impermanence": "impermanence",
+        "my-lib": "my-lib_6",
+        "nixpkgs": "nixpkgs_71",
+        "private-environment": "private-environment_2",
+        "private-system": "private-system_2",
+        "public-secrets": "public-secrets_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=",
+        "path": "../systems/zoldene",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/zoldene",
+        "type": "path"
+      }
+    },
+    "naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "nixos-2305": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_2": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_3": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_4": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_5": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_6": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_7": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere": {
+      "inputs": {
+        "disko": [
+          "main-flake",
+          "n-backup-2",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "main-flake",
+          "n-backup-2",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305",
+        "nixos-images": "nixos-images",
+        "nixpkgs": "nixpkgs_6",
+        "treefmt-nix": "treefmt-nix"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_2": {
+      "inputs": {
+        "disko": [
+          "main-flake",
+          "n-dilion",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "main-flake",
+          "n-dilion",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_2",
+        "nixos-images": "nixos-images_2",
+        "nixpkgs": "nixpkgs_15",
+        "treefmt-nix": "treefmt-nix_2"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_3": {
+      "inputs": {
+        "disko": [
+          "main-flake",
+          "n-eldiron",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "main-flake",
+          "n-eldiron",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_3",
+        "nixos-images": "nixos-images_3",
+        "nixpkgs": "nixpkgs_22",
+        "treefmt-nix": "treefmt-nix_3"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_4": {
+      "inputs": {
+        "disko": [
+          "main-flake",
+          "n-monitoring-1",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "main-flake",
+          "n-monitoring-1",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_4",
+        "nixos-images": "nixos-images_4",
+        "nixpkgs": "nixpkgs_53",
+        "treefmt-nix": "treefmt-nix_4"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_5": {
+      "inputs": {
+        "disko": [
+          "main-flake",
+          "n-quatresaisons",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "main-flake",
+          "n-quatresaisons",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_5",
+        "nixos-images": "nixos-images_5",
+        "nixpkgs": "nixpkgs_61",
+        "treefmt-nix": "treefmt-nix_5"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_6": {
+      "inputs": {
+        "disko": [
+          "main-flake",
+          "n-zoldene",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "main-flake",
+          "n-zoldene",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_6",
+        "nixos-images": "nixos-images_6",
+        "nixpkgs": "nixpkgs_69",
+        "treefmt-nix": "treefmt-nix_6"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_7": {
+      "inputs": {
+        "disko": [
+          "main-flake",
+          "s-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "main-flake",
+          "s-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_7",
+        "nixos-images": "nixos-images_7",
+        "nixpkgs": "nixpkgs_83",
+        "treefmt-nix": "treefmt-nix_7"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-images": {
+      "inputs": {
+        "nixos-2305": [
+          "main-flake",
+          "n-backup-2",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "main-flake",
+          "n-backup-2",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_2": {
+      "inputs": {
+        "nixos-2305": [
+          "main-flake",
+          "n-dilion",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "main-flake",
+          "n-dilion",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_3": {
+      "inputs": {
+        "nixos-2305": [
+          "main-flake",
+          "n-eldiron",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "main-flake",
+          "n-eldiron",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_4": {
+      "inputs": {
+        "nixos-2305": [
+          "main-flake",
+          "n-monitoring-1",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "main-flake",
+          "n-monitoring-1",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_5": {
+      "inputs": {
+        "nixos-2305": [
+          "main-flake",
+          "n-quatresaisons",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "main-flake",
+          "n-quatresaisons",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_6": {
+      "inputs": {
+        "nixos-2305": [
+          "main-flake",
+          "n-zoldene",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "main-flake",
+          "n-zoldene",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_7": {
+      "inputs": {
+        "nixos-2305": [
+          "main-flake",
+          "s-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "main-flake",
+          "s-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1677383253,
+        "narHash": "sha256-UfpzWfSxkfXHnb4boXZNaKsAcUrZT9Hw+tao1oZxd08=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "9952d6bc395f5841262b006fbace8dd7e143b634",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_10": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_11": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_12": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_13": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_14": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_15": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_16": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_17": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_18": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_19": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_2": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_20": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_21": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_22": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_23": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_24": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_25": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_26": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_27": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_28": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_3": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_4": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_5": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_6": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_7": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_8": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_9": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_10": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_100": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_101": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_102": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_103": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_104": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_105": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_106": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691472822,
+        "narHash": "sha256-XVfYZ2oB3lNPVq6sHCY9WkdQ8lHoIDzzbpg8bB6oBxA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "41c7605718399dcfa53dd7083793b6ae3bc969ff",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_107": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_11": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_12": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_13": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_14": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_15": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_16": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_17": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_18": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_19": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_20": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_21": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_22": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_23": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_24": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_25": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_26": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_27": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_28": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_29": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_3": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_30": {
+      "locked": {
+        "lastModified": 1631570365,
+        "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_31": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_32": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_33": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_34": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_35": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_36": {
+      "locked": {
+        "lastModified": 1633901457,
+        "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_37": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_38": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_39": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_4": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_40": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_41": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_42": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_43": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_44": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_45": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_46": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_47": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_48": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_49": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_5": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_50": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_51": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_52": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_53": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_54": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_55": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_56": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_57": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_58": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_59": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_6": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_60": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_61": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_62": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_63": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_64": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_65": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_66": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_67": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_68": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_69": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_7": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_70": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_71": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_72": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_73": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_74": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_75": {
+      "locked": {
+        "lastModified": 1633901457,
+        "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_76": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_77": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_78": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_79": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_8": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_80": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_81": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_82": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_83": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_84": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_85": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_86": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_87": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_88": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_89": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_9": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_90": {
+      "locked": {
+        "lastModified": 1631570365,
+        "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_91": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_92": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_93": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_94": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_95": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_96": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_97": {
+      "locked": {
+        "lastModified": 1631570365,
+        "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_98": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_99": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs_2",
+        "openarc": "openarc_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_10": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_11": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_12": {
+      "inputs": {
+        "flake-utils": "flake-utils_53",
+        "myuids": "myuids_36",
+        "nixpkgs": "nixpkgs_93",
+        "openarc": "openarc_13"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_13": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_14": {
+      "inputs": {
+        "flake-utils": "flake-utils_55",
+        "myuids": "myuids_38",
+        "nixpkgs": "nixpkgs_95",
+        "openarc": "openarc_15"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_15": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_3": {
+      "inputs": {
+        "files-watcher": "files-watcher_2",
+        "openarc": "openarc_4",
+        "secrets": "secrets_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      }
+    },
+    "openarc_4": {
+      "inputs": {
+        "flake-utils": "flake-utils_4",
+        "myuids": "myuids_4",
+        "nixpkgs": "nixpkgs_9",
+        "openarc": "openarc_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_6": {
+      "inputs": {
+        "flake-utils": "flake-utils_12",
+        "myuids": "myuids_9",
+        "nixpkgs": "nixpkgs_26",
+        "openarc": "openarc_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_7": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_8": {
+      "inputs": {
+        "flake-utils": "flake-utils_14",
+        "myuids": "myuids_11",
+        "nixpkgs": "nixpkgs_28",
+        "openarc": "openarc_9"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_9": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_2",
+        "myuids": "myuids_2",
+        "nixpkgs": "nixpkgs_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_2": {
+      "inputs": {
+        "environment": "environment_6",
+        "files-watcher": "files-watcher_3",
+        "opendmarc": "opendmarc_3",
+        "secrets": "secrets_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_3": {
+      "inputs": {
+        "flake-utils": "flake-utils_5",
+        "myuids": "myuids_5",
+        "nixpkgs": "nixpkgs_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_4": {
+      "inputs": {
+        "flake-utils": "flake-utils_13",
+        "myuids": "myuids_10",
+        "nixpkgs": "nixpkgs_27"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_5": {
+      "inputs": {
+        "flake-utils": "flake-utils_15",
+        "myuids": "myuids_12",
+        "nixpkgs": "nixpkgs_29"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_6": {
+      "inputs": {
+        "flake-utils": "flake-utils_54",
+        "myuids": "myuids_37",
+        "nixpkgs": "nixpkgs_94"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_7": {
+      "inputs": {
+        "flake-utils": "flake-utils_56",
+        "myuids": "myuids_39",
+        "nixpkgs": "nixpkgs_96"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "openldap": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      }
+    },
+    "paste": {
+      "inputs": {
+        "flake-utils": "flake-utils_16",
+        "nixpkgs": "nixpkgs_30"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
+        "path": "../../paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../paste",
+        "type": "path"
+      }
+    },
+    "paste_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_57",
+        "nixpkgs": "nixpkgs_97"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
+        "path": "../../paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../paste",
+        "type": "path"
+      }
+    },
+    "peertube": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1611184594,
+        "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
+        "ref": "gitolite_local/open_instance",
+        "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
+        "revCount": 6316,
+        "type": "git",
+        "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1611184594,
+        "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
+        "ref": "gitolite_local/open_instance",
+        "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
+        "revCount": 6316,
+        "type": "git",
+        "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_open_instance": {
+      "inputs": {
+        "flake-utils": "flake-utils_17",
+        "myuids": "myuids_13",
+        "nixpkgs": "nixpkgs_31",
+        "peertube": "peertube"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "peertube_open_instance_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_58",
+        "myuids": "myuids_40",
+        "nixpkgs": "nixpkgs_98",
+        "peertube": "peertube_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "peertube_origin": {
+      "inputs": {
+        "flake-utils": "flake-utils_18",
+        "myuids": "myuids_14",
+        "nixpkgs": "nixpkgs_32",
+        "peertube": "peertube_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "peertube_origin_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_59",
+        "myuids": "myuids_41",
+        "nixpkgs": "nixpkgs_99",
+        "peertube": "peertube_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "php": {
+      "inputs": {
+        "flake-utils": "flake-utils_33",
+        "nixpkgs": "nixpkgs_56",
+        "nixpkgs-4": "nixpkgs-4_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "php_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_36",
+        "nixpkgs": "nixpkgs_64",
+        "nixpkgs-4": "nixpkgs-4_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "private-buildbot": {
+      "inputs": {
+        "buildslist": "buildslist",
+        "flake-utils": "flake-utils_11",
+        "nixpkgs": "nixpkgs_25"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
+        "path": "../../flakes/private/buildbot",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/buildbot",
+        "type": "path"
+      }
+    },
+    "private-chatons": {
+      "inputs": {
+        "environment": "environment_12"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "private-environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "private-environment_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "private-milters": {
+      "inputs": {
+        "environment": "environment_13",
+        "files-watcher": "files-watcher_5",
+        "openarc": "openarc_6",
+        "opendmarc": "opendmarc_4",
+        "secrets": "secrets_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      }
+    },
+    "private-monitoring": {
+      "inputs": {
+        "environment": "environment_14",
+        "naemon": "naemon_3",
+        "nixpkgs-lib": "nixpkgs-lib_8",
+        "secrets": "secrets_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "private-openarc": {
+      "inputs": {
+        "files-watcher": "files-watcher_6",
+        "openarc": "openarc_8",
+        "secrets": "secrets_12"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      }
+    },
+    "private-opendmarc": {
+      "inputs": {
+        "environment": "environment_15",
+        "files-watcher": "files-watcher_7",
+        "opendmarc": "opendmarc_5",
+        "secrets": "secrets_13"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      }
+    },
+    "private-openldap": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      }
+    },
+    "private-paste": {
+      "inputs": {
+        "paste": "paste"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
+        "path": "../../flakes/private/paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/paste",
+        "type": "path"
+      }
+    },
+    "private-peertube": {
+      "inputs": {
+        "peertube_open_instance": "peertube_open_instance",
+        "peertube_origin": "peertube_origin"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
+        "path": "../../flakes/private/peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/peertube",
+        "type": "path"
+      }
+    },
+    "private-php": {
+      "inputs": {
+        "flake-utils": "flake-utils_19",
+        "nixpkgs": "nixpkgs_33",
+        "nixpkgs-4": "nixpkgs-4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "private-ssh": {
+      "inputs": {
+        "environment": "environment_16",
+        "secrets": "secrets_14"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      }
+    },
+    "private-system": {
+      "inputs": {
+        "backports": "backports_3",
+        "environment": "environment_17",
+        "mypackages": "mypackages_3",
+        "myuids": "myuids_15",
+        "secrets-public": "secrets-public_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "private-system_2": {
+      "inputs": {
+        "backports": "backports_6",
+        "environment": "environment_26",
+        "mypackages": "mypackages_9",
+        "myuids": "myuids_28",
+        "secrets-public": "secrets-public_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "public-copanier": {
+      "inputs": {
+        "copanier": "copanier",
+        "flake-utils": "flake-utils_21",
+        "nixpkgs": "nixpkgs_36"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
+        "path": "../../flakes/copanier",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/copanier",
+        "type": "path"
+      }
+    },
+    "public-diaspora": {
+      "inputs": {
+        "diaspora": "diaspora",
+        "flake-utils": "flake-utils_22",
+        "myuids": "myuids_16",
+        "nixpkgs": "nixpkgs_37"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
+        "path": "../../flakes/diaspora",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/diaspora",
+        "type": "path"
+      }
+    },
+    "public-etherpad-lite": {
+      "inputs": {
+        "etherpad-lite": "etherpad-lite",
+        "flake-utils": "flake-utils_23",
+        "mypackages": "mypackages_4",
+        "nixpkgs": "nixpkgs_39"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
+        "path": "../../flakes/etherpad-lite",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/etherpad-lite",
+        "type": "path"
+      }
+    },
+    "public-fiche": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
+        "path": "../../flakes/fiche",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/fiche",
+        "type": "path"
+      }
+    },
+    "public-files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "public-grocy": {
+      "inputs": {
+        "flake-utils": "flake-utils_24",
+        "grocy": "grocy",
+        "mypackages": "mypackages_5",
+        "nixpkgs": "nixpkgs_41"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
+        "path": "../../flakes/grocy",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/grocy",
+        "type": "path"
+      }
+    },
+    "public-loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "public-mastodon": {
+      "inputs": {
+        "flake-utils": "flake-utils_25",
+        "mastodon": "mastodon",
+        "myuids": "myuids_17",
+        "nixpkgs": "nixpkgs_42"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
+        "path": "../../flakes/mastodon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mastodon",
+        "type": "path"
+      }
+    },
+    "public-mediagoblin": {
+      "inputs": {
+        "flake-utils": "flake-utils_26",
+        "mediagoblin": "mediagoblin",
+        "myuids": "myuids_18",
+        "nixpkgs": "nixpkgs_43"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
+        "path": "../../flakes/mediagoblin",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mediagoblin",
+        "type": "path"
+      }
+    },
+    "public-multi-apache-container": {
+      "inputs": {
+        "files-watcher": "files-watcher_8",
+        "myuids": "myuids_19"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      }
+    },
+    "public-mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_9",
+        "nixpkgs": "nixpkgs_44",
+        "webapps-ttrss": "webapps-ttrss_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../flakes/mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mypackages",
+        "type": "path"
+      }
+    },
+    "public-myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "public-openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_27",
+        "myuids": "myuids_20",
+        "nixpkgs": "nixpkgs_45",
+        "openarc": "openarc_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../flakes/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/openarc",
+        "type": "path"
+      }
+    },
+    "public-opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_28",
+        "myuids": "myuids_21",
+        "nixpkgs": "nixpkgs_46"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../flakes/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/opendmarc",
+        "type": "path"
+      }
+    },
+    "public-peertube": {
+      "inputs": {
+        "flake-utils": "flake-utils_29",
+        "myuids": "myuids_22",
+        "nixpkgs": "nixpkgs_47",
+        "peertube": "peertube_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "../../flakes/peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/peertube",
+        "type": "path"
+      }
+    },
+    "public-secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "public-secrets_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "public-surfer": {
+      "inputs": {
+        "flake-utils": "flake-utils_30",
+        "mypackages": "mypackages_6",
+        "nixpkgs": "nixpkgs_49",
+        "surfer": "surfer"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
+        "path": "../../flakes/surfer",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/surfer",
+        "type": "path"
+      }
+    },
+    "public-taskwarrior-web": {
+      "inputs": {
+        "flake-utils": "flake-utils_31",
+        "nixpkgs": "nixpkgs_50",
+        "taskwarrior-web": "taskwarrior-web"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
+        "path": "../../flakes/taskwarrior-web",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/taskwarrior-web",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "devshell": "devshell",
+        "main-flake": "main-flake",
+        "nixpkgs": "nixpkgs_106",
+        "secrets": "secrets_26"
+      }
+    },
+    "rsync_backup": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
+        "path": "../../flakes/rsync_backup",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/rsync_backup",
+        "type": "path"
+      }
+    },
+    "s-backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_40",
+        "nixpkgs": "nixpkgs_74"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "./backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "./backports",
+        "type": "path"
+      }
+    },
+    "s-copanier": {
+      "inputs": {
+        "copanier": "copanier_2",
+        "flake-utils": "flake-utils_41",
+        "nixpkgs": "nixpkgs_75"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
+        "path": "./copanier",
+        "type": "path"
+      },
+      "original": {
+        "path": "./copanier",
+        "type": "path"
+      }
+    },
+    "s-diaspora": {
+      "inputs": {
+        "diaspora": "diaspora_2",
+        "flake-utils": "flake-utils_42",
+        "myuids": "myuids_29",
+        "nixpkgs": "nixpkgs_76"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
+        "path": "./diaspora",
+        "type": "path"
+      },
+      "original": {
+        "path": "./diaspora",
+        "type": "path"
+      }
+    },
+    "s-etherpad-lite": {
+      "inputs": {
+        "etherpad-lite": "etherpad-lite_2",
+        "flake-utils": "flake-utils_43",
+        "mypackages": "mypackages_10",
+        "nixpkgs": "nixpkgs_78"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
+        "path": "./etherpad-lite",
+        "type": "path"
+      },
+      "original": {
+        "path": "./etherpad-lite",
+        "type": "path"
+      }
+    },
+    "s-fiche": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
+        "path": "./fiche",
+        "type": "path"
+      },
+      "original": {
+        "path": "./fiche",
+        "type": "path"
+      }
+    },
+    "s-files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "./files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "./files-watcher",
+        "type": "path"
+      }
+    },
+    "s-grocy": {
+      "inputs": {
+        "flake-utils": "flake-utils_44",
+        "grocy": "grocy_2",
+        "mypackages": "mypackages_11",
+        "nixpkgs": "nixpkgs_80"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
+        "path": "./grocy",
+        "type": "path"
+      },
+      "original": {
+        "path": "./grocy",
+        "type": "path"
+      }
+    },
+    "s-lib": {
+      "inputs": {
+        "colmena": "colmena_7",
+        "disko": "disko_7",
+        "flake-parts": "flake-parts_19",
+        "nixos-anywhere": "nixos-anywhere_7",
+        "nixpkgs": "nixpkgs_84"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "./lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "./lib",
+        "type": "path"
+      }
+    },
+    "s-loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "./loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "./loginctl-linger",
+        "type": "path"
+      }
+    },
+    "s-mastodon": {
+      "inputs": {
+        "flake-utils": "flake-utils_46",
+        "mastodon": "mastodon_2",
+        "myuids": "myuids_30",
+        "nixpkgs": "nixpkgs_85"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
+        "path": "./mastodon",
+        "type": "path"
+      },
+      "original": {
+        "path": "./mastodon",
+        "type": "path"
+      }
+    },
+    "s-mediagoblin": {
+      "inputs": {
+        "flake-utils": "flake-utils_47",
+        "mediagoblin": "mediagoblin_2",
+        "myuids": "myuids_31",
+        "nixpkgs": "nixpkgs_86"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
+        "path": "./mediagoblin",
+        "type": "path"
+      },
+      "original": {
+        "path": "./mediagoblin",
+        "type": "path"
+      }
+    },
+    "s-multi-apache-container": {
+      "inputs": {
+        "files-watcher": "files-watcher_12",
+        "myuids": "myuids_32"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
+        "path": "./multi-apache-container",
+        "type": "path"
+      },
+      "original": {
+        "path": "./multi-apache-container",
+        "type": "path"
+      }
+    },
+    "s-mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_20",
+        "nixpkgs": "nixpkgs_87",
+        "webapps-ttrss": "webapps-ttrss_13"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "./mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "./mypackages",
+        "type": "path"
+      }
+    },
+    "s-myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "./myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "./myuids",
+        "type": "path"
+      }
+    },
+    "s-naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "./naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "./naemon",
+        "type": "path"
+      }
+    },
+    "s-openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_48",
+        "myuids": "myuids_33",
+        "nixpkgs": "nixpkgs_88",
+        "openarc": "openarc_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "./openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./openarc",
+        "type": "path"
+      }
+    },
+    "s-opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_49",
+        "myuids": "myuids_34",
+        "nixpkgs": "nixpkgs_89"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "./opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./opendmarc",
+        "type": "path"
+      }
+    },
+    "s-paste": {
+      "inputs": {
+        "flake-utils": "flake-utils_50",
+        "nixpkgs": "nixpkgs_90"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
+        "path": "./paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "./paste",
+        "type": "path"
+      }
+    },
+    "s-peertube": {
+      "inputs": {
+        "flake-utils": "flake-utils_51",
+        "myuids": "myuids_35",
+        "nixpkgs": "nixpkgs_91",
+        "peertube": "peertube_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./peertube",
+        "type": "path"
+      }
+    },
+    "s-private-buildbot": {
+      "inputs": {
+        "buildslist": "buildslist_2",
+        "flake-utils": "flake-utils_52",
+        "nixpkgs": "nixpkgs_92"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
+        "path": "./private/buildbot",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/buildbot",
+        "type": "path"
+      }
+    },
+    "s-private-chatons": {
+      "inputs": {
+        "environment": "environment_27"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "./private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/chatons",
+        "type": "path"
+      }
+    },
+    "s-private-environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "./private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/environment",
+        "type": "path"
+      }
+    },
+    "s-private-mail-relay": {
+      "inputs": {
+        "environment": "environment_28",
+        "secrets": "secrets_20"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
+        "path": "./private/mail-relay",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/mail-relay",
+        "type": "path"
+      }
+    },
+    "s-private-milters": {
+      "inputs": {
+        "environment": "environment_29",
+        "files-watcher": "files-watcher_13",
+        "openarc": "openarc_12",
+        "opendmarc": "opendmarc_6",
+        "secrets": "secrets_21"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
+        "path": "./private/milters",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/milters",
+        "type": "path"
+      }
+    },
+    "s-private-monitoring": {
+      "inputs": {
+        "environment": "environment_30",
+        "naemon": "naemon_6",
+        "nixpkgs-lib": "nixpkgs-lib_26",
+        "secrets": "secrets_22"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "./private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/monitoring",
+        "type": "path"
+      }
+    },
+    "s-private-openarc": {
+      "inputs": {
+        "files-watcher": "files-watcher_14",
+        "openarc": "openarc_14",
+        "secrets": "secrets_23"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
+        "path": "./private/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/openarc",
+        "type": "path"
+      }
+    },
+    "s-private-opendmarc": {
+      "inputs": {
+        "environment": "environment_31",
+        "files-watcher": "files-watcher_15",
+        "opendmarc": "opendmarc_7",
+        "secrets": "secrets_24"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
+        "path": "./private/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/opendmarc",
+        "type": "path"
+      }
+    },
+    "s-private-openldap": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
+        "path": "./private/openldap",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/openldap",
+        "type": "path"
+      }
+    },
+    "s-private-paste": {
+      "inputs": {
+        "paste": "paste_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
+        "path": "./private/paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/paste",
+        "type": "path"
+      }
+    },
+    "s-private-peertube": {
+      "inputs": {
+        "peertube_open_instance": "peertube_open_instance_2",
+        "peertube_origin": "peertube_origin_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
+        "path": "./private/peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/peertube",
+        "type": "path"
+      }
+    },
+    "s-private-php": {
+      "inputs": {
+        "flake-utils": "flake-utils_60",
+        "nixpkgs": "nixpkgs_100",
+        "nixpkgs-4": "nixpkgs-4_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "./private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/php",
+        "type": "path"
+      }
+    },
+    "s-private-ssh": {
+      "inputs": {
+        "environment": "environment_32",
+        "secrets": "secrets_25"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
+        "path": "./private/ssh",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/ssh",
+        "type": "path"
+      }
+    },
+    "s-private-system": {
+      "inputs": {
+        "backports": "backports_7",
+        "environment": "environment_33",
+        "mypackages": "mypackages_12",
+        "myuids": "myuids_42",
+        "secrets-public": "secrets-public_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "./private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/system",
+        "type": "path"
+      }
+    },
+    "s-rsync_backup": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
+        "path": "./rsync_backup",
+        "type": "path"
+      },
+      "original": {
+        "path": "./rsync_backup",
+        "type": "path"
+      }
+    },
+    "s-secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "./secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "./secrets",
+        "type": "path"
+      }
+    },
+    "s-surfer": {
+      "inputs": {
+        "flake-utils": "flake-utils_62",
+        "mypackages": "mypackages_13",
+        "nixpkgs": "nixpkgs_104",
+        "surfer": "surfer_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
+        "path": "./surfer",
+        "type": "path"
+      },
+      "original": {
+        "path": "./surfer",
+        "type": "path"
+      }
+    },
+    "s-taskwarrior-web": {
+      "inputs": {
+        "flake-utils": "flake-utils_63",
+        "nixpkgs": "nixpkgs_105",
+        "taskwarrior-web": "taskwarrior-web_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
+        "path": "./taskwarrior-web",
+        "type": "path"
+      },
+      "original": {
+        "path": "./taskwarrior-web",
+        "type": "path"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_16": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_17": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_18": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_19": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_20": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_21": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_22": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_23": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_24": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_25": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_26": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_107"
+      },
+      "locked": {
+        "lastModified": 1696144631,
+        "narHash": "sha256-zV7tbNrrrUpPkaATkc6OsQC8n75QybaBKsaD7d5kQGA=",
+        "ref": "master",
+        "rev": "ae51ac0227647e30348256067934b8c9eb7e3f06",
+        "revCount": 688,
+        "type": "git",
+        "url": "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets"
+      },
+      "original": {
+        "ref": "master",
+        "type": "git",
+        "url": "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets"
+      }
+    },
+    "secrets_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "ssh": {
+      "inputs": {
+        "environment": "environment_10",
+        "secrets": "secrets_9"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      }
+    },
+    "stable": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_2": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_3": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_4": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_5": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_6": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_7": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "surfer": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1588637864,
+        "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "revCount": 318,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      },
+      "original": {
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      }
+    },
+    "surfer_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1588637864,
+        "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "revCount": 318,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      },
+      "original": {
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      }
+    },
+    "system": {
+      "inputs": {
+        "backports": "backports",
+        "environment": "environment_7",
+        "mypackages": "mypackages",
+        "myuids": "myuids_6",
+        "secrets-public": "secrets-public"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "system_2": {
+      "inputs": {
+        "backports": "backports_2",
+        "environment": "environment_11",
+        "mypackages": "mypackages_2",
+        "myuids": "myuids_8",
+        "secrets-public": "secrets-public_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "system_3": {
+      "inputs": {
+        "backports": "backports_4",
+        "environment": "environment_22",
+        "mypackages": "mypackages_7",
+        "myuids": "myuids_24",
+        "secrets-public": "secrets-public_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "system_4": {
+      "inputs": {
+        "backports": "backports_5",
+        "environment": "environment_25",
+        "mypackages": "mypackages_8",
+        "myuids": "myuids_27",
+        "secrets-public": "secrets-public_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "systems": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
+    },
+    "taskwarrior-web": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546434241,
+        "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      }
+    },
+    "taskwarrior-web_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546434241,
+        "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "main-flake",
+          "n-backup-2",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_2": {
+      "inputs": {
+        "nixpkgs": [
+          "main-flake",
+          "n-dilion",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_3": {
+      "inputs": {
+        "nixpkgs": [
+          "main-flake",
+          "n-eldiron",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_4": {
+      "inputs": {
+        "nixpkgs": [
+          "main-flake",
+          "n-monitoring-1",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_5": {
+      "inputs": {
+        "nixpkgs": [
+          "main-flake",
+          "n-quatresaisons",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_6": {
+      "inputs": {
+        "nixpkgs": [
+          "main-flake",
+          "n-zoldene",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_7": {
+      "inputs": {
+        "nixpkgs": [
+          "main-flake",
+          "s-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_10": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_11": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_12": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_13": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_14": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_15": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_7": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_8": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_9": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/deploy/flake.nix b/deploy/flake.nix
new file mode 100644 (file)
index 0000000..f613b19
--- /dev/null
@@ -0,0 +1,45 @@
+{
+  inputs = {
+    devshell.url = "github:numtide/devshell";
+    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable?dir=lib";
+    # Uncomment temporarily below value and replace with local path to
+    # your secrets, and replace "follows" key below to use it.
+    #secrets-local.url = "path:/home/immae/projets/mes_sites/nixops-secrets";
+    secrets = {
+      type = "git";
+      url = "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets";
+      ref = "master";
+    };
+    main-flake.url = "path:../flakes";
+    main-flake.inputs.secrets.follows = "secrets";
+  };
+  outputs = inputs@{ self, nixpkgs, main-flake, devshell, ... }: {
+    sops-vars-file = (inputs.secrets-local or inputs.secrets).vars-file;
+    # FIXME: next line Can be removed in nix 2.16.*
+    devShell.x86_64-linux = self.devShells.x86_64-linux.default;
+    devShells.x86_64-linux.default = devshell.legacyPackages.x86_64-linux.mkShell {
+      env = [
+        { name = "NIX_BUILD_TOP"; value = ""; }
+        { name = "SOPS_VARS_FILE"; value = builtins.toString self.sops-vars-file; }
+      ];
+    };
+    colmena =
+      let
+        nodeFlakes = main-flake.subflakes.nodes;
+        hosts = builtins.attrNames nodeFlakes;
+        toHostNixpkgs = name: nodeFlakes.${name}.colmena.meta.nixpkgs;
+        toHostSpecialArgs = name: nodeFlakes.${name}.colmena.meta.specialArgs;
+        toHostColmena = name: nodeFlakes.${name}.colmena.${name};
+
+      in nixpkgs.lib.genAttrs hosts toHostColmena
+        // {
+        meta = {
+          # nixpkgs is required for colmena, but only lib is actually used
+          nixpkgs.lib = nixpkgs.lib;
+          specialArgs.secrets = main-flake.subflakes.secrets;
+          nodeNixpkgs = nixpkgs.lib.genAttrs hosts toHostNixpkgs;
+          nodeSpecialArgs = nixpkgs.lib.genAttrs hosts toHostSpecialArgs;
+        };
+      };
+  };
+}
diff --git a/environments/default.nix b/environments/default.nix
deleted file mode 100644 (file)
index 5f17eb9..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-{ callPackage }:
-{
-  immae-eu = callPackage ./immae-eu.nix {};
-}
diff --git a/environments/immae-eu.nix b/environments/immae-eu.nix
deleted file mode 100644 (file)
index 4def84b..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-{ pkgs }: with pkgs;
-let
-  # https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh
-  # https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks
-  vlock' = vlock.overrideAttrs(old: {
-    configureFlags = old.configureFlags ++ [ "--enable-root-password=no" ];
-  });
-  paths = [
-    # archives
-    lzo unzip bzip2 xz
-    # unrar is unfree
-
-    # backups
-    duply
-
-    # calendar/contacts
-    abook khard khal cadaver vdirsyncerStable pal
-
-    # computing
-    boinctui
-
-    # cryptocurrencies
-    monero
-    cointop
-    # failing xmr-stak
-    solc
-    iota-cli-app
-
-    # debugging
-    rr valgrind netcat-gnu strace shellcheck
-
-    # documentations
-    unicodeDoc
-
-    # e-mails
-    muttprint mutt-ics
-    notmuch-python2 notmuch-python3 notmuch-vim
-    neomutt mairix
-    bogofilter fetchmail
-    sieve-connect
-
-    # git
-    vcsh gitRepo stgit tig ripgrep mr
-
-    # graphical tools
-    nextcloud-client firefox
-    dwm dmenu st xorg.xauth tigervnc
-
-    # images
-    feh imagemagick tiv graphicsmagick qrcode
-
-    # internet browsing
-    w3m lynx links elinks browsh woob urlview urlscan googler urlwatch
-
-    # less
-    python3Packages.pygments lesspipe highlight sourceHighlight
-
-    # monitoring
-    cnagios mtop pg_activity nagios-cli mtr
-    iftop htop iotop iperf bonfire
-    goaccess tcpdump tshark tcpflow
-    mitmproxy
-    # nagnu
-
-    # messaging/forums/news
-    flrn slrn
-    signal-cli signaldctl
-    telegram-cli telegram-history-dump telegramircd
-    weechat profanity
-    newsboat irssi
-
-    # nix
-    yarn2nix-moretea.yarn2nix nixUnstable
-    nixops nix-prefetch-scripts nix-generate-from-cpan
-    bundix nodePackages.bower2nix nix-diff
-    nodePackages.node2nix niv
-    # (nixos {}).nixos-generate-config
-    # (nixos {}).nixos-install
-    # (nixos {}).nixos-enter
-    # (nixos {}).manual.manpages
-
-    # note taking
-    note terminal-velocity jrnl doing nb
-
-    # office
-    sc-im ranger
-    genius bc
-    ledger
-    tmux
-    rtorrent
-    ldapvi
-    fzf
-    buku
-    vimPlugins.vim-plug
-    (vim_configurable.override { python = python3; })
-    mailcap
-    webapps.surfer
-
-    # password management
-    (pass.withExtensions (exts: [ exts.pass-otp ])) apg pwgen
-
-    # pdf
-    pdftk poppler_utils
-
-    # programming
-    pelican emacs26-nox ctags
-    wdiff patch gnumake
-
-    # security
-    keybase gnupg
-
-    # todolist/time management
-    taskwarrior vit timewarrior taskopen
-    bugwarrior
-
-    # video/music
-    youtube-dl ncmpc ncmpcpp ffmpeg
-
-    # s6 tools (part of skawarePackages)
-    skalibs execline s6 s6-dns s6-linux-utils s6-networking
-    s6-portable-utils
-
-    # system tools
-    telnet bind.dnsutils httpie ngrep nmap p0f socat lsof psmisc
-    wget patchelf rename tmux (lib.meta.hiPrio nettools)
-    vlock' mosh manpages openssl openssl.doc openssl.man
-    sshfs ncdu procps-ng
-
-    # other tools
-    pgloader s3cmd lftp jq cpulimit libxslt gandi-cli bubblewrap
-
-    # Terraform + AWS
-    terraform_0_12 awscli
-    ansible python3Packages.boto
-    openvpn
-
-    zsh-completions
-  ];
-in
-buildEnv {
-  name = "immae-eu-packages";
-  inherit paths;
-  pathsToLink = [ "/bin" "/etc" "/include" "/lib" "/libexec" "/share"];
-  extraOutputsToInstall = [ "bin" "man" "doc" "info" ];
-  passthru = { packages = paths; };
-}
diff --git a/flake.lock b/flake.lock
new file mode 100644 (file)
index 0000000..b109986
--- /dev/null
@@ -0,0 +1,9825 @@
+{
+  "nodes": {
+    "backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_6",
+        "nixpkgs": "nixpkgs_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_8",
+        "nixpkgs": "nixpkgs_18"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_3": {
+      "inputs": {
+        "flake-utils": "flake-utils_20",
+        "nixpkgs": "nixpkgs_34"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_4": {
+      "inputs": {
+        "flake-utils": "flake-utils_34",
+        "nixpkgs": "nixpkgs_57"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_5": {
+      "inputs": {
+        "flake-utils": "flake-utils_37",
+        "nixpkgs": "nixpkgs_65"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_6": {
+      "inputs": {
+        "flake-utils": "flake-utils_39",
+        "nixpkgs": "nixpkgs_72"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_7": {
+      "inputs": {
+        "flake-utils": "flake-utils_61",
+        "nixpkgs": "nixpkgs_101"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "buildslist": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585697026,
+        "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
+        "ref": "master",
+        "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
+        "revCount": 4,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      }
+    },
+    "buildslist_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585697026,
+        "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
+        "ref": "master",
+        "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
+        "revCount": 4,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      }
+    },
+    "chatons": {
+      "inputs": {
+        "environment": "environment"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "chatons_2": {
+      "inputs": {
+        "environment": "environment_18"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "colmena": {
+      "inputs": {
+        "flake-compat": "flake-compat",
+        "flake-utils": "flake-utils_3",
+        "nixpkgs": "nixpkgs_4",
+        "stable": "stable"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_2": {
+      "inputs": {
+        "flake-compat": "flake-compat_2",
+        "flake-utils": "flake-utils_7",
+        "nixpkgs": "nixpkgs_13",
+        "stable": "stable_2"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_3": {
+      "inputs": {
+        "flake-compat": "flake-compat_3",
+        "flake-utils": "flake-utils_10",
+        "nixpkgs": "nixpkgs_20",
+        "stable": "stable_3"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_4": {
+      "inputs": {
+        "flake-compat": "flake-compat_4",
+        "flake-utils": "flake-utils_32",
+        "nixpkgs": "nixpkgs_51",
+        "stable": "stable_4"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_5": {
+      "inputs": {
+        "flake-compat": "flake-compat_5",
+        "flake-utils": "flake-utils_35",
+        "nixpkgs": "nixpkgs_59",
+        "stable": "stable_5"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_6": {
+      "inputs": {
+        "flake-compat": "flake-compat_6",
+        "flake-utils": "flake-utils_38",
+        "nixpkgs": "nixpkgs_67",
+        "stable": "stable_6"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_7": {
+      "inputs": {
+        "flake-compat": "flake-compat_7",
+        "flake-utils": "flake-utils_45",
+        "nixpkgs": "nixpkgs_81",
+        "stable": "stable_7"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "copanier": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1633895178,
+        "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
+        "type": "github"
+      },
+      "original": {
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "type": "github"
+      }
+    },
+    "copanier_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1633895178,
+        "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
+        "type": "github"
+      },
+      "original": {
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "type": "github"
+      }
+    },
+    "devshell": {
+      "inputs": {
+        "nixpkgs": "nixpkgs",
+        "systems": "systems"
+      },
+      "locked": {
+        "lastModified": 1688380630,
+        "narHash": "sha256-8ilApWVb1mAi4439zS3iFeIT0ODlbrifm/fegWwgHjA=",
+        "owner": "numtide",
+        "repo": "devshell",
+        "rev": "f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "devshell",
+        "type": "github"
+      }
+    },
+    "diaspora": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1551139311,
+        "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
+        "owner": "diaspora",
+        "repo": "diaspora",
+        "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
+        "type": "github"
+      },
+      "original": {
+        "owner": "diaspora",
+        "ref": "v0.7.10.0",
+        "repo": "diaspora",
+        "type": "github"
+      }
+    },
+    "diaspora_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1551139311,
+        "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
+        "owner": "diaspora",
+        "repo": "diaspora",
+        "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
+        "type": "github"
+      },
+      "original": {
+        "owner": "diaspora",
+        "ref": "v0.7.10.0",
+        "repo": "diaspora",
+        "type": "github"
+      }
+    },
+    "disko": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_5"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_2": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_14"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_3": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_21"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_4": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_52"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_5": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_60"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_6": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_68"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_7": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_82"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "dns-nix": {
+      "inputs": {
+        "flake-utils": "flake-utils_9",
+        "nixpkgs": [
+          "flakes",
+          "n-eldiron",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1635273082,
+        "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=",
+        "owner": "kirelagin",
+        "repo": "dns.nix",
+        "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "kirelagin",
+        "repo": "dns.nix",
+        "type": "github"
+      }
+    },
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_16": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_17": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_18": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_19": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_20": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_21": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_22": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_23": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_24": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_25": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_26": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_27": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_28": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_29": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_30": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_31": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_32": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_33": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "etherpad-lite": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1587951095,
+        "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
+        "owner": "ether",
+        "repo": "etherpad-lite",
+        "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ether",
+        "ref": "1.8.3",
+        "repo": "etherpad-lite",
+        "type": "github"
+      }
+    },
+    "etherpad-lite_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1587951095,
+        "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
+        "owner": "ether",
+        "repo": "etherpad-lite",
+        "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ether",
+        "ref": "1.8.3",
+        "repo": "etherpad-lite",
+        "type": "github"
+      }
+    },
+    "files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "flake-compat": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_7": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_10": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_13"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_11": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_14"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_12": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_16"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_13": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_17"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_14": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_19"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_15": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_20"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_16": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_21"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_17": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_22"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_18": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_23"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_19": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_24"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_2": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_3"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_20": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_25"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_21": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_26"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_22": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_28"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_23": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_29"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_3": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_4"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_4": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_6"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_5": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_7"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_6": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_8"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_7": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_10"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_8": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_11"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_9": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_12"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_10": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_11": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_12": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_13": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_14": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_15": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_16": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_17": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_18": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_19": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_2": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_20": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_21": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_22": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_23": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_24": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_25": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_26": {
+      "locked": {
+        "lastModified": 1649676176,
+        "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_27": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_28": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_29": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_3": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_30": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_31": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_32": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_33": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_34": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_35": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_36": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_37": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_38": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_39": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_4": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_40": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_41": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_42": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_43": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_44": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_45": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_46": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_47": {
+      "locked": {
+        "lastModified": 1649676176,
+        "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_48": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_49": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_5": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_50": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_51": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_52": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_53": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_54": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_55": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_56": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_57": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_58": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_59": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_6": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_60": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_61": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_62": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_63": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_7": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_8": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_9": {
+      "locked": {
+        "lastModified": 1614513358,
+        "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flakes": {
+      "inputs": {
+        "n-backup-2": "n-backup-2",
+        "n-dilion": "n-dilion",
+        "n-eldiron": "n-eldiron",
+        "n-monitoring-1": "n-monitoring-1",
+        "n-quatresaisons": "n-quatresaisons",
+        "n-zoldene": "n-zoldene",
+        "s-backports": "s-backports",
+        "s-copanier": "s-copanier",
+        "s-diaspora": "s-diaspora",
+        "s-etherpad-lite": "s-etherpad-lite",
+        "s-fiche": "s-fiche",
+        "s-files-watcher": "s-files-watcher",
+        "s-grocy": "s-grocy",
+        "s-lib": "s-lib",
+        "s-loginctl-linger": "s-loginctl-linger",
+        "s-mastodon": "s-mastodon",
+        "s-mediagoblin": "s-mediagoblin",
+        "s-multi-apache-container": "s-multi-apache-container",
+        "s-mypackages": "s-mypackages",
+        "s-myuids": "s-myuids",
+        "s-naemon": "s-naemon",
+        "s-openarc": "s-openarc",
+        "s-opendmarc": "s-opendmarc",
+        "s-paste": "s-paste",
+        "s-peertube": "s-peertube",
+        "s-private-buildbot": "s-private-buildbot",
+        "s-private-chatons": "s-private-chatons",
+        "s-private-environment": "s-private-environment",
+        "s-private-mail-relay": "s-private-mail-relay",
+        "s-private-milters": "s-private-milters",
+        "s-private-monitoring": "s-private-monitoring",
+        "s-private-openarc": "s-private-openarc",
+        "s-private-opendmarc": "s-private-opendmarc",
+        "s-private-openldap": "s-private-openldap",
+        "s-private-paste": "s-private-paste",
+        "s-private-peertube": "s-private-peertube",
+        "s-private-php": "s-private-php",
+        "s-private-ssh": "s-private-ssh",
+        "s-private-system": "s-private-system",
+        "s-rsync_backup": "s-rsync_backup",
+        "s-secrets": "s-secrets",
+        "s-surfer": "s-surfer",
+        "s-taskwarrior-web": "s-taskwarrior-web",
+        "secrets": "secrets_26"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-LBw8FCxHXW6b1WFvsEnmLmNpZjow6+N4Q+3zAfcudIU=",
+        "path": "./flakes",
+        "type": "path"
+      },
+      "original": {
+        "path": "./flakes",
+        "type": "path"
+      }
+    },
+    "grocy": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585166193,
+        "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      }
+    },
+    "grocy_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585166193,
+        "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      }
+    },
+    "impermanence": {
+      "locked": {
+        "lastModified": 1684264534,
+        "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=",
+        "owner": "nix-community",
+        "repo": "impermanence",
+        "rev": "89253fb1518063556edd5e54509c30ac3089d5e6",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "ref": "master",
+        "repo": "impermanence",
+        "type": "github"
+      }
+    },
+    "landing-page": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1691524124,
+        "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=",
+        "ref": "main",
+        "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf",
+        "revCount": 573,
+        "type": "git",
+        "url": "https://github.com/bastienwirtz/homer.git"
+      },
+      "original": {
+        "ref": "main",
+        "type": "git",
+        "url": "https://github.com/bastienwirtz/homer.git"
+      }
+    },
+    "loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "loginctl-linger_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "loginctl-linger_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "mail-relay": {
+      "inputs": {
+        "environment": "environment_3",
+        "secrets": "secrets"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      }
+    },
+    "mail-relay_2": {
+      "inputs": {
+        "environment": "environment_20",
+        "secrets": "secrets_15"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      }
+    },
+    "mastodon": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1582790581,
+        "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
+        "owner": "tootsuite",
+        "repo": "mastodon",
+        "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tootsuite",
+        "ref": "v2.9.4",
+        "repo": "mastodon",
+        "type": "github"
+      }
+    },
+    "mastodon_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1582790581,
+        "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
+        "owner": "tootsuite",
+        "repo": "mastodon",
+        "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tootsuite",
+        "ref": "v2.9.4",
+        "repo": "mastodon",
+        "type": "github"
+      }
+    },
+    "mediagoblin": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1531090939,
+        "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "revCount": 4805,
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      },
+      "original": {
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      }
+    },
+    "mediagoblin_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1531090939,
+        "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "revCount": 4805,
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      },
+      "original": {
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      }
+    },
+    "milters": {
+      "inputs": {
+        "environment": "environment_4",
+        "files-watcher": "files-watcher",
+        "openarc": "openarc",
+        "opendmarc": "opendmarc",
+        "secrets": "secrets_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      }
+    },
+    "monitoring": {
+      "inputs": {
+        "environment": "environment_5",
+        "naemon": "naemon",
+        "nixpkgs-lib": "nixpkgs-lib_2",
+        "secrets": "secrets_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "monitoring_2": {
+      "inputs": {
+        "environment": "environment_9",
+        "naemon": "naemon_2",
+        "nixpkgs-lib": "nixpkgs-lib_5",
+        "secrets": "secrets_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "monitoring_3": {
+      "inputs": {
+        "environment": "environment_21",
+        "naemon": "naemon_4",
+        "nixpkgs-lib": "nixpkgs-lib_15",
+        "secrets": "secrets_16"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "monitoring_4": {
+      "inputs": {
+        "environment": "environment_24",
+        "naemon": "naemon_5",
+        "nixpkgs-lib": "nixpkgs-lib_18",
+        "secrets": "secrets_18"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "multi-apache-container": {
+      "inputs": {
+        "files-watcher": "files-watcher_11",
+        "myuids": "myuids_25"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      }
+    },
+    "my-lib": {
+      "inputs": {
+        "colmena": "colmena",
+        "disko": "disko",
+        "flake-parts": "flake-parts_2",
+        "nixos-anywhere": "nixos-anywhere",
+        "nixpkgs": "nixpkgs_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_2": {
+      "inputs": {
+        "colmena": "colmena_2",
+        "disko": "disko_2",
+        "flake-parts": "flake-parts_4",
+        "nixos-anywhere": "nixos-anywhere_2",
+        "nixpkgs": "nixpkgs_16"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_3": {
+      "inputs": {
+        "colmena": "colmena_3",
+        "disko": "disko_3",
+        "flake-parts": "flake-parts_6",
+        "nixos-anywhere": "nixos-anywhere_3",
+        "nixpkgs": "nixpkgs_23"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_4": {
+      "inputs": {
+        "colmena": "colmena_4",
+        "disko": "disko_4",
+        "flake-parts": "flake-parts_12",
+        "nixos-anywhere": "nixos-anywhere_4",
+        "nixpkgs": "nixpkgs_54"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_5": {
+      "inputs": {
+        "colmena": "colmena_5",
+        "disko": "disko_5",
+        "flake-parts": "flake-parts_14",
+        "nixos-anywhere": "nixos-anywhere_5",
+        "nixpkgs": "nixpkgs_62"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_6": {
+      "inputs": {
+        "colmena": "colmena_6",
+        "disko": "disko_6",
+        "flake-parts": "flake-parts_16",
+        "nixos-anywhere": "nixos-anywhere_6",
+        "nixpkgs": "nixpkgs_70"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_3",
+        "nixpkgs": "nixpkgs_12",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_10": {
+      "inputs": {
+        "flake-parts": "flake-parts_18",
+        "nixpkgs": "nixpkgs_77",
+        "webapps-ttrss": "webapps-ttrss_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_11": {
+      "inputs": {
+        "flake-parts": "flake-parts_19",
+        "nixpkgs": "nixpkgs_79",
+        "webapps-ttrss": "webapps-ttrss_12"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_12": {
+      "inputs": {
+        "flake-parts": "flake-parts_22",
+        "nixpkgs": "nixpkgs_102",
+        "webapps-ttrss": "webapps-ttrss_14"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_13": {
+      "inputs": {
+        "flake-parts": "flake-parts_23",
+        "nixpkgs": "nixpkgs_103",
+        "webapps-ttrss": "webapps-ttrss_15"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_2": {
+      "inputs": {
+        "flake-parts": "flake-parts_5",
+        "nixpkgs": "nixpkgs_19",
+        "webapps-ttrss": "webapps-ttrss_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_3": {
+      "inputs": {
+        "flake-parts": "flake-parts_7",
+        "nixpkgs": "nixpkgs_35",
+        "webapps-ttrss": "webapps-ttrss_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_4": {
+      "inputs": {
+        "flake-parts": "flake-parts_8",
+        "nixpkgs": "nixpkgs_38",
+        "webapps-ttrss": "webapps-ttrss_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_5": {
+      "inputs": {
+        "flake-parts": "flake-parts_9",
+        "nixpkgs": "nixpkgs_40",
+        "webapps-ttrss": "webapps-ttrss_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_6": {
+      "inputs": {
+        "flake-parts": "flake-parts_11",
+        "nixpkgs": "nixpkgs_48",
+        "webapps-ttrss": "webapps-ttrss_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_7": {
+      "inputs": {
+        "flake-parts": "flake-parts_13",
+        "nixpkgs": "nixpkgs_58",
+        "webapps-ttrss": "webapps-ttrss_8"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_8": {
+      "inputs": {
+        "flake-parts": "flake-parts_15",
+        "nixpkgs": "nixpkgs_66",
+        "webapps-ttrss": "webapps-ttrss_9"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_9": {
+      "inputs": {
+        "flake-parts": "flake-parts_17",
+        "nixpkgs": "nixpkgs_73",
+        "webapps-ttrss": "webapps-ttrss_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_16": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_17": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_18": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_19": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_20": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_21": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_22": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_23": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_24": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_25": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_26": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_27": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_28": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_29": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_30": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_31": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_32": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_33": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_34": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_35": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_36": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_37": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_38": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_39": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_40": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_41": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_42": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "n-backup-2": {
+      "inputs": {
+        "chatons": "chatons",
+        "environment": "environment_2",
+        "loginctl-linger": "loginctl-linger",
+        "mail-relay": "mail-relay",
+        "milters": "milters",
+        "monitoring": "monitoring",
+        "my-lib": "my-lib",
+        "myuids": "myuids_3",
+        "nixpkgs": "nixpkgs_8",
+        "openarc": "openarc_3",
+        "opendmarc": "opendmarc_2",
+        "openldap": "openldap",
+        "rsync_backup": "rsync_backup",
+        "secrets": "secrets_6",
+        "system": "system"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=",
+        "path": "../systems/backup-2",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/backup-2",
+        "type": "path"
+      }
+    },
+    "n-dilion": {
+      "inputs": {
+        "environment": "environment_8",
+        "files-watcher": "files-watcher_4",
+        "loginctl-linger": "loginctl-linger_2",
+        "monitoring": "monitoring_2",
+        "my-lib": "my-lib_2",
+        "myuids": "myuids_7",
+        "nixpkgs": "nixpkgs_17",
+        "secrets": "secrets_8",
+        "ssh": "ssh",
+        "system": "system_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=",
+        "path": "../systems/dilion",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/dilion",
+        "type": "path"
+      }
+    },
+    "n-eldiron": {
+      "inputs": {
+        "dns-nix": "dns-nix",
+        "my-lib": "my-lib_3",
+        "nixpkgs": "nixpkgs_24",
+        "private-buildbot": "private-buildbot",
+        "private-chatons": "private-chatons",
+        "private-environment": "private-environment",
+        "private-milters": "private-milters",
+        "private-monitoring": "private-monitoring",
+        "private-openarc": "private-openarc",
+        "private-opendmarc": "private-opendmarc",
+        "private-openldap": "private-openldap",
+        "private-paste": "private-paste",
+        "private-peertube": "private-peertube",
+        "private-php": "private-php",
+        "private-ssh": "private-ssh",
+        "private-system": "private-system",
+        "public-copanier": "public-copanier",
+        "public-diaspora": "public-diaspora",
+        "public-etherpad-lite": "public-etherpad-lite",
+        "public-fiche": "public-fiche",
+        "public-files-watcher": "public-files-watcher",
+        "public-grocy": "public-grocy",
+        "public-loginctl-linger": "public-loginctl-linger",
+        "public-mastodon": "public-mastodon",
+        "public-mediagoblin": "public-mediagoblin",
+        "public-multi-apache-container": "public-multi-apache-container",
+        "public-mypackages": "public-mypackages",
+        "public-myuids": "public-myuids",
+        "public-openarc": "public-openarc",
+        "public-opendmarc": "public-opendmarc",
+        "public-peertube": "public-peertube",
+        "public-secrets": "public-secrets",
+        "public-surfer": "public-surfer",
+        "public-taskwarrior-web": "public-taskwarrior-web"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=",
+        "path": "../systems/eldiron",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/eldiron",
+        "type": "path"
+      }
+    },
+    "n-monitoring-1": {
+      "inputs": {
+        "chatons": "chatons_2",
+        "environment": "environment_19",
+        "files-watcher": "files-watcher_9",
+        "loginctl-linger": "loginctl-linger_3",
+        "mail-relay": "mail-relay_2",
+        "monitoring": "monitoring_3",
+        "my-lib": "my-lib_4",
+        "myuids": "myuids_23",
+        "nixpkgs": "nixpkgs_55",
+        "php": "php",
+        "secrets": "secrets_17",
+        "system": "system_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=",
+        "path": "../systems/monitoring-1",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/monitoring-1",
+        "type": "path"
+      }
+    },
+    "n-quatresaisons": {
+      "inputs": {
+        "environment": "environment_23",
+        "files-watcher": "files-watcher_10",
+        "landing-page": "landing-page",
+        "monitoring": "monitoring_4",
+        "multi-apache-container": "multi-apache-container",
+        "my-lib": "my-lib_5",
+        "myuids": "myuids_26",
+        "nixpkgs": "nixpkgs_63",
+        "php": "php_2",
+        "secrets": "secrets_19",
+        "system": "system_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=",
+        "path": "../systems/quatresaisons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/quatresaisons",
+        "type": "path"
+      }
+    },
+    "n-zoldene": {
+      "inputs": {
+        "impermanence": "impermanence",
+        "my-lib": "my-lib_6",
+        "nixpkgs": "nixpkgs_71",
+        "private-environment": "private-environment_2",
+        "private-system": "private-system_2",
+        "public-secrets": "public-secrets_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=",
+        "path": "../systems/zoldene",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/zoldene",
+        "type": "path"
+      }
+    },
+    "naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "nixos-2305": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_2": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_3": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_4": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_5": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_6": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_7": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere": {
+      "inputs": {
+        "disko": [
+          "flakes",
+          "n-backup-2",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "flakes",
+          "n-backup-2",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305",
+        "nixos-images": "nixos-images",
+        "nixpkgs": "nixpkgs_6",
+        "treefmt-nix": "treefmt-nix"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_2": {
+      "inputs": {
+        "disko": [
+          "flakes",
+          "n-dilion",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "flakes",
+          "n-dilion",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_2",
+        "nixos-images": "nixos-images_2",
+        "nixpkgs": "nixpkgs_15",
+        "treefmt-nix": "treefmt-nix_2"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_3": {
+      "inputs": {
+        "disko": [
+          "flakes",
+          "n-eldiron",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "flakes",
+          "n-eldiron",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_3",
+        "nixos-images": "nixos-images_3",
+        "nixpkgs": "nixpkgs_22",
+        "treefmt-nix": "treefmt-nix_3"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_4": {
+      "inputs": {
+        "disko": [
+          "flakes",
+          "n-monitoring-1",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "flakes",
+          "n-monitoring-1",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_4",
+        "nixos-images": "nixos-images_4",
+        "nixpkgs": "nixpkgs_53",
+        "treefmt-nix": "treefmt-nix_4"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_5": {
+      "inputs": {
+        "disko": [
+          "flakes",
+          "n-quatresaisons",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "flakes",
+          "n-quatresaisons",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_5",
+        "nixos-images": "nixos-images_5",
+        "nixpkgs": "nixpkgs_61",
+        "treefmt-nix": "treefmt-nix_5"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_6": {
+      "inputs": {
+        "disko": [
+          "flakes",
+          "n-zoldene",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "flakes",
+          "n-zoldene",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_6",
+        "nixos-images": "nixos-images_6",
+        "nixpkgs": "nixpkgs_69",
+        "treefmt-nix": "treefmt-nix_6"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_7": {
+      "inputs": {
+        "disko": [
+          "flakes",
+          "s-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "flakes",
+          "s-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_7",
+        "nixos-images": "nixos-images_7",
+        "nixpkgs": "nixpkgs_83",
+        "treefmt-nix": "treefmt-nix_7"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-images": {
+      "inputs": {
+        "nixos-2305": [
+          "flakes",
+          "n-backup-2",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "flakes",
+          "n-backup-2",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_2": {
+      "inputs": {
+        "nixos-2305": [
+          "flakes",
+          "n-dilion",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "flakes",
+          "n-dilion",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_3": {
+      "inputs": {
+        "nixos-2305": [
+          "flakes",
+          "n-eldiron",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "flakes",
+          "n-eldiron",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_4": {
+      "inputs": {
+        "nixos-2305": [
+          "flakes",
+          "n-monitoring-1",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "flakes",
+          "n-monitoring-1",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_5": {
+      "inputs": {
+        "nixos-2305": [
+          "flakes",
+          "n-quatresaisons",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "flakes",
+          "n-quatresaisons",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_6": {
+      "inputs": {
+        "nixos-2305": [
+          "flakes",
+          "n-zoldene",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "flakes",
+          "n-zoldene",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_7": {
+      "inputs": {
+        "nixos-2305": [
+          "flakes",
+          "s-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "flakes",
+          "s-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1677383253,
+        "narHash": "sha256-UfpzWfSxkfXHnb4boXZNaKsAcUrZT9Hw+tao1oZxd08=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "9952d6bc395f5841262b006fbace8dd7e143b634",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_10": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_11": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_12": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_13": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_14": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_15": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_16": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_17": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_18": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_19": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_2": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_20": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_21": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_22": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_23": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_24": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_25": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_26": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_27": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_28": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_29": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_3": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_4": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_5": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_6": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_7": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_8": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_9": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_10": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_100": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_101": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_102": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_103": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_104": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_105": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_106": {
+      "locked": {
+        "lastModified": 1692447944,
+        "narHash": "sha256-fkJGNjEmTPvqBs215EQU4r9ivecV5Qge5cF/QDLVn3U=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "d680ded26da5cf104dd2735a51e88d2d8f487b4d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_11": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_12": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_13": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_14": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_15": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_16": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_17": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_18": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_19": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_20": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_21": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_22": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_23": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_24": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_25": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_26": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_27": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_28": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_29": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_3": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_30": {
+      "locked": {
+        "lastModified": 1631570365,
+        "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_31": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_32": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_33": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_34": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_35": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_36": {
+      "locked": {
+        "lastModified": 1633901457,
+        "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_37": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_38": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_39": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_4": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_40": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_41": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_42": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_43": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_44": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_45": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_46": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_47": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_48": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_49": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_5": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_50": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_51": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_52": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_53": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_54": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_55": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_56": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_57": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_58": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_59": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_6": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_60": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_61": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_62": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_63": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_64": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_65": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_66": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_67": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_68": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_69": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_7": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_70": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_71": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_72": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_73": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_74": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_75": {
+      "locked": {
+        "lastModified": 1633901457,
+        "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_76": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_77": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_78": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_79": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_8": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_80": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_81": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_82": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_83": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_84": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_85": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_86": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_87": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_88": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_89": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_9": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_90": {
+      "locked": {
+        "lastModified": 1631570365,
+        "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_91": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_92": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_93": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_94": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_95": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_96": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_97": {
+      "locked": {
+        "lastModified": 1631570365,
+        "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_98": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_99": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs_2",
+        "openarc": "openarc_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_10": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_11": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_12": {
+      "inputs": {
+        "flake-utils": "flake-utils_53",
+        "myuids": "myuids_36",
+        "nixpkgs": "nixpkgs_93",
+        "openarc": "openarc_13"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_13": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_14": {
+      "inputs": {
+        "flake-utils": "flake-utils_55",
+        "myuids": "myuids_38",
+        "nixpkgs": "nixpkgs_95",
+        "openarc": "openarc_15"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_15": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_3": {
+      "inputs": {
+        "files-watcher": "files-watcher_2",
+        "openarc": "openarc_4",
+        "secrets": "secrets_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      }
+    },
+    "openarc_4": {
+      "inputs": {
+        "flake-utils": "flake-utils_4",
+        "myuids": "myuids_4",
+        "nixpkgs": "nixpkgs_9",
+        "openarc": "openarc_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_6": {
+      "inputs": {
+        "flake-utils": "flake-utils_12",
+        "myuids": "myuids_9",
+        "nixpkgs": "nixpkgs_26",
+        "openarc": "openarc_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_7": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_8": {
+      "inputs": {
+        "flake-utils": "flake-utils_14",
+        "myuids": "myuids_11",
+        "nixpkgs": "nixpkgs_28",
+        "openarc": "openarc_9"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_9": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_2",
+        "myuids": "myuids_2",
+        "nixpkgs": "nixpkgs_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_2": {
+      "inputs": {
+        "environment": "environment_6",
+        "files-watcher": "files-watcher_3",
+        "opendmarc": "opendmarc_3",
+        "secrets": "secrets_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_3": {
+      "inputs": {
+        "flake-utils": "flake-utils_5",
+        "myuids": "myuids_5",
+        "nixpkgs": "nixpkgs_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_4": {
+      "inputs": {
+        "flake-utils": "flake-utils_13",
+        "myuids": "myuids_10",
+        "nixpkgs": "nixpkgs_27"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_5": {
+      "inputs": {
+        "flake-utils": "flake-utils_15",
+        "myuids": "myuids_12",
+        "nixpkgs": "nixpkgs_29"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_6": {
+      "inputs": {
+        "flake-utils": "flake-utils_54",
+        "myuids": "myuids_37",
+        "nixpkgs": "nixpkgs_94"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_7": {
+      "inputs": {
+        "flake-utils": "flake-utils_56",
+        "myuids": "myuids_39",
+        "nixpkgs": "nixpkgs_96"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "openldap": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      }
+    },
+    "paste": {
+      "inputs": {
+        "flake-utils": "flake-utils_16",
+        "nixpkgs": "nixpkgs_30"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
+        "path": "../../paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../paste",
+        "type": "path"
+      }
+    },
+    "paste_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_57",
+        "nixpkgs": "nixpkgs_97"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
+        "path": "../../paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../paste",
+        "type": "path"
+      }
+    },
+    "peertube": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1611184594,
+        "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
+        "ref": "gitolite_local/open_instance",
+        "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
+        "revCount": 6316,
+        "type": "git",
+        "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1611184594,
+        "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
+        "ref": "gitolite_local/open_instance",
+        "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
+        "revCount": 6316,
+        "type": "git",
+        "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_open_instance": {
+      "inputs": {
+        "flake-utils": "flake-utils_17",
+        "myuids": "myuids_13",
+        "nixpkgs": "nixpkgs_31",
+        "peertube": "peertube"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "peertube_open_instance_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_58",
+        "myuids": "myuids_40",
+        "nixpkgs": "nixpkgs_98",
+        "peertube": "peertube_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "peertube_origin": {
+      "inputs": {
+        "flake-utils": "flake-utils_18",
+        "myuids": "myuids_14",
+        "nixpkgs": "nixpkgs_32",
+        "peertube": "peertube_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "peertube_origin_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_59",
+        "myuids": "myuids_41",
+        "nixpkgs": "nixpkgs_99",
+        "peertube": "peertube_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "php": {
+      "inputs": {
+        "flake-utils": "flake-utils_33",
+        "nixpkgs": "nixpkgs_56",
+        "nixpkgs-4": "nixpkgs-4_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "php_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_36",
+        "nixpkgs": "nixpkgs_64",
+        "nixpkgs-4": "nixpkgs-4_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "private-buildbot": {
+      "inputs": {
+        "buildslist": "buildslist",
+        "flake-utils": "flake-utils_11",
+        "nixpkgs": "nixpkgs_25"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
+        "path": "../../flakes/private/buildbot",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/buildbot",
+        "type": "path"
+      }
+    },
+    "private-chatons": {
+      "inputs": {
+        "environment": "environment_12"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "private-environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "private-environment_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "private-milters": {
+      "inputs": {
+        "environment": "environment_13",
+        "files-watcher": "files-watcher_5",
+        "openarc": "openarc_6",
+        "opendmarc": "opendmarc_4",
+        "secrets": "secrets_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      }
+    },
+    "private-monitoring": {
+      "inputs": {
+        "environment": "environment_14",
+        "naemon": "naemon_3",
+        "nixpkgs-lib": "nixpkgs-lib_9",
+        "secrets": "secrets_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "private-openarc": {
+      "inputs": {
+        "files-watcher": "files-watcher_6",
+        "openarc": "openarc_8",
+        "secrets": "secrets_12"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      }
+    },
+    "private-opendmarc": {
+      "inputs": {
+        "environment": "environment_15",
+        "files-watcher": "files-watcher_7",
+        "opendmarc": "opendmarc_5",
+        "secrets": "secrets_13"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      }
+    },
+    "private-openldap": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      }
+    },
+    "private-paste": {
+      "inputs": {
+        "paste": "paste"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
+        "path": "../../flakes/private/paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/paste",
+        "type": "path"
+      }
+    },
+    "private-peertube": {
+      "inputs": {
+        "peertube_open_instance": "peertube_open_instance",
+        "peertube_origin": "peertube_origin"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
+        "path": "../../flakes/private/peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/peertube",
+        "type": "path"
+      }
+    },
+    "private-php": {
+      "inputs": {
+        "flake-utils": "flake-utils_19",
+        "nixpkgs": "nixpkgs_33",
+        "nixpkgs-4": "nixpkgs-4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "private-ssh": {
+      "inputs": {
+        "environment": "environment_16",
+        "secrets": "secrets_14"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      }
+    },
+    "private-system": {
+      "inputs": {
+        "backports": "backports_3",
+        "environment": "environment_17",
+        "mypackages": "mypackages_3",
+        "myuids": "myuids_15",
+        "secrets-public": "secrets-public_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "private-system_2": {
+      "inputs": {
+        "backports": "backports_6",
+        "environment": "environment_26",
+        "mypackages": "mypackages_9",
+        "myuids": "myuids_28",
+        "secrets-public": "secrets-public_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "public-copanier": {
+      "inputs": {
+        "copanier": "copanier",
+        "flake-utils": "flake-utils_21",
+        "nixpkgs": "nixpkgs_36"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
+        "path": "../../flakes/copanier",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/copanier",
+        "type": "path"
+      }
+    },
+    "public-diaspora": {
+      "inputs": {
+        "diaspora": "diaspora",
+        "flake-utils": "flake-utils_22",
+        "myuids": "myuids_16",
+        "nixpkgs": "nixpkgs_37"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
+        "path": "../../flakes/diaspora",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/diaspora",
+        "type": "path"
+      }
+    },
+    "public-etherpad-lite": {
+      "inputs": {
+        "etherpad-lite": "etherpad-lite",
+        "flake-utils": "flake-utils_23",
+        "mypackages": "mypackages_4",
+        "nixpkgs": "nixpkgs_39"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
+        "path": "../../flakes/etherpad-lite",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/etherpad-lite",
+        "type": "path"
+      }
+    },
+    "public-fiche": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
+        "path": "../../flakes/fiche",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/fiche",
+        "type": "path"
+      }
+    },
+    "public-files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "public-grocy": {
+      "inputs": {
+        "flake-utils": "flake-utils_24",
+        "grocy": "grocy",
+        "mypackages": "mypackages_5",
+        "nixpkgs": "nixpkgs_41"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
+        "path": "../../flakes/grocy",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/grocy",
+        "type": "path"
+      }
+    },
+    "public-loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "public-mastodon": {
+      "inputs": {
+        "flake-utils": "flake-utils_25",
+        "mastodon": "mastodon",
+        "myuids": "myuids_17",
+        "nixpkgs": "nixpkgs_42"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
+        "path": "../../flakes/mastodon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mastodon",
+        "type": "path"
+      }
+    },
+    "public-mediagoblin": {
+      "inputs": {
+        "flake-utils": "flake-utils_26",
+        "mediagoblin": "mediagoblin",
+        "myuids": "myuids_18",
+        "nixpkgs": "nixpkgs_43"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
+        "path": "../../flakes/mediagoblin",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mediagoblin",
+        "type": "path"
+      }
+    },
+    "public-multi-apache-container": {
+      "inputs": {
+        "files-watcher": "files-watcher_8",
+        "myuids": "myuids_19"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      }
+    },
+    "public-mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_10",
+        "nixpkgs": "nixpkgs_44",
+        "webapps-ttrss": "webapps-ttrss_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../flakes/mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mypackages",
+        "type": "path"
+      }
+    },
+    "public-myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "public-openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_27",
+        "myuids": "myuids_20",
+        "nixpkgs": "nixpkgs_45",
+        "openarc": "openarc_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../flakes/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/openarc",
+        "type": "path"
+      }
+    },
+    "public-opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_28",
+        "myuids": "myuids_21",
+        "nixpkgs": "nixpkgs_46"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../flakes/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/opendmarc",
+        "type": "path"
+      }
+    },
+    "public-peertube": {
+      "inputs": {
+        "flake-utils": "flake-utils_29",
+        "myuids": "myuids_22",
+        "nixpkgs": "nixpkgs_47",
+        "peertube": "peertube_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "../../flakes/peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/peertube",
+        "type": "path"
+      }
+    },
+    "public-secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "public-secrets_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "public-surfer": {
+      "inputs": {
+        "flake-utils": "flake-utils_30",
+        "mypackages": "mypackages_6",
+        "nixpkgs": "nixpkgs_49",
+        "surfer": "surfer"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
+        "path": "../../flakes/surfer",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/surfer",
+        "type": "path"
+      }
+    },
+    "public-taskwarrior-web": {
+      "inputs": {
+        "flake-utils": "flake-utils_31",
+        "nixpkgs": "nixpkgs_50",
+        "taskwarrior-web": "taskwarrior-web"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
+        "path": "../../flakes/taskwarrior-web",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/taskwarrior-web",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "devshell": "devshell",
+        "flake-parts": "flake-parts",
+        "flakes": "flakes",
+        "nixpkgs": "nixpkgs_106"
+      }
+    },
+    "rsync_backup": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
+        "path": "../../flakes/rsync_backup",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/rsync_backup",
+        "type": "path"
+      }
+    },
+    "s-backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_40",
+        "nixpkgs": "nixpkgs_74"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "./backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "./backports",
+        "type": "path"
+      }
+    },
+    "s-copanier": {
+      "inputs": {
+        "copanier": "copanier_2",
+        "flake-utils": "flake-utils_41",
+        "nixpkgs": "nixpkgs_75"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
+        "path": "./copanier",
+        "type": "path"
+      },
+      "original": {
+        "path": "./copanier",
+        "type": "path"
+      }
+    },
+    "s-diaspora": {
+      "inputs": {
+        "diaspora": "diaspora_2",
+        "flake-utils": "flake-utils_42",
+        "myuids": "myuids_29",
+        "nixpkgs": "nixpkgs_76"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
+        "path": "./diaspora",
+        "type": "path"
+      },
+      "original": {
+        "path": "./diaspora",
+        "type": "path"
+      }
+    },
+    "s-etherpad-lite": {
+      "inputs": {
+        "etherpad-lite": "etherpad-lite_2",
+        "flake-utils": "flake-utils_43",
+        "mypackages": "mypackages_10",
+        "nixpkgs": "nixpkgs_78"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
+        "path": "./etherpad-lite",
+        "type": "path"
+      },
+      "original": {
+        "path": "./etherpad-lite",
+        "type": "path"
+      }
+    },
+    "s-fiche": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
+        "path": "./fiche",
+        "type": "path"
+      },
+      "original": {
+        "path": "./fiche",
+        "type": "path"
+      }
+    },
+    "s-files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "./files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "./files-watcher",
+        "type": "path"
+      }
+    },
+    "s-grocy": {
+      "inputs": {
+        "flake-utils": "flake-utils_44",
+        "grocy": "grocy_2",
+        "mypackages": "mypackages_11",
+        "nixpkgs": "nixpkgs_80"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
+        "path": "./grocy",
+        "type": "path"
+      },
+      "original": {
+        "path": "./grocy",
+        "type": "path"
+      }
+    },
+    "s-lib": {
+      "inputs": {
+        "colmena": "colmena_7",
+        "disko": "disko_7",
+        "flake-parts": "flake-parts_20",
+        "nixos-anywhere": "nixos-anywhere_7",
+        "nixpkgs": "nixpkgs_84"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "./lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "./lib",
+        "type": "path"
+      }
+    },
+    "s-loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "./loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "./loginctl-linger",
+        "type": "path"
+      }
+    },
+    "s-mastodon": {
+      "inputs": {
+        "flake-utils": "flake-utils_46",
+        "mastodon": "mastodon_2",
+        "myuids": "myuids_30",
+        "nixpkgs": "nixpkgs_85"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
+        "path": "./mastodon",
+        "type": "path"
+      },
+      "original": {
+        "path": "./mastodon",
+        "type": "path"
+      }
+    },
+    "s-mediagoblin": {
+      "inputs": {
+        "flake-utils": "flake-utils_47",
+        "mediagoblin": "mediagoblin_2",
+        "myuids": "myuids_31",
+        "nixpkgs": "nixpkgs_86"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
+        "path": "./mediagoblin",
+        "type": "path"
+      },
+      "original": {
+        "path": "./mediagoblin",
+        "type": "path"
+      }
+    },
+    "s-multi-apache-container": {
+      "inputs": {
+        "files-watcher": "files-watcher_12",
+        "myuids": "myuids_32"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
+        "path": "./multi-apache-container",
+        "type": "path"
+      },
+      "original": {
+        "path": "./multi-apache-container",
+        "type": "path"
+      }
+    },
+    "s-mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_21",
+        "nixpkgs": "nixpkgs_87",
+        "webapps-ttrss": "webapps-ttrss_13"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "./mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "./mypackages",
+        "type": "path"
+      }
+    },
+    "s-myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "./myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "./myuids",
+        "type": "path"
+      }
+    },
+    "s-naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "./naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "./naemon",
+        "type": "path"
+      }
+    },
+    "s-openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_48",
+        "myuids": "myuids_33",
+        "nixpkgs": "nixpkgs_88",
+        "openarc": "openarc_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "./openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./openarc",
+        "type": "path"
+      }
+    },
+    "s-opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_49",
+        "myuids": "myuids_34",
+        "nixpkgs": "nixpkgs_89"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "./opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./opendmarc",
+        "type": "path"
+      }
+    },
+    "s-paste": {
+      "inputs": {
+        "flake-utils": "flake-utils_50",
+        "nixpkgs": "nixpkgs_90"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
+        "path": "./paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "./paste",
+        "type": "path"
+      }
+    },
+    "s-peertube": {
+      "inputs": {
+        "flake-utils": "flake-utils_51",
+        "myuids": "myuids_35",
+        "nixpkgs": "nixpkgs_91",
+        "peertube": "peertube_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./peertube",
+        "type": "path"
+      }
+    },
+    "s-private-buildbot": {
+      "inputs": {
+        "buildslist": "buildslist_2",
+        "flake-utils": "flake-utils_52",
+        "nixpkgs": "nixpkgs_92"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
+        "path": "./private/buildbot",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/buildbot",
+        "type": "path"
+      }
+    },
+    "s-private-chatons": {
+      "inputs": {
+        "environment": "environment_27"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "./private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/chatons",
+        "type": "path"
+      }
+    },
+    "s-private-environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "./private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/environment",
+        "type": "path"
+      }
+    },
+    "s-private-mail-relay": {
+      "inputs": {
+        "environment": "environment_28",
+        "secrets": "secrets_20"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
+        "path": "./private/mail-relay",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/mail-relay",
+        "type": "path"
+      }
+    },
+    "s-private-milters": {
+      "inputs": {
+        "environment": "environment_29",
+        "files-watcher": "files-watcher_13",
+        "openarc": "openarc_12",
+        "opendmarc": "opendmarc_6",
+        "secrets": "secrets_21"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
+        "path": "./private/milters",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/milters",
+        "type": "path"
+      }
+    },
+    "s-private-monitoring": {
+      "inputs": {
+        "environment": "environment_30",
+        "naemon": "naemon_6",
+        "nixpkgs-lib": "nixpkgs-lib_27",
+        "secrets": "secrets_22"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "./private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/monitoring",
+        "type": "path"
+      }
+    },
+    "s-private-openarc": {
+      "inputs": {
+        "files-watcher": "files-watcher_14",
+        "openarc": "openarc_14",
+        "secrets": "secrets_23"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
+        "path": "./private/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/openarc",
+        "type": "path"
+      }
+    },
+    "s-private-opendmarc": {
+      "inputs": {
+        "environment": "environment_31",
+        "files-watcher": "files-watcher_15",
+        "opendmarc": "opendmarc_7",
+        "secrets": "secrets_24"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
+        "path": "./private/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/opendmarc",
+        "type": "path"
+      }
+    },
+    "s-private-openldap": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
+        "path": "./private/openldap",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/openldap",
+        "type": "path"
+      }
+    },
+    "s-private-paste": {
+      "inputs": {
+        "paste": "paste_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
+        "path": "./private/paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/paste",
+        "type": "path"
+      }
+    },
+    "s-private-peertube": {
+      "inputs": {
+        "peertube_open_instance": "peertube_open_instance_2",
+        "peertube_origin": "peertube_origin_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
+        "path": "./private/peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/peertube",
+        "type": "path"
+      }
+    },
+    "s-private-php": {
+      "inputs": {
+        "flake-utils": "flake-utils_60",
+        "nixpkgs": "nixpkgs_100",
+        "nixpkgs-4": "nixpkgs-4_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "./private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/php",
+        "type": "path"
+      }
+    },
+    "s-private-ssh": {
+      "inputs": {
+        "environment": "environment_32",
+        "secrets": "secrets_25"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
+        "path": "./private/ssh",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/ssh",
+        "type": "path"
+      }
+    },
+    "s-private-system": {
+      "inputs": {
+        "backports": "backports_7",
+        "environment": "environment_33",
+        "mypackages": "mypackages_12",
+        "myuids": "myuids_42",
+        "secrets-public": "secrets-public_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "./private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/system",
+        "type": "path"
+      }
+    },
+    "s-rsync_backup": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
+        "path": "./rsync_backup",
+        "type": "path"
+      },
+      "original": {
+        "path": "./rsync_backup",
+        "type": "path"
+      }
+    },
+    "s-secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "./secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "./secrets",
+        "type": "path"
+      }
+    },
+    "s-surfer": {
+      "inputs": {
+        "flake-utils": "flake-utils_62",
+        "mypackages": "mypackages_13",
+        "nixpkgs": "nixpkgs_104",
+        "surfer": "surfer_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
+        "path": "./surfer",
+        "type": "path"
+      },
+      "original": {
+        "path": "./surfer",
+        "type": "path"
+      }
+    },
+    "s-taskwarrior-web": {
+      "inputs": {
+        "flake-utils": "flake-utils_63",
+        "nixpkgs": "nixpkgs_105",
+        "taskwarrior-web": "taskwarrior-web_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
+        "path": "./taskwarrior-web",
+        "type": "path"
+      },
+      "original": {
+        "path": "./taskwarrior-web",
+        "type": "path"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_16": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_17": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_18": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_19": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_20": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_21": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_22": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_23": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_24": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_25": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_26": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-yvhc2jxW1AQVmtrKPoYPr5DgpXKt/ua+ATuxvE3iY6c=",
+        "path": "./private/environment-dummy",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/environment-dummy",
+        "type": "path"
+      }
+    },
+    "secrets_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "ssh": {
+      "inputs": {
+        "environment": "environment_10",
+        "secrets": "secrets_9"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      }
+    },
+    "stable": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_2": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_3": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_4": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_5": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_6": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_7": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "surfer": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1588637864,
+        "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "revCount": 318,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      },
+      "original": {
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      }
+    },
+    "surfer_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1588637864,
+        "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "revCount": 318,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      },
+      "original": {
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      }
+    },
+    "system": {
+      "inputs": {
+        "backports": "backports",
+        "environment": "environment_7",
+        "mypackages": "mypackages",
+        "myuids": "myuids_6",
+        "secrets-public": "secrets-public"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "system_2": {
+      "inputs": {
+        "backports": "backports_2",
+        "environment": "environment_11",
+        "mypackages": "mypackages_2",
+        "myuids": "myuids_8",
+        "secrets-public": "secrets-public_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "system_3": {
+      "inputs": {
+        "backports": "backports_4",
+        "environment": "environment_22",
+        "mypackages": "mypackages_7",
+        "myuids": "myuids_24",
+        "secrets-public": "secrets-public_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "system_4": {
+      "inputs": {
+        "backports": "backports_5",
+        "environment": "environment_25",
+        "mypackages": "mypackages_8",
+        "myuids": "myuids_27",
+        "secrets-public": "secrets-public_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "systems": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
+    },
+    "taskwarrior-web": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546434241,
+        "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      }
+    },
+    "taskwarrior-web_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546434241,
+        "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "flakes",
+          "n-backup-2",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_2": {
+      "inputs": {
+        "nixpkgs": [
+          "flakes",
+          "n-dilion",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_3": {
+      "inputs": {
+        "nixpkgs": [
+          "flakes",
+          "n-eldiron",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_4": {
+      "inputs": {
+        "nixpkgs": [
+          "flakes",
+          "n-monitoring-1",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_5": {
+      "inputs": {
+        "nixpkgs": [
+          "flakes",
+          "n-quatresaisons",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_6": {
+      "inputs": {
+        "nixpkgs": [
+          "flakes",
+          "n-zoldene",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_7": {
+      "inputs": {
+        "nixpkgs": [
+          "flakes",
+          "s-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_10": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_11": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_12": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_13": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_14": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_15": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_7": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_8": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_9": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644 (file)
index 0000000..e3ed4c9
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,47 @@
+{
+  description = "immae-eu infrastructure";
+  inputs = {
+    flake-parts.url = "github:hercules-ci/flake-parts";
+    devshell.url = "github:numtide/devshell";
+    # nixpkgs for local tools
+    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+
+    flakes.url = "path:./flakes";
+  };
+  outputs = inputs@{ self, flake-parts, flakes, ... }:
+    let
+      inherit (flakes.subflakes) public private;
+      inherit (public) mypackages;
+    in
+      flake-parts.lib.mkFlake { inherit inputs; } ({ withSystem, ... }: {
+        imports = [
+          inputs.devshell.flakeModule
+          (mypackages.mylibs.flakePartsAddPerSystem { name = "lib"; type = "unspecified"; })
+        ];
+        systems = [ "x86_64-linux" ];
+        perSystem = { config, inputs', pkgs, system, ... }:
+          {
+            packages = mypackages.packages."${system}";
+            lib = mypackages.lib."${system}";
+            devshells.default = {
+              packages = [
+                pkgs.colmena
+                pkgs.nixUnstable pkgs.python3 pkgs.sops
+                pkgs.curl pkgs.shellcheck pkgs.jq
+                pkgs.gnumake pkgs.yq
+              ];
+              env = [
+                { name = "NIX_BUILD_TOP"; value = ""; }
+                { name = "PATH"; prefix = "scripts"; }
+                { name = "NIX_PATH"; value = "nixpkgs=${pkgs.path}"; }
+              ];
+            };
+          };
+        flake = {
+          # FIXME: next line Can be removed in nix 2.16.*
+          devShell.x86_64-linux = self.devShells.x86_64-linux.default;
+          inherit (mypackages) mylibs sources overlays;
+          inherit (flakes) subflakes;
+        };
+      });
+}
index 5f9289efd7cd57444f52d27ee30445d2d6922503..8981e537c99ada8137d4a7e4516304eea25e489f 100644 (file)
@@ -2,11 +2,11 @@
   "nodes": {
     "flake-utils": {
       "locked": {
   "nodes": {
     "flake-utils": {
       "locked": {
-        "lastModified": 1629481132,
-        "narHash": "sha256-JHgasjPR0/J1J3DRm4KxM4zTyAj4IOJY8vIl75v/kPI=",
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
         "owner": "numtide",
         "repo": "flake-utils",
         "owner": "numtide",
         "repo": "flake-utils",
-        "rev": "997f7efcb746a9c140ce1f13c72263189225f482",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
         "type": "github"
       },
       "original": {
         "type": "github"
       },
       "original": {
     },
     "nixpkgs": {
       "locked": {
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1634032472,
-        "narHash": "sha256-IoSg358w6nPpTYLWhvN3UgnU6r322dDPOLFXHyqyIkM=",
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
         "owner": "NixOS",
         "repo": "nixpkgs",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "3abf4b55b7c991909fde3115827d398dd7c5a299",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
         "type": "github"
       },
       "original": {
         "owner": "NixOS",
         "type": "github"
       },
       "original": {
         "owner": "NixOS",
+        "ref": "nixos-unstable",
         "repo": "nixpkgs",
         "type": "github"
       }
         "repo": "nixpkgs",
         "type": "github"
       }
index 8be885f5cd51259559e946639610f4b17a1130f6..796664a2e6c28dfb27f7cdff5a0d13a89a9a2189 100644 (file)
@@ -1,62 +1,19 @@
 {
   description = "Backported packages";
 
 {
   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
   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 = {
     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 = {
       };
       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 {
       };
     }
   ) // rec {
         in package.override (pkgs.lib.genAttrs packageDeps (n: pkgs."${n}"));
     };
     overlays = {
         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: ({}
     };
     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 = {
     );
 
     nixosModules = {
-      influxdb2 = import (nixpkgs + "/nixos/modules/services/databases/influxdb2.nix");
-      mpd = import (nixpkgs + "/nixos/modules/services/audio/mpd.nix");
-      zrepl = import (nixpkgs + "/nixos/modules/services/backup/zrepl.nix");
+      #coturn = import (nixpkgs + "/nixos/modules/services/networking/coturn.nix");
     };
   };
 }
     };
   };
 }
diff --git a/flakes/copanier/default.nix b/flakes/copanier/default.nix
new file mode 100644 (file)
index 0000000..0486c0a
--- /dev/null
@@ -0,0 +1,30 @@
+{ src, glibcLocales, poetry2nix, fetchFromGitHub, python37, fetchpatch }:
+let
+  poetryApp = poetry2nix.mkPoetryApplication rec {
+    inherit src;
+    patches = [ ./fix_reduce.patch ];
+    overrides = poetry2nix.overrides.withDefaults (self: super: {
+      weasyprint = super.weasyprint.overridePythonAttrs (old: {
+        patches = let
+          p0 = (fetchpatch {
+            url = "https://github.com/Kozea/WeasyPrint/commit/47043a1fd7e50a892b9836466f521df85d597c44.patch";
+            sha256 = "18lmz6whjqxdpv4fdmg5vcpk2acdl99kfmp14badpw1jmffw7zl2";
+            postFetch = ''
+              sed -i -e "s/font_filename/filename/" $out
+            '';
+          });
+          p1 = (builtins.elemAt old.patches 1).overrideAttrs(old: {
+            postInstall = ''
+              sed -i -e "s/so.0/so/" $out
+            '';
+          });
+        in [ p0 p1 ];
+      });
+    });
+    pyproject = ./pyproject.toml;
+    poetrylock = ./poetry.lock;
+    python = python37;
+    locales = "${glibcLocales}/lib/locale/locale-archive";
+  };
+in
+  poetryApp
diff --git a/flakes/copanier/fix_reduce.patch b/flakes/copanier/fix_reduce.patch
new file mode 100644 (file)
index 0000000..5390bcc
--- /dev/null
@@ -0,0 +1,13 @@
+diff --git a/copanier/views/delivery.py b/copanier/views/delivery.py
+index 779d52c..1696919 100644
+--- a/copanier/views/delivery.py
++++ b/copanier/views/delivery.py
+@@ -401,7 +401,7 @@ async def compute_payments(request, response, id):
+             balance.append((group_id, amount))
+     debiters, crediters = order_balance(balance)
+-    results = reduce_balance(debiters[:], crediters[:])
++    results = reduce_balance(debiters[:], crediters[:], [])
+     results_dict = defaultdict(partial(defaultdict, float))
diff --git a/flakes/copanier/flake.lock b/flakes/copanier/flake.lock
new file mode 100644 (file)
index 0000000..fe84a9d
--- /dev/null
@@ -0,0 +1,59 @@
+{
+  "nodes": {
+    "copanier": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1633895178,
+        "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
+        "type": "github"
+      },
+      "original": {
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1633901457,
+        "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "copanier": "copanier",
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/copanier/flake.nix b/flakes/copanier/flake.nix
new file mode 100644 (file)
index 0000000..74e6829
--- /dev/null
@@ -0,0 +1,28 @@
+{
+  description = "Copanier";
+
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs.url = "github:NixOS/nixpkgs";
+  inputs.copanier = {
+    url = "github:spiral-project/copanier";
+    flake = false;
+  };
+
+  outputs = { self, copanier, flake-utils, nixpkgs }: flake-utils.lib.eachDefaultSystem (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+    in rec {
+      packages.copanier = pkgs.callPackage ./. { src = copanier; };
+      defaultPackage = packages.copanier;
+      legacyPackages.copanier = packages.copanier;
+      apps.copanier = flake-utils.lib.mkApp { drv = packages.copanier; };
+      defaultApp = apps.copanier;
+    }) // rec {
+      overlays = {
+        copanier = final: prev: {
+          copanier = self.defaultPackage."${final.system}";
+        };
+      };
+      overlay = overlays.copanier;
+    };
+  }
diff --git a/flakes/copanier/poetry.lock b/flakes/copanier/poetry.lock
new file mode 100644 (file)
index 0000000..232bdf3
--- /dev/null
@@ -0,0 +1,995 @@
+[[package]]
+name = "autoroutes"
+version = "0.3.5"
+description = "Routes for speed"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+dev = ["cython", "pytest", "twine"]
+
+[[package]]
+name = "biscuits"
+version = "0.3.0"
+description = "Fast and tasty cookies handling."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "cachetools"
+version = "4.2.4"
+description = "Extensible memoizing collections and decorators"
+category = "main"
+optional = false
+python-versions = "~=3.5"
+
+[[package]]
+name = "cairocffi"
+version = "1.3.0"
+description = "cffi-based cairo bindings for Python"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+cffi = ">=1.1.0"
+
+[package.extras]
+doc = ["sphinx", "sphinx-rtd-theme"]
+test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"]
+xcb = ["xcffib (>=0.3.2)"]
+
+[[package]]
+name = "cairosvg"
+version = "2.5.2"
+description = "A Simple SVG Converter based on Cairo"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[package.dependencies]
+cairocffi = "*"
+cssselect2 = "*"
+defusedxml = "*"
+pillow = "*"
+tinycss2 = "*"
+
+[package.extras]
+doc = ["sphinx", "sphinx-rtd-theme"]
+test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"]
+
+[[package]]
+name = "certifi"
+version = "2021.10.8"
+description = "Python package for providing Mozilla's CA Bundle."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "cffi"
+version = "1.14.6"
+description = "Foreign Function Interface for Python calling C code."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+pycparser = "*"
+
+[[package]]
+name = "chardet"
+version = "4.0.0"
+description = "Universal encoding detector for Python 2 and 3"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "charset-normalizer"
+version = "2.0.6"
+description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+category = "main"
+optional = false
+python-versions = ">=3.5.0"
+
+[package.extras]
+unicode_backport = ["unicodedata2"]
+
+[[package]]
+name = "cssselect"
+version = "1.1.0"
+description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "cssselect2"
+version = "0.4.1"
+description = "cssselect2"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+tinycss2 = "*"
+webencodings = "*"
+
+[package.extras]
+doc = ["sphinx", "sphinx-rtd-theme"]
+test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"]
+
+[[package]]
+name = "cssutils"
+version = "2.3.0"
+description = "A CSS Cascading Style Sheets library for Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "mock", "lxml", "cssselect", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources"]
+
+[[package]]
+name = "debts"
+version = "0.5"
+description = "Help solve debts settlement."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+jinja2 = "*"
+
+[[package]]
+name = "defusedxml"
+version = "0.7.1"
+description = "XML bomb protection for Python stdlib modules"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "emails"
+version = "0.6"
+description = "Modern python library for emails."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+chardet = "*"
+cssutils = "*"
+lxml = "*"
+premailer = "*"
+python-dateutil = "*"
+requests = "*"
+
+[[package]]
+name = "et-xmlfile"
+version = "1.1.0"
+description = "An implementation of lxml.xmlfile for the standard library"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "html5lib"
+version = "1.1"
+description = "HTML parser based on the WHATWG HTML specification"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+six = ">=1.9"
+webencodings = "*"
+
+[package.extras]
+all = ["genshi", "chardet (>=2.2)", "lxml"]
+chardet = ["chardet (>=2.2)"]
+genshi = ["genshi"]
+lxml = ["lxml"]
+
+[[package]]
+name = "httptools"
+version = "0.2.0"
+description = "A collection of framework independent HTTP protocol utils."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+test = ["Cython (==0.29.22)"]
+
+[[package]]
+name = "idna"
+version = "3.2"
+description = "Internationalized Domain Names in Applications (IDNA)"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[[package]]
+name = "importlib-metadata"
+version = "4.8.1"
+description = "Read metadata from Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+perf = ["ipython"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
+
+[[package]]
+name = "jdcal"
+version = "1.4.1"
+description = "Julian dates from proleptic Gregorian and Julian calendars."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "jinja2"
+version = "2.11.2"
+description = "A very fast and expressive template engine."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+MarkupSafe = ">=0.23"
+
+[package.extras]
+i18n = ["Babel (>=0.8)"]
+
+[[package]]
+name = "lxml"
+version = "4.6.3"
+description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*"
+
+[package.extras]
+cssselect = ["cssselect (>=0.7)"]
+html5 = ["html5lib"]
+htmlsoup = ["beautifulsoup4"]
+source = ["Cython (>=0.29.7)"]
+
+[[package]]
+name = "markupsafe"
+version = "2.0.1"
+description = "Safely add untrusted strings to HTML/XML markup."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "minicli"
+version = "0.5.0"
+description = "Minimalist CLI"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+doc = ["mkdocs (==1.1.2)"]
+test = ["pytest (==6.0.1)"]
+
+[[package]]
+name = "multifruits"
+version = "0.1.5"
+description = "Tasty multipart form data parser built with cython."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+dev = ["Cython (==0.29.21)"]
+
+[[package]]
+name = "openpyxl"
+version = "3.0.5"
+description = "A Python library to read/write Excel 2010 xlsx/xlsm files"
+category = "main"
+optional = false
+python-versions = ">=3.6,"
+
+[package.dependencies]
+et-xmlfile = "*"
+jdcal = "*"
+
+[[package]]
+name = "pillow"
+version = "8.3.2"
+description = "Python Imaging Library (Fork)"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "premailer"
+version = "3.10.0"
+description = "Turns CSS blocks into style attributes"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+cachetools = "*"
+cssselect = "*"
+cssutils = "*"
+lxml = "*"
+requests = "*"
+
+[package.extras]
+dev = ["tox", "twine", "therapist", "black", "flake8", "wheel"]
+test = ["nose", "mock"]
+
+[[package]]
+name = "pycparser"
+version = "2.20"
+description = "C parser in Python"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "pyjwt"
+version = "1.7.1"
+description = "JSON Web Token implementation in Python"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.extras]
+crypto = ["cryptography (>=1.4)"]
+flake8 = ["flake8", "flake8-import-order", "pep8-naming"]
+test = ["pytest (>=4.0.1,<5.0.0)", "pytest-cov (>=2.6.0,<3.0.0)", "pytest-runner (>=4.2,<5.0.0)"]
+
+[[package]]
+name = "pyphen"
+version = "0.11.0"
+description = "Pure Python module to hyphenate text"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"]
+
+[[package]]
+name = "python-dateutil"
+version = "2.8.2"
+description = "Extensions to the standard Python datetime module"
+category = "main"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+name = "python-slugify"
+version = "4.0.1"
+description = "A Python Slugify application that handles Unicode"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+text-unidecode = ">=1.3"
+
+[package.extras]
+unidecode = ["Unidecode (>=1.1.1)"]
+
+[[package]]
+name = "pyyaml"
+version = "5.3.1"
+description = "YAML parser and emitter for Python"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "requests"
+version = "2.26.0"
+description = "Python HTTP for Humans."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""}
+idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""}
+urllib3 = ">=1.21.1,<1.27"
+
+[package.extras]
+socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
+use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
+
+[[package]]
+name = "roll"
+version = "0.13.0"
+description = "Roll is a pico framework with performances and aesthetic in mind."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+autoroutes = "0.3.5"
+biscuits = "0.3.0"
+httptools = "0.2.0"
+multifruits = "0.1.5"
+websockets = "8.1"
+
+[package.extras]
+docs = ["mkdocs"]
+test = ["pytest"]
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "text-unidecode"
+version = "1.3"
+description = "The most basic Text::Unidecode port"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "tinycss2"
+version = "1.1.0"
+description = "tinycss2"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+webencodings = ">=0.4"
+
+[package.extras]
+doc = ["sphinx", "sphinx-rtd-theme"]
+test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"]
+
+[[package]]
+name = "typing-extensions"
+version = "3.10.0.2"
+description = "Backported and Experimental Type Hints for Python 3.5+"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "ujson"
+version = "3.2.0"
+description = "Ultra fast JSON encoder and decoder for Python"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[[package]]
+name = "urllib3"
+version = "1.26.7"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+
+[package.extras]
+brotli = ["brotlipy (>=0.6.0)"]
+secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
+socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
+
+[[package]]
+name = "weasyprint"
+version = "51"
+description = "The Awesome Document Factory"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[package.dependencies]
+cairocffi = ">=0.9.0"
+CairoSVG = ">=2.4.0"
+cffi = ">=0.6"
+cssselect2 = ">=0.1"
+html5lib = ">=0.999999999"
+Pyphen = ">=0.9.1"
+tinycss2 = ">=1.0.0"
+
+[package.extras]
+doc = ["sphinx", "sphinx-rtd-theme"]
+test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"]
+
+[[package]]
+name = "webencodings"
+version = "0.5.1"
+description = "Character encoding aliases for legacy web content"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "websockets"
+version = "8.1"
+description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
+category = "main"
+optional = false
+python-versions = ">=3.6.1"
+
+[[package]]
+name = "zipp"
+version = "3.6.0"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = "^3.7"
+content-hash = "e82001513bafdfab9338f3fe9e786a7cc23c55f7e77a98e6b1d3924ab8887f5f"
+
+[metadata.files]
+autoroutes = [
+    {file = "autoroutes-0.3.5.tar.gz", hash = "sha256:087fcc5bd7e6f457931b9e8420d575f6aa7d35803d667013463c58d2bcf6b814"},
+]
+biscuits = [
+    {file = "biscuits-0.3.0.tar.gz", hash = "sha256:08b899164133c81b99b7307d629a45e2fb6a3bcc3ea7c08b1ff24b464b411307"},
+]
+cachetools = [
+    {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"},
+    {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"},
+]
+cairocffi = [
+    {file = "cairocffi-1.3.0.tar.gz", hash = "sha256:108a3a7cb09e203bdd8501d9baad91d786d204561bd71e9364e8b34897c47b91"},
+]
+cairosvg = [
+    {file = "CairoSVG-2.5.2-py3-none-any.whl", hash = "sha256:98c276b7e4f0caf01e5c7176765c104ffa1aa1461d63b2053b04ab663cf7052b"},
+    {file = "CairoSVG-2.5.2.tar.gz", hash = "sha256:b0b9929cf5dba005178d746a8036fcf0025550f498ca54db61873322384783bc"},
+]
+certifi = [
+    {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
+    {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
+]
+cffi = [
+    {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"},
+    {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"},
+    {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"},
+    {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"},
+    {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"},
+    {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"},
+    {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"},
+    {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"},
+    {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"},
+    {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"},
+    {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"},
+    {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"},
+    {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"},
+    {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"},
+    {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"},
+    {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"},
+    {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"},
+    {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"},
+    {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"},
+    {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"},
+    {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"},
+    {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"},
+    {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"},
+    {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"},
+    {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"},
+    {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"},
+    {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"},
+    {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"},
+    {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"},
+    {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"},
+    {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"},
+    {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"},
+    {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"},
+    {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"},
+    {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"},
+    {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"},
+    {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"},
+    {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"},
+    {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"},
+    {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"},
+    {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"},
+    {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"},
+    {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"},
+    {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"},
+    {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"},
+]
+chardet = [
+    {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
+    {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
+]
+charset-normalizer = [
+    {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"},
+    {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"},
+]
+cssselect = [
+    {file = "cssselect-1.1.0-py2.py3-none-any.whl", hash = "sha256:f612ee47b749c877ebae5bb77035d8f4202c6ad0f0fc1271b3c18ad6c4468ecf"},
+    {file = "cssselect-1.1.0.tar.gz", hash = "sha256:f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc"},
+]
+cssselect2 = [
+    {file = "cssselect2-0.4.1-py3-none-any.whl", hash = "sha256:2f4a9f20965367bae459e3bb42561f7927e0cfe5b7ea1692757cf67ef5d7dace"},
+    {file = "cssselect2-0.4.1.tar.gz", hash = "sha256:93fbb9af860e95dd40bf18c3b2b6ed99189a07c0f29ba76f9c5be71344664ec8"},
+]
+cssutils = [
+    {file = "cssutils-2.3.0-py3-none-any.whl", hash = "sha256:0cf1f6086b020dee18048ff3999339499f725934017ef9ae2cd5bb77f9ab5f46"},
+    {file = "cssutils-2.3.0.tar.gz", hash = "sha256:b2d3b16047caae82e5c590036935bafa1b621cf45c2f38885af4be4838f0fd00"},
+]
+debts = [
+    {file = "debts-0.5.tar.gz", hash = "sha256:f239fa356500b0cc7d2334a6ad45dcaf542796f759ca44052c59566afca8e5f8"},
+]
+defusedxml = [
+    {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"},
+    {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
+]
+emails = [
+    {file = "emails-0.6-py2.py3-none-any.whl", hash = "sha256:72c1e3198075709cc35f67e1b49e2da1a2bc087e9b444073db61a379adfb7f3c"},
+    {file = "emails-0.6.tar.gz", hash = "sha256:a4c2d67ea8b8831967a750d8edc6e77040d7693143fe280e6d2a367d9c36ff88"},
+]
+et-xmlfile = [
+    {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"},
+    {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"},
+]
+html5lib = [
+    {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"},
+    {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"},
+]
+httptools = [
+    {file = "httptools-0.2.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:79dbc21f3612a78b28384e989b21872e2e3cf3968532601544696e4ed0007ce5"},
+    {file = "httptools-0.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:78d03dd39b09c99ec917d50189e6743adbfd18c15d5944392d2eabda688bf149"},
+    {file = "httptools-0.2.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a23166e5ae2775709cf4f7ad4c2048755ebfb272767d244e1a96d55ac775cca7"},
+    {file = "httptools-0.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3ab1f390d8867f74b3b5ee2a7ecc9b8d7f53750bd45714bf1cb72a953d7dfa77"},
+    {file = "httptools-0.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a7594f9a010cdf1e16a58b3bf26c9da39bbf663e3b8d46d39176999d71816658"},
+    {file = "httptools-0.2.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:01b392a166adcc8bc2f526a939a8aabf89fe079243e1543fd0e7dc1b58d737cb"},
+    {file = "httptools-0.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:80ffa04fe8c8dfacf6e4cef8277347d35b0442c581f5814f3b0cf41b65c43c6e"},
+    {file = "httptools-0.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d5682eeb10cca0606c4a8286a3391d4c3c5a36f0c448e71b8bd05be4e1694bfb"},
+    {file = "httptools-0.2.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a289c27ccae399a70eacf32df9a44059ca2ba4ac444604b00a19a6c1f0809943"},
+    {file = "httptools-0.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:813871f961edea6cb2fe312f2d9b27d12a51ba92545380126f80d0de1917ea15"},
+    {file = "httptools-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:cc9be041e428c10f8b6ab358c6b393648f9457094e1dcc11b4906026d43cd380"},
+    {file = "httptools-0.2.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b08d00d889a118f68f37f3c43e359aab24ee29eb2e3fe96d64c6a2ba8b9d6557"},
+    {file = "httptools-0.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fd3b8905e21431ad306eeaf56644a68fdd621bf8f3097eff54d0f6bdf7262065"},
+    {file = "httptools-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:200fc1cdf733a9ff554c0bb97a4047785cfaad9875307d6087001db3eb2b417f"},
+    {file = "httptools-0.2.0.tar.gz", hash = "sha256:94505026be56652d7a530ab03d89474dc6021019d6b8682281977163b3471ea0"},
+]
+idna = [
+    {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"},
+    {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"},
+]
+importlib-metadata = [
+    {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"},
+    {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"},
+]
+jdcal = [
+    {file = "jdcal-1.4.1-py2.py3-none-any.whl", hash = "sha256:1abf1305fce18b4e8aa248cf8fe0c56ce2032392bc64bbd61b5dff2a19ec8bba"},
+    {file = "jdcal-1.4.1.tar.gz", hash = "sha256:472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8"},
+]
+jinja2 = [
+    {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"},
+    {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"},
+]
+lxml = [
+    {file = "lxml-4.6.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2"},
+    {file = "lxml-4.6.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f"},
+    {file = "lxml-4.6.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d"},
+    {file = "lxml-4.6.3-cp27-cp27m-win32.whl", hash = "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106"},
+    {file = "lxml-4.6.3-cp27-cp27m-win_amd64.whl", hash = "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee"},
+    {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f"},
+    {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4"},
+    {file = "lxml-4.6.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51"},
+    {file = "lxml-4.6.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586"},
+    {file = "lxml-4.6.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:4c61b3a0db43a1607d6264166b230438f85bfed02e8cff20c22e564d0faff354"},
+    {file = "lxml-4.6.3-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:5c8c163396cc0df3fd151b927e74f6e4acd67160d6c33304e805b84293351d16"},
+    {file = "lxml-4.6.3-cp35-cp35m-win32.whl", hash = "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2"},
+    {file = "lxml-4.6.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4"},
+    {file = "lxml-4.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4"},
+    {file = "lxml-4.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3"},
+    {file = "lxml-4.6.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d"},
+    {file = "lxml-4.6.3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d916d31fd85b2f78c76400d625076d9124de3e4bda8b016d25a050cc7d603f24"},
+    {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec"},
+    {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:c47ff7e0a36d4efac9fd692cfa33fbd0636674c102e9e8d9b26e1b93a94e7617"},
+    {file = "lxml-4.6.3-cp36-cp36m-win32.whl", hash = "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04"},
+    {file = "lxml-4.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a"},
+    {file = "lxml-4.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654"},
+    {file = "lxml-4.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0"},
+    {file = "lxml-4.6.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3"},
+    {file = "lxml-4.6.3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:36108c73739985979bf302006527cf8a20515ce444ba916281d1c43938b8bb96"},
+    {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2"},
+    {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:cdaf11d2bd275bf391b5308f86731e5194a21af45fbaaaf1d9e8147b9160ea92"},
+    {file = "lxml-4.6.3-cp37-cp37m-win32.whl", hash = "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade"},
+    {file = "lxml-4.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b"},
+    {file = "lxml-4.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa"},
+    {file = "lxml-4.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a"},
+    {file = "lxml-4.6.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927"},
+    {file = "lxml-4.6.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:e1cbd3f19a61e27e011e02f9600837b921ac661f0c40560eefb366e4e4fb275e"},
+    {file = "lxml-4.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791"},
+    {file = "lxml-4.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:1b38116b6e628118dea5b2186ee6820ab138dbb1e24a13e478490c7db2f326ae"},
+    {file = "lxml-4.6.3-cp38-cp38-win32.whl", hash = "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28"},
+    {file = "lxml-4.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7"},
+    {file = "lxml-4.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0"},
+    {file = "lxml-4.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1"},
+    {file = "lxml-4.6.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23"},
+    {file = "lxml-4.6.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:3082c518be8e97324390614dacd041bb1358c882d77108ca1957ba47738d9d59"},
+    {file = "lxml-4.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969"},
+    {file = "lxml-4.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:6f12e1427285008fd32a6025e38e977d44d6382cf28e7201ed10d6c1698d2a9a"},
+    {file = "lxml-4.6.3-cp39-cp39-win32.whl", hash = "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f"},
+    {file = "lxml-4.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83"},
+    {file = "lxml-4.6.3.tar.gz", hash = "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468"},
+]
+markupsafe = [
+    {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"},
+    {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
+    {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
+    {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
+    {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
+    {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
+    {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
+]
+minicli = [
+    {file = "minicli-0.5.0-py3-none-any.whl", hash = "sha256:c6118c0c6c5678cfc2ad7317dca9bfa8c4da2363337a0adbe526aeeb3007582e"},
+    {file = "minicli-0.5.0.tar.gz", hash = "sha256:baea96017039c0eba448cd07d746eda623be3226367b3a532d3843154bb347ad"},
+]
+multifruits = [
+    {file = "multifruits-0.1.5.tar.gz", hash = "sha256:c5eff8b375121b96a96a0c4bd05cd817ec7e204feadc6c6a211ca16029f78a7f"},
+]
+openpyxl = [
+    {file = "openpyxl-3.0.5-py2.py3-none-any.whl", hash = "sha256:f7d666b569f729257082cf7ddc56262431878f602dcc2bc3980775c59439cdab"},
+    {file = "openpyxl-3.0.5.tar.gz", hash = "sha256:18e11f9a650128a12580a58e3daba14e00a11d9e907c554a17ea016bf1a2c71b"},
+]
+pillow = [
+    {file = "Pillow-8.3.2-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:c691b26283c3a31594683217d746f1dad59a7ae1d4cfc24626d7a064a11197d4"},
+    {file = "Pillow-8.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f514c2717012859ccb349c97862568fdc0479aad85b0270d6b5a6509dbc142e2"},
+    {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be25cb93442c6d2f8702c599b51184bd3ccd83adebd08886b682173e09ef0c3f"},
+    {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d675a876b295afa114ca8bf42d7f86b5fb1298e1b6bb9a24405a3f6c8338811c"},
+    {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59697568a0455764a094585b2551fd76bfd6b959c9f92d4bdec9d0e14616303a"},
+    {file = "Pillow-8.3.2-cp310-cp310-win32.whl", hash = "sha256:2d5e9dc0bf1b5d9048a94c48d0813b6c96fccfa4ccf276d9c36308840f40c228"},
+    {file = "Pillow-8.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:11c27e74bab423eb3c9232d97553111cc0be81b74b47165f07ebfdd29d825875"},
+    {file = "Pillow-8.3.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:11eb7f98165d56042545c9e6db3ce394ed8b45089a67124298f0473b29cb60b2"},
+    {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f23b2d3079522fdf3c09de6517f625f7a964f916c956527bed805ac043799b8"},
+    {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19ec4cfe4b961edc249b0e04b5618666c23a83bc35842dea2bfd5dfa0157f81b"},
+    {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5a31c07cea5edbaeb4bdba6f2b87db7d3dc0f446f379d907e51cc70ea375629"},
+    {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15ccb81a6ffc57ea0137f9f3ac2737ffa1d11f786244d719639df17476d399a7"},
+    {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8f284dc1695caf71a74f24993b7c7473d77bc760be45f776a2c2f4e04c170550"},
+    {file = "Pillow-8.3.2-cp36-cp36m-win32.whl", hash = "sha256:4abc247b31a98f29e5224f2d31ef15f86a71f79c7f4d2ac345a5d551d6393073"},
+    {file = "Pillow-8.3.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a048dad5ed6ad1fad338c02c609b862dfaa921fcd065d747194a6805f91f2196"},
+    {file = "Pillow-8.3.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:06d1adaa284696785375fa80a6a8eb309be722cf4ef8949518beb34487a3df71"},
+    {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd24054aaf21e70a51e2a2a5ed1183560d3a69e6f9594a4bfe360a46f94eba83"},
+    {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a330bf7014ee034046db43ccbb05c766aa9e70b8d6c5260bfc38d73103b0ba"},
+    {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13654b521fb98abdecec105ea3fb5ba863d1548c9b58831dd5105bb3873569f1"},
+    {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1bd983c565f92779be456ece2479840ec39d386007cd4ae83382646293d681b"},
+    {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4326ea1e2722f3dc00ed77c36d3b5354b8fb7399fb59230249ea6d59cbed90da"},
+    {file = "Pillow-8.3.2-cp37-cp37m-win32.whl", hash = "sha256:085a90a99404b859a4b6c3daa42afde17cb3ad3115e44a75f0d7b4a32f06a6c9"},
+    {file = "Pillow-8.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:18a07a683805d32826c09acfce44a90bf474e6a66ce482b1c7fcd3757d588df3"},
+    {file = "Pillow-8.3.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4e59e99fd680e2b8b11bbd463f3c9450ab799305d5f2bafb74fefba6ac058616"},
+    {file = "Pillow-8.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d89a2e9219a526401015153c0e9dd48319ea6ab9fe3b066a20aa9aee23d9fd3"},
+    {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fd98c8294f57636084f4b076b75f86c57b2a63a8410c0cd172bc93695ee979"},
+    {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b11c9d310a3522b0fd3c35667914271f570576a0e387701f370eb39d45f08a4"},
+    {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0412516dcc9de9b0a1e0ae25a280015809de8270f134cc2c1e32c4eeb397cf30"},
+    {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bcb04ff12e79b28be6c9988f275e7ab69f01cc2ba319fb3114f87817bb7c74b6"},
+    {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0b9911ec70731711c3b6ebcde26caea620cbdd9dcb73c67b0730c8817f24711b"},
+    {file = "Pillow-8.3.2-cp38-cp38-win32.whl", hash = "sha256:ce2e5e04bb86da6187f96d7bab3f93a7877830981b37f0287dd6479e27a10341"},
+    {file = "Pillow-8.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:35d27687f027ad25a8d0ef45dd5208ef044c588003cdcedf05afb00dbc5c2deb"},
+    {file = "Pillow-8.3.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:04835e68ef12904bc3e1fd002b33eea0779320d4346082bd5b24bec12ad9c3e9"},
+    {file = "Pillow-8.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10e00f7336780ca7d3653cf3ac26f068fa11b5a96894ea29a64d3dc4b810d630"},
+    {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cde7a4d3687f21cffdf5bb171172070bb95e02af448c4c8b2f223d783214056"},
+    {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c3ff00110835bdda2b1e2b07f4a2548a39744bb7de5946dc8e95517c4fb2ca6"},
+    {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d409030bf3bd05fa66fb5fdedc39c521b397f61ad04309c90444e893d05f7d"},
+    {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bff50ba9891be0a004ef48828e012babaaf7da204d81ab9be37480b9020a82b"},
+    {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7dbfbc0020aa1d9bc1b0b8bcf255a7d73f4ad0336f8fd2533fcc54a4ccfb9441"},
+    {file = "Pillow-8.3.2-cp39-cp39-win32.whl", hash = "sha256:963ebdc5365d748185fdb06daf2ac758116deecb2277ec5ae98139f93844bc09"},
+    {file = "Pillow-8.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:cc9d0dec711c914ed500f1d0d3822868760954dce98dfb0b7382a854aee55d19"},
+    {file = "Pillow-8.3.2-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2c661542c6f71dfd9dc82d9d29a8386287e82813b0375b3a02983feac69ef864"},
+    {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:548794f99ff52a73a156771a0402f5e1c35285bd981046a502d7e4793e8facaa"},
+    {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b68f565a4175e12e68ca900af8910e8fe48aaa48fd3ca853494f384e11c8bcd"},
+    {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:838eb85de6d9307c19c655c726f8d13b8b646f144ca6b3771fa62b711ebf7624"},
+    {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:feb5db446e96bfecfec078b943cc07744cc759893cef045aa8b8b6d6aaa8274e"},
+    {file = "Pillow-8.3.2-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:fc0db32f7223b094964e71729c0361f93db43664dd1ec86d3df217853cedda87"},
+    {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd4fd83aa912d7b89b4b4a1580d30e2a4242f3936882a3f433586e5ab97ed0d5"},
+    {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0c8ebbfd439c37624db98f3877d9ed12c137cadd99dde2d2eae0dab0bbfc355"},
+    {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cb3dd7f23b044b0737317f892d399f9e2f0b3a02b22b2c692851fb8120d82c6"},
+    {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66566f8a22561fc1a88dc87606c69b84fa9ce724f99522cf922c801ec68f5c1"},
+    {file = "Pillow-8.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ce651ca46d0202c302a535d3047c55a0131a720cf554a578fc1b8a2aff0e7d96"},
+    {file = "Pillow-8.3.2.tar.gz", hash = "sha256:dde3f3ed8d00c72631bc19cbfff8ad3b6215062a5eed402381ad365f82f0c18c"},
+]
+premailer = [
+    {file = "premailer-3.10.0-py2.py3-none-any.whl", hash = "sha256:021b8196364d7df96d04f9ade51b794d0b77bcc19e998321c515633a2273be1a"},
+    {file = "premailer-3.10.0.tar.gz", hash = "sha256:d1875a8411f5dc92b53ef9f193db6c0f879dc378d618e0ad292723e388bfe4c2"},
+]
+pycparser = [
+    {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"},
+    {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"},
+]
+pyjwt = [
+    {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"},
+    {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"},
+]
+pyphen = [
+    {file = "pyphen-0.11.0-py3-none-any.whl", hash = "sha256:e3c1b1d05deaa31acdd78e2e24005402358feb7a4b407c4af7e5cc2e41c4d608"},
+    {file = "pyphen-0.11.0.tar.gz", hash = "sha256:e2c3ed82c3a04317df5102addafe89652b0876bc6c6265f5dd4c3efaf02315e8"},
+]
+python-dateutil = [
+    {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
+    {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
+]
+python-slugify = [
+    {file = "python-slugify-4.0.1.tar.gz", hash = "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270"},
+]
+pyyaml = [
+    {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"},
+    {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"},
+    {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"},
+    {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"},
+    {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"},
+    {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"},
+    {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"},
+    {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"},
+    {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"},
+    {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"},
+    {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"},
+    {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"},
+    {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"},
+]
+requests = [
+    {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
+    {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"},
+]
+roll = [
+    {file = "roll-0.13.0-py3-none-any.whl", hash = "sha256:a9a833c791167406599f4a234c7b244e074e9e1c796f94adf99bde2894730684"},
+    {file = "roll-0.13.0.tar.gz", hash = "sha256:5847d408bc74ec495d55fe7b482b4d780f88fc6ab56c0bef49336d3fa078e050"},
+]
+six = [
+    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+text-unidecode = [
+    {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"},
+    {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"},
+]
+tinycss2 = [
+    {file = "tinycss2-1.1.0-py3-none-any.whl", hash = "sha256:0353b5234bcaee7b1ac7ca3dea7e02cd338a9f8dcbb8f2dcd32a5795ec1e5f9a"},
+    {file = "tinycss2-1.1.0.tar.gz", hash = "sha256:fbdcac3044d60eb85fdb2aa840ece43cf7dbe798e373e6ee0be545d4d134e18a"},
+]
+typing-extensions = [
+    {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"},
+    {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"},
+    {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"},
+]
+ujson = [
+    {file = "ujson-3.2.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:437e051a3e292ddbd5b4682f9b6c3e2ea4cd059d0d75bc9f8314349d63cbb015"},
+    {file = "ujson-3.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a27ea44406100a97fb0fcc0b18dcdaf324824e722a00856a2992fafc65779351"},
+    {file = "ujson-3.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6f7c24dabb0ff0ff43744d18211af6035ef37197f530c13edf704e627da7251d"},
+    {file = "ujson-3.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:5ae6f599ef7c01ef626697f9e15e9d4e2a186ab4c0593ddb529b86866b562efb"},
+    {file = "ujson-3.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:59048958793e0b0489449a414e2fbe54644457be1dd882b99a4fe16158632af1"},
+    {file = "ujson-3.2.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a476525862a394018a7a3438c86596815b84518b2744184444fc6f8b0e3e4aee"},
+    {file = "ujson-3.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:2050c7f1ce72055f1b6fba29e4694ccf4509917d3be3ed6f3543ef3ff00eec4a"},
+    {file = "ujson-3.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fda324ca055e671eae46e8fc32b46fab20eb251d3e6e22beb67f71f1d240b0b4"},
+    {file = "ujson-3.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0bdc62a1543d697e9c649ac0ac41e0d076a7b886d6b45f9f21971e25b90a2b27"},
+    {file = "ujson-3.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d0ad63fc88d4e4cb7630f59aacd742256804a4cee447e9589e55957107a469b7"},
+    {file = "ujson-3.2.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:66d47eabb4f0e12b5784b1a49c59bc6f32e91e18e02f2a43c5e91e2f6ad9cc60"},
+    {file = "ujson-3.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:253edfe274538bb1060ab8877d51fc75e416047d5fab5340454a48b971f30612"},
+    {file = "ujson-3.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6ee651c0210a67e3a72367de53ccac83b623913214e7c75015caadfad2b7e0dc"},
+    {file = "ujson-3.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:0784f35f2ace41ed55c435ee11f9d9877cf3e6ff03c8850f87504cb93e9a9469"},
+    {file = "ujson-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:812748c8de041f1ef5e9b37f33121c0c7390055fa5f12215b3d06a63b1c055a2"},
+    {file = "ujson-3.2.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:17460d88dd4b9630e449e5d29b97301e6dbbbedbf46a6f95f3b2cb7e1333e6ea"},
+    {file = "ujson-3.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2d50cb3d87d4aabe6dbeb6ef79025bf9fdf350c4355c24819dc5c5cc38bad3dc"},
+    {file = "ujson-3.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7060105de892cada2f01bd072d33b2421b4eefd32536207c1c9f2ade18656139"},
+    {file = "ujson-3.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7b6496b3e2bc396628f114fd96ec41655b10c84adececc0ef8cf1c2329dae36c"},
+    {file = "ujson-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:782bdf016da793a3bf138e50ed973428e59006b8d73a9e1911bc6207c6b79fff"},
+    {file = "ujson-3.2.0.tar.gz", hash = "sha256:abb1996ba1c1d2faf5b1e38efa97da7f64e5373a31f705b96fe0587f5f778db4"},
+]
+urllib3 = [
+    {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"},
+    {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
+]
+weasyprint = [
+    {file = "WeasyPrint-51-py3-none-any.whl", hash = "sha256:469974f6e74b1eef71dc56a9b80cc17621f319234d2a4ab656ddd0fd9e66c27f"},
+    {file = "WeasyPrint-51.tar.gz", hash = "sha256:b3e971973a4f03c1430e6b838b75b5b57630415fcae8666d2be1347630ff6d6a"},
+]
+webencodings = [
+    {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"},
+    {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
+]
+websockets = [
+    {file = "websockets-8.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:3762791ab8b38948f0c4d281c8b2ddfa99b7e510e46bd8dfa942a5fff621068c"},
+    {file = "websockets-8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3db87421956f1b0779a7564915875ba774295cc86e81bc671631379371af1170"},
+    {file = "websockets-8.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4f9f7d28ce1d8f1295717c2c25b732c2bc0645db3215cf757551c392177d7cb8"},
+    {file = "websockets-8.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:295359a2cc78736737dd88c343cd0747546b2174b5e1adc223824bcaf3e164cb"},
+    {file = "websockets-8.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1d3f1bf059d04a4e0eb4985a887d49195e15ebabc42364f4eb564b1d065793f5"},
+    {file = "websockets-8.1-cp36-cp36m-win32.whl", hash = "sha256:2db62a9142e88535038a6bcfea70ef9447696ea77891aebb730a333a51ed559a"},
+    {file = "websockets-8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5"},
+    {file = "websockets-8.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:9b248ba3dd8a03b1a10b19efe7d4f7fa41d158fdaa95e2cf65af5a7b95a4f989"},
+    {file = "websockets-8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ce85b06a10fc65e6143518b96d3dca27b081a740bae261c2fb20375801a9d56d"},
+    {file = "websockets-8.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:965889d9f0e2a75edd81a07592d0ced54daa5b0785f57dc429c378edbcffe779"},
+    {file = "websockets-8.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:751a556205d8245ff94aeef23546a1113b1dd4f6e4d102ded66c39b99c2ce6c8"},
+    {file = "websockets-8.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3ef56fcc7b1ff90de46ccd5a687bbd13a3180132268c4254fc0fa44ecf4fc422"},
+    {file = "websockets-8.1-cp37-cp37m-win32.whl", hash = "sha256:7ff46d441db78241f4c6c27b3868c9ae71473fe03341340d2dfdbe8d79310acc"},
+    {file = "websockets-8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:20891f0dddade307ffddf593c733a3fdb6b83e6f9eef85908113e628fa5a8308"},
+    {file = "websockets-8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c1ec8db4fac31850286b7cd3b9c0e1b944204668b8eb721674916d4e28744092"},
+    {file = "websockets-8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5c01fd846263a75bc8a2b9542606927cfad57e7282965d96b93c387622487485"},
+    {file = "websockets-8.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9bef37ee224e104a413f0780e29adb3e514a5b698aabe0d969a6ba426b8435d1"},
+    {file = "websockets-8.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d705f8aeecdf3262379644e4b55107a3b55860eb812b673b28d0fbc347a60c55"},
+    {file = "websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c8a116feafdb1f84607cb3b14aa1418424ae71fee131642fc568d21423b51824"},
+    {file = "websockets-8.1-cp38-cp38-win32.whl", hash = "sha256:e898a0863421650f0bebac8ba40840fc02258ef4714cb7e1fd76b6a6354bda36"},
+    {file = "websockets-8.1-cp38-cp38-win_amd64.whl", hash = "sha256:f8a7bff6e8664afc4e6c28b983845c5bc14965030e3fb98789734d416af77c4b"},
+    {file = "websockets-8.1.tar.gz", hash = "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f"},
+]
+zipp = [
+    {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"},
+    {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"},
+]
diff --git a/flakes/copanier/pyproject.toml b/flakes/copanier/pyproject.toml
new file mode 100644 (file)
index 0000000..ba487ae
--- /dev/null
@@ -0,0 +1,40 @@
+[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"
diff --git a/flakes/diaspora/default.nix b/flakes/diaspora/default.nix
new file mode 100644 (file)
index 0000000..f4038ad
--- /dev/null
@@ -0,0 +1,74 @@
+{ ldap ? false, varDir ? "/var/lib/diaspora", podmin_email ? null, config_dir ? "/etc/diaspora",
+  src, stdenv, bundlerEnv, writeText,
+  cacert, defaultGemConfig, perl, ruby_2_4, nodejs, which, git }:
+let
+  diaspora_src = stdenv.mkDerivation {
+    inherit (src) version;
+    pname = "diaspora";
+    inherit src;
+    buildPhase = ''
+      ${if ldap then "patch -p1 < ${./ldap.patch}" else ""}
+      # FIXME: bundlerEnv below doesn't take postgresql group for some
+      # reason
+      echo 'gem "pg",     "1.1.3"' >> Gemfile
+    '';
+    installPhase = ''
+      cp -a . $out
+    '';
+  };
+  gems = bundlerEnv {
+    name = "diaspora-env";
+    gemfile = "${diaspora_src}/Gemfile";
+    lockfile = "${diaspora_src}/Gemfile.lock";
+    gemset = if ldap then ./gemset_ldap.nix else ./gemset.nix;
+    groups = [ "postgresql" "default" "production" ];
+    gemConfig = defaultGemConfig // {
+      kostya-sigar = attrs: {
+        buildInputs = [ perl ];
+      };
+    };
+  };
+  build_config = writeText "diaspora.yml" ''
+    configuration:
+      environment:
+        certificate_authorities: '${cacert}/etc/ssl/certs/ca-bundle.crt'
+    ${if podmin_email != null then ''
+    # dummy comment for indentation
+      admins:
+        podmin_email: '${podmin_email}'
+    '' else ""}
+    production:
+      environment:
+    '';
+  dummy_token = writeText "secret_token.rb" ''
+    Diaspora::Application.config.secret_key_base = 'dummy'
+  '';
+  diaspora = stdenv.mkDerivation {
+    name = "diaspora";
+    version = src.version;
+    inherit diaspora_src;
+    builder = writeText "build_diaspora" ''
+      source $stdenv/setup
+      cp -a $diaspora_src $out
+      cd $out
+      chmod -R u+rwX .
+      tar -czf public/source.tar.gz ./{app,db,lib,script,Gemfile,Gemfile.lock,Rakefile,config.ru}
+      ln -s database.yml.example config/database.yml
+      ln -s ${build_config} config/diaspora.yml
+      ln -s ${dummy_token} config/initializers/secret_token.rb
+      ln -sf ${varDir}/schedule.yml config/schedule.yml
+      ln -sf ${varDir}/oidc_key.pem config/oidc_key.pem
+      ln -sf ${varDir}/uploads public/uploads
+      RAILS_ENV=production ${gems}/bin/rake assets:precompile
+      ln -sf ${config_dir}/database.yml config/database.yml
+      ln -sf ${config_dir}/diaspora.yml config/diaspora.yml
+      ln -sf ${config_dir}/secret_token.rb config/initializers/secret_token.rb
+      rm -rf tmp log
+      ln -sf ${varDir}/tmp tmp
+      ln -sf ${varDir}/log log
+      '';
+    propagatedBuildInputs = [ gems nodejs which git ];
+    passthru = { inherit gems varDir; };
+  };
+in
+  diaspora
diff --git a/flakes/diaspora/flake.lock b/flakes/diaspora/flake.lock
new file mode 100644 (file)
index 0000000..3af470f
--- /dev/null
@@ -0,0 +1,75 @@
+{
+  "nodes": {
+    "diaspora": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1551139311,
+        "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
+        "owner": "diaspora",
+        "repo": "diaspora",
+        "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
+        "type": "github"
+      },
+      "original": {
+        "owner": "diaspora",
+        "ref": "v0.7.10.0",
+        "repo": "diaspora",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "diaspora": "diaspora",
+        "flake-utils": "flake-utils",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/diaspora/flake.nix b/flakes/diaspora/flake.nix
new file mode 100644 (file)
index 0000000..21b05d6
--- /dev/null
@@ -0,0 +1,214 @@
+{
+  description = "A privacy-aware, distributed, open source social network.";
+  inputs.myuids = {
+    url = "path:../myuids";
+  };
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.diaspora = {
+    url = "github:diaspora/diaspora/v0.7.10.0";
+    flake = false;
+  };
+
+  outputs = { self, myuids, nixpkgs, diaspora, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.diaspora.original.ref;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.diaspora = callPackage ./. { src = diaspora // { inherit version; }; };
+      defaultPackage = packages.diaspora;
+      legacyPackages.diaspora = packages.diaspora;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+  ) // rec {
+    overlays = {
+      diaspora = final: prev: {
+        diaspora = self.defaultPackage."${final.system}";
+      };
+    };
+    overlay = overlays.diaspora;
+    nixosModule = { lib, pkgs, config, ... }:
+      let
+        name = "diaspora";
+        cfg = config.services.diaspora;
+
+        uid = config.ids.uids.diaspora;
+        gid = config.ids.gids.diaspora;
+      in
+        {
+          options.services.diaspora = {
+            enable = lib.mkEnableOption "Enable Diaspora’s service";
+            user = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "User account under which Diaspora runs";
+            };
+            group = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "Group under which Diaspora runs";
+            };
+            adminEmail = lib.mkOption {
+              type = lib.types.str;
+              example = "admin@example.com";
+              description = "Admin e-mail for Diaspora";
+            };
+            dataDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/var/lib/${name}";
+              description = ''
+                The directory where Diaspora stores its data.
+              '';
+            };
+            socketsDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/run/${name}";
+              description = ''
+                The directory where Diaspora puts runtime files and sockets.
+                '';
+            };
+            configDir = lib.mkOption {
+              type = lib.types.path;
+              description = ''
+                The configuration path for Diaspora.
+                '';
+            };
+            package = lib.mkOption {
+              type = lib.types.package;
+              default = pkgs.diaspora;
+              description = ''
+                Diaspora package to use.
+                '';
+            };
+            withLdap = lib.mkEnableOption "Add ldap patch";
+            # Output variables
+            systemdStateDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if varDir is outside of /var/lib
+              default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+                lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+              description = ''
+              Adjusted Diaspora data directory for systemd
+              '';
+              readOnly = true;
+            };
+            systemdRuntimeDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if socketsDir is outside of /run
+              default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+                lib.strings.removePrefix "/run/" cfg.socketsDir;
+              description = ''
+              Adjusted Diaspora sockets directory for systemd
+              '';
+              readOnly = true;
+            };
+            workdir = lib.mkOption {
+              type = lib.types.package;
+              default = cfg.package.override {
+                varDir = cfg.dataDir;
+                podmin_email = cfg.adminEmail;
+                config_dir = cfg.configDir;
+                ldap = cfg.withLdap;
+              };
+              description = ''
+                Adjusted diaspora package with overriden values
+                '';
+              readOnly = true;
+            };
+            sockets = lib.mkOption {
+              type = lib.types.attrsOf lib.types.path;
+              default = {
+                rails = "${cfg.socketsDir}/diaspora.sock";
+                eye   = "${cfg.socketsDir}/eye.sock";
+              };
+              readOnly = true;
+              description = ''
+                Diaspora sockets
+                '';
+            };
+            pids = lib.mkOption {
+              type = lib.types.attrsOf lib.types.path;
+              default = {
+                eye   = "${cfg.socketsDir}/eye.pid";
+              };
+              readOnly = true;
+              description = ''
+                Diaspora pids
+                '';
+            };
+          };
+
+          config = lib.mkIf cfg.enable {
+            nixpkgs.overlays = [ self.overlay ];
+            users.users = lib.optionalAttrs (cfg.user == name) {
+              "${name}" = {
+                uid = myuids.lib.uids.diaspora;
+                group = cfg.group;
+                description = "Diaspora user";
+                home = cfg.dataDir;
+                packages = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby ];
+                useDefaultShell = true;
+              };
+            };
+            users.groups = lib.optionalAttrs (cfg.group == name) {
+              "${name}" = {
+                gid = myuids.lib.gids.diaspora;
+              };
+            };
+
+            systemd.services.diaspora = {
+              description = "Diaspora";
+              wantedBy = [ "multi-user.target" ];
+              after = [
+                "network.target" "redis.service" "postgresql.service"
+              ];
+              wants = [
+                "redis.service" "postgresql.service"
+              ];
+
+              environment.RAILS_ENV = "production";
+              environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+              environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+              environment.EYE_SOCK = cfg.sockets.eye;
+              environment.EYE_PID = cfg.pids.eye;
+
+              path = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby pkgs.curl pkgs.which pkgs.gawk ];
+
+              preStart = ''
+                install -m 0755 -d ${cfg.dataDir}/uploads ${cfg.dataDir}/tmp ${cfg.dataDir}/log
+                install -m 0700 -d ${cfg.dataDir}/tmp/pids
+                if [ ! -f ${cfg.dataDir}/schedule.yml ]; then
+                  echo "{}" > ${cfg.dataDir}/schedule.yml
+                fi
+                ./bin/bundle exec rails db:migrate
+              '';
+
+              script = ''
+                exec ${cfg.workdir}/script/server
+              '';
+
+              serviceConfig = {
+                User = cfg.user;
+                PrivateTmp = true;
+                Restart = "always";
+                Type = "simple";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                StandardInput = "null";
+                KillMode = "control-group";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+          };
+        };
+  };
+}
+
similarity index 77%
rename from pkgs/webapps/etherpad-lite/default.nix
rename to flakes/etherpad-lite/default.nix
index 4327384840be37ad7dc8ec812c368bcf2a5e9e27..1dd5aa4302293ce768e9bc7fd1de9f8f5f5f829b 100644 (file)
@@ -1,7 +1,6 @@
 { varDir ? "/var/lib/etherpad-lite" # if you override this change the StateDirectory in service file too!
 { 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
 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"
   moduleNames = [
     "ep_aa_file_menu_toolbar" "ep_adminpads" "ep_align" "ep_bookmark"
     "ep_clear_formatting" "ep_colors" "ep_comments_page"
@@ -14,9 +13,9 @@ let
   ];
   # nix files are built using node2nix -i node-packages.json
   allModules = lib.attrsets.genAttrs moduleNames
   ];
   # 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:
     withModules = withModules pkg;
   };
   withModules = pkg: toModules:
@@ -29,16 +28,20 @@ let
           ln -s ${varDir}/ep_initialized/${n.packageName} $out/node_modules/${n.packageName}/.ep_initialized
         fi
       '';
           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);
       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 {
       });
     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
       patches = [ ./libreoffice_patch.diff ];
       buildPhase = ''
         touch src/.ep_initialized
@@ -46,18 +49,20 @@ let
       installPhase = ''
         cp -a src/ $out
         '';
       installPhase = ''
         cp -a src/ $out
         '';
-    });
+    };
   }).package;
   package = stdenv.mkDerivation rec {
   }).package;
   package = stdenv.mkDerivation rec {
-    name = (mylibs.fetchedGithub ./etherpad-lite.json).name;
+    name = "etherpad-lite-${src.version}";
     src = node-environment;
     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
     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
   };
 in package
diff --git a/flakes/etherpad-lite/etherpad_cleanup.sql b/flakes/etherpad-lite/etherpad_cleanup.sql
new file mode 100644 (file)
index 0000000..4002715
--- /dev/null
@@ -0,0 +1,30 @@
+DO $$
+  DECLARE todelete record;
+  BEGIN
+    FOR todelete IN
+      select split_part(key, ':', 4) as k from store where key like 'mypads:jobqueue:deletePad:%'
+    LOOP
+      select * from store where key in (select 'readonly2pad:' || split_part(value, '"', 2) from store where key = 'pad2readonly:' || todelete.k);
+      select * from store where key = 'pad2readonly:' || todelete.k;
+      select * from store where key like 'pad:' || todelete.k || ':revs:%';
+      select * from store where key like 'pad:' || todelete.k || ':chats:%';
+    END LOOP;
+  END $$
+
+-- /nix/store/1i77431p6996lbyflpkb803zsiaj24kx-etherpad-lite-1.8.3/node_modules/ep_mypads/scripts/mypads-jobqueue-minion.js
+for toDelete in
+  select split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%'
+loop
+  select * from store where key in (select 'readonly2pad:' || split_part(value, '"', 2) from store where key = 'pad2readonly:' || toDelete);
+  select * from store where key = 'pad2readonly:' || toDelete;
+  select * from store where key like 'pad:' || toDelete || ':revs:%';
+  select * from store where key like 'pad:' || toDelete || ':chats:%';
+end loop
+--select * from store where key in (select 'pad2readonly:' || split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%');
+--
+--delete from store where key in (select 'readonly2pad:' || split_part(value, '"', 2) from store where key in (select 'pad2readonly:' || split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%'))
+--delete from store where key in (select 'pad2readonly:' || split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%');
+--delete from store where key like any(select 'pad:' || split_part(key, ':', 4) || ':revs:%' from store where key like 'mypads:jobqueue:deletePad:%');
+--delete from store where key like any(select 'pad:' || split_part(key, ':', 4) || ':chats:%' from store where key like 'mypads:jobqueue:deletePad:%');
+--delete from store where key like 'mypads:jobqueue:deletePad:%';
+
diff --git a/flakes/etherpad-lite/flake.lock b/flakes/etherpad-lite/flake.lock
new file mode 100644 (file)
index 0000000..19d9ffa
--- /dev/null
@@ -0,0 +1,150 @@
+{
+  "nodes": {
+    "etherpad-lite": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1587951095,
+        "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
+        "owner": "ether",
+        "repo": "etherpad-lite",
+        "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ether",
+        "ref": "1.8.3",
+        "repo": "etherpad-lite",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts",
+        "nixpkgs": "nixpkgs",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "etherpad-lite": "etherpad-lite",
+        "flake-utils": "flake-utils",
+        "mypackages": "mypackages",
+        "nixpkgs": "nixpkgs_2"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/etherpad-lite/flake.nix b/flakes/etherpad-lite/flake.nix
new file mode 100644 (file)
index 0000000..6e0d7db
--- /dev/null
@@ -0,0 +1,227 @@
+{
+  description = "Your self-hosted, globally interconnected microblogging community";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.etherpad-lite = {
+    url = "github:ether/etherpad-lite/1.8.3";
+    flake = false;
+  };
+  inputs.mypackages.url = "path:../mypackages";
+
+  outputs = { self, nixpkgs, etherpad-lite, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.etherpad-lite.original.ref;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.etherpad-lite = callPackage ./. { inherit (mypackages.mylibs) nodeEnv; src = etherpad-lite // { inherit version; }; };
+      defaultPackage = packages.etherpad-lite;
+      legacyPackages.etherpad-lite = packages.etherpad-lite;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+  ) // rec {
+    overlays = {
+      etherpad-lite = final: prev: {
+        etherpad-lite = self.defaultPackage."${final.system}";
+      };
+    };
+    overlay = overlays.etherpad-lite;
+    nixosModule = { lib, pkgs, config, ... }:
+      let
+        name = "etherpad-lite";
+        cfg = config.services.etherpad-lite;
+      in
+        {
+          options.services.etherpad-lite = {
+            enable = lib.mkEnableOption "Enable Etherpad lite’s service";
+            user = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "User account under which Etherpad lite runs";
+            };
+            group = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "Group under which Etherpad lite runs";
+            };
+            dataDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/var/lib/${name}";
+              description = ''
+                The directory where Etherpad lite stores its data.
+              '';
+            };
+            socketsDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/run/${name}";
+              description = ''
+                The directory where Etherpad lite stores its sockets.
+              '';
+            };
+            configFile = lib.mkOption {
+              type = lib.types.path;
+              description = ''
+                The config file path for Etherpad lite.
+                '';
+            };
+            sessionKeyFile = lib.mkOption {
+              type = lib.types.path;
+              description = ''
+                The Session key file path for Etherpad lite.
+                '';
+            };
+            apiKeyFile = lib.mkOption {
+              type = lib.types.path;
+              description = ''
+                The API key file path for Etherpad lite.
+                '';
+            };
+            package = lib.mkOption {
+              type = lib.types.package;
+              default = pkgs.etherpad-lite;
+              description = ''
+                Etherpad lite package to use.
+                '';
+              example = lib.literalExample ''
+                pkgs.webapps.etherpad-lite.withModules (p: [ p.ep_align ]);
+              '';
+            };
+            modules = lib.mkOption {
+              type = lib.types.listOf lib.types.package;
+              default = [];
+              description = ''
+                Etherpad lite modules to use.
+                DEPRECATED: use package directly
+                '';
+            };
+            # Output variables
+            workdir = lib.mkOption {
+              type = lib.types.package;
+              default = cfg.package.withModules (_: cfg.modules);
+              description = ''
+              Adjusted Etherpad lite package with plugins
+              '';
+              readOnly = true;
+            };
+            systemdStateDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if varDir is outside of /var/lib
+              default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+                lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+              description = ''
+              Adjusted Etherpad lite data directory for systemd
+              '';
+              readOnly = true;
+            };
+            systemdRuntimeDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if socketsDir is outside of /run
+              default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+                lib.strings.removePrefix "/run/" cfg.socketsDir;
+              description = ''
+              Adjusted Etherpad lite sockets directory for systemd
+              '';
+              readOnly = true;
+            };
+            sockets = lib.mkOption {
+              type = lib.types.attrsOf lib.types.path;
+              default = {
+                node  = "${cfg.socketsDir}/etherpad-lite.sock";
+              };
+              readOnly = true;
+              description = ''
+                Etherpad lite sockets
+                '';
+            };
+          };
+
+          config = lib.mkIf cfg.enable {
+            nixpkgs.overlays = [ self.overlay ];
+            systemd.services.etherpad-lite-cleanup = {
+              description = "Etherpad-lite cleanup old mypads";
+              after = [ "network.target" "postgresql.service" ];
+              wants = [ "postgresql.service" ];
+
+              environment.NODE_ENV = "production";
+              environment.HOME = cfg.workdir;
+
+              path = [ cfg.workdir.nodejs ];
+
+              script = ''
+                exec ${cfg.workdir.nodejs}/bin/node ${cfg.workdir}/node_modules/ep_mypads/scripts/mypads-jobqueue-minion.js \
+                  --settings ${cfg.configFile} \
+                  --oneshot
+              '';
+
+              serviceConfig = {
+                DynamicUser = true;
+                User = cfg.user;
+                Group = cfg.group;
+                WorkingDirectory = "%T";
+                PrivateTmp = true;
+                NoNewPrivileges = true;
+                PrivateDevices = true;
+                ProtectHome = true;
+                ProtectControlGroups = true;
+                ProtectKernelModules = true;
+                Type = "oneshot";
+              };
+            };
+            systemd.services.etherpad-lite = {
+              description = "Etherpad-lite";
+              wantedBy = [ "multi-user.target" ];
+              after = [ "network.target" "postgresql.service" ];
+              wants = [ "postgresql.service" ];
+
+              environment.NODE_ENV = "production";
+              environment.HOME = cfg.workdir;
+
+              path = [ cfg.workdir.nodejs ];
+
+              script = ''
+                exec ${cfg.workdir.nodejs}/bin/node ${cfg.workdir}/src/node/server.js \
+                  --sessionkey ${cfg.sessionKeyFile} \
+                  --apikey ${cfg.apiKeyFile} \
+                  --settings ${cfg.configFile}
+              '';
+
+              postStart = ''
+                while [ ! -S ${cfg.sockets.node} ]; do
+                  sleep 0.5
+                done
+                chmod a+w ${cfg.sockets.node}
+                '';
+              serviceConfig = {
+                DynamicUser = true;
+                User = cfg.user;
+                Group = cfg.group;
+                WorkingDirectory = cfg.workdir;
+                PrivateTmp = true;
+                NoNewPrivileges = true;
+                PrivateDevices = true;
+                ProtectHome = true;
+                ProtectControlGroups = true;
+                ProtectKernelModules = true;
+                Restart = "always";
+                Type = "simple";
+                TimeoutSec = 60;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                StateDirectory= cfg.systemdStateDirectory;
+                ExecStartPre = [
+                  "+${pkgs.coreutils}/bin/install -d -m 0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dataDir}/var ${cfg.dataDir}/ep_initialized"
+                  "+${pkgs.coreutils}/bin/chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} ${cfg.configFile} ${cfg.sessionKeyFile} ${cfg.apiKeyFile}"
+                ];
+              };
+            };
+
+          };
+        };
+      };
+}
+
+
index 29ea428dba533a64b88f1cf73dd0ccc32f164954..3be566d9fb0d08e64d5bf7f1238381a28b1c447b 100644 (file)
@@ -2,6 +2,8 @@
   description = "Module to watch fo file changes to force restart systemd service";
   outputs = { self }: {
     nixosModule = { config, lib, pkgs, ... }: let cfg = config.services.filesWatcher; in with lib; {
   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 = {};
       options = {
         services.filesWatcher = with lib.types; mkOption {
           default = {};
diff --git a/flakes/flake.lock b/flakes/flake.lock
new file mode 100644 (file)
index 0000000..c65312c
--- /dev/null
@@ -0,0 +1,9669 @@
+{
+  "nodes": {
+    "backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_6",
+        "nixpkgs": "nixpkgs_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_8",
+        "nixpkgs": "nixpkgs_17"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_3": {
+      "inputs": {
+        "flake-utils": "flake-utils_20",
+        "nixpkgs": "nixpkgs_33"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_4": {
+      "inputs": {
+        "flake-utils": "flake-utils_34",
+        "nixpkgs": "nixpkgs_56"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_5": {
+      "inputs": {
+        "flake-utils": "flake-utils_37",
+        "nixpkgs": "nixpkgs_64"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_6": {
+      "inputs": {
+        "flake-utils": "flake-utils_39",
+        "nixpkgs": "nixpkgs_71"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "backports_7": {
+      "inputs": {
+        "flake-utils": "flake-utils_61",
+        "nixpkgs": "nixpkgs_100"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "buildslist": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585697026,
+        "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
+        "ref": "master",
+        "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
+        "revCount": 4,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      }
+    },
+    "buildslist_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585697026,
+        "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
+        "ref": "master",
+        "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
+        "revCount": 4,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      }
+    },
+    "chatons": {
+      "inputs": {
+        "environment": "environment"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "chatons_2": {
+      "inputs": {
+        "environment": "environment_18"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "colmena": {
+      "inputs": {
+        "flake-compat": "flake-compat",
+        "flake-utils": "flake-utils_3",
+        "nixpkgs": "nixpkgs_3",
+        "stable": "stable"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_2": {
+      "inputs": {
+        "flake-compat": "flake-compat_2",
+        "flake-utils": "flake-utils_7",
+        "nixpkgs": "nixpkgs_12",
+        "stable": "stable_2"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_3": {
+      "inputs": {
+        "flake-compat": "flake-compat_3",
+        "flake-utils": "flake-utils_10",
+        "nixpkgs": "nixpkgs_19",
+        "stable": "stable_3"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_4": {
+      "inputs": {
+        "flake-compat": "flake-compat_4",
+        "flake-utils": "flake-utils_32",
+        "nixpkgs": "nixpkgs_50",
+        "stable": "stable_4"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_5": {
+      "inputs": {
+        "flake-compat": "flake-compat_5",
+        "flake-utils": "flake-utils_35",
+        "nixpkgs": "nixpkgs_58",
+        "stable": "stable_5"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_6": {
+      "inputs": {
+        "flake-compat": "flake-compat_6",
+        "flake-utils": "flake-utils_38",
+        "nixpkgs": "nixpkgs_66",
+        "stable": "stable_6"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "colmena_7": {
+      "inputs": {
+        "flake-compat": "flake-compat_7",
+        "flake-utils": "flake-utils_45",
+        "nixpkgs": "nixpkgs_80",
+        "stable": "stable_7"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "copanier": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1633895178,
+        "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
+        "type": "github"
+      },
+      "original": {
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "type": "github"
+      }
+    },
+    "copanier_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1633895178,
+        "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
+        "type": "github"
+      },
+      "original": {
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "type": "github"
+      }
+    },
+    "diaspora": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1551139311,
+        "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
+        "owner": "diaspora",
+        "repo": "diaspora",
+        "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
+        "type": "github"
+      },
+      "original": {
+        "owner": "diaspora",
+        "ref": "v0.7.10.0",
+        "repo": "diaspora",
+        "type": "github"
+      }
+    },
+    "diaspora_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1551139311,
+        "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
+        "owner": "diaspora",
+        "repo": "diaspora",
+        "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
+        "type": "github"
+      },
+      "original": {
+        "owner": "diaspora",
+        "ref": "v0.7.10.0",
+        "repo": "diaspora",
+        "type": "github"
+      }
+    },
+    "disko": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_4"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_2": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_13"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_3": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_20"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_4": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_51"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_5": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_59"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_6": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_67"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "disko_7": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_81"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "dns-nix": {
+      "inputs": {
+        "flake-utils": "flake-utils_9",
+        "nixpkgs": [
+          "n-eldiron",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1635273082,
+        "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=",
+        "owner": "kirelagin",
+        "repo": "dns.nix",
+        "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "kirelagin",
+        "repo": "dns.nix",
+        "type": "github"
+      }
+    },
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_16": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_17": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_18": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_19": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_20": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_21": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_22": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_23": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_24": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_25": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_26": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_27": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_28": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_29": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_30": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_31": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_32": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_33": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "etherpad-lite": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1587951095,
+        "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
+        "owner": "ether",
+        "repo": "etherpad-lite",
+        "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ether",
+        "ref": "1.8.3",
+        "repo": "etherpad-lite",
+        "type": "github"
+      }
+    },
+    "etherpad-lite_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1587951095,
+        "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
+        "owner": "ether",
+        "repo": "etherpad-lite",
+        "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ether",
+        "ref": "1.8.3",
+        "repo": "etherpad-lite",
+        "type": "github"
+      }
+    },
+    "files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "flake-compat": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_7": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_2"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_10": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_13"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_11": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_15"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_12": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_16"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_13": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_18"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_14": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_19"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_15": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_20"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_16": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_21"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_17": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_22"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_18": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_23"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_19": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_24"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_2": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_3"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_20": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_25"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_21": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_27"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_22": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_28"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_3": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_5"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_4": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_6"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_5": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_7"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_6": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_9"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_7": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_10"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_8": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_11"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_9": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_12"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_10": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_11": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_12": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_13": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_14": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_15": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_16": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_17": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_18": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_19": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_2": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_20": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_21": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_22": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_23": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_24": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_25": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_26": {
+      "locked": {
+        "lastModified": 1649676176,
+        "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_27": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_28": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_29": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_3": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_30": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_31": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_32": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_33": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_34": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_35": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_36": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_37": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_38": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_39": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_4": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_40": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_41": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_42": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_43": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_44": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_45": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_46": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_47": {
+      "locked": {
+        "lastModified": 1649676176,
+        "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_48": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_49": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_5": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_50": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_51": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_52": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_53": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_54": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_55": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_56": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_57": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_58": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_59": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_6": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_60": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_61": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_62": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_63": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_7": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_8": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_9": {
+      "locked": {
+        "lastModified": 1614513358,
+        "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "grocy": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585166193,
+        "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      }
+    },
+    "grocy_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585166193,
+        "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      }
+    },
+    "impermanence": {
+      "locked": {
+        "lastModified": 1684264534,
+        "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=",
+        "owner": "nix-community",
+        "repo": "impermanence",
+        "rev": "89253fb1518063556edd5e54509c30ac3089d5e6",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "ref": "master",
+        "repo": "impermanence",
+        "type": "github"
+      }
+    },
+    "landing-page": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1691524124,
+        "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=",
+        "ref": "main",
+        "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf",
+        "revCount": 573,
+        "type": "git",
+        "url": "https://github.com/bastienwirtz/homer.git"
+      },
+      "original": {
+        "ref": "main",
+        "type": "git",
+        "url": "https://github.com/bastienwirtz/homer.git"
+      }
+    },
+    "loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "loginctl-linger_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "loginctl-linger_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "mail-relay": {
+      "inputs": {
+        "environment": "environment_3",
+        "secrets": "secrets"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      }
+    },
+    "mail-relay_2": {
+      "inputs": {
+        "environment": "environment_20",
+        "secrets": "secrets_15"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      }
+    },
+    "mastodon": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1582790581,
+        "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
+        "owner": "tootsuite",
+        "repo": "mastodon",
+        "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tootsuite",
+        "ref": "v2.9.4",
+        "repo": "mastodon",
+        "type": "github"
+      }
+    },
+    "mastodon_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1582790581,
+        "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
+        "owner": "tootsuite",
+        "repo": "mastodon",
+        "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tootsuite",
+        "ref": "v2.9.4",
+        "repo": "mastodon",
+        "type": "github"
+      }
+    },
+    "mediagoblin": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1531090939,
+        "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "revCount": 4805,
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      },
+      "original": {
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      }
+    },
+    "mediagoblin_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1531090939,
+        "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "revCount": 4805,
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      },
+      "original": {
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      }
+    },
+    "milters": {
+      "inputs": {
+        "environment": "environment_4",
+        "files-watcher": "files-watcher",
+        "openarc": "openarc",
+        "opendmarc": "opendmarc",
+        "secrets": "secrets_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      }
+    },
+    "monitoring": {
+      "inputs": {
+        "environment": "environment_5",
+        "naemon": "naemon",
+        "nixpkgs-lib": "nixpkgs-lib",
+        "secrets": "secrets_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "monitoring_2": {
+      "inputs": {
+        "environment": "environment_9",
+        "naemon": "naemon_2",
+        "nixpkgs-lib": "nixpkgs-lib_4",
+        "secrets": "secrets_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "monitoring_3": {
+      "inputs": {
+        "environment": "environment_21",
+        "naemon": "naemon_4",
+        "nixpkgs-lib": "nixpkgs-lib_14",
+        "secrets": "secrets_16"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "monitoring_4": {
+      "inputs": {
+        "environment": "environment_24",
+        "naemon": "naemon_5",
+        "nixpkgs-lib": "nixpkgs-lib_17",
+        "secrets": "secrets_18"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "multi-apache-container": {
+      "inputs": {
+        "files-watcher": "files-watcher_11",
+        "myuids": "myuids_25"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      }
+    },
+    "my-lib": {
+      "inputs": {
+        "colmena": "colmena",
+        "disko": "disko",
+        "flake-parts": "flake-parts",
+        "nixos-anywhere": "nixos-anywhere",
+        "nixpkgs": "nixpkgs_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_2": {
+      "inputs": {
+        "colmena": "colmena_2",
+        "disko": "disko_2",
+        "flake-parts": "flake-parts_3",
+        "nixos-anywhere": "nixos-anywhere_2",
+        "nixpkgs": "nixpkgs_15"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_3": {
+      "inputs": {
+        "colmena": "colmena_3",
+        "disko": "disko_3",
+        "flake-parts": "flake-parts_5",
+        "nixos-anywhere": "nixos-anywhere_3",
+        "nixpkgs": "nixpkgs_22"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_4": {
+      "inputs": {
+        "colmena": "colmena_4",
+        "disko": "disko_4",
+        "flake-parts": "flake-parts_11",
+        "nixos-anywhere": "nixos-anywhere_4",
+        "nixpkgs": "nixpkgs_53"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_5": {
+      "inputs": {
+        "colmena": "colmena_5",
+        "disko": "disko_5",
+        "flake-parts": "flake-parts_13",
+        "nixos-anywhere": "nixos-anywhere_5",
+        "nixpkgs": "nixpkgs_61"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "my-lib_6": {
+      "inputs": {
+        "colmena": "colmena_6",
+        "disko": "disko_6",
+        "flake-parts": "flake-parts_15",
+        "nixos-anywhere": "nixos-anywhere_6",
+        "nixpkgs": "nixpkgs_69"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_2",
+        "nixpkgs": "nixpkgs_11",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_10": {
+      "inputs": {
+        "flake-parts": "flake-parts_17",
+        "nixpkgs": "nixpkgs_76",
+        "webapps-ttrss": "webapps-ttrss_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_11": {
+      "inputs": {
+        "flake-parts": "flake-parts_18",
+        "nixpkgs": "nixpkgs_78",
+        "webapps-ttrss": "webapps-ttrss_12"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_12": {
+      "inputs": {
+        "flake-parts": "flake-parts_21",
+        "nixpkgs": "nixpkgs_101",
+        "webapps-ttrss": "webapps-ttrss_14"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_13": {
+      "inputs": {
+        "flake-parts": "flake-parts_22",
+        "nixpkgs": "nixpkgs_102",
+        "webapps-ttrss": "webapps-ttrss_15"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_2": {
+      "inputs": {
+        "flake-parts": "flake-parts_4",
+        "nixpkgs": "nixpkgs_18",
+        "webapps-ttrss": "webapps-ttrss_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_3": {
+      "inputs": {
+        "flake-parts": "flake-parts_6",
+        "nixpkgs": "nixpkgs_34",
+        "webapps-ttrss": "webapps-ttrss_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_4": {
+      "inputs": {
+        "flake-parts": "flake-parts_7",
+        "nixpkgs": "nixpkgs_37",
+        "webapps-ttrss": "webapps-ttrss_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_5": {
+      "inputs": {
+        "flake-parts": "flake-parts_8",
+        "nixpkgs": "nixpkgs_39",
+        "webapps-ttrss": "webapps-ttrss_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_6": {
+      "inputs": {
+        "flake-parts": "flake-parts_10",
+        "nixpkgs": "nixpkgs_47",
+        "webapps-ttrss": "webapps-ttrss_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_7": {
+      "inputs": {
+        "flake-parts": "flake-parts_12",
+        "nixpkgs": "nixpkgs_57",
+        "webapps-ttrss": "webapps-ttrss_8"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_8": {
+      "inputs": {
+        "flake-parts": "flake-parts_14",
+        "nixpkgs": "nixpkgs_65",
+        "webapps-ttrss": "webapps-ttrss_9"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_9": {
+      "inputs": {
+        "flake-parts": "flake-parts_16",
+        "nixpkgs": "nixpkgs_72",
+        "webapps-ttrss": "webapps-ttrss_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_16": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_17": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_18": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_19": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_20": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_21": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_22": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_23": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_24": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_25": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_26": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_27": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_28": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_29": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_30": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_31": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_32": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_33": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_34": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_35": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_36": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_37": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_38": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_39": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_40": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_41": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_42": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "n-backup-2": {
+      "inputs": {
+        "chatons": "chatons",
+        "environment": "environment_2",
+        "loginctl-linger": "loginctl-linger",
+        "mail-relay": "mail-relay",
+        "milters": "milters",
+        "monitoring": "monitoring",
+        "my-lib": "my-lib",
+        "myuids": "myuids_3",
+        "nixpkgs": "nixpkgs_7",
+        "openarc": "openarc_3",
+        "opendmarc": "opendmarc_2",
+        "openldap": "openldap",
+        "rsync_backup": "rsync_backup",
+        "secrets": "secrets_6",
+        "system": "system"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=",
+        "path": "../systems/backup-2",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/backup-2",
+        "type": "path"
+      }
+    },
+    "n-dilion": {
+      "inputs": {
+        "environment": "environment_8",
+        "files-watcher": "files-watcher_4",
+        "loginctl-linger": "loginctl-linger_2",
+        "monitoring": "monitoring_2",
+        "my-lib": "my-lib_2",
+        "myuids": "myuids_7",
+        "nixpkgs": "nixpkgs_16",
+        "secrets": "secrets_8",
+        "ssh": "ssh",
+        "system": "system_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=",
+        "path": "../systems/dilion",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/dilion",
+        "type": "path"
+      }
+    },
+    "n-eldiron": {
+      "inputs": {
+        "dns-nix": "dns-nix",
+        "my-lib": "my-lib_3",
+        "nixpkgs": "nixpkgs_23",
+        "private-buildbot": "private-buildbot",
+        "private-chatons": "private-chatons",
+        "private-environment": "private-environment",
+        "private-milters": "private-milters",
+        "private-monitoring": "private-monitoring",
+        "private-openarc": "private-openarc",
+        "private-opendmarc": "private-opendmarc",
+        "private-openldap": "private-openldap",
+        "private-paste": "private-paste",
+        "private-peertube": "private-peertube",
+        "private-php": "private-php",
+        "private-ssh": "private-ssh",
+        "private-system": "private-system",
+        "public-copanier": "public-copanier",
+        "public-diaspora": "public-diaspora",
+        "public-etherpad-lite": "public-etherpad-lite",
+        "public-fiche": "public-fiche",
+        "public-files-watcher": "public-files-watcher",
+        "public-grocy": "public-grocy",
+        "public-loginctl-linger": "public-loginctl-linger",
+        "public-mastodon": "public-mastodon",
+        "public-mediagoblin": "public-mediagoblin",
+        "public-multi-apache-container": "public-multi-apache-container",
+        "public-mypackages": "public-mypackages",
+        "public-myuids": "public-myuids",
+        "public-openarc": "public-openarc",
+        "public-opendmarc": "public-opendmarc",
+        "public-peertube": "public-peertube",
+        "public-secrets": "public-secrets",
+        "public-surfer": "public-surfer",
+        "public-taskwarrior-web": "public-taskwarrior-web"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=",
+        "path": "../systems/eldiron",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/eldiron",
+        "type": "path"
+      }
+    },
+    "n-monitoring-1": {
+      "inputs": {
+        "chatons": "chatons_2",
+        "environment": "environment_19",
+        "files-watcher": "files-watcher_9",
+        "loginctl-linger": "loginctl-linger_3",
+        "mail-relay": "mail-relay_2",
+        "monitoring": "monitoring_3",
+        "my-lib": "my-lib_4",
+        "myuids": "myuids_23",
+        "nixpkgs": "nixpkgs_54",
+        "php": "php",
+        "secrets": "secrets_17",
+        "system": "system_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=",
+        "path": "../systems/monitoring-1",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/monitoring-1",
+        "type": "path"
+      }
+    },
+    "n-quatresaisons": {
+      "inputs": {
+        "environment": "environment_23",
+        "files-watcher": "files-watcher_10",
+        "landing-page": "landing-page",
+        "monitoring": "monitoring_4",
+        "multi-apache-container": "multi-apache-container",
+        "my-lib": "my-lib_5",
+        "myuids": "myuids_26",
+        "nixpkgs": "nixpkgs_62",
+        "php": "php_2",
+        "secrets": "secrets_19",
+        "system": "system_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=",
+        "path": "../systems/quatresaisons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/quatresaisons",
+        "type": "path"
+      }
+    },
+    "n-zoldene": {
+      "inputs": {
+        "impermanence": "impermanence",
+        "my-lib": "my-lib_6",
+        "nixpkgs": "nixpkgs_70",
+        "private-environment": "private-environment_2",
+        "private-system": "private-system_2",
+        "public-secrets": "public-secrets_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=",
+        "path": "../systems/zoldene",
+        "type": "path"
+      },
+      "original": {
+        "path": "../systems/zoldene",
+        "type": "path"
+      }
+    },
+    "naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "naemon_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "nixos-2305": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_2": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_3": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_4": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_5": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_6": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-2305_7": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere": {
+      "inputs": {
+        "disko": [
+          "n-backup-2",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "n-backup-2",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305",
+        "nixos-images": "nixos-images",
+        "nixpkgs": "nixpkgs_5",
+        "treefmt-nix": "treefmt-nix"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_2": {
+      "inputs": {
+        "disko": [
+          "n-dilion",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "n-dilion",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_2",
+        "nixos-images": "nixos-images_2",
+        "nixpkgs": "nixpkgs_14",
+        "treefmt-nix": "treefmt-nix_2"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_3": {
+      "inputs": {
+        "disko": [
+          "n-eldiron",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "n-eldiron",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_3",
+        "nixos-images": "nixos-images_3",
+        "nixpkgs": "nixpkgs_21",
+        "treefmt-nix": "treefmt-nix_3"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_4": {
+      "inputs": {
+        "disko": [
+          "n-monitoring-1",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "n-monitoring-1",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_4",
+        "nixos-images": "nixos-images_4",
+        "nixpkgs": "nixpkgs_52",
+        "treefmt-nix": "treefmt-nix_4"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_5": {
+      "inputs": {
+        "disko": [
+          "n-quatresaisons",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "n-quatresaisons",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_5",
+        "nixos-images": "nixos-images_5",
+        "nixpkgs": "nixpkgs_60",
+        "treefmt-nix": "treefmt-nix_5"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_6": {
+      "inputs": {
+        "disko": [
+          "n-zoldene",
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "n-zoldene",
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_6",
+        "nixos-images": "nixos-images_6",
+        "nixpkgs": "nixpkgs_68",
+        "treefmt-nix": "treefmt-nix_6"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere_7": {
+      "inputs": {
+        "disko": [
+          "s-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "s-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305_7",
+        "nixos-images": "nixos-images_7",
+        "nixpkgs": "nixpkgs_82",
+        "treefmt-nix": "treefmt-nix_7"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-images": {
+      "inputs": {
+        "nixos-2305": [
+          "n-backup-2",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "n-backup-2",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_2": {
+      "inputs": {
+        "nixos-2305": [
+          "n-dilion",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "n-dilion",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_3": {
+      "inputs": {
+        "nixos-2305": [
+          "n-eldiron",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "n-eldiron",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_4": {
+      "inputs": {
+        "nixos-2305": [
+          "n-monitoring-1",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "n-monitoring-1",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_5": {
+      "inputs": {
+        "nixos-2305": [
+          "n-quatresaisons",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "n-quatresaisons",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_6": {
+      "inputs": {
+        "nixos-2305": [
+          "n-zoldene",
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "n-zoldene",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixos-images_7": {
+      "inputs": {
+        "nixos-2305": [
+          "s-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "s-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_10": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_11": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_12": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_13": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_14": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_15": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_16": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_17": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_18": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_19": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_2": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_20": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_21": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_22": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_23": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_24": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_25": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_26": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_27": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_28": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_3": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_4": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_5": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_6": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_7": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_8": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_9": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_10": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_100": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_101": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_102": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_103": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_104": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_11": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_12": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_13": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_14": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_15": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_16": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_17": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_18": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_19": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_20": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_21": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_22": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_23": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_24": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_25": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_26": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_27": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_28": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_29": {
+      "locked": {
+        "lastModified": 1631570365,
+        "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_3": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_30": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_31": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_32": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_33": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_34": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_35": {
+      "locked": {
+        "lastModified": 1633901457,
+        "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_36": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_37": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_38": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_39": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_4": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_40": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_41": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_42": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_43": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_44": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_45": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_46": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_47": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_48": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_49": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_5": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_50": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_51": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_52": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_53": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_54": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_55": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_56": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_57": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_58": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_59": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_6": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_60": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_61": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_62": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_63": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_64": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_65": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_66": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_67": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_68": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_69": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_7": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_70": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_71": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_72": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_73": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_74": {
+      "locked": {
+        "lastModified": 1633901457,
+        "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_75": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_76": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_77": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_78": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_79": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_8": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_80": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_81": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_82": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_83": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_84": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_85": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_86": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_87": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_88": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_89": {
+      "locked": {
+        "lastModified": 1631570365,
+        "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_9": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_90": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_91": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_92": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_93": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_94": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_95": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_96": {
+      "locked": {
+        "lastModified": 1631570365,
+        "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_97": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_98": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_99": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs",
+        "openarc": "openarc_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_10": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_11": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_12": {
+      "inputs": {
+        "flake-utils": "flake-utils_53",
+        "myuids": "myuids_36",
+        "nixpkgs": "nixpkgs_92",
+        "openarc": "openarc_13"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_13": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_14": {
+      "inputs": {
+        "flake-utils": "flake-utils_55",
+        "myuids": "myuids_38",
+        "nixpkgs": "nixpkgs_94",
+        "openarc": "openarc_15"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_15": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_3": {
+      "inputs": {
+        "files-watcher": "files-watcher_2",
+        "openarc": "openarc_4",
+        "secrets": "secrets_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      }
+    },
+    "openarc_4": {
+      "inputs": {
+        "flake-utils": "flake-utils_4",
+        "myuids": "myuids_4",
+        "nixpkgs": "nixpkgs_8",
+        "openarc": "openarc_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_6": {
+      "inputs": {
+        "flake-utils": "flake-utils_12",
+        "myuids": "myuids_9",
+        "nixpkgs": "nixpkgs_25",
+        "openarc": "openarc_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_7": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_8": {
+      "inputs": {
+        "flake-utils": "flake-utils_14",
+        "myuids": "myuids_11",
+        "nixpkgs": "nixpkgs_27",
+        "openarc": "openarc_9"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_9": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_2",
+        "myuids": "myuids_2",
+        "nixpkgs": "nixpkgs_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_2": {
+      "inputs": {
+        "environment": "environment_6",
+        "files-watcher": "files-watcher_3",
+        "opendmarc": "opendmarc_3",
+        "secrets": "secrets_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_3": {
+      "inputs": {
+        "flake-utils": "flake-utils_5",
+        "myuids": "myuids_5",
+        "nixpkgs": "nixpkgs_9"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_4": {
+      "inputs": {
+        "flake-utils": "flake-utils_13",
+        "myuids": "myuids_10",
+        "nixpkgs": "nixpkgs_26"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_5": {
+      "inputs": {
+        "flake-utils": "flake-utils_15",
+        "myuids": "myuids_12",
+        "nixpkgs": "nixpkgs_28"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_6": {
+      "inputs": {
+        "flake-utils": "flake-utils_54",
+        "myuids": "myuids_37",
+        "nixpkgs": "nixpkgs_93"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_7": {
+      "inputs": {
+        "flake-utils": "flake-utils_56",
+        "myuids": "myuids_39",
+        "nixpkgs": "nixpkgs_95"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "openldap": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      }
+    },
+    "paste": {
+      "inputs": {
+        "flake-utils": "flake-utils_16",
+        "nixpkgs": "nixpkgs_29"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
+        "path": "../../paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../paste",
+        "type": "path"
+      }
+    },
+    "paste_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_57",
+        "nixpkgs": "nixpkgs_96"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
+        "path": "../../paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../paste",
+        "type": "path"
+      }
+    },
+    "peertube": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1611184594,
+        "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
+        "ref": "gitolite_local/open_instance",
+        "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
+        "revCount": 6316,
+        "type": "git",
+        "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1611184594,
+        "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
+        "ref": "gitolite_local/open_instance",
+        "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
+        "revCount": 6316,
+        "type": "git",
+        "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_open_instance": {
+      "inputs": {
+        "flake-utils": "flake-utils_17",
+        "myuids": "myuids_13",
+        "nixpkgs": "nixpkgs_30",
+        "peertube": "peertube"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "peertube_open_instance_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_58",
+        "myuids": "myuids_40",
+        "nixpkgs": "nixpkgs_97",
+        "peertube": "peertube_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "peertube_origin": {
+      "inputs": {
+        "flake-utils": "flake-utils_18",
+        "myuids": "myuids_14",
+        "nixpkgs": "nixpkgs_31",
+        "peertube": "peertube_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "peertube_origin_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_59",
+        "myuids": "myuids_41",
+        "nixpkgs": "nixpkgs_98",
+        "peertube": "peertube_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "php": {
+      "inputs": {
+        "flake-utils": "flake-utils_33",
+        "nixpkgs": "nixpkgs_55",
+        "nixpkgs-4": "nixpkgs-4_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "php_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_36",
+        "nixpkgs": "nixpkgs_63",
+        "nixpkgs-4": "nixpkgs-4_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "private-buildbot": {
+      "inputs": {
+        "buildslist": "buildslist",
+        "flake-utils": "flake-utils_11",
+        "nixpkgs": "nixpkgs_24"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
+        "path": "../../flakes/private/buildbot",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/buildbot",
+        "type": "path"
+      }
+    },
+    "private-chatons": {
+      "inputs": {
+        "environment": "environment_12"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "private-environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "private-environment_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "private-milters": {
+      "inputs": {
+        "environment": "environment_13",
+        "files-watcher": "files-watcher_5",
+        "openarc": "openarc_6",
+        "opendmarc": "opendmarc_4",
+        "secrets": "secrets_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      }
+    },
+    "private-monitoring": {
+      "inputs": {
+        "environment": "environment_14",
+        "naemon": "naemon_3",
+        "nixpkgs-lib": "nixpkgs-lib_8",
+        "secrets": "secrets_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "private-openarc": {
+      "inputs": {
+        "files-watcher": "files-watcher_6",
+        "openarc": "openarc_8",
+        "secrets": "secrets_12"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      }
+    },
+    "private-opendmarc": {
+      "inputs": {
+        "environment": "environment_15",
+        "files-watcher": "files-watcher_7",
+        "opendmarc": "opendmarc_5",
+        "secrets": "secrets_13"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      }
+    },
+    "private-openldap": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      }
+    },
+    "private-paste": {
+      "inputs": {
+        "paste": "paste"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
+        "path": "../../flakes/private/paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/paste",
+        "type": "path"
+      }
+    },
+    "private-peertube": {
+      "inputs": {
+        "peertube_open_instance": "peertube_open_instance",
+        "peertube_origin": "peertube_origin"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
+        "path": "../../flakes/private/peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/peertube",
+        "type": "path"
+      }
+    },
+    "private-php": {
+      "inputs": {
+        "flake-utils": "flake-utils_19",
+        "nixpkgs": "nixpkgs_32",
+        "nixpkgs-4": "nixpkgs-4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "private-ssh": {
+      "inputs": {
+        "environment": "environment_16",
+        "secrets": "secrets_14"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      }
+    },
+    "private-system": {
+      "inputs": {
+        "backports": "backports_3",
+        "environment": "environment_17",
+        "mypackages": "mypackages_3",
+        "myuids": "myuids_15",
+        "secrets-public": "secrets-public_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "private-system_2": {
+      "inputs": {
+        "backports": "backports_6",
+        "environment": "environment_26",
+        "mypackages": "mypackages_9",
+        "myuids": "myuids_28",
+        "secrets-public": "secrets-public_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "public-copanier": {
+      "inputs": {
+        "copanier": "copanier",
+        "flake-utils": "flake-utils_21",
+        "nixpkgs": "nixpkgs_35"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
+        "path": "../../flakes/copanier",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/copanier",
+        "type": "path"
+      }
+    },
+    "public-diaspora": {
+      "inputs": {
+        "diaspora": "diaspora",
+        "flake-utils": "flake-utils_22",
+        "myuids": "myuids_16",
+        "nixpkgs": "nixpkgs_36"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
+        "path": "../../flakes/diaspora",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/diaspora",
+        "type": "path"
+      }
+    },
+    "public-etherpad-lite": {
+      "inputs": {
+        "etherpad-lite": "etherpad-lite",
+        "flake-utils": "flake-utils_23",
+        "mypackages": "mypackages_4",
+        "nixpkgs": "nixpkgs_38"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
+        "path": "../../flakes/etherpad-lite",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/etherpad-lite",
+        "type": "path"
+      }
+    },
+    "public-fiche": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
+        "path": "../../flakes/fiche",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/fiche",
+        "type": "path"
+      }
+    },
+    "public-files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "public-grocy": {
+      "inputs": {
+        "flake-utils": "flake-utils_24",
+        "grocy": "grocy",
+        "mypackages": "mypackages_5",
+        "nixpkgs": "nixpkgs_40"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
+        "path": "../../flakes/grocy",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/grocy",
+        "type": "path"
+      }
+    },
+    "public-loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "public-mastodon": {
+      "inputs": {
+        "flake-utils": "flake-utils_25",
+        "mastodon": "mastodon",
+        "myuids": "myuids_17",
+        "nixpkgs": "nixpkgs_41"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
+        "path": "../../flakes/mastodon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mastodon",
+        "type": "path"
+      }
+    },
+    "public-mediagoblin": {
+      "inputs": {
+        "flake-utils": "flake-utils_26",
+        "mediagoblin": "mediagoblin",
+        "myuids": "myuids_18",
+        "nixpkgs": "nixpkgs_42"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
+        "path": "../../flakes/mediagoblin",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mediagoblin",
+        "type": "path"
+      }
+    },
+    "public-multi-apache-container": {
+      "inputs": {
+        "files-watcher": "files-watcher_8",
+        "myuids": "myuids_19"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      }
+    },
+    "public-mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_9",
+        "nixpkgs": "nixpkgs_43",
+        "webapps-ttrss": "webapps-ttrss_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../flakes/mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mypackages",
+        "type": "path"
+      }
+    },
+    "public-myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "public-openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_27",
+        "myuids": "myuids_20",
+        "nixpkgs": "nixpkgs_44",
+        "openarc": "openarc_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../flakes/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/openarc",
+        "type": "path"
+      }
+    },
+    "public-opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_28",
+        "myuids": "myuids_21",
+        "nixpkgs": "nixpkgs_45"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../flakes/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/opendmarc",
+        "type": "path"
+      }
+    },
+    "public-peertube": {
+      "inputs": {
+        "flake-utils": "flake-utils_29",
+        "myuids": "myuids_22",
+        "nixpkgs": "nixpkgs_46",
+        "peertube": "peertube_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "../../flakes/peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/peertube",
+        "type": "path"
+      }
+    },
+    "public-secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "public-secrets_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "public-surfer": {
+      "inputs": {
+        "flake-utils": "flake-utils_30",
+        "mypackages": "mypackages_6",
+        "nixpkgs": "nixpkgs_48",
+        "surfer": "surfer"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
+        "path": "../../flakes/surfer",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/surfer",
+        "type": "path"
+      }
+    },
+    "public-taskwarrior-web": {
+      "inputs": {
+        "flake-utils": "flake-utils_31",
+        "nixpkgs": "nixpkgs_49",
+        "taskwarrior-web": "taskwarrior-web"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
+        "path": "../../flakes/taskwarrior-web",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/taskwarrior-web",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "n-backup-2": "n-backup-2",
+        "n-dilion": "n-dilion",
+        "n-eldiron": "n-eldiron",
+        "n-monitoring-1": "n-monitoring-1",
+        "n-quatresaisons": "n-quatresaisons",
+        "n-zoldene": "n-zoldene",
+        "s-backports": "s-backports",
+        "s-copanier": "s-copanier",
+        "s-diaspora": "s-diaspora",
+        "s-etherpad-lite": "s-etherpad-lite",
+        "s-fiche": "s-fiche",
+        "s-files-watcher": "s-files-watcher",
+        "s-grocy": "s-grocy",
+        "s-lib": "s-lib",
+        "s-loginctl-linger": "s-loginctl-linger",
+        "s-mastodon": "s-mastodon",
+        "s-mediagoblin": "s-mediagoblin",
+        "s-multi-apache-container": "s-multi-apache-container",
+        "s-mypackages": "s-mypackages",
+        "s-myuids": "s-myuids",
+        "s-naemon": "s-naemon",
+        "s-openarc": "s-openarc",
+        "s-opendmarc": "s-opendmarc",
+        "s-paste": "s-paste",
+        "s-peertube": "s-peertube",
+        "s-private-buildbot": "s-private-buildbot",
+        "s-private-chatons": "s-private-chatons",
+        "s-private-environment": "s-private-environment",
+        "s-private-mail-relay": "s-private-mail-relay",
+        "s-private-milters": "s-private-milters",
+        "s-private-monitoring": "s-private-monitoring",
+        "s-private-openarc": "s-private-openarc",
+        "s-private-opendmarc": "s-private-opendmarc",
+        "s-private-openldap": "s-private-openldap",
+        "s-private-paste": "s-private-paste",
+        "s-private-peertube": "s-private-peertube",
+        "s-private-php": "s-private-php",
+        "s-private-ssh": "s-private-ssh",
+        "s-private-system": "s-private-system",
+        "s-rsync_backup": "s-rsync_backup",
+        "s-secrets": "s-secrets",
+        "s-surfer": "s-surfer",
+        "s-taskwarrior-web": "s-taskwarrior-web",
+        "secrets": "secrets_26"
+      }
+    },
+    "rsync_backup": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
+        "path": "../../flakes/rsync_backup",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/rsync_backup",
+        "type": "path"
+      }
+    },
+    "s-backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_40",
+        "nixpkgs": "nixpkgs_73"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "./backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "./backports",
+        "type": "path"
+      }
+    },
+    "s-copanier": {
+      "inputs": {
+        "copanier": "copanier_2",
+        "flake-utils": "flake-utils_41",
+        "nixpkgs": "nixpkgs_74"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
+        "path": "./copanier",
+        "type": "path"
+      },
+      "original": {
+        "path": "./copanier",
+        "type": "path"
+      }
+    },
+    "s-diaspora": {
+      "inputs": {
+        "diaspora": "diaspora_2",
+        "flake-utils": "flake-utils_42",
+        "myuids": "myuids_29",
+        "nixpkgs": "nixpkgs_75"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
+        "path": "./diaspora",
+        "type": "path"
+      },
+      "original": {
+        "path": "./diaspora",
+        "type": "path"
+      }
+    },
+    "s-etherpad-lite": {
+      "inputs": {
+        "etherpad-lite": "etherpad-lite_2",
+        "flake-utils": "flake-utils_43",
+        "mypackages": "mypackages_10",
+        "nixpkgs": "nixpkgs_77"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
+        "path": "./etherpad-lite",
+        "type": "path"
+      },
+      "original": {
+        "path": "./etherpad-lite",
+        "type": "path"
+      }
+    },
+    "s-fiche": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
+        "path": "./fiche",
+        "type": "path"
+      },
+      "original": {
+        "path": "./fiche",
+        "type": "path"
+      }
+    },
+    "s-files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "./files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "./files-watcher",
+        "type": "path"
+      }
+    },
+    "s-grocy": {
+      "inputs": {
+        "flake-utils": "flake-utils_44",
+        "grocy": "grocy_2",
+        "mypackages": "mypackages_11",
+        "nixpkgs": "nixpkgs_79"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
+        "path": "./grocy",
+        "type": "path"
+      },
+      "original": {
+        "path": "./grocy",
+        "type": "path"
+      }
+    },
+    "s-lib": {
+      "inputs": {
+        "colmena": "colmena_7",
+        "disko": "disko_7",
+        "flake-parts": "flake-parts_19",
+        "nixos-anywhere": "nixos-anywhere_7",
+        "nixpkgs": "nixpkgs_83"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "./lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "./lib",
+        "type": "path"
+      }
+    },
+    "s-loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "./loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "./loginctl-linger",
+        "type": "path"
+      }
+    },
+    "s-mastodon": {
+      "inputs": {
+        "flake-utils": "flake-utils_46",
+        "mastodon": "mastodon_2",
+        "myuids": "myuids_30",
+        "nixpkgs": "nixpkgs_84"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
+        "path": "./mastodon",
+        "type": "path"
+      },
+      "original": {
+        "path": "./mastodon",
+        "type": "path"
+      }
+    },
+    "s-mediagoblin": {
+      "inputs": {
+        "flake-utils": "flake-utils_47",
+        "mediagoblin": "mediagoblin_2",
+        "myuids": "myuids_31",
+        "nixpkgs": "nixpkgs_85"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
+        "path": "./mediagoblin",
+        "type": "path"
+      },
+      "original": {
+        "path": "./mediagoblin",
+        "type": "path"
+      }
+    },
+    "s-multi-apache-container": {
+      "inputs": {
+        "files-watcher": "files-watcher_12",
+        "myuids": "myuids_32"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
+        "path": "./multi-apache-container",
+        "type": "path"
+      },
+      "original": {
+        "path": "./multi-apache-container",
+        "type": "path"
+      }
+    },
+    "s-mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_20",
+        "nixpkgs": "nixpkgs_86",
+        "webapps-ttrss": "webapps-ttrss_13"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "./mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "./mypackages",
+        "type": "path"
+      }
+    },
+    "s-myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "./myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "./myuids",
+        "type": "path"
+      }
+    },
+    "s-naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "./naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "./naemon",
+        "type": "path"
+      }
+    },
+    "s-openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_48",
+        "myuids": "myuids_33",
+        "nixpkgs": "nixpkgs_87",
+        "openarc": "openarc_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "./openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./openarc",
+        "type": "path"
+      }
+    },
+    "s-opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_49",
+        "myuids": "myuids_34",
+        "nixpkgs": "nixpkgs_88"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "./opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./opendmarc",
+        "type": "path"
+      }
+    },
+    "s-paste": {
+      "inputs": {
+        "flake-utils": "flake-utils_50",
+        "nixpkgs": "nixpkgs_89"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
+        "path": "./paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "./paste",
+        "type": "path"
+      }
+    },
+    "s-peertube": {
+      "inputs": {
+        "flake-utils": "flake-utils_51",
+        "myuids": "myuids_35",
+        "nixpkgs": "nixpkgs_90",
+        "peertube": "peertube_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./peertube",
+        "type": "path"
+      }
+    },
+    "s-private-buildbot": {
+      "inputs": {
+        "buildslist": "buildslist_2",
+        "flake-utils": "flake-utils_52",
+        "nixpkgs": "nixpkgs_91"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
+        "path": "./private/buildbot",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/buildbot",
+        "type": "path"
+      }
+    },
+    "s-private-chatons": {
+      "inputs": {
+        "environment": "environment_27"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "./private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/chatons",
+        "type": "path"
+      }
+    },
+    "s-private-environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "./private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/environment",
+        "type": "path"
+      }
+    },
+    "s-private-mail-relay": {
+      "inputs": {
+        "environment": "environment_28",
+        "secrets": "secrets_20"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
+        "path": "./private/mail-relay",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/mail-relay",
+        "type": "path"
+      }
+    },
+    "s-private-milters": {
+      "inputs": {
+        "environment": "environment_29",
+        "files-watcher": "files-watcher_13",
+        "openarc": "openarc_12",
+        "opendmarc": "opendmarc_6",
+        "secrets": "secrets_21"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
+        "path": "./private/milters",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/milters",
+        "type": "path"
+      }
+    },
+    "s-private-monitoring": {
+      "inputs": {
+        "environment": "environment_30",
+        "naemon": "naemon_6",
+        "nixpkgs-lib": "nixpkgs-lib_26",
+        "secrets": "secrets_22"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "./private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/monitoring",
+        "type": "path"
+      }
+    },
+    "s-private-openarc": {
+      "inputs": {
+        "files-watcher": "files-watcher_14",
+        "openarc": "openarc_14",
+        "secrets": "secrets_23"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
+        "path": "./private/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/openarc",
+        "type": "path"
+      }
+    },
+    "s-private-opendmarc": {
+      "inputs": {
+        "environment": "environment_31",
+        "files-watcher": "files-watcher_15",
+        "opendmarc": "opendmarc_7",
+        "secrets": "secrets_24"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
+        "path": "./private/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/opendmarc",
+        "type": "path"
+      }
+    },
+    "s-private-openldap": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
+        "path": "./private/openldap",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/openldap",
+        "type": "path"
+      }
+    },
+    "s-private-paste": {
+      "inputs": {
+        "paste": "paste_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
+        "path": "./private/paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/paste",
+        "type": "path"
+      }
+    },
+    "s-private-peertube": {
+      "inputs": {
+        "peertube_open_instance": "peertube_open_instance_2",
+        "peertube_origin": "peertube_origin_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
+        "path": "./private/peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/peertube",
+        "type": "path"
+      }
+    },
+    "s-private-php": {
+      "inputs": {
+        "flake-utils": "flake-utils_60",
+        "nixpkgs": "nixpkgs_99",
+        "nixpkgs-4": "nixpkgs-4_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "./private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/php",
+        "type": "path"
+      }
+    },
+    "s-private-ssh": {
+      "inputs": {
+        "environment": "environment_32",
+        "secrets": "secrets_25"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
+        "path": "./private/ssh",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/ssh",
+        "type": "path"
+      }
+    },
+    "s-private-system": {
+      "inputs": {
+        "backports": "backports_7",
+        "environment": "environment_33",
+        "mypackages": "mypackages_12",
+        "myuids": "myuids_42",
+        "secrets-public": "secrets-public_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "./private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/system",
+        "type": "path"
+      }
+    },
+    "s-rsync_backup": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
+        "path": "./rsync_backup",
+        "type": "path"
+      },
+      "original": {
+        "path": "./rsync_backup",
+        "type": "path"
+      }
+    },
+    "s-secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "./secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "./secrets",
+        "type": "path"
+      }
+    },
+    "s-surfer": {
+      "inputs": {
+        "flake-utils": "flake-utils_62",
+        "mypackages": "mypackages_13",
+        "nixpkgs": "nixpkgs_103",
+        "surfer": "surfer_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
+        "path": "./surfer",
+        "type": "path"
+      },
+      "original": {
+        "path": "./surfer",
+        "type": "path"
+      }
+    },
+    "s-taskwarrior-web": {
+      "inputs": {
+        "flake-utils": "flake-utils_63",
+        "nixpkgs": "nixpkgs_104",
+        "taskwarrior-web": "taskwarrior-web_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
+        "path": "./taskwarrior-web",
+        "type": "path"
+      },
+      "original": {
+        "path": "./taskwarrior-web",
+        "type": "path"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_15": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_16": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_17": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_18": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_19": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_20": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_21": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_22": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_23": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_24": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_25": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_26": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-yvhc2jxW1AQVmtrKPoYPr5DgpXKt/ua+ATuxvE3iY6c=",
+        "path": "./private/environment-dummy",
+        "type": "path"
+      },
+      "original": {
+        "path": "./private/environment-dummy",
+        "type": "path"
+      }
+    },
+    "secrets_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "ssh": {
+      "inputs": {
+        "environment": "environment_10",
+        "secrets": "secrets_9"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      }
+    },
+    "stable": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_2": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_3": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_4": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_5": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_6": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "stable_7": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "surfer": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1588637864,
+        "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "revCount": 318,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      },
+      "original": {
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      }
+    },
+    "surfer_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1588637864,
+        "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "revCount": 318,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      },
+      "original": {
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      }
+    },
+    "system": {
+      "inputs": {
+        "backports": "backports",
+        "environment": "environment_7",
+        "mypackages": "mypackages",
+        "myuids": "myuids_6",
+        "secrets-public": "secrets-public"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "system_2": {
+      "inputs": {
+        "backports": "backports_2",
+        "environment": "environment_11",
+        "mypackages": "mypackages_2",
+        "myuids": "myuids_8",
+        "secrets-public": "secrets-public_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "system_3": {
+      "inputs": {
+        "backports": "backports_4",
+        "environment": "environment_22",
+        "mypackages": "mypackages_7",
+        "myuids": "myuids_24",
+        "secrets-public": "secrets-public_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "system_4": {
+      "inputs": {
+        "backports": "backports_5",
+        "environment": "environment_25",
+        "mypackages": "mypackages_8",
+        "myuids": "myuids_27",
+        "secrets-public": "secrets-public_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "taskwarrior-web": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546434241,
+        "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      }
+    },
+    "taskwarrior-web_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546434241,
+        "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "n-backup-2",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_2": {
+      "inputs": {
+        "nixpkgs": [
+          "n-dilion",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_3": {
+      "inputs": {
+        "nixpkgs": [
+          "n-eldiron",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_4": {
+      "inputs": {
+        "nixpkgs": [
+          "n-monitoring-1",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_5": {
+      "inputs": {
+        "nixpkgs": [
+          "n-quatresaisons",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_6": {
+      "inputs": {
+        "nixpkgs": [
+          "n-zoldene",
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "treefmt-nix_7": {
+      "inputs": {
+        "nixpkgs": [
+          "s-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_10": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_11": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_12": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_13": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_14": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_15": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_7": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_8": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_9": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/flake.nix b/flakes/flake.nix
new file mode 100644 (file)
index 0000000..aecff57
--- /dev/null
@@ -0,0 +1,67 @@
+{
+  description = "immae-eu infrastructure";
+  inputs = {
+    s-backports.url = "path:./backports";
+    s-copanier.url = "path:./copanier";
+    s-diaspora.url = "path:./diaspora";
+    s-etherpad-lite.url = "path:./etherpad-lite";
+    s-fiche.url = "path:./fiche";
+    s-files-watcher.url = "path:./files-watcher";
+    s-grocy.url = "path:./grocy";
+    s-lib.url = "path:./lib";
+    s-loginctl-linger.url = "path:./loginctl-linger";
+    s-mastodon.url = "path:./mastodon";
+    s-mediagoblin.url = "path:./mediagoblin";
+    s-multi-apache-container.url = "path:./multi-apache-container";
+    s-mypackages.url = "path:./mypackages";
+    s-myuids.url = "path:./myuids";
+    s-naemon.url = "path:./naemon";
+    s-openarc.url = "path:./openarc";
+    s-opendmarc.url = "path:./opendmarc";
+    s-paste.url = "path:./paste";
+    s-peertube.url = "path:./peertube";
+    s-rsync_backup.url = "path:./rsync_backup";
+    s-secrets.url = "path:./secrets";
+    s-surfer.url = "path:./surfer";
+    s-taskwarrior-web.url = "path:./taskwarrior-web";
+
+    s-private-buildbot.url = "path:./private/buildbot";
+    s-private-chatons.url = "path:./private/chatons";
+    s-private-environment.url = "path:./private/environment";
+    s-private-mail-relay.url = "path:./private/mail-relay";
+    s-private-milters.url = "path:./private/milters";
+    s-private-monitoring.url = "path:./private/monitoring";
+    s-private-openarc.url = "path:./private/openarc";
+    s-private-opendmarc.url = "path:./private/opendmarc";
+    s-private-openldap.url = "path:./private/openldap";
+    s-private-paste.url = "path:./private/paste";
+    s-private-peertube.url = "path:./private/peertube";
+    s-private-php.url = "path:./private/php";
+    s-private-ssh.url = "path:./private/ssh";
+    s-private-system.url = "path:./private/system";
+
+    n-backup-2.url = "path:../systems/backup-2";
+    n-dilion.url = "path:../systems/dilion";
+    n-eldiron.url = "path:../systems/eldiron";
+    n-monitoring-1.url = "path:../systems/monitoring-1";
+    n-quatresaisons.url = "path:../systems/quatresaisons";
+    n-zoldene.url = "path:../systems/zoldene";
+
+    secrets.url = "path:./private/environment-dummy";
+  };
+  outputs = inputs@{ self, secrets, ... }: {
+    subflakes = let
+      flakeNames = builtins.map (a: builtins.substring 2 (builtins.stringLength a) a) (builtins.filter (a: builtins.substring 0 2 a == "s-") (builtins.attrNames inputs));
+      partitionned = builtins.partition (a: builtins.substring 0 8 a == "private-") flakeNames;
+      privateFlakes = builtins.map (a: builtins.substring 8 (builtins.stringLength a) a) partitionned.right;
+      publicFlakes = partitionned.wrong;
+
+      nodeFlakes = builtins.map (a: builtins.substring 2 (builtins.stringLength a) a) (builtins.filter (a: builtins.substring 0 2 a == "n-") (builtins.attrNames inputs));
+    in {
+      public = builtins.foldl' (a: b: a // { "${b}" = inputs."s-${b}"; }) {} publicFlakes;
+      private = builtins.foldl' (a: b: a // { "${b}" = inputs."s-private-${b}"; }) {} privateFlakes;
+      nodes = builtins.foldl' (a: b: a // { "${b}" = inputs."n-${b}"; }) {} nodeFlakes;
+      inherit secrets;
+    };
+  };
+}
similarity index 83%
rename from pkgs/webapps/grocy/default.nix
rename to flakes/grocy/default.nix
index f87f6ec0df20672dcac2ed16b0c497e366934eaa..26b6ed847f7a05118211e4899490a5df5096076e 100644 (file)
@@ -1,8 +1,9 @@
-{ varDir ? "/var/lib/grocy", stdenv, callPackage, composerEnv, fetchurl, mylibs, runCommand, git, which, jq, yarn2nix-moretea }:
+{ varDir ? "/var/lib/grocy", stdenv, callPackage, composerEnv, fetchurl, src, runCommand, git, which, jq, yarn2nix-moretea }:
 let
   version = "2.6.1-1";
 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 = ''
     buildInputs = [ jq ];
     patches = [ ./yarn.patch ];
     installPhase = ''
@@ -10,7 +11,7 @@ let
       cat package.json | jq -r '.version = "${version}"' > $out/package.json
       cp yarn.lock $out/
       '';
       cat package.json | jq -r '.version = "${version}"' > $out/package.json
       cp yarn.lock $out/
       '';
-  });
+  };
   yarnModules = yarn2nix-moretea.mkYarnModules rec {
     name = "grocy-yarn";
     pname = name;
   yarnModules = yarn2nix-moretea.mkYarnModules rec {
     name = "grocy-yarn";
     pname = name;
@@ -26,8 +27,9 @@ let
   };
   app = composerEnv.buildPackage (
     import ./php-packages.nix { inherit composerEnv fetchurl; } //
   };
   app = composerEnv.buildPackage (
     import ./php-packages.nix { inherit composerEnv fetchurl; } //
-    packagesource //
     {
     {
+      name = "grocy";
+      inherit src;
       noDev = true;
       buildInputs = [ yarnModules ];
       postInstall = ''
       noDev = true;
       buildInputs = [ yarnModules ];
       postInstall = ''
diff --git a/flakes/grocy/flake.lock b/flakes/grocy/flake.lock
new file mode 100644 (file)
index 0000000..13aa4a6
--- /dev/null
@@ -0,0 +1,150 @@
+{
+  "nodes": {
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "grocy": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585166193,
+        "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts",
+        "nixpkgs": "nixpkgs",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "grocy": "grocy",
+        "mypackages": "mypackages",
+        "nixpkgs": "nixpkgs_2"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/grocy/flake.nix b/flakes/grocy/flake.nix
new file mode 100644 (file)
index 0000000..a08852f
--- /dev/null
@@ -0,0 +1,35 @@
+{
+  description = "ERP beyond your fridge - grocy is a web-based self-hosted groceries & household management solution for your home";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.grocy = {
+    url = "github:grocy/grocy/d7738aa1ec330c81f11e4976681df0299d4ed35a";
+    flake = false;
+  };
+  inputs.mypackages.url = "path:../mypackages";
+  outputs = { self, nixpkgs, grocy, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      composerEnv = mypackages.lib."${system}".composerEnv;
+      version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.grocy.original.ref;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.grocy = callPackage ./. { inherit composerEnv; src = grocy // { inherit version; }; };
+      defaultPackage = packages.grocy;
+      legacyPackages.grocy = packages.grocy;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+    ) // rec {
+      overlays = {
+        grocy = final: prev: {
+          grocy = self.defaultPackage."${final.system}";
+        };
+      };
+      overlay = overlays.grocy;
+    };
+}
index 3e0b21e783188c4769e959d4f13da197fe1bc2a8..3ca158e8ea1bd819e13f68adc5e018e2e3058346 100644 (file)
 {
   "nodes": {
 {
   "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": {
     "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",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
         "type": "github"
       },
       "original": {
         "type": "github"
       },
       "original": {
     },
     "root": {
       "inputs": {
     },
     "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"
       }
     }
   },
       }
     }
   },
index 8faa136898ce51107e1ab6156f96a1c3b1cf40de..5b78fb693a8439b351389a575ed39373741769f3 100644 (file)
@@ -1,28 +1,68 @@
 {
   inputs.nixpkgs.url = "github:NixOS/nixpkgs";
 {
   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";
 
   description = "Useful libs";
-  outputs = { self, nixpkgs }: {
+  outputs = { self, nixpkgs, flake-parts, disko, colmena, nixos-anywhere }: {
     lib = rec {
     lib = rec {
-      computeNarHash = path:
-        let pkgs = import nixpkgs {};
-        in
-          builtins.readFile (pkgs.runCommand "narHash" {
-            buildInputs = [ pkgs.nix ];
-          } "echo -n $(nix hash-path ${path}) > $out");
+      mkColmenaFlake = { name, self, nixpkgs, system ? "x86_64-linux", nixosModules, moduleArgs ? {}, targetHost, targetUser ? "root" }:
+        flake-parts.lib.mkFlake { inputs = { inherit nixpkgs self; }; } {
+          systems = [ system ];
+          perSystem = { pkgs, ... }: {
+            apps."${name}-install" = {
+              type = "app";
+              program = pkgs.writeScriptBin "${name}-install" ''
+                #!${pkgs.stdenv.shell}
+                set -euo pipefail
+                : $SOPS_VARS_FILE
+                TEMPDIR=$(mktemp -d)
+                trap '[ -d "$TEMPDIR" ] && rm -rf "$TEMPDIR"' EXIT
 
 
-      withNarKeyCompat = flakeCompat: path: moduleAttrs:
-        let module = (flakeCompat path).${moduleAttrs};
-            narHash = computeNarHash path;
-        in if builtins.isFunction module
-          then args@{ config, lib, pkgs, ... }: (module args // { key = narHash; })
-          else module // { key = narHash; };
+                password=$(sops -d $SOPS_VARS_FILE | yq -r .cryptsetup_encryption_keys.${name})
+                mkdir -p $TEMPDIR/boot/initrdSecrets
+                chmod -R go-rwx $TEMPDIR/boot/initrdSecrets
+                sops -d $SOPS_VARS_FILE | yq -c '.ssh_host_keys.${name}[]' | while read -r key; do
+                  keytype=$(echo "$key" | yq -r .type)
+                  keyprivate=$(echo "$key" | yq -r .private)
+                  keypublic=$(echo "$key" | yq -r .public)
+                  echo "$keyprivate" > $TEMPDIR/boot/initrdSecrets/ssh_host_''${keytype}_key
+                  echo "$keypublic" > $TEMPDIR/boot/initrdSecrets/ssh_host_''${keytype}_key.pub
+                done
+                chmod -R go-rwx $TEMPDIR/boot/initrdSecrets
 
 
-      withNarKey = dep: moduleAttrs:
-        let module = dep.${moduleAttrs};
-        in if builtins.isFunction module
-          then args@{ config, lib, pkgs, ... }: (module args // { key = dep.narHash; })
-          else module // { key = dep.narHash; };
+                ${nixos-anywhere.packages.${system}.nixos-anywhere}/bin/nixos-anywhere \
+                  -f .#${name}WithEncryption ${targetUser}@${targetHost} \
+                  --disk-encryption-keys /run/decrypt-key <(echo -n "$password") \
+                  --extra-files "$TEMPDIR"
+              '';
+            };
+
+          };
+          flake = {
+            nixosConfigurations.${name} = (colmena.lib.fromRawFlake self).nodes.${name};
+            nixosConfigurations."${name}WithEncryption" = let
+              selfWithEncryption = nixpkgs.lib.recursiveUpdate self { outputs.colmena.meta.specialArgs.cryptKeyFile = "/run/decrypt-key"; };
+            in
+              (colmena.lib.fromRawFlake selfWithEncryption).nodes.${name};
+            colmena = {
+              meta.nixpkgs = nixpkgs.legacyPackages.${system};
+              meta.specialArgs = moduleArgs;
+              "${name}" = {
+                deployment = { inherit targetHost targetUser; };
+                imports = builtins.attrValues self.nixosModules;
+              };
+            };
+            nixosModules = {
+              _diskoModules = disko.nixosModules.disko;
+            } // nixosModules;
+          };
+        };
     };
   };
 }
     };
   };
 }
diff --git a/flakes/loginctl-linger/flake.nix b/flakes/loginctl-linger/flake.nix
new file mode 100644 (file)
index 0000000..4828d37
--- /dev/null
@@ -0,0 +1,56 @@
+{
+  outputs = { self }: {
+    nixosModule = { config, lib, pkgs, ... }:
+      # https://github.com/michalrus/dotfiles/commit/ebd5fa9583f82589f23531647aa677feb3f8d344#diff-4d353005ef5b3e37f33c07332b8523edR1
+      # A temporary hack to `loginctl enable-linger $somebody` (for
+      # multiplexer sessions to last), until this one is unresolved:
+      # https://github.com/NixOS/nixpkgs/issues/3702
+      #
+      # Usage: `users.extraUsers.somebody.linger = true` or slt.
+
+      with lib;
+
+      let
+
+        dataDir = "/var/lib/systemd/linger";
+
+        lingeringUsers = map (u: u.name) (attrValues (flip filterAttrs config.users.users (n: u: u.linger)));
+
+        lingeringUsersFile = builtins.toFile "lingering-users"
+          (concatStrings (map (s: "${s}\n")
+            (sort (a: b: a < b) lingeringUsers))); # this sorting is important for `comm` to work correctly
+
+        updateLingering = pkgs.writeScript "update-lingering" ''
+          if [ ! -e ${dataDir} ]; then
+            install -m 0755 -o root -g root -d ${dataDir}
+          fi
+          if [ -e ${dataDir} ] ; then
+            ls ${dataDir} | sort | comm -3 -1 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl disable-linger
+            ls ${dataDir} | sort | comm -3 -2 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl  enable-linger
+          fi
+        '';
+
+      in
+
+      {
+        # Necessary for situations where flake gets included multiple times
+        key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
+        options = {
+          users.users = mkOption {
+            type = lib.types.attrsOf (lib.types.submodule {
+              options = {
+                linger = mkEnableOption "lingering for the user";
+              };
+            });
+          };
+        };
+
+        config = {
+          system.activationScripts.update-lingering = {
+            deps = ["users"];
+            text = "${updateLingering}";
+          };
+        };
+      };
+  };
+}
similarity index 82%
rename from pkgs/webapps/mastodon/default.nix
rename to flakes/mastodon/default.nix
index ce015c5d7d4751d9525a1c152e6ab5d4278ff88b..5d32c23234b89e0103ebe662114ae397b7155974 100644 (file)
@@ -1,23 +1,21 @@
-{ varDir ? "/var/lib/mastodon", mylibs,
-  stdenv, writeText, runCommand,
+{ varDir ? "/var/lib/mastodon",
+  stdenv, src, writeText, runCommand,
   ruby_2_6, bundlerEnv, defaultGemConfig,
   jq, protobuf, protobufc, pkgconfig, libidn, pam, nodejs, yarn, yarn2nix-moretea }:
 let
   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
     '';
     } ''
     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;
   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: {
     groups = [ "default" "production" "test" "development" ];
     gemConfig = defaultGemConfig // {
       redis-rack = attrs: {
@@ -43,15 +41,15 @@ let
   };
   yarnModules = let
     packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
   };
   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;
       '';
   in
     yarn2nix-moretea.mkYarnModules rec {
       name = "mastodon-yarn";
       pname = name;
-      version = info.version;
+      version = src.version;
       packageJSON = packagejson;
       packageJSON = packagejson;
-      yarnLock = "${info.src}/yarn.lock";
+      yarnLock = "${patched}/yarn.lock";
       yarnNix = ./yarn-packages.nix;
       pkgConfig = {
         uws = {
       yarnNix = ./yarn-packages.nix;
       pkgConfig = {
         uws = {
@@ -61,16 +59,20 @@ let
         };
       };
     };
         };
       };
     };
-  mastodon_with_yarn = stdenv.mkDerivation (info // rec {
+  mastodon_with_yarn = stdenv.mkDerivation {
+    pname = "mastodon";
+    version = src.version;
+    inherit src;
     installPhase = ''
       cp -a . $out
       cp -a ${yarnModules}/node_modules $out
     '';
     buildInputs = [ yarnModules ];
     installPhase = ''
       cp -a . $out
       cp -a ${yarnModules}/node_modules $out
     '';
     buildInputs = [ yarnModules ];
-  });
+  };
 in
 stdenv.mkDerivation {
   name = "mastodon";
 in
 stdenv.mkDerivation {
   name = "mastodon";
+  version = src.version;
   inherit mastodon_with_yarn;
   builder = writeText "build_mastodon" ''
       source $stdenv/setup
   inherit mastodon_with_yarn;
   builder = writeText "build_mastodon" ''
       source $stdenv/setup
@@ -88,5 +90,5 @@ stdenv.mkDerivation {
       ln -sf ${varDir}/tmp/cache tmp
   '';
   buildInputs = [ gems gems.ruby nodejs yarn ];
       ln -sf ${varDir}/tmp/cache tmp
   '';
   buildInputs = [ gems gems.ruby nodejs yarn ];
-  passthru = { inherit gems varDir; };
+  passthru = { inherit gems varDir nodejs; };
 }
 }
diff --git a/flakes/mastodon/flake.lock b/flakes/mastodon/flake.lock
new file mode 100644 (file)
index 0000000..aed0925
--- /dev/null
@@ -0,0 +1,75 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "mastodon": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1582790581,
+        "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
+        "owner": "tootsuite",
+        "repo": "mastodon",
+        "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tootsuite",
+        "ref": "v2.9.4",
+        "repo": "mastodon",
+        "type": "github"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "mastodon": "mastodon",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/mastodon/flake.nix b/flakes/mastodon/flake.nix
new file mode 100644 (file)
index 0000000..1d0db10
--- /dev/null
@@ -0,0 +1,331 @@
+{
+  description = "Your self-hosted, globally interconnected microblogging community";
+  inputs.myuids = {
+    url = "path:../myuids";
+  };
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.mastodon = {
+    url = "github:tootsuite/mastodon/v2.9.4";
+    flake = false;
+  };
+
+  outputs = { self, myuids, nixpkgs, mastodon, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.mastodon.original.ref;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.mastodon = callPackage ./. { src = mastodon // { inherit version; }; };
+      defaultPackage = packages.mastodon;
+      legacyPackages.mastodon = packages.mastodon;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+  ) // rec {
+    overlays = {
+      mastodon = final: prev: {
+        mastodon = self.defaultPackage."${final.system}";
+      };
+    };
+    overlay = overlays.mastodon;
+    nixosModule = { lib, pkgs, config, ... }:
+      let
+        name = "mastodon";
+        cfg = config.immaeServices.mastodon;
+      in
+        {
+          options.immaeServices.mastodon = {
+            enable = lib.mkEnableOption "Enable Mastodon’s service";
+            user = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "User account under which Mastodon runs";
+            };
+            group = lib.mkOption {
+              type = lib.types.str;
+              default = name;
+              description = "Group under which Mastodon runs";
+            };
+            dataDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/var/lib/${name}";
+              description = ''
+                The directory where Mastodon stores its data.
+              '';
+            };
+            socketsPrefix = lib.mkOption {
+              type = lib.types.str;
+              default = "live";
+              description = ''
+                The prefix to use for Mastodon sockets.
+                '';
+            };
+            socketsDir = lib.mkOption {
+              type = lib.types.path;
+              default = "/run/${name}";
+              description = ''
+                The directory where Mastodon puts runtime files and sockets.
+                '';
+            };
+            configFile = lib.mkOption {
+              type = lib.types.path;
+              description = ''
+                The configuration file path for Mastodon.
+                '';
+            };
+            package = lib.mkOption {
+              type = lib.types.package;
+              default = pkgs.mastodon;
+              description = ''
+                Mastodon package to use.
+                '';
+            };
+            # Output variables
+            workdir = lib.mkOption {
+              type = lib.types.package;
+              default = cfg.package.override { varDir = cfg.dataDir; };
+              description = ''
+              Adjusted mastodon package with overriden varDir
+              '';
+              readOnly = true;
+            };
+            systemdStateDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if varDir is outside of /var/lib
+              default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+                lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+              description = ''
+              Adjusted Mastodon data directory for systemd
+              '';
+              readOnly = true;
+            };
+            systemdRuntimeDirectory = lib.mkOption {
+              type = lib.types.str;
+              # Use ReadWritePaths= instead if socketsDir is outside of /run
+              default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+                lib.strings.removePrefix "/run/" cfg.socketsDir;
+              description = ''
+              Adjusted Mastodon sockets directory for systemd
+              '';
+              readOnly = true;
+            };
+            sockets = lib.mkOption {
+              type = lib.types.attrsOf lib.types.path;
+              default = {
+                node  = "${cfg.socketsDir}/${cfg.socketsPrefix}_node.sock";
+                rails = "${cfg.socketsDir}/${cfg.socketsPrefix}_puma.sock";
+              };
+              readOnly = true;
+              description = ''
+                Mastodon sockets
+                '';
+            };
+          };
+
+          config = lib.mkIf cfg.enable {
+            nixpkgs.overlays = [ self.overlay ];
+            users.users = lib.optionalAttrs (cfg.user == name) {
+              "${name}" = {
+                uid = myuids.lib.uids.mastodon;
+                group = cfg.group;
+                description = "Mastodon user";
+                home = cfg.dataDir;
+                useDefaultShell = true;
+              };
+            };
+            users.groups = lib.optionalAttrs (cfg.group == name) {
+              "${name}" = {
+                gid = myuids.lib.gids.mastodon;
+              };
+            };
+
+            systemd.slices.mastodon = {
+              description = "Mastodon slice";
+            };
+
+            systemd.services.mastodon-streaming = {
+              description = "Mastodon Streaming";
+              wantedBy = [ "multi-user.target" ];
+              after = [ "network.target" "mastodon-web.service" ];
+
+              environment.NODE_ENV = "production";
+              environment.SOCKET = cfg.sockets.node;
+
+              path = [ cfg.workdir.nodejs pkgs.bashInteractive ];
+
+              script = ''
+                exec npm run start
+              '';
+
+              postStart = ''
+                while [ ! -S $SOCKET ]; do
+                  sleep 0.5
+                done
+                chmod a+w $SOCKET
+              '';
+
+              postStop = ''
+                rm $SOCKET
+              '';
+
+              serviceConfig = {
+                Slice = "mastodon.slice";
+                User = cfg.user;
+                EnvironmentFile = cfg.configFile;
+                PrivateTmp = true;
+                Restart = "always";
+                TimeoutSec = 15;
+                Type = "simple";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                RuntimeDirectoryPreserve = "yes";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+
+            systemd.services.mastodon-web = {
+              description = "Mastodon Web app";
+              wantedBy = [ "multi-user.target" ];
+              after = [ "network.target" ];
+
+              environment.RAILS_ENV = "production";
+              environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+              environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+              environment.SOCKET = cfg.sockets.rails;
+
+              path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file pkgs.imagemagick ];
+
+              preStart = ''
+                install -m 0755 -d ${cfg.dataDir}/tmp/cache
+                ./bin/bundle exec rails db:migrate
+              '';
+
+              script = ''
+                exec ./bin/bundle exec puma -C config/puma.rb
+              '';
+
+              postStart = ''
+                exec ./bin/tootctl cache clear
+                '';
+              serviceConfig = {
+                Slice = "mastodon.slice";
+                User = cfg.user;
+                EnvironmentFile = cfg.configFile;
+                PrivateTmp = true;
+                Restart = "always";
+                TimeoutSec = 60;
+                Type = "simple";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                RuntimeDirectoryPreserve = "yes";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+
+            # To be run manually because computationnally heavy
+            systemd.services.mastodon-cleanup-manual = {
+              description = "Cleanup mastodon";
+
+              environment.RAILS_ENV = "production";
+              environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+              environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+              environment.SOCKET = cfg.sockets.rails;
+
+              path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ];
+
+              script = ''
+                exec ./bin/tootctl statuses remove --days 365
+              '';
+
+              serviceConfig = {
+                User = cfg.user;
+                EnvironmentFile = cfg.configFile;
+                PrivateTmp = true;
+                Type = "oneshot";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                RuntimeDirectoryPreserve = "yes";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+
+            systemd.services.mastodon-cleanup = {
+              description = "Cleanup mastodon";
+              startAt = "daily";
+              restartIfChanged = false;
+
+              environment.RAILS_ENV = "production";
+              environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+              environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+              environment.SOCKET = cfg.sockets.rails;
+
+              path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ];
+
+              script = ''
+                exec ./bin/tootctl media remove --days 30
+              '';
+
+              serviceConfig = {
+                User = cfg.user;
+                EnvironmentFile = cfg.configFile;
+                PrivateTmp = true;
+                Type = "oneshot";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                RuntimeDirectoryPreserve = "yes";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+
+            systemd.services.mastodon-sidekiq = {
+              description = "Mastodon Sidekiq";
+              wantedBy = [ "multi-user.target" ];
+              after = [ "network.target" "mastodon-web.service" ];
+
+              environment.RAILS_ENV="production";
+              environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
+              environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
+              environment.DB_POOL="5";
+
+              path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.imagemagick pkgs.ffmpeg pkgs.file ];
+
+              script = ''
+                exec ./bin/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push
+              '';
+
+              serviceConfig = {
+                Slice = "mastodon.slice";
+                User = cfg.user;
+                EnvironmentFile = cfg.configFile;
+                PrivateTmp = true;
+                Restart = "always";
+                TimeoutSec = 15;
+                Type = "simple";
+                WorkingDirectory = cfg.workdir;
+                StateDirectory = cfg.systemdStateDirectory;
+                RuntimeDirectory = cfg.systemdRuntimeDirectory;
+                RuntimeDirectoryPreserve = "yes";
+              };
+
+              unitConfig.RequiresMountsFor = cfg.dataDir;
+            };
+
+          };
+        };
+      };
+}
+
+
similarity index 89%
rename from pkgs/webapps/mediagoblin/default.nix
rename to flakes/mediagoblin/default.nix
index 22cb2923c8ba451a4d9e90cc6c5d640056d0df55..47cc6280a2a0a4e13b3a42519f2653827227d22e 100644 (file)
@@ -1,4 +1,4 @@
-{ makeWrapper, stdenv, writeScript, fetchurl, buildBowerComponents, mylibs, which, python36, gst_all_1, automake, autoconf, nodejs, nodePackages, lib, callPackage, fetchgit }:
+{ src, makeWrapper, stdenv, writeScript, fetchurl, buildBowerComponents, which, python36, gst_all_1, automake, autoconf, nodejs, nodePackages, lib, callPackage, fetchgit, fetchFromGitHub }:
 let
   overridePython = let
     packageOverrides = self: super: {
 let
   overridePython = let
     packageOverrides = self: super: {
@@ -67,10 +67,20 @@ let
         };
         doCheck = false;
       });
         };
         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;
         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 ];
       });
       sqlalchemy_migrate = super.sqlalchemy_migrate.overridePythonAttrs(old: rec {
         propagatedBuildInputs = with self; [ pbr tempita_5_3_dev decorator sqlalchemy six sqlparse ];
       });
@@ -125,23 +135,16 @@ let
             load_entry_point('mediagoblin', 'console_scripts', 'gmg')()
         )
     '';
             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;
   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}") {});
   };
   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:
     withPlugins = withPlugins pkg;
   };
   withPlugins = pkg: toPlugins:
@@ -150,14 +153,14 @@ let
       toBuildPlugin = n: "ln -s ${n} mediagoblin/plugins/${n.pluginName}";
       newMediagoblin = pkg.overrideAttrs(old: {
         postBuild = old.postBuild + "\n" + builtins.concatStringsSep "\n" (map toBuildPlugin plugins);
       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";
       });
     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
     preConfigure = ''
       # ./bootstrap.sh
       aclocal -I m4 --install
@@ -205,6 +208,6 @@ let
       '';
     buildInputs = [ makeWrapper automake autoconf which nodePackages.bower nodejs python ];
     propagatedBuildInputs = with gst_all_1; [ python gst-libav gst-plugins-good gst-plugins-bad gst-plugins-ugly gstreamer ];
       '';
     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
   };
 in package
diff --git a/flakes/mediagoblin/flake.lock b/flakes/mediagoblin/flake.lock
new file mode 100644 (file)
index 0000000..bba6479
--- /dev/null
@@ -0,0 +1,78 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1649676176,
+        "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "mediagoblin": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1531090939,
+        "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "revCount": 4805,
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      },
+      "original": {
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "mediagoblin": "mediagoblin",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/mediagoblin/flake.nix b/flakes/mediagoblin/flake.nix
new file mode 100644 (file)
index 0000000..2e821d5
--- /dev/null
@@ -0,0 +1,271 @@
+{
+  description = "a free software media publishing platform that anyone can run.";
+  inputs.myuids = {
+    url = "path:../myuids";
+  };
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.mediagoblin = {
+    url = "git+https://git.savannah.gnu.org/git/mediagoblin.git?submodules=1&ref=stable&rev=cd465ebfec837a75a44c4ebd727dffe2fff6d850";
+    flake = false;
+  };
+
+  outputs = { self, myuids, nixpkgs, mediagoblin, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.mediagoblin.original.ref;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.mediagoblin = callPackage ./. { src = mediagoblin // { inherit version; }; };
+      defaultPackage = packages.mediagoblin;
+      legacyPackages.mediagoblin = packages.mediagoblin;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+  ) // rec {
+    overlays = {
+      mediagoblin = final: prev: {
+        mediagoblin = self.defaultPackage."${final.system}";
+      };
+    };
+    overlay = overlays.mediagoblin;
+    nixosModule = { lib, pkgs, config, ... }:
+      let
+        name = "mediagoblin";
+        cfg = config.services.mediagoblin;
+
+        uid = config.ids.uids.mediagoblin;
+        gid = config.ids.gids.mediagoblin;
+
+        paste_local = pkgs.writeText "paste_local.ini" ''
+          [DEFAULT]
+          debug = false
+
+          [pipeline:main]
+          pipeline = mediagoblin
+
+          [app:mediagoblin]
+          use = egg:mediagoblin#app
+          config = ${cfg.configFile} ${cfg.package}/mediagoblin.ini
+          /mgoblin_static = ${cfg.package}/mediagoblin/static
+
+          [loggers]
+          keys = root
+
+          [handlers]
+          keys = console
+
+          [formatters]
+          keys = generic
+
+          [logger_root]
+          level = INFO
+          handlers = console
+
+          [handler_console]
+          class = StreamHandler
+          args = (sys.stderr,)
+          level = NOTSET
+          formatter = generic
+
+          [formatter_generic]
+          format = %(levelname)-7.7s [%(name)s] %(message)s
+
+          [filter:errors]
+          use = egg:mediagoblin#errors
+          debug = false
+
+          [server:main]
+          use = egg:waitress#main
+          unix_socket = ${cfg.sockets.paster}
+          unix_socket_perms = 777
+          url_scheme = https
+          '';
+      in
+      {
+        options.services.mediagoblin = {
+          enable = lib.mkEnableOption "Enable Mediagoblin’s service";
+          user = lib.mkOption {
+            type = lib.types.str;
+            default = name;
+            description = "User account under which Mediagoblin runs";
+          };
+          group = lib.mkOption {
+            type = lib.types.str;
+            default = name;
+            description = "Group under which Mediagoblin runs";
+          };
+          dataDir = lib.mkOption {
+            type = lib.types.path;
+            default = "/var/lib/${name}";
+            description = ''
+              The directory where Mediagoblin stores its data.
+            '';
+          };
+          socketsDir = lib.mkOption {
+            type = lib.types.path;
+            default = "/run/${name}";
+            description = ''
+              The directory where Mediagoblin puts runtime files and sockets.
+              '';
+          };
+          configFile = lib.mkOption {
+            type = lib.types.path;
+            description = ''
+              The configuration file path for Mediagoblin.
+              '';
+          };
+          package = lib.mkOption {
+            type = lib.types.package;
+            default = pkgs.mediagoblin;
+            example = lib.literalExample ''
+              pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch])
+            '';
+            description = ''
+              Mediagoblin package to use.
+              '';
+          };
+          systemdStateDirectory = lib.mkOption {
+            type = lib.types.str;
+            # Use ReadWritePaths= instead if varDir is outside of /var/lib
+            default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
+              lib.strings.removePrefix "/var/lib/" cfg.dataDir;
+            description = ''
+            Adjusted Mediagoblin data directory for systemd
+            '';
+            readOnly = true;
+          };
+          systemdRuntimeDirectory = lib.mkOption {
+            type = lib.types.str;
+            # Use ReadWritePaths= instead if socketsDir is outside of /run
+            default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
+              lib.strings.removePrefix "/run/" cfg.socketsDir;
+            description = ''
+            Adjusted Mediagoblin sockets directory for systemd
+            '';
+            readOnly = true;
+          };
+          sockets = lib.mkOption {
+            type = lib.types.attrsOf lib.types.path;
+            default = {
+              paster = "${cfg.socketsDir}/mediagoblin.sock";
+            };
+            readOnly = true;
+            description = ''
+              Mediagoblin sockets
+              '';
+          };
+          pids = lib.mkOption {
+            type = lib.types.attrsOf lib.types.path;
+            default = {
+              paster = "${cfg.socketsDir}/mediagoblin.pid";
+              celery = "${cfg.socketsDir}/mediagoblin-celeryd.pid";
+            };
+            readOnly = true;
+            description = ''
+              Mediagoblin pid files
+              '';
+          };
+        };
+
+        config = lib.mkIf cfg.enable {
+          nixpkgs.overlays = [ self.overlay ];
+          users.users = lib.optionalAttrs (cfg.user == name) {
+            "${name}" = {
+              inherit uid;
+              group = cfg.group;
+              description = "Mediagoblin user";
+              home = cfg.dataDir;
+              useDefaultShell = true;
+            };
+          };
+          users.groups = lib.optionalAttrs (cfg.group == name) {
+            "${name}" = {
+              inherit gid;
+            };
+          };
+
+          systemd.slices.mediagoblin = {
+            description = "Mediagoblin slice";
+          };
+          systemd.services.mediagoblin-web = {
+            description = "Mediagoblin service";
+            wantedBy = [ "multi-user.target" ];
+            after = [ "network.target" ];
+            wants = [ "postgresql.service" "redis.service" ];
+
+            environment.SCRIPT_NAME = "/mediagoblin/";
+
+            script = ''
+              exec ./bin/paster serve \
+                ${paste_local} \
+                --pid-file=${cfg.pids.paster}
+              '';
+            preStop = ''
+              exec ./bin/paster serve \
+                --pid-file=${cfg.pids.paster} \
+                ${paste_local} stop
+              '';
+            preStart = ''
+              if [ -d ${cfg.dataDir}/plugin_static/ ]; then
+                rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
+                ln -sf ${cfg.package}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
+              fi
+              ./bin/gmg -cf ${cfg.configFile} dbupdate
+              '';
+
+            serviceConfig = {
+              Slice = "mediagoblin.slice";
+              User = cfg.user;
+              PrivateTmp = true;
+              Restart = "always";
+              TimeoutSec = 15;
+              Type = "simple";
+              WorkingDirectory = cfg.package;
+              RuntimeDirectory = cfg.systemdRuntimeDirectory;
+              StateDirectory= cfg.systemdStateDirectory;
+              PIDFile = cfg.pids.paster;
+            };
+
+            unitConfig.RequiresMountsFor = cfg.dataDir;
+          };
+
+          systemd.services.mediagoblin-celeryd = {
+            description = "Mediagoblin service";
+            wantedBy = [ "multi-user.target" ];
+            after = [ "network.target" "mediagoblin-web.service" ];
+
+            environment.MEDIAGOBLIN_CONFIG = cfg.configFile;
+            environment.CELERY_CONFIG_MODULE = "mediagoblin.init.celery.from_celery";
+
+            script = ''
+              exec ./bin/celery worker \
+                --logfile=${cfg.dataDir}/celery.log \
+                --loglevel=INFO
+              '';
+
+            serviceConfig = {
+              Slice = "mediagoblin.slice";
+              User = cfg.user;
+              PrivateTmp = true;
+              Restart = "always";
+              TimeoutSec = 60;
+              Type = "simple";
+              WorkingDirectory = cfg.package;
+              RuntimeDirectory = cfg.systemdRuntimeDirectory;
+              StateDirectory= cfg.systemdStateDirectory;
+              PIDFile = cfg.pids.celery;
+            };
+
+            unitConfig.RequiresMountsFor = cfg.dataDir;
+          };
+        };
+      };
+  };
+}
+
+
diff --git a/flakes/multi-apache-container/flake.lock b/flakes/multi-apache-container/flake.lock
new file mode 100644 (file)
index 0000000..f8dda19
--- /dev/null
@@ -0,0 +1,36 @@
+{
+  "nodes": {
+    "files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "files-watcher": "files-watcher",
+        "myuids": "myuids"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/multi-apache-container/flake.nix b/flakes/multi-apache-container/flake.nix
new file mode 100644 (file)
index 0000000..fd788f7
--- /dev/null
@@ -0,0 +1,389 @@
+{
+  description = "Module to handle multiple separate apache instances (using containers)";
+  inputs.myuids = {
+    url = "path:../myuids";
+  };
+  inputs.files-watcher = {
+    url = "path:../files-watcher";
+  };
+
+  outputs = { self, myuids, files-watcher }: {
+    nixosModule = { lib, config, pkgs, options, ... }:
+      with lib;
+      let
+        cfg = config.services.websites;
+        hostConfig = config;
+        toHttpdConfig = icfg:
+          let
+            nosslVhost = ips: cfg: {
+              listen = map (ip: { inherit ip; port = 80; }) ips;
+              hostName = cfg.host;
+              logFormat = "combinedVhost";
+              documentRoot = cfg.root;
+              extraConfig = ''
+                <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)
+            );
+
+          }
+        ];
+      };
+  };
+}
+
+
diff --git a/flakes/mypackages/flake.lock b/flakes/mypackages/flake.lock
new file mode 100644 (file)
index 0000000..f11f6c5
--- /dev/null
@@ -0,0 +1,83 @@
+{
+  "nodes": {
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-parts": "flake-parts",
+        "nixpkgs": "nixpkgs",
+        "webapps-ttrss": "webapps-ttrss"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/mypackages/flake.nix b/flakes/mypackages/flake.nix
new file mode 100644 (file)
index 0000000..adad96f
--- /dev/null
@@ -0,0 +1,43 @@
+{
+  description = "immae-eu infrastructure";
+  inputs = {
+    flake-parts.url = "github:hercules-ci/flake-parts";
+    # TODO: use nixos-unstable branch at some point and use the lock to keep the actual commit
+    nixpkgs.url = "github:nixos/nixpkgs/062a0c5437b68f950b081bbfc8a699d57a4ee026";
+    webapps-ttrss = {
+      url = "https://git.tt-rss.org/fox/tt-rss.git";
+      ref = "master";
+      rev = "986ca251f995f7754a0470d3e0c44538a545081f";
+      type = "git";
+      flake = false;
+    };
+  };
+  outputs = inputs@{ self, flake-parts, ... }:
+    flake-parts.lib.mkFlake { inherit inputs; } {
+      imports = [
+        (import ./lib/flake-parts-lib.nix { name = "lib"; type = "unspecified"; })
+      ];
+      systems = [ "x86_64-linux" ];
+      perSystem = { config, inputs', pkgs, ... }:
+        let
+          mypkgs = import ./pkgs/default.nix { inherit pkgs; inherit (self) mylibs sources; };
+        in {
+          packages = builtins.removeAttrs mypkgs [ "composerEnv" "webapps-apache-theme" ];
+          lib = {
+            inherit (self) sources;
+            inherit (mypkgs) composerEnv;
+            inherit (self.mylibs) postfixScript;
+            apache-theme = mypkgs.webapps-apache-theme;
+          };
+        };
+      flake = {
+        mylibs = import ./lib/default.nix;
+        sources.tools.ttrss = inputs.webapps-ttrss;
+        # We want overlays to be infected (in contrary to "packages"
+        # above): if someone imports an overlay here, we want his own
+        # overlays to be taken into account in every package, even new
+        # ones.
+        overlays = import ./overlays/default.nix { inherit (self) sources mylibs; };
+      };
+    };
+}
diff --git a/flakes/mypackages/lib/default.nix b/flakes/mypackages/lib/default.nix
new file mode 100644 (file)
index 0000000..972ace0
--- /dev/null
@@ -0,0 +1,37 @@
+{
+  flakePartsAddPerSystem = import ./flake-parts-lib.nix;
+  nodeEnv = import ./node-env.nix;
+  postfixScript = pkgs: name: script: pkgs.writeScript name ''
+    #! ${pkgs.stdenv.shell}
+    mail=$(${pkgs.coreutils}/bin/cat -)
+    output=$(echo "$mail" | ${script} 2>&1)
+    ret=$?
+
+    if [ "$ret" != "0" ]; then
+      echo "$mail" \
+        | ${pkgs.procmail}/bin/formail -i "X-Return-Code: $ret" \
+        | /run/wrappers/bin/sendmail -i scripts_error+${name}@mail.immae.eu
+
+    messageId=$(echo "$mail" | ${pkgs.procmail}/bin/formail -x "Message-Id:")
+    repeat=$(echo "$mail" | ${pkgs.procmail}/bin/formail -X "From:" -X "Received:")
+
+    ${pkgs.coreutils}/bin/cat <<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
+  '';
+
+}
diff --git a/flakes/mypackages/lib/flake-parts-lib.nix b/flakes/mypackages/lib/flake-parts-lib.nix
new file mode 100644 (file)
index 0000000..271a4cf
--- /dev/null
@@ -0,0 +1,10 @@
+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;
+}
similarity index 90%
rename from lib/node-env.nix
rename to flakes/mypackages/lib/node-env.nix
index 720e0cc08503cf6ff0294e4f5dc04ca2751aaa93..842caa1ecf43273503d01837e0ae2513c369532a 100644 (file)
@@ -1,6 +1,6 @@
 # This file originates from node2nix
 
 # 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;
 
 let
   python = if nodejs ? python then nodejs.python else python2;
@@ -38,8 +38,8 @@ let
     };
 
   includeDependencies = {dependencies}:
     };
 
   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
         ''
           # Bundle the dependencies of the package
           mkdir -p node_modules
@@ -100,7 +100,7 @@ let
       cd "$DIR/${packageName}"
       ${includeDependencies { inherit dependencies; }}
       cd ..
       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}:
     '';
 
   pinpointDependencies = {dependencies, production}:
@@ -161,12 +161,12 @@ let
     ''
       node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"}
 
     ''
       node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"}
 
-      ${stdenv.lib.optionalString (dependencies != [])
+      ${lib.optionalString (dependencies != [])
         ''
           if [ -d node_modules ]
           then
               cd node_modules
         ''
           if [ -d node_modules ]
           then
               cd node_modules
-              ${stdenv.lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
+              ${lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
               cd ..
           fi
         ''}
               cd ..
           fi
         ''}
@@ -183,7 +183,7 @@ let
           cd "${packageName}"
           ${pinpointDependencies { inherit dependencies production; }}
           cd ..
           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
     '';
 
       fi
     '';
 
@@ -332,8 +332,8 @@ let
     stdenv.mkDerivation ({
       name = "node-${name}-${version}";
       buildInputs = [ tarWrapper python nodejs ]
     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
         ++ buildInputs;
 
       inherit dontStrip; # Stripping may fail a build for some package deployments
@@ -374,7 +374,7 @@ let
         cd "${packageName}"
         runHook preRebuild
 
         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..."
           if [ ! -f package-lock.json ]
           then
               echo "No package-lock.json file found, reconstructing..."
@@ -384,14 +384,14 @@ let
           node ${addIntegrityFieldsScript}
         ''}
 
           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
 
 
         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
         fi
 
         # Create symlink to the deployed executable folder, if applicable
@@ -445,8 +445,8 @@ let
         name = "node-dependencies-${name}-${version}";
 
         buildInputs = [ tarWrapper python nodejs ]
         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
           ++ buildInputs;
 
         inherit dontStrip; # Stripping may fail a build for some package deployments
@@ -466,7 +466,7 @@ let
           # Create fake package.json to make the npm commands work properly
           cp ${src}/package.json .
           chmod 644 package.json
           # 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 .
             if [ -f ${src}/package-lock.json ]
             then
                 cp ${src}/package-lock.json .
@@ -476,7 +476,7 @@ let
           # Pinpoint the versions of all dependencies to the ones that are actually being used
           echo "pinpointing versions of dependencies..."
           cd ..
           # 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}
 
           source $pinpointDependenciesScriptPath
           cd ${packageName}
@@ -487,7 +487,7 @@ let
 
           export HOME=$PWD
 
 
           export HOME=$PWD
 
-          ${stdenv.lib.optionalString bypassCache ''
+          ${lib.optionalString bypassCache ''
             if [ ! -f package-lock.json ]
             then
                 echo "No package-lock.json file found, reconstructing..."
             if [ ! -f package-lock.json ]
             then
                 echo "No package-lock.json file found, reconstructing..."
@@ -497,17 +497,17 @@ let
             node ${addIntegrityFieldsScript}
           ''}
 
             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 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 ..
           ''}
 
           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
 
           mv ${packageName} lib
           ln -s $out/lib/node_modules/.bin $out/bin
@@ -517,7 +517,7 @@ let
     stdenv.mkDerivation {
       name = "node-shell-${name}-${version}";
 
     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
       buildCommand = ''
         mkdir -p $out/bin
         cat > $out/bin/shell <<EOF
@@ -530,13 +530,13 @@ let
 
       # Provide the dependencies in a development shell through the NODE_PATH environment variable
       inherit nodeDependencies;
 
       # 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
 {
         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;
 }
 }
similarity index 97%
rename from lib/private/default.nix
rename to flakes/mypackages/lib/private/default.nix
index c7d753a30e8ffb7542ef905d0b23abc167c71a38..86dd8408146025ad1bbc326fb5ce35feb4ae6076 100644 (file)
@@ -1,4 +1,4 @@
-{}:
+{ pkgs }:
 {
   # This adds header colors to the builds, but it rebuilds the whole
   # world from scratch, so only use it to debug!
 {
   # This adds header colors to the builds, but it rebuilds the whole
   # world from scratch, so only use it to debug!
similarity index 60%
rename from overlays/bitlbee-discord/default.nix
rename to flakes/mypackages/overlays/bitlbee-discord/default.nix
index bf8e5db3fb0069ab9c7d9bb8ec3d580c782a8bc4..4227677eb744eb05451c9a5a03f08246a0f3f3e0 100644 (file)
@@ -1,12 +1,12 @@
 self: super: {
   bitlbee-discord = super.bitlbee-discord.overrideAttrs(old: rec {
 self: super: {
   bitlbee-discord = super.bitlbee-discord.overrideAttrs(old: rec {
-    version = "master-3061edd";
+    version = "master";
     name = "bitlbee-discord-${version}";
     src = self.fetchFromGitHub {
     name = "bitlbee-discord-${version}";
     src = self.fetchFromGitHub {
-      rev = "master";
+      rev = "607f9887ca85f246e970778e3d40aa5c346365a7";
       owner = "sm00th";
       repo = "bitlbee-discord";
       owner = "sm00th";
       repo = "bitlbee-discord";
-      sha256 = "07gjd4b0g09888gpaqwcjafr8m292y2qz0gzharxjh1k2jbs88g3";
+      sha256 = "0jkwhx2walx2ay0vc9x13q0j1qq4r5x30ss03a3j7ks28xvsnxc7";
     };
   });
 }
     };
   });
 }
diff --git a/flakes/mypackages/overlays/databases/mysql/default.nix b/flakes/mypackages/overlays/databases/mysql/default.nix
new file mode 100644 (file)
index 0000000..45dc468
--- /dev/null
@@ -0,0 +1,28 @@
+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
+  #  '';
+  #});
+}
diff --git a/flakes/mypackages/overlays/default.nix b/flakes/mypackages/overlays/default.nix
new file mode 100644 (file)
index 0000000..e91d6a1
--- /dev/null
@@ -0,0 +1,25 @@
+{ 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
+      '';
+    });
+  };
+}
diff --git a/flakes/mypackages/overlays/kanboard/default.nix b/flakes/mypackages/overlays/kanboard/default.nix
new file mode 100644 (file)
index 0000000..2a0d41b
--- /dev/null
@@ -0,0 +1,19 @@
+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
+    '';
+  };
+}
diff --git a/flakes/mypackages/overlays/morph/default.nix b/flakes/mypackages/overlays/morph/default.nix
new file mode 100644 (file)
index 0000000..b316d70
--- /dev/null
@@ -0,0 +1,27 @@
+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 ];
+  });
+}
diff --git a/flakes/mypackages/overlays/ympd/default.nix b/flakes/mypackages/overlays/ympd/default.nix
new file mode 100644 (file)
index 0000000..648403f
--- /dev/null
@@ -0,0 +1,14 @@
+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 ];
+  });
+}
diff --git a/flakes/mypackages/pkgs/bash-libs/default.nix b/flakes/mypackages/pkgs/bash-libs/default.nix
new file mode 100644 (file)
index 0000000..991c9d2
--- /dev/null
@@ -0,0 +1,33 @@
+{ 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
+  '';
+}
similarity index 63%
rename from pkgs/boinctui/default.nix
rename to flakes/mypackages/pkgs/boinctui/default.nix
index d8b106a3e667ec8297be302a232dfb802fbfd2fe..565840c1ae29e1e9b608aa9ce662a50049c45053 100644 (file)
@@ -1,10 +1,10 @@
-{ stdenv, fetchurl, expat, openssl, autoconf, ncurses }:
+{ stdenv, fetchurl, expat, openssl, autoconf269, ncurses }:
 stdenv.mkDerivation rec {
   name = "boinctui-${version}";
 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";
   src = fetchurl {
     url = "http://sourceforge.net/projects/boinctui/files/boinctui_${version}.tar.gz";
-    sha256 = "16zxp8r4z6pllacdacg681y56cg2phnn3pm5gwszbsi93cix2g8p";
+    sha256 = "1c6hc4x28z8hjncxcwxhb0r3980f72i6480569a0hd9y7vcgf3d0";
   };
 
   configureFlags = [ "--without-gnutls" ];
   };
 
   configureFlags = [ "--without-gnutls" ];
@@ -12,9 +12,10 @@ stdenv.mkDerivation rec {
     autoconf
     '';
 
     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
     '';
   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 ];
 }
 }
similarity index 60%
rename from pkgs/cnagios/default.nix
rename to flakes/mypackages/pkgs/cnagios/default.nix
index d5b52f3f6e8ba983246cee4a098995ced09ae668..2b8b0da1a882547d9631cb2ffb9c94c5e8554190 100644 (file)
@@ -1,5 +1,15 @@
-{ stdenv, mylibs, perl, ncurses }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./cnagios.json // {
+{ stdenv, fetchFromGitHub, perl, ncurses }:
+stdenv.mkDerivation (rec {
+  version = "3bd27fb-master";
+  pname = "cnagios";
+  name = "${pname}-${version}";
+  src = fetchFromGitHub {
+    owner = "dannywarren";
+    repo = "cnagios";
+    rev = "3bd27fb40e68f61ffd01bea6234b919a667b6fe4";
+    sha256 = "0iy5pmlcz6y3if72nav22xqxniiv1v8ywi0927m6s459hkw5n2rb";
+    fetchSubmodules = true;
+  };
   configureFlags = [
     "--with-etc-dir=/etc/cnagios"
     "--with-var-dir=/var/lib/naemon"
   configureFlags = [
     "--with-etc-dir=/etc/cnagios"
     "--with-var-dir=/var/lib/naemon"
similarity index 80%
rename from pkgs/composer-env/default.nix
rename to flakes/mypackages/pkgs/composer-env/default.nix
index 416a61cab39567d15e433680325742a7409cd4b2..772ed7388211e678bf27e049f54fb78b569d4369 100644 (file)
@@ -1,41 +1,8 @@
 # This file originates from composer2nix
 
 # This file originates from composer2nix
 
-{ stdenv, writeTextFile, fetchurl, php, unzip }:
+{ stdenv, lib, writeTextFile, fetchurl, php, unzip, composer ? php.packages.composer }:
 
 let
 
 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;
   buildZipPackage = { name, src }:
     stdenv.mkDerivation {
       inherit name src;
@@ -91,7 +58,7 @@ let
                   else
                       $allPackages = array();
 
                   else
                       $allPackages = array();
 
-                  ${stdenv.lib.optionalString (!noDev) ''
+                  ${lib.optionalString (!noDev) ''
                     if(array_key_exists("packages-dev", $config))
                         $allPackages = array_merge($allPackages, $config["packages-dev"]);
                   ''}
                     if(array_key_exists("packages-dev", $config))
                         $allPackages = array_merge($allPackages, $config["packages-dev"]);
                   ''}
@@ -142,7 +109,7 @@ let
       };
 
       bundleDependencies = dependencies:
       };
 
       bundleDependencies = dependencies:
-        stdenv.lib.concatMapStrings (dependencyName:
+        lib.concatMapStrings (dependencyName:
           let
             dependency = dependencies.${dependencyName};
           in
           let
             dependency = dependencies.${dependencyName};
           in
@@ -221,24 +188,24 @@ let
         # Copy or symlink the provided dependencies
         cd vendor
         ${bundleDependencies packages}
         # 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.
         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
 
         # 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
         ''}
 
           # 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
           # Patch the shebangs if possible
           if [ -d $(pwd)/vendor/bin ]
           then
@@ -273,8 +240,4 @@ let
     '';
   } // extraArgs);
 in
     '';
   } // extraArgs);
 in
-{
-  composer = stdenv.lib.makeOverridable composer;
-  buildZipPackage = stdenv.lib.makeOverridable buildZipPackage;
-  buildPackage = stdenv.lib.makeOverridable buildPackage;
-}
+{ inherit composer buildZipPackage buildPackage; }
similarity index 68%
rename from pkgs/crypto/cardano/default.nix
rename to flakes/mypackages/pkgs/crypto/cardano/default.nix
index 879fddb090d29593d4794c608c9a167cec4a7b36..8e3c83f6d0a59e63c365d10bc6db55efbb32ec38 100644 (file)
@@ -1,10 +1,16 @@
-{ stdenv, mylibs }:
+{ stdenv, fetchFromGitHub }:
 let
 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";
   cfg = stdenv.mkDerivation rec {
     name = "launcher-config-custom";
-    buildInputs = [ daedalusSrc daedalusOrig.cfg ];
+    buildInputs = [ src daedalusOrig.cfg ];
     src = daedalusOrig.cfg;
     installPhase = ''
       cp -a $src $out
     src = daedalusOrig.cfg;
     installPhase = ''
       cp -a $src $out
similarity index 54%
rename from pkgs/crypto/iota-cli-app/default.nix
rename to flakes/mypackages/pkgs/crypto/iota-cli-app/default.nix
index e9e9f92a17c1fbcd7ad10b9ba09fa583668a83e1..e386489bd3da06564d2c067965e491cfd50e43e8 100644 (file)
@@ -1,10 +1,19 @@
-{ 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 {
 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
       phases = "installPhase";
       installPhase = ''
         cp -a $src $out
diff --git a/flakes/mypackages/pkgs/default.nix b/flakes/mypackages/pkgs/default.nix
new file mode 100644 (file)
index 0000000..cd6b1a1
--- /dev/null
@@ -0,0 +1,64 @@
+{ 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)))
similarity index 58%
rename from pkgs/dovecot/plugins/deleted_to_trash/default.nix
rename to flakes/mypackages/pkgs/dovecot/plugins/deleted_to_trash/default.nix
index db1afb50866364598fa4880342651c6bff97063a..f2700325e762dbd65a21f14ba137e5fa15f3fa78 100644 (file)
@@ -1,6 +1,15 @@
-{ 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 {
   buildInputs = [ dovecot ];
   patches = [
     (fetchpatch {
similarity index 57%
rename from pkgs/flrn/default.nix
rename to flakes/mypackages/pkgs/flrn/default.nix
index f288615a0948cd690c129fe485a16695645f713f..088654c68011d9744388d7770e3a53627068d7a5 100644 (file)
@@ -1,5 +1,14 @@
-{ 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
   buildInputs = [ libetpan openssl autoconf groff slang yacc ];
   preConfigure = ''
     sed -i -e "s/test -e configure/false/" configure.in
diff --git a/flakes/mypackages/pkgs/fluent-bit/default.nix b/flakes/mypackages/pkgs/fluent-bit/default.nix
new file mode 100644 (file)
index 0000000..390223e
--- /dev/null
@@ -0,0 +1,47 @@
+{ 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;
+  };
+}
diff --git a/flakes/mypackages/pkgs/fluentd/Gemfile b/flakes/mypackages/pkgs/fluentd/Gemfile
new file mode 100644 (file)
index 0000000..71486df
--- /dev/null
@@ -0,0 +1,3 @@
+source "https://rubygems.org"
+
+gem 'fluentd'
diff --git a/flakes/mypackages/pkgs/fluentd/Gemfile.lock b/flakes/mypackages/pkgs/fluentd/Gemfile.lock
new file mode 100644 (file)
index 0000000..3f022cf
--- /dev/null
@@ -0,0 +1,38 @@
+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
diff --git a/flakes/mypackages/pkgs/fluentd/default.nix b/flakes/mypackages/pkgs/fluentd/default.nix
new file mode 100644 (file)
index 0000000..f6a22f0
--- /dev/null
@@ -0,0 +1,20 @@
+{ ruby, bundlerEnv, bundlerUpdateScript, lib }:
+
+bundlerEnv {
+  inherit ruby;
+
+  pname = "fluentd";
+  gemdir = ./.;
+
+  passthru.updateScript = bundlerUpdateScript "fluentd";
+
+  copyGemFiles = true;
+
+  meta = with lib; {
+    description = "A data collector";
+    homepage    = "https://www.fluentd.org/";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ offline nicknovitski ];
+    platforms   = platforms.unix;
+  };
+}
diff --git a/flakes/mypackages/pkgs/fluentd/gemset.nix b/flakes/mypackages/pkgs/fluentd/gemset.nix
new file mode 100644 (file)
index 0000000..8ee42b6
--- /dev/null
@@ -0,0 +1,126 @@
+{
+  concurrent-ruby = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nwad3211p7yv9sda31jmbyw6sdafzmdi2i2niaz6f0wk5nq9h0f";
+      type = "gem";
+    };
+    version = "1.1.9";
+  };
+  "cool.io" = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0dfq4h168wzvs9cvn2mm8648ynkl936pgjva2p8ik34p6d620537";
+      type = "gem";
+    };
+    version = "1.7.1";
+  };
+  fluentd = {
+    dependencies = ["cool.io" "http_parser.rb" "msgpack" "serverengine" "sigdump" "strptime" "tzinfo" "tzinfo-data" "webrick" "yajl-ruby"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "12k9b9903x5fi3lqb41h20qx8s0fwx7chjldbxmyi7j1x6xdm7cv";
+      type = "gem";
+    };
+    version = "1.13.3";
+  };
+  "http_parser.rb" = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xha614fi6l04wryqjj1xmpalzlmhb6lb9qmlh8mmliycdhvcshp";
+      type = "gem";
+    };
+    version = "0.7.0";
+  };
+  msgpack = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06iajjyhx0rvpn4yr3h1hc4w4w3k59bdmfhxnjzzh76wsrdxxrc6";
+      type = "gem";
+    };
+    version = "1.4.2";
+  };
+  serverengine = {
+    dependencies = ["sigdump"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gzhggx40a53mnv4f32xag4h6ai0s5m3w06s59b0h6ih7rqvwns9";
+      type = "gem";
+    };
+    version = "2.2.4";
+  };
+  sigdump = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1mqf06iw7rymv54y7rgbmfi6ppddgjjmxzi3hrw658n1amp1gwhb";
+      type = "gem";
+    };
+    version = "0.2.4";
+  };
+  strptime = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ycs0xz58kymf7yp4h56f0nid2z7g3s18dj7pa3p790pfzzpgvcq";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  tzinfo = {
+    dependencies = ["concurrent-ruby"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10qp5x7f9hvlc0psv9gsfbxg4a7s0485wsbq1kljkxq94in91l4z";
+      type = "gem";
+    };
+    version = "2.0.4";
+  };
+  tzinfo-data = {
+    dependencies = ["tzinfo"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ik16lnsyr2739jzwl4r5sz8q639lqw8f9s68iszwhm2pcq8p4w2";
+      type = "gem";
+    };
+    version = "1.2021.1";
+  };
+  webrick = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1d4cvgmxhfczxiq5fr534lmizkhigd15bsx5719r5ds7k7ivisc7";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  yajl-ruby = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16v0w5749qjp13xhjgr2gcsvjv6mf35br7iqwycix1n2h7kfcckf";
+      type = "gem";
+    };
+    version = "1.4.1";
+  };
+}
\ No newline at end of file
similarity index 77%
rename from pkgs/gearmand/default.nix
rename to flakes/mypackages/pkgs/gearmand/default.nix
index bb3be89db7444e5fdd6f3a9b1f9d2782aad875dd..14ef8c2eea9cb9338200187074e187be00ac8355 100644 (file)
@@ -1,10 +1,10 @@
-{ stdenv, fetchurl, boost, gperf, libevent, libmysqlclient, libuuid, python3, sqlite, hiredis, postgresql, openssl }:
+{ stdenv, fetchurl, boost, gperf, libevent, libmysqlclient, libuuid, sqlite, hiredis, postgresql, openssl }:
 stdenv.mkDerivation rec {
   pname = "gearmand";
 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";
   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 = [
   };
   buildInputs = [ boost gperf libevent openssl libmysqlclient libuuid sqlite hiredis postgresql ];
   configureFlags = [
similarity index 82%
rename from pkgs/genius/default.nix
rename to flakes/mypackages/pkgs/genius/default.nix
index b40d1d01486f1d16dc2e0065f7a2720946ba308d..54a7957821127aca1dd2660e61fa8a5d9ad13134 100644 (file)
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, mpfr, glib, hicolor-icon-theme, gtk2, intltool, gnome-doc-utils, python3, gnome2, autoconf, automake, libtool, ncurses, readline, pkg-config, }:
+{ stdenv, fetchurl, mpfr, glib, hicolor-icon-theme, gtk2, intltool, gnome-doc-utils, python38, gnome2, autoconf, automake, libtool, ncurses, readline, pkg-config, }:
 stdenv.mkDerivation rec {
   name = "genius-${version}";
   version = "1.0.24";
 stdenv.mkDerivation rec {
   name = "genius-${version}";
   version = "1.0.24";
@@ -7,7 +7,7 @@ stdenv.mkDerivation rec {
     sha256 = "772f95f6ae4716d39bb180cd50e8b6b9b074107bee0cd083b825e1e6e55916b6";
   };
   buildInputs = [
     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 = ''
     autoconf automake libtool ncurses readline pkg-config
   ];
   preConfigure = ''
diff --git a/flakes/mypackages/pkgs/ical2html/default.nix b/flakes/mypackages/pkgs/ical2html/default.nix
new file mode 100644 (file)
index 0000000..62e0b95
--- /dev/null
@@ -0,0 +1,11 @@
+{ stdenv, fetchurl, libical }:
+stdenv.mkDerivation rec {
+  pname = "ical2html";
+  version = "3.0";
+  src= fetchurl {
+    url = "https://www.w3.org/Tools/Ical2html/${pname}-${version}.tar.gz";
+    sha256 = "sha256-1QhE04cmohhPgZ3I8jz28Z7ZnSJkH2aPnRse5/pReEA=";
+  };
+  buildInputs = [ libical ];
+
+}
similarity index 94%
rename from pkgs/monitoring-plugins/default.nix
rename to flakes/mypackages/pkgs/monitoring-plugins/default.nix
index 852d29bf96111324494a361ce187e7a5b30dac03..b09d7a4d9cd8c319500eaacfe4a8c7119ac79130 100644 (file)
@@ -1,5 +1,5 @@
 { stdenv, iputils, fetchpatch, fetchurl, file, hostname, perl, openssl,
 { stdenv, iputils, fetchpatch, fetchurl, file, hostname, perl, openssl,
-  bind, openldap, procps-ng, postfix,
+  bind, openldap, procps, postfix,
   wrapperDir ? "/run/wrappers/bin"
 }:
 stdenv.mkDerivation rec {
   wrapperDir ? "/run/wrappers/bin"
 }:
 stdenv.mkDerivation rec {
@@ -29,5 +29,5 @@ stdenv.mkDerivation rec {
       --with-sudo-command="${wrapperDir}/sudo"
   '';
 
       --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 ];
 }
 }
similarity index 90%
rename from pkgs/mtop/default.nix
rename to flakes/mypackages/pkgs/mtop/default.nix
index 3f6b6bc8f5d44329c20670a8fdc25a5bd680c13a..ca9be2cb80c61507a8907f26893c130090008602 100644 (file)
@@ -1,5 +1,5 @@
-{ buildPerlPackage, fetchurl, perlPackages, lib }:
-buildPerlPackage rec {
+{ fetchurl, perlPackages, lib }:
+perlPackages.buildPerlPackage rec {
   pname = "mtop";
   version = "0.6.6";
   src = fetchurl {
   pname = "mtop";
   version = "0.6.6";
   src = fetchurl {
diff --git a/flakes/mypackages/pkgs/mutt-ics/default.nix b/flakes/mypackages/pkgs/mutt-ics/default.nix
new file mode 100644 (file)
index 0000000..2d50475
--- /dev/null
@@ -0,0 +1,15 @@
+{ python3Packages, fetchFromGitHub }:
+with python3Packages;
+buildPythonApplication (rec {
+  version = "d291187-master";
+  pname = "mutt-ics";
+  name = "${pname}-${version}";
+  src = fetchFromGitHub {
+    owner = "dmedvinsky";
+    repo = "mutt-ics";
+    rev = "d29118788f291f67d34fefa6eda9f95846a2fe34";
+    sha256 = "0kqzngsvzjq5gpf60jhfmb2xzjznvk172khf4dlcb72n3ak4rb92";
+    fetchSubmodules = true;
+  };
+  propagatedBuildInputs = [ icalendar ];
+})
similarity index 56%
rename from pkgs/naemon-livestatus/default.nix
rename to flakes/mypackages/pkgs/naemon-livestatus/default.nix
index 46ef51acee48aa4be9b72c042e22c999d40e770a..623230a96b6bce983bf36ed727e095941d7e9ce9 100644 (file)
@@ -1,9 +1,18 @@
-{ stdenv, mylibs, autoconf, automake,
+{ stdenv, fetchFromGitHub, autoconf, automake,
   libtool, pkg-config, naemon,
   varDir ? "/var/lib/naemon",
   etcDir ? "/etc/naemon"
 }:
   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
     '';
   preConfigure = ''
     ./autogen.sh || true
     '';
similarity index 70%
rename from pkgs/naemon/default.nix
rename to flakes/mypackages/pkgs/naemon/default.nix
index 034129675967ac405053ea8da8a1a9e2ef953592..2a29bdc684028deb16dfa77c22cd3dd91ca3b670 100644 (file)
@@ -1,4 +1,4 @@
-{ stdenv, mylibs, help2man, monitoring-plugins, autoconf, automake,
+{ stdenv, fetchFromGitHub, help2man, monitoring-plugins, autoconf, automake,
   libtool, glib, pkg-config, gperf,
   varDir ? "/var/lib/naemon",
   etcDir ? "/etc/naemon",
   libtool, glib, pkg-config, gperf,
   varDir ? "/var/lib/naemon",
   etcDir ? "/etc/naemon",
@@ -8,7 +8,16 @@
   user   ? "naemon",
   group  ? "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
   passthru.status_engine_version = "1-1-0";
   preConfigure = ''
     ./autogen.sh || true
diff --git a/flakes/mypackages/pkgs/nagios-cli/default.nix b/flakes/mypackages/pkgs/nagios-cli/default.nix
new file mode 100644 (file)
index 0000000..99ae843
--- /dev/null
@@ -0,0 +1,12 @@
+{ python2Packages, fetchFromGitHub }:
+python2Packages.buildPythonApplication rec {
+  version = "edc51ea-master";
+  pname = "nagios-cli";
+  src = fetchFromGitHub {
+    owner = "tehmaze";
+    repo = "nagios-cli";
+    rev = "edc51eaccf1086bb4469ce45c5e5155f2d71a2f9";
+    sha256 = "1qw5fv4niz079zqwmfr3kzjv8cc31rbhi9whdbv9c32qdi3h7vsp";
+    fetchSubmodules = true;
+  };
+}
diff --git a/flakes/mypackages/pkgs/nagnu/default.nix b/flakes/mypackages/pkgs/nagnu/default.nix
new file mode 100644 (file)
index 0000000..c7a1162
--- /dev/null
@@ -0,0 +1,21 @@
+{ stdenv, fetchFromGitHub, ncurses, curl }:
+stdenv.mkDerivation (rec {
+  pname = "nagnu";
+  version = "c7e65fc-master";
+  src = fetchFromGitHub {
+    owner = "frlen";
+    repo = "nagnu";
+    rev = "c7e65fc02f46a3756a4cc47953ea2f3e57a84728";
+    sha256 = "1i2jm8ibvqcc734daamnzc3hx8q0nsry1x12q0kr5yvcsdjjgyy3";
+    fetchSubmodules = true;
+  };
+  buildInputs = [ ncurses curl ];
+  installPhase = ''
+    mkdir -p $out/bin
+    cp nagnu $out/bin
+    mkdir -p $out/share/doc/nagnu
+    cp nagnu.conf.sample $out/share/doc/nagnu
+    mkdir -p $out/share/man/man8
+    cp docs/nagnu.8 $out/share/man/man8
+    '';
+})
similarity index 80%
rename from pkgs/nb/default.nix
rename to flakes/mypackages/pkgs/nb/default.nix
index 37cc89f4d29cc820682dd1d97424e4d10e65c716..337c286b3cb345d802fbdf4bf28991a34a170077 100644 (file)
@@ -1,4 +1,4 @@
-{ pkgs ? import <nixpkgs> {} }: with pkgs;
+{ fetchFromGitHub, stdenv, makeWrapper, lib, file }:
 stdenv.mkDerivation {
   pname = "nb";
   version = "e0d4e24-master";
 stdenv.mkDerivation {
   pname = "nb";
   version = "e0d4e24-master";
@@ -9,11 +9,13 @@ stdenv.mkDerivation {
     sha256 = "0gpnlzxjlfn3bagw74lsrmfhxj2xzvk6sjj24wp9rjpk42d9mfml";
   };
   phases = "installPhase";
     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
   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
     '';
     cp $src/etc/nb-completion.zsh $out/share/zsh/vendor-completions/_nb
     cp $src/etc/nb-completion.bash $out/share/bash-completion/completions/nb
     '';
similarity index 88%
rename from pkgs/note/default.nix
rename to flakes/mypackages/pkgs/note/default.nix
index d5fcccd7bcd9b36feb87e60a928abf754a82b6ce..b3b03effe718f1fc8b5d3f10f6acd02c453f2d2c 100644 (file)
@@ -1,5 +1,5 @@
-{ lib, buildPerlPackage, fetchurl, perlPackages }:
-buildPerlPackage rec {
+{ lib, fetchurl, perlPackages }:
+perlPackages.buildPerlPackage rec {
   pname = "note";
   version = "1.3.26";
   src = fetchurl {
   pname = "note";
   version = "1.3.26";
   src = fetchurl {
diff --git a/flakes/mypackages/pkgs/perl-ical-parser-html/default.nix b/flakes/mypackages/pkgs/perl-ical-parser-html/default.nix
new file mode 100644 (file)
index 0000000..96e9abc
--- /dev/null
@@ -0,0 +1,48 @@
+{ perlPackages, fetchurl }:
+let
+  TestXML = perlPackages.buildPerlPackage rec {
+    pname = "Test-XML";
+    version = "0.08";
+    src = fetchurl {
+      url = "mirror://cpan/authors/id/S/SE/SEMANTICO/Test-XML-0.08.tar.gz";
+      sha256 = "sha256-61TMI83shg062KyKaXy/A40N7JUimRLZdcMBiQyoPuI=";
+    };
+    propagatedBuildInputs = with perlPackages; [
+      ModuleBuild XMLSemanticDiff XMLParser
+    ];
+  };
+  iCalParserSAX = perlPackages.buildPerlPackage rec {
+    pname = "iCal-Parser-SAX";
+    version = "1.09";
+    src = fetchurl {
+      url = "mirror://cpan/authors/id/R/RF/RFRANKEL/iCal-Parser-SAX-1.09.tar.gz";
+      sha256 = "sha256-fouAjQ+MTUgwZ/j3dIarOK0rVBZcZy6aOJFor4pLql0=";
+    };
+    propagatedBuildInputs = with perlPackages; [
+      ModuleBuild DateTime IOString XMLSAXBase XMLSAXWriter iCalParser
+      LWPUserAgent
+    ];
+    buildInputs = [ TestXML ];
+    doCheck = false;
+  };
+in
+perlPackages.buildPerlPackage rec {
+  pname = "iCal-Parser-HTML";
+  version = "1.07";
+  src = fetchurl {
+    url = "mirror://cpan/authors/id/R/RF/RFRANKEL/${pname}-${version}.tar.gz";
+    sha256 = "sha256-cxRS2M6aVrCtAXHQae0Y6EtEfGnGx41UuB7z442NSrU=";
+  };
+  patchPhase = ''
+    sed -i -e "s/qw(week month year)/(qw(week month year))/" lib/iCal/Parser/HTML.pm
+  '';
+  doCheck = false;
+  postInstall = ''
+    mkdir -p $out/bin
+    cp scripts/ical2html $out/bin
+    chmod +x $out/bin/ical2html
+  '';
+  propagatedBuildInputs = with perlPackages; [
+    ModuleBuild XMLLibXML XMLLibXSLT iCalParser iCalParserSAX
+  ];
+}
diff --git a/flakes/mypackages/pkgs/pgpid/default.nix b/flakes/mypackages/pkgs/pgpid/default.nix
new file mode 100644 (file)
index 0000000..a1fb9c2
--- /dev/null
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, bashInteractive, bash-libs, coreutils, file, gnugrep, texlive, pandoc, aspell, util-linux, findutils, gnused, gnupg, gawk, facedetect, graphicsmagick, qrencode, tesseract4, zbar, cups, vim }:
+stdenv.mkDerivation {
+  pname = "pgpid";
+  version = "master";
+  src = fetchFromGitHub {
+    owner = "foopgp";
+    repo = "pgpid";
+    rev = "26c2137951775652e9e774977639ecaea5845cf7";
+    sha256 = "sha256-noXDYWWxUryFnV99pyl0eV7hJLUkSy97Vqylx5dKN9g=";
+  };
+
+  buildInputs = [ makeWrapper ];
+  phases = [ "installPhase" ];
+  installPhase = ''
+    mkdir -p $out/bin $out/share/pgpid $out/share/doc/pgpid
+
+    cp $src/pgpid-gen $src/pgpid-qrscan $out/bin
+    cp -r $src/doc $out/share/doc/pgpid
+    cp -r $src/data $out/share/pgpid
+    cp -r $src/imgsamples $out/share/pgpid
+    for i in $out/bin/*; do
+      patchShebangs $i
+      sed -i -e "/^TESSDATADIR/d" -e "/^GEOLIST_CENTROID/d" $i
+      sed -i -e 's@"$(dirname "$BASH_SOURCE")"@${bash-libs}/share/bash-libs/include@' $i
+      wrapProgram $i --set PATH ${lib.makeBinPath [
+        facedetect graphicsmagick qrencode tesseract4 zbar cups gnugrep vim gnupg findutils
+        pandoc (texlive.combine { scheme-small = texlive.scheme-small; pdfcrop = texlive.pdfcrop; })
+      ]}:$(cat ${bash-libs}/nix-support/propagated-build-inputs) \
+        --set TESSDATADIR $out/share/pgpid/data \
+        --set GEOLIST_CENTROID $out/share/pgpid/data/geolist_centroid.txt
+    done
+  '';
+}
diff --git a/flakes/mypackages/pkgs/predixy/default.nix b/flakes/mypackages/pkgs/predixy/default.nix
new file mode 100644 (file)
index 0000000..259d7fd
--- /dev/null
@@ -0,0 +1,19 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation ({
+  pname = "predixy";
+  version = "dacf3fb-master";
+  src = fetchFromGitHub {
+    owner = "joyieldInc";
+    repo = "predixy";
+    rev = "dacf3fb30c2602dc044040df04e194d44b49c1be";
+    sha256 = "0sbvy0jg551lwkfq8qh0a49cl9mhfnkhi3cnk25l8pz4jcdrr9k9";
+    fetchSubmodules = true;
+  };
+  installPhase = ''
+    mkdir -p $out/bin
+    cp src/predixy $out/bin
+    mkdir -p $out/share
+    cp -r doc $out/share
+    cp -r conf $out/share/doc
+    '';
+})
similarity index 56%
rename from pkgs/proftpd/default.nix
rename to flakes/mypackages/pkgs/proftpd/default.nix
index af9d6c6b0580b3a1ea9e32605ba4001525957026..8bdf531d05e1766ef03e03d466402639353785b7 100644 (file)
@@ -1,22 +1,21 @@
-{ pkgs ? import <nixpkgs> {} }:
-with pkgs;
+{ stdenv, fetchurl, file, openssl, libsodium, ncurses, cyrus_sasl, openldap, pkg-config, libxcrypt }:
 
 stdenv.mkDerivation rec {
   pname = "proftpd";
 
 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";
   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;
   };
   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))
   '';
   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
   '';
   postInstall = ''
     rmdir $out/var $out/libexec $out/lib/proftpd $out/share/locale
   '';
similarity index 92%
rename from pkgs/pure-ftpd/default.nix
rename to flakes/mypackages/pkgs/pure-ftpd/default.nix
index 32a7a91e050da1dba37d02f2d916b35edb094d7b..55c698fb714a563bf438cd72844a75d31f95ead6 100644 (file)
@@ -1,5 +1,5 @@
 { ldapFtpId ? null
 { ldapFtpId ? null
-, stdenv, fetchurl, openssl, postgresql, openldap }:
+, stdenv, lib, fetchurl, openssl, postgresql, openldap }:
 
 stdenv.mkDerivation rec {
   name = "pure-ftpd-1.0.47";
 
 stdenv.mkDerivation rec {
   name = "pure-ftpd-1.0.47";
@@ -20,7 +20,7 @@ stdenv.mkDerivation rec {
 
   configureFlags = [ "--with-everything" "--with-tls" "--with-pgsql" "--with-ldap" ];
 
 
   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(?)
     description = "A free, secure, production-quality and standard-conformant FTP server";
     homepage = https://www.pureftpd.org;
     license = licenses.isc; # with some parts covered by BSD3(?)
diff --git a/flakes/mypackages/pkgs/riotkit-do/default.nix b/flakes/mypackages/pkgs/riotkit-do/default.nix
new file mode 100644 (file)
index 0000000..3ddb1ab
--- /dev/null
@@ -0,0 +1,60 @@
+{ python3Packages }:
+let
+  tabulate = python3Packages.buildPythonPackage rec {
+    version = "0.8.7";
+    pname = "tabulate";
+
+    src = python3Packages.fetchPypi {
+      inherit pname version;
+      sha256 = "sha256-2ycjog0EvNqFIhZcc+6nwwDtp04M6FLZAi4BWdeJUAc=";
+    };
+
+    checkInputs = with python3Packages; [ nose ];
+
+    doCheck = false;
+  };
+
+  python-dotenv = python3Packages.buildPythonPackage rec {
+    pname = "python-dotenv";
+    version = "0.13.0";
+
+    src = python3Packages.fetchPypi {
+      inherit pname version;
+      sha256 = "sha256-O5kJvJaw7cawFYbh7tBecRdO9OBMcdpXhjcM6+pTrXQ=";
+    };
+
+    propagatedBuildInputs = with python3Packages; [ click ];
+
+    checkInputs = with python3Packages; [
+      ipython
+      mock
+      pytestCheckHook
+      sh
+    ];
+
+    disabledTests = [
+      "cli"
+    ];
+
+    pythonImportsCheck = [ "dotenv" ];
+  };
+in
+python3Packages.buildPythonApplication rec {
+  pname = "rkd";
+  version = "2.4.0";
+  src = python3Packages.fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-WC0FmUYGkV9PFvRtiFW6w6RtP+9Zf6kizl8jGiRb4HQ=";
+  };
+
+  propagatedBuildInputs = with python3Packages; [
+    pbr
+    jinja2
+    pyyaml
+    tabulate
+    psutil
+    pytest
+    python-dotenv
+    jsonschema
+  ];
+}
diff --git a/flakes/mypackages/pkgs/shaarli/default.nix b/flakes/mypackages/pkgs/shaarli/default.nix
new file mode 100644 (file)
index 0000000..23f9937
--- /dev/null
@@ -0,0 +1,24 @@
+{ varDir ? "/var/lib/shaarli", stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  pname = "shaarli";
+  version = "0.10.2";
+  src = fetchurl {
+    url = "https://github.com/shaarli/Shaarli/releases/download/v${version}/shaarli-v${version}-full.tar.gz";
+    sha256 = "0h8sspj7siy3vgpi2i3gdrjcr5935fr4dfwq2zwd70sjx2sh9s78";
+  };
+  patchPhase = "";
+
+  outputs = [ "out" "doc" ];
+
+  patches = [ ./shaarli_ldap.patch ];
+  installPhase = ''
+    rm -r {cache,pagecache,tmp,data}/
+    mkdir -p $doc/share/doc
+    mv doc/ $doc/share/doc/shaarli
+    mkdir $out/
+    cp -R ./* $out
+    cp .htaccess $out/
+    ln -sf ${varDir}/{cache,pagecache,tmp,data} $out/
+  '';
+}
similarity index 63%
rename from pkgs/status_engine/interface.nix
rename to flakes/mypackages/pkgs/status_engine/interface.nix
index 7ee4889f531a51f174bb4e674e59fc5c6c6c371e..9c8ff5e1aff0059ee1ea2477335596266041914e 100644 (file)
@@ -1,6 +1,9 @@
-{ stdenv, composerEnv, fetchurl, callPackage, config_file ? "/var/lib/status_engine/interface.yml" }:
-composerEnv.buildPackage (
-  import ./interface_php_packages.nix { inherit composerEnv fetchurl; } // rec {
+{ stdenv, composerEnv, php73, fetchurl, callPackage, config_file ? "/var/lib/status_engine/interface.yml" }:
+let
+  composerEnv' = composerEnv.override { php = php73; };
+in
+composerEnv'.buildPackage (
+  import ./interface_php_packages.nix { composerEnv = composerEnv'; inherit fetchurl; } // rec {
     pname = "interface";
     version = "3.4.0";
     name = "${pname}-${version}";
     pname = "interface";
     version = "3.4.0";
     name = "${pname}-${version}";
diff --git a/flakes/mypackages/pkgs/status_engine/module.nix b/flakes/mypackages/pkgs/status_engine/module.nix
new file mode 100644 (file)
index 0000000..d3ac03e
--- /dev/null
@@ -0,0 +1,19 @@
+{ stdenv, fetchFromGitHub, gearmand, json_c, libuuid, libevent, pkgconfig, glib }:
+stdenv.mkDerivation ({
+  pname = "statusengine-module";
+  version = "d461e95-master";
+  src = fetchFromGitHub {
+    owner = "statusengine";
+    repo = "module";
+    rev = "d461e95a11fffaac604d11ac42d237b5e13071bc";
+    sha256 = "1awmq9rck9xy82pambnd2wh66ndif8x8jpk4qbbghs9f2sd48x1n";
+    fetchSubmodules = true;
+  };
+  patches = [ ./host_perfdata.patch ];
+  buildInputs = [ gearmand json_c libuuid libevent pkgconfig glib ];
+  makeFlags = "all";
+  installPhase = ''
+    mkdir -p $out/lib/status-engine
+    cp -a src/bin/* $out/lib/status-engine
+    '';
+})
diff --git a/flakes/mypackages/pkgs/status_engine/worker.nix b/flakes/mypackages/pkgs/status_engine/worker.nix
new file mode 100644 (file)
index 0000000..d8425e1
--- /dev/null
@@ -0,0 +1,37 @@
+{ stdenv, fetchFromGitHub, composerEnv, fetchurl, gearmand, callPackage, php81, config_file ? "/var/lib/status_engine/ui.yml" }:
+let
+  gearman = php81.buildPecl rec {
+    # git describe
+    version = "2.1.0-12-g8fb88d5";
+    pname = "gearman";
+    src = fetchFromGitHub {
+      owner = "php";
+      repo = "pecl-networking-gearman";
+      rev = "8fb88d5a97111a7e8f0dc67553c387b49f047e53";
+      sha256 = "sha256-VPJX29JfNjh0mHlYY+iYKBHSJGUINbWHvojyYBSkSho=";
+    };
+    configureFlags = [ "--with-gearman=${gearmand}" ];
+    nativeBuildInputs = [ gearmand ];
+  };
+  php = php81.withExtensions({ enabled, all }: enabled ++ (with all; [gearman redis mbstring bcmath iconv]));
+in
+(composerEnv.override { inherit php; }).buildPackage (
+  import ./worker_php_packages.nix { inherit composerEnv fetchurl; } // rec {
+    name = "${pname}-${version}";
+    pname = "worker";
+    version = "master";
+    src = fetchFromGitHub {
+      owner = "statusengine";
+      repo = "worker";
+      rev = "e20d6b5c83c6b3c6a2030c9506542fa59dcbb551";
+      sha256 = "sha256-dcC+SLEqMUubp4JQFSuKNpd6U4VYvGR38Vn1jf6ZvTU=";
+      fetchSubmodules = true;
+    };
+    passthru.php = php;
+    postInstall = ''
+      ln -s ${config_file} $out/etc/config.yml
+    '';
+    preInstall = ''
+      cp ${./worker_composer.lock} $out/composer.lock
+    '';
+})
diff --git a/flakes/mypackages/pkgs/status_engine/worker_composer.lock b/flakes/mypackages/pkgs/status_engine/worker_composer.lock
new file mode 100644 (file)
index 0000000..bba0d2d
--- /dev/null
@@ -0,0 +1,2072 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "f61ef94b19969eb2446f52577078d701",
+    "packages": [
+        {
+            "name": "composer/package-versions-deprecated",
+            "version": "1.11.99.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/package-versions-deprecated.git",
+                "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d",
+                "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.1.0 || ^2.0",
+                "php": "^7 || ^8"
+            },
+            "replace": {
+                "ocramius/package-versions": "1.11.99"
+            },
+            "require-dev": {
+                "composer/composer": "^1.9.3 || ^2.0@dev",
+                "ext-zip": "^1.13",
+                "phpunit/phpunit": "^6.5 || ^7"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "PackageVersions\\Installer",
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PackageVersions\\": "src/PackageVersions"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be"
+                }
+            ],
+            "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
+            "support": {
+                "issues": "https://github.com/composer/package-versions-deprecated/issues",
+                "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5"
+            },
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-01-17T14:14:24+00:00"
+        },
+        {
+            "name": "doctrine/cache",
+            "version": "2.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/cache.git",
+                "reference": "1ca8f21980e770095a31456042471a57bc4c68fb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb",
+                "reference": "1ca8f21980e770095a31456042471a57bc4c68fb",
+                "shasum": ""
+            },
+            "require": {
+                "php": "~7.1 || ^8.0"
+            },
+            "conflict": {
+                "doctrine/common": ">2.2,<2.4"
+            },
+            "require-dev": {
+                "cache/integration-tests": "dev-master",
+                "doctrine/coding-standard": "^9",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "psr/cache": "^1.0 || ^2.0 || ^3.0",
+                "symfony/cache": "^4.4 || ^5.4 || ^6",
+                "symfony/var-exporter": "^4.4 || ^5.4 || ^6"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.",
+            "homepage": "https://www.doctrine-project.org/projects/cache.html",
+            "keywords": [
+                "abstraction",
+                "apcu",
+                "cache",
+                "caching",
+                "couchdb",
+                "memcached",
+                "php",
+                "redis",
+                "xcache"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/cache/issues",
+                "source": "https://github.com/doctrine/cache/tree/2.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://www.doctrine-project.org/sponsorship.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.patreon.com/phpdoctrine",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-20T20:07:39+00:00"
+        },
+        {
+            "name": "doctrine/dbal",
+            "version": "2.13.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/dbal.git",
+                "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8",
+                "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/cache": "^1.0|^2.0",
+                "doctrine/deprecations": "^0.5.3|^1",
+                "doctrine/event-manager": "^1.0",
+                "ext-pdo": "*",
+                "php": "^7.1 || ^8"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "9.0.0",
+                "jetbrains/phpstorm-stubs": "2021.1",
+                "phpstan/phpstan": "1.4.6",
+                "phpunit/phpunit": "^7.5.20|^8.5|9.5.16",
+                "psalm/plugin-phpunit": "0.16.1",
+                "squizlabs/php_codesniffer": "3.6.2",
+                "symfony/cache": "^4.4",
+                "symfony/console": "^2.0.5|^3.0|^4.0|^5.0",
+                "vimeo/psalm": "4.22.0"
+            },
+            "suggest": {
+                "symfony/console": "For helpful console commands such as SQL execution and import of files."
+            },
+            "bin": [
+                "bin/doctrine-dbal"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\DBAL\\": "lib/Doctrine/DBAL"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                }
+            ],
+            "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.",
+            "homepage": "https://www.doctrine-project.org/projects/dbal.html",
+            "keywords": [
+                "abstraction",
+                "database",
+                "db2",
+                "dbal",
+                "mariadb",
+                "mssql",
+                "mysql",
+                "oci8",
+                "oracle",
+                "pdo",
+                "pgsql",
+                "postgresql",
+                "queryobject",
+                "sasql",
+                "sql",
+                "sqlanywhere",
+                "sqlite",
+                "sqlserver",
+                "sqlsrv"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/dbal/issues",
+                "source": "https://github.com/doctrine/dbal/tree/2.13.9"
+            },
+            "funding": [
+                {
+                    "url": "https://www.doctrine-project.org/sponsorship.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.patreon.com/phpdoctrine",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-02T20:28:55+00:00"
+        },
+        {
+            "name": "doctrine/deprecations",
+            "version": "v1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/deprecations.git",
+                "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
+                "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^9",
+                "phpstan/phpstan": "1.4.10 || 1.10.15",
+                "phpstan/phpstan-phpunit": "^1.0",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "psalm/plugin-phpunit": "0.18.4",
+                "psr/log": "^1 || ^2 || ^3",
+                "vimeo/psalm": "4.30.0 || 5.12.0"
+            },
+            "suggest": {
+                "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
+            "homepage": "https://www.doctrine-project.org/",
+            "support": {
+                "issues": "https://github.com/doctrine/deprecations/issues",
+                "source": "https://github.com/doctrine/deprecations/tree/v1.1.1"
+            },
+            "time": "2023-06-03T09:27:29+00:00"
+        },
+        {
+            "name": "doctrine/event-manager",
+            "version": "1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/event-manager.git",
+                "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520",
+                "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/deprecations": "^0.5.3 || ^1",
+                "php": "^7.1 || ^8.0"
+            },
+            "conflict": {
+                "doctrine/common": "<2.9"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^9 || ^10",
+                "phpstan/phpstan": "~1.4.10 || ^1.8.8",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "vimeo/psalm": "^4.24"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                },
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com"
+                }
+            ],
+            "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.",
+            "homepage": "https://www.doctrine-project.org/projects/event-manager.html",
+            "keywords": [
+                "event",
+                "event dispatcher",
+                "event manager",
+                "event system",
+                "events"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/event-manager/issues",
+                "source": "https://github.com/doctrine/event-manager/tree/1.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://www.doctrine-project.org/sponsorship.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.patreon.com/phpdoctrine",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-10-12T20:51:15+00:00"
+        },
+        {
+            "name": "doctrine/migrations",
+            "version": "2.3.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/migrations.git",
+                "reference": "28d92a34348fee5daeb80879e56461b2e862fc05"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/migrations/zipball/28d92a34348fee5daeb80879e56461b2e862fc05",
+                "reference": "28d92a34348fee5daeb80879e56461b2e862fc05",
+                "shasum": ""
+            },
+            "require": {
+                "composer/package-versions-deprecated": "^1.8",
+                "doctrine/dbal": "^2.9",
+                "friendsofphp/proxy-manager-lts": "^1.0",
+                "php": "^7.1 || ^8.0",
+                "symfony/console": "^3.4||^4.4.16||^5.0",
+                "symfony/stopwatch": "^3.4||^4.0||^5.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^8.2",
+                "doctrine/orm": "^2.6",
+                "ext-pdo_sqlite": "*",
+                "jdorn/sql-formatter": "^1.1",
+                "mikey179/vfsstream": "^1.6",
+                "phpstan/phpstan": "^0.12",
+                "phpstan/phpstan-deprecation-rules": "^0.12",
+                "phpstan/phpstan-phpunit": "^0.12",
+                "phpstan/phpstan-strict-rules": "^0.12",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4",
+                "symfony/cache": "^4.4. || ^5.3",
+                "symfony/process": "^3.4||^4.0||^5.0",
+                "symfony/yaml": "^3.4||^4.0||^5.0"
+            },
+            "suggest": {
+                "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command.",
+                "symfony/yaml": "Allows the use of yaml for migration configuration files."
+            },
+            "bin": [
+                "bin/doctrine-migrations"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Migrations\\": "lib/Doctrine/Migrations"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Michael Simonson",
+                    "email": "contact@mikesimonson.com"
+                }
+            ],
+            "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.",
+            "homepage": "https://www.doctrine-project.org/projects/migrations.html",
+            "keywords": [
+                "database",
+                "dbal",
+                "migrations",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/migrations/issues",
+                "source": "https://github.com/doctrine/migrations/tree/2.3.5"
+            },
+            "funding": [
+                {
+                    "url": "https://www.doctrine-project.org/sponsorship.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.patreon.com/phpdoctrine",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-10-19T19:55:20+00:00"
+        },
+        {
+            "name": "friendsofphp/proxy-manager-lts",
+            "version": "v1.0.16",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git",
+                "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c",
+                "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c",
+                "shasum": ""
+            },
+            "require": {
+                "laminas/laminas-code": "~3.4.1|^4.0",
+                "php": ">=7.1",
+                "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0"
+            },
+            "conflict": {
+                "laminas/laminas-stdlib": "<3.2.1",
+                "zendframework/zend-stdlib": "<3.2.1"
+            },
+            "replace": {
+                "ocramius/proxy-manager": "^2.1"
+            },
+            "require-dev": {
+                "ext-phar": "*",
+                "symfony/phpunit-bridge": "^5.4|^6.0|^7.0"
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "name": "ocramius/proxy-manager",
+                    "url": "https://github.com/Ocramius/ProxyManager"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "ProxyManager\\": "src/ProxyManager"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "https://ocramius.github.io/"
+                },
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                }
+            ],
+            "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager",
+            "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts",
+            "keywords": [
+                "aop",
+                "lazy loading",
+                "proxy",
+                "proxy pattern",
+                "service proxies"
+            ],
+            "support": {
+                "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues",
+                "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.16"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Ocramius",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-05-24T07:17:17+00:00"
+        },
+        {
+            "name": "laminas/laminas-code",
+            "version": "4.7.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laminas/laminas-code.git",
+                "reference": "91aabc066d5620428120800c0eafc0411e441a62"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/laminas/laminas-code/zipball/91aabc066d5620428120800c0eafc0411e441a62",
+                "reference": "91aabc066d5620428120800c0eafc0411e441a62",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.4, <8.2"
+            },
+            "require-dev": {
+                "doctrine/annotations": "^1.13.2",
+                "ext-phar": "*",
+                "laminas/laminas-coding-standard": "^2.3.0",
+                "laminas/laminas-stdlib": "^3.6.1",
+                "phpunit/phpunit": "^9.5.10",
+                "psalm/plugin-phpunit": "^0.17.0",
+                "vimeo/psalm": "^4.13.1"
+            },
+            "suggest": {
+                "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
+                "laminas/laminas-stdlib": "Laminas\\Stdlib component"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "polyfill/ReflectionEnumPolyfill.php"
+                ],
+                "psr-4": {
+                    "Laminas\\Code\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "description": "Extensions to the PHP Reflection API, static code scanning, and code generation",
+            "homepage": "https://laminas.dev",
+            "keywords": [
+                "code",
+                "laminas",
+                "laminasframework"
+            ],
+            "support": {
+                "chat": "https://laminas.dev/chat",
+                "docs": "https://docs.laminas.dev/laminas-code/",
+                "forum": "https://discourse.laminas.dev",
+                "issues": "https://github.com/laminas/laminas-code/issues",
+                "rss": "https://github.com/laminas/laminas-code/releases.atom",
+                "source": "https://github.com/laminas/laminas-code"
+            },
+            "funding": [
+                {
+                    "url": "https://funding.communitybridge.org/projects/laminas-project",
+                    "type": "community_bridge"
+                }
+            ],
+            "time": "2022-11-21T01:32:31+00:00"
+        },
+        {
+            "name": "paragonie/constant_time_encoding",
+            "version": "v2.6.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/paragonie/constant_time_encoding.git",
+                "reference": "58c3f47f650c94ec05a151692652a868995d2938"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938",
+                "reference": "58c3f47f650c94ec05a151692652a868995d2938",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7|^8"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6|^7|^8|^9",
+                "vimeo/psalm": "^1|^2|^3|^4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "ParagonIE\\ConstantTime\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paragon Initiative Enterprises",
+                    "email": "security@paragonie.com",
+                    "homepage": "https://paragonie.com",
+                    "role": "Maintainer"
+                },
+                {
+                    "name": "Steve 'Sc00bz' Thomas",
+                    "email": "steve@tobtu.com",
+                    "homepage": "https://www.tobtu.com",
+                    "role": "Original Developer"
+                }
+            ],
+            "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
+            "keywords": [
+                "base16",
+                "base32",
+                "base32_decode",
+                "base32_encode",
+                "base64",
+                "base64_decode",
+                "base64_encode",
+                "bin2hex",
+                "encoding",
+                "hex",
+                "hex2bin",
+                "rfc4648"
+            ],
+            "support": {
+                "email": "info@paragonie.com",
+                "issues": "https://github.com/paragonie/constant_time_encoding/issues",
+                "source": "https://github.com/paragonie/constant_time_encoding"
+            },
+            "time": "2022-06-14T06:56:20+00:00"
+        },
+        {
+            "name": "paragonie/random_compat",
+            "version": "v9.99.100",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/paragonie/random_compat.git",
+                "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
+                "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">= 7"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.*|5.*",
+                "vimeo/psalm": "^1"
+            },
+            "suggest": {
+                "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+            },
+            "type": "library",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paragon Initiative Enterprises",
+                    "email": "security@paragonie.com",
+                    "homepage": "https://paragonie.com"
+                }
+            ],
+            "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+            "keywords": [
+                "csprng",
+                "polyfill",
+                "pseudorandom",
+                "random"
+            ],
+            "support": {
+                "email": "info@paragonie.com",
+                "issues": "https://github.com/paragonie/random_compat/issues",
+                "source": "https://github.com/paragonie/random_compat"
+            },
+            "time": "2020-10-15T08:29:30+00:00"
+        },
+        {
+            "name": "php-amqplib/php-amqplib",
+            "version": "v3.5.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-amqplib/php-amqplib.git",
+                "reference": "1aecbd182b35eb039667c50d7d92d71f105be779"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/1aecbd182b35eb039667c50d7d92d71f105be779",
+                "reference": "1aecbd182b35eb039667c50d7d92d71f105be779",
+                "shasum": ""
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "ext-sockets": "*",
+                "php": "^7.1||^8.0",
+                "phpseclib/phpseclib": "^2.0|^3.0"
+            },
+            "conflict": {
+                "php": "7.4.0 - 7.4.1"
+            },
+            "replace": {
+                "videlalvaro/php-amqplib": "self.version"
+            },
+            "require-dev": {
+                "ext-curl": "*",
+                "nategood/httpful": "^0.2.20",
+                "phpunit/phpunit": "^7.5|^9.5",
+                "squizlabs/php_codesniffer": "^3.6"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PhpAmqpLib\\": "PhpAmqpLib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-2.1-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "Alvaro Videla",
+                    "role": "Original Maintainer"
+                },
+                {
+                    "name": "Raúl Araya",
+                    "email": "nubeiro@gmail.com",
+                    "role": "Maintainer"
+                },
+                {
+                    "name": "Luke Bakken",
+                    "email": "luke@bakken.io",
+                    "role": "Maintainer"
+                },
+                {
+                    "name": "Ramūnas Dronga",
+                    "email": "github@ramuno.lt",
+                    "role": "Maintainer"
+                }
+            ],
+            "description": "Formerly videlalvaro/php-amqplib.  This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.",
+            "homepage": "https://github.com/php-amqplib/php-amqplib/",
+            "keywords": [
+                "message",
+                "queue",
+                "rabbitmq"
+            ],
+            "support": {
+                "issues": "https://github.com/php-amqplib/php-amqplib/issues",
+                "source": "https://github.com/php-amqplib/php-amqplib/tree/v3.5.4"
+            },
+            "time": "2023-07-01T11:25:08+00:00"
+        },
+        {
+            "name": "phpseclib/phpseclib",
+            "version": "3.0.21",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpseclib/phpseclib.git",
+                "reference": "4580645d3fc05c189024eb3b834c6c1e4f0f30a1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/4580645d3fc05c189024eb3b834c6c1e4f0f30a1",
+                "reference": "4580645d3fc05c189024eb3b834c6c1e4f0f30a1",
+                "shasum": ""
+            },
+            "require": {
+                "paragonie/constant_time_encoding": "^1|^2",
+                "paragonie/random_compat": "^1.4|^2.0|^9.99.99",
+                "php": ">=5.6.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "*"
+            },
+            "suggest": {
+                "ext-dom": "Install the DOM extension to load XML formatted public keys.",
+                "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+                "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
+                "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
+                "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "phpseclib/bootstrap.php"
+                ],
+                "psr-4": {
+                    "phpseclib3\\": "phpseclib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jim Wigginton",
+                    "email": "terrafrost@php.net",
+                    "role": "Lead Developer"
+                },
+                {
+                    "name": "Patrick Monnerat",
+                    "email": "pm@datasphere.ch",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Andreas Fischer",
+                    "email": "bantu@phpbb.com",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Hans-Jürgen Petrich",
+                    "email": "petrich@tronic-media.com",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Graham Campbell",
+                    "email": "graham@alt-three.com",
+                    "role": "Developer"
+                }
+            ],
+            "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+            "homepage": "http://phpseclib.sourceforge.net",
+            "keywords": [
+                "BigInteger",
+                "aes",
+                "asn.1",
+                "asn1",
+                "blowfish",
+                "crypto",
+                "cryptography",
+                "encryption",
+                "rsa",
+                "security",
+                "sftp",
+                "signature",
+                "signing",
+                "ssh",
+                "twofish",
+                "x.509",
+                "x509"
+            ],
+            "support": {
+                "issues": "https://github.com/phpseclib/phpseclib/issues",
+                "source": "https://github.com/phpseclib/phpseclib/tree/3.0.21"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/terrafrost",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/phpseclib",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-07-09T15:24:48+00:00"
+        },
+        {
+            "name": "psr/container",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/container.git",
+                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Container\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common Container Interface (PHP FIG PSR-11)",
+            "homepage": "https://github.com/php-fig/container",
+            "keywords": [
+                "PSR-11",
+                "container",
+                "container-interface",
+                "container-interop",
+                "psr"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/container/issues",
+                "source": "https://github.com/php-fig/container/tree/2.0.2"
+            },
+            "time": "2021-11-05T16:47:00+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v5.4.26",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273",
+                "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php73": "^1.9",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/service-contracts": "^1.1|^2|^3",
+                "symfony/string": "^5.1|^6.0"
+            },
+            "conflict": {
+                "psr/log": ">=3",
+                "symfony/dependency-injection": "<4.4",
+                "symfony/dotenv": "<5.1",
+                "symfony/event-dispatcher": "<4.4",
+                "symfony/lock": "<4.4",
+                "symfony/process": "<4.4"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0|2.0"
+            },
+            "require-dev": {
+                "psr/log": "^1|^2",
+                "symfony/config": "^4.4|^5.0|^6.0",
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+                "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+                "symfony/lock": "^4.4|^5.0|^6.0",
+                "symfony/process": "^4.4|^5.0|^6.0",
+                "symfony/var-dumper": "^4.4|^5.0|^6.0"
+            },
+            "suggest": {
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/lock": "",
+                "symfony/process": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Eases the creation of beautiful and testable command line interfaces",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "cli",
+                "command-line",
+                "console",
+                "terminal"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/console/tree/v5.4.26"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-07-19T20:11:33+00:00"
+        },
+        {
+            "name": "symfony/deprecation-contracts",
+            "version": "v3.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/deprecation-contracts.git",
+                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
+                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "function.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "A generic function and convention to trigger deprecation notices",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-01-02T09:55:41+00:00"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "v6.0.19",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/filesystem.git",
+                "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214",
+                "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.2",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-mbstring": "~1.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Filesystem\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides basic utilities for the filesystem",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/filesystem/tree/v6.0.19"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-20T17:44:14+00:00"
+        },
+        {
+            "name": "symfony/polyfill-ctype",
+            "version": "v1.27.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-ctype.git",
+                "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
+                "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-ctype": "*"
+            },
+            "suggest": {
+                "ext-ctype": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.27-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Ctype\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Gert de Pagter",
+                    "email": "BackEndTea@gmail.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for ctype functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "ctype",
+                "polyfill",
+                "portable"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-11-03T14:55:06+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-grapheme",
+            "version": "v1.27.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+                "reference": "511a08c03c1960e08a883f4cffcacd219b758354"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
+                "reference": "511a08c03c1960e08a883f4cffcacd219b758354",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.27-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's grapheme_* functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "grapheme",
+                "intl",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-11-03T14:55:06+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-normalizer",
+            "version": "v1.27.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+                "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+                "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.27-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's Normalizer class and related functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "intl",
+                "normalizer",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-11-03T14:55:06+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.27.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+                "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-mbstring": "*"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.27-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-11-03T14:55:06+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php73",
+            "version": "v1.27.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php73.git",
+                "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
+                "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.27-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php73\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-11-03T14:55:06+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.27.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php80.git",
+                "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+                "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.27-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php80\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ion Bazan",
+                    "email": "ion.bazan@gmail.com"
+                },
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-11-03T14:55:06+00:00"
+        },
+        {
+            "name": "symfony/service-contracts",
+            "version": "v3.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/service-contracts.git",
+                "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
+                "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.2",
+                "psr/container": "^2.0"
+            },
+            "conflict": {
+                "ext-psr": "<1.1|>=2"
+            },
+            "suggest": {
+                "symfony/service-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Service\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to writing services",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/service-contracts/tree/v3.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-30T19:17:58+00:00"
+        },
+        {
+            "name": "symfony/stopwatch",
+            "version": "v5.4.21",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/stopwatch.git",
+                "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f83692cd869a6f2391691d40a01e8acb89e76fee",
+                "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/service-contracts": "^1|^2|^3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Stopwatch\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides a way to profile code",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/stopwatch/tree/v5.4.21"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-02-14T08:03:56+00:00"
+        },
+        {
+            "name": "symfony/string",
+            "version": "v6.0.19",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/string.git",
+                "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a",
+                "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.2",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-intl-grapheme": "~1.0",
+                "symfony/polyfill-intl-normalizer": "~1.0",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/translation-contracts": "<2.0"
+            },
+            "require-dev": {
+                "symfony/error-handler": "^5.4|^6.0",
+                "symfony/http-client": "^5.4|^6.0",
+                "symfony/translation-contracts": "^2.0|^3.0",
+                "symfony/var-exporter": "^5.4|^6.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\String\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "grapheme",
+                "i18n",
+                "string",
+                "unicode",
+                "utf-8",
+                "utf8"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/string/tree/v6.0.19"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-01T08:36:10+00:00"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "v5.4.23",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/yaml.git",
+                "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b",
+                "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/polyfill-ctype": "^1.8"
+            },
+            "conflict": {
+                "symfony/console": "<5.3"
+            },
+            "require-dev": {
+                "symfony/console": "^5.3|^6.0"
+            },
+            "suggest": {
+                "symfony/console": "For validating YAML files using the lint command"
+            },
+            "bin": [
+                "Resources/bin/yaml-lint"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Yaml\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Loads and dumps YAML files",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/yaml/tree/v5.4.23"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-04-23T19:33:36+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=7.2.0",
+        "ext-redis": "*",
+        "ext-gearman": "*",
+        "ext-mbstring": "*",
+        "ext-bcmath": "*",
+        "ext-json": "*",
+        "ext-iconv": "*",
+        "ext-pdo": "*"
+    },
+    "platform-dev": [],
+    "plugin-api-version": "2.2.0"
+}
diff --git a/flakes/mypackages/pkgs/status_engine/worker_php_packages.nix b/flakes/mypackages/pkgs/status_engine/worker_php_packages.nix
new file mode 100644 (file)
index 0000000..47291d2
--- /dev/null
@@ -0,0 +1,266 @@
+{composerEnv, fetchurl, fetchgit ? null, fetchhg ? null, fetchsvn ? null, noDev ? false}:
+{
+  packages =
+  {
+    "composer/package-versions-deprecated" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "composer-package-versions-deprecated-b4f54f74ef3453349c24a845d22392cd31e65f1d";
+        src = fetchurl {
+          url = "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d";
+          sha256 = "1hrjxvk8i14pw9gi7j3qc0gljjy74hwdkv8zwsrg5brgyzhqfwam";
+        };
+      };
+    };
+    "doctrine/cache" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-cache-1ca8f21980e770095a31456042471a57bc4c68fb";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb";
+          sha256 = "1p8ia9g3mqz71bv4x8q1ng1fgcidmyksbsli1fjbialpgjk9k1ss";
+        };
+      };
+    };
+    "doctrine/dbal" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-dbal-c480849ca3ad6706a39c970cdfe6888fa8a058b8";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8";
+          sha256 = "15j98h80li6m1aj53p8ddy0lkbkanc5kdy6xrikpdd6zhmsfgq9k";
+        };
+      };
+    };
+    "doctrine/deprecations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-deprecations-612a3ee5ab0d5dd97b7cf3874a6efe24325efac3";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3";
+          sha256 = "078w4k0xdywyb44caz5grbcbxsi87iy13g7a270rs9g5f0p245fi";
+        };
+      };
+    };
+    "doctrine/event-manager" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-event-manager-95aa4cb529f1e96576f3fda9f5705ada4056a520";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520";
+          sha256 = "0xi2s28jmmvrndg1yd0r5s10d9a0q6j2dxdbazvcbws9waf0yrvj";
+        };
+      };
+    };
+    "doctrine/migrations" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "doctrine-migrations-28d92a34348fee5daeb80879e56461b2e862fc05";
+        src = fetchurl {
+          url = "https://api.github.com/repos/doctrine/migrations/zipball/28d92a34348fee5daeb80879e56461b2e862fc05";
+          sha256 = "0j5snc96r03vcjlb3k94cx871f69xaq53bza8mm8xs4jk85gr5jg";
+        };
+      };
+    };
+    "friendsofphp/proxy-manager-lts" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "friendsofphp-proxy-manager-lts-ecadbdc9052e4ad08c60c8a02268712e50427f7c";
+        src = fetchurl {
+          url = "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c";
+          sha256 = "15ch54cm3rvjyvsvqs9ixfn3vnydfxa0knd4g6myapsryirrskvi";
+        };
+      };
+    };
+    "laminas/laminas-code" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "laminas-laminas-code-91aabc066d5620428120800c0eafc0411e441a62";
+        src = fetchurl {
+          url = "https://api.github.com/repos/laminas/laminas-code/zipball/91aabc066d5620428120800c0eafc0411e441a62";
+          sha256 = "01wsb6ph5h8ga9rnlr0lxd3qwn897ccxqxpbz540lfgz7a1prpb0";
+        };
+      };
+    };
+    "paragonie/constant_time_encoding" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "paragonie-constant_time_encoding-58c3f47f650c94ec05a151692652a868995d2938";
+        src = fetchurl {
+          url = "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938";
+          sha256 = "0i9km0lzvc7df9758fm1p3y0679pzvr5m9x3mrz0d2hxlppsm764";
+        };
+      };
+    };
+    "paragonie/random_compat" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "paragonie-random_compat-996434e5492cb4c3edcb9168db6fbb1359ef965a";
+        src = fetchurl {
+          url = "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a";
+          sha256 = "0ky7lal59dihf969r1k3pb96ql8zzdc5062jdbg69j6rj0scgkyx";
+        };
+      };
+    };
+    "php-amqplib/php-amqplib" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "php-amqplib-php-amqplib-1aecbd182b35eb039667c50d7d92d71f105be779";
+        src = fetchurl {
+          url = "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/1aecbd182b35eb039667c50d7d92d71f105be779";
+          sha256 = "0wwzlf2yhjrc523n0y7qh23pxgn4f2qhkbr0jnxzq9j6mm75hnjm";
+        };
+      };
+    };
+    "phpseclib/phpseclib" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "phpseclib-phpseclib-4580645d3fc05c189024eb3b834c6c1e4f0f30a1";
+        src = fetchurl {
+          url = "https://api.github.com/repos/phpseclib/phpseclib/zipball/4580645d3fc05c189024eb3b834c6c1e4f0f30a1";
+          sha256 = "0v3c7n9h99pw4f03bfxjsgni7wpq7xr47nw2hf2hq8yjndw19n3p";
+        };
+      };
+    };
+    "psr/container" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "psr-container-c71ecc56dfe541dbd90c5360474fbc405f8d5963";
+        src = fetchurl {
+          url = "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963";
+          sha256 = "1mvan38yb65hwk68hl0p7jymwzr4zfnaxmwjbw7nj3rsknvga49i";
+        };
+      };
+    };
+    "symfony/console" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-console-b504a3d266ad2bb632f196c0936ef2af5ff6e273";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273";
+          sha256 = "0na3lpgzvrsxngyzv2w90k3ykw1y5j4p6v965v3sal03y6rr2w2i";
+        };
+      };
+    };
+    "symfony/deprecation-contracts" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-deprecation-contracts-26954b3d62a6c5fd0ea8a2a00c0353a14978d05c";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c";
+          sha256 = "1wlaj9ngbyjmgr92gjyf7lsmjfswyh8vpbzq5rdzaxjb6bcsj3dp";
+        };
+      };
+    };
+    "symfony/filesystem" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-filesystem-3d49eec03fda1f0fc19b7349fbbe55ebc1004214";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214";
+          sha256 = "0dhnyj6m9n6359z5c0xh4pz38n89i9x5c9r1s2dlgxz0daysbbyy";
+        };
+      };
+    };
+    "symfony/polyfill-ctype" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-ctype-5bbc823adecdae860bb64756d639ecfec17b050a";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a";
+          sha256 = "0vyv70z1yi2is727d1mkb961w5r1pb1v3wy1pvdp30h8ffy15wk6";
+        };
+      };
+    };
+    "symfony/polyfill-intl-grapheme" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-intl-grapheme-511a08c03c1960e08a883f4cffcacd219b758354";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354";
+          sha256 = "0ifsgsyxf0z0nkynqvr5259dm5dsmbgdpvyi5zfvy8935mi0ki0i";
+        };
+      };
+    };
+    "symfony/polyfill-intl-normalizer" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-intl-normalizer-19bd1e4fcd5b91116f14d8533c57831ed00571b6";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6";
+          sha256 = "1d80jph5ykiw6ydv8fwd43s0aglh24qc1yrzds2f3aqanpbk1gr2";
+        };
+      };
+    };
+    "symfony/polyfill-mbstring" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-mbstring-8ad114f6b39e2c98a8b0e3bd907732c207c2b534";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534";
+          sha256 = "1ym84qp609i50lv4vkd4yz99y19kaxd5kmpdnh66mxx1a4a104mi";
+        };
+      };
+    };
+    "symfony/polyfill-php73" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php73-9e8ecb5f92152187c4799efd3c96b78ccab18ff9";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9";
+          sha256 = "1p0jr92x323pl4frjbhmziyk5g1zig1g30i1v1p0wfli2sq8h5mb";
+        };
+      };
+    };
+    "symfony/polyfill-php80" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-polyfill-php80-7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936";
+          sha256 = "16yydk7rsknlasrpn47n4b4js8svvp4rxzw99dkav52wr3cqmcwd";
+        };
+      };
+    };
+    "symfony/service-contracts" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-service-contracts-d78d39c1599bd1188b8e26bb341da52c3c6d8a66";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66";
+          sha256 = "1cgbn2yx2fyrc3c1d85vdriiwwifr1sdg868f3rhq9bh78f03z99";
+        };
+      };
+    };
+    "symfony/stopwatch" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-stopwatch-f83692cd869a6f2391691d40a01e8acb89e76fee";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/stopwatch/zipball/f83692cd869a6f2391691d40a01e8acb89e76fee";
+          sha256 = "1qh49p2jfca5kpcmlcbjx5izgqqvjd91385zy5mipyslsdik2lwg";
+        };
+      };
+    };
+    "symfony/string" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-string-d9e72497367c23e08bf94176d2be45b00a9d232a";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a";
+          sha256 = "0k4vvcjfdp2dni8gzq4rn8d6n0ivd38sfna70lgsh8vlc8rrlhpf";
+        };
+      };
+    };
+    "symfony/yaml" = {
+      targetDir = "";
+      src = composerEnv.buildZipPackage {
+        name = "symfony-yaml-4cd2e3ea301aadd76a4172756296fe552fb45b0b";
+        src = fetchurl {
+          url = "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b";
+          sha256 = "18yirwiqbh11fwlpqypm0wlc0lnx7prgk68xrn607zcg6cxnfhiz";
+        };
+      };
+    };
+  };
+}
diff --git a/flakes/mypackages/pkgs/telegram-history-dump/default.nix b/flakes/mypackages/pkgs/telegram-history-dump/default.nix
new file mode 100644 (file)
index 0000000..492e265
--- /dev/null
@@ -0,0 +1,18 @@
+{ stdenv, ruby, fetchFromGitHub }:
+stdenv.mkDerivation ({
+  pname = "telegram-history-dump";
+  version = "468ea91-master";
+  src = fetchFromGitHub {
+    owner = "tvdstaaij";
+    repo = "telegram-history-dump";
+    rev = "468ea91e543529b54bc2c5ea28b1ea17f362fd3e";
+    sha256 = "1wmwiqacfa56bmwx50njnb15cg0fy6rbdrmrjd4xfbh8bs6yp0gh";
+    fetchSubmodules = true;
+  };
+  installPhase = ''
+    mkdir -p $out/lib $out/bin
+    cp -a $src $out/lib/telegram-history-dump
+    ln -s $out/lib/telegram-history-dump/telegram-history-dump.rb $out/bin/telegram-history-dump
+    '';
+  buildInputs = [ ruby ];
+})
similarity index 62%
rename from pkgs/telegramircd/default.nix
rename to flakes/mypackages/pkgs/telegramircd/default.nix
index 2f1d7ca57a57e133202b3138609999fafcf95c2e..d9196a2ab944bfdb019e74b656e02ba1e05fa5a8 100644 (file)
@@ -1,11 +1,17 @@
-{ openssl, telethon, python3Packages, mylibs }:
+{ openssl, telethon, python3Packages, fetchFromGitHub }:
 with python3Packages;
 buildPythonApplication rec {
   format = "other";
   pname = "telegramircd";
   version = "master";
   propagatedBuildInputs = [ telethon aiohttp ConfigArgParse openssl ];
 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
   LD_LIBRARY_PATH = "${openssl.out}/lib";
   installPhase = ''
     install -D $src/telegramircd.py $out/bin/telegramircd
similarity index 94%
rename from pkgs/terminal-velocity/default.nix
rename to flakes/mypackages/pkgs/terminal-velocity/default.nix
index 1a015c047397129f936ca6b24ad8573f79a74456..3ccfcd301c1de0bd69a8a866e7d56285ad107072 100644 (file)
@@ -1,5 +1,5 @@
-{ python36Packages }:
-with python36Packages;
+{ python37Packages }:
+with python37Packages;
 buildPythonApplication rec {
   pname = "terminal-velocity-git";
   version = "0.2.0";
 buildPythonApplication rec {
   pname = "terminal-velocity-git";
   version = "0.2.0";
similarity index 86%
rename from pkgs/tiv/default.nix
rename to flakes/mypackages/pkgs/tiv/default.nix
index 3e7a56cd73fb5994008b4a8628c12887bdd9859c..2415db95556ea3427b0624958daeee1b15926537 100644 (file)
@@ -1,5 +1,5 @@
-{ buildPerlPackage, fetchurl, perlPackages }:
-buildPerlPackage rec {
+{ fetchurl, perlPackages }:
+perlPackages.buildPerlPackage rec {
   pname = "tiv";
   version = "2015";
   src = fetchurl {
   pname = "tiv";
   version = "2015";
   src = fetchurl {
diff --git a/flakes/mypackages/pkgs/upcmd/default.nix b/flakes/mypackages/pkgs/upcmd/default.nix
new file mode 100644 (file)
index 0000000..614ae2b
--- /dev/null
@@ -0,0 +1,13 @@
+{ buildGoModule, fetchFromGitHub }:
+buildGoModule rec {
+  pname = "upcmd";
+  version = "20220112";
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "up";
+    rev = "rolling-${version}";
+    sha256 = "sha256-dCi8p0oqLjEhEazbT4sgH7Sku3f/N79VWj5CO7LbvVA=";
+  };
+  doCheck = false;
+  vendorSha256 = "sha256-Ve+lEVrxv4rwymrqHSc1V4SL7BWP4wsIHF8ObBWyHE4=";
+}
diff --git a/flakes/mypackages/pkgs/webapps/adminer/default.nix b/flakes/mypackages/pkgs/webapps/adminer/default.nix
new file mode 100644 (file)
index 0000000..cd01080
--- /dev/null
@@ -0,0 +1,14 @@
+{ stdenv, fetchurl }:
+stdenv.mkDerivation rec {
+  version = "4.8.2";
+  pname = "adminer";
+  src = fetchurl {
+    url = "https://github.com/adminerevo/adminerevo/releases/download/v${version}/${pname}-${version}.php";
+    sha256 = "sha256-jXcnGLyNQZqJKS0Rs+UY1SxzknBEZwBhcbD0BmJVFKs=";
+  };
+  phases = "installPhase";
+  installPhase = ''
+    mkdir -p $out
+    cp $src $out/index.php
+  '';
+}
similarity index 97%
rename from pkgs/webapps/apache-theme/theme/style.css
rename to flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css
index 4d25c9fb7dc8515b4ab344a6286c980df842747b..e46139f471ab5fa1ecbe0e6a3660371ba52b67fe 100644 (file)
@@ -5,7 +5,7 @@
     Theme name: Apaxy
     Theme author: @adamwhitcroft
 \*------------------------------------*/
     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;
 /* Have to use @import for the font, as you can only specify a single stylesheet */
 * {
        margin:0;
diff --git a/flakes/mypackages/pkgs/webapps/default.nix b/flakes/mypackages/pkgs/webapps/default.nix
new file mode 100644 (file)
index 0000000..18a724d
--- /dev/null
@@ -0,0 +1,24 @@
+{ callPackage, mylibs, composerEnv, sources }:
+rec {
+  adminer = callPackage ./adminer {};
+  apache-theme = import ./apache-theme;
+  awl = callPackage ./awl {};
+  davical = callPackage ./davical {};
+  dokuwiki = callPackage ./dokuwiki {};
+  infcloud = callPackage ./infcloud {};
+  mantisbt_2 = callPackage ./mantisbt_2 {};
+  nextcloud_25 = callPackage ./nextcloud { nextcloudVersion = 25; };
+  nextcloud_26 = callPackage ./nextcloud { nextcloudVersion = 26; };
+  nextcloud_27 = callPackage ./nextcloud { nextcloudVersion = 27; };
+  nextcloud_25-all = nextcloud_25.withApps (a: builtins.attrValues nextcloud_25.allSupportedApps);
+  nextcloud_26-all = nextcloud_26.withApps (a: builtins.attrValues nextcloud_26.allSupportedApps);
+  nextcloud_27-all = nextcloud_27.withApps (a: builtins.attrValues nextcloud_27.allSupportedApps);
+  phpbb = callPackage ./phpbb {};
+  phpldapadmin = callPackage ./phpldapadmin {};
+  rompr = callPackage ./rompr {};
+  roundcubemail = callPackage ./roundcubemail {};
+  spip = callPackage ./spip {};
+  ttrss = callPackage ./ttrss { inherit sources; };
+  wallabag = callPackage ./wallabag { inherit composerEnv; };
+  yourls = callPackage ./yourls {};
+}
similarity index 79%
rename from pkgs/webapps/dokuwiki/default.nix
rename to flakes/mypackages/pkgs/webapps/dokuwiki/default.nix
index 874f0d87696f69b2ba6d4a21006414dedf2eead1..db8be30f70d121336cea1421823a0440c7a63800 100644 (file)
@@ -1,4 +1,4 @@
-{ varDir ? "/var/lib/dokuwiki", preload ? "", lib, callPackage, stdenv, mylibs, writeText }:
+{ varDir ? "/var/lib/dokuwiki", preload ? "", lib, callPackage, stdenv, fetchFromGitHub, writeText }:
 let
   preloadFile = plugins: let preloads = [preload]
       ++ builtins.concatMap (p: lib.optional (lib.hasAttr "preload" p) (p.preload p)) plugins;
 let
   preloadFile = plugins: let preloads = [preload]
       ++ builtins.concatMap (p: lib.optional (lib.hasAttr "preload" p) (p.preload p)) plugins;
@@ -26,7 +26,16 @@ let
         passthru = toPassthru newDokuwiki (pkg.plugins ++ plugins);
       });
     in newDokuwiki;
         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
     phases = "unpackPhase buildPhase installPhase installPreloadPhase fixupPhase";
     buildPhase = ''
       mv conf conf.dist
similarity index 96%
rename from pkgs/webapps/mantisbt_2/default.nix
rename to flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix
index 5aa04d1b4574165bd07be60139a0d00dad2a67c3..466595d04095c06ae69ca57b5283b2f51b4b4492 100644 (file)
@@ -5,6 +5,7 @@ let
     (name: callPackage (./plugins + "/${name}") {});
   toPassthru = pkg: plugins: {
     inherit plugins allPlugins;
     (name: callPackage (./plugins + "/${name}") {});
   toPassthru = pkg: plugins: {
     inherit plugins allPlugins;
+    pluginNames = map (n: n.pluginName) plugins;
     withPlugins = withPlugins pkg;
   };
   withPlugins = pkg: toPlugins:
     withPlugins = withPlugins pkg;
   };
   withPlugins = pkg: toPlugins:
similarity index 92%
rename from pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix
rename to flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix
index dc6c7de0a79e431846f98497aa473867185324a1..1ab00c551c74469731d6a7c150ee3cf573883ccc 100644 (file)
@@ -16,6 +16,7 @@ stdenv.mkDerivation rec {
     cp -a Source* $out/
     '';
   passthru = {
     cp -a Source* $out/
     '';
   passthru = {
+    pluginName = "source-integration";
     selector = "Source*";
   };
 }
     selector = "Source*";
   };
 }
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix
new file mode 100644 (file)
index 0000000..6e7380c
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  audioplayer_3_4_0 = buildApp rec {
+    appName = "audioplayer";
+    version = "3.4.0";
+    url = "https://github.com/Rello/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-pog9cll02+AbYHG/jiUztO9odqu7PSEWBUieK32Eqf4=";
+  };
+  versions = {
+    "25" = audioplayer_3_4_0;
+    "26" = audioplayer_3_4_0;
+    "27" = audioplayer_3_4_0;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app audioplayer")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix
new file mode 100644 (file)
index 0000000..0503e5b
--- /dev/null
@@ -0,0 +1,21 @@
+{ buildApp, nextcloudVersion }:
+let
+  bookmarks_12_1_0 = buildApp rec {
+    appName = "bookmarks";
+    version = "12.1.0";
+    url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-NVyaVeg/UPgFaW/iCZiJkw1l5Vqc+S/4FMfFhHCBUTo=";
+  };
+  bookmarks_13_0_1 = buildApp rec {
+    appName = "bookmarks";
+    version = "13.0.1";
+    url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-7Gx8e8C2dDkB/39eAGKOLrP3YkVbGkfPKpQBeCaV/cE=";
+  };
+  versions = {
+    "25" = bookmarks_12_1_0;
+    "26" = bookmarks_13_0_1;
+    "27" = bookmarks_13_0_1;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app bookmarks")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix
new file mode 100644 (file)
index 0000000..497d4ba
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  calendar_4_4_4 = buildApp rec {
+    appName = "calendar";
+    version = "4.4.4";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-8UeHOpgbUf2oHHOvLN58v68QvyDYQXkSjsVKn6UGrGU=";
+  };
+  versions = {
+    "25" = calendar_4_4_4;
+    "26" = calendar_4_4_4;
+    "27" = calendar_4_4_4;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app calendar")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix
new file mode 100644 (file)
index 0000000..05f0928
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  carnet_0_25_2 = buildApp rec {
+    appName = "carnet";
+    version = "0.25.2";
+    url = "https://github.com/PhieF/CarnetNextcloud/releases/download/v${version}/${appName}-nc-v${version}.tar.gz";
+    sha256 = "sha256-HArD+M6UA9BhSsrlpp/gsKWkUTWAoNHl/gr0S3AlKzg=";
+  };
+  versions = {
+    "25" = carnet_0_25_2;
+    "26" = carnet_0_25_2;
+    "27" = carnet_0_25_2;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app carnet")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix
new file mode 100644 (file)
index 0000000..f8931b7
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  contacts_5_3_2 = buildApp rec {
+    appName = "contacts";
+    version = "5.3.2";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-1jQ+pyLBPU7I4wSPkmezJq7ukrQh8WPErG4J6Ps3LR4=";
+  };
+  versions = {
+    "25" = contacts_5_3_2;
+    "26" = contacts_5_3_2;
+    "27" = contacts_5_3_2;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app contacts")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix
new file mode 100644 (file)
index 0000000..32fdcc0
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  cookbook_0_10_2 = buildApp rec {
+    appName = "cookbook";
+    version = "0.10.2";
+    url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/Cookbook-${version}.tar.gz";
+    sha256 = "sha256-H7KVeISBnu0/4Q31ihhiXvRtkXz4yLGOAsAj5ERgeCM=";
+  };
+  versions = {
+    "25" = cookbook_0_10_2;
+    "26" = cookbook_0_10_2;
+    "27" = cookbook_0_10_2;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app cookbook")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix
new file mode 100644 (file)
index 0000000..c5dd2d3
--- /dev/null
@@ -0,0 +1,27 @@
+{ buildApp, nextcloudVersion }:
+let
+  deck_1_8_5 = buildApp rec {
+    appName = "deck";
+    version = "1.8.5";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-KsSSl9orqMEKJlBftHwCi/dh+aMCxZqjS7kPT0uDZlE=";
+  };
+  deck_1_9_2 = buildApp rec {
+    appName = "deck";
+    version = "1.9.2";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-h1fmT4CCEFDZPBwFDIBLmFGJmO1Wt3a5nVXX5xCk0o0=";
+  };
+  deck_1_10_0 = buildApp rec {
+    appName = "deck";
+    version = "1.10.0";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-W0XVvhTQoCjoK7S2tEd7bvU0MTWtqYt7QiB9H1p1UP8=";
+  };
+  versions = {
+    "25" = deck_1_8_5;
+    "26" = deck_1_9_2;
+    "27" = deck_1_10_0;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app deck")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix
new file mode 100644 (file)
index 0000000..c03c479
--- /dev/null
@@ -0,0 +1,24 @@
+{ buildApp, nextcloudVersion }:
+let
+  otherConfig = {
+    mimetypealiases = {
+      "application/x-drawio" = "drawio";
+    };
+    mimetypemapping = {
+      "drawio" = ["application/x-drawio"];
+    };
+  };
+  drawio_2_1_2 = buildApp rec {
+    appName = "drawio";
+    version = "2.1.2";
+    url = "https://github.com/jgraph/drawio-nextcloud/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-5BrEnS2cMk/vwkAr1lXKtfocqReZAj1+pbDqmi/uG0A=";
+    inherit otherConfig;
+  };
+  versions = {
+    "25" = drawio_2_1_2;
+    "26" = drawio_2_1_2;
+    "27" = drawio_2_1_2;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app drawio")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix
new file mode 100644 (file)
index 0000000..941304a
--- /dev/null
@@ -0,0 +1,27 @@
+{ buildApp, nextcloudVersion }:
+let
+  external_5_0_2 = buildApp rec {
+    appName = "external";
+    version = "5.0.2";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-Bkk9X1tVonKsiA3YlKux2y8K7HdJv4qM/eJ9TP+i17I=";
+  };
+  external_5_1_0 = buildApp rec {
+    appName = "external";
+    version = "5.1.0";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-EMKWSXufw4FMyaN2f37yifrpUm6QBqqpPPFmvLvYYmY=";
+  };
+  external_5_2_0 = buildApp rec {
+    appName = "external";
+    version = "5.2.0";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-XqeJCWS8mncS7CfrnXdhtzdgkFTib/RnursJ/AqyvD8=";
+  };
+  versions = {
+    "25" = external_5_0_2;
+    "26" = external_5_1_0;
+    "27" = external_5_2_0;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app external")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix
new file mode 100644 (file)
index 0000000..589115e
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  extract_1_3_6 = buildApp rec {
+    appName = "extract";
+    version = "1.3.6";
+    url = "https://github.com/PaulLereverend/NextcloudExtract/releases/download/${version}/${appName}.tar.gz";
+    sha256 = "sha256-y1NacOWnCd/f5sOeEOLeZrWnqwi8q/XezOrhT7AzV/o=";
+  };
+  versions = {
+    "25" = extract_1_3_6;
+    "26" = extract_1_3_6;
+    "27" = extract_1_3_6;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app extract")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix
new file mode 100644 (file)
index 0000000..cf8e179
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  files_markdown_2_4_1 = buildApp rec {
+    appName = "files_markdown";
+    version = "2.4.1";
+    url = "https://github.com/icewind1991/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-6A9IMfRbKcF1+et7pzFF4zlZDmegx562cnyYsOFsVzU=";
+  };
+  versions = {
+    "25" = files_markdown_2_4_1;
+    "26" = files_markdown_2_4_1;
+    "27" = files_markdown_2_4_1;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_markdown")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix
new file mode 100644 (file)
index 0000000..fff85d7
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  files_mindmap_0_0_28 = buildApp rec {
+    appName = "files_mindmap";
+    version = "0.0.28";
+    url = "https://github.com/ACTom/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-VlzqstlsdinaqkbK32NvS1oFoQcFasJGHSlcKxdQwIM=";
+  };
+  versions = {
+    "25" = files_mindmap_0_0_28;
+    "26" = files_mindmap_0_0_28;
+    "27" = files_mindmap_0_0_28;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_mindmap")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix
new file mode 100644 (file)
index 0000000..97aeaf7
--- /dev/null
@@ -0,0 +1,14 @@
+{ buildApp, nextcloudVersion }:
+let
+  files_readmemd_2_0_0 = buildApp rec {
+    appName = "files_readmemd";
+    version = "2.0.0";
+    url = "https://github.com/mamatt/files_readmemd/releases/download/V${version}/${appName}.tar.gz";
+    sha256 = "sha256-vUoSK+b4gj51eJcocrXINO/eFKPRZQoj0q6l0gVBqgw=";
+  };
+  versions = {
+    "25" = files_readmemd_2_0_0;
+    "26" = files_readmemd_2_0_0;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_readmemd")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix
new file mode 100644 (file)
index 0000000..55f4ba7
--- /dev/null
@@ -0,0 +1,14 @@
+{ buildApp, nextcloudVersion }:
+let
+  flowupload_1_1_3 = buildApp rec {
+    appName = "flowupload";
+    version = "1.1.3";
+    url = "https://github.com/e-alfred/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
+    sha256 = "0d1xvimd4hzd0jpvv1h89zfqv3ajlrrm1xdbggvjhk9bllwqgxng";
+  };
+  versions = {
+    "22" = flowupload_1_1_3;
+    "23" = flowupload_1_1_3;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app flowupload")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix
new file mode 100644 (file)
index 0000000..be230fd
--- /dev/null
@@ -0,0 +1,22 @@
+{ buildApp, nextcloudVersion }:
+let
+  gpxedit_0_0_14 = buildApp rec {
+    appName = "gpxedit";
+    version = "0.0.14";
+    url = "https://gitlab.com/eneiluj/gpxedit-oc/wikis/uploads/5b184c24f9e767ad19a84e177a9b473c/${appName}-${version}.tar.gz";
+    sha256 = "1kgpcxps73l83krrjxdzh4vzacja4m3vwidf9kidgqq505cgzq90";
+    otherConfig = {
+      mimetypealiases = {
+        "application/gpx+xml" = "gpx";
+      };
+      mimetypemapping = {
+        "gpx" = ["application/gpx+xml"];
+      };
+    };
+  };
+  versions = {
+    "22" = gpxedit_0_0_14;
+    "23" = gpxedit_0_0_14;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app gpxedit")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix
new file mode 100644 (file)
index 0000000..5a3b7e7
--- /dev/null
@@ -0,0 +1,31 @@
+{ buildApp, nextcloudVersion }:
+let
+  otherConfig = {
+    mimetypealiases = {
+      "application/gpx+xml" = "gpx";
+    };
+    mimetypemapping = {
+      "gpx" = ["application/gpx+xml"];
+    };
+  };
+  gpxpod_5_0_10 = buildApp rec {
+    appName = "gpxpod";
+    version = "5.0.10";
+    url = "https://github.com/julien-nc/gpxpod/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-Ylhl9jdOxG+Qfk5zgNO8FwOtAzrjGHS66y59qmorXPU=";
+    inherit otherConfig;
+  };
+  gpxpod_5_0_12 = buildApp rec {
+    appName = "gpxpod";
+    version = "5.0.12";
+    url = "https://github.com/julien-nc/gpxpod/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-uhz6AC8opDQkFQDpG4u8H4vkFtzbFAZvb8r32QHj/8I=";
+    inherit otherConfig;
+  };
+  versions = {
+    "25" = gpxpod_5_0_10;
+    "26" = gpxpod_5_0_12;
+    "27" = gpxpod_5_0_12;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app gpxpod")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix
new file mode 100644 (file)
index 0000000..b966d3d
--- /dev/null
@@ -0,0 +1,27 @@
+{ buildApp, nextcloudVersion }:
+let
+  groupfolders_13_1_5 = buildApp rec {
+    appName = "groupfolders";
+    version = "13.1.5";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-1yf/uSN8TRsYvK3m2pxGaXo9xxHNrI/NjyWJ8rLPQfg=";
+  };
+  groupfolders_14_0_4 = buildApp rec {
+    appName = "groupfolders";
+    version = "14.0.4";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-QzlD8dLI6T7Sex75ZsO2F40nTrg2Ig6tHTG8cslnNME=";
+  };
+  groupfolders_15_0_2 = buildApp rec {
+    appName = "groupfolders";
+    version = "15.0.2";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-NsTZhmY1XBKHn/1IcIp2Al7BwJzE2xoBzgyBXnmuWls=";
+  };
+  versions = {
+    "25" = groupfolders_13_1_5;
+    "26" = groupfolders_14_0_4;
+    "27" = groupfolders_15_0_2;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app groupfolders")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix
new file mode 100644 (file)
index 0000000..afae917
--- /dev/null
@@ -0,0 +1,27 @@
+{ buildApp, nextcloudVersion }:
+let
+  impersonate_1_12_1 = buildApp rec {
+    appName = "impersonate";
+    version = "1.12.1";
+    url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-xhlWGbLm1CtW4BSa/yQhv05Kn2r1DZJDUoDXQOLpEeQ=";
+  };
+  impersonate_1_13_1 = buildApp rec {
+    appName = "impersonate";
+    version = "1.13.1";
+    url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-+tFWW5wQnbHxbgGdnp2GAFzfXnrW+e3eECY4O6ZckCU=";
+  };
+  impersonate_1_14_0 = buildApp rec {
+    appName = "impersonate";
+    version = "1.14.0";
+    url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-A1rGJJLaWhiNf9l0YUh6WOB+fKRBRDckE890hq5OB4k=";
+  };
+  versions = {
+    "25" = impersonate_1_12_1;
+    "26" = impersonate_1_13_1;
+    "27" = impersonate_1_14_0;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app impersonate")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix
new file mode 100644 (file)
index 0000000..d3834ad
--- /dev/null
@@ -0,0 +1,13 @@
+{ buildApp, nextcloudVersion }:
+let
+   integration_dropbox_2_0_1 = buildApp rec {
+    appName = "integration_dropbox";
+    version = "2.0.1";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-RPCd8+/yKNlIGfEU+ITS8DBIxJDfc//8MGHaIjfYxdQ=";
+  };
+  versions = {
+    "27" = integration_dropbox_2_0_1;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app integration_dropbox")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix
new file mode 100644 (file)
index 0000000..7be8c6b
--- /dev/null
@@ -0,0 +1,24 @@
+{ buildApp, nextcloudVersion }:
+let
+  keeweb_0_6_13 = buildApp rec {
+    appName = "keeweb";
+    version = "0.6.13";
+    url = "https://github.com/jhass/nextcloud-keeweb/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-J9jFVXpmoeAjDI/crsXHVJvPvxCYaimWVuq473nLsNM=";
+    installPhase = ''
+      mkdir -p $out
+      cp -R . $out/
+      '';
+    otherConfig = {
+      mimetypemapping = {
+        "kdbx" = ["application/x-kdbx"];
+      };
+    };
+  };
+  versions = {
+    "25" = keeweb_0_6_13;
+    "26" = keeweb_0_6_13;
+    "27" = keeweb_0_6_13;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app keeweb")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix
new file mode 100644 (file)
index 0000000..1b29173
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  maps_1_1_0 = buildApp rec {
+    appName = "maps";
+    version = "1.1.0";
+    url = "https://github.com/nextcloud/maps/releases/download/v${version}/${appName}-${version}.tar.gz";
+    sha256 = "sha256-Me/V+9wXZyq3UEVx9Nqim6pfPFJaALjKv9f7iUjill8=";
+  };
+  versions = {
+    "25" = maps_1_1_0;
+    "26" = maps_1_1_0;
+    "27" = maps_1_1_0;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app maps")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix
new file mode 100644 (file)
index 0000000..0fe7409
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  metadata_0_19_0 = buildApp rec {
+    appName = "metadata";
+    version = "0.19.0";
+    url = "https://github.com/gino0631/nextcloud-metadata/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-XfFxCwRFO0WnBPU4CIejNXySRQdguvzauu62bzUKD44=";
+  };
+  versions = {
+    "25" = metadata_0_19_0;
+    "26" = metadata_0_19_0;
+    "27" = metadata_0_19_0;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app metadata")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix
new file mode 100644 (file)
index 0000000..fc96224
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  music_1_8_4 = buildApp rec {
+    appName = "music";
+    version = "1.8.4";
+    url = "https://github.com/owncloud/music/releases/download/v${version}/${appName}_${version}_for_nextcloud.tar.gz";
+    sha256 = "sha256-WWXMpOyTRxykAVeUj/h6QP5ENqaMvTcPIqPQjhY68KA=";
+  };
+  versions = {
+    "25" = music_1_8_4;
+    "26" = music_1_8_4;
+    "27" = music_1_8_4;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app music")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix
new file mode 100644 (file)
index 0000000..7677c6c
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  notes_4_8_1 = buildApp rec {
+    appName = "notes";
+    version = "4.8.1";
+    url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-BfH1W+7TWKZRuAAhKQEQtlv8ePTtJQvZQVMMu3zULR4=";
+  };
+  versions = {
+    "25" = notes_4_8_1;
+    "26" = notes_4_8_1;
+    "27" = notes_4_8_1;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app notes")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix
new file mode 100644 (file)
index 0000000..dcdaad2
--- /dev/null
@@ -0,0 +1,21 @@
+{ buildApp, nextcloudVersion }:
+let
+  ocsms_2_2_0 = buildApp rec {
+    appName = "ocsms";
+    version = "2.2.0";
+    url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
+    sha256 = "1hjl11lxdflk4w0l8prcjr3jvmsm8njldbrmnqm7yhdy6qcfli28";
+    installPhase = ''
+      mkdir -p $out
+      cp -R . $out/
+      '';
+  };
+  versions = {
+    "18" = ocsms_2_2_0;
+    "19" = ocsms_2_2_0;
+    "20" = ocsms_2_2_0;
+    # Beware, 1.10.1 has a too wide range of versions and is not
+    # compatible with nextcloud > 20!
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app ocsms")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix
new file mode 100644 (file)
index 0000000..e93df00
--- /dev/null
@@ -0,0 +1,21 @@
+{ buildApp, nextcloudVersion }:
+let
+  onlyoffice_7_9_0 = buildApp rec {
+    appName = "onlyoffice";
+    version = "7.9.0";
+    url = "https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-GN0edA/aVdOEDR0LF6PgG2vTcULaG9RMj2gIAoxSVAM=";
+  };
+  onlyoffice_8_2_0 = buildApp rec {
+    appName = "onlyoffice";
+    version = "8.2.0";
+    url = "https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-DfZKgpkpcogy9I3A3ru0V/WR5wYWBr+wrHe+mQJBPYk=";
+  };
+  versions = {
+    "25" = onlyoffice_7_9_0;
+    "26" = onlyoffice_7_9_0;
+    "27" = onlyoffice_8_2_0;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app onlyoffice")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix
new file mode 100644 (file)
index 0000000..5559b22
--- /dev/null
@@ -0,0 +1,21 @@
+{ buildApp, nextcloudVersion }:
+let
+  passman_2_4_5 = buildApp rec {
+    appName = "passman";
+    version = "2.4.5";
+    url = "https://releases.passman.cc/${appName}_${version}.tar.gz";
+    sha256 = "sha256-wcRx1lUEHbJBJBBSKOScGljOgHM7Vpf69OymJoI8S2Y=";
+  };
+  passman_2_4_7 = buildApp rec {
+    appName = "passman";
+    version = "2.4.7";
+    url = "https://releases.passman.cc/${appName}_${version}.tar.gz";
+    sha256 = "sha256-CeNaN0cioVjcW6ILB//BIvmjQWcbvfK3m8jVQ8LGtyM=";
+  };
+  versions = {
+    "25" = passman_2_4_5;
+    "26" = passman_2_4_7;
+    "27" = passman_2_4_7;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app passman")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix
new file mode 100644 (file)
index 0000000..a50ac43
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  polls_5_2_0 = buildApp rec {
+    appName = "polls";
+    version = "5.2.0";
+    url = "https://github.com/nextcloud/polls/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-45YNcSeFG9v3mfk7eLbDiy6hFgmfePY0j86JiVS0k14=";
+  };
+  versions = {
+    "25" = polls_5_2_0;
+    "26" = polls_5_2_0;
+    "27" = polls_5_2_0;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app polls")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix
new file mode 100644 (file)
index 0000000..da48f91
--- /dev/null
@@ -0,0 +1,16 @@
+{ buildApp, nextcloudVersion }:
+let
+  side_menu_3_10_3 = buildApp rec {
+    appName = "side_menu";
+    version = "3.10.3";
+    url = "https://gitnet.fr/attachments/9c9be610-5d3b-414d-a523-396c237c15ef";
+    filename = "${appName}-${version}.tar.gz";
+    sha256 = "sha256-WKbc6Ln6v3LYyRzwy0xAOmXilbqrWGS8XGWIT+TajdM=";
+  };
+  versions = {
+    "25" = side_menu_3_10_3;
+    "26" = side_menu_3_10_3;
+    "27" = side_menu_3_10_3;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app side_menu")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix
new file mode 100644 (file)
index 0000000..912b5bf
--- /dev/null
@@ -0,0 +1,14 @@
+{ buildApp, nextcloudVersion }:
+let
+  social_0_6_1 = buildApp rec {
+    appName = "social";
+    version = "0.6.1";
+    url = "https://github.com/nextcloud-releases/social/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-5mww31ibwgnSiTuTaKo5MngbhPIw8lwLt1tkQySmerY=";
+  };
+  versions = {
+    "26" = social_0_6_1;
+    "27" = social_0_6_1;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app social")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix
new file mode 100644 (file)
index 0000000..d8a20b9
--- /dev/null
@@ -0,0 +1,27 @@
+{ buildApp, nextcloudVersion }:
+let
+  spreed_15_0_7 = buildApp rec {
+    appName = "spreed";
+    version = "15.0.7";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-J9udO7qlRL+TDwTPTbBpYeZLUi4oco42LoqYoHJbIyE=";
+  };
+  spreed_16_0_5 = buildApp rec {
+    appName = "spreed";
+    version = "16.0.5";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-tTDnWqNkP6fMSdCP1c0vPh8f0K7sTFBvRwws5Gln9Mg=";
+  };
+  spreed_17_0_3 = buildApp rec {
+    appName = "spreed";
+    version = "17.0.3";
+    url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
+    sha256 = "sha256-vb08DI+q+5f87zz2UguE1y6b0NV2EoICYpaKUGmyF5w=";
+  };
+  versions = {
+    "25" = spreed_15_0_7;
+    "26" = spreed_16_0_5;
+    "27" = spreed_17_0_3;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app spreed")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix
new file mode 100644 (file)
index 0000000..906719d
--- /dev/null
@@ -0,0 +1,14 @@
+{ buildApp, nextcloudVersion }:
+let
+  talk_matterbridge_1_26_0 = buildApp rec {
+    appName = "talk_matterbridge";
+    version = "1.26.0";
+    url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-gD5lfLWBjWOiy2ULf31ngQVIQbMZj3iwu3zuVrEDSks=";
+  };
+  versions = {
+    "25" = talk_matterbridge_1_26_0;
+    "26" = talk_matterbridge_1_26_0;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app talk_matterbridge")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix
new file mode 100644 (file)
index 0000000..aee7650
--- /dev/null
@@ -0,0 +1,15 @@
+{ buildApp, nextcloudVersion }:
+let
+  tasks_0_15_0 = buildApp rec {
+    appName = "tasks";
+    version = "0.15.0";
+    url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
+    sha256 = "sha256-nizJUFByK78FZ6KPJ4zfOU5Z9ClAxhwgQ7d+X5TGnM8=";
+  };
+  versions = {
+    "25" = tasks_0_15_0;
+    "26" = tasks_0_15_0;
+    "27" = tasks_0_15_0;
+  };
+in
+  versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app tasks")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/default.nix b/flakes/mypackages/pkgs/webapps/nextcloud/default.nix
new file mode 100644 (file)
index 0000000..6aeeaed
--- /dev/null
@@ -0,0 +1,84 @@
+{ nextcloudVersion, otherConfig ? {}, lib, stdenv, callPackage, fetchzip, fetchurl, postInstall ? null }:
+let
+  shasumsAndVersion = {
+    "25" = { sum = "sha256-alvh0fWESSS5KbfiKI1gaoahisDWnfT/bUhsSEEXfQI="; fullVersion = "25.0.10"; }; # php 7.4 - 8.2
+    "26" = { sum = "sha256-nhq0aAY4T1hUZdKJY66ZSlirCSgPQet8YJpciwJw1b4="; fullVersion = "26.0.5"; }; # php 8.0 - 8.2
+    "27" = { sum = "sha256-ei3OpDqjuPswM0fv2kxvN3M8yhE8juFt2fDl+2jHIS8="; fullVersion = "27.0.2"; }; # php 8.0 - 8.2
+  };
+  appNames = [
+    "audioplayer" "bookmarks" "calendar" "carnet"
+    "contacts" "cookbook" "deck" "external" "extract" "files_markdown" "files_mindmap"
+    "files_readmemd" "flowupload" "gpxedit" "gpxpod" "groupfolders" "impersonate"
+    "keeweb" "maps" "metadata" "music" "notes" "ocsms" "onlyoffice" "passman" "polls"
+    "social" "spreed" "talk_matterbridge" "tasks" "drawio" "side_menu"
+    "integration_dropbox"
+  ];
+  toApp = name: callPackage (./apps + "/${name}.nix") { inherit buildApp nextcloudVersion; };
+  allSupportedApps = lib.mapAttrs (n: v: v.value) (lib.filterAttrs (n: v: v.success) (lib.genAttrs appNames (name: builtins.tryEval (toApp name))));
+  allApps = lib.genAttrs appNames toApp;
+  buildApp = { appName, version, filename ? null, url, sha256, installHook ? (n: ""), otherConfig ? {}, installPhase ? "mkdir -p $out && cp -R . $out/" }:
+    stdenv.mkDerivation rec {
+      name = "nextcloud-app-${appName}-${version}";
+      inherit version;
+      phases = "unpackPhase installPhase";
+      inherit installPhase;
+      src = fetchurl ({ inherit url sha256; } // lib.optionalAttrs (filename != null) { name = filename; });
+      passthru = {
+        inherit appName otherConfig installHook;
+      };
+    };
+  toPassthru = pkg: apps: otherConfig: {
+    inherit apps otherConfig allApps allSupportedApps buildApp;
+    withApps = withApps pkg;
+  };
+  withApps = pkg: toApps:
+    let
+      apps = toApps allApps;
+      toInstallApp = n: ''
+        if [ -e $out/apps/${n.appName} ]; then
+          echo "${n.appName} already exists"
+          false
+        fi
+        ln -sf ${n} $out/apps/${n.appName}
+      '' + (n.installHook n);
+      zipped = lib.attrsets.zipAttrs ([pkg.otherConfig or {}] ++ map (v: v.otherConfig) apps);
+      appConfigs = with lib.attrsets; with lib.lists; {
+        mimetypealiases = foldr (h: prev: prev // h) {} (zipped.mimetypealiases or []);
+        mimetypemapping = mapAttrs (_: v: unique (flatten v)) (zipAttrs (zipped.mimetypemapping or []));
+      };
+      newNextcloud = pkg.overrideAttrs(old: {
+        installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallApp apps);
+        passthru = toPassthru newNextcloud (pkg.apps ++ apps) appConfigs;
+      });
+    in newNextcloud;
+  package = stdenv.mkDerivation rec {
+    name = "nextcloud-${version}";
+    version = shasumsAndVersion."${builtins.toString nextcloudVersion}".fullVersion;
+
+    src = fetchurl {
+      url = "https://download.nextcloud.com/server/releases/${name}.tar.bz2";
+      sha256 = shasumsAndVersion."${builtins.toString nextcloudVersion}".sum;
+    };
+
+    inherit postInstall;
+    installPhase = ''
+      mkdir -p $out/
+      cp -R . $out/
+      sed -i -e "/'appDirsWithDifferentOwner'/d" $out/apps/settings/lib/Controller/CheckSetupController.php
+      mv $out/config $out/config.example
+      runHook postInstall
+    '';
+
+    noAuditTmpdir = true;
+    dontPatchELF = true;
+    dontStrip = true;
+    passthru = toPassthru package [] otherConfig;
+    meta = {
+      description = "Sharing solution for files, calendars, contacts and more";
+      homepage = https://nextcloud.com;
+      maintainers = with lib.maintainers; [ schneefux bachp globin fpletz ];
+      license = lib.licenses.agpl3Plus;
+      platforms = with lib.platforms; unix;
+    };
+  };
+in package
diff --git a/flakes/mypackages/pkgs/webapps/rompr/default.nix b/flakes/mypackages/pkgs/webapps/rompr/default.nix
new file mode 100644 (file)
index 0000000..5b3e7e0
--- /dev/null
@@ -0,0 +1,17 @@
+{ varDir ? "/var/lib/rompr", stdenv, fetchFromGitHub }:
+stdenv.mkDerivation ({
+  pname = "rompr";
+  version = "1.24";
+  src = fetchFromGitHub {
+    owner = "fatg3erman";
+    repo = "RompR";
+    rev = "0d8f597027ac71b320963fe3f33f461a136312ad";
+    sha256 = "13p3c4whhmvz1vvh9fva5gdx4xji288k108hjdi8b1yn506lzix2";
+    fetchSubmodules = true;
+  };
+  installPhase = ''
+        cp -a . $out
+        ln -sf ${varDir}/prefs $out/prefs
+        ln -sf ${varDir}/albumart $out/albumart
+  '';
+})
similarity index 93%
rename from pkgs/webapps/ttrss/default.nix
rename to flakes/mypackages/pkgs/webapps/ttrss/default.nix
index aeb573c32ab91982582509b77344ff549c64048b..fa2453ec74545b2b3a19bcc1dee054589bf04081 100644 (file)
@@ -21,9 +21,9 @@ let
     in newTtrss;
   package = stdenv.mkDerivation rec {
     pname = "tt-rss";
     in newTtrss;
   package = stdenv.mkDerivation rec {
     pname = "tt-rss";
-    version = sources.webapps-ttrss.version;
+    version = "${sources.tools.ttrss.shortRev}-master";
     name = "${pname}-${version}";
     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} .
     buildPhase = ''
       rm -rf lock feed-icons cache
       ln -sf ${varDir}/{lock,feed-icons,cache} .
diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix
new file mode 100644 (file)
index 0000000..39f9e0e
--- /dev/null
@@ -0,0 +1,18 @@
+{ patched ? false, stdenv, fetchFromGitHub, lib }:
+stdenv.mkDerivation ({
+  pname = "ttrss-af_feedmod";
+  version = "0ea2092-master";
+  src = fetchFromGitHub {
+    owner = "mbirth";
+    repo = "ttrss_plugin-af_feedmod";
+    rev = "0ea2092dd34067ecd898802cfca3570023d1ecfe";
+    sha256 = "02ibf47zcrsc2rr45wsix8gxyyf371davj8n8i0gj1zdq95klvnv";
+    fetchSubmodules = true;
+  };
+  patches = lib.optionals patched [ ./type_replace.patch ];
+  installPhase = ''
+    mkdir $out
+    cp init.php $out
+    '';
+  passthru.pluginName = "af_feedmod";
+})
diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix
new file mode 100644 (file)
index 0000000..d283160
--- /dev/null
@@ -0,0 +1,17 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation ({
+  pname = "ttrss-auth-ldap";
+  version = "4d751b0-master";
+  src = fetchFromGitHub {
+    owner = "hydrian";
+    repo = "TTRSS-Auth-LDAP";
+    rev = "4d751b095c29a8dbe2dc7bb07777742956136e94";
+    sha256 = "0b9fl86acrzpcv41r7pj3bl8b3n72hpkdywzx9zjyfqv5pskxyim";
+    fetchSubmodules = true;
+  };
+  installPhase = ''
+    mkdir $out
+    cp plugins/auth_ldap/init.php $out
+    '';
+  passthru.pluginName = "auth_ldap";
+})
diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix
new file mode 100644 (file)
index 0000000..2f86416
--- /dev/null
@@ -0,0 +1,18 @@
+{ patched ? false, stdenv, fetchFromGitHub, lib }:
+stdenv.mkDerivation ({
+  pname = "ttrss-feediron";
+  version = "407168c-master";
+  src = fetchFromGitHub {
+    owner = "m42e";
+    repo = "ttrss_plugin-feediron";
+    rev = "407168c628880b5ced572cc549db6d50e866d3c8";
+    sha256 = "17b95ifpcph6m03hjd1mhi8gi1hw9yd3fnffmw66fqr5c9l3zd9r";
+    fetchSubmodules = true;
+  };
+  patches = lib.optionals patched [ ./json_reformat.patch ];
+  installPhase = ''
+    mkdir $out
+    cp -a . $out
+    '';
+  passthru.pluginName = "feediron";
+})
diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix
new file mode 100644 (file)
index 0000000..f0df588
--- /dev/null
@@ -0,0 +1,17 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation ({
+  pname = "ttrss-ff_instagram";
+  version = "0366ffb-master";
+  src = fetchFromGitHub {
+    owner = "wltb";
+    repo = "ff_instagram";
+    rev = "0366ffb18c4d490c8fbfba2f5f3367a5af23cfe8";
+    sha256 = "0vvzl6wi6jmrqknsfddvckjgsgfizz1d923d1nyrpzjfn6bda1vk";
+    fetchSubmodules = true;
+  };
+  installPhase = ''
+    mkdir $out
+    cp -a . $out
+    '';
+  passthru.pluginName = "ff_instagram";
+})
diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix
new file mode 100644 (file)
index 0000000..072b6c3
--- /dev/null
@@ -0,0 +1,17 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation ({
+  pname = "ttrss-tumblr_gdpr_ua";
+  version = "287c584-master";
+  src = fetchFromGitHub {
+    owner = "hkockerbeck";
+    repo = "ttrss-tumblr-gdpr-ua";
+    rev = "287c584e68845d524f920156bff0b2eaa6f65117";
+    sha256 = "1fviawgcclqky4k4xv1sqzvpb8i74w9f0pclm09m78s8l85wh9py";
+    fetchSubmodules = true;
+  };
+  installPhase = ''
+    mkdir $out
+    cp -a . $out
+    '';
+  passthru.pluginName = "tumblr_gdpr_ua";
+})
similarity index 63%
rename from pkgs/webapps/yourls/default.nix
rename to flakes/mypackages/pkgs/webapps/yourls/default.nix
index d940c54d1b505ebeeadb0b876c71b726775dda9d..8001a606ef94c84c52ab5625de157bd818337c94 100644 (file)
@@ -1,8 +1,8 @@
-{ yourls_config ? "/etc/yourls/config.php", mylibs, callPackage, lib, stdenv }:
+{ yourls_config ? "/etc/yourls/config.php", fetchFromGitHub, callPackage, lib, stdenv }:
 let
   pluginNames = [ "ldap" ];
   allPlugins = lib.attrsets.genAttrs pluginNames
 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;
   toPassthru = pkg: plugins: {
     inherit plugins allPlugins;
     withPlugins = withPlugins pkg;
@@ -16,7 +16,16 @@ let
         passthru = toPassthru newYourls (pkg.plugins ++ plugins);
       });
     in newYourls;
         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/
     installPhase = ''
       mkdir -p $out
       cp -a */ *.php $out/
diff --git a/flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix b/flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix
new file mode 100644 (file)
index 0000000..5870faa
--- /dev/null
@@ -0,0 +1,17 @@
+{ stdenv, fetchFromGitHub }:
+stdenv.mkDerivation (rec {
+  pname = "yourls-ldap-plugin";
+  version = "2a3cb03-master";
+  src = fetchFromGitHub {
+    owner = "k3a";
+    repo = "yourls-ldap-plugin";
+    rev = "2a3cb0334b8a6b81b284a7196e614bbd2b2b1615";
+    sha256 = "0cchbnli77d295lzf7kjmn4dcxj2bmdqa9qc3f8l8qgmp4n5n0gh";
+    fetchSubmodules = true;
+  };
+  installPhase = ''
+    mkdir -p $out
+    cp plugin.php $out
+    '';
+  passthru.pluginName = "ldap";
+})
index cc6dc665c106b5c99d0568d9f018c0435e3ea1f2..ff33651081fe44ee011316d279120887b444dfd6 100644 (file)
@@ -6,6 +6,7 @@
       # Check that there is no clash with nixos/modules/misc/ids.nix
       uids = {
         cryptpad = 386;
       # 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;
         postfixscripts = 387;
         acme = 388;
         backup = 389;
@@ -21,6 +22,7 @@
       };
       gids = {
         nagios = 11; # commented in the ids file
       };
       gids = {
         nagios = 11; # commented in the ids file
+        openldap = 99; # commented in the ids file
         cryptpad = 386;
         acme = 388;
         backup = 389;
         cryptpad = 386;
         acme = 388;
         backup = 389;
         mastodon = 399;
       };
     };
         mastodon = 399;
       };
     };
-    nixosModule = { ... }: {
+    nixosModule = { config, lib, ... }: {
       config = {
         ids.uids = self.lib.uids;
         ids.gids = self.lib.gids;
       config = {
         ids.uids = self.lib.uids;
         ids.gids = self.lib.gids;
+        assertions = [
+          {
+            assertion = builtins.length (builtins.attrValues config.ids.gids) == builtins.length (lib.unique (builtins.attrValues config.ids.gids));
+            message = "Non-unique list of gids";
+          }
+          {
+            assertion = builtins.length (builtins.attrValues config.ids.uids) == builtins.length (lib.unique (builtins.attrValues config.ids.uids));
+            message = "Non-unique list of uids";
+          }
+        ];
       };
     };
   };
       };
     };
   };
diff --git a/flakes/naemon/flake.nix b/flakes/naemon/flake.nix
new file mode 100644 (file)
index 0000000..9b2ace5
--- /dev/null
@@ -0,0 +1,191 @@
+{
+  outputs = { self }: {
+    nixosModule = self.nixosModules.naemon;
+    nixosModules.naemon = { config, lib, pkgs, ... }:
+      with lib;
+
+      let
+        cfg = config.services.naemon;
+
+        naemonConfig = pkgs.runCommand "naemon-config" {
+          objectsFile = pkgs.writeText "naemon_objects.cfg" cfg.objectDefs;
+          resourceFile = config.secrets.fullPaths."naemon/resources.cfg";
+          extraConfig = pkgs.writeText "extra.cfg" cfg.extraConfig;
+          inherit (cfg) logDir varDir runDir cacheDir;
+        } ''
+          substituteAll ${./naemon.cfg} $out
+          cat $extraConfig >> $out
+          '';
+      in
+      {
+        # Necessary for situations where flake gets included multiple times
+        key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
+
+        options = {
+          services.naemon = {
+            enable = mkOption {
+              default = false;
+              description = "
+                Whether to use <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;
+            };
+          };
+        };
+      };
+  };
+}
index e0b78a8f1e17a00b89b19a089d1deeca2a44aa43..a9e5e818d667807eca34fc9402271866faf023c0 100644 (file)
     },
     "myuids": {
       "locked": {
     },
     "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": {
       },
       "original": {
-        "dir": "flakes/myuids",
-        "type": "git",
-        "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
+        "path": "../myuids",
+        "type": "path"
       }
     },
     "nixpkgs": {
       }
     },
     "nixpkgs": {
index 6fd45bf6995168223111496ba70577c6c1bccbea..17a3fdd8bd0e3817dde832a693007ec573fd7879 100644 (file)
@@ -2,9 +2,7 @@
   description = "Open source ARC implementation";
 
   inputs.myuids = {
   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";
   };
   inputs.flake-utils.url = "github:numtide/flake-utils";
   inputs.nixpkgs.url = "github:NixOS/nixpkgs";
@@ -66,6 +64,8 @@
           defaultSock = "/run/openarc/openarc.sock";
           args = [ "-f" "-p" "local:${cfg.socket}" ] ++ lib.optionals (cfg.configFile != null) [ "-c" cfg.configFile ];
         in {
           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 {
           options = {
             services.openarc = {
               enable = lib.mkOption {
index 4503c79ccffdb9ff23b05290221acce6c8c2e91f..e0cbe173a17f7ce015ef1a5e4a80d747fa77e642 100644 (file)
     },
     "myuids": {
       "locked": {
     },
     "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": {
       },
       "original": {
-        "dir": "flakes/myuids",
-        "type": "git",
-        "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
+        "path": "../myuids",
+        "type": "path"
       }
     },
     "nixpkgs": {
       }
     },
     "nixpkgs": {
index 277fd259c8bbc39800ff09a9ee69cc349505b8f6..70b8cd7171a11069a734ecb1875e916d8a8e60fd 100644 (file)
@@ -2,9 +2,7 @@
   description = "Open source ARC implementation";
 
   inputs.myuids = {
   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";
   };
   inputs.flake-utils.url = "github:numtide/flake-utils";
   inputs.nixpkgs.url = "github:NixOS/nixpkgs";
@@ -51,7 +49,9 @@
          defaultSock = "/run/opendmarc/opendmarc.sock";
          args = [ "-f" "-l" "-p" "local:${cfg.socket}" ] ++ lib.optionals (cfg.configFile != null) [ "-c" cfg.configFile ];
        in {
          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;
            services.opendmarc = {
              enable = lib.mkOption {
                type = lib.types.bool;
diff --git a/flakes/openfoodnetwork/default.nix b/flakes/openfoodnetwork/default.nix
new file mode 100644 (file)
index 0000000..dd68177
--- /dev/null
@@ -0,0 +1,39 @@
+{ bundlerEnv, defaultGemConfig, writeShellScript, v8, stdenv }:
+
+let
+  gems = bundlerEnv {
+    name = "openfoodnetwork";
+    gemfile = ./Gemfile;
+    lockfile = ./Gemfile.lock;
+    gemset = import ./gemset.nix;
+    gemConfig = defaultGemConfig // {
+      libv8-node = attrs: {
+        dontBuild = false;
+        postPatch = let
+          noopScript = writeShellScript "noop" "exit 0";
+          linkFiles = writeShellScript "link-files" ''
+            cd ../..
+
+            mkdir -p vendor/v8/out.gn/libv8/obj/
+            ln -s "${v8}/lib/libv8.a" vendor/v8/out.gn/libv8/obj/libv8_monolith.a
+
+            ln -s ${v8}/include vendor/v8/include
+
+            mkdir -p ext/libv8-node
+            echo '--- !ruby/object:Libv8::Node::Location::Vendor {}' >ext/libv8-node/.location.yml
+          '';
+        in ''
+            cp ${noopScript} libexec/build-libv8
+            cp ${noopScript} libexec/build-monolith
+            cp ${noopScript} libexec/download-node
+            cp ${noopScript} libexec/extract-node
+            cp ${linkFiles} libexec/inject-libv8
+          '';
+      };
+    };
+  };
+in
+  stdenv.mkDerivation {
+    name = "openfoodnetwork";
+    inherit
+  }
diff --git a/flakes/openfoodnetwork/gemset.nix b/flakes/openfoodnetwork/gemset.nix
new file mode 100644 (file)
index 0000000..2f212b8
--- /dev/null
@@ -0,0 +1,2896 @@
+{
+  actioncable = {
+    dependencies = ["actionpack" "activesupport" "nio4r" "websocket-driver"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ilq5mniarm0zlvnkagqj9n9p73ljrhphciz02aymrpfxxxclz2x";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  actionmailbox = {
+    dependencies = ["actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16azdnjws215clb056b9mabglx4b8f61hr82hv7hm80dmn89zqq6";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  actionmailer = {
+    dependencies = ["actionpack" "actionview" "activejob" "activesupport" "mail" "rails-dom-testing"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00s07l2ac5igch1g2rpa0linmiq7mhgk6v6wxkckg8gbiqijb592";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  actionpack = {
+    dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xgysqnibjsy6kdz10x2xb3kwa6lssiqhh0zggrbgs31ypwhlpia";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  actionpack-action_caching = {
+    dependencies = ["actionpack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bxaz8sdhqkdjqwk58icy9668s0yxpgm28gdkdmxl3g41m94b8id";
+      type = "gem";
+    };
+    version = "1.2.2";
+  };
+  actiontext = {
+    dependencies = ["actionpack" "activerecord" "activestorage" "activesupport" "nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0m4fy4qqh09vnzbhx383vjdfid6fzbs49bzzg415x05nmmjkx582";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  actionview = {
+    dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yf4ic5kl324rs0raralpwx24s6hvvdzxfhinafylf8f3x7jj23z";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  active_model_serializers = {
+    dependencies = ["activemodel"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0k3mgia2ahh7mbk30hjq9pzqbk0kh281s91kq2z6p555nv9y6l3k";
+      type = "gem";
+    };
+    version = "0.8.4";
+  };
+  activejob = {
+    dependencies = ["activesupport" "globalid"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1q7c0i0kwarxgcbxk71wa9jnlg45grbxmhlrh7dk9bgcv7r7r7hn";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  activemerchant = {
+    dependencies = ["activesupport" "builder" "i18n" "nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ajmcgc4idxmvh8sghyb1ngxsc9x6r5yfi4r1z22d6a4j7b1yjzj";
+      type = "gem";
+    };
+    version = "1.123.0";
+  };
+  activemodel = {
+    dependencies = ["activesupport"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16ixam4lni8b5lgx0whnax0imzh1dh10fy5r9pxs52n83yz5nbq3";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  activerecord = {
+    dependencies = ["activemodel" "activesupport"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ccgvlj767ybps3pxlaa4iw77n7wbriw2sr8754id3ngjfap08ja";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  activerecord-import = {
+    dependencies = ["activerecord"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17ydad9gcsh0c9ny68fyvxmh6rbld4pyvyabnc7882678dnvfy8i";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  activerecord-postgresql-adapter = {
+    dependencies = ["pg"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1wdfd1mkns28ilr6nm18x69h651mjxwb8p2zk8pb6cjgx7c26axl";
+      type = "gem";
+    };
+    version = "0.0.1";
+  };
+  activerecord-session_store = {
+    dependencies = ["actionpack" "activerecord" "multi_json" "rack" "railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06ddhz1b2yg72iv09n48gcd3ix5da7hxlzi7vvj13nrps2qwlffg";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  activestorage = {
+    dependencies = ["actionpack" "activejob" "activerecord" "activesupport" "marcel" "mini_mime"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17knzz9fvqg4x582vy0xmlgjkxfb13xyzl2rgw19qfma86hxsvvi";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  activesupport = {
+    dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo" "zeitwerk"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19gx1jcq46x9d1pi1w8xq0bgvvfw239y4lalr8asm291gj3q3ds4";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  acts-as-taggable-on = {
+    dependencies = ["activerecord"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kfnyix173bazjswab21bx7hmqmik71awj2kz090fsa2nv58c4mw";
+      type = "gem";
+    };
+    version = "8.1.0";
+  };
+  acts_as_list = {
+    dependencies = ["activerecord"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "12p22h59c45dnccb51pqk275ziyi502azf9w3qcnkcsq827ma5jm";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  addressable = {
+    dependencies = ["public_suffix"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "022r3m9wdxljpbya69y2i3h9g3dhhfaqzidf95m6qjzms792jvgp";
+      type = "gem";
+    };
+    version = "2.8.0";
+  };
+  afm = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06kj9hgd0z8pj27bxp2diwqh6fv7qhwwm17z64rhdc4sfn76jgn8";
+      type = "gem";
+    };
+    version = "0.2.2";
+  };
+  angular-rails-templates = {
+    dependencies = ["railties" "sprockets" "tilt"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0aja8b2bjj8af29zagkm6pv48s0933l0d38j5b4wgxipf0c0mjxq";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  angular_rails_csrf = {
+    dependencies = ["railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08g6xwz98apbfxwd0kbsxl7ll4bms11m563rjl4mavm1dnf3nsgh";
+      type = "gem";
+    };
+    version = "4.5.0";
+  };
+  angularjs-file-upload-rails = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07s0b8bwdp8asc16rp16q78p17cl5qnw8svqarbcsv0b1fkxiqbd";
+      type = "gem";
+    };
+    version = "2.4.1";
+  };
+  angularjs-rails = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01blhjrzg82l76s5fj7jcgnykxxdj61m5swwy9x0wxnxhid81rgx";
+      type = "gem";
+    };
+    version = "1.8.0";
+  };
+  Ascii85 = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ds4v9xgsyvijnlflak4dzf1qwmda9yd5bv8jwsb56nngd399rlw";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  ast = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04nc8x27hlzlrr5c2gn7mar4vdr0apw5xg22wp6m8dx3wqr04a0y";
+      type = "gem";
+    };
+    version = "2.4.2";
+  };
+  awesome_nested_set = {
+    dependencies = ["activerecord"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06ggf81dy8wkds0b37xgx065b325fm0c6i6g1k0ml4ai8jwphm6r";
+      type = "gem";
+    };
+    version = "3.4.0";
+  };
+  awesome_print = {
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vkq6c8y2jvaw03ynds5vjzl1v9wg608cimkd3bidzxc0jvk56z9";
+      type = "gem";
+    };
+    version = "1.9.2";
+  };
+  aws-sdk = {
+    dependencies = ["aws-sdk-resources"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xfan8fpiy019zp32l2a8smwfbii5m9hy49d8b8gvww2qcy5m3pr";
+      type = "gem";
+    };
+    version = "2.2.0";
+  };
+  aws-sdk-core = {
+    dependencies = ["jmespath"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1f8diki6xvz048i0lhkxqngirgmqqj50jda8vjw0xxgv3qzklq4r";
+      type = "gem";
+    };
+    version = "2.2.0";
+  };
+  aws-sdk-resources = {
+    dependencies = ["aws-sdk-core"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06y7sj2371pjw9vgsfipbz2g3pw3i4asdz27h1lb7pny8gwndkzk";
+      type = "gem";
+    };
+    version = "2.2.0";
+  };
+  bcrypt = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02r1c3isfchs5fxivbq99gc3aq4vfyn8snhcy707dal1p8qz12qb";
+      type = "gem";
+    };
+    version = "3.1.16";
+  };
+  bigdecimal = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fxl2hybnfij668h7133p28f8b13jaj13wyyniqdiy8m3s6b1pcb";
+      type = "gem";
+    };
+    version = "3.0.2";
+  };
+  bindex = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0zmirr3m02p52bzq4xgksq4pn8j641rx5d4czk68pv9rqnfwq7kv";
+      type = "gem";
+    };
+    version = "0.8.1";
+  };
+  bootsnap = {
+    dependencies = ["msgpack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ndjra3h86dq28njm2swmaw6n3vsywrycrf7i5iy9l8hrhfhv4x2";
+      type = "gem";
+    };
+    version = "1.9.1";
+  };
+  bugsnag = {
+    dependencies = ["concurrent-ruby"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19yz4s0sw2w8jywkdf445zpdkg3s9869hmxcs7w68xvykpx0ickb";
+      type = "gem";
+    };
+    version = "6.24.0";
+  };
+  builder = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "045wzckxpwcqzrjr353cxnyaxgf0qg22jh00dcx7z38cys5g1jlr";
+      type = "gem";
+    };
+    version = "3.2.4";
+  };
+  bullet = {
+    dependencies = ["activesupport" "uniform_notifier"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01xachwsyykmp153514vz2khanbsz1n27j09za5gcxj54srh5l4p";
+      type = "gem";
+    };
+    version = "6.1.5";
+  };
+  byebug = {
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nx3yjf4xzdgb8jkmk2344081gqr22pgjqnmjg2q64mj5d6r9194";
+      type = "gem";
+    };
+    version = "11.1.3";
+  };
+  cable_ready = {
+    dependencies = ["rails" "thread-local"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06lqnv1b3zxgn189v7df6avf3zrk1snfxkbm1ax0fz129k997hak";
+      type = "gem";
+    };
+    version = "5.0.0.pre2";
+  };
+  cancancan = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05kb459laaw339n7mas37v4k83nwz228bfpaghgybza347341x85";
+      type = "gem";
+    };
+    version = "1.15.0";
+  };
+  capybara = {
+    dependencies = ["addressable" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1viqcpsngy9fqjd68932m43ad6xj656d1x33nx9565q57chgi29k";
+      type = "gem";
+    };
+    version = "3.35.3";
+  };
+  catalog = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      path = engines/catalog;
+      type = "path";
+    };
+    version = "0.0.1";
+  };
+  childprocess = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ic028k8xgm2dds9mqnvwwx3ibaz32j8455zxr9f4bcnviyahya5";
+      type = "gem";
+    };
+    version = "3.0.0";
+  };
+  chronic = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hrdkn4g8x7dlzxwb1rfgr8kw3bp4ywg5l4y4i9c2g5cwv62yvvn";
+      type = "gem";
+    };
+    version = "0.10.2";
+  };
+  chunky_png = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1znw5x86hmm9vfhidwdsijz8m38pqgmv98l9ryilvky0aldv7mc9";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  climate_control = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0q11v0iabvr6rif0d025xh078ili5frrihlj0m04zfg7lgvagxji";
+      type = "gem";
+    };
+    version = "0.2.0";
+  };
+  cliver = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "096f4rj7virwvqxhkavy0v55rax10r4jqf8cymbvn4n631948xc7";
+      type = "gem";
+    };
+    version = "0.3.2";
+  };
+  cocaine = {
+    dependencies = ["climate_control"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01kk5xd7lspbkdvn6nyj0y51zhvia3z6r4nalbdcqw5fbsywwi7d";
+      type = "gem";
+    };
+    version = "0.5.8";
+  };
+  codecov = {
+    dependencies = ["simplecov"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pi2dmqxjw5wsn65yx5qz5ks5msqflj0zxvk11r3cxwgacvj3hys";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  coderay = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jvxqxzply1lwp7ysn94zjhh57vc14mcshw1ygw14ib8lhc00lyw";
+      type = "gem";
+    };
+    version = "1.1.3";
+  };
+  coffee-rails = {
+    dependencies = ["coffee-script" "railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "170sp4y82bf6nsczkkkzypzv368sgjg6lfrkib4hfjgxa6xa3ajx";
+      type = "gem";
+    };
+    version = "5.0.0";
+  };
+  coffee-script = {
+    dependencies = ["coffee-script-source" "execjs"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rc7scyk7mnpfxqv5yy4y5q1hx3i7q3ahplcp4bq2g5r24g2izl2";
+      type = "gem";
+    };
+    version = "2.4.1";
+  };
+  coffee-script-source = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1907v9q1zcqmmyqzhzych5l7qifgls2rlbnbhy5vzyr7i7yicaz1";
+      type = "gem";
+    };
+    version = "1.12.2";
+  };
+  combine_pdf = {
+    dependencies = ["ruby-rc4"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bxakrrip0sg5gxy50wdn7lr3h2w7rd590cjhnj4qi477cvi1qgg";
+      type = "gem";
+    };
+    version = "1.0.21";
+  };
+  compass = {
+    dependencies = ["chunky_png" "compass-core" "compass-import-once" "rb-fsevent" "rb-inotify" "sass"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lfi83w8z75czr0pf0rmj9hda22082h3cmvczl8r1ma9agf88y2c";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  compass-core = {
+    dependencies = ["multi_json" "sass"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yaspqwdmzwdcqviclbs3blq7an16pysrfzylz8q1gxmmd6bpj3a";
+      type = "gem";
+    };
+    version = "1.0.3";
+  };
+  compass-import-once = {
+    dependencies = ["sass"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bn7gwbfz7jvvdd0qdfqlx67fcb83gyvxqc7dr9fhcnks3z8z5rq";
+      type = "gem";
+    };
+    version = "1.0.5";
+  };
+  compass-rails = {
+    dependencies = ["compass" "sass-rails" "sprockets"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1y1gi9lcmxzn0xvx2pf4xzj8n0s6rl0vbycyjk1kpcvycyjnbjgr";
+      type = "gem";
+    };
+    version = "4.0.0";
+  };
+  concurrent-ruby = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nwad3211p7yv9sda31jmbyw6sdafzmdi2i2niaz6f0wk5nq9h0f";
+      type = "gem";
+    };
+    version = "1.1.9";
+  };
+  connection_pool = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ffdxhgirgc86qb42yvmfj6v1v0x4lvi0pxn9zhghkff44wzra0k";
+      type = "gem";
+    };
+    version = "2.2.5";
+  };
+  crack = {
+    dependencies = ["rexml"];
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cr1kfpw3vkhysvkk3wg7c54m75kd68mbm9rs5azdjdq57xid13r";
+      type = "gem";
+    };
+    version = "0.4.5";
+  };
+  crass = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0pfl5c0pyqaparxaqxi6s4gfl21bdldwiawrc0aknyvflli60lfw";
+      type = "gem";
+    };
+    version = "1.0.6";
+  };
+  css_parser = {
+    dependencies = ["addressable"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xs4ind9xd099rb52b73pch8ha143dl8bhivqsbba4wrvxpbx751";
+      type = "gem";
+    };
+    version = "1.9.0";
+  };
+  cuprite = {
+    dependencies = ["capybara" "ferrum"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gz7min595pq4xkzm1nvn538i7plg7jwfc1pw6w8f4apfh94fv56";
+      type = "gem";
+    };
+    version = "0.13";
+  };
+  custom_error_message = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      fetchSubmodules = false;
+      rev = "3a8ec9dddc7a5b0aab7c69a6060596de300c68f4";
+      sha256 = "1r2yah8dzng7i0000xfdksv3cj2z65x1nr4vjrnsv9sm7fj7bbld";
+      type = "git";
+      url = "https://github.com/jeremydurham/custom-err-msg.git";
+    };
+    version = "1.1.1";
+  };
+  dalli = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0br39scmr187w3ifl5gsddl2fhq6ahijgw6358plqjdzrizlg764";
+      type = "gem";
+    };
+    version = "2.7.11";
+  };
+  database_cleaner = {
+    dependencies = ["database_cleaner-active_record"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1x4r22rnpwnm9yln88vhzqj4cl3sbd26c4j50g9k6wp7y01rln4w";
+      type = "gem";
+    };
+    version = "2.0.1";
+  };
+  database_cleaner-active_record = {
+    dependencies = ["activerecord" "database_cleaner-core"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jg7jd7w65hdarzbi8f252la3qgsnd2sjavhlmc82kwzfx37k38m";
+      type = "gem";
+    };
+    version = "2.0.0";
+  };
+  database_cleaner-core = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0v44bn386ipjjh4m2kl53dal8g4d41xajn2jggnmjbhn6965fil6";
+      type = "gem";
+    };
+    version = "2.0.1";
+  };
+  db2fog = {
+    dependencies = ["activerecord" "fog-core" "rails"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      fetchSubmodules = false;
+      rev = "5b63343847452f52aa42f7fc169d6ab3af57cda3";
+      sha256 = "02fc3v81sx6rnvc492bdg057fs67qpsf83y25bsdqz83k21xmzyl";
+      type = "git";
+      url = "https://github.com/openfoodfoundation/db2fog.git";
+    };
+    version = "0.9.2";
+  };
+  ddtrace = {
+    dependencies = ["ffi" "msgpack"];
+    groups = ["production" "staging"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0p7d6r2zpy9mqmd26ni9cpgc2yas4jira66rxx92l87amypkvasc";
+      type = "gem";
+    };
+    version = "0.53.0";
+  };
+  debugger-linecache = {
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0iwyx190fd5vfwj1gzr8pg3m374kqqix4g4fc4qw29sp54d3fpdz";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  devise = {
+    dependencies = ["bcrypt" "orm_adapter" "railties" "responders" "warden"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ag0skzk3h7bhmf1n2zwa7cg6kx5k5inxmq0kf5qpm7917ffm0mz";
+      type = "gem";
+    };
+    version = "4.8.0";
+  };
+  devise-encryptable = {
+    dependencies = ["devise"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1dh9gl7qa1a8x091xk9dc6lwc5jw6lqmiw7sii1hq0w4jknwlq4q";
+      type = "gem";
+    };
+    version = "0.2.0";
+  };
+  devise-i18n = {
+    dependencies = ["devise"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "11knkl0b40pyjz8934pmr3apzsmvvaj09w5ks8xzppd5agid2r6f";
+      type = "gem";
+    };
+    version = "1.10.0";
+  };
+  devise-token_authenticatable = {
+    dependencies = ["devise"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ss9wcmjghl6s2kyqrgjn5z4bw1gxmlbqv0in2kirn56428w239f";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  dfc_provider = {
+    dependencies = ["active_model_serializers" "jwt" "rspec"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      path = engines/dfc_provider;
+      type = "path";
+    };
+    version = "0.0.1";
+  };
+  diff-lcs = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0m925b8xc6kbpnif9dldna24q1szg4mk0fvszrki837pfn46afmz";
+      type = "gem";
+    };
+    version = "1.4.4";
+  };
+  docile = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lxqxgq71rqwj1lpl9q1mbhhhhhhdkkj7my341f2889pwayk85sz";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  dotenv = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0iym172c5337sm1x2ykc2i3f961vj3wdclbyg1x6sxs3irgfsl94";
+      type = "gem";
+    };
+    version = "2.7.6";
+  };
+  dotenv-rails = {
+    dependencies = ["dotenv" "railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1my2jdmgmpf32rfxffkb9cyxh7ayis4q5ygpwjqj4vpp25y3a70c";
+      type = "gem";
+    };
+    version = "2.7.6";
+  };
+  e2mmap = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0n8gxjb63dck3vrmsdcqqll7xs7f3wk78mw8w0gdk9wp5nx6pvj5";
+      type = "gem";
+    };
+    version = "0.1.0";
+  };
+  erubi = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09l8lz3j00m898li0yfsnb6ihc63rdvhw3k5xczna5zrjk104f2l";
+      type = "gem";
+    };
+    version = "1.10.0";
+  };
+  et-orbi = {
+    dependencies = ["tzinfo"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xr8i8ql4xzx17d12590i3j299hj6vc0ja2j29dy12i5nlchxrvp";
+      type = "gem";
+    };
+    version = "1.2.4";
+  };
+  excon = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19g5nvkycnkzqq4mqn1zjznq9adrlv2jz0dr9w10cbn42hhqpiz7";
+      type = "gem";
+    };
+    version = "0.81.0";
+  };
+  execjs = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yz55sf2nd3l666ms6xr18sm2aggcvmb8qr3v53lr4rir32y1yp1";
+      type = "gem";
+    };
+    version = "2.7.0";
+  };
+  factory_bot = {
+    dependencies = ["activesupport"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04vxmjr200akcil9fqxc9ghbb9q0lyrh2q03xxncycd5vln910fi";
+      type = "gem";
+    };
+    version = "6.2.0";
+  };
+  factory_bot_rails = {
+    dependencies = ["factory_bot" "railties"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18fhcihkc074gk62iwqgbdgc3ymim4fm0b4p3ipffy5hcsb9d2r7";
+      type = "gem";
+    };
+    version = "6.2.0";
+  };
+  faraday = {
+    dependencies = ["faraday-excon" "faraday-net_http" "faraday-net_http_persistent" "multipart-post" "ruby2_keywords"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0q646m07lfahakx5jdq77j004rcgfj6lkg13c0f84993gi78dhvi";
+      type = "gem";
+    };
+    version = "1.4.1";
+  };
+  faraday-excon = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0h09wkb0k0bhm6dqsd47ac601qiaah8qdzjh8gvxfd376x1chmdh";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  faraday-net_http = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fi8sda5hc54v1w3mqfl5yz09nhx35kglyx72w7b8xxvdr0cwi9j";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  faraday-net_http_persistent = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0l2c835wl7gv34xp49fhd1bl4czkpw2g3ahqsak2251iqv5589ka";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  ferrum = {
+    dependencies = ["addressable" "cliver" "concurrent-ruby" "websocket-driver"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17c2bryyzpdx3mj6rig4aym3wy24g2212zm0jz2gisbymhv9adbl";
+      type = "gem";
+    };
+    version = "0.11";
+  };
+  ffaker = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0gif76bq11qz73qm8hv050wf642f9zwawra78bnpnj5kpqhjg3dl";
+      type = "gem";
+    };
+    version = "2.20.0";
+  };
+  ffi = {
+    groups = ["default" "production" "staging"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ssxcywmb3flxsjdg13is6k01807zgzasdhj4j48dm7ac59cmksn";
+      type = "gem";
+    };
+    version = "1.15.4";
+  };
+  flipper = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gdnd7j12a560r4pi22v1z2cy0nymwr340922rfj9qkpj7h46371";
+      type = "gem";
+    };
+    version = "0.20.4";
+  };
+  flipper-active_record = {
+    dependencies = ["activerecord" "flipper"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "042x64rr11ia7n4db2y6vjbfjv2ip0jp2m2mlyb6d9srbxvvkiif";
+      type = "gem";
+    };
+    version = "0.20.4";
+  };
+  flipper-ui = {
+    dependencies = ["erubi" "flipper" "rack" "rack-protection"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sf9giwiwrncvvac48rgc56xgj6s8scs7a9ahr6b2hqbyr1nja9l";
+      type = "gem";
+    };
+    version = "0.20.4";
+  };
+  fog-aws = {
+    dependencies = ["fog-core" "fog-json" "fog-xml" "ipaddress"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00skbbgvhqzq6gpgzmw0957n0wf1y3vjgrdyq3sib0ghpyfgmig3";
+      type = "gem";
+    };
+    version = "2.0.1";
+  };
+  fog-core = {
+    dependencies = ["builder" "excon" "formatador"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02449kh2x3zj9xxszm02vy8zpbsrykvjrg5gj3kqcy2yizy2bhp3";
+      type = "gem";
+    };
+    version = "1.45.0";
+  };
+  fog-json = {
+    dependencies = ["fog-core" "multi_json"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zj8llzc119zafbmfa4ai3z5s7c4vp9akfs0f9l2piyvcarmlkyx";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  fog-xml = {
+    dependencies = ["fog-core" "nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "043lwdw2wsi6d55ifk0w3izi5l1d1h0alwyr3fixic7b94kc812n";
+      type = "gem";
+    };
+    version = "0.1.3";
+  };
+  foreman = {
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0szgxvnzwkzrfbq5dkwa98mig78aqglfy6irdsvq1gq045pbq9r7";
+      type = "gem";
+    };
+    version = "0.87.2";
+  };
+  formatador = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1gc26phrwlmlqrmz4bagq1wd5b7g64avpx0ghxr9xdxcvmlii0l0";
+      type = "gem";
+    };
+    version = "0.2.5";
+  };
+  foundation-icons-sass-rails = {
+    dependencies = ["railties" "sass-rails"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1z3bp0kcz7csid9r6h8z8asywh8mn2fwcm71b4v4qjca13qf4n2w";
+      type = "gem";
+    };
+    version = "3.0.0";
+  };
+  foundation-rails = {
+    dependencies = ["railties" "sass"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1dizpi3k3bb2arnf96rxx1qx3x3rwqshbdzb3l8ycj1laddrhwnl";
+      type = "gem";
+    };
+    version = "5.5.2.1";
+  };
+  fugit = {
+    dependencies = ["et-orbi" "raabro"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jhbmc1l94vz25byfbmgi783lrwsh74xvslqzxd0pjf8i9xsxv49";
+      type = "gem";
+    };
+    version = "1.4.5";
+  };
+  fuubar = {
+    dependencies = ["rspec-core" "ruby-progressbar"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1028vn7j3kc5qqwswrf3has3qm4j9xva70xmzb3n29i89f0afwmj";
+      type = "gem";
+    };
+    version = "2.5.1";
+  };
+  geocoder = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0is3xss043nxvckqrbk0r881950q4khigrh41qqqjff44gm24bs3";
+      type = "gem";
+    };
+    version = "1.6.7";
+  };
+  globalid = {
+    dependencies = ["activesupport"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0k6ww3shk3mv119xvr9m99l6ql0czq91xhd66hm8hqssb18r2lvm";
+      type = "gem";
+    };
+    version = "0.5.2";
+  };
+  gmaps4rails = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0avwx3ygmq2krkawyplw76q4bm05v56rwp1vdwfpvsd8bh4vzhq9";
+      type = "gem";
+    };
+    version = "2.1.2";
+  };
+  good_migrations = {
+    dependencies = ["activerecord" "railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0f613j6gkdkipzhw6r9kngqk3g2zi6hwmscy1sdf5snfjpamhvin";
+      type = "gem";
+    };
+    version = "0.1.0";
+  };
+  haml = {
+    dependencies = ["temple" "tilt"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "035fgbfr20m08w4603ls2lwqbggr0vy71mijz0p68ib1am394xbf";
+      type = "gem";
+    };
+    version = "5.2.2";
+  };
+  hashdiff = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nynpl0xbj0nphqx1qlmyggq58ms1phf5i03hk64wcc0a17x1m1c";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  hashery = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qj8815bf7q6q7llm5rzdz279gzmpqmqqicxnzv066a020iwqffj";
+      type = "gem";
+    };
+    version = "2.1.2";
+  };
+  highline = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yclf57n2j3cw8144ania99h1zinf8q3f5zrhqa754j6gl95rp9d";
+      type = "gem";
+    };
+    version = "2.0.3";
+  };
+  hiredis = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04jj8k7lxqxw24sp0jiravigdkgsyrpprxpxm71ba93x1wr2w1bz";
+      type = "gem";
+    };
+    version = "0.6.3";
+  };
+  i18n = {
+    dependencies = ["concurrent-ruby"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0g2fnag935zn2ggm5cn6k4s4xvv53v2givj1j90szmvavlpya96a";
+      type = "gem";
+    };
+    version = "1.8.10";
+  };
+  i18n-js = {
+    dependencies = ["i18n"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xiq65q0rhafp3aknj602nbj7i016yjfvw28y83hg8ddqlqvc9x0";
+      type = "gem";
+    };
+    version = "3.9.0";
+  };
+  immigrant = {
+    dependencies = ["activerecord"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15jf08h8if3wyq0kdgijcknqzmgfw4rqnyln68mydg1c5bn4s5cw";
+      type = "gem";
+    };
+    version = "0.3.6";
+  };
+  ipaddress = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1x86s0s11w202j6ka40jbmywkrx8fhq8xiy8mwvnkhllj57hqr45";
+      type = "gem";
+    };
+    version = "0.8.3";
+  };
+  jmespath = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1d4wac0dcd1jf6kc57891glih9w57552zgqswgy74d1xhgnk0ngf";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  jquery-rails = {
+    dependencies = ["rails-dom-testing" "railties" "thor"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0dkhm8lan1vnyl3ll0ks2q06576pdils8a1dr354vfc1y5dqw15i";
+      type = "gem";
+    };
+    version = "4.4.0";
+  };
+  jquery-ui-rails = {
+    dependencies = ["railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1garrnqwh35acj2pp4sp6fpm2g881h23y644lzbic2qmcrq9wd2v";
+      type = "gem";
+    };
+    version = "4.2.1";
+  };
+  json = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lrirj0gw420kw71bjjlqkqhqbrplla61gbv1jzgsz6bv90qr3ci";
+      type = "gem";
+    };
+    version = "2.5.1";
+  };
+  json-schema = {
+    dependencies = ["addressable"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yv5lfmr2nzd14af498xqd5p89f3g080q8wk0klr3vxgypsikkb5";
+      type = "gem";
+    };
+    version = "2.8.1";
+  };
+  json_spec = {
+    dependencies = ["multi_json" "rspec"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "03yiravv6q8lp37rip2i25w2qd63mwwi4jmw7ymf51y7j9xbjxvs";
+      type = "gem";
+    };
+    version = "1.1.5";
+  };
+  jwt = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bg8pjx0mpvl10k6d8a6gc8dzlv2z5jkqcjbjcirnk032iriq838";
+      type = "gem";
+    };
+    version = "2.3.0";
+  };
+  knapsack = {
+    dependencies = ["rake"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1f42akjbdkrg1ihwvls9pkkvz8vikaapzgxl82dd128rfn42chm9";
+      type = "gem";
+    };
+    version = "4.0.0";
+  };
+  launchy = {
+    dependencies = ["addressable"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xdyvr5j0gjj7b10kgvh8ylxnwk3wx19my42wqn9h82r4p246hlm";
+      type = "gem";
+    };
+    version = "2.5.0";
+  };
+  letter_opener = {
+    dependencies = ["launchy"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09a7kgsmr10a0hrc9bwxglgqvppjxij9w8bxx91mnvh0ivaw0nq9";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  libv8-node = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xx217hrkpcm41p41inmy05kb7g8p9w5fwabgjgmpvz0d60j2862";
+      type = "gem";
+    };
+    version = "15.14.0.1";
+  };
+  loofah = {
+    dependencies = ["crass" "nokogiri"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nqcya57x2n58y1dify60i0dpla40n4yir928khp4nj5jrn9mgmw";
+      type = "gem";
+    };
+    version = "2.12.0";
+  };
+  mail = {
+    dependencies = ["mini_mime"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00wwz6ys0502dpk8xprwcqfwyf3hmnx6lgxaiq6vj43mkx43sapc";
+      type = "gem";
+    };
+    version = "2.7.1";
+  };
+  marcel = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bp001p687nsa4a8sp3q1iv8pfhs24w7s3avychjp64sdkg6jxq3";
+      type = "gem";
+    };
+    version = "1.0.1";
+  };
+  method_source = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pnyh44qycnf9mzi1j6fywd5fkskv3x7nmsqrrws0rjn5dd4ayfp";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  mime-types = {
+    dependencies = ["mime-types-data"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zj12l9qk62anvk9bjvandpa6vy4xslil15wl6wlivyf51z773vh";
+      type = "gem";
+    };
+    version = "3.3.1";
+  };
+  mime-types-data = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1phcq7z0zpipwd7y4fbqmlaqghv07fjjgrx99mwq3z3n0yvy7fmi";
+      type = "gem";
+    };
+    version = "3.2021.0225";
+  };
+  mimemagic = {
+    dependencies = ["nokogiri" "rake"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "17ycgsmz2229jh224ws77yg974cz326flgc401xrdkfpw90jvb08";
+      type = "gem";
+    };
+    version = "0.4.3";
+  };
+  mini_mime = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kb7jq3wjgckmkzna799y5qmvn6vg52878bkgw35qay6lflcrwih";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  mini_portile2 = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lvxm91hi0pabnkkg47wh1siv56s6slm2mdq1idfm86dyfidfprq";
+      type = "gem";
+    };
+    version = "2.6.1";
+  };
+  mini_racer = {
+    dependencies = ["libv8-node"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0334q46gi3il9izw7k4z32fj06nm8pznqdkr9r51033lnwwy9zy3";
+      type = "gem";
+    };
+    version = "0.4.0";
+  };
+  minitest = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19z7wkhg59y8abginfrm2wzplz7py3va8fyngiigngqvsws6cwgl";
+      type = "gem";
+    };
+    version = "5.14.4";
+  };
+  monetize = {
+    dependencies = ["money"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cna2myxdbwfq0gn6k2hgrh368dq7wld3jklm96443ysykd0difn";
+      type = "gem";
+    };
+    version = "1.11.0";
+  };
+  money = {
+    dependencies = ["i18n"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "11fk7i1w3qjb1br7507z748g1rh3mcmnvpm4jach0i4hsc2wrb5k";
+      type = "gem";
+    };
+    version = "6.14.1";
+  };
+  msgpack = {
+    groups = ["default" "production" "staging"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06iajjyhx0rvpn4yr3h1hc4w4w3k59bdmfhxnjzzh76wsrdxxrc6";
+      type = "gem";
+    };
+    version = "1.4.2";
+  };
+  multi_json = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0pb1g1y3dsiahavspyzkdy39j4q377009f6ix0bh1ag4nqw43l0z";
+      type = "gem";
+    };
+    version = "1.15.0";
+  };
+  multi_xml = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lmd4f401mvravi1i1yq7b2qjjli0yq7dfc4p1nj5nwajp7r6hyj";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  multipart-post = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zgw9zlwh2a6i1yvhhc4a84ry1hv824d6g2iw2chs3k5aylpmpfj";
+      type = "gem";
+    };
+    version = "2.1.1";
+  };
+  nio4r = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xk64wghkscs6bv2n22853k2nh39d131c6rfpnlw12mbjnnv9v1v";
+      type = "gem";
+    };
+    version = "2.5.8";
+  };
+  nokogiri = {
+    dependencies = ["mini_portile2" "racc"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1v02g7k7cxiwdcahvlxrmizn3avj2q6nsjccgilq1idc89cr081b";
+      type = "gem";
+    };
+    version = "1.12.5";
+  };
+  oauth2 = {
+    dependencies = ["faraday" "jwt" "multi_json" "multi_xml" "rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1q6q2kgpxmygk8kmxqn54zkw8cs57a34zzz5cxpsh1bj3ag06rk3";
+      type = "gem";
+    };
+    version = "1.4.7";
+  };
+  ofn-qz = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      fetchSubmodules = false;
+      rev = "467f6ea1c44529c7c91cac4c8211bbd863588c0b";
+      sha256 = "1rm2r2gfbc8cbv9gd4619ivv3qvklwpdayvklyd7w5k9c110fm7j";
+      type = "git";
+      url = "https://github.com/openfoodfoundation/ofn-qz.git";
+    };
+    version = "0.1.0";
+  };
+  order_management = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      path = engines/order_management;
+      type = "path";
+    };
+    version = "0.0.1";
+  };
+  orm_adapter = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fg9jpjlzf5y49qs9mlpdrgs5rpcyihq1s4k79nv9js0spjhnpda";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  pagy = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "010z4lmpj7ld8k6hcpsyd2m0iicycaaabyzscgvnir8cklx1w9cw";
+      type = "gem";
+    };
+    version = "4.11.0";
+  };
+  paper_trail = {
+    dependencies = ["activerecord" "request_store"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hvz0fdzginyyx2x8c755aibdhfvmpjfb9666pdk6ccr9nkb7w1k";
+      type = "gem";
+    };
+    version = "12.1.0";
+  };
+  paperclip = {
+    dependencies = ["activemodel" "activerecord" "activesupport" "cocaine" "mime-types"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "12acd9ambpsq25x4mi4anmsz9p442zhqkba2f4hgml01njxpn8y9";
+      type = "gem";
+    };
+    version = "3.4.2";
+  };
+  parallel = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hkfpm78c2vs1qblnva3k1grijvxh87iixcnyd83s3lxrxsjvag4";
+      type = "gem";
+    };
+    version = "1.21.0";
+  };
+  paranoia = {
+    dependencies = ["activerecord"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02plzv9qygzxa3fryz6cgap64jqrzwprjsm7r467g15mhaa4fzxi";
+      type = "gem";
+    };
+    version = "2.4.3";
+  };
+  parser = {
+    dependencies = ["ast"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06ma6w87ph8lnc9z4hi40ynmcdnjv0p8x53x0s3fjkz4q2p6sxh5";
+      type = "gem";
+    };
+    version = "3.0.2.0";
+  };
+  paypal-sdk-core = {
+    dependencies = ["multi_json" "xml-simple"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0zjqykpxn6snv92wn8a179xyn1vbj327x91dh75lld3myfjz0b0l";
+      type = "gem";
+    };
+    version = "0.3.4";
+  };
+  paypal-sdk-merchant = {
+    dependencies = ["paypal-sdk-core"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0v8gqhn7s53xdf5583hcf3ph22n81hniwli3s1jprak7nx5453f7";
+      type = "gem";
+    };
+    version = "1.117.2";
+  };
+  pdf-reader = {
+    dependencies = ["Ascii85" "afm" "hashery" "ruby-rc4" "ttfunk"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "14cxj3ra9nnn334qpm2vsx9s0zk3095s8ih6cwcp47h3hv03c73y";
+      type = "gem";
+    };
+    version = "2.5.0";
+  };
+  pg = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13mfrysrdrh8cka1d96zm0lnfs59i5x2g6ps49r2kz5p3q81xrzj";
+      type = "gem";
+    };
+    version = "1.2.3";
+  };
+  power_assert = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01z44m715rb6nzfrc90c5rkkdiy42dv3q94jw1q8baf9dg33nwi5";
+      type = "gem";
+    };
+    version = "2.0.1";
+  };
+  pry = {
+    dependencies = ["coderay" "method_source"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0iyw4q4an2wmk8v5rn2ghfy2jaz9vmw2nk8415nnpx2s866934qk";
+      type = "gem";
+    };
+    version = "0.13.1";
+  };
+  pry-byebug = {
+    dependencies = ["byebug" "pry"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "096y5vmzpyy4x9h4ky4cs4y7d19vdq9vbwwrqafbh5gagzwhifiv";
+      type = "gem";
+    };
+    version = "3.9.0";
+  };
+  public_suffix = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1xqcgkl7bwws1qrlnmxgh8g4g9m10vg60bhlw40fplninb3ng6d9";
+      type = "gem";
+    };
+    version = "4.0.6";
+  };
+  puma = {
+    dependencies = ["nio4r"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ahk9a2a05985m0037gqlpha5vdkvmwhyk8v1shkbnwkkm30k0mq";
+      type = "gem";
+    };
+    version = "5.5.0";
+  };
+  raabro = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10m8bln9d00dwzjil1k42i5r7l82x25ysbi45fwyv4932zsrzynl";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  racc = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "178k7r0xn689spviqzhvazzvxfq6fyjldxb3ywjbgipbfi4s8j1g";
+      type = "gem";
+    };
+    version = "1.5.2";
+  };
+  rack = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0i5vs0dph9i5jn8dfc6aqd6njcafmb20rwqngrf759c9cvmyff16";
+      type = "gem";
+    };
+    version = "2.2.3";
+  };
+  rack-mini-profiler = {
+    dependencies = ["rack"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "03hcvjw9nrv0w6yjy2zkv4ivin9xg2wr7xfcvx7rc2msv1gmjb6z";
+      type = "gem";
+    };
+    version = "2.3.3";
+  };
+  rack-protection = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "159a4j4kragqh0z0z8vrpilpmaisnlz3n7kgiyf16bxkwlb3qlhz";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  rack-proxy = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jdr2r5phr3q7d6k9cnxjwlkaps0my0n43wq9mzw3xdqhg9wa3d6";
+      type = "gem";
+    };
+    version = "0.7.0";
+  };
+  rack-rewrite = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0milw71dv96wnc6i48vbzypws51dgf415kkp8c4air0mkdhpj838";
+      type = "gem";
+    };
+    version = "1.5.1";
+  };
+  rack-ssl = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0c21xqkjyl10fngq6dy8082vmn2png8cwkiyzv83ymixq5cx7ygp";
+      type = "gem";
+    };
+    version = "1.4.1";
+  };
+  rack-test = {
+    dependencies = ["rack"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rh8h376mx71ci5yklnpqqn118z3bl67nnv5k801qaqn1zs62h8m";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  rack-timeout = {
+    groups = ["production" "staging"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16ahj3qz3xhfrwvqb4nf6cfzvliigg0idfsp5jyr8qwk676d2f30";
+      type = "gem";
+    };
+    version = "0.6.0";
+  };
+  rails = {
+    dependencies = ["actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties" "sprockets-rails"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1y59m2x8rdc581bjgyyr9dabi3vk3frqhhpbb5ldpbj622kxfpbz";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  rails-controller-testing = {
+    dependencies = ["actionpack" "actionview" "activesupport"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "151f303jcvs8s149mhx2g5mn67487x0blrf9dzl76q1nb7dlh53l";
+      type = "gem";
+    };
+    version = "1.0.5";
+  };
+  rails-dom-testing = {
+    dependencies = ["activesupport" "nokogiri"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lfq2a7kp2x64dzzi5p4cjcbiv62vxh9lyqk2f0rqq3fkzrw8h5i";
+      type = "gem";
+    };
+    version = "2.0.3";
+  };
+  rails-html-sanitizer = {
+    dependencies = ["loofah"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09qrfi3pgllxb08r024lln9k0qzxs57v0slsj8616xf9c0cwnwbk";
+      type = "gem";
+    };
+    version = "1.4.2";
+  };
+  rails-i18n = {
+    dependencies = ["i18n" "railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05mcgv748vppnm3fnml37wjy3dw61wj8vfw14ldaj1yx1bmkhb07";
+      type = "gem";
+    };
+    version = "6.0.0";
+  };
+  rails_safe_tasks = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06bl9cgj8jyc04qdm4jp02ph2vlarapy119lagk6cq1hadzdw7n2";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  railties = {
+    dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1kwpm068cqys34p2g0j3l1g0cd5f3kxnsay5v7lmbd0sgarac0vy";
+      type = "gem";
+    };
+    version = "6.1.4.1";
+  };
+  rainbow = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bb2fpjspydr6x0s8pn1pqkzmxszvkfapv0p4627mywl7ky4zkhk";
+      type = "gem";
+    };
+    version = "3.0.0";
+  };
+  rake = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15whn7p9nrkxangbs9hh75q585yfn66lv0v2mhj6q6dl6x8bzr2w";
+      type = "gem";
+    };
+    version = "13.0.6";
+  };
+  ransack = {
+    dependencies = ["activerecord" "activesupport" "i18n"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0z25sv93lfiyjjm9fgkmnjkc9kjdlpkd7wairk2vqj7dxklv7yvs";
+      type = "gem";
+    };
+    version = "2.4.2";
+  };
+  rb-fsevent = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1qsx9c4jr11vr3a9s5j83avczx9qn9rjaf32gxpc2v451hvbc0is";
+      type = "gem";
+    };
+    version = "0.11.0";
+  };
+  rb-inotify = {
+    dependencies = ["ffi"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jm76h8f8hji38z3ggf4bzi8vps6p7sagxn3ab57qc0xyga64005";
+      type = "gem";
+    };
+    version = "0.10.1";
+  };
+  redcarpet = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bvk8yyns5s1ls437z719y5sdv9fr8kfs8dmr6g8s761dv5n8zvi";
+      type = "gem";
+    };
+    version = "3.5.1";
+  };
+  redis = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ig832dp0xmpp6a934nifzaj7wm9lzjxzasw911fagycs8p6m720";
+      type = "gem";
+    };
+    version = "4.4.0";
+  };
+  regexp_parser = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0vg7imjnfcqjx7kw94ccj5r78j4g190cqzi1i59sh4a0l940b9cr";
+      type = "gem";
+    };
+    version = "2.1.1";
+  };
+  request_store = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cx74kispmnw3ljwb239j65a2j14n8jlsygy372hrsa8mxc71hxi";
+      type = "gem";
+    };
+    version = "1.5.0";
+  };
+  responders = {
+    dependencies = ["actionpack" "railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "14kjykc6rpdh24sshg9savqdajya2dislc1jmbzg91w9967f4gv1";
+      type = "gem";
+    };
+    version = "3.0.1";
+  };
+  rexml = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53";
+      type = "gem";
+    };
+    version = "3.2.5";
+  };
+  roadie = {
+    dependencies = ["css_parser" "nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01kld3drqfiih5x8c13cvr6dpvdl7jml0v9bcw4fsy322lax3kn0";
+      type = "gem";
+    };
+    version = "4.0.0";
+  };
+  roadie-rails = {
+    dependencies = ["railties" "roadie"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jjcqnp37z65dksykzwjiz149kx65nw70lyx8dkw1fm5x7yraqvh";
+      type = "gem";
+    };
+    version = "2.2.0";
+  };
+  roo = {
+    dependencies = ["nokogiri" "rubyzip"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1z2nbf1w48ip2akf1ql86y6569aizi53d6ickjbplkga12n0isf8";
+      type = "gem";
+    };
+    version = "2.8.3";
+  };
+  rspec = {
+    dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1dwai7jnwmdmd7ajbi2q0k0lx1dh88knv5wl7c34wjmf94yv8w5q";
+      type = "gem";
+    };
+    version = "3.10.0";
+  };
+  rspec-core = {
+    dependencies = ["rspec-support"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0wwnfhxxvrlxlk1a3yxlb82k2f9lm0yn0598x7lk8fksaz4vv6mc";
+      type = "gem";
+    };
+    version = "3.10.1";
+  };
+  rspec-expectations = {
+    dependencies = ["diff-lcs" "rspec-support"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sz9bj4ri28adsklnh257pnbq4r5ayziw02qf67wry0kvzazbb17";
+      type = "gem";
+    };
+    version = "3.10.1";
+  };
+  rspec-mocks = {
+    dependencies = ["diff-lcs" "rspec-support"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1d13g6kipqqc9lmwz5b244pdwc97z15vcbnbq6n9rlf32bipdz4k";
+      type = "gem";
+    };
+    version = "3.10.2";
+  };
+  rspec-rails = {
+    dependencies = ["actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "152yz205p8zi5nxxhs8z581rjdvvqsfjndklkvn11f2vi50nv7n9";
+      type = "gem";
+    };
+    version = "5.0.2";
+  };
+  rspec-retry = {
+    dependencies = ["rspec-core"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0n6qc0d16h6bgh1xarmc8vc58728mgjcsjj8wcd822c8lcivl0b1";
+      type = "gem";
+    };
+    version = "0.6.2";
+  };
+  rspec-support = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15j52parvb8cgvl6s0pbxi2ywxrv6x0764g222kz5flz0s4mycbl";
+      type = "gem";
+    };
+    version = "3.10.2";
+  };
+  rswag = {
+    dependencies = ["rswag-api" "rswag-specs" "rswag-ui"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1w7dc4ipxaf6dagj6zbn4j7r384gh4zhdb2i7dvpqahrszf6cc7r";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  rswag-api = {
+    dependencies = ["railties"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1s8wc2m4xngbdm5ms2xskpykzbmr9cvapxpjv4k6yirv71lqdxqc";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  rswag-specs = {
+    dependencies = ["activesupport" "json-schema" "railties"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1dma3j5vfjhyclg8y0gsp44vs4wn9chf4jgfhc9r6ws018xrbxzd";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  rswag-ui = {
+    dependencies = ["actionpack" "railties"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08f7g0cmz5gyzsszaqwmy4mrj2xh6krnd03jw9yi80gqayda4rkr";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  rubocop = {
+    dependencies = ["parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19jg2mm4xj044j06asqv7v0bmq1axikl9pskf35riz54rskv8wci";
+      type = "gem";
+    };
+    version = "1.22.1";
+  };
+  rubocop-ast = {
+    dependencies = ["parser"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0x0xfq2mpg194rcanbjrgvjbh94s9kq72jynxx61789s628kxy59";
+      type = "gem";
+    };
+    version = "1.12.0";
+  };
+  rubocop-rails = {
+    dependencies = ["activesupport" "rack" "rubocop"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1mq3x7jpmp49wwa2r880dcmn27arqc9ln8v2y0dv3ha7s5g8mzrn";
+      type = "gem";
+    };
+    version = "2.12.3";
+  };
+  ruby-progressbar = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "02nmaw7yx9kl7rbaan5pl8x5nn0y4j5954mzrkzi9i3dhsrps4nc";
+      type = "gem";
+    };
+    version = "1.11.0";
+  };
+  ruby-rc4 = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00vci475258mmbvsdqkmqadlwn6gj9m01sp7b5a3zd90knil1k00";
+      type = "gem";
+    };
+    version = "0.1.5";
+  };
+  ruby2_keywords = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15wfcqxyfgka05v2a7kpg64x57gl1y4xzvnc9lh60bqx5sf1iqrs";
+      type = "gem";
+    };
+    version = "0.0.4";
+  };
+  rubyzip = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0grps9197qyxakbpw02pda59v45lfgbgiyw48i0mq9f2bn9y6mrz";
+      type = "gem";
+    };
+    version = "2.3.2";
+  };
+  rufus-scheduler = {
+    dependencies = ["fugit"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1x1cr9hd3phshgrrh796ql37339j5i6w7i7skxjkyygigdzl5kjy";
+      type = "gem";
+    };
+    version = "3.7.0";
+  };
+  sass = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0kfpcwh8dgw4lc81qglkvjl73689jy3g7196zkxm4fpskg1p5lkw";
+      type = "gem";
+    };
+    version = "3.4.25";
+  };
+  sass-rails = {
+    dependencies = ["railties" "sass" "sprockets" "sprockets-rails" "tilt"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19bcs1ya3bkx36qaz21kgiz28s9h678m3rszcw7aany2lsis56y7";
+      type = "gem";
+    };
+    version = "5.0.8";
+  };
+  sd_notify = {
+    groups = ["production" "staging"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0c9imnjbakx25r2n7widfp00s19ndzmmwax761mx5vbwm9nariyb";
+      type = "gem";
+    };
+    version = "0.1.1";
+  };
+  select2-rails = {
+    dependencies = ["sass-rails" "thor"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      fetchSubmodules = false;
+      rev = "fc240e85fbdf1878ff3c39d972c0cd9a312f5ed4";
+      sha256 = "0lflvygxgmm4yqhnx66h77g742g01x7jajjjn33a4hm0n7lgdq5y";
+      type = "git";
+      url = "https://github.com/openfoodfoundation/select2-rails.git";
+    };
+    version = "3.4.9";
+  };
+  selenium-webdriver = {
+    dependencies = ["childprocess" "rubyzip"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0adcvp86dinaqq3nhf8p3m0rl2g6q0a4h52k0i7kdnsg1qz9k86y";
+      type = "gem";
+    };
+    version = "3.142.7";
+  };
+  semantic_range = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1dlp97vg95plrsaaqj7x8l7z9vsjbhnqk4rw1l30gy26lmxpfrih";
+      type = "gem";
+    };
+    version = "3.0.0";
+  };
+  shoulda-matchers = {
+    dependencies = ["activesupport"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0z6v2acldnvqrnvfk70f9xq39ppw5j03kbz2hpz7s17lgnn21vx8";
+      type = "gem";
+    };
+    version = "5.0.0";
+  };
+  sidekiq = {
+    dependencies = ["connection_pool" "rack" "redis"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "104a97cl94aclg71ngrr097zjbdf6cibnz4q3rqjb88izmd7cfk6";
+      type = "gem";
+    };
+    version = "6.2.2";
+  };
+  sidekiq-scheduler = {
+    dependencies = ["e2mmap" "redis" "rufus-scheduler" "sidekiq" "thwait" "tilt"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0k686psrg8rd902yyqi38vys11zb07192skzx8zyyvyz2l9vrzds";
+      type = "gem";
+    };
+    version = "3.1.0";
+  };
+  simplecov = {
+    dependencies = ["docile" "simplecov-html" "simplecov_json_formatter"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hrv046jll6ad1s964gsmcq4hvkr3zzr6jc7z1mns22mvfpbc3cr";
+      type = "gem";
+    };
+    version = "0.21.2";
+  };
+  simplecov-html = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yx01bxa8pbf9ip4hagqkp5m0mqfnwnw2xk8kjraiywz4lrss6jb";
+      type = "gem";
+    };
+    version = "0.12.3";
+  };
+  simplecov_json_formatter = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "19r15hyvh52jx7fmsrcflb58xh8l7l0zx4sxkh3hqzhq68y81pjl";
+      type = "gem";
+    };
+    version = "0.1.3";
+  };
+  spring = {
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "12kyz3jdnaarhf2jbykmd9mqg085gxsx00c16la5q7czxvpb2x2r";
+      type = "gem";
+    };
+    version = "3.0.0";
+  };
+  spring-commands-rspec = {
+    dependencies = ["spring"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0b0svpq3md1pjz5drpa5pxwg8nk48wrshq8lckim4x3nli7ya0k2";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  sprockets = {
+    dependencies = ["concurrent-ruby" "rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "182jw5a0fbqah5w9jancvfmjbk88h8bxdbwnl4d3q809rpxdg8ay";
+      type = "gem";
+    };
+    version = "3.7.2";
+  };
+  sprockets-rails = {
+    dependencies = ["actionpack" "activesupport" "sprockets"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0mwmz36265646xqfyczgr1mhkm1hfxgxxvgdgr4xfcbf2g72p1k2";
+      type = "gem";
+    };
+    version = "3.2.2";
+  };
+  state_machines = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00mi16hg3rhkxz4y58s173cbnjlba41y9bfcim90p4ja6yfj9ri3";
+      type = "gem";
+    };
+    version = "0.5.0";
+  };
+  state_machines-activemodel = {
+    dependencies = ["activemodel" "state_machines"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0b4dffzlj38adin6gm0ky72r5c507qdb1jprnm7h9gnlj2qxlcp9";
+      type = "gem";
+    };
+    version = "0.8.0";
+  };
+  state_machines-activerecord = {
+    dependencies = ["activerecord" "state_machines-activemodel"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1dmaf4f4cg3gamzgga3gamp0kv9lvianqzr9103dw0xbp00vfbq7";
+      type = "gem";
+    };
+    version = "0.8.0";
+  };
+  stringex = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15ns7j5smw04w6w7bqd5mm2qcl7w9lhwykyb974i4isgg9yc23ys";
+      type = "gem";
+    };
+    version = "2.8.5";
+  };
+  stripe = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0b2savy5h9shdzr6fkfqyrpmpx1a82gn4j47895zwc279dhwnlrh";
+      type = "gem";
+    };
+    version = "5.38.0";
+  };
+  temple = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "060zzj7c2kicdfk6cpnn40n9yjnhfrr13d0rsbdhdij68chp2861";
+      type = "gem";
+    };
+    version = "0.8.2";
+  };
+  test-prof = {
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1vg0zjfgibdcgkzb4c25v0f4v6v8mvpzvgcag194rwglmkkyrwkx";
+      type = "gem";
+    };
+    version = "1.0.7";
+  };
+  test-unit = {
+    dependencies = ["power_assert"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "03pn837vgza8v550ggzhcxbvb80d6qivqnhv3n39lrfnsc8xgi7m";
+      type = "gem";
+    };
+    version = "3.4.7";
+  };
+  thor = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18yhlvmfya23cs3pvhr1qy38y41b6mhr5q9vwv5lrgk16wmf3jna";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  thread-local = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ryjgfwcsbkxph1l24x87p1yabnnbqy958s57w37iwhf3z9nid9g";
+      type = "gem";
+    };
+    version = "1.1.0";
+  };
+  thwait = {
+    dependencies = ["e2mmap"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0q0fqlh0668j66z0g3s5yhqs39368az2ycxyphsx4c5nib5r4kak";
+      type = "gem";
+    };
+    version = "0.2.0";
+  };
+  tilt = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rn8z8hda4h41a64l0zhkiwz2vxw9b1nb70gl37h1dg2k874yrlv";
+      type = "gem";
+    };
+    version = "2.0.10";
+  };
+  timecop = {
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fw3nzycvd15qa7sxy9dxb4hqyizy1s8f7q3d50smbzyyvr8fvia";
+      type = "gem";
+    };
+    version = "0.9.4";
+  };
+  ttfunk = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15iaxz9iak5643bq2bc0jkbjv8w2zn649lxgvh5wg48q9d4blw13";
+      type = "gem";
+    };
+    version = "1.7.0";
+  };
+  tzinfo = {
+    dependencies = ["concurrent-ruby"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10qp5x7f9hvlc0psv9gsfbxg4a7s0485wsbq1kljkxq94in91l4z";
+      type = "gem";
+    };
+    version = "2.0.4";
+  };
+  uglifier = {
+    dependencies = ["execjs"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0wgh7bzy68vhv9v68061519dd8samcy8sazzz0w3k8kqpy3g4s5f";
+      type = "gem";
+    };
+    version = "4.2.0";
+  };
+  unicode-display_width = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0csjm9shhfik0ci9mgimb7hf3xgh7nx45rkd9rzgdz6vkwr8rzxn";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  uniform_notifier = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1614dqnky0f9f1znj0lih8i184vfps86md93dw0kxrg3af9gnqb4";
+      type = "gem";
+    };
+    version = "1.14.2";
+  };
+  valid_email2 = {
+    dependencies = ["activemodel" "mail"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0l4xkwvx7aj5z18h6vzp0wsfjbcrl76ixp0x95wwlrhn03qab6hs";
+      type = "gem";
+    };
+    version = "4.0.0";
+  };
+  view_component = {
+    dependencies = ["activesupport" "method_source"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qygf9dfn42q8y3i2g04zqqmw1bjklmsxgdcpfk07nbnpjh391i9";
+      type = "gem";
+    };
+    version = "2.40.0";
+  };
+  view_component_storybook = {
+    dependencies = ["view_component"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yslfpcw58mqqaig83b2h98mf04i19ck37m270d8naxr69iv9h0n";
+      type = "gem";
+    };
+    version = "0.10.1";
+  };
+  warden = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1l7gl7vms023w4clg02pm4ky9j12la2vzsixi2xrv9imbn44ys26";
+      type = "gem";
+    };
+    version = "1.2.9";
+  };
+  web = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      path = engines/web;
+      type = "path";
+    };
+    version = "0.0.1";
+  };
+  web-console = {
+    dependencies = ["actionview" "activemodel" "bindex" "railties"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0d9hk929cmisix2l1w9kkh05b57ih9yvnh4wv52axxw41scnv2d9";
+      type = "gem";
+    };
+    version = "4.1.0";
+  };
+  webdrivers = {
+    dependencies = ["nokogiri" "rubyzip" "selenium-webdriver"];
+    groups = ["development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1naymcfmm9pkf0f67xd99d9f6dpv477ggyvc1c04gxifirynfydp";
+      type = "gem";
+    };
+    version = "4.6.1";
+  };
+  webmock = {
+    dependencies = ["addressable" "crack" "hashdiff"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1l8vh8p0g92cqcvv0ra3mblsa4nczh0rz8nbwbkc3g3yzbva85xk";
+      type = "gem";
+    };
+    version = "3.14.0";
+  };
+  webpacker = {
+    dependencies = ["activesupport" "rack-proxy" "railties" "semantic_range"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1cq6m5qwm3bmi7hkjfmbg2cs4qjq4wswlrwcfk8l1svfqbi135v3";
+      type = "gem";
+    };
+    version = "5.4.3";
+  };
+  websocket-driver = {
+    dependencies = ["websocket-extensions"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0a3bwxd9v3ghrxzjc4vxmf4xa18c6m4xqy5wb0yk5c6b9psc7052";
+      type = "gem";
+    };
+    version = "0.7.5";
+  };
+  websocket-extensions = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hc2g9qps8lmhibl5baa91b4qx8wqw872rgwagml78ydj8qacsqw";
+      type = "gem";
+    };
+    version = "0.1.5";
+  };
+  whenever = {
+    dependencies = ["chronic"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0im2x9rgr752hb9f1nnfj486k96bfiqj0xsv2bmzaq1rqhbi9dyr";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  wicked_pdf = {
+    dependencies = ["activesupport"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0i7ifpb5ynvg7m6i1bivmvnaz29vjfwf6f4qj9gs7nq4yyxflqr6";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  wkhtmltopdf-binary = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ksmryizimmw60k5siciv3xfxx9q797bh5a1rga7hqban98rv0c2";
+      type = "gem";
+    };
+    version = "0.12.6.5";
+  };
+  xml-simple = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1flpmghcbil6qbl3f6w67kpjrnjbw86x7h6g5n4m5ff0cg4sylrv";
+      type = "gem";
+    };
+    version = "1.1.8";
+  };
+  xpath = {
+    dependencies = ["nokogiri"];
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bh8lk9hvlpn7vmi6h4hkcwjzvs2y0cmkk3yjjdr8fxvj6fsgzbd";
+      type = "gem";
+    };
+    version = "3.2.0";
+  };
+  zeitwerk = {
+    groups = ["default" "development" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1746czsjarixq0x05f7p3hpzi38ldg6wxnxxw74kbjzh1sdjgmpl";
+      type = "gem";
+    };
+    version = "2.4.2";
+  };
+}
\ No newline at end of file
index 08d0681ea1b3ea53ffc205db66169f5c1dc48af7..97e31c84fcb3b4aed647020d8c24e8c000c0dbac 100644 (file)
@@ -45,6 +45,8 @@
         let
           cfg = config.services.paste;
         in {
         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 {
           options = {
             services.paste = {
               enable = lib.mkOption {
index 86666b8697d1b4a8ab969842bcc608e75190fb5d..3172de5fe9e9931283db9fe5952aac4a0282aff0 100644 (file)
@@ -10,9 +10,32 @@ import mimetypes
 
 magic = magic.Magic(mime=True)
 
 
 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",
 config = {
         "directory": os.environ["PASTE_DIRECTORY"],
         "self_paste_id": "abcd123",
+        "license_paste_id": "license",
         "max_content_length": 16 * 1000 * 1000
         }
 
         "max_content_length": 16 * 1000 * 1000
         }
 
@@ -33,6 +56,8 @@ def read_paste(paste_id):
         if mime.startswith("text/x-script."):
             mime="text/plain"
         return (content, mime)
         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)
 
     else:
         abort(404)
 
@@ -69,9 +94,11 @@ $ curl -X POST --data-binary @{self} {host}
 -> GET {paste}/download
    force download of file
 </pre>
 -> 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"]),
 '''.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")
 
                  self=os.path.basename(__file__)
                  ), mimetype="text/html")
 
index 618711542b4150c5d40d55c3d3dde48760d8f9c9..eeb516a9d6cba1b07a49561b4405e87a7acc640e 100644 (file)
     },
     "myuids": {
       "locked": {
     },
     "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": {
       },
       "original": {
-        "dir": "flakes/myuids",
-        "type": "git",
-        "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
+        "path": "../myuids",
+        "type": "path"
       }
     },
     "nixpkgs": {
       }
     },
     "nixpkgs": {
index 2f9c8c14f8783e36bdfe9002ebf1751f41fe6f81..e8153ebd7ab860e49f3ffbbe1ca6f7f90e6cd7f3 100644 (file)
@@ -1,9 +1,7 @@
 {
   description = "A free software to take back control of your videos";
   inputs.myuids = {
 {
   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";
   };
   inputs.flake-utils.url = "github:numtide/flake-utils";
   inputs.nixpkgs.url = "github:NixOS/nixpkgs";
     nixosModule = { lib, pkgs, config, ... }:
       let
         name = "peertube";
     nixosModule = { lib, pkgs, config, ... }:
       let
         name = "peertube";
-        cfg = config.services.peertube;
+        cfg = config.immaeServices.peertube;
       in
       {
       in
       {
-        options.services.peertube = {
+        options.immaeServices.peertube = {
           enable = lib.mkEnableOption "Enable Peertube’s service";
           user = lib.mkOption {
             type = lib.types.str;
           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.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 ];
             environment.HOME = cfg.package;
 
             path = [ pkgs.nodejs pkgs.yarn pkgs.bashInteractive pkgs.ffmpeg pkgs.openssl ];
similarity index 88%
rename from pkgs/python-packages/buildbot/plugins/buildslist/default.nix
rename to flakes/private/buildbot/buildslist/default.nix
index 4ab4c5474689db480f61c0263d6da98e0f03a6a6..7f725033ecc1a88ccca86c1f9dcc53b465561289 100644 (file)
@@ -1,16 +1,15 @@
-{ stdenv, runCommand, writeScriptBin, buildBowerComponents, pythonPackages, libsass, python, fetchurl, jq, yarn, nodejs-10_x, yarn2nix-moretea, sources }:
+{ stdenv, runCommand, writeScriptBin, buildBowerComponents, pythonPackages, fetchurl, jq, yarn, nodejs-10_x, yarn2nix-moretea, buildslist_src }:
 let
   yarn2nix-moretea' = yarn2nix-moretea.override({
     yarn = yarn.override({ nodejs = nodejs-10_x; });
     nodejs = nodejs-10_x;
   });
 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";
   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";
   };
   buildslist_yarn = yarn2nix-moretea'.mkYarnModules rec {
     name = "buildslist-yarn-modules";
@@ -21,7 +20,7 @@ let
     yarnNix = ./yarn-packages.nix;
     pkgConfig = {
       node-sass = {
     yarnNix = ./yarn-packages.nix;
     pkgConfig = {
       node-sass = {
-        buildInputs = [ libsass python ];
+        buildInputs = with yarn2nix-moretea'.pkgs; [ libsass python2 ];
         postInstall =
           ''
             node scripts/build.js --tarball=${nodeHeaders}
         postInstall =
           ''
             node scripts/build.js --tarball=${nodeHeaders}
similarity index 62%
rename from modules/private/buildbot/common/build_helpers.py
rename to flakes/private/buildbot/common/build_helpers.py
index acea90591f5ca16b524e0e41b7d22087ef72cf7c..77e6c074c5c4bc71777a218dab48b0c9e580df04 100644 (file)
@@ -3,9 +3,12 @@ from buildbot_buildslist import BuildsList
 from shutil import which
 
 __all__ = [
 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"
         ]
 
 # Small helpers"
@@ -19,22 +22,21 @@ def clean_branch(props):
 def package_and_upload(package, package_dest, package_url):
     return [
             steps.ShellCommand(name="build package",
 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,
                 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,
                 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):
                 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", {})
         oldpath = kwargs.get("env", {}).get("PATH", None)
         if which("nix-shell", path=oldpath) is None:
             kwargs["env"] = kwargs.get("env", {})
@@ -43,23 +45,37 @@ class NixShellCommand(steps.ShellCommand):
             elif isinstance(oldpath, list):
                 kwargs["env"]["PATH"] = ["/run/current-system/sw/bin"] + oldpath
         nixcommand = ["nix-shell"]
             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")
         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)
         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
         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("",
     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=""),
                 revision=util.FixedParameter(name="revision", default=""),
                 repository=util.FixedParameter(name="repository", default=""),
                 project=util.FixedParameter(name="project", default=""),
@@ -88,50 +104,51 @@ def deploy_scheduler(name, builders):
             ]
         )
 
             ]
         )
 
-def hook_scheduler(project, timer=10):
+def git_hook_scheduler(project, builders=[], timer=1):
+    if len(builders) == 0:
+        builders = ["{}_build".format(project)]
+    return schedulers.AnyBranchScheduler(
+            change_filter=util.ChangeFilter(category="gitolite-hooks", project=project),
+            name="{}_git_hook".format(project), treeStableTimer=timer, builderNames=builders)
+
+def deploy_hook_scheduler(project, builders, timer=1):
     return schedulers.AnyBranchScheduler(
     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.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
 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
 
     @defer.inlineCallbacks
-    def reconfigService(self, serverUrl, **kwargs):
+    def reconfigService(self, appriseUrls, **kwargs):
+        self.appriseUrls = appriseUrls
         yield HttpStatusPushBase.reconfigService(self, **kwargs)
         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)
 
     @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):
 
     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"]:
         if "environment" in build["properties"]:
             msg = "{} environment".format(build["properties"]["environment"][0])
             if "build" in build["properties"]:
@@ -152,67 +169,31 @@ class SlackStatusPush(HttpStatusPushBase):
             else:
                 duration = "{}s".format(seconds)
 
             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,
                     )
                     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:
         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,
                     )
                     build["builder"]["name"],
                     msg,
                     )
-            attachments = []
-
         return {
                 "username": "Buildbot",
         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,
                 "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"
 
 class XMPPStatusPush(HttpStatusPushBase):
     name = "XMPPStatusPush"
 
@@ -261,7 +242,7 @@ class XMPPStatusPush(HttpStatusPushBase):
                 duration = "{}s".format(seconds)
 
             text = "Build {} ( {} ) of {}'s {} was {} in {}.".format(
                 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"]],
                     build["builder"]["name"],
                     msg,
                     results.Results[build["results"]],
@@ -269,9 +250,44 @@ class XMPPStatusPush(HttpStatusPushBase):
                     )
         else:
             text = "Build {} ( {} ) of {}'s {} started.".format(
                     )
         else:
             text = "Build {} ( {} ) of {}'s {} started.".format(
-                    build["buildid"], build["url"],
+                    build["number"], build["url"],
                     build["builder"]["name"],
                     msg,
                     )
 
         return text
                     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
similarity index 67%
rename from modules/private/buildbot/common/master.cfg
rename to flakes/private/buildbot/common/master.cfg
index abe08e0a24066890d84c9875c2fbccd8aeccfe56..0357f2aa27397bc14fbe2a4c4de73cf70f04efd6 100644 (file)
@@ -22,6 +22,27 @@ class CustomBase(webhooks.base):
 
         return ([args], None)
 
 
         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,
 userInfoProvider = util.LdapUserInfo(
         uri=E.LDAP_URL,
         bindUser=E.LDAP_ADMIN_USER,
@@ -52,7 +73,10 @@ c = BuildmasterConfig = {
             secrets.SecretInAFile(E.SECRETS_FILE),
             ],
         "www": {
             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": {},
             "plugins": {
                 "waterfall_view": {},
                 "console_view": {},
diff --git a/flakes/private/buildbot/flake.lock b/flakes/private/buildbot/flake.lock
new file mode 100644 (file)
index 0000000..8952f75
--- /dev/null
@@ -0,0 +1,61 @@
+{
+  "nodes": {
+    "buildslist": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585697026,
+        "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
+        "ref": "master",
+        "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
+        "revCount": 4,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "buildslist": "buildslist",
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/private/buildbot/flake.nix b/flakes/private/buildbot/flake.nix
new file mode 100644 (file)
index 0000000..8b3c704
--- /dev/null
@@ -0,0 +1,74 @@
+{
+  description = "The continuous integration framework";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.buildslist = {
+    url = "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist";
+    type = "git";
+    flake = false;
+  };
+  outputs = { self, nixpkgs, flake-utils, buildslist }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      python = pkgs.python38;
+      wokkel = python.pkgs.buildPythonPackage rec {
+        pname = "wokkel";
+        version = "18.0.0";
+        src = python.pkgs.fetchPypi {
+          inherit pname version;
+          sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016";
+        };
+        propagatedBuildInputs = with python.pkgs; [ twisted.extras.tls twisted incremental dateutil ];
+        doCheck = false;
+      };
+      buildbot_common = python.pkgs.buildPythonPackage {
+        name = "buildbot_common";
+        src = ./common;
+        format = "other";
+        installPhase = ''
+          mkdir -p $out/${python.sitePackages}
+          cp -a $src $out/${python.sitePackages}/buildbot_common
+        '';
+      };
+      buildbot-full = python.pkgs.buildbot-full.withPlugins [ buildslist-plugin ] // {
+        inherit buildbot_common;
+        buildbot_config = project: python.pkgs.buildPythonPackage (rec {
+          name = "buildbot_config-${project.name}";
+          src = if project.name == "test" then ./test_project else project.src;
+          format = "other";
+          installPhase = ''
+            mkdir -p $out/${python.sitePackages}
+            cp -a $src $out/${python.sitePackages}/buildbot_config
+            '';
+        });
+        common_packages = pkgs: [
+          (pkgs.apprise.overridePythonAttrs(old: { propagatedBuildInputs = old.propagatedBuildInputs ++ [ pkgs.sleekxmpp ]; })) pkgs.libvirt pkgs.treq pkgs.ldap3
+          buildbot-full pkgs.buildbot-worker pkgs.pip buildbot_common
+          wokkel
+        ];
+      };
+      buildslist-plugin = pkgs.callPackage ./buildslist {
+        pythonPackages = python.pkgs;
+        buildslist_src = buildslist;
+      };
+    in rec {
+      packages = {
+        buildslist = buildslist-plugin;
+        buildbot-full = buildbot-full;
+        buildbot_common = buildbot_common;
+      };
+      defaultPackage = packages.buildbot-full;
+      legacyPackages = packages;
+      checks = packages;
+    }) // rec {
+      overlays = {
+        immae-buildbot = final: prev: {
+          immae-buildbot = self.defaultPackage."${final.system}";
+        };
+      };
+      overlay = overlays.immae-buildbot;
+    };
+}
diff --git a/flakes/private/buildbot/test_project/__init__.py b/flakes/private/buildbot/test_project/__init__.py
new file mode 100644 (file)
index 0000000..d5893fd
--- /dev/null
@@ -0,0 +1,121 @@
+from buildbot.plugins import *
+from buildbot_common.build_helpers import *
+import buildbot_common.libvirt as ilibvirt
+import os
+from buildbot.util import bytes2unicode
+import json
+
+__all__ = [ "configure", "E" ]
+
+class E():
+    PROJECT       = "test"
+    BUILDBOT_URL  = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
+    SOCKET        = "unix:/run/buildbot/{}.sock".format(PROJECT)
+    PB_SOCKET     = os.environ["BUILDBOT_WORKER_PORT"]
+    WORKER_HOST   = "{}:{}".format(os.environ["BUILDBOT_HOST"], PB_SOCKET)
+    RELEASE_PATH  = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
+    RELEASE_URL   = "https://release.immae.eu/{}".format(PROJECT)
+    GIT_URL       = "https://git.immae.eu/perso/Immae/TestProject.git"
+    SSH_KEY_PATH  = "/var/lib/buildbot/buildbot_key"
+    LIBVIRT_URL   = os.environ["BUILDBOT_VIRT_URL"] + "?keyfile=" + SSH_KEY_PATH
+    XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
+
+    # master.cfg
+    SECRETS_FILE       = os.getcwd() + "/secrets"
+    LDAP_URL           = "ldaps://ldap.immae.eu:636"
+    LDAP_ADMIN_USER    = "cn=buildbot,ou=services,dc=immae,dc=eu"
+    LDAP_BASE          = "dc=immae,dc=eu"
+    LDAP_PATTERN       = "(uid=%(username)s)"
+    LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=test,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
+    TITLE_URL          = "https://git.immae.eu/?p=perso/Immae/TestProject.git;a=summary"
+    TITLE              = "Test project"
+
+class CustomBase(webhooks.base):
+    def getChanges(self, request):
+        try:
+            content = request.content.read()
+            args = json.loads(bytes2unicode(content))
+        except Exception as e:
+            raise ValueError("Error loading JSON: " + str(e))
+
+        args.setdefault("comments", "")
+        args.setdefault("repository", "")
+        args.setdefault("author", args.get("who", "unknown"))
+
+        if args["category"] == "deploy_webhook":
+            args = {
+                    "category": "deploy_webhook",
+                    "comments": "",
+                    "repository": "",
+                    "author": "unknown",
+                    "project": "TestProject",
+                    "properties": {
+                        "environment": args.get("environment", "integration"),
+                        "build": "test_{}.tar.gz".format(args.get("branch", "master"))
+                        }
+                    }
+
+        return ([args], None)
+
+def configure(c):
+    c["buildbotURL"] = E.BUILDBOT_URL
+    c["www"]["port"] = E.SOCKET
+
+    c["www"]["change_hook_dialects"]["base"] = { "custom_class": CustomBase }
+
+    configure_build(c)
+    configure_deploy(c)
+
+    configure_apprise_push(c, E.SECRETS_FILE, all_builder_names(c))
+    configure_xmpp_push(c, E.SECRETS_FILE, all_builder_names(c), E.XMPP_RECIPIENTS)
+
+def configure_build(c):
+    builder_name = "TestProject_build"
+    worker_name = "test-build"
+    c['schedulers'].append(force_scheduler("force_test", [builder_name]))
+    c['schedulers'].append(git_hook_scheduler("TestProject", [builder_name]))
+    c['workers'].append(libvirt_worker(worker_name))
+    c['builders'].append(util.BuilderConfig(name=builder_name, workernames=[worker_name], factory=build_factory()))
+
+def configure_deploy(c):
+    builder_name = "TestProject_deploy"
+    worker_name = "test-deploy"
+    c['workers'].append(libvirt_worker(worker_name))
+    c['schedulers'].append(deploy_hook_scheduler("TestProject", [builder_name]))
+    c['schedulers'].append(deploy_scheduler("deploy_test", [builder_name]))
+    c['builders'].append(util.BuilderConfig(name=builder_name, workernames=[worker_name], factory=deploy_factory()))
+
+def libvirt_worker(name):
+    return ilibvirt.LibVirtWorker(name,
+            open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(),
+            ilibvirt.Connection(E.LIBVIRT_URL),
+            E.WORKER_HOST)
+
+def build_factory():
+    package = util.Interpolate("test_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch)
+    package_dest = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_PATH), clean_branch=clean_branch)
+    package_url = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_URL), clean_branch=clean_branch)
+
+    factory = util.BuildFactory()
+    factory.addStep(steps.Git(logEnviron=False,
+        repourl=E.GIT_URL, mode="full", method="fresh"))
+    factory.addStep(steps.ShellCommand(name="env",
+        logEnviron=False, command=["env"]))
+    factory.addStep(steps.ShellCommand(name="pwd",
+        logEnviron=False, command=["pwd"]))
+    factory.addStep(steps.ShellCommand(name="true",
+        logEnviron=False, command=["true"]))
+    factory.addStep(steps.ShellCommand(name="echo",
+        logEnviron=False, command=["echo", package]))
+    factory.addSteps(package_and_upload(package, package_dest, package_url))
+
+    return factory
+
+def deploy_factory():
+    package_dest = util.Interpolate("{}/%(prop:build)s".format(E.RELEASE_PATH))
+
+    factory = util.BuildFactory()
+    factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
+    factory.addStep(steps.SetProperties(properties=compute_build_infos("test", E.RELEASE_PATH)))
+    factory.addStep(steps.MasterShellCommand(command=deploy_ssh_command(E.SSH_KEY_PATH, {})))
+    return factory
diff --git a/flakes/private/chatons/flake.lock b/flakes/private/chatons/flake.lock
new file mode 100644 (file)
index 0000000..39ed484
--- /dev/null
@@ -0,0 +1,23 @@
+{
+  "nodes": {
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "environment": "environment"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/private/chatons/flake.nix b/flakes/private/chatons/flake.nix
new file mode 100644 (file)
index 0000000..70fb02d
--- /dev/null
@@ -0,0 +1,142 @@
+{
+  inputs.environment.url = "path:../environment";
+  outputs = { self, environment }: {
+    nixosModule = self.nixosModules.chatons;
+    nixosModules.chatons = { config, lib, pkgs, nodes, ... }:
+      let
+        concatValue = value: if lib.isList value then builtins.concatStringsSep "," value else builtins.toString value;
+        toProperties = properties: builtins.concatStringsSep "\n" (
+          lib.collect
+            (p: !(lib.isAttrs p))
+            (lib.mapAttrsRecursive
+              (path: value: builtins.concatStringsSep "." (builtins.filter (f: f != "") path) + " = " + (concatValue value))
+              properties));
+        before = name: {
+          "${name}" = {
+            status.level = "OK";
+            status.description = "OK";
+            install.type = "PACKAGE";
+            registration.load = "OPEN";
+          };
+          host = {
+            name = "Hetzner";
+            server.type = "PHYSICAL";
+            provider.type = "HOSTEDSERVER";
+            server.distribution = "NixOS";
+            country.name = "Allemagne";
+            country.code = "DE";
+          };
+        };
+        after = name: {
+          file = {
+            class = name;
+            protocol = "ChatonsInfos-0.5";
+            generator = "Nix derivation";
+          };
+          "${name}" = {
+            legal.url = "https://www.immae.eu/mentions.html";
+            guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/";
+            contact.url = "https://www.immae.eu/contacts_fr.html";
+            contact.email = config.myEnv.tools.contact;
+            startdate = "01/01/2019";
+          };
+        };
+        organization = {
+          file = {
+            class = "organization";
+            protocol = "ChatonsInfos-0.5";
+            datetime = "2021-01-11T22:23:00";
+            generator = "Nix derivation";
+          };
+          organization = {
+            country.name = "France";
+            country.code = "FR";
+            name = "ImmaeEu";
+            description = "ImmaeEu est un CHATONS des Alpes-Maritimes";
+            website = "https://www.immae.eu";
+            logo = "https://assets.immae.eu/logo.jpg";
+            socialnetworks = {
+              diaspora = "https://diaspora.immae.eu/people/1a185f29cc76cb35";
+              facebook = "https://www.facebook.com/ismael.bouya";
+              mastodon = "https://mastodon.immae.eu/@immae";
+              peertube = "https://peertube.immae.eu/accounts/immae/";
+              twitter = "https://twitter.com/_immae";
+            };
+            chatrooms = {
+              xmpp = "ismael@immae.fr";
+              irc = "immae@freenode";
+              matrix = "#support:immae.eu";
+            };
+            contact.url = "https://www.immae.eu/contacts_fr.html";
+            contact.email = config.myEnv.tools.contact;
+            legal.url = "https://www.immae.eu/mentions.html";
+            guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/";
+            guide.user = "https://www.immae.eu/docs";
+            status.level = "ACTIVE";
+            status.description = "En activité";
+            startdate = "01/01/2019";
+            type = "COMPANY";
+            owner = {
+              logo = "https://assets.immae.eu/logo.jpg";
+              name = "Ismaël Bouya";
+              website = "https://www.immae.eu";
+            };
+            memberof.chatons = {
+              startdate = "01/07/2019";
+              status.level = "ACTIVE";
+              status.description = "Participe au collectif";
+            };
+          };
+        };
+        subname = v: if v.published or true then "subs" else "subs-hidden";
+        toOrganizationProperties = name: pkgs.writeText name (toProperties organization + "\n" + (
+          builtins.concatStringsSep "\n" (lib.mapAttrsToList
+            (n: v: "${subname v}.${n} = https://www.immae.eu/.well-known/chatonsinfos/service-${n}.properties") mergedServices
+          )) + "\n" + (
+          builtins.concatStringsSep "\n" (lib.mapAttrsToList
+            (n: v: "subs.hosting-${n} = https://www.immae.eu/.well-known/chatonsinfos/hosting-${n}.properties") mergedHostings
+          )));
+        toHostingProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "hosting") (lib.recursiveUpdate content (after "hosting"))));
+        toServiceProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "service") (lib.recursiveUpdate content (after "service"))));
+
+        cfg = config.myServices.chatonsProperties;
+        mergedServices = lib.foldr (v: o: lib.recursiveUpdate o v) {} (lib.mapAttrsToList (k: v: if (v.config.myServices or {}) ? "chatonsProperties" then v.config.myServices.chatonsProperties.services else {}) nodes);
+        mergedHostings = lib.foldr (v: o: lib.recursiveUpdate o v) {} (lib.mapAttrsToList (k: v: if (v.config.myServices or {}) ? "chatonsProperties" then v.config.myServices.chatonsProperties.hostings else {}) nodes);
+      in {
+        imports = [
+          environment.nixosModule
+        ];
+        options.myServices.chatonsProperties.organization = lib.mkOption {
+          type = lib.types.attrsOf lib.types.unspecified;
+          default = {};
+          description = ''
+            nested attrs of strings or arrays of strings
+          '';
+        };
+        options.myServices.chatonsProperties.services = lib.mkOption {
+          type = lib.types.attrsOf lib.types.unspecified;
+          default = {};
+          description = ''
+            nested attrs of strings or arrays of strings
+          '';
+        };
+        options.myServices.chatonsProperties.hostings = lib.mkOption {
+          type = lib.types.attrsOf lib.types.unspecified;
+          default = {};
+          description = ''
+            nested attrs of strings or arrays of strings
+          '';
+        };
+        options.myServices.chatonsProperties.propertiesPath = lib.mkOption {
+          type = lib.types.package;
+          readOnly = true;
+          default = pkgs.runCommand "chatons" {} ''
+            mkdir -p $out
+            cp ${toOrganizationProperties "immae-eu"} $out/immae-eu.properties
+            ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toHostingProperties n c} $out/hosting-${n}.properties") mergedHostings)}
+            ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toServiceProperties n c} $out/service-${n}.properties") mergedServices)}
+          '';
+        };
+      };
+  };
+}
diff --git a/flakes/private/environment-dummy/flake.nix b/flakes/private/environment-dummy/flake.nix
new file mode 100644 (file)
index 0000000..5ebc27f
--- /dev/null
@@ -0,0 +1,18 @@
+{
+  description = ''
+    A dummy flake that contains a compatible structure to the one stored at
+    git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets
+    It is used as default value in "public" configurations
+  '';
+  outputs = { self }: {
+    vars-file = ./vars.yml;
+    ldap-conf = ./ldap.conf;
+    environment-file = ./environment.nix;
+    nixosModule = self.nixosModules.my-environment;
+    nixosModules.my-environment = { ... }: {
+      config.myEnv = import self.environment-file;
+    };
+    nixosModules.users-config-eldiron = { ... }: {};
+  };
+}
+
diff --git a/flakes/private/environment-dummy/ldap.conf b/flakes/private/environment-dummy/ldap.conf
new file mode 100644 (file)
index 0000000..064a4be
--- /dev/null
@@ -0,0 +1,13 @@
+# Indices to maintain
+index   objectClass       eq
+index   uid               pres,eq
+index   mail              pres,sub,eq
+index   cn                pres,sub,eq
+index   sn                pres,sub,eq
+index   dc                eq
+index   krbPrincipalName  eq
+index   member            eq
+index   memberOf          eq
+
+access to *
+          by * none
diff --git a/flakes/private/environment-dummy/vars.yml b/flakes/private/environment-dummy/vars.yml
new file mode 100644 (file)
index 0000000..0967ef4
--- /dev/null
@@ -0,0 +1 @@
+{}
diff --git a/flakes/private/environment/flake.nix b/flakes/private/environment/flake.nix
new file mode 100644 (file)
index 0000000..15c079a
--- /dev/null
@@ -0,0 +1,1135 @@
+{
+  outputs = { self }: {
+    nixosModule = self.nixosModules.environment;
+    nixosModules.environment = { config, lib, name, ... }:
+      with lib;
+      with types;
+      with lists;
+      let
+        ldapOptions = {
+          base = mkOption { description = "Base of the LDAP tree"; type = str; };
+          host = mkOption { description = "Host to access LDAP"; type = str; };
+          root_dn = mkOption { description = "DN of the root user"; type = str; };
+          root_pw = mkOption { description = "Hashed password of the root user"; type = str; };
+          replication_dn = mkOption { description = "DN of the user allowed to replicate the LDAP directory"; type = str; };
+          replication_pw = mkOption { description = "Password of the user allowed to replicate the LDAP directory"; type = str; };
+        };
+        mkLdapOptions = name: more: mkOption {
+          description = "${name} LDAP configuration";
+          type = submodule {
+            options = ldapOptions // {
+              dn = mkOption { description = "DN of the ${name} user"; type = str; };
+              password = mkOption { description = "password of the ${name} user"; type = str; };
+              filter = mkOption { description = "Filter for ${name} users"; type = str; default = ""; };
+            } // more;
+          };
+        };
+        mysqlOptions = {
+          host = mkOption { description = "Host to access Mysql"; type = str; };
+          remoteHost = mkOption { description = "Host to access Mysql from outside"; type = str; };
+          port = mkOption { description = "Port to access Mysql"; type = int; };
+          socket = mkOption { description = "Socket to access Mysql"; type = path; };
+          systemUsers = mkOption {
+            description = "Attrs of user-passwords allowed to access mysql";
+            type = attrsOf str;
+          };
+          pam = mkOption {
+            description = "PAM configuration for mysql";
+            type = submodule {
+              options = {
+                dn = mkOption { description = "DN to connect as to check users"; type = str; };
+                password = mkOption { description = "DN password to connect as to check users"; type = str; };
+                filter = mkOption { description = "filter to match users"; type = str; };
+              };
+            };
+          };
+        };
+        mkMysqlOptions = name: more: mkOption {
+          description = "${name} mysql configuration";
+          type = submodule {
+            options = mysqlOptions // {
+              database = mkOption { description = "${name} database"; type = str; };
+              user = mkOption { description = "${name} user"; type = str; };
+              password = mkOption { description = "mysql password of the ${name} user"; type = str; };
+            } // more;
+          };
+        };
+        psqlOptions = {
+          host = mkOption { description = "Host to access Postgresql"; type = str; };
+          port = mkOption { description = "Port to access Postgresql"; type = str; };
+          socket = mkOption { description = "Socket to access Postgresql"; type = path; };
+          pam = mkOption {
+            description = "PAM configuration for psql";
+            type = submodule {
+              options = {
+                dn = mkOption { description = "DN to connect as to check users"; type = str; };
+                password = mkOption { description = "DN password to connect as to check users"; type = str; };
+                filter = mkOption { description = "filter to match users"; type = str; };
+              };
+            };
+          };
+        };
+        mkPsqlOptions = name: mkOption {
+          description = "${name} psql configuration";
+          type = submodule {
+            options = psqlOptions // {
+              database = mkOption { description = "${name} database"; type = str; };
+              schema = mkOption { description = "${name} schema"; type = nullOr str; default = null; };
+              user = mkOption { description = "${name} user"; type = str; };
+              password = mkOption { description = "psql password of the ${name} user"; type = str; };
+            };
+          };
+        };
+        redisOptions = {
+          host = mkOption { description = "Host to access Redis"; type = str; };
+          port = mkOption { description = "Port to access Redis"; type = str; };
+          socket = mkOption { description = "Socket to access Redis"; type = path; };
+          dbs = mkOption {
+            description = "Attrs of db number. Each number should be unique to avoid collision!";
+            type = attrsOf str;
+          };
+          spiped_key = mkOption {
+            type = str;
+            description = ''
+              Key to use with spiped to make a secure channel to replication
+              '';
+          };
+          predixy = mkOption {
+            description = "Predixy configuration. Unused yet";
+            type = submodule {
+              options = {
+                read = mkOption { type = str; description = "Read password"; };
+              };
+            };
+          };
+        };
+        mkRedisOptions = name: mkOption {
+          description = "${name} redis configuration";
+          type = submodule {
+            options = redisOptions // {
+              db = mkOption { description = "${name} database"; type = str; };
+            };
+          };
+        };
+        smtpOptions = {
+          host = mkOption { description = "Host to access SMTP"; type = str; };
+          port = mkOption { description = "Port to access SMTP"; type = str; };
+        };
+        mkSmtpOptions = name: mkOption {
+          description = "${name} smtp configuration";
+          type = submodule {
+            options = smtpOptions // {
+              email = mkOption { description = "${name} email"; type = str; };
+              password = mkOption { description = "SMTP password of the ${name} user"; type = str; };
+            };
+          };
+        };
+        hostEnv = submodule {
+          options = {
+            fqdn = mkOption {
+              description = "Host FQDN";
+              type = str;
+            };
+            hostKey = mkOption {
+              type = nullOr str;
+              default = null;
+              description = ''
+                ssh host key
+              '';
+            };
+            isVm = mkEnableOption "The host is a vm";
+            users = mkOption {
+              type = unspecified;
+              default = pkgs: [];
+              description = ''
+                Sublist of users from realUsers. Function that takes pkgs as
+                argument and gives an array as a result
+              '';
+            };
+            emails = mkOption {
+              default = [];
+              description = "List of e-mails that the server can be a sender of";
+              type = listOf str;
+            };
+            ldap = mkOption {
+              description = ''
+                LDAP credentials for the host
+              '';
+              type = submodule {
+                options = {
+                  password = mkOption { type = str; description = "Password for the LDAP connection"; };
+                  dn = mkOption { type = str; description = "DN for the LDAP connection"; };
+                };
+              };
+            };
+            mx = mkOption {
+              description = "subdomain and priority for MX server";
+              default = { enable = false; };
+              type = submodule {
+                options = {
+                  enable = mkEnableOption "Enable MX";
+                  subdomain = mkOption { type = nullOr str; description = "Subdomain name (mx-*)"; };
+                  priority = mkOption { type = nullOr int; description = "Priority"; };
+                };
+              };
+            };
+            ips = mkOption {
+              description = ''
+                attrs of ip4/ip6 grouped by section
+              '';
+              type = attrsOf (submodule {
+                options = {
+                  alias = mkOption {
+                    type = nullOr str;
+                    default = null;
+                    description = ''
+                      alias to use in DNS for that group
+                    '';
+                  };
+                  ip4 = mkOption {
+                    type = listOf str;
+                    default = [];
+                    description = ''
+                      ip4 addresses of the host
+                    '';
+                  };
+                  ip6 = mkOption {
+                    type = listOf str;
+                    default = [];
+                    description = ''
+                      ip6 addresses of the host
+                    '';
+                  };
+                };
+              });
+            };
+          };
+        };
+      in
+      {
+        # Necessary for situations where flake gets included multiple times
+        key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
+
+        options.myEnv = {
+          servers = mkOption {
+            description = ''
+              Attrs of servers information in the cluster (not necessarily handled by nixops)
+            '';
+            default = {};
+            type = attrsOf hostEnv;
+          };
+          hetznerCloud = mkOption {
+            description = ''
+              Hetzner Cloud credential information
+            '';
+            type = submodule {
+              options = {
+                authToken = mkOption {
+                  type = str;
+                  description = ''
+                    The API auth token.
+                  '';
+                };
+              };
+            };
+          };
+          hetzner = mkOption {
+            description = ''
+              Hetzner credential information
+            '';
+            type = submodule {
+              options = {
+                user = mkOption { type = str; description = "User"; };
+                pass = mkOption { type = str; description = "Password"; };
+              };
+            };
+          };
+          sshd = mkOption {
+            description = ''
+              sshd service credential information
+            '';
+            type = submodule {
+              options = {
+                rootKeys = mkOption { type = attrsOf str; description = "Keys of root users"; };
+                ldap = mkOption {
+                  description = ''
+                    LDAP credentials for cn=ssh,ou=services,dc=immae,dc=eu dn
+                  '';
+                  type = submodule {
+                    options = {
+                      password = mkOption { description = "Password"; type = str; };
+                    };
+                  };
+                };
+                psql = mkOption {
+                  description = ''
+                    PSQL credentials for immae_auth_read
+                  '';
+                  type = submodule {
+                    options = {
+                      password = mkOption { description = "Password"; type = str; };
+                    };
+                  };
+                };
+              };
+            };
+          };
+          ports = mkOption {
+            description = ''
+              non-standard reserved ports. Must be unique!
+            '';
+            type = attrsOf port;
+            default = {};
+            apply = let
+              noDupl = x: builtins.length (builtins.attrValues x) == builtins.length (unique (builtins.attrValues x));
+            in
+              x: if isAttrs x && noDupl x then x else throw "Non unique values for ports";
+          };
+          httpd = mkOption {
+            description = ''
+              httpd service credential information
+            '';
+            type = submodule {
+              options = {
+                ldap = mkOption {
+                  description = ''
+                    LDAP credentials for cn=httpd,ou=services,dc=immae,dc=eu dn
+                  '';
+                  type = submodule {
+                    options = {
+                      password = mkOption { description = "Password"; type = str; };
+                    };
+                  };
+                };
+              };
+            };
+          };
+          smtp = mkOption {
+            type = submodule { options = smtpOptions; };
+            description = "SMTP configuration";
+          };
+          ldap = mkOption {
+            description = ''
+              LDAP server configuration
+              '';
+            type = submodule {
+              options = ldapOptions;
+            };
+          };
+          databases = mkOption {
+            description = "Databases configuration";
+            type = submodule {
+              options = {
+                mysql = mkOption {
+                  type = submodule { options = mysqlOptions; };
+                  description = "Mysql configuration";
+                };
+                redis = mkOption {
+                  type = submodule { options = redisOptions; };
+                  description = "Redis configuration";
+                };
+                postgresql = mkOption {
+                  type = submodule { options = psqlOptions; };
+                  description = "Postgresql configuration";
+                };
+              };
+            };
+          };
+          jabber = mkOption {
+            description = "Jabber configuration";
+            type = submodule {
+              options = {
+                postfix_user_filter = mkOption { type = str; description = "Postfix filter to get xmpp users"; };
+                ldap = mkLdapOptions "Jabber" {};
+                postgresql = mkPsqlOptions "Jabber";
+              };
+            };
+          };
+          realUsers = mkOption {
+            description = ''
+              Attrset of function taking pkgs as argument.
+              Real users settings, should provide a subattr of users.users.<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";
+        };
+      };
+  };
+}
diff --git a/flakes/private/mail-relay/flake.lock b/flakes/private/mail-relay/flake.lock
new file mode 100644 (file)
index 0000000..bbb2011
--- /dev/null
@@ -0,0 +1,36 @@
+{
+  "nodes": {
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "environment": "environment",
+        "secrets": "secrets"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/private/mail-relay/flake.nix b/flakes/private/mail-relay/flake.nix
new file mode 100644 (file)
index 0000000..639bd06
--- /dev/null
@@ -0,0 +1,58 @@
+{
+  inputs.environment.url = "path:../environment";
+  inputs.secrets.url = "path:../../secrets";
+
+  outputs = { self, environment, secrets }: {
+    nixosModule = self.nixosModules.mail-relay;
+    nixosModules.mail-relay = { lib, pkgs, config, name, ... }:
+      {
+        imports = [
+          environment.nixosModule
+          secrets.nixosModule
+        ];
+        options.myServices.mailRelay.enable = lib.mkEnableOption "enable Mail relay services";
+        config = lib.mkIf config.myServices.mailRelay.enable {
+          secrets.keys."opensmtpd/creds" = {
+            user = "smtpd";
+            group = "smtpd";
+            permissions = "0400";
+            text = ''
+              eldiron    ${name}:${config.hostEnv.ldap.password}
+              '';
+          };
+          users.users.smtpd.extraGroups = [ "keys" ];
+          services.opensmtpd = {
+            enable = true;
+            serverConfiguration = let
+              filter-rewrite-from = pkgs.runCommand "filter-rewrite-from.py" {
+                buildInputs = [ pkgs.python38 ];
+              } ''
+                cp ${./filter-rewrite-from.py} $out
+                patchShebangs $out
+              '';
+            in ''
+              table creds \
+                "${config.secrets.fullPaths."opensmtpd/creds"}"
+              # FIXME: filtering requires 6.6, uncomment following lines when
+              # upgrading
+              # filter "fixfrom" \
+              #   proc-exec "${filter-rewrite-from} ${name}@immae.eu"
+              # listen on socket filter "fixfrom"
+              action "relay-rewrite-from" relay \
+                helo ${config.hostEnv.fqdn} \
+                host smtp+tls://eldiron@eldiron.immae.eu:587 \
+                auth <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 ];
+        };
+      };
+  };
+}
diff --git a/flakes/private/milters/flake.lock b/flakes/private/milters/flake.lock
new file mode 100644 (file)
index 0000000..1a0c138
--- /dev/null
@@ -0,0 +1,186 @@
+{
+  "nodes": {
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_2": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs",
+        "openarc": "openarc_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_2",
+        "myuids": "myuids_2",
+        "nixpkgs": "nixpkgs_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "environment": "environment",
+        "files-watcher": "files-watcher",
+        "openarc": "openarc",
+        "opendmarc": "opendmarc",
+        "secrets": "secrets"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/private/milters/flake.nix b/flakes/private/milters/flake.nix
new file mode 100644 (file)
index 0000000..c4de5b6
--- /dev/null
@@ -0,0 +1,106 @@
+{
+  inputs.secrets.url = "path:../../secrets";
+  inputs.environment.url = "path:../environment";
+  inputs.files-watcher.url = "path:../../files-watcher";
+  inputs.opendmarc.url = "path:../../opendmarc";
+  inputs.openarc.url = "path:../../openarc";
+  outputs = { self, secrets, environment, opendmarc, openarc, files-watcher }: {
+    nixosModule = self.nixosModules.milters;
+    nixosModules.milters = { lib, pkgs, config, nodes, ... }:
+      {
+        imports = [
+          secrets.nixosModule
+          environment.nixosModule
+          files-watcher.nixosModule
+          opendmarc.nixosModule
+          openarc.nixosModule
+        ];
+        options.myServices.mail.milters.enable = lib.mkEnableOption "enable Mail milters";
+        options.myServices.mail.milters.sockets = lib.mkOption {
+          type = lib.types.attrsOf lib.types.path;
+          default = {
+            opendkim = "/run/opendkim/opendkim.sock";
+            opendmarc = config.services.opendmarc.socket;
+            openarc = config.services.openarc.socket;
+          };
+          readOnly = true;
+          description = ''
+            milters sockets
+            '';
+        };
+        config = lib.mkIf config.myServices.mail.milters.enable {
+          secrets.keys = {
+            "opendkim" = {
+              isDir = true;
+              user = config.services.opendkim.user;
+              group = config.services.opendkim.group;
+              permissions = "0550";
+            };
+            "opendkim/eldiron.private" = {
+              user = config.services.opendkim.user;
+              group = config.services.opendkim.group;
+              permissions = "0400";
+              text = config.myEnv.mail.dkim.eldiron.private;
+            };
+          };
+          users.users."${config.services.opendkim.user}".extraGroups = [ "keys" ];
+          services.opendkim = {
+            enable = true;
+            socket = "local:${config.myServices.mail.milters.sockets.opendkim}";
+            domains =
+              let
+                getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) p.emailPolicies;
+                bydomain = builtins.mapAttrs (n: getDomains) nodes.eldiron.config.myServices.dns.zones;
+                domains' = lib.flatten (builtins.attrValues bydomain);
+              in
+                builtins.concatStringsSep "," domains';
+            keyPath = config.secrets.fullPaths."opendkim";
+            selector = "eldiron";
+            configFile = pkgs.writeText "opendkim.conf" ''
+              SubDomains        yes
+              UMask             002
+              AlwaysAddARHeader yes
+              '';
+            group = config.services.postfix.group;
+          };
+          systemd.services.opendkim.serviceConfig.Slice = "mail.slice";
+          systemd.services.opendkim.preStart = lib.mkBefore ''
+            # Skip the prestart script as keys are handled in secrets
+            exit 0
+            '';
+          services.filesWatcher.opendkim = {
+            restart = true;
+            paths = [
+              config.secrets.fullPaths."opendkim/eldiron.private"
+            ];
+          };
+
+          systemd.services.milter_verify_from = {
+            description  = "Verify from milter";
+            after = [ "network.target" ];
+            wantedBy = [ "multi-user.target" ];
+
+            serviceConfig = {
+              Slice = "mail.slice";
+              User = "postfix";
+              Group = "postfix";
+              ExecStart = let
+                pymilter = with pkgs.python38Packages; buildPythonPackage rec {
+                  pname = "pymilter";
+                  version = "1.0.4";
+                  src = fetchPypi {
+                    inherit pname version;
+                    sha256 = "1bpcvq7d72q0zi7c8h5knhasywwz9gxc23n9fxmw874n5k8hsn7k";
+                  };
+                  doCheck = false;
+                  buildInputs = [ pkgs.libmilter ];
+                };
+                python = pkgs.python38.withPackages (p: [ pymilter ]);
+              in "${python}/bin/python ${./verify_from.py} -s /run/milter_verify_from/verify_from.sock";
+              RuntimeDirectory = "milter_verify_from";
+            };
+          };
+        };
+      };
+  };
+}
diff --git a/flakes/private/monitoring/flake.lock b/flakes/private/monitoring/flake.lock
new file mode 100644 (file)
index 0000000..2e156fb
--- /dev/null
@@ -0,0 +1,67 @@
+{
+  "nodes": {
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "environment": "environment",
+        "naemon": "naemon",
+        "nixpkgs-lib": "nixpkgs-lib",
+        "secrets": "secrets"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/private/monitoring/flake.nix b/flakes/private/monitoring/flake.nix
new file mode 100644 (file)
index 0000000..b7c3997
--- /dev/null
@@ -0,0 +1,267 @@
+{
+  inputs = {
+    environment.url = "path:../environment";
+    secrets.url = "path:../../secrets";
+    naemon.url = "path:../../naemon";
+    nixpkgs-lib.url = "github:NixOS/nixpkgs?dir=lib";
+  };
+  outputs = { self, environment, nixpkgs-lib, secrets, naemon }: {
+    nagios-cli-config = ./nagios-cli.cfg;
+    lib = rec {
+      expandedObject = kind: object: objects:
+        if object ? "use"
+        then expandedObject kind objects.templates.${kind}.${object.use} objects // object
+        else object;
+
+      objectsCommon = import ./objects_common.nix;
+      toObjects = import ./to_objects.nix { inherit (nixpkgs-lib) lib; };
+
+      toMasterPassiveObject = svcTemplate: freshnessThresholdMultiplier: objects:
+        {
+          service = with nixpkgs-lib.lib; map (s:
+            {
+              host_name = (expandedObject "service" s objects).host_name;
+              use = svcTemplate;
+              retry_interval = "1";
+              freshness_threshold = let
+                fs = expandedObject "service" s objects;
+              in if builtins.isInt fs.check_interval
+                then builtins.ceil (freshnessThresholdMultiplier * 60 * fs.check_interval)
+                else fs.check_interval;
+            }
+            // filterAttrs (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_") s
+            // mapAttrs'
+                (n: nameValuePair (removePrefix "__passive_" n))
+                (filterAttrs (k: _: hasPrefix "__passive_" k) s)
+          ) objects.service;
+          host = objects.host;
+        };
+
+      emailCheck = allCfg: host: hostFQDN: let
+        cfg = allCfg."${host}";
+        reverseTargets = builtins.attrNames (nixpkgs-lib.lib.filterAttrs (k: v: builtins.elem host v.targets) allCfg);
+        to_email = cfg': host':
+          let sep = if nixpkgs-lib.lib.hasInfix "+" cfg'.mail_address then "_" else "+";
+          in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}";
+        mails_to_send = builtins.concatStringsSep "," (map (n: to_email allCfg."${n}" host) cfg.targets);
+        mails_to_receive = builtins.concatStringsSep "," (map (n: "${to_email cfg n}:${n}") reverseTargets);
+        command = if cfg.local
+        then
+          [ "check_emails_local" "/var/lib/naemon/checks/email" mails_to_send mails_to_receive ]
+        else
+          [ "check_emails" cfg.login cfg.port mails_to_send mails_to_receive ];
+      in
+        {
+          service_description = "${hostFQDN} email service is active";
+          use = "mail-service";
+          host_name = hostFQDN;
+          servicegroups = "webstatus-email";
+          check_command = command;
+        };
+    };
+    nixosModule = self.nixosModules.monitoring;
+    nixosModules.monitoring = { config, pkgs, lib, ... }:
+      let
+        cfg = config.myServices.monitoring;
+        allPluginsConfig = import ./myplugins.nix {
+          inherit pkgs lib config;
+          sudo = "/run/wrappers/bin/sudo";
+        };
+        mypluginsConfig = lib.mapAttrs (n: v:
+          if builtins.isFunction v
+          then v (cfg.pluginsArgs."${n}" or {})
+          else v
+        ) (lib.getAttrs cfg.activatedPlugins allPluginsConfig);
+        myplugins = let
+          mypluginsChunk = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: v.chunk or "") mypluginsConfig);
+        in pkgs.runCommand "buildplugins" {
+          buildInputs = [ pkgs.makeWrapper pkgs.perl ];
+        } ''
+          mkdir $out
+          ${mypluginsChunk}
+          '';
+        objectsModule = with lib.types; submodule {
+          options = {
+            command = lib.mkOption {
+              type = attrsOf str;
+              default = {};
+              description = "Command definitions";
+            };
+
+            host = lib.mkOption {
+              type = attrsOf (attrsOf str);
+              default = {};
+              description = "Host definitions";
+            };
+            hostgroup = lib.mkOption {
+              type = attrsOf (attrsOf str);
+              default = {};
+              description = "Host group definitions";
+            };
+            hostdependency = lib.mkOption {
+              type = listOf (attrsOf str);
+              default = [];
+              description = "Host dependency definitions";
+            };
+
+            service = lib.mkOption {
+              type = listOf (attrsOf (oneOf [ str (listOf str) int ]));
+              # str -> string
+              # listOf str -> list to be concatenated with "!"
+              # int -> toString
+              default = [];
+              description = "Service definitions";
+            };
+            servicegroup = lib.mkOption {
+              type = attrsOf (attrsOf str);
+              default = {};
+              description = "Service group definitions";
+            };
+            servicedependency = lib.mkOption {
+              type = listOf (attrsOf str);
+              default = [];
+              description = "Service dependency definitions";
+            };
+
+            contact = lib.mkOption {
+              type = attrsOf (attrsOf str);
+              default = {};
+              description = "Contact definitions";
+            };
+            contactgroup = lib.mkOption {
+              type = attrsOf (attrsOf str);
+              default = {};
+              description = "Contact group definitions";
+            };
+
+            timeperiod = lib.mkOption {
+              type = attrsOf (attrsOf str);
+              default = {};
+              description = "Time period definitions";
+            };
+
+            templates = lib.mkOption {
+              description = "Template definitions";
+              default = {};
+              type = submodule {
+                options = {
+                  service = lib.mkOption { type = attrsOf (attrsOf (either str int)); default = {}; };
+                  contact = lib.mkOption { type = attrsOf (attrsOf str); default = {}; };
+                  host = lib.mkOption { type = attrsOf (attrsOf str); default = {}; };
+                };
+              };
+            };
+          };
+        };
+      in
+      {
+        options = {
+          myServices.monitoring = {
+            enable = lib.mkOption {
+              type = lib.types.bool;
+              default = false;
+              description = ''
+                Whether to enable monitoring.
+              '';
+            };
+            master = lib.mkOption {
+              type = lib.types.bool;
+              default = false;
+              description = ''
+                This instance is the master instance
+              '';
+            };
+            pluginsArgs = lib.mkOption {
+              default = {};
+              description = "Arguments to pass to the naemon plugin configuration";
+              type = lib.types.attrsOf (lib.types.attrsOf lib.types.unspecified);
+            };
+            activatedPlugins = lib.mkOption {
+              default = [];
+              description = "List of naemon plugins to activate";
+              type = lib.types.listOf (lib.types.enum (builtins.attrNames allPluginsConfig));
+            };
+            fromMasterActivatedPlugins = lib.mkOption {
+              default = [];
+              description = "List of naemon plugins to activate from master";
+              type = lib.types.listOf (lib.types.str);
+            };
+            resources = lib.mkOption {
+              default = {};
+              description = "List of additionnal resources elements";
+              type = lib.types.attrsOf (lib.types.str);
+            };
+            objects = lib.mkOption {
+              default = {};
+              description = "Object definitions";
+              type = objectsModule;
+            };
+            fromMasterObjects = lib.mkOption {
+              default = {};
+              description = "Object definitions of checks that should be executed from master";
+              type = objectsModule;
+            };
+          };
+        };
+
+        imports = [
+          environment.nixosModule
+          secrets.nixosModule
+          naemon.nixosModule
+        ];
+        config = lib.mkIf cfg.enable {
+          myServices.monitoring.objects.command =
+            lib.foldr (v: o: o // (v.commands or {})) {} (builtins.attrValues mypluginsConfig);
+
+          security.sudo.extraRules = let
+            pluginsSudo = lib.lists.remove null (lib.mapAttrsToList (k: v:
+              if (v ? sudo)
+              then ({ users = [ "naemon" ]; } // (v.sudo myplugins))
+              else null) mypluginsConfig);
+          in pluginsSudo;
+
+          environment.etc.cnagios.source = "${pkgs.cnagios}/share/doc/cnagios";
+          environment.systemPackages = let
+            nagios-cli = pkgs.writeScriptBin "nagios-cli" ''
+              #!${pkgs.stdenv.shell}
+              sudo -u naemon ${pkgs.nagios-cli}/bin/nagios-cli -c ${self.nagios-cli-config}
+              '';
+          in [
+            pkgs.cnagios
+            nagios-cli
+          ];
+          secrets.keys = {
+            "naemon/id_rsa" = {
+              user = "naemon";
+              group = "naemon";
+              permissions = "0400";
+              text = config.myEnv.monitoring.ssh_secret_key;
+            };
+            "naemon/resources.cfg".keyDependencies = [ myplugins ];
+          };
+          services.naemon = {
+            enable = true;
+            extraConfig = ''
+              use_syslog=1
+              log_initial_states=1
+              date_format=iso8601
+              admin_email=${config.myEnv.monitoring.email}
+            '' + lib.optionalString (!cfg.master) ''
+              obsess_over_services=1
+              ocsp_command=notify-master
+            '';
+            extraResource = let
+              resources = [cfg.resources or {}] ++ (lib.mapAttrsToList (k: v: v.resources or {}) mypluginsConfig);
+              joined = lib.zipAttrsWith (n: v: if builtins.length (lib.unique v) == 1 then builtins.head v else abort "Non-unique resources names") resources;
+              joinedStr = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "$" + "${k}$=${v}") joined);
+            in ''
+              $USER2$=${myplugins}
+              ${joinedStr}
+            '';
+            objectDefs =
+              self.lib.toObjects cfg.objects;
+          };
+        };
+      };
+  };
+}
similarity index 88%
rename from modules/private/monitoring/myplugins.nix
rename to flakes/private/monitoring/myplugins.nix
index e59ddc402f1793365feb14e504f3b8c804f4d6f0..35730bb5c88d610e64197436b1afa6e955de17aa 100644 (file)
@@ -21,31 +21,24 @@ in
   };
   notify-primary = {
     resources = {
   };
   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";
     };
     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 = ''
     };
     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_email --prefix PATH : ${lib.makeBinPath [
         pkgs.mailutils
       ]}
-      wrapProgram $out/notify_by_slack --prefix PATH : ${lib.makeBinPath [
-        pkgs.curl pkgs.jq
-      ]}
-      wrapProgram $out/notify_eban_url --prefix PATH : ${lib.makeBinPath [
-        pkgs.curl
+      wrapProgram $out/notify_by_apprise --prefix PATH : ${lib.makeBinPath [
+        pkgs.apprise
       ]}
     '';
   };
       ]}
     '';
   };
@@ -79,6 +72,28 @@ in
       check_external_dns = "$USER1$/check_dns -H $ARG2$ -s $ARG1$ $ARG3$";
     };
   };
       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";
   emails = {
     resources = {
       USER203 = config.secrets.fullPaths."naemon/id_rsa";
@@ -120,7 +135,7 @@ in
       cp ${./plugins}/check_eriomem $out/
       patchShebangs $out/check_eriomem
       wrapProgram $out/check_eriomem --prefix PATH : ${lib.makeBinPath [
       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
       ]}
       cp ${./plugins}/check_backup_age $out/check_backup_eriomem_age
       patchShebangs $out/check_backup_eriomem_age
@@ -178,6 +193,8 @@ in
     commands = {
       check_http = "$USER1$/check_http --sni -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
       check_https = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
     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$\"";
       check_https_auth = "$USER1$/check_http --sni --ssl -a \"$USER202$\" -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
       check_https_certificate = "$USER1$/check_http --sni --ssl -H \"$ARG1$\" -C 21,15";
       check_https_code = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -e \"$ARG3$\" -r \"$ARG4$\"";
@@ -240,7 +257,7 @@ in
       cp ${./plugins}/check_mem.sh $out/
       patchShebangs $out/check_mem.sh
       wrapProgram $out/check_mem.sh --prefix PATH : ${lib.makeBinPath [
       cp ${./plugins}/check_mem.sh $out/
       patchShebangs $out/check_mem.sh
       wrapProgram $out/check_mem.sh --prefix PATH : ${lib.makeBinPath [
-        pkgs.gnugrep pkgs.gawk pkgs.procps-ng
+        pkgs.gnugrep pkgs.gawk pkgs.procps
       ]}
     '';
   };
       ]}
     '';
   };
@@ -303,31 +320,25 @@ in
       cp ${./plugins}/check_ovh_sms $out/
       patchShebangs $out/check_ovh_sms
       wrapProgram $out/check_ovh_sms --prefix PATH : ${lib.makeBinPath [
       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$\"";
     };
     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 [
       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 [
       ]}
       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
       ]}
     '';
 
       ]}
     '';
 
similarity index 82%
rename from modules/private/monitoring/objects_common.nix
rename to flakes/private/monitoring/objects_common.nix
index 7c9f6420e13fa1edfebff3239e08fd28678c0b02..1da776431ed64bdc9be934fca19d96fcac858b67 100644 (file)
@@ -9,23 +9,9 @@
 , loadAlert ? "1.0"
 , load5Alert ? loadAlert
 , load15Alert ? load5Alert
 , loadAlert ? "1.0"
 , load5Alert ? loadAlert
 , load15Alert ? load5Alert
-, mdadm
 , master
 , 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}" = {
 {
   host = {
     "${hostFQDN}" = {
@@ -39,13 +25,12 @@ in
   };
   service = [
     {
   };
   service = [
     {
-      passiveInfo = defaultPassiveInfo;
       service_description = "Size on root partition";
       use = "local-service";
       check_command = ["check_local_disk" "20%" "10%" "/"];
       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 = [
       service_description = "Total number of process";
       use = "local-service";
       check_command = [
@@ -54,12 +39,12 @@ in
         processAlert
         "RSZDT"
       ];
         processAlert
         "RSZDT"
       ];
+      __passive_servicegroups = "webstatus-resources";
     }
     {
     }
     {
-      passiveInfo = defaultPassiveInfo;
       service_description = "Network bandwidth";
       use = "local-service";
       service_description = "Network bandwidth";
       use = "local-service";
-      check_interval = "2";
+      check_interval = 2;
       max_check_attempts = "20";
       retry_interval = "2";
       check_command = [
       max_check_attempts = "20";
       retry_interval = "2";
       check_command = [
@@ -68,9 +53,9 @@ in
         "20480" # kb/s
         "51200" # kb/s
       ];
         "20480" # kb/s
         "51200" # kb/s
       ];
+      __passive_servicegroups = "webstatus-resources";
     }
     {
     }
     {
-      passiveInfo = defaultPassiveInfo;
       service_description = "Average load";
       use = "local-service";
       check_command = [
       service_description = "Average load";
       use = "local-service";
       check_command = [
@@ -78,44 +63,33 @@ in
         "${loadWarn},${load5Warn},${load15Warn}"
         "${loadAlert},${load5Alert},${load15Alert}"
       ];
         "${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"];
       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"];
       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"];
       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_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";
     check_smtp = "$USER1$/check_smtp -H $HOSTADDRESS$ -p 25 -S -D 21,15";
 
     check_host_alive = "$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5";
@@ -157,7 +131,7 @@ in
       generic-service = {
         active_checks_enabled = "1";
         check_freshness = "0";
       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";
         check_period = "24x7";
         contact_groups = "admins";
         event_handler_enabled = "1";
@@ -179,38 +153,38 @@ in
       local-service = {
         use = "generic-service";
         host_name = hostFQDN;
       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";
         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";
         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";
         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";
         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";
         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";
         notification_interval = "120";
         max_check_attempts = "5";
         retry_interval = "5";
similarity index 95%
rename from modules/private/monitoring/plugins/check_bandwidth
rename to flakes/private/monitoring/plugins/check_bandwidth
index 53c5d85186d4c252df9bea0a80584dfa99bd8bea..21d01f5aec193c668a6e864a16855df981a8f3e0 100755 (executable)
@@ -110,8 +110,7 @@ avg_tx=$(bc <<< "scale=2;$sum_tx/$counter")
 
 
 if [ $(bc <<< "$avg_rx > $critical || $avg_tx > $critical") -eq 1 ]; then
 
 
 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;"
        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;"
similarity index 56%
rename from modules/private/monitoring/plugins/check_mem.sh
rename to flakes/private/monitoring/plugins/check_mem.sh
index cc97ae291d2dd0e1a5c6e8f6050c2043c2decb93..3a29040e98df8ff3aa3f4672116e0bf10c5f0158 100755 (executable)
@@ -1,21 +1,23 @@
-#!/bin/bash
+#!/usr/bin/env bash
 
 if [ "$1" = "-w" ] && [ "$2" -gt "0" ] && [ "$3" = "-c" ] && [ "$4" -gt "0" ]; then
 
 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}'`
         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}'`
         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
         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
                 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
                 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. 
                 exit 0
         fi
 else # If inputs are not as expected, print help. 
diff --git a/flakes/private/monitoring/plugins/notify_by_apprise b/flakes/private/monitoring/plugins/notify_by_apprise
new file mode 100755 (executable)
index 0000000..82bc5a3
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+
+APPRISE_USERNAME="Naemon"
+APPRISE_USERICON="https://assets.immae.eu/monitoring.png"
+APPRISE_URLS=$(echo "$2" | sed -e "s/{username}/$APPRISE_USERNAME/g" -e "s@{image_url}@$APPRISE_USERICON@g")
+
+if [ "$SERVICESTATE" = "CRITICAL" ]; then
+  ICON="❗"
+elif [ "$SERVICESTATE" = "WARNING" ]; then
+  ICON="⚠️:"
+elif [ "$SERVICESTATE" = "OK" ]; then
+  ICON="✅"
+elif [ "$SERVICESTATE" = "UNKNOWN" ]; then
+  ICON="❓"
+elif [ "$HOSTSTATE" = "UP" ]; then
+  ICON="✅"
+elif [ "$HOSTSTATE" = "DOWN" ]; then
+  ICON="❗"
+elif [ "$HOSTSTATE" = "UNKNOWN" ]; then
+  ICON="❓"
+elif [ "$HOSTSTATE" = "UNREACHABLE" ]; then
+  ICON="❓"
+else
+  ICON="◻"
+fi
+
+if [ "$1" = "host" ]; then
+  apprise --title "${ICON} ${NOTIFICATIONTYPE} ${HOST} is ${HOSTSTATE}" --body "$HOSTOUTPUT" $APPRISE_URLS
+else
+  apprise --title "${ICON} ${NOTIFICATIONTYPE} ${SERVICEDESC} on ${HOST} is ${SERVICESTATE}" --body "$SERVICEOUTPUT" $APPRISE_URLS
+fi
similarity index 88%
rename from modules/private/monitoring/to_objects.nix
rename to flakes/private/monitoring/to_objects.nix
index 12721d2ff6015a5bc08e51c687c494f9befcb530..57a71ade82a3414f537e72ffbe1f3d3baa3419df 100644 (file)
@@ -11,13 +11,13 @@ let
   toStr = k: v:
     if k == "check_command" && builtins.isList v
     then builtins.concatStringsSep "!" v
   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}"
 
   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);
     }
     '';
   toServices = services: builtins.concatStringsSep "\n" (map toService services);
@@ -53,7 +53,7 @@ let
       ${pad 30 "name"}   ${k}
       ${pad 30 "register"}   0
     ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
       ${pad 30 "name"}   ${k}
       ${pad 30 "register"}   0
     ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
-      "  ${pad 30 kk}   ${vv}"
+      "  ${pad 30 kk}   ${builtins.toString vv}"
     ) v)}
     }
     '';
     ) v)}
     }
     '';
@@ -69,9 +69,9 @@ let
       then toTemplates v
     else if builtins.elem keyname ["hostgroup" "host" "contactgroup" "contact" "timeperiod" "servicegroup"]
       then toOthers keyname 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
       then toOthersArray keyname v
-    else "";
+    else builtins.trace ("Warning: unknown object type " + keyname) "";
   toObjects = v: builtins.concatStringsSep "\n" (mapAttrsToList toObjects' v);
 in
   toObjects
   toObjects = v: builtins.concatStringsSep "\n" (mapAttrsToList toObjects' v);
 in
   toObjects
index be75993707e9594f764b2873b32c01e8fcf1271f..60b0fdf03946f674d937d3f8690be8c93e99e550 100644 (file)
@@ -2,7 +2,8 @@
   "nodes": {
     "files-watcher": {
       "locked": {
   "nodes": {
     "files-watcher": {
       "locked": {
-        "narHash": "sha256-6urOJuzXsu4HJHyVmrZHd40SMzzTeHiOiDOM40q53Y0=",
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
         "path": "../../files-watcher",
         "type": "path"
       },
         "path": "../../files-watcher",
         "type": "path"
       },
         "type": "github"
       }
     },
         "type": "github"
       }
     },
-    "my-lib": {
-      "inputs": {
-        "nixpkgs": "nixpkgs"
-      },
+    "myuids": {
       "locked": {
       "locked": {
-        "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=",
-        "path": "../../lib",
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
         "type": "path"
       },
       "original": {
         "type": "path"
       },
       "original": {
-        "path": "../../lib",
+        "path": "../myuids",
         "type": "path"
       }
     },
         "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": {
     "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=",
       "locked": {
         "lastModified": 1597943282,
         "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
       "inputs": {
         "flake-utils": "flake-utils",
         "myuids": "myuids",
       "inputs": {
         "flake-utils": "flake-utils",
         "myuids": "myuids",
-        "nixpkgs": "nixpkgs_2",
+        "nixpkgs": "nixpkgs",
         "openarc": "openarc_2"
       },
       "locked": {
         "openarc": "openarc_2"
       },
       "locked": {
-        "narHash": "sha256-ilrfNs6jpi1OceDE3y1atkovECx6PKNWubwLc0Sjx+s=",
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
         "path": "../../openarc",
         "type": "path"
       },
         "path": "../../openarc",
         "type": "path"
       },
     "root": {
       "inputs": {
         "files-watcher": "files-watcher",
     "root": {
       "inputs": {
         "files-watcher": "files-watcher",
-        "my-lib": "my-lib",
-        "nix-lib": "nix-lib",
         "openarc": "openarc",
         "secrets": "secrets"
       }
     },
     "secrets": {
       "locked": {
         "openarc": "openarc",
         "secrets": "secrets"
       }
     },
     "secrets": {
       "locked": {
-        "narHash": "sha256-w3u1bMEJHCg9SqErJ5Qi0sTX2xx7mk+HrHZXzpjQd1w=",
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
         "path": "../../secrets",
         "type": "path"
       },
         "path": "../../secrets",
         "type": "path"
       },
index b4ab4c8d410b39d0a871355248cf0b0e073b9ccd..56c3a1ae7b6ed64aec9a37bdd96e52e67685df4d 100644 (file)
@@ -1,63 +1,47 @@
 {
 {
-  inputs.openarc = {
-    path = "../../openarc";
-    type = "path";
-  };
-  inputs.secrets = {
-    path = "../../secrets";
-    type = "path";
-  };
-  inputs.files-watcher = {
-    path = "../../files-watcher";
-    type = "path";
-  };
-  inputs.my-lib = {
-    path = "../../lib";
-    type = "path";
-  };
-  inputs.nix-lib.url = "github:NixOS/nixpkgs";
+  inputs.openarc.url = "path:../../openarc";
+  inputs.secrets.url = "path:../../secrets";
+  inputs.files-watcher.url = "path:../../files-watcher";
 
   description = "Private configuration for openarc";
 
   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; };
+    };
+  };
 }
 }
index f40e1a9632a200895fe910455e1721aa3bad200e..fdd4d64831c770d21691d5c6e86198dfdacdcf3d 100644 (file)
@@ -1,8 +1,21 @@
 {
   "nodes": {
 {
   "nodes": {
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
     "files-watcher": {
       "locked": {
     "files-watcher": {
       "locked": {
-        "narHash": "sha256-6urOJuzXsu4HJHyVmrZHd40SMzzTeHiOiDOM40q53Y0=",
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
         "path": "../../files-watcher",
         "type": "path"
       },
         "path": "../../files-watcher",
         "type": "path"
       },
         "type": "github"
       }
     },
         "type": "github"
       }
     },
-    "my-lib": {
-      "inputs": {
-        "nixpkgs": "nixpkgs"
-      },
+    "myuids": {
       "locked": {
       "locked": {
-        "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=",
-        "path": "../../lib",
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
         "type": "path"
       },
       "original": {
         "type": "path"
       },
       "original": {
-        "path": "../../lib",
+        "path": "../myuids",
         "type": "path"
       }
     },
         "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": {
     "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=",
       "locked": {
         "lastModified": 1597943282,
         "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
       "inputs": {
         "flake-utils": "flake-utils",
         "myuids": "myuids",
       "inputs": {
         "flake-utils": "flake-utils",
         "myuids": "myuids",
-        "nixpkgs": "nixpkgs_2"
+        "nixpkgs": "nixpkgs"
       },
       "locked": {
       },
       "locked": {
-        "narHash": "sha256-7jup/d3+WXXWsNMB7Sp5Py4rJQV30Z5+PJITBISbQ9o=",
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
         "path": "../../opendmarc",
         "type": "path"
       },
         "path": "../../opendmarc",
         "type": "path"
       },
     },
     "root": {
       "inputs": {
     },
     "root": {
       "inputs": {
+        "environment": "environment",
         "files-watcher": "files-watcher",
         "files-watcher": "files-watcher",
-        "my-lib": "my-lib",
-        "nix-lib": "nix-lib",
         "opendmarc": "opendmarc",
         "secrets": "secrets"
       }
     },
     "secrets": {
       "locked": {
         "opendmarc": "opendmarc",
         "secrets": "secrets"
       }
     },
     "secrets": {
       "locked": {
-        "narHash": "sha256-w3u1bMEJHCg9SqErJ5Qi0sTX2xx7mk+HrHZXzpjQd1w=",
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
         "path": "../../secrets",
         "type": "path"
       },
         "path": "../../secrets",
         "type": "path"
       },
index e2575e7f56d7089b5798fc6e530415637d4b95c4..7e9e8eb4d5ea117eee2710c0ba94e502ea67af6b 100644 (file)
@@ -1,77 +1,62 @@
 {
 {
-  inputs.opendmarc = {
-    path = "../../opendmarc";
-    type = "path";
-  };
-  inputs.secrets = {
-    path = "../../secrets";
-    type = "path";
-  };
-  inputs.files-watcher = {
-    path = "../../files-watcher";
-    type = "path";
-  };
-  inputs.my-lib = {
-    path = "../../lib";
-    type = "path";
-  };
-  inputs.nix-lib.url = "github:NixOS/nixpkgs";
+  inputs.opendmarc.url = "path:../../opendmarc";
+  inputs.environment.url = "path:../environment";
+  inputs.secrets.url = "path:../../secrets";
+  inputs.files-watcher.url = "path:../../files-watcher";
 
   description = "Private configuration for opendmarc";
 
   description = "Private configuration for opendmarc";
-  outputs = { self, nix-lib, opendmarc, my-lib, files-watcher, secrets }:
-    let
-      cfg = name': { config, lib, pkgs, name, ... }: {
-        imports = [
-          (my-lib.lib.withNarKey files-watcher "nixosModule")
-          (my-lib.lib.withNarKey opendmarc "nixosModule")
-          (my-lib.lib.withNarKey secrets "nixosModule")
-        ];
-        config = lib.mkIf (name == name') {
-          users.users."${config.services.opendmarc.user}".extraGroups = [ "keys" ];
-          systemd.services.opendmarc.serviceConfig.Slice = "mail.slice";
-          services.opendmarc = {
-            enable = true;
-            socket = "/run/opendmarc/opendmarc.sock";
-            configFile = pkgs.writeText "opendmarc.conf" ''
-              AuthservID                  HOSTNAME
-              FailureReports              false
-              FailureReportsBcc           postmaster@immae.eu
-              FailureReportsOnNone        true
-              FailureReportsSentBy        postmaster@immae.eu
-              IgnoreAuthenticatedClients  true
-              IgnoreHosts                 ${config.secrets.fullPaths."opendmarc/ignore.hosts"}
-              SoftwareHeader              true
-              SPFIgnoreResults            true
-              SPFSelfValidate             true
-              UMask                       002
-              '';
-            group = config.services.postfix.group;
-          };
-          services.filesWatcher.opendmarc = {
-            restart = true;
-            paths = [
-              config.secrets.fullPaths."opendmarc/ignore.hosts"
-            ];
-          };
-          secrets.keys = {
-            "opendmarc/ignore.hosts" = {
-              user = config.services.opendmarc.user;
-              group = config.services.opendmarc.group;
-              permissions = "0400";
-              text = let
-                mxes = lib.attrsets.filterAttrs
-                  (n: v: v.mx.enable)
-                  config.myEnv.servers;
-                in
-                  builtins.concatStringsSep "\n" ([
-                    config.myEnv.mail.dmarc.ignore_hosts
-                  ] ++ lib.mapAttrsToList (n: v: v.fqdn) mxes);
-            };
+  outputs = { self, environment, opendmarc, files-watcher, secrets }: {
+    nixosModule = self.nixosModules.opendmarc;
+    nixosModules.opendmarc = { config, lib, pkgs, ... }: {
+      imports = [
+        environment.nixosModule
+        files-watcher.nixosModule
+        opendmarc.nixosModule
+        secrets.nixosModule
+      ];
+      config = {
+        users.users."${config.services.opendmarc.user}".extraGroups = [ "keys" ];
+        systemd.services.opendmarc.serviceConfig.Slice = "mail.slice";
+        services.opendmarc = {
+          enable = true;
+          socket = "/run/opendmarc/opendmarc.sock";
+          configFile = pkgs.writeText "opendmarc.conf" ''
+            AuthservID                  HOSTNAME
+            FailureReports              false
+            FailureReportsBcc           postmaster@immae.eu
+            FailureReportsOnNone        true
+            FailureReportsSentBy        postmaster@immae.eu
+            IgnoreAuthenticatedClients  true
+            IgnoreHosts                 ${config.secrets.fullPaths."opendmarc/ignore.hosts"}
+            SoftwareHeader              true
+            SPFIgnoreResults            true
+            SPFSelfValidate             true
+            UMask                       002
+            '';
+          group = config.services.postfix.group;
+        };
+        services.filesWatcher.opendmarc = {
+          restart = true;
+          paths = [
+            config.secrets.fullPaths."opendmarc/ignore.hosts"
+          ];
+        };
+        secrets.keys = {
+          "opendmarc/ignore.hosts" = {
+            user = config.services.opendmarc.user;
+            group = config.services.opendmarc.group;
+            permissions = "0400";
+            text = let
+              mxes = lib.attrsets.filterAttrs
+                (n: v: v.mx.enable)
+                config.myEnv.servers;
+              in
+                builtins.concatStringsSep "\n" ([
+                  config.myEnv.mail.dmarc.ignore_hosts
+                ] ++ lib.mapAttrsToList (n: v: v.fqdn) mxes);
           };
         };
       };
           };
         };
       };
-    in
-      opendmarc.outputs //
-      { nixosModules = opendmarc.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron" "backup-2"] cfg; };
+    };
+  };
 }
 }
-
diff --git a/flakes/private/openldap/flake.nix b/flakes/private/openldap/flake.nix
new file mode 100644 (file)
index 0000000..130312d
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  outputs = { self }: {
+    immae-schema = ./immae.schema;
+    immae-ldif = ./immae.ldif;
+  };
+}
diff --git a/flakes/private/openldap/immae.ldif b/flakes/private/openldap/immae.ldif
new file mode 100644 (file)
index 0000000..f1b4cb7
--- /dev/null
@@ -0,0 +1,83 @@
+# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
+# CRC32 22130f5f
+dn: cn=immae,cn=schema,cn=config
+objectClass: olcSchemaConfig
+cn: immae
+olcObjectIdentifier: {0}Immaeroot 1.3.6.1.4.1.50071
+olcObjectIdentifier: {1}Immae Immaeroot:2
+olcObjectIdentifier: {2}ImmaeattributeType Immae:3
+olcObjectIdentifier: {3}ImmaeobjectClass Immae:4
+olcAttributeTypes: {0}( ImmaeattributeType:1 NAME 'immaeTtrssLogin' DESC 'lo
+ gin for TTRSS' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SY
+ NTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
+olcAttributeTypes: {1}( ImmaeattributeType:2 NAME 'immaeFtpDirectory' DESC '
+ home directory for ftp' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.
+ 115.121.1.26 )
+olcAttributeTypes: {2}( ImmaeattributeType:3 NAME 'immaeFtpUid' DESC 'user i
+ d for ftp' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
+olcAttributeTypes: {3}( ImmaeattributeType:4 NAME 'immaeFtpGid' DESC 'group 
+ id for ftp' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
+olcAttributeTypes: {4}( ImmaeattributeType:5 NAME 'immaeSshKey' DESC 'OpenSS
+ H Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.4
+ 0 )
+olcAttributeTypes: {5}( ImmaeattributeType:6 NAME 'immaeAccessDn' EQUALITY d
+ istinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
+olcAttributeTypes: {6}( ImmaeattributeType:17 NAME 'immaeAccessWriteDn' EQUA
+ LITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
+olcAttributeTypes: {7}( ImmaeattributeType:18 NAME 'immaeAccessReadSubtree' 
+ EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
+olcAttributeTypes: {8}( ImmaeattributeType:7 NAME 'immaeXmppUid' DESC 'user 
+ part for Xmpp' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SY
+ NTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
+olcAttributeTypes: {9}( ImmaeattributeType:8 NAME 'immaePostfixAddress' DESC
+  'the dovecot address to match as username' EQUALITY caseIgnoreIA5Match SUB
+ STR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} 
+ )
+olcAttributeTypes: {10}( ImmaeattributeType:9 NAME 'immaePostfixHome' DESC '
+ the postfix home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1
+ 466.115.121.1.26 SINGLE-VALUE )
+olcAttributeTypes: {11}( ImmaeattributeType:10 NAME 'immaePostfixMail' DESC 
+ 'the dovecot mail location' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1
+ 466.115.121.1.26 SINGLE-VALUE )
+olcAttributeTypes: {12}( ImmaeattributeType:11 NAME 'immaePostfixUid' DESC '
+ the dovecot uid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121
+ .1.26 SINGLE-VALUE )
+olcAttributeTypes: {13}( ImmaeattributeType:12 NAME 'immaePostfixGid' DESC '
+ the dovecot gid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121
+ .1.26 SINGLE-VALUE )
+olcAttributeTypes: {14}( ImmaeattributeType:16 NAME 'immaePuppetJson' DESC '
+ Puppet hiera json' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.12
+ 1.1.40 )
+olcAttributeTypes: {15}( ImmaeattributeType:19 NAME 'immaeTaskId' DESC 'Task
+ warrior server Org:Name:Key' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubs
+ tringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
+olcAttributeTypes: {16}( ImmaeattributeType:20 NAME 'immaePeertubeId' DESC '
+ login for Peertube' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMat
+ ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
+olcObjectClasses: {0}( ImmaeobjectClass:1 NAME 'immaeTtrssClass' DESC 'Expan
+ sion of the existing object classes for ttrss' SUP top AUXILIARY MUST immae
+ TtrssLogin )
+olcObjectClasses: {1}( ImmaeobjectClass:2 NAME 'immaeFtpClass' DESC 'Expansi
+ on of the existing object classes for ftp' SUP top AUXILIARY MUST ( immaeFt
+ pDirectory $ immaeFtpGid $ immaeFtpUid ) )
+olcObjectClasses: {2}( ImmaeobjectClass:3 NAME 'immaeSshClass' DESC 'OpenSSH
+  class' SUP top AUXILIARY MAY immaeSSHKey )
+olcObjectClasses: {3}( ImmaeobjectClass:4 NAME 'immaeAccessClass' DESC 'Acce
+ ss class' SUP top AUXILIARY MAY ( immaeAccessDn $ immaeAccessWriteDn $ imma
+ eAccessReadSubtree ) )
+olcObjectClasses: {4}( ImmaeobjectClass:5 NAME 'immaeXmppClass' DESC 'Expans
+ ion of the existing object classes for XMPP' SUP top AUXILIARY MUST immaeXm
+ ppUid )
+olcObjectClasses: {5}( ImmaeobjectClass:6 NAME 'immaePostfixClass' DESC 'Exp
+ ansion of the existing object classes for Postfix' SUP top AUXILIARY MAY ( 
+ immaePostfixHome $ immaePostfixMail $ immaePostfixUid $ immaePostfixGid ) M
+ UST ( immaePostfixAddress ) )
+olcObjectClasses: {6}( ImmaeobjectClass:8 NAME 'immaePuppetClass' DESC 'Expa
+ nsion of the existing object classes for Puppet' SUP top AUXILIARY MUST imm
+ aePuppetJson )
+olcObjectClasses: {7}( ImmaeobjectClass:9 NAME 'immaeTaskClass' DESC 'Expans
+ ion of the existing object classes for Task' SUP top AUXILIARY MUST immaeTa
+ skId )
+olcObjectClasses: {8}( ImmaeobjectClass:10 NAME 'immaePeertubeClass' DESC 'E
+ xpansion of the existing object classes for peertube' SUP top AUXILIARY MUS
+ T immaePeertubeId )
similarity index 98%
rename from modules/private/databases/openldap/immae.schema
rename to flakes/private/openldap/immae.schema
index d2ef9723f63705ae835010d5e4f975de87d15b9f..7b3b5871d59f812dbb4503348b0eb37361d5c8f8 100644 (file)
@@ -110,8 +110,8 @@ attributetype ( ImmaeattributeType:12 NAME 'immaePostfixGid'
 objectclass ( ImmaeobjectClass:6 NAME 'immaePostfixClass'
        DESC 'Expansion of the existing object classes for Postfix'
        SUP top AUXILIARY
 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
         )
 
 # Tinc informations
index 6ad428c9ac69b120626ed8e9c8977ccad8e678a9..e81b9eec7c56bddf1a93036fd87b9f35ad27c255 100644 (file)
         "type": "github"
       }
     },
         "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,
     "nixpkgs": {
       "locked": {
         "lastModified": 1631570365,
         "type": "github"
       }
     },
         "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",
     "paste": {
       "inputs": {
         "flake-utils": "flake-utils",
-        "nixpkgs": "nixpkgs_2"
+        "nixpkgs": "nixpkgs"
       },
       "locked": {
       },
       "locked": {
-        "narHash": "sha256-2ylI42ZHfzW6oCsxfFyHf5zVnDsPMwvJCACtcdErtPg=",
+        "lastModified": 1,
+        "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
         "path": "../../paste",
         "type": "path"
       },
         "path": "../../paste",
         "type": "path"
       },
@@ -91,8 +48,6 @@
     },
     "root": {
       "inputs": {
     },
     "root": {
       "inputs": {
-        "my-lib": "my-lib",
-        "nix-lib": "nix-lib",
         "paste": "paste"
       }
     }
         "paste": "paste"
       }
     }
index 23f8cd378ada66cbd08bbdc83d6f278d9857b116..97853ea86e93f2aa4dee805eebf8f2dc684b6207 100644 (file)
@@ -1,30 +1,20 @@
 {
 {
-  inputs.paste = {
-    path = "../../paste";
-    type = "path";
-  };
-  inputs.my-lib = {
-    path = "../../lib";
-    type = "path";
-  };
-  inputs.nix-lib.url = "github:NixOS/nixpkgs";
+  inputs.paste.url = "path:../../paste";
 
   description = "Private configuration for paste";
 
   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; };
+    };
+  };
 }
 
 }
 
index 4944da76002e8f92e0dcb7d90ec576f10e71f578..0ecec47fbd992516d9d7b021eb8fa3e6f42fd0e2 100644 (file)
     },
     "myuids": {
       "locked": {
     },
     "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": {
       },
       "original": {
-        "dir": "flakes/myuids",
-        "type": "git",
-        "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
+        "path": "../myuids",
+        "type": "path"
       }
     },
     "myuids_2": {
       "locked": {
       }
     },
     "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": {
       },
       "original": {
-        "dir": "flakes/myuids",
-        "type": "git",
-        "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
+        "path": "../myuids",
+        "type": "path"
       }
     },
     "nixpkgs": {
       }
     },
     "nixpkgs": {
     "peertube": {
       "flake": false,
       "locked": {
     "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",
       },
       "original": {
         "owner": "Chocobozzz",
     "peertube_2": {
       "flake": false,
       "locked": {
     "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": {
       },
       "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",
       "inputs": {
         "flake-utils": "flake-utils",
         "myuids": "myuids",
         "peertube": "peertube"
       },
       "locked": {
         "peertube": "peertube"
       },
       "locked": {
-        "narHash": "sha256-ESrcCrx7QmNk8MHgws9KrPEZqIxKNQ6bcshbUPj9u88=",
-        "path": "../../peertube",
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
         "type": "path"
       },
       "original": {
         "type": "path"
       },
       "original": {
-        "path": "../../peertube",
+        "path": "./../../peertube",
         "type": "path"
       }
     },
         "type": "path"
       }
     },
-    "peertube_syden": {
+    "peertube_origin": {
       "inputs": {
         "flake-utils": "flake-utils_2",
         "myuids": "myuids_2",
       "inputs": {
         "flake-utils": "flake-utils_2",
         "myuids": "myuids_2",
         "peertube": "peertube_2"
       },
       "locked": {
         "peertube": "peertube_2"
       },
       "locked": {
-        "narHash": "sha256-ESrcCrx7QmNk8MHgws9KrPEZqIxKNQ6bcshbUPj9u88=",
-        "path": "../../peertube",
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
         "type": "path"
       },
       "original": {
         "type": "path"
       },
       "original": {
-        "path": "../../peertube",
+        "path": "./../../peertube",
         "type": "path"
       }
     },
     "root": {
       "inputs": {
         "type": "path"
       }
     },
     "root": {
       "inputs": {
-        "peertube_origin": "peertube_origin",
-        "peertube_syden": "peertube_syden"
+        "peertube_open_instance": "peertube_open_instance",
+        "peertube_origin": "peertube_origin"
       }
     }
   },
       }
     }
   },
index e0e0d54c1afa9c86925484cbd30e5129bbc798cf..8eb81e926892a13bf86cef7abba4a9a7bb5ab7e8 100644 (file)
@@ -1,27 +1,25 @@
 {
   description = "Patched peertube";
   inputs.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";
     inputs.peertube = {
       url = "https://git.immae.eu/github/Chocobozzz/PeerTube.git";
-      ref = "gitolite_local/syden";
+      ref = "gitolite_local/open_instance";
       flake = false;
       type = "git";
     };
   };
 
       flake = false;
       type = "git";
     };
   };
 
-  outputs = { self, peertube_origin, peertube_syden }: {
+  outputs = { self, peertube_origin, peertube_open_instance }: {
     overlays = {
     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;
       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;
   };
     defaultPackage.x86_64-linux = peertube_origin.defaultPackage.x86_64-linux;
     nixosModule = peertube_origin.nixosModule;
   };
diff --git a/flakes/private/php/flake.lock b/flakes/private/php/flake.lock
new file mode 100644 (file)
index 0000000..c9af933
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs",
+        "nixpkgs-4": "nixpkgs-4"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/private/php/flake.nix b/flakes/private/php/flake.nix
new file mode 100644 (file)
index 0000000..a730b68
--- /dev/null
@@ -0,0 +1,40 @@
+{
+  description = "Php old versions";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.nixpkgs-4 = {
+    url = "github:NixOS/nixpkgs/062a0c5437b68f950b081bbfc8a699d57a4ee026";
+    flake = false;
+  };
+  outputs = { self, nixpkgs, nixpkgs-4, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+    in rec {
+      packages = {
+        php72 = pkgs.php72;
+        php73 = pkgs.php73;
+        php74 = (import nixpkgs-4 { inherit system; overlays = []; }).php74;
+        cryptpad = (import nixpkgs-4 { inherit system; overlays = []; }).cryptpad;
+        python37 = (import nixpkgs-4 { inherit system; overlays = []; }).python37;
+        python37Packages = (import nixpkgs-4 { inherit system; overlays = []; }).python37Packages;
+        telegram-purple = (import nixpkgs-4 { inherit system; overlays = []; }).telegram-purple;
+      };
+      defaultPackage = packages.php73;
+      legacyPackages = packages;
+    }) // rec {
+      overlays = {
+        php = final: prev: {
+          php72 = self.packages."${final.system}".php72;
+          php73 = self.packages."${final.system}".php73;
+          php74 = self.packages."${final.system}".php74;
+          cryptpad = self.packages."${final.system}".cryptpad;
+          python37 = self.packages."${final.system}".python37;
+          telegram-purple = self.packages."${final.system}".telegram-purple;
+        };
+      };
+      overlay = overlays.php;
+    };
+}
diff --git a/flakes/private/ssh/flake.lock b/flakes/private/ssh/flake.lock
new file mode 100644 (file)
index 0000000..bbb2011
--- /dev/null
@@ -0,0 +1,36 @@
+{
+  "nodes": {
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "environment": "environment",
+        "secrets": "secrets"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/private/ssh/flake.nix b/flakes/private/ssh/flake.nix
new file mode 100644 (file)
index 0000000..0ca6d67
--- /dev/null
@@ -0,0 +1,107 @@
+{
+  inputs.environment.url = "path:../environment";
+  inputs.secrets.url = "path:../../secrets";
+  outputs = { self, environment, secrets }: {
+    nixosModule = self.nixosModules.ssh;
+    nixosModules.ssh = { lib, pkgs, config, ... }:
+      let
+        cfg = config.myServices.ssh;
+      in
+      {
+        imports = [
+          environment.nixosModule
+          secrets.nixosModule
+        ];
+        options.myServices.ssh = let
+          module = lib.types.submodule {
+            options = {
+              vars = lib.mkOption {
+                type = lib.types.attrsOf lib.types.lines;
+                default = {};
+                description = ''
+                  variables to interpolate in the script. A `name_` prefix will be prepended
+                '';
+              };
+              snippet = lib.mkOption {
+                type = lib.types.lines;
+                description = ''
+                    Snippet to use
+                '';
+              };
+              dependencies = lib.mkOption {
+                type = lib.types.listOf lib.types.package;
+                default = [];
+                description = ''
+                    Dependencies of the package
+                '';
+              };
+            };
+          };
+        in {
+          modules = lib.mkOption {
+            type = lib.types.attrsOf module;
+            default = {};
+            description = ''
+              List of modules to enable
+              '';
+          };
+        };
+        config = lib.mkIf (builtins.length (builtins.attrValues cfg.modules) > 0) {
+
+          services.openssh.extraConfig = ''
+            AuthorizedKeysCommand     /etc/ssh/ldap_authorized_keys
+            AuthorizedKeysCommandUser nobody
+            '';
+
+          secrets.keys."ssh-ldap" = {
+            user = "nobody";
+            group = "nogroup";
+            permissions = "0400";
+            text = config.myEnv.sshd.ldap.password;
+          };
+          secrets.keys."ssh-psql" = {
+            user = "nobody";
+            group = "nogroup";
+            permissions = "0400";
+            text = config.myEnv.sshd.psql.password;
+          };
+          system.activationScripts.sshd = {
+            deps = [ "secrets" ];
+            text = ''
+            install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-ldap"} /etc/ssh/ldap_password
+            install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-psql"} /etc/ssh/psql_password
+            '';
+          };
+          # ssh is strict about parent directory having correct rights, don't
+          # move it in the nix store.
+          environment.etc."ssh/ldap_authorized_keys" = let
+            deps = lib.lists.unique (
+              [ pkgs.which pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.postgresql ]
+              ++ lib.flatten (map (v: v.dependencies) (builtins.attrValues cfg.modules))
+              );
+            vars = lib.concatMapAttrs (n: v: (
+              lib.mapAttrs' (n': lib.nameValuePair "${n}_${n'}") v.vars
+            )) cfg.modules;
+            fullScript = pkgs.runCommand "ldap_authorized_keys" (vars // {
+              snippets = builtins.concatStringsSep "\n" (map (v: v.snippet) (builtins.attrValues cfg.modules));
+            }) ''
+              substituteAll ${./ldap_authorized_keys.sh} $out
+              # Second call for the included snippets
+              substituteAllInPlace $out
+              chmod a+x $out
+              '';
+            ldap_authorized_keys = pkgs.runCommand "ldap_authorized_keys" {
+              buildInputs = [ pkgs.makeWrapper ];
+            } ''
+              makeWrapper "${fullScript}" "$out" --prefix PATH : ${lib.makeBinPath deps}
+              '';
+          in {
+            enable = true;
+            mode = "0755";
+            user = "root";
+            source = ldap_authorized_keys;
+          };
+        };
+      };
+  };
+}
similarity index 71%
rename from modules/private/ssh/ldap_authorized_keys.sh
rename to flakes/private/ssh/ldap_authorized_keys.sh
index 402f283d1c1101fbb1c9249fbe392d41ba5f3dc9..f4395be294caed399cc4e9982937ecd7ab08a5b3 100755 (executable)
@@ -4,8 +4,14 @@ LDAPSEARCH=ldapsearch
 KEY="immaeSshKey"
 LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu"
 LDAP_PASS=$(cat /etc/ssh/ldap_password)
 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"
 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"
 
 suitable_for() {
   type_for="$1"
@@ -41,7 +47,11 @@ clean_key_line() {
 }
 
 ldap_search() {
 }
 
 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() {
 }
 
 ldap_keys() {
diff --git a/flakes/private/system/flake.lock b/flakes/private/system/flake.lock
new file mode 100644 (file)
index 0000000..3602f00
--- /dev/null
@@ -0,0 +1,185 @@
+{
+  "nodes": {
+    "backports": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts",
+        "nixpkgs": "nixpkgs_2",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "backports": "backports",
+        "environment": "environment",
+        "mypackages": "mypackages",
+        "myuids": "myuids",
+        "secrets-public": "secrets-public"
+      }
+    },
+    "secrets-public": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/private/system/flake.nix b/flakes/private/system/flake.nix
new file mode 100644 (file)
index 0000000..04ebbc7
--- /dev/null
@@ -0,0 +1,168 @@
+{
+  inputs.environment.url = "path:../environment";
+  inputs.secrets-public.url = "path:../../secrets";
+  inputs.mypackages.url = "path:../../mypackages";
+  inputs.myuids.url = "path:../../myuids";
+  inputs.backports.url = "path:../../backports";
+  outputs = { self, secrets-public, mypackages, backports, environment, myuids }: {
+    nixosModule = self.nixosModules.system;
+    nixosModules.system = { pkgs, lib, config, name, nodes, secrets, options, ... }:
+      {
+        imports = [
+          secrets.nixosModules.users-config-common
+          environment.nixosModule
+          secrets-public.nixosModule
+        ];
+        config = {
+          myEnv = import secrets.environment-file;
+          networking.hostName = name;
+          deployment.keys."vars.yml" = {
+            keyCommand = [ pkgs.stdenv.shell "-c" "cat ${secrets.vars-file}" ];
+            user = "root";
+            group = "root";
+            permissions = "0400";
+          };
+
+          networking.extraHosts = builtins.concatStringsSep "\n"
+            (lib.mapAttrsToList (n: v: "${lib.head v.config.hostEnv.ips.main.ip4} ${n}") nodes);
+
+          users.extraUsers.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.nix_repository ];
+          secrets.deleteSecretsVars = true;
+          secrets.gpgKeys = [
+            ./public_keys/Immae.pub
+          ];
+          secrets.secretsVars = "/run/keys/vars.yml";
+
+          services.openssh.enable = true;
+
+          nixpkgs.overlays =
+            builtins.attrValues mypackages.overlays ++
+            builtins.attrValues backports.overlays ++
+            [
+              (self: super: {
+                postgresql = self.postgresql_pam;
+                mariadb = self.mariadb_106.overrideAttrs(old: {
+                  passthru = old.passthru // { mysqlVersion = "5.7"; };
+                });
+              }) # don’t put them as generic overlay because of home-manager
+            ];
+
+          services.journald.extraConfig = ''
+            #Should be "warning" but disabled for now, it prevents anything from being stored
+            MaxLevelStore=info
+            MaxRetentionSec=1year
+            '';
+
+          users.groups.acme.gid = myuids.lib.gids.acme;
+          users.users =
+            builtins.listToAttrs (map (x: lib.attrsets.nameValuePair x.name ({
+              isNormalUser = true;
+              home = "/home/${x.name}";
+              createHome = true;
+              linger = true;
+              # Enable in latest unstable homeMode = "755";
+            } // x)) (config.hostEnv.users pkgs))
+            // {
+              acme.uid = myuids.lib.uids.acme;
+            };
+          environment.systemPackages = [
+            pkgs.inetutils
+            pkgs.htop
+            pkgs.iftop
+            pkgs.bind.dnsutils
+            pkgs.httpie
+            pkgs.iotop
+            pkgs.whois
+            pkgs.ngrep
+            pkgs.tcpdump
+            pkgs.wireshark-cli
+            pkgs.tcpflow
+            pkgs.mitmproxy
+            pkgs.nmap
+            pkgs.p0f
+            pkgs.socat
+            pkgs.lsof
+            pkgs.psmisc
+            pkgs.openssl
+            pkgs.wget
+
+            pkgs.pv
+            pkgs.smartmontools
+
+            pkgs.git
+            pkgs.vim
+            pkgs.rsync
+            pkgs.strace
+            pkgs.sqlite
+
+            pkgs.jq
+            pkgs.yq
+          ];
+
+          users.mutableUsers = lib.mkDefault false;
+
+          systemd.services."vars.yml-key".enable = lib.mkForce false;
+          systemd.targets.maintenance = {
+            description = "Maintenance target with only sshd";
+            after = [ "network-online.target" "sshd.service" ];
+            requires = [ "network-online.target" "sshd.service" ];
+            unitConfig.AllowIsolate = "yes";
+          };
+
+          security.acme.acceptTerms = true;
+          security.acme.preliminarySelfsigned = true;
+
+          security.acme.certs = {
+            "${name}" = {
+              domain = config.hostEnv.fqdn;
+            };
+          };
+          security.acme.defaults = {
+            email = "ismael@bouya.org";
+            webroot = "/var/lib/acme/acme-challenges";
+            postRun = builtins.concatStringsSep "\n" [
+              (lib.optionalString config.services.nginx.enable "systemctl reload nginx.service")
+            ];
+            extraLegoRenewFlags = [ "--reuse-key" ];
+            keyType = lib.mkDefault "ec256"; # https://github.com/NixOS/nixpkgs/pull/83121
+            #extraLegoRunFlags = [ "--reuse-key" "--preferred-chain" "ISRG Root X1"];
+            #extraLegoRenewFlags = ["--preferred-chain" "ISRG Root X1"];
+          };
+
+          services.nginx = {
+            recommendedTlsSettings = true;
+            virtualHosts = {
+              "${config.hostEnv.fqdn}" = {
+                acmeRoot = config.security.acme.defaults.webroot;
+                useACMEHost = name;
+                forceSSL = true;
+              };
+            };
+          };
+
+          services.fail2ban.jails.DEFAULT = {
+            settings.bantime = "12h";
+            settings.findtime = "12h";
+          };
+          services.fail2ban = {
+            enable = true;
+            #findtime = "12h";
+            #bantime = "12h";
+            bantime-increment = {
+              enable = true; # Enable increment of bantime after each violation
+              formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)";
+              #multipliers = "1 2 4 8 16 32 64";
+              maxtime = "168h"; # Do not ban for more than 1 week
+              overalljails = true; # Calculate the bantime based on all the violations
+            };
+            maxretry = 10;
+            ignoreIP = let
+              ip4s = lib.flatten (lib.mapAttrsToList (n: v: (lib.mapAttrsToList (n: v: v.ip4 or []) v.ips)) (config.myEnv.servers));
+              ip6s = lib.flatten (lib.mapAttrsToList (n: v: (lib.mapAttrsToList (n: v: v.ip6 or []) v.ips)) (config.myEnv.servers));
+            in
+              ip4s ++ ip6s;
+          };
+        };
+      };
+  };
+}
index 6d359e5a78da97e97e3668bcde77ea4f61dc287b..d81d1762318f26b579fc1a5485d6e9ff2afe7c16 100644 (file)
                   if [ "$skip" != "$DEST" ]; then
                 '';
               backup_profile_tail = name: profile: ''
                   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} #####
               '';
                 fi # [ "$skip" != "$DEST" ]
                 ##### End ${name} #####
               '';
             ];
 
             programs.ssh.knownHosts = lib.attrsets.mapAttrs' (name: profile: lib.attrsets.nameValuePair 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;
 
               publicKey = "${profile.host_key_type} ${profile.host_key}";
             }) cfg.profiles;
 
index ef74a30244f49ee28465ad0663312cbfedd6ca08..7bf04a4517fb2ed4f839ff56d14526294d9fbfcf 100644 (file)
@@ -3,6 +3,8 @@
 
   outputs = { self }: {
     nixosModule = { config, lib, pkgs, ... }: {
 
   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 {
       options.secrets = with lib; {
         keys = mkOption {
           type = types.attrsOf (types.submodule {
                 type = types.str;
                 description = "Content of the entry";
               };
                 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";
             };
           });
           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;
         };
         gpgKeys = mkOption {
           type = types.listOf types.path;
         # Read-only variables
         fullPaths = mkOption {
           type = types.attrsOf 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";
         };
           readOnly = true;
           description = "set of full paths to secrets";
         };
 
       config = let
         location = config.secrets.location;
 
       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:
         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} \\) ";
             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) {
       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 = ''
         system.activationScripts.secrets = {
           deps = [ "users" "wrappers" ];
           text = ''
             TMP=$(${pkgs.coreutils}/bin/mktemp -d)
             TMPWORK=$(${pkgs.coreutils}/bin/mktemp -d)
             chmod go-rwx $TMPWORK
             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
               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}' \;
               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}' \;
similarity index 71%
rename from pkgs/webapps/surfer/default.nix
rename to flakes/surfer/default.nix
index 9a04da5347740e3f7972ddc34c3a6ca43ef50a40..7a25199865df3402204ac7dcd400cc01b08c34de 100644 (file)
@@ -1,9 +1,9 @@
-{ callPackage, mylibs, sources }:
+{ callPackage, nodeEnv, src }:
 # built using node2nix -l package-lock.json
 # and changing "./." to "src"
 (callPackage ./node-packages.nix {
 # 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
 }).package.overrideAttrs(old: {
   postInstall = ''
     mkdir -p $out/bin
diff --git a/flakes/surfer/flake.lock b/flakes/surfer/flake.lock
new file mode 100644 (file)
index 0000000..66bea60
--- /dev/null
@@ -0,0 +1,149 @@
+{
+  "nodes": {
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts",
+        "nixpkgs": "nixpkgs",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "mypackages": "mypackages",
+        "nixpkgs": "nixpkgs_2",
+        "surfer": "surfer"
+      }
+    },
+    "surfer": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1588637864,
+        "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "revCount": 318,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      },
+      "original": {
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/surfer/flake.nix b/flakes/surfer/flake.nix
new file mode 100644 (file)
index 0000000..996104c
--- /dev/null
@@ -0,0 +1,36 @@
+{
+  description = "Surfer is a Simple static file server";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.surfer = {
+    url = "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git";
+    type = "git";
+    rev = "476177380452c9c7c5b1624805feedc824c5995e";
+    flake = false;
+  };
+  inputs.mypackages.url = "path:../mypackages";
+  outputs = { self, nixpkgs, surfer, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      nodeEnv = mypackages.mylibs.nodeEnv;
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.surfer = callPackage ./. { inherit nodeEnv; src = surfer; };
+      defaultPackage = packages.surfer;
+      legacyPackages.surfer = packages.surfer;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+    ) // rec {
+      overlays = {
+        surfer = final: prev: {
+          surfer = self.defaultPackage."${final.system}";
+        };
+      };
+      overlay = overlays.surfer;
+    };
+}
similarity index 75%
rename from pkgs/webapps/taskwarrior-web/default.nix
rename to flakes/taskwarrior-web/default.nix
index d5368c58c32580f57ccdbbe08935c1178e86d538..7678b3c6e556270d5902948327742a99c4544006 100644 (file)
@@ -1,4 +1,4 @@
-{ ruby_2_6, bundlerEnv, mylibs, stdenv }:
+{ ruby_2_6, bundlerEnv, src, stdenv }:
 let
   gems = bundlerEnv {
     name = "taskwarrior-web-env";
 let
   gems = bundlerEnv {
     name = "taskwarrior-web-env";
@@ -8,7 +8,10 @@ let
     gemdir = package.out;
     groups = [ "default" "local" "development" ];
   };
     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 = ''
     phases = [ "unpackPhase" "patchPhase" "installPhase" ];
     patches = [ ./fixes.patch ./thin.patch ];
     installPhase = ''
@@ -18,5 +21,5 @@ let
     passthru = {
       inherit gems;
     };
     passthru = {
       inherit gems;
     };
-  });
+  };
 in package
 in package
similarity index 56%
rename from pkgs/webapps/taskwarrior-web/fixes.patch
rename to flakes/taskwarrior-web/fixes.patch
index 851f9f05ffc0110e953df5d1c877074faae3f913..c4cea34f868876d5954cbdd58dc5940e1f7d2b11 100644 (file)
@@ -11,6 +11,25 @@ index 212aed7..94c57df 100644
    def format_date(timestamp)
      format = TaskwarriorWeb::Config.dateformat || '%-m/%-d/%Y'
      Time.parse(timestamp).localtime.strftime(format)
    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
 diff --git a/lib/taskwarrior-web/services/builder/base.rb b/lib/taskwarrior-web/services/builder/base.rb
 index 58d246e..8f716ac 100644
 --- a/lib/taskwarrior-web/services/builder/base.rb
@@ -24,6 +43,44 @@ index 58d246e..8f716ac 100644
      :tags => '_tags',
      :sync => 'sync'
    }
      :tags => '_tags',
      :sync => 'sync'
    }
+@@ -21,7 +21,7 @@
+       substitute_parts if @command_string =~ /:id/
+     end
+     parse_params
+-    @built = "#{@command_string}#{@params}"
++    @built = "#{@params}#{@command_string}"
+   end
+   def task_command
+@@ -43,23 +43,23 @@
+   def parse_params
+     string = ''
+-    string << %( #{@params.delete(:description).shellescape}) if @params.has_key?(:description)
++    string << %(#{@params.delete(:description).shellescape} ) if @params.has_key?(:description)
+     if tags = @params.delete(:tags)
+       tag_indicator = TaskwarriorWeb::Config.property('tag.indicator') || '+'
+-      tags.each { |tag| string << %( #{tag_indicator}#{tag.to_s.shellescape}) }
++      tags.each { |tag| string << %(#{tag_indicator}#{tag.to_s.shellescape} ) }
+     end
+     if tags = @params.delete(:remove_tags)
+-      tags.each { |tag| string << %( -#{tag.to_s.shellescape}) } 
++      tags.each { |tag| string << %(-#{tag.to_s.shellescape} ) } 
+     end
+     @params.each do |attr, value|
+       if @command != :update or attr != :uuid
+         if value.respond_to? :each
+-          value.each { |val| string << %( #{attr.to_s}:\\"#{val.to_s.shellescape}\\") }
++          value.each { |val| string << %(#{attr.to_s}:\\"#{val.to_s.shellescape}\\" ) }
+         else
+-          string << %( #{attr.to_s}:\\"#{value.to_s.shellescape}\\")
++          string << %(#{attr.to_s}:\\"#{value.to_s.shellescape}\\" )
+         end
+       end
+     end
 diff --git a/lib/taskwarrior-web/views/tasks/_form.erb b/lib/taskwarrior-web/views/tasks/_form.erb
 index 789e7a1..fa08698 100644
 --- a/lib/taskwarrior-web/views/tasks/_form.erb
 diff --git a/lib/taskwarrior-web/views/tasks/_form.erb b/lib/taskwarrior-web/views/tasks/_form.erb
 index 789e7a1..fa08698 100644
 --- a/lib/taskwarrior-web/views/tasks/_form.erb
diff --git a/flakes/taskwarrior-web/flake.lock b/flakes/taskwarrior-web/flake.lock
new file mode 100644 (file)
index 0000000..ce87931
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs",
+        "taskwarrior-web": "taskwarrior-web"
+      }
+    },
+    "taskwarrior-web": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546434241,
+        "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flakes/taskwarrior-web/flake.nix b/flakes/taskwarrior-web/flake.nix
new file mode 100644 (file)
index 0000000..b08290a
--- /dev/null
@@ -0,0 +1,33 @@
+{
+  description = "A web interface for the Taskwarrior todo application. Because being a neckbeard is only fun sometimes.";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+  inputs.nixpkgs = {
+    url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
+    flake = false;
+  };
+  inputs.taskwarrior-web = {
+    url = "github:theunraveler/taskwarrior-web/a79cfe2b42791b62364118e58b21b892fff6ded8";
+    flake = false;
+  };
+
+  outputs = { self, nixpkgs, taskwarrior-web, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
+    let
+      pkgs = import nixpkgs { inherit system; overlays = []; };
+      inherit (pkgs) callPackage;
+    in rec {
+      packages.taskwarrior-web = callPackage ./. { src = taskwarrior-web; };
+      defaultPackage = packages.taskwarrior-web;
+      legacyPackages.taskwarrior-web = packages.taskwarrior-web;
+      checks = {
+        build = defaultPackage;
+      };
+    }
+  ) // rec {
+    overlays = {
+      taskwarrior-web = final: prev: {
+        taskwarrior-web = self.defaultPackage."${final.system}";
+      };
+    };
+    overlay = overlays.taskwarrior-web;
+  };
+}
diff --git a/lib/default.nix b/lib/default.nix
deleted file mode 100644 (file)
index 7b392f1..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{ pkgs }:
-with pkgs;
-rec {
-  flakeCompat = import ./flake-compat.nix;
-  nodeEnv = import ./node-env.nix;
-
-  fetchedGithub = path:
-    let
-      json = lib.importJSON path;
-    in rec {
-      version = json.tag;
-      pname = json.meta.name;
-      name = "${pname}-${version}";
-      src = fetchFromGitHub json.github;
-    };
-} // (if builtins.pathExists ./private then callPackage ./private {} else {})
diff --git a/lib/flake-compat-patched.nix b/lib/flake-compat-patched.nix
deleted file mode 100644 (file)
index 217a99f..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-# Compatibility function to allow flakes to be used by
-# non-flake-enabled Nix versions. Given a source tree containing a
-# 'flake.nix' and 'flake.lock' file, it fetches the flake inputs and
-# calls the flake's 'outputs' function. It then returns an attrset
-# containing 'defaultNix' (to be used in 'default.nix'), 'shellNix'
-# (to be used in 'shell.nix').
-
-{ src, system ? builtins.currentSystem or "unknown-system" }:
-
-let
-
-  lockFilePath = src + "/flake.lock";
-
-  lockFile = builtins.fromJSON (builtins.readFile lockFilePath);
-
-  fetchTree =
-    info:
-    if info.type == "github" then
-      { outPath = fetchTarball "https://api.${info.host or "github.com"}/repos/${info.owner}/${info.repo}/tarball/${info.rev}";
-        rev = info.rev;
-        shortRev = builtins.substring 0 7 info.rev;
-        lastModified = info.lastModified;
-        lastModifiedDate = formatSecondsSinceEpoch info.lastModified;
-        narHash = info.narHash;
-      }
-    else if info.type == "git" then
-      { outPath =
-          builtins.fetchGit
-            ({ url = info.url; }
-             // (if info ? rev then { inherit (info) rev; } else {})
-             // (if info ? ref then { inherit (info) ref; } else {})
-            );
-        lastModified = info.lastModified;
-        lastModifiedDate = formatSecondsSinceEpoch info.lastModified;
-        narHash = info.narHash;
-      } // (if info ? rev then {
-        rev = info.rev;
-        shortRev = builtins.substring 0 7 info.rev;
-      } else {
-      })
-    else if info.type == "path" then
-      { outPath = builtins.path { path =
-          if builtins.substring 0 1 info.path == "."
-          then builtins.toString src + "/" + info.path
-          else info.path;
-        };
-        narHash = info.narHash;
-      }
-    else if info.type == "tarball" then
-      { outPath = fetchTarball info.url;
-        narHash = info.narHash;
-      }
-    else if info.type == "gitlab" then
-      { inherit (info) rev narHash lastModified;
-        outPath = fetchTarball "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}";
-        shortRev = builtins.substring 0 7 info.rev;
-      }
-    else
-      # FIXME: add Mercurial, tarball inputs.
-      throw "flake input has unsupported input type '${info.type}'";
-
-  callFlake4 = flakeSrc: locks:
-    let
-      flake = import (flakeSrc + "/flake.nix");
-
-      inputs = builtins.mapAttrs (n: v:
-        if v.flake or true
-        then callFlake4 (fetchTree (v.locked // v.info)) v.inputs
-        else fetchTree (v.locked // v.info)) locks;
-
-      outputs = flakeSrc // (flake.outputs (inputs // {self = outputs;}));
-    in
-      assert flake.edition == 201909;
-      outputs;
-
-  callLocklessFlake = flakeSrc:
-    let
-      flake = import (flakeSrc + "/flake.nix");
-      outputs = flakeSrc // (flake.outputs ({ self = outputs; }));
-    in outputs;
-
-  rootSrc = let
-    # Try to clean the source tree by using fetchGit, if this source
-    # tree is a valid git repository.
-    tryFetchGit = src:
-      if isGit && !isShallow
-      then
-        let res = builtins.fetchGit src;
-        in if res.rev == "0000000000000000000000000000000000000000" then removeAttrs res ["rev" "shortRev"]  else res
-      else { outPath = src; };
-    # NB git worktrees have a file for .git, so we don't check the type of .git
-    isGit = builtins.pathExists (src + "/.git");
-    isShallow = builtins.pathExists (src + "/.git/shallow");
-
-  in
-    { lastModified = 0; lastModifiedDate = formatSecondsSinceEpoch 0; }
-      // (if src ? outPath then src else tryFetchGit src);
-
-  # Format number of seconds in the Unix epoch as %Y%m%d%H%M%S.
-  formatSecondsSinceEpoch = t:
-    let
-      rem = x: y: x - x / y * y;
-      days = t / 86400;
-      secondsInDay = rem t 86400;
-      hours = secondsInDay / 3600;
-      minutes = (rem secondsInDay 3600) / 60;
-      seconds = rem t 60;
-
-      # Courtesy of https://stackoverflow.com/a/32158604.
-      z = days + 719468;
-      era = (if z >= 0 then z else z - 146096) / 146097;
-      doe = z - era * 146097;
-      yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
-      y = yoe + era * 400;
-      doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
-      mp = (5 * doy + 2) / 153;
-      d = doy - (153 * mp + 2) / 5 + 1;
-      m = mp + (if mp < 10 then 3 else -9);
-      y' = y + (if m <= 2 then 1 else 0);
-
-      pad = s: if builtins.stringLength s < 2 then "0" + s else s;
-    in "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}${pad (toString minutes)}${pad (toString seconds)}";
-
-  allNodes =
-    builtins.mapAttrs
-      (key: node:
-        let
-          sourceInfo =
-            if key == lockFile.root
-            then rootSrc
-            else fetchTree (node.info or {} // removeAttrs node.locked ["dir"]);
-
-          subdir = if key == lockFile.root then "" else node.locked.dir or "";
-
-          flake = import (sourceInfo + (if subdir != "" then "/" else "") + subdir + "/flake.nix");
-
-          inputs = builtins.mapAttrs
-            (inputName: inputSpec: allNodes.${resolveInput inputSpec})
-            (node.inputs or {});
-
-          # Resolve a input spec into a node name. An input spec is
-          # either a node name, or a 'follows' path from the root
-          # node.
-          resolveInput = inputSpec:
-              if builtins.isList inputSpec
-              then getInputByPath lockFile.root inputSpec
-              else inputSpec;
-
-          # Follow an input path (e.g. ["dwarffs" "nixpkgs"]) from the
-          # root node, returning the final node.
-          getInputByPath = nodeName: path:
-            if path == []
-            then nodeName
-            else
-              getInputByPath
-                # Since this could be a 'follows' input, call resolveInput.
-                (resolveInput lockFile.nodes.${nodeName}.inputs.${builtins.head path})
-                (builtins.tail path);
-
-          outputs = flake.outputs (inputs // { self = result; });
-
-          result = outputs // sourceInfo // { inherit inputs; inherit outputs; inherit sourceInfo; };
-        in
-          if node.flake or true then
-            assert builtins.isFunction flake.outputs;
-            result
-          else
-            sourceInfo
-      )
-      lockFile.nodes;
-
-  result =
-    if !(builtins.pathExists lockFilePath)
-    then callLocklessFlake rootSrc
-    else if lockFile.version == 4
-    then callFlake4 rootSrc (lockFile.inputs)
-    else if lockFile.version >= 5 && lockFile.version <= 7
-    then allNodes.${lockFile.root}
-    else throw "lock file '${lockFilePath}' has unsupported version ${toString lockFile.version}";
-
-in
-  rec {
-    defaultNix =
-      result
-      // (if result ? defaultPackage.${system} then { default = result.defaultPackage.${system}; } else {});
-
-    shellNix =
-      defaultNix
-      // (if result ? devShell.${system} then { default = result.devShell.${system}; } else {});
-  }
diff --git a/lib/flake-compat.nix b/lib/flake-compat.nix
deleted file mode 100644 (file)
index d3daa10..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-src:
-(import ./flake-compat-patched.nix { inherit src; }).defaultNix
-# Until https://github.com/edolstra/flake-compat/pull/18 is accepted
-# (import (
-#   fetchTarball {
-#     url = "https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz";
-#     sha256 = "0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2";
-#   }) { inherit src; }).defaultNix
diff --git a/modules/default.nix b/modules/default.nix
deleted file mode 100644 (file)
index 2f06eb1..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-let
-  flakeCompat = import ../lib/flake-compat.nix;
-  flakeLib = (flakeCompat ../flakes/lib).lib;
-in
-{
-  myids = (flakeCompat ../flakes/myuids).nixosModule;
-  secrets = flakeLib.withNarKeyCompat flakeCompat ../flakes/secrets "nixosModule";
-  filesWatcher = flakeLib.withNarKeyCompat flakeCompat ../flakes/files-watcher "nixosModule";
-
-  webstats = ./webapps/webstats;
-  diaspora = ./webapps/diaspora.nix;
-  etherpad-lite = ./webapps/etherpad-lite.nix;
-  mastodon = ./webapps/mastodon.nix;
-  mediagoblin = ./webapps/mediagoblin.nix;
-  peertube = (flakeCompat ../flakes/peertube).nixosModule;
-  fiche = flakeLib.withNarKeyCompat flakeCompat ../flakes/fiche "nixosModule";
-  paste = flakeLib.withNarKeyCompat flakeCompat ../flakes/paste "nixosModule";
-
-  opendmarc = flakeLib.withNarKeyCompat flakeCompat ../flakes/opendmarc "nixosModule";
-  openarc = flakeLib.withNarKeyCompat flakeCompat ../flakes/openarc "nixosModule";
-
-  duplyBackup = ./duply_backup;
-  rsyncBackup = flakeLib.withNarKeyCompat flakeCompat ../flakes/rsync_backup "nixosModule";
-  naemon = ./naemon;
-
-  php-application = ./websites/php-application.nix;
-  zrepl = ./zrepl.nix;
-  websites = ./websites;
-} // (if builtins.pathExists ./private then import ./private else {})
diff --git a/modules/naemon/default.nix b/modules/naemon/default.nix
deleted file mode 100644 (file)
index 60a75b3..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-{ config, lib, pkgs, ... }:
-
-with lib;
-
-let
-  cfg = config.services.naemon;
-
-  naemonConfig = pkgs.runCommand "naemon-config" {
-    objectsFile = pkgs.writeText "naemon_objects.cfg" cfg.objectDefs;
-    resourceFile = config.secrets.fullPaths."naemon/resources.cfg";
-    extraConfig = pkgs.writeText "extra.cfg" cfg.extraConfig;
-    inherit (cfg) logDir varDir runDir cacheDir;
-  } ''
-     substituteAll ${./naemon.cfg} $out
-     cat $extraConfig >> $out
-    '';
-in
-{
-  options = {
-    services.naemon = {
-      enable = mkOption {
-        default = false;
-        description = "
-          Whether to use <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;
-      };
-    };
-  };
-}
diff --git a/modules/private/buildbot/projects/caldance/__init__.py b/modules/private/buildbot/projects/caldance/__init__.py
deleted file mode 100644 (file)
index 2074d9e..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-from buildbot.plugins import *
-from buildbot_common.build_helpers import *
-import os
-from buildbot.util import bytes2unicode
-import json
-
-__all__ = [ "configure", "E" ]
-
-class E():
-    PROJECT       = "caldance"
-    BUILDBOT_URL  = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
-    SOCKET        = "unix:/run/buildbot/{}.sock".format(PROJECT)
-    PB_SOCKET     = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT)
-    RELEASE_PATH  = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
-    RELEASE_URL   = "https://release.immae.eu/{}".format(PROJECT)
-    GIT_URL       = "gitolite@git.immae.eu:perso/simon_descarpentries/www.cal-dance.com"
-    SSH_KEY_PATH  = "/var/lib/buildbot/buildbot_key"
-    SSH_HOST_KEY  = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF"
-    LDAP_HOST     = "ldap.immae.eu"
-    LDAP_DN       = "cn=buildbot,ou=services,dc=immae,dc=eu"
-    LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu"
-    XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
-
-    PUPPET_HOST = {
-            "integration": [ "-p8022", "root@caldance.cs.immae.dev"],
-            }
-
-    # master.cfg
-    SECRETS_FILE       = os.getcwd() + "/secrets"
-    LDAP_URL           = "ldaps://ldap.immae.eu:636"
-    LDAP_ADMIN_USER    = "cn=buildbot,ou=services,dc=immae,dc=eu"
-    LDAP_BASE          = "dc=immae,dc=eu"
-    LDAP_PATTERN       = "(uid=%(username)s)"
-    LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=caldance,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
-    TITLE_URL          = "https://caldance.cs.immae.dev"
-    TITLE              = "Caldance"
-
-class CustomBase(webhooks.base):
-    def getChanges(self, request):
-        try:
-            content = request.content.read()
-            args = json.loads(bytes2unicode(content))
-        except Exception as e:
-            raise ValueError("Error loading JSON: " + str(e))
-
-        args.setdefault("comments", "")
-        args.setdefault("repository", "")
-        args.setdefault("author", args.get("who", "unknown"))
-
-        if args["category"] == "deploy_webhook":
-            args = {
-                    "category": "deploy_webhook",
-                    "comments": "",
-                    "repository": "",
-                    "author": "webhook",
-                    "project": "Caldance",
-                    "properties": {
-                        "environment": args.get("environment", "integration"),
-                        "build": "caldance_{}.tar.gz".format(args.get("build", "master"))
-                        }
-                    }
-
-        return ([args], None)
-
-def deploy_hook_scheduler(project, timer=1):
-    return schedulers.AnyBranchScheduler(
-            change_filter=util.ChangeFilter(category="deploy_webhook", project=project),
-            name="{}_deploy".format(project), treeStableTimer=timer, builderNames=["{}_deploy".format(project)])
-
-def configure(c):
-    c["buildbotURL"] = E.BUILDBOT_URL
-    c["www"]["port"] = E.SOCKET
-
-    c["www"]["change_hook_dialects"]["base"] = {
-            "custom_class": CustomBase
-            }
-    c['workers'].append(worker.LocalWorker("generic-worker"))
-    c['workers'].append(worker.LocalWorker("deploy-worker"))
-
-    db_lock = util.MasterLock("deploy_after_build")
-
-    c['schedulers'].append(hook_scheduler("Caldance", timer=1))
-    c['schedulers'].append(force_scheduler("force_caldance", ["Caldance_build"]))
-    c['schedulers'].append(deploy_scheduler("deploy_caldance", ["Caldance_deploy"]))
-    c['schedulers'].append(deploy_hook_scheduler("Caldance", timer=1))
-
-    c['builders'].append(factory("caldance", locks=[db_lock.access('exclusive')]))
-
-    c['builders'].append(deploy_factory("caldance", locks=[db_lock.access('exclusive')]))
-
-    c['services'].append(SlackStatusPush(
-        name="slack_status_caldance",
-        builders=["Caldance_build", "Caldance_deploy"],
-        serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip()))
-    c['services'].append(XMPPStatusPush(
-        name="xmpp_status_caldance",
-        builders=["Caldance_build", "Caldance_deploy"],
-        recipients=E.XMPP_RECIPIENTS,
-        password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip()))
-
-def factory(project, locks=[], ignore_fails=False):
-    release_file = "{1}/{0}_%(kw:clean_branch)s.tar.gz"
-
-    package = util.Interpolate("{0}_%(kw:clean_branch)s.tar.gz".format(project), clean_branch=clean_branch)
-    package_dest = util.Interpolate(release_file.format(project, E.RELEASE_PATH), clean_branch=clean_branch)
-    package_url = util.Interpolate(release_file.format(project, E.RELEASE_URL), clean_branch=clean_branch)
-
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=E.GIT_URL,
-        sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
-        sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
-    factory.addSteps(package_and_upload(package, package_dest, package_url))
-
-    return util.BuilderConfig(
-            name="{}_build".format(project.capitalize()),
-            locks=locks,
-            workernames=["generic-worker"], factory=factory)
-
-def compute_build_infos(project):
-    @util.renderer
-    def compute(props):
-        import re, hashlib
-        build_file = props.getProperty("build")
-        package_dest = "{1}/{0}".format(build_file, E.RELEASE_PATH)
-        version = re.match(r"{0}_(.*).tar.gz".format(project), build_file).group(1)
-        with open(package_dest, "rb") as f:
-            sha = hashlib.sha256(f.read()).hexdigest()
-        return {
-                "build_version": version,
-                "build_hash": sha,
-                }
-    return compute
-
-@util.renderer
-def puppet_ssh_command(props):
-    environment = props["environment"] if props.hasProperty("environment") else "integration"
-    ssh_command = [
-            "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no",
-            "-i", E.SSH_KEY_PATH ]
-    return ssh_command + E.PUPPET_HOST.get(environment, ["host.invalid"])
-
-def deploy_factory(project, locks=[]):
-    package_dest = util.Interpolate("{0}/%(prop:build)s".format(E.RELEASE_PATH))
-
-    factory = util.BuildFactory()
-    factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
-    factory.addStep(steps.SetProperties(properties=compute_build_infos(project)))
-    factory.addStep(LdapPush(environment=util.Property("environment"),
-        project=project, build_version=util.Property("build_version"),
-        build_hash=util.Property("build_hash"), ldap_password=util.Secret("ldap")))
-    factory.addStep(steps.MasterShellCommand(command=puppet_ssh_command))
-    return util.BuilderConfig(
-            name="{}_deploy".format(project.capitalize()),
-            locks=locks,
-            workernames=["deploy-worker"], factory=factory)
-
-from twisted.internet import defer
-from buildbot.process.buildstep import FAILURE
-from buildbot.process.buildstep import SUCCESS
-from buildbot.process.buildstep import BuildStep
-
-class LdapPush(BuildStep):
-    name = "LdapPush"
-    renderables = ["environment", "project", "build_version", "build_hash", "ldap_password"]
-
-    def __init__(self, **kwargs):
-        self.environment = kwargs.pop("environment")
-        self.project = kwargs.pop("project")
-        self.build_version = kwargs.pop("build_version")
-        self.build_hash = kwargs.pop("build_hash")
-        self.ldap_password = kwargs.pop("ldap_password")
-        self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST)
-        super().__init__(**kwargs)
-
-    def run(self):
-        import json
-        from ldap3 import Reader, Writer, Server, Connection, ObjectDef
-        server = Server(self.ldap_host)
-        conn = Connection(server,
-                user=E.LDAP_DN,
-                password=self.ldap_password)
-        conn.bind()
-        obj = ObjectDef("immaePuppetClass", conn)
-        r = Reader(conn, obj,
-                "cn=caldance.{},{}".format(self.environment, E.LDAP_ROLES_BASE))
-        r.search()
-        if len(r) > 0:
-            w = Writer.from_cursor(r)
-            for value in w[0].immaePuppetJson.values:
-                config = json.loads(value)
-                if "role::caldance::{}_version".format(self.project) in config:
-                    config["role::caldance::{}_version".format(self.project)] = self.build_version
-                    config["role::caldance::{}_sha256".format(self.project)] = self.build_hash
-                    w[0].immaePuppetJson -= value
-                    w[0].immaePuppetJson += json.dumps(config, indent="  ")
-                    w.commit()
-                    return defer.succeed(SUCCESS)
-        return defer.succeed(FAILURE)
diff --git a/modules/private/buildbot/projects/cryptoportfolio/__init__.py b/modules/private/buildbot/projects/cryptoportfolio/__init__.py
deleted file mode 100644 (file)
index 5d70f95..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-from buildbot.plugins import *
-from buildbot_common.build_helpers import *
-import os
-
-__all__ = [ "configure", "E" ]
-
-class E():
-    PROJECT       = "cryptoportfolio"
-    BUILDBOT_URL  = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
-    SOCKET        = "unix:/run/buildbot/{}.sock".format(PROJECT)
-    PB_SOCKET     = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT)
-    RELEASE_PATH  = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
-    RELEASE_URL   = "https://release.immae.eu/{}".format(PROJECT)
-    GIT_URL       = "https://git.immae.eu/perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/{0}.git"
-    SSH_KEY_PATH  = "/var/lib/buildbot/buildbot_key"
-    LDAP_HOST     = "ldap.immae.eu"
-    LDAP_DN       = "cn=buildbot,ou=services,dc=immae,dc=eu"
-    LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu"
-
-    PUPPET_HOST = {
-            "production": "root@cryptoportfolio.immae.eu",
-            "integration": "root@cryptoportfolio-dev.immae.eu"
-            }
-
-    # master.cfg
-    SECRETS_FILE       = os.getcwd() + "/secrets"
-    LDAP_URL           = "ldaps://ldap.immae.eu:636"
-    LDAP_ADMIN_USER    = "cn=buildbot,ou=services,dc=immae,dc=eu"
-    LDAP_BASE          = "dc=immae,dc=eu"
-    LDAP_PATTERN       = "(uid=%(username)s)"
-    LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=cryptoportfolio,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
-    TITLE_URL          = "https://git.immae.eu"
-    TITLE              = "Cryptoportfolio"
-
-# eval .. dans .zshrc_local
-# mkdir -p $BUILD/go
-# export GOPATH=$BUILD/go
-# go get -u github.com/golang/dep/cmd/dep
-# export PATH=$PATH:$BUILD/go/bin
-# go get git.immae.eu/Cryptoportfolio/Front.git
-# cd $BUILD/go/src/git.immae.eu/Cryptoportfolio/Front.git
-# git checkout dev
-# dep ensure
-def configure(c):
-    c["buildbotURL"] = E.BUILDBOT_URL
-    c["www"]["port"] = E.SOCKET
-
-    c['workers'].append(worker.LocalWorker("generic-worker"))
-    c['workers'].append(worker.LocalWorker("deploy-worker"))
-
-    c['schedulers'].append(hook_scheduler("Trader"))
-    c['schedulers'].append(hook_scheduler("Front"))
-    c['schedulers'].append(force_scheduler(
-        "force_cryptoportfolio", ["Trader_build", "Front_build"]))
-    c['schedulers'].append(deploy_scheduler("deploy_cryptoportfolio",
-        ["Trader_deploy", "Front_deploy"]))
-
-    c['builders'].append(factory("trader"))
-    c['builders'].append(factory("front", ignore_fails=True))
-
-    c['builders'].append(deploy_factory("trader"))
-    c['builders'].append(deploy_factory("front"))
-
-    c['services'].append(SlackStatusPush(
-        name="slack_status_cryptoportfolio",
-        builders=["Front_build", "Trader_build", "Front_deploy", "Trader_deploy"],
-        serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip()))
-
-def factory(project, ignore_fails=False):
-    release_file = "{1}/{0}/{0}_%(kw:clean_branch)s.tar.gz"
-
-    url = E.GIT_URL.format(project.capitalize())
-
-    package = util.Interpolate("{0}_%(kw:clean_branch)s.tar.gz".format(project), clean_branch=clean_branch)
-    package_dest = util.Interpolate(release_file.format(project, E.RELEASE_PATH), clean_branch=clean_branch)
-    package_url = util.Interpolate(release_file.format(project, E.RELEASE_URL), clean_branch=clean_branch)
-
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=url,
-        mode="full", method="copy"))
-    factory.addStep(steps.ShellCommand(name="make install",
-        logEnviron=False, haltOnFailure=(not ignore_fails),
-        warnOnFailure=ignore_fails, flunkOnFailure=(not ignore_fails),
-        command=["make", "install"]))
-    factory.addStep(steps.ShellCommand(name="make test",
-        logEnviron=False, haltOnFailure=(not ignore_fails),
-        warnOnFailure=ignore_fails, flunkOnFailure=(not ignore_fails),
-        command=["make", "test"]))
-    factory.addSteps(package_and_upload(package, package_dest, package_url))
-
-    return util.BuilderConfig(
-            name="{}_build".format(project.capitalize()),
-            workernames=["generic-worker"], factory=factory)
-
-def compute_build_infos(project):
-    @util.renderer
-    def compute(props):
-        import re, hashlib
-        build_file = props.getProperty("build")
-        package_dest = "{2}/{0}/{1}".format(project, build_file, E.RELEASE_PATH)
-        version = re.match(r"{0}_(.*).tar.gz".format(project), build_file).group(1)
-        with open(package_dest, "rb") as f:
-            sha = hashlib.sha256(f.read()).hexdigest()
-        return {
-                "build_version": version,
-                "build_hash": sha,
-                }
-    return compute
-
-@util.renderer
-def puppet_host(props):
-    environment = props["environment"] if props.hasProperty("environment") else "integration"
-    return E.PUPPET_HOST.get(environment, "host.invalid")
-
-def deploy_factory(project):
-    package_dest = util.Interpolate("{1}/{0}/%(prop:build)s".format(project, E.RELEASE_PATH))
-
-    factory = util.BuildFactory()
-    factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
-    factory.addStep(steps.SetProperties(properties=compute_build_infos(project)))
-    factory.addStep(LdapPush(environment=util.Property("environment"),
-        project=project, build_version=util.Property("build_version"),
-        build_hash=util.Property("build_hash"), ldap_password=util.Secret("ldap")))
-    factory.addStep(steps.MasterShellCommand(command=[
-        "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", "-i", E.SSH_KEY_PATH, puppet_host]))
-    return util.BuilderConfig(name="{}_deploy".format(project.capitalize()), workernames=["deploy-worker"], factory=factory)
-
-from twisted.internet import defer
-from buildbot.process.buildstep import FAILURE
-from buildbot.process.buildstep import SUCCESS
-from buildbot.process.buildstep import BuildStep
-
-class LdapPush(BuildStep):
-    name = "LdapPush"
-    renderables = ["environment", "project", "build_version", "build_hash", "ldap_password"]
-
-    def __init__(self, **kwargs):
-        self.environment = kwargs.pop("environment")
-        self.project = kwargs.pop("project")
-        self.build_version = kwargs.pop("build_version")
-        self.build_hash = kwargs.pop("build_hash")
-        self.ldap_password = kwargs.pop("ldap_password")
-        self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST)
-        super().__init__(**kwargs)
-
-    def run(self):
-        import json
-        from ldap3 import Reader, Writer, Server, Connection, ObjectDef
-        server = Server(self.ldap_host)
-        conn = Connection(server,
-                user=E.LDAP_DN,
-                password=self.ldap_password)
-        conn.bind()
-        obj = ObjectDef("immaePuppetClass", conn)
-        r = Reader(conn, obj,
-                "cn=cryptoportfolio.{},{}".format(self.environment, E.LDAP_ROLES_BASE))
-        r.search()
-        if len(r) > 0:
-            w = Writer.from_cursor(r)
-            for value in w[0].immaePuppetJson.values:
-                config = json.loads(value)
-                if "role::cryptoportfolio::{}_version".format(self.project) in config:
-                    config["role::cryptoportfolio::{}_version".format(self.project)] = self.build_version
-                    config["role::cryptoportfolio::{}_sha256".format(self.project)] = self.build_hash
-                    w[0].immaePuppetJson -= value
-                    w[0].immaePuppetJson += json.dumps(config, indent="  ")
-                    w.commit()
-                    return defer.succeed(SUCCESS)
-        return defer.succeed(FAILURE)
diff --git a/modules/private/buildbot/projects/denise/__init__.py b/modules/private/buildbot/projects/denise/__init__.py
deleted file mode 100644 (file)
index abeba3c..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-from buildbot.plugins import *
-from buildbot_common.build_helpers import *
-import os
-from buildbot.util import bytes2unicode
-import json
-
-__all__ = [ "configure", "E" ]
-
-class E():
-    PROJECT           = "denise"
-    BUILDBOT_URL      = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
-    SOCKET            = "unix:/run/buildbot/{}.sock".format(PROJECT)
-    PB_SOCKET         = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT)
-    SSH_KEY_PATH      = "/var/lib/buildbot/buildbot_key"
-    SSH_HOST_KEY      = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF"
-
-    BINGO_RELEASE_PATH  = "/var/lib/buildbot/outputs/denise/bingo"
-    BINGO_BETA_PATH     = "/var/lib/buildbot/outputs/denise/bingo_beta"
-    BINGO_GIT_URL       = "gitolite@git.immae.eu:perso/Denise/bingo"
-
-    OMS_RELEASE_PATH  = "/var/lib/buildbot/outputs/denise/oms"
-    OMS_BETA_PATH     = "/var/lib/buildbot/outputs/denise/oms_beta"
-    OMS_GIT_URL       = "gitolite@git.immae.eu:perso/Denise/oms"
-
-    AVENTURIERS_RELEASE_PATH = "/var/lib/buildbot/outputs/denise/aventuriers"
-    AVENTURIERS_GIT_URL      = "https://git.immae.eu/perso/Denise/aventuriers.git"
-
-    # master.cfg
-    SECRETS_FILE       = os.getcwd() + "/secrets"
-    LDAP_URL           = "ldaps://ldap.immae.eu:636"
-    LDAP_ADMIN_USER    = "cn=buildbot,ou=services,dc=immae,dc=eu"
-    LDAP_BASE          = "dc=immae,dc=eu"
-    LDAP_PATTERN       = "(uid=%(username)s)"
-    LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=denise,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
-    TITLE_URL          = "https://oms.syanni.eu"
-    TITLE              = "Syanni website"
-
-class CustomBase(webhooks.base):
-    def getChanges(self, request):
-        try:
-            content = request.content.read()
-            args = json.loads(bytes2unicode(content))
-        except Exception as e:
-            raise ValueError("Error loading JSON: " + str(e))
-
-        args.setdefault("comments", "")
-        args.setdefault("repository", "")
-        args.setdefault("author", args.get("who", "unknown"))
-
-        return ([args], None)
-
-def configure(c):
-    c["buildbotURL"] = E.BUILDBOT_URL
-    c["www"]["port"] = E.SOCKET
-
-    c["www"]["change_hook_dialects"]["base"] = {
-            "custom_class": CustomBase
-            }
-    c['workers'].append(worker.LocalWorker("generic-worker-denise"))
-
-    c['schedulers'].append(hook_scheduler("DeniseBingo", timer=1))
-    c['schedulers'].append(hook_scheduler("DeniseOMS", timer=1))
-    c['schedulers'].append(hook_scheduler("DeniseAventuriers", timer=1))
-    c['schedulers'].append(force_scheduler("force_denise", [
-        "DeniseBingo_build", "DeniseOMS_build", "DeniseAventuriers_build"
-        ]))
-
-    c['builders'].append(denise_oms_factory())
-    c['builders'].append(denise_bingo_factory())
-    c['builders'].append(denise_aventuriers_factory())
-
-def denise_bingo_factory():
-    @util.renderer
-    def bingo_run_path(props):
-        if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
-            return "/run/denise_bingo/gunicorn.pid"
-        else:
-            return "/run/denise_bingo_beta/gunicorn.pid"
-
-    @util.renderer
-    def bingo_systemd_service(props):
-        if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
-            return "denise-bingo"
-        else:
-            return "denise-bingo-beta"
-
-    @util.renderer
-    def bingo_url(props):
-        if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
-            return "https://bingo.syanni.eu"
-        else:
-            return "https://beta.bingo.syanni.eu"
-
-    @util.renderer
-    def bingo_path(props):
-        if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
-            return E.BINGO_RELEASE_PATH
-        else:
-            return E.BINGO_BETA_PATH
-
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=E.BINGO_GIT_URL,
-        submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
-        sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
-    factory.addStep(steps.MasterShellCommand(command=util.Interpolate("rm -rf %(kw:bingo_path)s", bingo_path=bingo_path)))
-    factory.addStep(steps.DirectoryUpload(workersrc="../source",
-        masterdest=bingo_path,
-        url=bingo_url))
-    factory.addStep(steps.MasterShellCommand(command=util.Interpolate("chmod -R a+rX %(kw:bingo_path)s", bingo_path=bingo_path)))
-    factory.addStep(steps.MasterShellCommand(command=util.Interpolate("/run/wrappers/bin/sudo systemctl restart %(kw:bingo_service)s.service", bingo_service=bingo_systemd_service)))
-
-    return util.BuilderConfig(name="DeniseBingo_build", workernames=["generic-worker-denise"], factory=factory)
-
-def denise_oms_factory():
-    @util.renderer
-    def oms_run_path(props):
-        if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
-            return "/run/denise_oms/gunicorn.pid"
-        else:
-            return "/run/denise_oms_beta/gunicorn.pid"
-
-    @util.renderer
-    def oms_systemd_service(props):
-        if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
-            return "denise-oms"
-        else:
-            return "denise-oms-beta"
-
-    @util.renderer
-    def oms_url(props):
-        if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
-            return "https://oms.syanni.eu"
-        else:
-            return "https://beta.oms.syanni.eu"
-
-    @util.renderer
-    def oms_path(props):
-        if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
-            return E.OMS_RELEASE_PATH
-        else:
-            return E.OMS_BETA_PATH
-
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=E.OMS_GIT_URL,
-        submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
-        sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
-    factory.addStep(steps.MasterShellCommand(command=util.Interpolate("rm -rf %(kw:oms_path)s", oms_path=oms_path)))
-    factory.addStep(steps.DirectoryUpload(workersrc="../source",
-        masterdest=oms_path,
-        url=oms_url))
-    factory.addStep(steps.MasterShellCommand(command=util.Interpolate("chmod -R a+rX %(kw:oms_path)s", oms_path=oms_path)))
-    factory.addStep(steps.MasterShellCommand(command=util.Interpolate("/run/wrappers/bin/sudo systemctl restart %(kw:oms_service)s.service", oms_service=oms_systemd_service)))
-
-    return util.BuilderConfig(name="DeniseOMS_build", workernames=["generic-worker-denise"], factory=factory)
-
-def denise_aventuriers_factory():
-    path_env = {
-            "PATH": os.environ["BUILDBOT_PATH_Aventuriers"] + ":${PATH}",
-            "TZ": "Europe/Paris",
-            }
-
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=E.AVENTURIERS_GIT_URL,
-        submodules=True, mode="full", method="fresh"))
-    factory.addStep(steps.ShellCommand(name="build files",
-        logEnviron=False, haltOnFailure=True, workdir="build",
-        env=path_env, command=["make", "tout", "encyclo"]))
-    factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.AVENTURIERS_RELEASE_PATH)))
-    factory.addStep(steps.DirectoryUpload(workersrc="../build/html",
-        masterdest=E.AVENTURIERS_RELEASE_PATH,
-        url="https://aventuriers.syanni.eu"))
-    factory.addStep(steps.FileUpload(name="upload epub file", workersrc="aventuriers.epub",
-        workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.epub",
-        url="https://aventuriers.syanni.eu/aventuriers.epub", mode=0o644))
-    factory.addStep(steps.FileUpload(name="upload mobi file", workersrc="aventuriers.mobi",
-        workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.mobi",
-        url="https://aventuriers.syanni.eu/aventuriers.mobi", mode=0o644))
-    factory.addStep(steps.FileUpload(name="upload pdf file", workersrc="aventuriers.pdf",
-        workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.pdf",
-        url="https://aventuriers.syanni.eu/aventuriers.pdf", mode=0o644))
-    factory.addStep(steps.FileUpload(name="upload encyclo pdf file", workersrc="encyclo.pdf",
-        workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/encyclo.pdf",
-        url="https://aventuriers.syanni.eu/encyclo.pdf", mode=0o644))
-    factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.AVENTURIERS_RELEASE_PATH)))
-
-    return util.BuilderConfig(name="DeniseAventuriers_build", workernames=["generic-worker-denise"], factory=factory)
diff --git a/modules/private/buildbot/projects/immaeEu/__init__.py b/modules/private/buildbot/projects/immaeEu/__init__.py
deleted file mode 100644 (file)
index 83265cd..0000000
+++ /dev/null
@@ -1,314 +0,0 @@
-from buildbot.plugins import *
-from buildbot_common.build_helpers import *
-import os
-from buildbot.util import bytes2unicode
-import json
-
-__all__ = [ "configure", "E" ]
-
-class E():
-    PROJECT       = "immaeEu"
-    BUILDBOT_URL  = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
-    SOCKET        = "unix:/run/buildbot/{}.sock".format(PROJECT)
-    PB_SOCKET     = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT)
-    SSH_KEY_PATH  = "/var/lib/buildbot/buildbot_key"
-    SSH_HOST_KEY  = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF"
-    XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
-
-    BIP39_GIT_URL      = "https://git.immae.eu/perso/Immae/Projets/Cryptomonnaies/BIP39.git"
-    IMMAE_EU_GIT_URL   = "gitolite@git.immae.eu:perso/Immae/Sites/Blog"
-    HISTORY_GIT_URL    = "gitolite@git.immae.eu:perso/Immae/Sites/History"
-    RECETTES_GIT_URL   = "gitolite@git.immae.eu:perso/Immae/Sites/Recettes"
-    COURS_GIT_URL      = "gitolite@git.immae.eu:perso/Immae/Sites/Cours"
-    DOCS_GIT_URL       = "gitolite@git.immae.eu:perso/Immae/Sites/Docs"
-    NORMALESUP_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Projets/Sites/Normalesup"
-
-    COURS_RELEASE_PATH      = "/var/lib/buildbot/outputs/immae/cours"
-    COURS_TARBALL_PATH      = "/var/lib/ftp/release.immae.eu/cours"
-    COURS_TARBALL_URL       = "https://release.immae.eu/cours"
-    BIP39_RELEASE_PATH      = "/var/lib/buildbot/outputs/immae/bip39"
-    HISTORY_RELEASE_PATH    = "/var/lib/buildbot/outputs/immae/history"
-    IMMAE_EU_RELEASE_PATH   = "/var/lib/buildbot/outputs/immae/blog"
-    DOCS_RELEASE_PATH       = "/var/lib/buildbot/outputs/immae/docs"
-    RECETTES_RELEASE_PATH   = "/var/lib/buildbot/outputs/immae/recettes"
-    NORMALESUP_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/recherche"
-    GSMCELLS_RELEASE_PATH   = "/var/lib/ftp/release.immae.eu/gsm_cells"
-    GSMCELLS_RELEASE_URL    = "https://release.immae.eu/gsm_cells"
-
-    # master.cfg
-    SECRETS_FILE       = os.getcwd() + "/secrets"
-    LDAP_URL           = "ldaps://ldap.immae.eu:636"
-    LDAP_ADMIN_USER    = "cn=buildbot,ou=services,dc=immae,dc=eu"
-    LDAP_BASE          = "dc=immae,dc=eu"
-    LDAP_PATTERN       = "(uid=%(username)s)"
-    LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=immaeEu,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
-    TITLE_URL          = "https://www.immae.eu"
-    TITLE              = "Immae website"
-
-class CustomBase(webhooks.base):
-    def getChanges(self, request):
-        try:
-            content = request.content.read()
-            args = json.loads(bytes2unicode(content))
-        except Exception as e:
-            raise ValueError("Error loading JSON: " + str(e))
-
-        args.setdefault("comments", "")
-        args.setdefault("repository", "")
-        args.setdefault("author", args.get("who", "unknown"))
-
-        return ([args], None)
-
-def configure(c):
-    c["buildbotURL"] = E.BUILDBOT_URL
-    c["www"]["port"] = E.SOCKET
-
-    c["www"]["change_hook_dialects"]["base"] = {
-            "custom_class": CustomBase
-            }
-    c['workers'].append(worker.LocalWorker("generic-worker-immae-eu"))
-
-    c['schedulers'].append(hook_scheduler("ImmaeEu", timer=1))
-    c['schedulers'].append(hook_scheduler("Normalesup", timer=1))
-    c['schedulers'].append(hook_scheduler("Cours", timer=1))
-    c['schedulers'].append(hook_scheduler("Recettes", timer=1))
-    c['schedulers'].append(hook_scheduler("Docs", timer=1))
-    c['schedulers'].append(hook_scheduler("History", timer=1))
-    c['schedulers'].append(hook_scheduler("BIP39", timer=1))
-    c['schedulers'].append(schedulers.Nightly(name="GSMCells-weekly",
-        builderNames=["GSMCells_build"], dayOfWeek=6, hour=3))
-    c['schedulers'].append(force_scheduler("force_immae_eu", [
-        "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build",
-        "Recettes_build", "History_build", "BIP39_build"
-        ]))
-    c['schedulers'].append(schedulers.ForceScheduler(
-        name="GSMCells-force", label="Force build",
-        buttonName="Force build",
-        reason=util.StringParameter(name="reason", label="Reason", default="Force build"),
-        codebases=[
-            util.CodebaseParameter("",
-                branch=util.FixedParameter(name="branch", default=""),
-                revision=util.FixedParameter(name="revision", default=""),
-                repository=util.FixedParameter(name="repository", default=""),
-                project=util.FixedParameter(name="project", default=""),
-                ),
-            ],
-        username=util.FixedParameter(name="username", default="Web button"),
-        builderNames=["GSMCells_build"]
-        ))
-
-    c['builders'].append(immae_eu_factory())
-    c['builders'].append(normalesup_factory())
-    c['builders'].append(cours_factory())
-    c['builders'].append(gsm_cells_factory())
-    c['builders'].append(recettes_factory())
-    c['builders'].append(docs_factory())
-    c['builders'].append(history_factory())
-    c['builders'].append(bip39_factory())
-
-    c['services'].append(SlackStatusPush(
-        name="slack_status_immae_eu_project",
-        builders=[
-            "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build",
-            "GSMCells_build", "Recettes_build", "History_build",
-            "BIP39_build"
-            ],
-        serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip()))
-    c['services'].append(XMPPStatusPush(
-        name="xmpp_status_immae_eu_project",
-        builders=[
-            "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build",
-            "GSMCells_build", "Recettes_build", "History_build",
-            "BIP39_build"
-            ],
-        recipients=E.XMPP_RECIPIENTS,
-        password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip()))
-
-def history_factory():
-    path_env = {
-            "PATH": os.environ["BUILDBOT_PATH_History"] + ":${PATH}"
-            }
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=E.HISTORY_GIT_URL,
-        submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
-        sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
-    factory.addStep(steps.ShellCommand(name="build website",
-        logEnviron=False, haltOnFailure=True, workdir="source",
-        env=path_env, command=["jekyll", "build"]))
-    factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.HISTORY_RELEASE_PATH)))
-    factory.addStep(steps.DirectoryUpload(workersrc="../source/_site",
-        masterdest=E.HISTORY_RELEASE_PATH,
-        url="https://www.immae.eu/history"))
-    factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.HISTORY_RELEASE_PATH)))
-
-    return util.BuilderConfig(name="History_build", workernames=["generic-worker-immae-eu"], factory=factory)
-
-def docs_factory():
-    path_env = {
-            "PATH": os.environ["BUILDBOT_PATH_Docs"] + ":${PATH}"
-            }
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=E.DOCS_GIT_URL,
-        submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
-        sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
-    factory.addStep(steps.ShellCommand(name="build website",
-        logEnviron=False, haltOnFailure=True, workdir="source",
-        env=path_env, command=["make", "clean", "html"]))
-    factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.DOCS_RELEASE_PATH)))
-    factory.addStep(steps.DirectoryUpload(workersrc="../source/_build/html",
-        masterdest=E.DOCS_RELEASE_PATH,
-        url="https://www.immae.eu/docs"))
-    factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.DOCS_RELEASE_PATH)))
-
-    return util.BuilderConfig(name="Docs_build", workernames=["generic-worker-immae-eu"], factory=factory)
-
-def recettes_factory():
-    path_env = {
-            "PATH": os.environ["BUILDBOT_PATH_Recettes"] + ":${PATH}"
-            }
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=E.RECETTES_GIT_URL,
-        submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
-        sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
-    factory.addStep(NixShellCommand(name="build website",
-        logEnviron=False, haltOnFailure=True, workdir="source",
-        env=path_env, command="jekyll build --trace --baseurl /recettes"))
-    factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.RECETTES_RELEASE_PATH)))
-    factory.addStep(steps.DirectoryUpload(workersrc="../source/_site",
-        masterdest=E.RECETTES_RELEASE_PATH,
-        url="https://www.immae.eu/recettes"))
-    factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.RECETTES_RELEASE_PATH)))
-
-    return util.BuilderConfig(name="Recettes_build", workernames=["generic-worker-immae-eu"], factory=factory)
-
-def bip39_factory():
-    path_env = {
-            "PATH": os.environ["BUILDBOT_PATH_BIP39"] + ":${PATH}"
-            }
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=E.BIP39_GIT_URL,
-        submodules=True, mode="full", method="copy"))
-    factory.addStep(steps.ShellCommand(name="build file",
-        logEnviron=False, haltOnFailure=True, workdir="source",
-        env=path_env, command=["python", "compile.py"]))
-    factory.addStep(steps.FileUpload(name="upload file", workersrc="bip39-standalone.html",
-        workdir="source", masterdest=E.BIP39_RELEASE_PATH + "/index.html",
-        url="https://tools.immae.eu/BIP39", mode=0o644))
-    factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.BIP39_RELEASE_PATH)))
-
-    return util.BuilderConfig(name="BIP39_build", workernames=["generic-worker-immae-eu"], factory=factory)
-
-def immae_eu_factory():
-    path_env = {
-            "PATH": os.environ["BUILDBOT_PATH_ImmaeEu"] + ":${PATH}"
-            }
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=E.IMMAE_EU_GIT_URL,
-        submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
-        sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
-    factory.addStep(steps.ShellCommand(name="build website",
-        logEnviron=False, haltOnFailure=True, workdir="source",
-        env=path_env, command=["make", "html"]))
-    factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.IMMAE_EU_RELEASE_PATH)))
-    factory.addStep(steps.DirectoryUpload(workersrc="../source/output",
-        masterdest=E.IMMAE_EU_RELEASE_PATH,
-        url="https://www.immae.eu"))
-    factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.IMMAE_EU_RELEASE_PATH)))
-
-    return util.BuilderConfig(name="ImmaeEu_build", workernames=["generic-worker-immae-eu"], factory=factory)
-
-def cours_factory():
-    path_env = {
-            "PATH": os.environ["BUILDBOT_PATH_Cours"] + ":${PATH}",
-            "CI": "yes"
-            }
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=E.COURS_GIT_URL,
-        submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
-        sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
-    factory.addStep(steps.ShellCommand(name="build website",
-        logEnviron=False, haltOnFailure=True, workdir="source",
-        command=["make", "build"], env=path_env))
-    factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.COURS_RELEASE_PATH)))
-    factory.addStep(steps.DirectoryUpload(workersrc="../source/build",
-        masterdest=E.COURS_RELEASE_PATH,
-        url="https://www.immae.eu/cours"))
-    factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.COURS_RELEASE_PATH)))
-
-    factory.addStep(steps.ShellCommand(name="build pdfs",
-        logEnviron=False, haltOnFailure=True, workdir="source",
-        command=["make", "pdfs"], env=path_env))
-
-    package = util.Interpolate("cours_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch)
-    release_file = "{0}/cours_%(kw:clean_branch)s.tar.gz"
-    package_dest = util.Interpolate(release_file.format(E.COURS_TARBALL_PATH), clean_branch=clean_branch)
-    package_url = util.Interpolate(release_file.format(E.COURS_TARBALL_URL), clean_branch=clean_branch)
-    factory.addStep(steps.ShellCommand(name="build pdf tarball",
-        logEnviron=False, haltOnFailure=True, workdir="source",
-        command=["tar", "-cvf", package, "-C", "pdfs", "mp", "mpsi"], env=path_env))
-    factory.addStep(steps.FileUpload(name="upload package", workersrc=package,
-        workdir="source", masterdest=package_dest,
-        url=package_url, mode=0o644))
-
-    return util.BuilderConfig(name="Cours_build", workernames=["generic-worker-immae-eu"], factory=factory)
-
-def normalesup_factory():
-    path_env = {
-            "PATH": os.environ["BUILDBOT_PATH_Normalesup"] + ":${PATH}"
-            }
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False, repourl=E.NORMALESUP_GIT_URL,
-        submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
-        sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
-    factory.addStep(steps.ShellCommand(name="build website",
-        logEnviron=False, haltOnFailure=True, workdir="source",
-        command=["make", "build"], env=path_env))
-    factory.addStep(steps.ShellCommand(name="give read access to all files",
-        logEnviron=False, haltOnFailure=True, workdir="source",
-        command="chmod -R a+rX build", env=path_env))
-    factory.addStep(steps.ShellCommand(name="synchronize with phare",
-        logEnviron=False, haltOnFailure=True, workdir="source",
-        env=path_env, command=[
-            "rsync", "-av", "--delete",
-            "-e", "ssh -i {} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o CheckHostIP=no".format(E.SSH_KEY_PATH),
-            "build/",
-            os.environ["BUILDBOT_NORMALESUP_HOST"]
-            ]))
-    factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.NORMALESUP_RELEASE_PATH)))
-    factory.addStep(steps.DirectoryUpload(workersrc="../source/build", masterdest=E.NORMALESUP_RELEASE_PATH,
-        url="https://www.immae.eu/recherche"))
-    factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.NORMALESUP_RELEASE_PATH)))
-
-    return util.BuilderConfig(name="Normalesup_build", workernames=["generic-worker-immae-eu"], factory=factory)
-
-def gsm_cells_factory():
-    path_env = {
-            "PATH": os.environ["BUILDBOT_PATH_GSMCells"] + ":${PATH}",
-            "IN_BUILDBOT": "yes",
-            }
-    master_env = {
-            "HTACCESS": '''
-            Options +FollowSymLinks
-            IndexIgnore *
-            '''
-            }
-    for k, v in os.environ.items():
-        if k.startswith("BUILDBOT_GSM_CELLS_"):
-            path_env[k[len("BUILDBOT_GSM_CELLS_"):]] = v
-
-    script = os.environ["BUILDBOT_PROJECT_DIR"] + "/scripts/lacells_download"
-    factory = util.BuildFactory()
-    factory.addStep(steps.ShellCommand(name="download files",
-        logEnviron=False, haltOnFailure=True, command=[script], env=path_env))
-    factory.addStep(steps.ShellCommand(name="give read access to all files",
-        logEnviron=False, haltOnFailure=True,
-        command="chmod a+r lacells.db", env=path_env))
-    factory.addStep(steps.FileUpload(workersrc="lacells.db",
-        masterdest=(E.GSMCELLS_RELEASE_PATH+"/lacells.db"), url=(E.GSMCELLS_RELEASE_URL+"/lacells.db")))
-    factory.addStep(steps.MasterShellCommand(command="touch {}/.duplicity-ignore".format(E.GSMCELLS_RELEASE_PATH)))
-    factory.addStep(steps.MasterShellCommand(command='echo "$HTACCESS" > {}/.htaccess'.format(E.GSMCELLS_RELEASE_PATH),
-        env=master_env))
-    factory.addStep(steps.MasterShellCommand(command="ln -sf lacells.db {}/lacells.db.new".format(E.GSMCELLS_RELEASE_PATH)))
-    factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.GSMCELLS_RELEASE_PATH)))
-
-    return util.BuilderConfig(name="GSMCells_build", workernames=["generic-worker-immae-eu"], factory=factory)
diff --git a/modules/private/buildbot/projects/immaeEu/scripts/lacells_download b/modules/private/buildbot/projects/immaeEu/scripts/lacells_download
deleted file mode 100755 (executable)
index 1193cf3..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/usr/bin/env bash
-
-# FLG - Fast Lacells.db Generator
-#
-# Simple script to quickly download and generate lacells.db for LocalGSMBackend by n76
-# https://github.com/n76/Local-GSM-Backend
-# Uses Mozilla Location Service, OpenCellID and radiocells.org databases as source
-# Based on lacells-creator by wvengen and n76
-#
-# Licensed under GPLv3 or later
-# (C)2016 Sebastian Obrusiewicz
-# sobrus@o2.pl
-
-if [ -z "$IN_BUILDBOT" ]; then
-#DEFAULT_CONFIG_BEGIN
-ENABLE_OCI=1 #enable OpenCellID data source
-ENABLE_MOZ=1 #enable Mozilla Location Services (MLS) data source
-ENABLE_RCO=0 #enable radiocells.org data source (it can be quite slow)
-
-# See https://en.wikipedia.org/wiki/Mobile_country_code
-# 208 France
-MCC=""            #contry codes separated with "|", for example "260|262". Leave dot+asterisk ".*" for all countries
-RCO_SRC_FILE="fr.sqlite" #radiocells.org source database file, set "openbmap.sqlite" for entire world database, see https://radiocells.org/downloads for smaller country specific files, for example "pl.sqlite" for Poland
-RADIO=""     #you can remove LTE if your phone does not support it
-TOKEN=""   #your OCID token, required to download from OpenCellID. Get your free token at https://opencellid.org/
-fi
-TMPDIR='.'            #for temporary files only, use disk if you don't have enough RAM, AND remember to have enough disk space in /var/tmp for sqlite temporary files
-KEEP_FILES=1             #whether to keep (1) or delete (0) the CSV files after processing
-
-#do not edit following variables, unless you know what you're doing
-EMPTY=',,,,,,,,,,,,,'           #dummy empty file for disabled sources
-OCI_FILE=$TMPDIR"/ocid.csv"    #opencellid temporary file
-MOZ_FILE=$TMPDIR"/mozilla.csv" #mozilla temporary file
-RCO_FILE=$TMPDIR"/rco.csv"     #radiocells.org temporary file
-#DEFAULT_CONFIG_END
-
-#USER_CONFIG_BEGIN
-BINDIR=$( dirname "$(readlink -f "$0")" ) #"
-if [[ -f "${BINDIR}/config" ]]; then
-  . "${BINDIR}/config"
-fi
-#USER_CONFIG_END
-
-function manage_backup
-{
-  file=$1
-  if [ -s $file ] 
-  then
-    if [ $KEEP_FILES == "1" ]
-    then
-      gzip -kf $file
-    fi
-  elif [ -s $file".gz" ] && [ "${file##*.}" == "csv" ]
-  then
-    echo "Using" $file".gz backup file"
-    gzip -dkf $file".gz"
-  fi
-}
-
-
-function download_ocid
-{
-  URL="https://opencellid.org/ocid/downloads?token=${TOKEN}&type=full&file=cell_towers.csv.gz"
-  if [ $ENABLE_OCI == "1" ]
-  then
-    wget -qO- "$URL" | gunzip | egrep "^($RADIO),($MCC)," > $OCI_FILE
-    manage_backup $OCI_FILE
-  else
-    echo $EMPTY > $OCI_FILE 
-  fi
-}
-
-function download_mozilla
-{
-  if [ $ENABLE_MOZ == "1" ]
-  then
-    NW=`date -u "+%Y-%m-%d"`
-    wget -qO- "https://d17pt8qph6ncyq.cloudfront.net/export/MLS-full-cell-export-${NW}T000000.csv.gz" | gunzip | egrep "^($RADIO),($MCC)," > $MOZ_FILE
-    manage_backup $MOZ_FILE
-  else
-    echo $EMPTY > $MOZ_FILE
-  fi
-}
-
-function download_radiocells
-{
-  if [ $ENABLE_RCO == "1" ]
-  then
-    RCO_SELECT="SELECT technology, mcc, mnc, area, cid, NULL, longitude, latitude, 1000 accuracy, measurements, NULL, NULL, NULL, NULL FROM cell_zone;"
-    wget -qO- "https://cdn.radiocells.org/"$RCO_SRC_FILE > $TMPDIR"/"$RCO_SRC_FILE
-    sqlite3 -header -csv $TMPDIR"/"$RCO_SRC_FILE "$RCO_SELECT" | egrep "^($RADIO),($MCC)," > $RCO_FILE
-    rm $TMPDIR"/"$RCO_SRC_FILE
-    manage_backup $RCO_FILE
-  else
-    echo $EMPTY > $RCO_FILE
-  fi
-}
-
-echo "Downloading data"
-
-download_ocid &
-OP=$!
-download_mozilla &
-MO=$!
-download_radiocells &
-RO=$!
-
-wait $OP
-wait $MO
-wait $RO
-
-if [ -s $MOZ_FILE ] && [ -s $OCI_FILE ] && [ -s $RCO_FILE ]
-then
-
-manage_backup lacells.db
-rm lacells.db
-
-echo "Generating database"
-
-sqlite3 lacells.db <<-SQL
-PRAGMA synchronous = OFF;
-PRAGMA journal_mode = OFF;
-
-CREATE TEMP TABLE cells_import (radio TEXT,mcc INTEGER,mnc INTEGER,lac INTEGER,cid INTEGER,unit STRING,longitude NUMERIC,latitude NUMERIC,accuracy INTEGER,samples INTEGER,changeable BOOLEAN,created INTEGER,updated INTEGER, avgSignal INTEGER);
-CREATE TABLE cells (mcc INTEGER,mnc INTEGER,lac INTEGER,cid INTEGER,longitude REAL,latitude REAL,altitude REAL,accuracy REAL,samples INTEGER);
-
-.header on
-.mode csv
-
-.import "$OCI_FILE" cells_import
-.import "$MOZ_FILE" cells_import
-.import "$RCO_FILE" cells_import
-
-UPDATE cells_import SET samples=1 WHERE samples IS NULL OR samples < 1;
-
-INSERT INTO cells
-SELECT mcc, mnc, lac, cid,
-  sum(longitude * samples) / sum(samples) as longitude,
-  sum(latitude  * samples) / sum(samples) as latitude,
-  -1 as altitude,
-  sum(accuracy  * samples) / sum(samples) as accuracy,
-  sum(samples) as samples
-FROM cells_import
-GROUP BY mcc, mnc, lac, cid;
-
-DROP TABLE cells_import;
-
-UPDATE cells SET accuracy=500 WHERE accuracy < 500;
-UPDATE cells SET accuracy=100000 WHERE accuracy > 100000;
-
-CREATE INDEX _idx1 ON cells (mcc, mnc, lac, cid);
-CREATE INDEX _idx2 ON cells (lac, cid);
-
-VACUUM;
-SQL
-
-else
-  echo "Download error"
-fi
-
-rm $OCI_FILE
-rm $MOZ_FILE
-rm $RCO_FILE
diff --git a/modules/private/buildbot/projects/test/__init__.py b/modules/private/buildbot/projects/test/__init__.py
deleted file mode 100644 (file)
index e2f6f82..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-from buildbot.plugins import *
-from buildbot_common.build_helpers import *
-import buildbot_common.libvirt as ilibvirt
-import os
-from buildbot.util import bytes2unicode
-import json
-
-__all__ = [ "configure", "E" ]
-
-class E():
-    PROJECT       = "test"
-    BUILDBOT_URL  = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
-    SOCKET        = "unix:/run/buildbot/{}.sock".format(PROJECT)
-    PB_SOCKET     = os.environ["BUILDBOT_WORKER_PORT"]
-    WORKER_HOST   = "{}:{}".format(os.environ["BUILDBOT_HOST"], PB_SOCKET)
-    RELEASE_PATH  = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
-    RELEASE_URL   = "https://release.immae.eu/{}".format(PROJECT)
-    GIT_URL       = "https://git.immae.eu/perso/Immae/TestProject.git"
-    SSH_KEY_PATH  = "/var/lib/buildbot/buildbot_key"
-    LIBVIRT_URL   = os.environ["BUILDBOT_VIRT_URL"] + "?keyfile=" + SSH_KEY_PATH
-    PUPPET_HOST   = "root@backup-1.v.immae.eu"
-    LDAP_HOST     = "ldap.immae.eu"
-    LDAP_DN       = "cn=buildbot,ou=services,dc=immae,dc=eu"
-    LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu"
-    XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
-
-    # master.cfg
-    SECRETS_FILE       = os.getcwd() + "/secrets"
-    LDAP_URL           = "ldaps://ldap.immae.eu:636"
-    LDAP_ADMIN_USER    = "cn=buildbot,ou=services,dc=immae,dc=eu"
-    LDAP_BASE          = "dc=immae,dc=eu"
-    LDAP_PATTERN       = "(uid=%(username)s)"
-    LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=test,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
-    TITLE_URL          = "https://git.immae.eu/?p=perso/Immae/TestProject.git;a=summary"
-    TITLE              = "Test project"
-
-class CustomBase(webhooks.base):
-    def getChanges(self, request):
-        try:
-            content = request.content.read()
-            args = json.loads(bytes2unicode(content))
-        except Exception as e:
-            raise ValueError("Error loading JSON: " + str(e))
-
-        args.setdefault("comments", "")
-        args.setdefault("repository", "")
-        args.setdefault("author", args.get("who", "unknown"))
-
-        if args["category"] == "deploy_webhook":
-            args = {
-                    "category": "deploy_webhook",
-                    "comments": "",
-                    "repository": "",
-                    "author": "unknown",
-                    "project": "TestProject",
-                    "properties": {
-                        "environment": args.get("environment", "integration"),
-                        "build": "test_{}.tar.gz".format(args.get("branch", "master"))
-                        }
-                    }
-
-        return ([args], None)
-
-def deploy_hook_scheduler(project, timer=1):
-    return schedulers.AnyBranchScheduler(
-            change_filter=util.ChangeFilter(category="deploy_webhook", project=project),
-            name="{}_deploy".format(project), treeStableTimer=timer, builderNames=["{}_deploy".format(project)])
-
-def configure(c):
-    c["buildbotURL"] = E.BUILDBOT_URL
-    c["www"]["port"] = E.SOCKET
-
-    c["www"]["change_hook_dialects"]["base"] = {
-            "custom_class": CustomBase
-            }
-    c['workers'].append(ilibvirt.LibVirtWorker("test-build",
-                                             open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(),
-                                             ilibvirt.Connection(E.LIBVIRT_URL),
-                                             E.WORKER_HOST))
-    c['workers'].append(ilibvirt.LibVirtWorker("test-deploy",
-                                             open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(),
-                                             ilibvirt.Connection(E.LIBVIRT_URL),
-                                             E.WORKER_HOST))
-
-    c['schedulers'].append(hook_scheduler("TestProject", timer=1))
-    c['schedulers'].append(force_scheduler("force_test", ["TestProject_build"]))
-    c['schedulers'].append(deploy_scheduler("deploy_test", ["TestProject_deploy"]))
-    c['schedulers'].append(deploy_hook_scheduler("TestProject", timer=1))
-
-    c['builders'].append(factory())
-    c['builders'].append(deploy_factory())
-
-    c['services'].append(SlackStatusPush(
-        name="slack_status_test_project",
-        builders=["TestProject_build", "TestProject_deploy"],
-        serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip()))
-    c['services'].append(XMPPStatusPush(
-        name="xmpp_status_test_project",
-        builders=["TestProject_build", "TestProject_deploy"],
-        recipients=E.XMPP_RECIPIENTS,
-        password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip()))
-
-def factory():
-    package = util.Interpolate("test_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch)
-    package_dest = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_PATH), clean_branch=clean_branch)
-    package_url = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_URL), clean_branch=clean_branch)
-
-    factory = util.BuildFactory()
-    factory.addStep(steps.Git(logEnviron=False,
-        repourl=E.GIT_URL, mode="full", method="copy"))
-    factory.addStep(steps.ShellCommand(name="env",
-        logEnviron=False, command=["env"]))
-    factory.addStep(steps.ShellCommand(name="pwd",
-        logEnviron=False, command=["pwd"]))
-    factory.addStep(steps.ShellCommand(name="true",
-        logEnviron=False, command=["true"]))
-    factory.addStep(steps.ShellCommand(name="echo",
-        logEnviron=False, command=["echo", package]))
-    factory.addSteps(package_and_upload(package, package_dest, package_url))
-
-    return util.BuilderConfig(name="TestProject_build", workernames=["test-build"], factory=factory)
-
-
-def compute_build_infos():
-    @util.renderer
-    def compute(props):
-        import re, hashlib
-        build_file = props.getProperty("build")
-        package_dest = "{}/{}".format(E.RELEASE_PATH, build_file)
-        version = re.match(r"{0}_(.*).tar.gz".format("test"), build_file).group(1)
-        with open(package_dest, "rb") as f:
-            sha = hashlib.sha256(f.read()).hexdigest()
-        return {
-                "build_version": version,
-                "build_hash": sha,
-                }
-    return compute
-
-@util.renderer
-def puppet_host(props):
-    return E.PUPPET_HOST
-
-def deploy_factory():
-    package_dest = util.Interpolate("{}/%(prop:build)s".format(E.RELEASE_PATH))
-
-    factory = util.BuildFactory()
-    factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
-    factory.addStep(steps.SetProperties(properties=compute_build_infos()))
-    factory.addStep(LdapPush(environment=util.Property("environment"),
-        build_version=util.Property("build_version"),
-        build_hash=util.Property("build_hash"),
-        ldap_password=util.Secret("ldap")))
-    factory.addStep(steps.MasterShellCommand(command=[
-        "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", "-i", E.SSH_KEY_PATH, puppet_host]))
-    return util.BuilderConfig(name="TestProject_deploy", workernames=["test-deploy"], factory=factory)
-
-from twisted.internet import defer
-from buildbot.process.buildstep import FAILURE
-from buildbot.process.buildstep import SUCCESS
-from buildbot.process.buildstep import BuildStep
-
-class LdapPush(BuildStep):
-    name = "LdapPush"
-    renderables = ["environment", "build_version", "build_hash", "ldap_password"]
-
-    def __init__(self, **kwargs):
-        self.environment = kwargs.pop("environment")
-        self.build_version = kwargs.pop("build_version")
-        self.build_hash = kwargs.pop("build_hash")
-        self.ldap_password = kwargs.pop("ldap_password")
-        self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST)
-        super().__init__(**kwargs)
-
-    def run(self):
-        import json
-        from ldap3 import Reader, Writer, Server, Connection, ObjectDef
-        server = Server(self.ldap_host)
-        conn = Connection(server,
-                user=E.LDAP_DN,
-                password=self.ldap_password)
-        conn.bind()
-        obj = ObjectDef("immaePuppetClass", conn)
-        r = Reader(conn, obj,
-                "cn=test.{},{}".format(self.environment, E.LDAP_ROLES_BASE))
-        r.search()
-        if len(r) > 0:
-            w = Writer.from_cursor(r)
-            for value in w[0].immaePuppetJson.values:
-                config = json.loads(value)
-                if "test_version" in config:
-                    config["test_version"] = self.build_version
-                    config["test_sha256"] = self.build_hash
-                    w[0].immaePuppetJson -= value
-                    w[0].immaePuppetJson += json.dumps(config, indent="  ")
-                    w.commit()
-                    return defer.succeed(SUCCESS)
-        return defer.succeed(FAILURE)
diff --git a/modules/private/certificates.nix b/modules/private/certificates.nix
deleted file mode 100644 (file)
index 9879946..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-{ lib, pkgs, config, name, ... }:
-{
-  options.myServices.certificates = {
-    enable = lib.mkEnableOption "enable certificates";
-    webroot = lib.mkOption {
-      readOnly = true;
-      default = "/var/lib/acme/acme-challenges";
-    };
-    certConfig = lib.mkOption {
-      default = {
-        webroot = lib.mkForce null; # avoids creation of tmpfiles
-        email = "ismael@bouya.org";
-        postRun = builtins.concatStringsSep "\n" [
-          (lib.optionalString config.services.httpd.Prod.enable "systemctl reload httpdProd.service")
-          (lib.optionalString config.services.httpd.Tools.enable "systemctl reload httpdTools.service")
-          (lib.optionalString config.services.httpd.Inte.enable "systemctl reload httpdInte.service")
-          (lib.optionalString config.services.nginx.enable "systemctl reload nginx.service")
-        ];
-        extraLegoRenewFlags = [ "--reuse-key" ];
-        keyType = lib.mkDefault "ec256"; # https://github.com/NixOS/nixpkgs/pull/83121
-      };
-      description = "Default configuration for certificates";
-    };
-  };
-
-  config = lib.mkIf config.myServices.certificates.enable {
-    services.nginx = {
-      recommendedTlsSettings = true;
-      virtualHosts = {
-        "${config.hostEnv.fqdn}" = {
-          acmeRoot = config.myServices.certificates.webroot;
-          useACMEHost = name;
-          forceSSL = true;
-        };
-      };
-    };
-    services.websites.certs = config.myServices.certificates.certConfig;
-    myServices.databasesCerts = config.myServices.certificates.certConfig;
-    myServices.ircCerts = config.myServices.certificates.certConfig;
-
-    security.acme.acceptTerms = true;
-    security.acme.preliminarySelfsigned = true;
-
-    security.acme.certs = {
-      "${name}" = config.myServices.certificates.certConfig // {
-        domain = config.hostEnv.fqdn;
-      };
-    };
-
-    users.users.acme = {
-      uid = config.ids.uids.acme;
-      group = "acme";
-      description = "Acme user";
-    };
-    users.groups.acme = {
-      gid = config.ids.gids.acme;
-    };
-
-    systemd.services = lib.attrsets.mapAttrs' (k: v:
-      lib.attrsets.nameValuePair "acme-selfsigned-${k}" {
-          wantedBy = [ "acme-selfsigned-certificates.target" ];
-          script = lib.mkAfter ''
-          cp $workdir/server.crt ${config.security.acme.certs."${k}".directory}/cert.pem
-          chown '${v.user}:${v.group}' ${config.security.acme.certs."${k}".directory}/cert.pem
-          chmod ${if v.allowKeysForGroup then "750" else "700"} ${config.security.acme.certs."${k}".directory}/cert.pem
-
-          cp $workdir/ca.crt ${config.security.acme.certs."${k}".directory}/chain.pem
-          chown '${v.user}:${v.group}' ${config.security.acme.certs."${k}".directory}/chain.pem
-          chmod ${if v.allowKeysForGroup then "750" else "700"} ${config.security.acme.certs."${k}".directory}/chain.pem
-          '';
-        }
-      ) config.security.acme.certs //
-    lib.attrsets.mapAttrs' (k: data:
-      lib.attrsets.nameValuePair "acme-${k}" {
-        after = lib.mkAfter [ "bind.service" ];
-        serviceConfig =
-          let
-            cfg = config.security.acme;
-            hashOptions = let
-              domains = builtins.concatStringsSep "," (
-                [ data.domain ] ++ (builtins.attrNames data.extraDomains)
-              );
-              certOptions = builtins.concatStringsSep "," [
-                (if data.ocspMustStaple then "must-staple" else "no-must-staple")
-              ];
-            in
-              builtins.hashString "sha256" (builtins.concatStringsSep ";" [ data.keyType domains certOptions ]);
-            accountsDir = "accounts-${data.keyType}";
-            lpath = "acme/${k}";
-            apath = "/var/lib/${lpath}";
-            spath = "/var/lib/acme/.lego/${k}";
-            fileMode = if data.allowKeysForGroup then "640" else "600";
-            dirFileMode = if data.allowKeysForGroup then "750" else "700";
-            globalOpts = [ "-d" data.domain "--email" data.email "--path" "." "--key-type" data.keyType ]
-              ++ lib.optionals (cfg.acceptTerms) [ "--accept-tos" ]
-              ++ lib.optionals (data.dnsProvider != null && !data.dnsPropagationCheck) [ "--dns.disable-cp" ]
-              ++ lib.concatLists (lib.mapAttrsToList (name: root: [ "-d" name ]) data.extraDomains)
-              ++ (if data.dnsProvider != null then [ "--dns" data.dnsProvider ] else [ "--http" "--http.webroot" config.myServices.certificates.webroot ])
-              ++ lib.optionals (cfg.server != null || data.server != null) ["--server" (if data.server == null then cfg.server else data.server)];
-            certOpts = lib.optionals data.ocspMustStaple [ "--must-staple" ];
-            runOpts = lib.escapeShellArgs (globalOpts ++ [ "run" ] ++ certOpts);
-            renewOpts = lib.escapeShellArgs (globalOpts ++
-              [ "renew" "--days" (builtins.toString cfg.validMinDays) ] ++
-              certOpts ++ data.extraLegoRenewFlags);
-            forceRenewOpts = lib.escapeShellArgs (globalOpts ++
-              [ "renew" "--days" "999" ] ++
-              certOpts ++ data.extraLegoRenewFlags);
-            keyName = builtins.replaceStrings ["*"] ["_"] data.domain;
-          in {
-            User = lib.mkForce "acme";
-            Group = lib.mkForce "acme";
-            WorkingDirectory = lib.mkForce spath;
-            StateDirectory = lib.mkForce "acme/.lego/${k} acme/.lego/${accountsDir}";
-            ExecStartPre =
-              let
-                script = pkgs.writeScript "acme-prestart" ''
-                  #!${pkgs.runtimeShell} -e
-                  install -m 0755 -o acme -g acme -d ${config.myServices.certificates.webroot}
-                '';
-              in
-                lib.mkForce "+${script}";
-            ExecStart = lib.mkForce (pkgs.writeScript "acme-start" ''
-              #!${pkgs.runtimeShell} -e
-              # lego doesn't check key type after initial creation, we
-              # need to check for him
-              if [ -L ${spath}/accounts -o -d ${spath}/accounts ]; then
-                if [ -L ${spath}/accounts -a "$(readlink ${spath}/accounts)" != ../${accountsDir} ]; then
-                  ln -sfn ../${accountsDir} ${spath}/accounts
-                  mv -f ${spath}/certificates/${keyName}.key ${spath}/certificates/${keyName}.key.old
-                fi
-              else
-                ln -s ../${accountsDir} ${spath}/accounts
-              fi
-              # check if domain changed: lego doesn't check by itself
-              if [ ! -e ${spath}/certificates/${keyName}.crt -o ! -e ${spath}/certificates/${keyName}.key -o ! -e "${spath}/accounts/acme-v02.api.letsencrypt.org/${data.email}/account.json" ]; then
-                ${pkgs.lego}/bin/lego ${runOpts}
-              elif [ ! -f ${spath}/currentDomains -o "$(cat ${spath}/currentDomains)" != "${hashOptions}" ]; then
-                ${pkgs.lego}/bin/lego ${forceRenewOpts}
-              else
-                ${pkgs.lego}/bin/lego ${renewOpts}
-              fi
-            '');
-            ExecStartPost =
-              let
-                ISRG_Root_X1 = pkgs.fetchurl {
-                  url = "https://letsencrypt.org/certs/isrgrootx1.pem";
-                  sha256 = "1la36n2f31j9s03v847ig6ny9lr875q3g7smnq33dcsmf2i5gd92";
-                };
-                fix_ISRG_Root_X1 = pkgs.writeScript "fix-pem" ''
-                  for file in chain fullchain full; do
-                    if grep -q MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA "$file.pem"; then
-                      cat ${ISRG_Root_X1} | grep -v " CERTIFICATE" | \
-                      sed -i.bak -ne "/MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/ {r /dev/stdin" -e ":a; n; /Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5/ { b }; ba };p" $file.pem
-                    fi
-                  done
-                '';
-                script = pkgs.writeScript "acme-post-start" ''
-                  #!${pkgs.runtimeShell} -e
-                  install -m 0755 -o root -g root -d /var/lib/acme
-                  install -m 0${dirFileMode} -o ${data.user} -g ${data.group} -d /var/lib/acme/${k}
-                  cd /var/lib/acme/${k}
-
-                  # Test that existing cert is older than new cert
-                  KEY=${spath}/certificates/${keyName}.key
-                  KEY_CHANGED=no
-                  if [ -e $KEY -a $KEY -nt key.pem ]; then
-                    KEY_CHANGED=yes
-                    cp -p ${spath}/certificates/${keyName}.key key.pem
-                    cp -p ${spath}/certificates/${keyName}.crt fullchain.pem
-                    cp -p ${spath}/certificates/${keyName}.issuer.crt chain.pem
-                    ln -sf fullchain.pem cert.pem
-                    cat key.pem fullchain.pem > full.pem
-                    echo -n "${hashOptions}" > ${spath}/currentDomains
-                  fi
-
-                  ${fix_ISRG_Root_X1}
-                  chmod ${fileMode} *.pem
-                  chown '${data.user}:${data.group}' *.pem
-
-                  if [ "$KEY_CHANGED" = "yes" ]; then
-                    : # noop in case postRun is empty
-                    ${data.postRun}
-                  fi
-                '';
-              in
-                lib.mkForce "+${script}";
-          };
-      }
-    ) config.security.acme.certs //
-    {
-      httpdProd = lib.mkIf config.services.httpd.Prod.enable
-        { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; };
-      httpdTools = lib.mkIf config.services.httpd.Tools.enable
-        { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; };
-      httpdInte = lib.mkIf config.services.httpd.Inte.enable
-        { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; };
-    };
-  };
-}
diff --git a/modules/private/databases/openldap/default.nix b/modules/private/databases/openldap/default.nix
deleted file mode 100644 (file)
index d35aca0..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  cfg = config.myServices.databases.openldap;
-  ldapConfig = let
-    eldiron_schemas = pkgs.callPackage ./eldiron_schemas.nix {};
-  in ''
-    ${eldiron_schemas}
-
-    pidfile         ${cfg.pids.pid}
-    argsfile        ${cfg.pids.args}
-
-    moduleload      back_hdb
-    backend         hdb
-
-    TLSCertificateFile    ${config.security.acme.certs.ldap.directory}/cert.pem
-    TLSCertificateKeyFile ${config.security.acme.certs.ldap.directory}/key.pem
-    TLSCACertificateFile  ${config.security.acme.certs.ldap.directory}/fullchain.pem
-    TLSCACertificatePath  ${pkgs.cacert.unbundled}/etc/ssl/certs/
-    #This makes openldap crash
-    #TLSCipherSuite        DEFAULT
-
-    sasl-host kerberos.immae.eu
-    '';
-in
-{
-  options.myServices.databases = {
-    openldap = {
-      enable = lib.mkOption {
-        default = false;
-        example = true;
-        description = "Whether to enable ldap";
-        type = lib.types.bool;
-      };
-      baseDn = lib.mkOption {
-        type = lib.types.str;
-        description = ''
-          Base DN for LDAP
-        '';
-      };
-      rootDn = lib.mkOption {
-        type = lib.types.str;
-        description = ''
-          Root DN
-        '';
-      };
-      rootPw = lib.mkOption {
-        type = lib.types.str;
-        description = ''
-          Root (Hashed) password
-        '';
-      };
-      accessFile = lib.mkOption {
-        type = lib.types.path;
-        description = ''
-          The file path that defines the access
-        '';
-      };
-      dataDir = lib.mkOption {
-        type = lib.types.path;
-        default = "/var/lib/openldap";
-        description = ''
-          The directory where Openldap stores its data.
-        '';
-      };
-      socketsDir = lib.mkOption {
-        type = lib.types.path;
-        default = "/run/slapd";
-        description = ''
-          The directory where Openldap puts sockets and pid files.
-          '';
-      };
-      # Output variables
-      pids = lib.mkOption {
-        type = lib.types.attrsOf lib.types.path;
-        default = {
-          pid  = "${cfg.socketsDir}/slapd.pid";
-          args = "${cfg.socketsDir}/slapd.args";
-        };
-        readOnly = true;
-        description = ''
-          Slapd pid files
-          '';
-      };
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    secrets.keys = {
-       "ldap/password" = {
-        permissions = "0400";
-        user = "openldap";
-        group = "openldap";
-        text = "rootpw          ${cfg.rootPw}";
-      };
-      "ldap/access" = {
-        permissions = "0400";
-        user = "openldap";
-        group = "openldap";
-        text = builtins.readFile cfg.accessFile;
-      };
-      "ldap" = {
-        permissions = "0500";
-        user = "openldap";
-        group = "openldap";
-        isDir = true;
-      };
-    };
-    users.users.openldap.extraGroups = [ "keys" ];
-    networking.firewall.allowedTCPPorts = [ 636 389 ];
-
-    security.acme.certs."ldap" = config.myServices.databasesCerts // {
-      user = "openldap";
-      group = "openldap";
-      domain = "ldap.immae.eu";
-      postRun = ''
-        systemctl restart openldap.service
-      '';
-    };
-
-    services.filesWatcher.openldap = {
-      restart = true;
-      paths = [ config.secrets.fullPaths."ldap" ];
-    };
-
-    services.openldap = {
-      enable = true;
-      dataDir = cfg.dataDir;
-      urlList = [ "ldap://" "ldaps://" ];
-      logLevel = "none";
-      extraConfig = ldapConfig;
-      extraDatabaseConfig = ''
-        moduleload      memberof
-        overlay         memberof
-
-        moduleload      syncprov
-        overlay         syncprov
-        syncprov-checkpoint 100 10
-
-        include ${config.secrets.fullPaths."ldap/access"}
-        '';
-      rootpwFile = config.secrets.fullPaths."ldap/password";
-      suffix = cfg.baseDn;
-      rootdn = cfg.rootDn;
-      database = "hdb";
-    };
-  };
-}
diff --git a/modules/private/databases/openldap/eldiron_schemas.nix b/modules/private/databases/openldap/eldiron_schemas.nix
deleted file mode 100644 (file)
index cf45ebe..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-{ fetchurl, openldap }:
-let
-  kerberosSchema = fetchurl {
-    url = "https://raw.githubusercontent.com/krb5/krb5/0bdd3b8058ed4ec9acc050e316bea86f6830b15f/src/plugins/kdb/ldap/libkdb_ldap/kerberos.schema";
-    sha256 = "17fnkkf6s3lznsl7wp6914pqsc78d038rh38l638big8z608ksww";
-  };
-  puppetSchema = fetchurl {
-    url = "https://raw.githubusercontent.com/puppetlabs/puppet/bf7c108825ffdb5ea89cf3e500d55d27ab64b8d2/ext/ldap/puppet.schema";
-    sha256 = "11bjf5zfvqlim7p9vddcafs0wiq3v8ys77x8h6fbp9c6bdfh0awh";
-  };
-  schemas = [
-    #"${openldap}/etc/schema/core.schema"
-    #"${openldap}/etc/schema/cosine.schema"
-    #"${openldap}/etc/schema/inetorgperson.schema"
-    #"${openldap}/etc/schema/nis.schema"
-    puppetSchema
-    kerberosSchema
-    ./immae.schema
-  ];
-in
-  builtins.concatStringsSep "\n" (map (v: "include         ${v}") schemas)
diff --git a/modules/private/default.nix b/modules/private/default.nix
deleted file mode 100644 (file)
index 9108a92..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-let
-set = {
-  # adatped from nixpkgs/nixos/modules/services/web-servers/apache-httpd/default.nix
-  httpdInte  = import ../websites/httpd-service-builder.nix { httpdName = "Inte"; withUsers = false; };
-  httpdProd  = import ../websites/httpd-service-builder.nix { httpdName = "Prod"; withUsers = false; };
-  httpdTools = import ../websites/httpd-service-builder.nix { httpdName = "Tools"; withUsers = true; };
-
-  databases  = ./databases;
-  mariadb    = ./databases/mariadb.nix;
-  openldap   = ./databases/openldap;
-  postgresql = ./databases/postgresql.nix;
-  redis      = ./databases/redis.nix;
-  postgresqlReplication = ./databases/postgresql_replication.nix;
-  mariadbReplication = ./databases/mariadb_replication.nix;
-  redisReplication = ./databases/redis_replication.nix;
-  openldapReplication = ./databases/openldap_replication.nix;
-
-  websites = ./websites;
-  gemini = ./gemini;
-
-
-  # Personal websites
-  bakeerCloud = ./websites/bakeer/cloud.nix;
-
-  capitainesLandingPages = ./websites/capitaines/landing_pages.nix;
-
-  chloeInte = ./websites/chloe/integration.nix;
-  chloeProd = ./websites/chloe/production.nix;
-
-  cipcaSympa = ./websites/cip-ca/sympa.nix;
-
-  connexionswingInte = ./websites/connexionswing/integration.nix;
-  connexionswingProd = ./websites/connexionswing/production.nix;
-
-  deniseDenisejeromeProd = ./websites/denise/denisejerome.nix;
-  deniseEvariste = ./websites/denise/evariste.nix;
-  deniseOMS = ./websites/denise/oms.nix;
-  deniseBingo = ./websites/denise/bingo.nix;
-  deniseAventuriers = ./websites/denise/aventuriers.nix;
-  deniseProduction = ./websites/denise/production.nix;
-
-  emiliaMoodle = ./websites/emilia/moodle.nix;
-  emiliaAtelierFringant = ./websites/emilia/atelierfringant.nix;
-
-  florianApp = ./websites/florian/app.nix;
-  florianInte = ./websites/florian/integration.nix;
-  florianProd = ./websites/florian/production.nix;
-
-  immaeProd = ./websites/immae/production.nix;
-  immaeRelease = ./websites/immae/release.nix;
-  immaeTemp = ./websites/immae/temp.nix;
-
-  isabelleAtenInte = ./websites/isabelle/aten_integration.nix;
-  isabelleAtenProd = ./websites/isabelle/aten_production.nix;
-  isabelleIridologie = ./websites/isabelle/iridologie.nix;
-
-  jeromeNaturaloutil = ./websites/jerome/naturaloutil.nix;
-
-  leilaProd = ./websites/leila/production.nix;
-
-  ludivineInte = ./websites/ludivine/integration.nix;
-  ludivineProd = ./websites/ludivine/production.nix;
-
-  nassimeProd = ./websites/nassime/production.nix;
-
-  nathVillon = ./websites/nath/villon.nix;
-
-  papaMaisonBbc = ./websites/papa/maison_bbc.nix;
-  papaSurveillance = ./websites/papa/surveillance.nix;
-
-  patrickFodellaEcolyeu = ./websites/patrick_fodella/ecolyeu.nix;
-  patrickFodellaAltermondia = ./websites/patrick_fodella/altermondia.nix;
-
-  piedsjalouxInte = ./websites/piedsjaloux/integration.nix;
-  piedsjalouxProd = ./websites/piedsjaloux/production.nix;
-
-  ressourcerieBanonProd = ./websites/ressourcerie_banon/production.nix;
-  ressourcerieBanonCloud = ./websites/ressourcerie_banon/cloud.nix;
-  ressourcerieBanonCryptpad = ./websites/ressourcerie_banon/cryptpad.nix;
-
-  richieProd = ./websites/richie/production.nix;
-
-  sydenPeertube = ./websites/syden/peertube.nix;
-
-  teliotortayProd = ./websites/telio_tortay/production.nix;
-
-  # Tools
-  assetsTools = ./websites/tools/assets;
-  cloudTool = ./websites/tools/cloud;
-  cloudFarmTool = ./websites/tools/cloud/farm.nix;
-  cryptpadTool = ./websites/tools/cryptpad;
-  cryptpadFarmTool = ./websites/tools/cryptpad/farm.nix;
-  commentoTool = ./websites/tools/commento;
-  davTool = ./websites/tools/dav;
-  vpnTool = ./websites/tools/vpn;
-  dbTool = ./websites/tools/db;
-  diasporaTool = ./websites/tools/diaspora;
-  etherTool = ./websites/tools/ether;
-  gitTool = ./websites/tools/git;
-  imTool = ./websites/tools/im;
-  mastodonTool = ./websites/tools/mastodon;
-  mgoblinTool = ./websites/tools/mgoblin;
-  peertubeTool = ./websites/tools/peertube;
-  performanceTool = ./websites/tools/performance;
-  toolsTool = ./websites/tools/tools;
-  mailTool = ./websites/tools/mail;
-  statsTool = ./websites/tools/stats;
-
-  # Games
-  codenamesGame = ./websites/tools/games/codenames;
-  terraformingMarsGame = ./websites/tools/games/terraforming-mars;
-
-  mail = ./mail;
-
-  buildbot = ./buildbot;
-  certificates = ./certificates.nix;
-  gitolite = ./gitolite;
-  irc = ./irc.nix;
-  pub = ./pub;
-  tasks = ./tasks;
-  dns = ./dns.nix;
-  ftp = ./ftp.nix;
-  mpd = ./mpd.nix;
-  ejabberd = ./ejabberd;
-  ssh = ./ssh;
-  monitoring = ./monitoring;
-  status = ./monitoring/status.nix;
-  status_engine = ./monitoring/status_engine.nix;
-  vpn = ./vpn;
-
-  environment = ./environment.nix;
-  system = ./system.nix;
-  loginctl-linger = ./loginctl-linger.nix;
-};
-in
-builtins.listToAttrs (map (attr: { name = "priv${attr}"; value = set.${attr}; }) (builtins.attrNames set))
diff --git a/modules/private/dns.nix b/modules/private/dns.nix
deleted file mode 100644 (file)
index 1d7fd52..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-{ lib, pkgs, config, ... }:
-{
-  options.myServices.dns.enable = lib.mkEnableOption "enable DNS resolver";
-  config = let
-    # taken from unstable
-    cartesianProductOfSets = attrsOfLists: with lib;
-      lib.foldl' (listOfAttrs: attrName:
-        concatMap (attrs:
-          map (listValue: attrs // { ${attrName} = listValue; }) attrsOfLists.${attrName}
-        ) listOfAttrs
-      ) [{}] (attrNames attrsOfLists);
-    cfg = config.services.bind;
-    keyIncludes = builtins.concatStringsSep "\n" (map (v: "include \"${config.secrets.fullPaths."bind/${v}.key"}\";") (builtins.attrNames config.myEnv.dns.keys));
-    cartProduct = lib.foldr
-      (s: servers: servers // { ${s.masters} = lib.unique ((servers.${s.masters} or []) ++ [s.keys]); })
-      {}
-      (lib.unique (lib.concatMap (z: cartesianProductOfSets { masters = z.masters or []; keys = z.keys or []; }) config.myEnv.dns.slaveZones));
-    toKeyList = servers: keys: builtins.concatStringsSep "\n" (map (s: ''
-      server ${s} {
-        keys { ${builtins.concatStringsSep ";" keys}; };
-      };
-    '') servers);
-    serverIncludes = builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: toKeyList (lib.flatten (builtins.attrValues config.myEnv.dns.ns."${n}"))) cartProduct);
-    configFile = pkgs.writeText "named.conf" ''
-      include "/etc/bind/rndc.key";
-      controls {
-        inet 127.0.0.1 allow {localhost;} keys {"rndc-key";};
-      };
-
-      acl cachenetworks { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.cacheNetworks} };
-      acl badnetworks { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.blockedNetworks} };
-
-      options {
-        listen-on { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.listenOn} };
-        listen-on-v6 { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.listenOnIpv6} };
-        allow-query { cachenetworks; };
-        blackhole { badnetworks; };
-        forward first;
-        forwarders { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.forwarders} };
-        directory "/var/run/named";
-        pid-file "/var/run/named/named.pid";
-        ${cfg.extraOptions}
-      };
-
-      ${keyIncludes}
-      ${serverIncludes}
-
-      ${cfg.extraConfig}
-
-      ${ lib.concatMapStrings
-          ({ name, file, master ? true, extra ? "", slaves ? [], masters ? [] }:
-            ''
-              zone "${name}" {
-                type ${if master then "master" else "slave"};
-                file "${file}";
-                ${ if lib.lists.length slaves > 0 then
-                  ''
-                    allow-transfer {
-                      ${lib.concatMapStrings (ip: "${ip};\n") slaves}
-                    };
-                  '' else ""}
-                ${ if lib.lists.length masters > 0 then
-                  ''
-                    masters {
-                      ${lib.concatMapStrings (ip: "${ip};\n") masters}
-                    };
-                  '' else ""}
-                allow-query { any; };
-                ${extra}
-              };
-            '')
-          cfg.zones }
-    '';
-    mxes = lib.attrsets.filterAttrs
-      (n: v: v.mx.enable)
-      config.myEnv.servers;
-    ip4mxes = builtins.concatStringsSep "\n" (lib.mapAttrsToList
-      (n: v: "${v.mx.subdomain} IN A     ${v.ips.main.ip4}")
-      mxes);
-    ip6mxes = builtins.concatStringsSep "\n" (lib.mapAttrsToList
-      (n: v: builtins.concatStringsSep "\n" (map (i: "${v.mx.subdomain} IN AAAA  ${i}") v.ips.main.ip6))
-      mxes);
-    mxmxes = n: conf: builtins.concatStringsSep "\n" (lib.mapAttrsToList
-      (_: v: "${n} IN MX ${v.mx.priority} ${v.mx.subdomain}.${conf.name}.")
-      mxes);
-  in lib.mkIf config.myServices.dns.enable {
-    networking.firewall.allowedUDPPorts = [ 53 ];
-    networking.firewall.allowedTCPPorts = [ 53 ];
-    users.users.named.extraGroups = [ "keys" ];
-    secrets.keys = lib.mapAttrs' (k: v:
-      lib.nameValuePair "bind/${k}.key" {
-        permissions = "0400";
-        user = "named";
-        text = ''
-          key "${k}"
-            {
-              algorithm ${v.algorithm};
-              secret "${v.secret}";
-            };
-        '';
-      }
-    ) config.myEnv.dns.keys;
-    services.bind = {
-      enable = true;
-      cacheNetworks = ["any"];
-      configFile = configFile;
-      extraOptions = ''
-        allow-recursion { 127.0.0.1; };
-        allow-transfer  { none; };
-
-        notify-source    ${config.myEnv.servers.eldiron.ips.main.ip4};
-        notify-source-v6 ${lib.head config.myEnv.servers.eldiron.ips.main.ip6};
-        version   none;
-        hostname  none;
-        server-id none;
-        '';
-      zones = with config.myEnv.dns;
-        assert (builtins.substring ((builtins.stringLength soa.email)-1) 1 soa.email) != ".";
-        assert (builtins.substring ((builtins.stringLength soa.primary)-1) 1 soa.primary) != ".";
-        (map (conf: {
-          name = conf.name;
-          master = false;
-          file = "/var/run/named/${conf.name}.zone";
-          masters = if lib.attrsets.hasAttr "masters" conf
-            then lib.lists.flatten (map (n: lib.attrsets.attrValues ns.${n}) conf.masters)
-            else [];
-        }) slaveZones)
-        ++ (map (conf: {
-          name = conf.name;
-          master = true;
-          extra = if lib.attrsets.hasAttr "extra" conf then conf.extra else "";
-          slaves = if lib.attrsets.hasAttr "slaves" conf
-            then lib.lists.flatten (map (n: lib.attrsets.attrValues ns.${n}) conf.slaves)
-            else [];
-          file = pkgs.writeText "${conf.name}.zone" ''
-              $TTL 10800
-              @ IN SOA ${soa.primary}. ${builtins.replaceStrings ["@"] ["."] soa.email}. ${soa.serial} ${soa.refresh} ${soa.retry} ${soa.expire} ${soa.ttl}
-
-              ${lib.concatStringsSep "\n" (map (x: "@ IN NS ${x}.") (lib.concatMap (n: lib.attrsets.mapAttrsToList (k: v: k) ns.${n}) conf.ns))}
-              ${lib.optionalString (conf.withCAA != null) ''
-                ${conf.name}. IN CAA 0 issue "${conf.withCAA}"
-              ''}
-
-              ${conf.entries}
-
-              ${if lib.attrsets.hasAttr "withEmail" conf && lib.lists.length conf.withEmail > 0 then ''
-              ${ip4mxes}
-              ${ip6mxes}
-              ${lib.concatStringsSep "\n\n" (map (e:
-              let
-                n = if e.domain == "" then "@" else "${e.domain}  ";
-                suffix = if e.domain == "" then "" else ".${e.domain}";
-              in
-              ''
-              ; ------------------ mail: ${n} ---------------------------
-              ${mxmxes n conf}
-
-              ; https://tools.ietf.org/html/rfc6186
-              _submission._tcp${suffix}  SRV  0 1  587 smtp.immae.eu.
-              _submissions._tcp${suffix} SRV  0 1  465 smtp.immae.eu.
-              _imap._tcp${suffix}        SRV  0 1  143 imap.immae.eu.
-              _imaps._tcp${suffix}       SRV  0 1  993 imap.immae.eu.
-              _pop3._tcp${suffix}        SRV 10 1  110 pop3.immae.eu.
-              _pop3s._tcp${suffix}       SRV 10 1  995 pop3.immae.eu.
-              _sieve._tcp${suffix}       SRV  0 1 4190 imap.immae.eu.
-
-              ; MTA-STS
-              ; https://blog.delouw.ch/2018/12/16/using-mta-sts-to-enhance-email-transport-security-and-privacy/
-              ; https://support.google.com/a/answer/9261504
-              _mta-sts${suffix}   IN TXT  "v=STSv1;id=20200109150200Z"
-              _smtp._tls${suffix} IN TXT  "v=TLSRPTv1;rua=mailto:postmaster+mta-sts@immae.eu"
-              mta-sts${suffix}    IN A    ${config.myEnv.servers.eldiron.ips.main.ip4}
-              ${builtins.concatStringsSep "\n" (map (i: "mta-sts${suffix}    IN AAAA ${i}") config.myEnv.servers.eldiron.ips.main.ip6)}
-
-              ; Mail sender authentications
-              ${n}                   IN TXT  "v=spf1 mx ~all"
-              _dmarc${suffix}              IN TXT  "v=DMARC1; p=none; adkim=r; aspf=r; fo=1; rua=mailto:postmaster+rua@immae.eu; ruf=mailto:postmaster+ruf@immae.eu;"
-              ${if e.send then ''
-              immae_eu._domainkey${suffix} IN TXT  ( "v=DKIM1; k=rsa; s=email; "
-                        "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzl3vLd8W5YAuumC5+ZT9OV7/14Pmh5JYtwyqKI3cfe9NnAqInt3xO4bZ7oqIxRKWN4SD39vm7O/QOvFdBt00ENOOzdP90s5gKw6eIP/4+vPTh0IWltAsmu9B2agzdtWUE7t2xFKIzEn8l9niRE2QYbVaqZv4sub98vY55fIgFoHtjkmNC7325S8fjDJGp6OPbyhAs6Xl5/adjF"
-                        "0ko4Y2p6RaxLQfjlS0bxmK4Qg6C14pIXHtzVeqOuWrwApqt5+AULSn97iUtqV/IJlEEjC6DUR44t3C/G0G/k46iFclCqRRi0hdPrOHCtZDbtMubnTN9eaUiNpkXh1WnCflHwtjQwIDAQAB" )
-              eldiron._domainkey${suffix}  IN TXT  ${config.myEnv.mail.dkim.eldiron.public}
-              '' else ""}
-              '') conf.withEmail)}
-              '' + (if conf.name == "immae.eu" then ''
-              ; ----------------- Accept DMARC reports -------------------
-              ${lib.concatStringsSep "\n" (
-                lib.flatten (
-                  map (z: map (e: "${e.domain}${if builtins.stringLength e.domain > 0 then "." else ""}${z.name}._report._dmarc IN TXT \"v=DMARC1;\"") (z.withEmail or [])) masterZones
-                )
-              )}
-              '' else "") else ""}
-            '';
-          }) masterZones);
-    };
-  };
-}
diff --git a/modules/private/environment.nix b/modules/private/environment.nix
deleted file mode 100644 (file)
index 837d24b..0000000
+++ /dev/null
@@ -1,1492 +0,0 @@
-{ config, lib, name, ... }:
-with lib;
-with types;
-with lists;
-let
-  ldapOptions = {
-    base = mkOption { description = "Base of the LDAP tree"; type = str; };
-    host = mkOption { description = "Host to access LDAP"; type = str; };
-    root_dn = mkOption { description = "DN of the root user"; type = str; };
-    root_pw = mkOption { description = "Hashed password of the root user"; type = str; };
-    replication_dn = mkOption { description = "DN of the user allowed to replicate the LDAP directory"; type = str; };
-    replication_pw = mkOption { description = "Password of the user allowed to replicate the LDAP directory"; type = str; };
-  };
-  mkLdapOptions = name: more: mkOption {
-    description = "${name} LDAP configuration";
-    type = submodule {
-      options = ldapOptions // {
-        dn = mkOption { description = "DN of the ${name} user"; type = str; };
-        password = mkOption { description = "password of the ${name} user"; type = str; };
-        filter = mkOption { description = "Filter for ${name} users"; type = str; default = ""; };
-      } // more;
-    };
-  };
-  mysqlOptions = {
-    host = mkOption { description = "Host to access Mysql"; type = str; };
-    remoteHost = mkOption { description = "Host to access Mysql from outside"; type = str; };
-    port = mkOption { description = "Port to access Mysql"; type = str; };
-    socket = mkOption { description = "Socket to access Mysql"; type = path; };
-    systemUsers = mkOption {
-      description = "Attrs of user-passwords allowed to access mysql";
-      type = attrsOf str;
-    };
-    pam = mkOption {
-      description = "PAM configuration for mysql";
-      type = submodule {
-        options = {
-          dn = mkOption { description = "DN to connect as to check users"; type = str; };
-          password = mkOption { description = "DN password to connect as to check users"; type = str; };
-          filter = mkOption { description = "filter to match users"; type = str; };
-        };
-      };
-    };
-  };
-  mkMysqlOptions = name: more: mkOption {
-    description = "${name} mysql configuration";
-    type = submodule {
-      options = mysqlOptions // {
-        database = mkOption { description = "${name} database"; type = str; };
-        user = mkOption { description = "${name} user"; type = str; };
-        password = mkOption { description = "mysql password of the ${name} user"; type = str; };
-      } // more;
-    };
-  };
-  psqlOptions = {
-    host = mkOption { description = "Host to access Postgresql"; type = str; };
-    port = mkOption { description = "Port to access Postgresql"; type = str; };
-    socket = mkOption { description = "Socket to access Postgresql"; type = path; };
-    pam = mkOption {
-      description = "PAM configuration for psql";
-      type = submodule {
-        options = {
-          dn = mkOption { description = "DN to connect as to check users"; type = str; };
-          password = mkOption { description = "DN password to connect as to check users"; type = str; };
-          filter = mkOption { description = "filter to match users"; type = str; };
-        };
-      };
-    };
-  };
-  mkPsqlOptions = name: mkOption {
-    description = "${name} psql configuration";
-    type = submodule {
-      options = psqlOptions // {
-        database = mkOption { description = "${name} database"; type = str; };
-        schema = mkOption { description = "${name} schema"; type = nullOr str; default = null; };
-        user = mkOption { description = "${name} user"; type = str; };
-        password = mkOption { description = "psql password of the ${name} user"; type = str; };
-      };
-    };
-  };
-  redisOptions = {
-    host = mkOption { description = "Host to access Redis"; type = str; };
-    port = mkOption { description = "Port to access Redis"; type = str; };
-    socket = mkOption { description = "Socket to access Redis"; type = path; };
-    dbs = mkOption {
-      description = "Attrs of db number. Each number should be unique to avoid collision!";
-      type = attrsOf str;
-    };
-    spiped_key = mkOption {
-      type = str;
-      description = ''
-        Key to use with spiped to make a secure channel to replication
-        '';
-    };
-    predixy = mkOption {
-      description = "Predixy configuration. Unused yet";
-      type = submodule {
-        options = {
-          read = mkOption { type = str; description = "Read password"; };
-        };
-      };
-    };
-  };
-  mkRedisOptions = name: mkOption {
-    description = "${name} redis configuration";
-    type = submodule {
-      options = redisOptions // {
-        db = mkOption { description = "${name} database"; type = str; };
-      };
-    };
-  };
-  smtpOptions = {
-    host = mkOption { description = "Host to access SMTP"; type = str; };
-    port = mkOption { description = "Port to access SMTP"; type = str; };
-  };
-  mkSmtpOptions = name: mkOption {
-    description = "${name} smtp configuration";
-    type = submodule {
-      options = smtpOptions // {
-        email = mkOption { description = "${name} email"; type = str; };
-        password = mkOption { description = "SMTP password of the ${name} user"; type = str; };
-      };
-    };
-  };
-  hostEnv = submodule {
-    options = {
-      fqdn = mkOption {
-        description = "Host FQDN";
-        type = str;
-      };
-      users = mkOption {
-        type = unspecified;
-        default = pkgs: [];
-        description = ''
-          Sublist of users from realUsers. Function that takes pkgs as
-          argument and gives an array as a result
-        '';
-      };
-      emails = mkOption {
-        default = [];
-        description = "List of e-mails that the server can be a sender of";
-        type = listOf str;
-      };
-      ldap = mkOption {
-        description = ''
-          LDAP credentials for the host
-        '';
-        type = submodule {
-          options = {
-            password = mkOption { type = str; description = "Password for the LDAP connection"; };
-            dn = mkOption { type = str; description = "DN for the LDAP connection"; };
-          };
-        };
-      };
-      mx = mkOption {
-        description = "subdomain and priority for MX server";
-        default = { enable = false; };
-        type = submodule {
-          options = {
-            enable = mkEnableOption "Enable MX";
-            subdomain = mkOption { type = nullOr str; description = "Subdomain name (mx-*)"; };
-            priority = mkOption { type = nullOr str; description = "Priority"; };
-          };
-        };
-      };
-      ips = mkOption {
-        description = ''
-          attrs of ip4/ip6 grouped by section
-        '';
-        type = attrsOf (submodule {
-          options = {
-            ip4 = mkOption {
-              type = str;
-              description = ''
-                ip4 address of the host
-              '';
-            };
-            ip6 = mkOption {
-              type = listOf str;
-              default = [];
-              description = ''
-                ip6 addresses of the host
-              '';
-            };
-          };
-        });
-      };
-    };
-  };
-in
-{
-  options.myEnv = {
-    servers = mkOption {
-      description = ''
-        Attrs of servers information in the cluster (not necessarily handled by nixops)
-      '';
-      default = {};
-      type = attrsOf hostEnv;
-    };
-    hetznerCloud = mkOption {
-      description = ''
-        Hetzner Cloud credential information
-      '';
-      type = submodule {
-        options = {
-          authToken = mkOption {
-            type = str;
-            description = ''
-              The API auth token.
-            '';
-          };
-        };
-      };
-    };
-    hetzner = mkOption {
-      description = ''
-        Hetzner credential information
-      '';
-      type = submodule {
-        options = {
-          user = mkOption { type = str; description = "User"; };
-          pass = mkOption { type = str; description = "Password"; };
-        };
-      };
-    };
-    sshd = mkOption {
-      description = ''
-        sshd service credential information
-      '';
-      type = submodule {
-        options = {
-          rootKeys = mkOption { type = attrsOf str; description = "Keys of root users"; };
-          ldap = mkOption {
-            description = ''
-              LDAP credentials for cn=ssh,ou=services,dc=immae,dc=eu dn
-            '';
-            type = submodule {
-              options = {
-                password = mkOption { description = "Password"; type = str; };
-              };
-            };
-          };
-        };
-      };
-    };
-    ports = mkOption {
-      description = ''
-        non-standard reserved ports. Must be unique!
-      '';
-      type = attrsOf port;
-      default = {};
-      apply = let
-        noDupl = x: builtins.length (builtins.attrValues x) == builtins.length (unique (builtins.attrValues x));
-      in
-        x: if isAttrs x && noDupl x then x else throw "Non unique values for ports";
-    };
-    httpd = mkOption {
-      description = ''
-        httpd service credential information
-      '';
-      type = submodule {
-        options = {
-          ldap = mkOption {
-            description = ''
-              LDAP credentials for cn=httpd,ou=services,dc=immae,dc=eu dn
-            '';
-            type = submodule {
-              options = {
-                password = mkOption { description = "Password"; type = str; };
-              };
-            };
-          };
-        };
-      };
-    };
-    smtp = mkOption {
-      type = submodule { options = smtpOptions; };
-      description = "SMTP configuration";
-    };
-    ldap = mkOption {
-      description = ''
-        LDAP server configuration
-        '';
-      type = submodule {
-        options = ldapOptions;
-      };
-    };
-    databases = mkOption {
-      description = "Databases configuration";
-      type = submodule {
-        options = {
-          mysql = mkOption {
-            type = submodule { options = mysqlOptions; };
-            description = "Mysql configuration";
-          };
-          redis = mkOption {
-            type = submodule { options = redisOptions; };
-            description = "Redis configuration";
-          };
-          postgresql = mkOption {
-            type = submodule { options = psqlOptions; };
-            description = "Postgresql configuration";
-          };
-        };
-      };
-    };
-    jabber = mkOption {
-      description = "Jabber configuration";
-      type = submodule {
-        options = {
-          postfix_user_filter = mkOption { type = str; description = "Postfix filter to get xmpp users"; };
-          ldap = mkLdapOptions "Jabber" {};
-          postgresql = mkPsqlOptions "Jabber";
-        };
-      };
-    };
-    realUsers = mkOption {
-      description = ''
-        Attrset of function taking pkgs as argument.
-        Real users settings, should provide a subattr of users.users.<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";
-  };
-}
diff --git a/modules/private/gemini/default.nix b/modules/private/gemini/default.nix
deleted file mode 100644 (file)
index ffe8a12..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-{ lib, config, pkgs, ... }:
-let
-  configFile = pkgs.writeText "config.yaml" ''
-    listen: ":1965"
-    hosts:
-      immae.eu:
-        cert: /var/lib/acme/immae/full.pem
-        key: /var/lib/acme/immae/key.pem
-        paths:
-          - path: /
-            root: ${./public}
-  '';
-in
-{
-  options.myServices.gemini.enable = lib.mkEnableOption "enable Gemini capsule";
-  config = lib.mkIf config.myServices.gemini.enable {
-    networking.firewall.allowedTCPPorts = [ 1965 ];
-    systemd.services.gemini = {
-      description = "Gemini capsule server";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" ];
-      serviceConfig.ExecStart = "${pkgs.twins}/bin/twins -config ${configFile}";
-      serviceConfig.Type = "simple";
-    };
-  };
-}
diff --git a/modules/private/gitolite/default.nix b/modules/private/gitolite/default.nix
deleted file mode 100644 (file)
index 6a74734..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-    cfg = config.myServices.gitolite;
-in {
-  options.myServices.gitolite = {
-    enable = lib.mkEnableOption "my gitolite service";
-    gitoliteDir = lib.mkOption {
-      type = lib.types.str;
-      default = "/var/lib/gitolite";
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    myServices.ssh.modules = [{
-      snippet = builtins.readFile ./ldap_gitolite.sh;
-      dependencies = [ pkgs.gitolite ];
-    }];
-    networking.firewall.allowedTCPPorts = [ 9418 ];
-
-    secrets.keys."gitolite/ldap_password" = {
-      user = "gitolite";
-      group = "gitolite";
-      permissions = "0400";
-      text = config.myEnv.tools.gitolite.ldap.password;
-    };
-
-    services.gitDaemon = {
-      enable = true;
-      user = "gitolite";
-      group = "gitolite";
-      basePath = "${cfg.gitoliteDir}/repositories";
-    };
-
-    system.activationScripts.gitolite = let
-      deps = [ pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.coreutils ];
-      gitolite_ldap_groups = pkgs.runCommand "gitolite_ldap_groups.sh" {
-        buildInputs = [ pkgs.makeWrapper ];
-      } ''
-        makeWrapper "${./gitolite_ldap_groups.sh}" "$out" \
-          --prefix PATH : ${lib.makeBinPath deps} \
-          --set LDAP_PASS_PATH ${config.secrets.fullPaths."gitolite/ldap_password"}
-        '';
-    in {
-      deps = [ "users" ];
-      text = ''
-        if [ -d ${cfg.gitoliteDir} ]; then
-          ln -sf ${gitolite_ldap_groups} ${cfg.gitoliteDir}/gitolite_ldap_groups.sh
-          chmod g+rx ${cfg.gitoliteDir}
-        fi
-        if [ -f ${cfg.gitoliteDir}/projects.list ]; then
-          chmod g+r ${cfg.gitoliteDir}/projects.list
-        fi
-      '';
-    };
-
-    users.users.wwwrun.extraGroups = [ "gitolite" ];
-    users.users.gitolite.extraGroups = [ "keys" ];
-
-    users.users.gitolite.packages = let
-      python-packages = python-packages: with python-packages; [
-        simplejson
-        urllib3
-        sleekxmpp
-      ];
-    in
-      [
-        (pkgs.python3.withPackages python-packages)
-        pkgs.nettools
-        pkgs.findutils
-      ];
-    # Installation: https://git.immae.eu/mantisbt/view.php?id=93
-    services.gitolite = {
-      enable = true;
-      adminPubkey = config.myEnv.sshd.rootKeys.immae_dilion;
-    };
-  };
-}
diff --git a/modules/private/gitolite/ldap_gitolite.sh b/modules/private/gitolite/ldap_gitolite.sh
deleted file mode 100644 (file)
index 23cb2bf..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh
-LDAP_GITOLITE_MEMBER="cn=users,cn=gitolite,ou=services,dc=immae,dc=eu"
-GITOLITE_SHELL=$(which gitolite-shell)
-
-if [[ $user == gitolite ]]; then
-  ldap_search '(&(memberOf='$LDAP_GITOLITE_MEMBER')('$KEY'=*))' $KEY | \
-    while read line ;
-    do
-      if [ ! -z "$line" ]; then
-        if [[ $line == dn* ]]; then
-          user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line")
-          if [ -n "$user" ]; then
-            if [[ $user == "immae" ]] || [[ $user == "denise" ]]; then
-              # Capitalize first letter (backward compatibility)
-              user=$(sed -r 's/^([a-z])/\U\1/' <<< "$user")
-            fi
-          else
-            # Service fake user
-            user=$(sed -n 's/.*cn=\([^,]*\).*/\1/p' <<< "$line")
-          fi
-        elif [[ $line == $KEY* ]]; then
-          key=$(clean_key_line git "$line")
-          if [ ! -z "$key" ]; then
-            if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
-              echo -n 'command="'$GITOLITE_SHELL' '$user'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty '
-              echo $key
-            fi
-          fi
-        fi
-      fi
-    done
-  exit 0
-fi
diff --git a/modules/private/irc.nix b/modules/private/irc.nix
deleted file mode 100644 (file)
index bc0bfb4..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  cfg = config.myServices.irc;
-in
-{
-  options.myServices = {
-    ircCerts = lib.mkOption {
-      description = "Default ircconfigurations for certificates as accepted by acme";
-    };
-    irc.enable = lib.mkOption {
-      type = lib.types.bool;
-      default = false;
-      description = ''
-        Whether to enable irc stuff.
-      '';
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    security.acme.certs."irc" = config.myServices.ircCerts // {
-      domain = "irc.immae.eu";
-      postRun = ''
-        systemctl restart stunnel.service
-      '';
-    };
-
-    networking.firewall.allowedTCPPorts = [ 6697 ];
-    services.bitlbee = with pkgs; {
-      enable = true;
-      authMode = "Registered";
-      libpurple_plugins = [
-        purple-hangouts
-        purple-matrix
-      ];
-      plugins = [
-        bitlbee-mastodon
-        bitlbee-facebook
-        bitlbee-discord
-        bitlbee-steam
-      ];
-    };
-
-    services.stunnel = {
-      enable = true;
-      servers = {
-        bitlbee = {
-          accept = 6697;
-          connect = 6667;
-          cert = "${config.security.acme.certs.irc.directory}/full.pem";
-        };
-      };
-    };
-  };
-}
diff --git a/modules/private/loginctl-linger.nix b/modules/private/loginctl-linger.nix
deleted file mode 100644 (file)
index e6b9f23..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-{ config, lib, pkgs, ... }:
-
-# https://github.com/michalrus/dotfiles/commit/ebd5fa9583f82589f23531647aa677feb3f8d344#diff-4d353005ef5b3e37f33c07332b8523edR1
-# A temporary hack to `loginctl enable-linger $somebody` (for
-# multiplexer sessions to last), until this one is unresolved:
-# https://github.com/NixOS/nixpkgs/issues/3702
-#
-# Usage: `users.extraUsers.somebody.linger = true` or slt.
-
-with lib;
-
-let
-
-  dataDir = "/var/lib/systemd/linger";
-
-  lingeringUsers = map (u: u.name) (attrValues (flip filterAttrs config.users.users (n: u: u.linger)));
-
-  lingeringUsersFile = builtins.toFile "lingering-users"
-    (concatStrings (map (s: "${s}\n")
-      (sort (a: b: a < b) lingeringUsers))); # this sorting is important for `comm` to work correctly
-
-  updateLingering = pkgs.writeScript "update-lingering" ''
-    if [ ! -e ${dataDir} ]; then
-      install -m 0755 -o root -g root -d ${dataDir}
-    fi
-    if [ -e ${dataDir} ] ; then
-      ls ${dataDir} | sort | comm -3 -1 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl disable-linger
-      ls ${dataDir} | sort | comm -3 -2 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl  enable-linger
-    fi
-  '';
-
-in
-
-{
-  options = {
-    users.users = mkOption {
-      options = [{
-        linger = mkEnableOption "lingering for the user";
-      }];
-    };
-  };
-
-  config = {
-    system.activationScripts.update-lingering =
-      stringAfter [ "users" ] updateLingering;
-  };
-}
diff --git a/modules/private/mail/default.nix b/modules/private/mail/default.nix
deleted file mode 100644 (file)
index 2d405c6..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-{ lib, pkgs, config, ... }:
-{
-  imports = [
-    ./milters.nix
-    ./postfix.nix
-    ./dovecot.nix
-    ./relay.nix
-    ./rspamd.nix
-    ./opensmtpd.nix
-    ./sympa.nix
-  ];
-  options.myServices.mail.enable = lib.mkEnableOption "enable Mail services";
-  options.myServices.mailRelay.enable = lib.mkEnableOption "enable Mail relay services";
-  options.myServices.mailBackup.enable = lib.mkEnableOption "enable MX backup services";
-
-  config = lib.mkIf config.myServices.mail.enable {
-    security.acme.certs."mail" = config.myServices.certificates.certConfig // {
-      domain = config.hostEnv.fqdn;
-      extraDomains = let
-        zonesWithMx = builtins.filter (zone:
-          lib.attrsets.hasAttr "withEmail" zone && lib.lists.length zone.withEmail > 0
-        ) config.myEnv.dns.masterZones;
-        mxs = map (zone: "${config.hostEnv.mx.subdomain}.${zone.name}") zonesWithMx;
-      in builtins.listToAttrs (map (mx: lib.attrsets.nameValuePair mx null) mxs);
-    };
-    # This is for clients that don’t support elliptic curves (e.g.
-    # printer)
-    security.acme.certs."mail-rsa" = config.myServices.certificates.certConfig // {
-      domain = config.hostEnv.fqdn;
-      keyType = "rsa4096";
-      extraDomains = let
-        zonesWithMx = builtins.filter (zone:
-          lib.attrsets.hasAttr "withEmail" zone && lib.lists.length zone.withEmail > 0
-        ) config.myEnv.dns.masterZones;
-        mxs = map (zone: "${config.hostEnv.mx.subdomain}.${zone.name}") zonesWithMx;
-      in builtins.listToAttrs (map (mx: lib.attrsets.nameValuePair mx null) mxs);
-    };
-    systemd.slices.mail = {
-      description = "Mail slice";
-    };
-  };
-}
diff --git a/modules/private/mail/milters.nix b/modules/private/mail/milters.nix
deleted file mode 100644 (file)
index 4b93a7a..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-{ lib, pkgs, config, name, ... }:
-{
-  imports =
-       builtins.attrValues (import ../../../lib/flake-compat.nix ../../../flakes/private/openarc).nixosModules
-    ++ builtins.attrValues (import ../../../lib/flake-compat.nix ../../../flakes/private/opendmarc).nixosModules;
-
-  options.myServices.mail.milters.sockets = lib.mkOption {
-    type = lib.types.attrsOf lib.types.path;
-    default = {
-      opendkim = "/run/opendkim/opendkim.sock";
-      opendmarc = config.services.opendmarc.socket;
-      openarc = config.services.openarc.socket;
-    };
-    readOnly = true;
-    description = ''
-      milters sockets
-      '';
-  };
-  config = lib.mkIf (config.myServices.mail.enable || config.myServices.mailBackup.enable) {
-    secrets.keys = {
-      "opendkim" = {
-        isDir = true;
-        user = config.services.opendkim.user;
-        group = config.services.opendkim.group;
-        permissions = "0550";
-      };
-      "opendkim/eldiron.private" = {
-        user = config.services.opendkim.user;
-        group = config.services.opendkim.group;
-        permissions = "0400";
-        text = config.myEnv.mail.dkim.eldiron.private;
-      };
-      "opendkim/eldiron.txt" = {
-        user = config.services.opendkim.user;
-        group = config.services.opendkim.group;
-        permissions = "0444";
-        text = ''
-          eldiron._domainkey   IN      TXT     ${config.myEnv.mail.dkim.eldiron.public}'';
-      };
-    };
-    users.users."${config.services.opendkim.user}".extraGroups = [ "keys" ];
-    services.opendkim = {
-      enable = true;
-      socket = "local:${config.myServices.mail.milters.sockets.opendkim}";
-      domains = builtins.concatStringsSep "," (lib.flatten (map
-        (zone: map
-          (e: "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}")
-          (zone.withEmail or [])
-        )
-        config.myEnv.dns.masterZones
-      ));
-      keyPath = config.secrets.fullPaths."opendkim";
-      selector = "eldiron";
-      configFile = pkgs.writeText "opendkim.conf" ''
-        SubDomains        yes
-        UMask             002
-        AlwaysAddARHeader yes
-        '';
-      group = config.services.postfix.group;
-    };
-    systemd.services.opendkim.serviceConfig.Slice = "mail.slice";
-    systemd.services.opendkim.preStart = lib.mkBefore ''
-      # Skip the prestart script as keys are handled in secrets
-      exit 0
-      '';
-    services.filesWatcher.opendkim = {
-      restart = true;
-      paths = [
-        config.secrets.fullPaths."opendkim/eldiron.private"
-      ];
-    };
-
-    systemd.services.milter_verify_from = {
-      description  = "Verify from milter";
-      after = [ "network.target" ];
-      wantedBy = [ "multi-user.target" ];
-
-      serviceConfig = {
-        Slice = "mail.slice";
-        User = "postfix";
-        Group = "postfix";
-        ExecStart = let python = pkgs.python3.withPackages (p: [ p.pymilter ]);
-          in "${python}/bin/python ${./verify_from.py} -s /run/milter_verify_from/verify_from.sock";
-        RuntimeDirectory = "milter_verify_from";
-      };
-    };
-  };
-}
diff --git a/modules/private/mail/opensmtpd.nix b/modules/private/mail/opensmtpd.nix
deleted file mode 100644 (file)
index e05bba9..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-{ lib, pkgs, config, name, ... }:
-{
-  config = lib.mkIf config.myServices.mailRelay.enable {
-    secrets.keys."opensmtpd/creds" = {
-      user = "smtpd";
-      group = "smtpd";
-      permissions = "0400";
-      text = ''
-        eldiron    ${name}:${config.hostEnv.ldap.password}
-        '';
-    };
-    users.users.smtpd.extraGroups = [ "keys" ];
-    services.opensmtpd = {
-      enable = true;
-      serverConfiguration = let
-        filter-rewrite-from = pkgs.runCommand "filter-rewrite-from.py" {
-          buildInputs = [ pkgs.python3 ];
-        } ''
-          cp ${./filter-rewrite-from.py} $out
-          patchShebangs $out
-        '';
-      in ''
-        table creds \
-          "${config.secrets.fullPaths."opensmtpd/creds"}"
-        # FIXME: filtering requires 6.6, uncomment following lines when
-        # upgrading
-        # filter "fixfrom" \
-        #   proc-exec "${filter-rewrite-from} ${name}@immae.eu"
-        # listen on socket filter "fixfrom"
-        action "relay-rewrite-from" relay \
-          helo ${config.hostEnv.fqdn} \
-          host smtp+tls://eldiron@eldiron.immae.eu:587 \
-          auth <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;
-    };
-  };
-}
diff --git a/modules/private/monitoring/default.nix b/modules/private/monitoring/default.nix
deleted file mode 100644 (file)
index 0783c2f..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-{ config, pkgs, lib, name, nodes, ... }:
-let
-  cfg = config.myServices.monitoring;
-  activatedPlugins = [ "memory" "command" "bandwidth" ]
-    ++ (if cfg.master then (masterObjects.activatedPlugins or []) else [])
-    ++ (if cfg.master then (lib.flatten (map (v: v.activatedPlugins or []) otherObjects)) else [])
-    ++ (hostObjects.activatedPlugins or [])
-    ++ (if cfg.master then ["notify-primary"] else ["notify-secondary"]);
-  allPluginsConfig = import ./myplugins.nix {
-    inherit pkgs lib config;
-    sudo = "/run/wrappers/bin/sudo";
-  };
-  mypluginsConfig = lib.getAttrs activatedPlugins allPluginsConfig;
-  myplugins = let
-    mypluginsChunk = builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (k: v: v.chunk or "") mypluginsConfig);
-  in pkgs.runCommand "buildplugins" {
-    buildInputs = [ pkgs.makeWrapper pkgs.perl ];
-  } ''
-    mkdir $out
-    ${mypluginsChunk}
-    '';
-  toObjects = pkgs.callPackage ./to_objects.nix {};
-  commonConfig = {
-    dilion = {
-      processWarn = "250"; processAlert = "400";
-      loadWarn = "1.0"; loadAlert = "1.2";
-      interface = "eth0";
-    };
-    eldiron = {
-      processWarn = "550"; processAlert = "650";
-      loadWarn = "1.0"; loadAlert = "1.2";
-      interface = "eth0";
-    };
-    backup-2 = {
-      processWarn = "60"; processAlert = "70";
-      loadWarn = "1.0"; loadAlert = "2.0";
-      interface = "ens3";
-    };
-    monitoring-1 = {
-      processWarn = "50"; processAlert = "60";
-      loadWarn = "4.0"; loadAlert = "6.0";
-      load15Warn = "1.0"; load15Alert = "2.0";
-      interface = "ens3";
-    };
-    quatresaisons = {
-      processWarn = "250"; processAlert = "400";
-      loadWarn = "1.0"; loadAlert = "1.2";
-      interface = "eth0";
-    };
-  };
-  externalObjects = lib.genAttrs [ "tiboqorl-fr" ]
-    (n: pkgs.callPackage (./. + "/objects_" + n + ".nix") { inherit emailCheck; });
-  masterPassiveObjects = let
-    passiveNodes = lib.attrsets.filterAttrs (n: _: builtins.elem n ["backup-2" "eldiron" "quatresaisons" "dilion"]) nodes;
-    toPassiveServices = map (s: s.passiveInfo.filter s // s.passiveInfo);
-    passiveServices = lib.flatten (lib.attrsets.mapAttrsToList
-      (_: n: toPassiveServices n.config.myServices.monitoring.services)
-      passiveNodes
-      ) ++ lib.flatten (lib.attrsets.mapAttrsToList
-      (_: n: toPassiveServices n.service)
-      externalObjects);
-  in {
-    service = passiveServices;
-    host = lib.lists.foldr
-      (a: b: a//b)
-      {}
-      (lib.attrsets.mapAttrsToList (_: h: h.config.myServices.monitoring.hosts) passiveNodes
-      ++ lib.attrsets.mapAttrsToList (_: n: n.host) externalObjects);
-  };
-  emailCheck = host: hostFQDN: let
-    allCfg = config.myEnv.monitoring.email_check;
-    cfg = allCfg."${host}";
-    reverseTargets = builtins.attrNames (lib.attrsets.filterAttrs (k: v: builtins.elem host v.targets) allCfg);
-    to_email = cfg': host':
-      let sep = if lib.strings.hasInfix "+" cfg'.mail_address then "_" else "+";
-      in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}";
-    mails_to_send = builtins.concatStringsSep "," (map (n: to_email allCfg."${n}" host) cfg.targets);
-    mails_to_receive = builtins.concatStringsSep "," (map (n: "${to_email cfg n}:${n}") reverseTargets);
-    command = if cfg.local
-    then
-      [ "check_emails_local" "/var/lib/naemon/checks/email" mails_to_send mails_to_receive ]
-    else
-      [ "check_emails" cfg.login cfg.port mails_to_send mails_to_receive ];
-  in
-    {
-      service_description = "${hostFQDN} email service is active";
-      use = "mail-service";
-      host_name = hostFQDN;
-      servicegroups = "webstatus-email";
-      check_command = command;
-    };
-  otherObjects = map
-    (n: (pkgs.callPackage (./. + "/objects_" + n + ".nix") { inherit emailCheck; }))
-    [ "ulminfo-fr" "phare" "eban" ];
-  masterObjects = pkgs.callPackage ./objects_master.nix { inherit config; };
-  commonObjects = pkgs.callPackage ./objects_common.nix ({
-    master = cfg.master;
-    hostFQDN = config.hostEnv.fqdn;
-    hostName = name;
-    inherit mypluginsConfig;
-  } // builtins.getAttr name commonConfig);
-  hostObjects =
-    let
-      specific_file = ./. + "/objects_" + name + ".nix";
-    in
-      lib.attrsets.optionalAttrs
-        (builtins.pathExists specific_file)
-        (pkgs.callPackage specific_file {
-          inherit config nodes emailCheck;
-          hostFQDN = config.hostEnv.fqdn;
-          hostName = name;
-        });
-  objectsFiles = lib.mapAttrs' (name: value: lib.nameValuePair
-    "=/${name}/objects.conf" { alias = pkgs.writeText "objects.conf" (toObjects value); }
-  ) externalObjects;
-in
-{
-  options = {
-    myServices.monitoring = {
-      enable = lib.mkOption {
-        type = lib.types.bool;
-        default = false;
-        description = ''
-          Whether to enable monitoring.
-        '';
-      };
-      master = lib.mkOption {
-        type = lib.types.bool;
-        default = false;
-        description = ''
-          This instance is the master instance
-        '';
-      };
-      hosts = lib.mkOption {
-        readOnly = true;
-        description = "Hosts list for this host";
-        default = (commonObjects.host or {}) // (hostObjects.host or {});
-      };
-      services = lib.mkOption {
-        readOnly = true;
-        description = "Services list for this host";
-        default = commonObjects.service ++ hostObjects.service;
-      };
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    services.nginx = lib.mkIf config.myServices.status.enable {
-      virtualHosts."status.immae.eu".locations = objectsFiles // {
-        "=/common/immae.cfg" = {
-          alias = pkgs.writeText "immae.cfg" ''
-            # put me for instance in /etc/naemon/module-conf.d/immae.cfg
-            # Make sure that you have include_dir=module-conf.d in
-            # naemon.cfg
-            log_initial_states=1
-            date_format=iso8601
-            admin_email=${config.myEnv.monitoring.email}
-            obsess_over_services=1
-            ocsp_command=notify-master
-          '';
-        };
-        "=/common/resource.cfg" = {
-          alias = pkgs.writeText "resource.cfg" ''
-            # Resource.cfg file
-            # Replace this with path to monitoring plugins
-            $USER1$=@@COMMON_PLUGINS@@
-            # Replace this with a path to scripts from
-            # https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/tree/modules/private/monitoring/plugins
-            $USER2$=@@IMMAE_PLUGINS@@
-            $USER200$=https://status.immae.eu/
-            $USER201$=@@TOKEN@@
-          '';
-        };
-      };
-    };
-
-    security.sudo.extraRules = let
-      pluginsSudo = lib.lists.remove null (lib.attrsets.mapAttrsToList (k: v:
-        if (v ? sudo)
-        then ({ users = [ "naemon" ]; } // (v.sudo myplugins))
-        else null) mypluginsConfig);
-    in [
-      {
-        commands = [
-          { command = "${pkgs.mdadm}/bin/mdadm --monitor --scan -1"; options = [ "NOPASSWD" ]; }
-          { command = "${pkgs.postfix}/bin/mailq"; options = [ "NOPASSWD" ]; }
-        ];
-        users = [ "naemon" ];
-        runAs = "root";
-      }
-    ] ++ pluginsSudo;
-    environment.etc."mdadm.conf" = {
-      enable = true;
-      mode = "0644";
-      user = "root";
-      text = "MAILADDR ${config.myEnv.monitoring.email}";
-    };
-
-    secrets.keys = {
-      "naemon/id_rsa" = {
-        user = "naemon";
-        group = "naemon";
-        permissions = "0400";
-        text = config.myEnv.monitoring.ssh_secret_key;
-      };
-    } // lib.optionalAttrs cfg.master (
-      lib.mapAttrs' (k: v: lib.nameValuePair "${k}_access_key" {
-        user = "naemon";
-        group = "naemon";
-        permissions = "0400";
-        text = ''
-          export AWS_ACCESS_KEY_ID="${v.accessKeyId}"
-          export AWS_SECRET_ACCESS_KEY="${v.secretAccessKey}"
-          export BASE_URL="${v.remote "immae-eldiron"}"
-        '';
-      }) config.myEnv.backup.remotes
-    );
-    # needed since extraResource is not in the closure
-    systemd.services.naemon.path = [ myplugins ];
-    services.naemon = {
-      enable = true;
-      extraConfig = ''
-        use_syslog=1
-        log_initial_states=1
-        date_format=iso8601
-        admin_email=${config.myEnv.monitoring.email}
-      '' + lib.optionalString (!cfg.master) ''
-        obsess_over_services=1
-        ocsp_command=notify-master
-      '' + lib.optionalString (cfg.master) ''
-        broker_module=${pkgs.naemon-livestatus}/lib/naemon-livestatus/livestatus.so ${config.services.naemon.runDir}/live
-        broker_module=${pkgs.status_engine.module}/lib/status-engine/naemon/statusengine-${pkgs.naemon.status_engine_version}.o use_service_perfdata=1 use_process_data=0 use_system_command_data=0 use_external_command_data=0 use_flapping_data=0 use_program_status_data=0 use_notification_data=0 use_contact_status_data=0 use_contact_notification_data=0 use_event_handler_data=0 use_object_data=0
-      '';
-      extraResource = let
-        resources = [hostObjects.resources or {}] ++ (lib.mapAttrsToList (k: v: v.resources or {}) mypluginsConfig);
-        joined = lib.zipAttrsWith (n: v: if builtins.length (lib.unique v) == 1 then builtins.head v else abort "Non-unique resources names") resources;
-        joinedStr = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "$" + "${k}$=${v}") joined);
-      in ''
-        $USER2$=${myplugins}
-        ${joinedStr}
-      '';
-      objectDefs = toObjects commonObjects
-        + toObjects hostObjects
-        + lib.optionalString cfg.master (toObjects masterObjects)
-        + lib.optionalString cfg.master (toObjects masterPassiveObjects)
-        + lib.optionalString cfg.master (builtins.concatStringsSep "\n" (map toObjects otherObjects));
-    };
-  };
-}
diff --git a/modules/private/monitoring/objects_backup-2.nix b/modules/private/monitoring/objects_backup-2.nix
deleted file mode 100644 (file)
index 28032a4..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-{ config, pkgs, lib, hostFQDN, emailCheck, ... }:
-let
-  defaultPassiveInfo = {
-    filter = lib.attrsets.filterAttrs
-      (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_");
-    use = "external-passive-service";
-    freshness_threshold = "450";
-    retry_interval = "1";
-    servicegroups = "webstatus-resources";
-    host_name = hostFQDN;
-  };
-in
-{
-  activatedPlugins = [ "file_date" "mysql" "openldap" "redis" "emails" ];
-  service = [
-    (emailCheck "backup-2" hostFQDN // {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; freshness_threshold = "1350"; };
-    })
-    {
-      passiveInfo = defaultPassiveInfo;
-      service_description = "Size on /backup2 partition";
-      use = "local-service";
-      check_command = ["check_local_disk" "10%" "5%" "/backup2"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; };
-      service_description = "Last backup in /backup2/phare is not too old";
-      use = "local-service";
-      check_command = ["check_last_file_date" "/backup2/phare" "14" "backup"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; };
-      service_description = "Last backup in /backup2/dilion is not too old";
-      use = "local-service";
-      check_command = ["check_last_file_date" "/backup2/dilion" "14" "backup"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; };
-      service_description = "Last backup in /backup2/ulminfo is not too old";
-      use = "local-service";
-      check_command = ["check_last_file_date" "/backup2/ulminfo" "14" "backup"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; };
-      service_description = "Last postgresql dump in /backup2/eldiron/postgresql_backup is not too old";
-      use = "local-service";
-      check_command = ["check_last_file_date" "/backup2/eldiron/postgresql_backup" "7" "postgres"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; };
-      service_description = "Redis replication for eldiron is up to date";
-      use = "local-service";
-      check_command = ["check_redis_replication" "/run/redis_eldiron/redis.sock"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; };
-      service_description = "Last redis dump in /backup2/eldiron/redis_backup is not too old";
-      use = "local-service";
-      check_command = ["check_last_file_date" "/backup2/eldiron/redis_backup" "7" "redis"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; };
-      service_description = "Mysql replication for eldiron is up to date";
-      use = "local-service";
-      check_command = ["check_mysql_replication" "/run/mysqld_eldiron/mysqld.sock" config.secrets.fullPaths."mysql_replication/eldiron/client"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; };
-      service_description = "Last mysql dump in /backup2/eldiron/mysql_backup is not too old";
-      use = "local-service";
-      check_command = ["check_last_file_date" "/backup2/eldiron/mysql_backup" "7" "mysql"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; };
-      service_description = "Openldap replication for eldiron is up to date";
-      use = "local-service";
-      check_command = let
-        name = "eldiron";
-        hcfg = config.myServices.databasesReplication.openldap.hosts.eldiron;
-        base = config.myServices.databasesReplication.openldap.base;
-        eldiron_schemas = pkgs.callPackage ../databases/openldap/eldiron_schemas.nix {};
-        ldapConfig = pkgs.writeText "slapd.conf" ''
-          include ${pkgs.openldap}/etc/schema/core.schema
-          include ${pkgs.openldap}/etc/schema/cosine.schema
-          include ${pkgs.openldap}/etc/schema/inetorgperson.schema
-          include ${pkgs.openldap}/etc/schema/nis.schema
-          ${eldiron_schemas}
-          moduleload  back_hdb
-          backend     hdb
-          database    hdb
-
-          suffix    "${hcfg.base}"
-          directory ${base}/${name}/openldap
-          '';
-      in [
-        "check_openldap_replication"
-        hcfg.url
-        hcfg.dn
-        config.secrets.fullPaths."openldap_replication/eldiron/replication_password"
-        hcfg.base
-        ldapConfig
-      ];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; };
-      service_description = "Last openldap dump in /backup2/eldiron/openldap_backup is not too old";
-      use = "local-service";
-      check_command = ["check_last_file_date" "/backup2/eldiron/openldap_backup" "7" "openldap"];
-    }
-  ];
-}
diff --git a/modules/private/monitoring/objects_dilion.nix b/modules/private/monitoring/objects_dilion.nix
deleted file mode 100644 (file)
index 16b3c64..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-{ lib, hostFQDN, emailCheck, ... }:
-let
-  defaultPassiveInfo = {
-    filter = lib.attrsets.filterAttrs
-      (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_");
-    use = "external-passive-service";
-    freshness_threshold = "450";
-    retry_interval = "1";
-    servicegroups = "webstatus-resources";
-    host_name = hostFQDN;
-  };
-  zfs_snapshot = name: {
-    passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
-    service_description = "ZFS snapshot ${name} happened not too long ago";
-    use = "local-service";
-    check_command = ["check_zfs_snapshot" name];
-  };
-in
-{
-  activatedPlugins = [ "zfs" ];
-  service = [
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
-      service_description = "No ZFS pool is degraded";
-      use = "local-service";
-      check_command = ["check_zfs"];
-    }
-    (zfs_snapshot "zpool/backup/eldiron/zpool/root")
-    (zfs_snapshot "zpool/backup/eldiron/zpool/root/etc")
-    (zfs_snapshot "zpool/backup/eldiron/zpool/root/var")
-  ];
-}
diff --git a/modules/private/monitoring/objects_eban.nix b/modules/private/monitoring/objects_eban.nix
deleted file mode 100644 (file)
index df54f6a..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-{ ... }:
-let
-  serviceTemplate = rest: {
-    host_name = "eban.bzh";
-    use = "external-web-service";
-    contacts = "eban";
-    contact_groups = "null";
-    check_interval = "15";
-
-    servicegroups = "webstatus-resources";
-    _webstatus_namespace = "eban";
-  } // rest;
-in
-{
-  activatedPlugins = [ "http" ];
-  contact = {
-    eban = {
-      use = "generic-contact";
-      host_notification_commands = "notify-host-eban-url";
-      service_notification_commands = "notify-service-eban-url";
-    };
-  };
-  host = {
-    "eban.bzh" = {
-      alias = "eban.bzh";
-      address = "eban.bzh";
-      use = "linux-server";
-      hostgroups = "webstatus-hosts";
-      contacts = "eban";
-      contact_groups = "null";
-      _webstatus_name = "Eban";
-      _webstatus_vhost = "status.eban.bzh";
-      _webstatus_namespace = "eban";
-    };
-  };
-  service = [
-    (serviceTemplate {
-      service_description = "Eban website is up and running";
-      check_command = ["check_https" "eban.bzh" "/" "<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/";
-    })
-  ];
-}
diff --git a/modules/private/monitoring/objects_eldiron.nix b/modules/private/monitoring/objects_eldiron.nix
deleted file mode 100644 (file)
index 75e7b0e..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-{ lib, hostFQDN, emailCheck, ... }:
-let
-  defaultPassiveInfo = {
-    filter = lib.attrsets.filterAttrs
-      (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_");
-    use = "external-passive-service";
-    freshness_threshold = "450";
-    retry_interval = "1";
-    servicegroups = "webstatus-resources";
-    host_name = hostFQDN;
-  };
-in
-{
-  activatedPlugins = [ "emails" "postgresql" "zfs" ];
-  service = [
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; };
-      service_description = "Postgresql replication for backup-2 is up to date";
-      use = "local-service";
-      check_command = ["check_postgresql_replication" "backup-2" "/run/postgresql" "5432"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
-      service_description = "No ZFS pool is degraded";
-      use = "local-service";
-      check_command = ["check_zfs"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; };
-      service_description = "mailq is empty";
-      use = "local-service";
-      check_command = ["check_mailq"];
-    }
-    (emailCheck "eldiron" hostFQDN // {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; freshness_threshold = "1350"; };
-    })
-  ];
-}
diff --git a/modules/private/monitoring/objects_master.nix b/modules/private/monitoring/objects_master.nix
deleted file mode 100644 (file)
index 30bfe73..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-{ config, ... }:
-{
-  contact = {
-    immae = config.myEnv.monitoring.contacts.immae // {
-      use = "generic-contact";
-      contactgroups = "admins";
-      host_notification_commands = "notify-host-by-email,notify-by-slack!$USER206$!$USER207$";
-      service_notification_commands = "notify-service-by-email,notify-by-slack!$USER206$!$USER207$";
-    };
-  };
-  command = {
-    check_passive = "$USER1$/check_dummy 3 \"Service result are stale\"";
-  };
-  templates = {
-    service = {
-      external-passive-service = {
-        active_checks_enabled = "0";
-        check_freshness = "1";
-        check_period = "24x7";
-        contact_groups = "admins";
-        event_handler_enabled = "1";
-        flap_detection_enabled = "1";
-        is_volatile = "0";
-        max_check_attempts = "3";
-        notification_interval = "60";
-        notification_options = "w,u,c,r,f,s";
-        notification_period = "24x7";
-        notifications_enabled = "1";
-        passive_checks_enabled = "1";
-        process_perf_data = "1";
-        retain_nonstatus_information = "1";
-        retain_status_information = "1";
-        retry_interval = "2";
-        check_command = "check_passive";
-        _webstatus_namespace = "immae";
-      };
-    };
-  };
-}
diff --git a/modules/private/monitoring/objects_monitoring-1.nix b/modules/private/monitoring/objects_monitoring-1.nix
deleted file mode 100644 (file)
index 563be16..0000000
+++ /dev/null
@@ -1,714 +0,0 @@
-{ config, pkgs, nodes, hostFQDN, emailCheck, lib, ... }:
-{
-  activatedPlugins = [ "dns" "ftp" "git" "http" "imap" "ovh" "tcp" ];
-  host = {
-    # Dummy host for testing
-    # "dummy-host" = {
-    #   alias = "dummy.host";
-    #   address = "dummy.host";
-    #   use = "linux-server";
-    #   check_command = "check_ok";
-    # };
-  };
-  service = [
-    # Dummy service for testing
-    # {
-    #   service_description = "Dummy failing test";
-    #   host_name = "dummy-host";
-    #   use = "local-service";
-    #   check_interval = "0.3";
-    #   max_check_attempts = "1";
-    #   flap_detection_enabled = "0";
-    #   notification_interval = "0.1";
-    #   check_command = "check_critical";
-    # }
-
-    (emailCheck "monitoring-1" hostFQDN)
-
-    {
-      service_description = "ftp has access to database for authentication";
-      host_name = "eldiron.immae.eu";
-      use = "external-service";
-      check_command = "check_ftp_database";
-
-      servicegroups = "webstatus-remote-services";
-      _webstatus_name = "FTP";
-      _webstatus_url = "ftp.immae.eu";
-    }
-
-    {
-      service_description = "gitolite is working";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = "check_git";
-
-      servicegroups = "webstatus-remote-services";
-      _webstatus_name = "Git";
-      _webstatus_url = "git.immae.eu";
-    }
-
-    {
-      service_description = "postfix SSL is up to date";
-      host_name = "eldiron.immae.eu";
-      use = "external-service";
-      check_command = "check_smtp";
-
-      servicegroups = "webstatus-ssl";
-      _webstatus_name = "SMTP";
-      _webstatus_url = "smtp.immae.eu";
-    }
-
-    {
-      service_description = "imap SSL is up to date";
-      host_name = "eldiron.immae.eu";
-      use = "external-service";
-      check_command = ["check_tcp_ssl" "993"];
-
-      servicegroups = "webstatus-ssl";
-      _webstatus_name = "IMAP";
-      _webstatus_url = "imap.immae.eu";
-    }
-
-    {
-      service_description = "imap connection works";
-      host_name = "eldiron.immae.eu";
-      use = "external-service";
-      check_command = "check_imap_connection";
-
-      servicegroups = "webstatus-remote-services,webstatus-email";
-      _webstatus_name = "IMAP";
-      _webstatus_url = "imap.immae.eu";
-    }
-
-    # Third party services
-    {
-      service_description = "OVH account has enough sms";
-      host_name = "eldiron.immae.eu";
-      use = "external-service";
-      check_command = "check_ovh_sms";
-
-      check_interval = "120";
-      notification_interval = "1440";
-    }
-
-    # Backup services
-    # {
-    #   service_description = "eriomem backup is up and not full";
-    #   host_name = "eldiron.immae.eu";
-    #   use = "external-service";
-    #   check_command = "check_backup_eriomem";
-
-    #   check_interval = "120";
-    #   notification_interval = "1440";
-
-    #   servicegroups = "webstatus-backup";
-    # }
-    {
-      service_description = "ovh backup is up and not full";
-      host_name = "eldiron.immae.eu";
-      use = "external-service";
-      check_command = "check_ok";
-
-      check_interval = "120";
-      notification_interval = "1440";
-
-      servicegroups = "webstatus-backup";
-    }
-
-    # DNS services
-    {
-      service_description = "eldiron dns is active and authoritative for aten.pro";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_dns" "aten.pro" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "aten.pro";
-    }
-
-    {
-      service_description = "eldiron dns is active and authoritative for bouya.org";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_dns" "bouya.org" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "bouya.org";
-    }
-
-    {
-      service_description = "eldiron dns is active and authoritative for filedesreves.fr";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_dns" "filedesreves.fr" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "filedesreves.fr";
-    }
-
-    {
-      service_description = "eldiron dns is active and authoritative for ludivinecassal.com";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_dns" "ludivinecassal.com" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "ludivinecassal.com";
-    }
-
-    {
-      service_description = "eldiron dns is active and authoritative for icommandeur.org";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_dns" "icommandeur.org" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "icommandeur.org";
-    }
-
-    {
-      service_description = "eldiron dns is active and authoritative for immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_dns" "immae.eu" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "immae.eu";
-    }
-
-    {
-      service_description = "eldiron dns is active and authoritative for immae.fr";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_dns" "immae.fr" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "immae.fr";
-    }
-
-    {
-      service_description = "eldiron dns is active and authoritative for piedsjaloux.fr";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_dns" "piedsjaloux.fr" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "piedsjaloux.fr";
-    }
-
-    {
-      service_description = "eldiron dns is active and authoritative for saison-photo.org";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_dns" "saison-photo.org" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "saison-photo.org";
-    }
-
-    {
-      service_description = "eldiron dns is active and authoritative for tellesflorian.com";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_dns" "tellesflorian.com" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "tellesflorian.com";
-    }
-
-    {
-      service_description = "eldiron dns is active and authoritative for capitaines.fr";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_dns" "capitaines.fr" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "capitaines.fr";
-    }
-
-    {
-      service_description = "cloudns dns is active and authoritative for aten.pro";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_external_dns" "pns1.cloudns.net" "aten.pro" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "aten.pro (Secondary DNS ClouDNS)";
-    }
-
-    {
-      service_description = "cloudns dns is active and authoritative for bouya.org";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_external_dns" "pns1.cloudns.net" "bouya.org" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "bouya.org (Secondary DNS ClouDNS)";
-    }
-
-    {
-      service_description = "cloudns dns is active and authoritative for filedesreves.fr";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_external_dns" "pns1.cloudns.net" "filedesreves.fr" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "filedesreves.fr (Secondary DNS ClouDNS)";
-    }
-
-    {
-      service_description = "cloudns dns is active and authoritative for ludivinecassal.com";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_external_dns" "pns1.cloudns.net" "ludivinecassal.com" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "ludivinecassal.com (Secondary DNS ClouDNS)";
-    }
-
-    {
-      service_description = "cloudns dns is active and authoritative for icommandeur.org";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_external_dns" "pns1.cloudns.net" "icommandeur.org" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "icommandeur.org (Secondary DNS ClouDNS)";
-    }
-
-    {
-      service_description = "cloudns dns is active and authoritative for immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_external_dns" "pns1.cloudns.net" "immae.eu" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "immae.eu (Secondary DNS ClouDNS)";
-    }
-
-    {
-      service_description = "cloudns dns is active and authoritative for immae.fr";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_external_dns" "pns1.cloudns.net" "immae.fr" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "immae.fr (Secondary DNS ClouDNS)";
-    }
-
-    {
-      service_description = "cloudns dns is active and authoritative for piedsjaloux.fr";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_external_dns" "pns1.cloudns.net" "piedsjaloux.fr" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "piedsjaloux.fr (Secondary DNS ClouDNS)";
-    }
-
-    {
-      service_description = "cloudns dns is active and authoritative for tellesflorian.com";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_external_dns" "pns1.cloudns.net" "tellesflorian.com" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "tellesflorian.com (Secondary DNS ClouDNS)";
-    }
-
-    {
-      service_description = "cloudns dns is active and authoritative for saison-photo.org";
-      host_name = "eldiron.immae.eu";
-      use = "dns-service";
-      check_command = ["check_external_dns" "pns1.cloudns.net" "saison-photo.org" "-A"];
-
-      servicegroups = "webstatus-dns";
-      _webstatus_name = "saison-photo.org (Secondary DNS ClouDNS)";
-    }
-
-    #### Web scenarios
-    {
-      service_description = "blog website is running on immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "www.immae.eu" "/blog/" "egrep -ri TODO /etc"];
-
-      servicegroups = "webstatus-websites";
-      _webstatus_name = "Immae’s Blog";
-      _webstatus_url = "https://www.immae.eu/blog";
-    }
-
-    {
-      service_description = "owncloud website is running on cloud.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "cloud.immae.eu" "/" "a safe home for all your data"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Nextcloud";
-      _webstatus_url = "https://cloud.immae.eu";
-    }
-
-    {
-      service_description = "nextcloud website is running on nextcloud.4c.salle-s.org";
-      host_name = "quatresaisons.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "nextcloud.4c.salle-s.org" "/" "a safe home for all your data"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Nextcloud";
-      _webstatus_url = "https://nextcloud.4c.salle-s.org";
-    }
-
-    {
-      service_description = "davical website is running on dav.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "dav.immae.eu" "/davical/" "Log On Please"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Davical";
-      _webstatus_url = "https://dav.immae.eu/davical";
-    }
-
-    {
-      service_description = "adminer website is running on tools.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https_auth" "tools.immae.eu" "/adminer/" "www.adminer.org"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Adminer";
-      _webstatus_url = "https://tools.immae.eu/adminer/";
-    }
-
-    {
-      service_description = "ttrss website is running on tools.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "tools.immae.eu" "/ttrss/" "<title>Tiny Tiny RSS"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "TT-RSS";
-      _webstatus_url = "https://tools.immae.eu/ttrss/";
-    }
-
-    {
-      service_description = "mpd website is running on tools.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https_auth" "tools.immae.eu" "/mpd/" "<title>ympd"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "MPD (YMPD)";
-      _webstatus_url = "https://tools.immae.eu/mpd/";
-    }
-
-    {
-      service_description = "rompr mpd website is running on tools.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https_auth" "tools.immae.eu" "/rompr/" "<title>RompЯ"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "MPD (ROMPR)";
-      _webstatus_url = "https://tools.immae.eu/rompr/";
-    }
-
-    {
-      service_description = "wallabag website is running on tools.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "tools.immae.eu" "/wallabag/" "<title>Bienvenue sur wallabag"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Wallabag";
-      _webstatus_url = "https://tools.immae.eu/wallabag/";
-    }
-
-    {
-      service_description = "yourl website is running on tools.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "tools.immae.eu" "/url/admin/" "<title>YOURLS"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "YOURLS";
-      _webstatus_url = "https://tools.immae.eu/url/admin/";
-    }
-
-    {
-      service_description = "roundcube website is running on mail.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "mail.immae.eu" "/roundcube/" "<title>Roundcube"];
-
-      servicegroups = "webstatus-webapps,webstatus-email";
-      _webstatus_name = "Roundcube";
-      _webstatus_url = "https://mail.immae.eu/roundcube/";
-    }
-
-    {
-      service_description = "dokuwiki website is running on tools.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "tools.immae.eu" "/dokuwiki/" "<title>start"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Dokuwiki";
-      _webstatus_url = "https://tools.immae.eu/dokuwiki/";
-    }
-
-    {
-      service_description = "shaarli website is running on tools.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "tools.immae.eu" "/Shaarli/immae" "<title>Immae"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Shaarli";
-      _webstatus_url = "https://tools.immae.eu/Shaarli/";
-    }
-
-    {
-      service_description = "ldap website is running on tools.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "tools.immae.eu" "/ldap/" "<title>phpLDAPadmin"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "LDAP";
-      _webstatus_url = "https://tools.immae.eu/ldap/";
-    }
-
-    {
-      service_description = "gitweb website is running on git.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "git.immae.eu" "/cgit" "<title>Immae’s git"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Git";
-      _webstatus_url = "https://git.immae.eu/";
-    }
-
-    {
-      service_description = "mantisbt website is running on git.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "git.immae.eu" "/mantisbt/" "<title>My View - MantisBT"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Mantisbt";
-      _webstatus_url = "https://git.immae.eu/mantisbt";
-    }
-
-    {
-      service_description = "diaspora website is running on diaspora.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "diaspora.immae.eu" "/" "is the online social world where you are in control"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Diaspora";
-      _webstatus_url = "https://diaspora.immae.eu/";
-    }
-
-    {
-      service_description = "peertube website is running on peertube.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "peertube.immae.eu" "/" "<title>Immae’s PeerTube"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Peertube";
-      _webstatus_url = "https://peertube.immae.eu/";
-    }
-
-    {
-      service_description = "etherpad website is running on ether.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "ether.immae.eu" "/" "<title>Etherpad"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Etherpad";
-      _webstatus_url = "https://ether.immae.eu/";
-    }
-
-    {
-      service_description = "mediagoblin website is running on mgoblin.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "mgoblin.immae.eu" "/" "<title>GNU MediaGoblin"];
-
-      servicegroups = "webstatus-webapps";
-      _webstatus_name = "Mediagoblin";
-      _webstatus_url = "https://mgoblin.immae.eu/";
-    }
-
-    {
-      service_description = "mastodon website is running on mastodon.immae.eu";
-      host_name = "eldiron.immae.eu";
-      use = "external-web-service";
-      check_command = ["check_https" "mastodon.immae.eu" "/" "Mastodon</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"; };
-  };
-}
diff --git a/modules/private/monitoring/objects_quatresaisons.nix b/modules/private/monitoring/objects_quatresaisons.nix
deleted file mode 100644 (file)
index f30cf81..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-{ lib, hostFQDN, emailCheck, openldap, ... }:
-let
-  defaultPassiveInfo = {
-    filter = lib.attrsets.filterAttrs
-      (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_");
-    use = "external-passive-service";
-    freshness_threshold = "450";
-    retry_interval = "1";
-    servicegroups = "webstatus-resources";
-    host_name = hostFQDN;
-  };
-in
-{
-  resources = {
-    USER212 = "{{ .monitoring.quatresaisons.naemon_ldap }}";
-  };
-  activatedPlugins = [ "megaraid" "command" "postgresql" ];
-  service = [
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
-      service_description = "No RAID device is degraded";
-      use = "local-service";
-      check_command = ["check_megaraid"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
-      service_description = "LDAP is running";
-      use = "local-service";
-      check_command = [ "check_command_status" "${openldap}/bin/ldapwhoami -D uid=naemon,ou=services,dc=salle-s,dc=org -w $USER212$" "0" ""];
-    }
-    {
-      passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
-      service_description = "Postgresql is running";
-      use = "local-service";
-      check_command = [ "check_postgresql_database_count" "/run/postgresql" "5432" "3" ];
-    }
-  ];
-}
diff --git a/modules/private/monitoring/objects_tiboqorl-fr.nix b/modules/private/monitoring/objects_tiboqorl-fr.nix
deleted file mode 100644 (file)
index b49a1d8..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-{ lib, ... }:
-let
-  hostFQDN = "tiboqorl.fr";
-  defaultPassiveInfo = {
-    filter = lib.attrsets.filterAttrs
-      (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_");
-    use = "external-passive-service";
-    contact_groups = "tiboqorl";
-    freshness_threshold = "450";
-    notification_interval = "240";
-    retry_interval = "1";
-    servicegroups = "webstatus-resources";
-    _webstatus_namespace = "tiboqorl";
-    host_name = hostFQDN;
-  };
-in
-{
-  host = {
-    "tiboqorl.fr" = {
-      alias = "tiboqorl.fr";
-      address = "tiboqorl.fr";
-      use = "linux-server";
-      contact_groups = "tiboqorl";
-      hostgroups = "webstatus-hosts";
-      _webstatus_name = "tiboqorl";
-      _webstatus_vhost = "status.immae.eu";
-      _webstatus_namespace = "tiboqorl";
-    };
-  };
-  service = [
-    {
-      passiveInfo = defaultPassiveInfo;
-      service_description = "Size on root partition";
-      use = "local-service";
-      check_command = ["check_local_disk" "20%" "10%" "/"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo;
-      service_description = "Total number of process";
-      use = "local-service";
-      check_command = [ "check_local_procs" "250" "400" "RSZDT" ];
-    }
-    {
-      passiveInfo = defaultPassiveInfo;
-      service_description = "Network bandwidth";
-      use = "local-service";
-      check_interval = "2";
-      max_check_attempts = "20";
-      retry_interval = "2";
-      check_command = [
-        "check_local_bandwidth"
-        "eth0"
-        "20480" # kb/s
-        "51200" # kb/s
-      ];
-    }
-    {
-      passiveInfo = defaultPassiveInfo;
-      service_description = "Average load";
-      use = "local-service";
-      check_command = [
-        "check_local_load"
-        "0.75,0.75,0.75" # warn
-        "1.0,1.0,1.0" # alert
-      ];
-    }
-    {
-      passiveInfo = defaultPassiveInfo;
-      service_description = "Swap usage";
-      use = "local-service";
-      check_command = ["check_local_swap" "20" "10"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo;
-      service_description = "Memory usage";
-      use = "local-service";
-      check_command = ["check_memory" "80" "90"];
-    }
-    {
-      passiveInfo = defaultPassiveInfo;
-      service_description = "NTP is activated and working";
-      use = "local-service";
-      check_command = ["check_ntp"];
-    }
-  ];
-  command = {
-    check_local_disk = "$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$";
-    check_local_procs = "$USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$";
-    check_local_load = "$USER1$/check_load -w $ARG1$ -c $ARG2$";
-    check_local_swap = "$USER1$/check_swap -n ok -w $ARG1$ -c $ARG2$";
-    check_local_bandwidth = "$USER2$/check_bandwidth -i=$ARG1$ -w $ARG2$ -c $ARG3$";
-    check_memory = "$USER2$/check_mem.sh -w $ARG1$ -c $ARG2$";
-    check_ntp = "$USER1$/check_ntp_time -t 30 -q -H 0.arch.pool.ntp.org";
-
-    check_host_alive = "$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5";
-
-    notify-master = "$USER2$/send_nrdp.sh -u \"$USER200$\" -t \"$USER201$\" -H \"$HOSTADDRESS$\" -s \"$SERVICEDESC$\" -S \"$SERVICESTATEID$\" -o \"$SERVICEOUTPUT$ | $SERVICEPERFDATA$\"";
-  };
-  timeperiod = {
-    "24x7" = {
-      alias = "24 Hours A Day, 7 Days A Week";
-      monday = "00:00-24:00";
-      tuesday = "00:00-24:00";
-      wednesday = "00:00-24:00";
-      thursday = "00:00-24:00";
-      friday = "00:00-24:00";
-      saturday = "00:00-24:00";
-      sunday = "00:00-24:00";
-    };
-  };
-  servicegroup = {
-    webstatus-resources = { alias = "Local resources"; };
-  };
-  hostgroup = {
-    webstatus-hosts = { alias = "Hosts"; };
-  };
-  contactgroup = {
-    tiboqorl = { alias = "Naemon Administrators"; };
-  };
-  templates = {
-    service = {
-      generic-service = {
-        active_checks_enabled = "1";
-        check_freshness = "0";
-        check_interval = "10";
-        check_period = "24x7";
-        contact_groups = "tiboqorl";
-        event_handler_enabled = "1";
-        flap_detection_enabled = "1";
-        is_volatile = "0";
-        max_check_attempts = "3";
-        notification_interval = "60";
-        notification_options = "w,u,c,r,f,s";
-        notification_period = "24x7";
-        notifications_enabled = "0";
-        obsess_over_service = "1";
-        passive_checks_enabled = "1";
-        process_perf_data = "1";
-        retain_nonstatus_information = "1";
-        retain_status_information = "1";
-        retry_interval = "2";
-      };
-      local-service = {
-        use = "generic-service";
-        host_name = hostFQDN;
-        check_interval = "5";
-        max_check_attempts = "4";
-        retry_interval = "1";
-        servicegroups = "webstatus-resources";
-      };
-    };
-    host = {
-      generic-host = {
-        event_handler_enabled = "1";
-        flap_detection_enabled = "1";
-        notification_period = "24x7";
-        notifications_enabled = "1";
-        process_perf_data = "1";
-        retain_nonstatus_information = "1";
-        retain_status_information = "1";
-      };
-      linux-server = {
-        check_command = "check_host_alive";
-        check_interval = "5";
-        check_period = "24x7";
-        contact_groups = "tiboqorl";
-        max_check_attempts = "10";
-        notification_interval = "120";
-        notification_options = "d,u,r,f";
-        retry_interval = "1";
-      };
-    };
-  };
-}
diff --git a/modules/private/monitoring/plugins/notify_eban_url b/modules/private/monitoring/plugins/notify_eban_url
deleted file mode 100755 (executable)
index 107b5de..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-if [ "$SERVICESTATE" = "CRITICAL" -o "$SERVICESTATE" = "UNKNOWN" -o "$HOSTSTATE" = "DOWN" -o "$HOSTSTATE" = "UNREACHABLE" ]; then
-  MESSAGE="$STATUS_NAME seems down!"
-  curl -X GET -G --data-urlencode "user=$USER" --data-urlencode "pass=$PASSWORD" --data-urlencode "msg=$MESSAGE" https://smsapi.free-mobile.fr/sendmsg
-fi
diff --git a/modules/private/pub/default.nix b/modules/private/pub/default.nix
deleted file mode 100644 (file)
index c419530..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-{ lib, pkgs, config,  ... }:
-{
-  options = {
-    myServices.pub.enable = lib.mkOption {
-      type = lib.types.bool;
-      default = false;
-      description = ''
-        Whether to enable pub user.
-      '';
-    };
-  };
-
-  config = lib.mkIf config.myServices.pub.enable {
-    myServices.ssh.modules = [{
-      snippet = builtins.readFile ./ldap_pub.sh;
-      dependencies = [ pkgs.coreutils ];
-    }];
-    users.users.pub = let
-      restrict = pkgs.runCommand "restrict" {
-        file = ./restrict;
-        buildInputs = [ pkgs.makeWrapper ];
-      } ''
-        mkdir -p $out/bin
-        cp $file $out/bin/restrict
-        chmod a+x $out/bin/restrict
-        patchShebangs $out/bin/restrict
-        wrapProgram $out/bin/restrict \
-          --prefix PATH : ${lib.makeBinPath [ pkgs.bubblewrap pkgs.rrsync ]} \
-          --set TMUX_RESTRICT ${./tmux.restrict.conf}
-      '';
-      purple-hangouts = pkgs.purple-hangouts.overrideAttrs(old: {
-        installPhase = ''
-          install -Dm755 -t $out/lib/purple-2/ libhangouts.so
-          for size in 16 22 24 48; do
-            install -TDm644 hangouts$size.png $out/share/pixmaps/pidgin/protocols/$size/hangouts.png
-          done
-          '';
-      });
-    in {
-      createHome = true;
-      description = "Restricted shell user";
-      home = "/var/lib/pub";
-      uid = config.myEnv.users.pub.uid;
-      useDefaultShell = true;
-      packages = [
-        restrict
-        pkgs.tmux
-        (pkgs.pidgin.override { plugins = [
-          pkgs.purple-plugin-pack purple-hangouts
-          pkgs.purple-discord pkgs.purple-facebook
-          pkgs.telegram-purple
-        ]; })
-        ];
-    };
-  };
-}
diff --git a/modules/private/pub/ldap_pub.sh b/modules/private/pub/ldap_pub.sh
deleted file mode 100644 (file)
index bbbefdc..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh
-LDAP_PUB_RESTRICT_MEMBER="cn=restrict,cn=pub,ou=services,dc=immae,dc=eu"
-LDAP_PUB_FORWARD_MEMBER="cn=forward,cn=pub,ou=services,dc=immae,dc=eu"
-ECHO=$(which echo)
-
-if [[ $user == pub ]]; then
-  ldap_search '(&(memberOf='$LDAP_PUB_RESTRICT_MEMBER')('$KEY'=*))' $KEY | \
-    while read line ;
-    do
-      if [ ! -z "$line" ]; then
-        if [[ $line == dn* ]]; then
-          echo ""
-          user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line")
-          echo "# $user"
-        elif [[ $line == $KEY* ]]; then
-          key=$(clean_key_line pub "$line")
-          key_forward=$(clean_key_line forward "$line")
-          if [ ! -z "$key" ]; then
-            if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
-              echo -n 'command="/etc/profiles/per-user/pub/bin/restrict '$user'" '
-              echo $key
-            fi
-          elif [ ! -z "$key_forward" ]; then
-            if [[ $key_forward != *$'\n'* ]] && [[ $key_forward == ssh-* ]]; then
-              echo "# forward only"
-              echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" '
-              echo $key_forward
-            fi
-          fi
-        fi
-      fi
-    done
-
-  echo ""
-  ldap_search '(&(memberOf='$LDAP_PUB_FORWARD_MEMBER')('$KEY'=*))' $KEY | \
-    while read line ;
-    do
-      if [ ! -z "$line" ]; then
-        if [[ $line == dn* ]]; then
-          echo ""
-          user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line")
-          echo "# $user"
-        elif [[ $line == $KEY* ]]; then
-          key=$(clean_key_line forward "$line")
-          if [ ! -z "$key" ]; then
-            if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
-              echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" '
-              echo $key
-            fi
-          fi
-        fi
-      fi
-    done
-  exit 0
-fi
-
diff --git a/modules/private/ssh/default.nix b/modules/private/ssh/default.nix
deleted file mode 100644 (file)
index ee5dda5..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  cfg = config.myServices.ssh;
-in
-{
-  options.myServices.ssh = let
-    module = lib.types.submodule {
-      options = {
-        snippet = lib.mkOption {
-          type = lib.types.lines;
-          description = ''
-              Snippet to use
-          '';
-        };
-        dependencies = lib.mkOption {
-          type = lib.types.listOf lib.types.package;
-          default = [];
-          description = ''
-              Dependencies of the package
-          '';
-        };
-      };
-    };
-  in {
-    predefinedModules = lib.mkOption {
-      type = lib.types.attrsOf module;
-      default = {
-        regular = {
-          snippet = builtins.readFile ./ldap_regular.sh;
-        };
-      };
-      readOnly = true;
-      description = ''
-        Predefined modules
-        '';
-    };
-    modules = lib.mkOption {
-      type = lib.types.listOf module;
-      default = [];
-      description = ''
-        List of modules to enable
-        '';
-    };
-  };
-  config = {
-    networking.firewall.allowedTCPPorts = [ 22 ];
-  } // (lib.mkIf (builtins.length cfg.modules > 0) {
-
-    services.openssh.extraConfig = ''
-      AuthorizedKeysCommand     /etc/ssh/ldap_authorized_keys
-      AuthorizedKeysCommandUser nobody
-      '';
-
-    secrets.keys."ssh-ldap" = {
-      user = "nobody";
-      group = "nogroup";
-      permissions = "0400";
-      text = config.myEnv.sshd.ldap.password;
-    };
-    system.activationScripts.sshd = {
-      deps = [ "secrets" ];
-      text = ''
-      install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-ldap"} /etc/ssh/ldap_password
-      '';
-    };
-    # ssh is strict about parent directory having correct rights, don't
-    # move it in the nix store.
-    environment.etc."ssh/ldap_authorized_keys" = let
-      deps = lib.lists.unique (
-        [ pkgs.which pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.gnused pkgs.coreutils ]
-        ++ lib.flatten (map (v: v.dependencies) cfg.modules)
-        );
-      fullScript = pkgs.runCommand "ldap_authorized_keys" {
-        snippets = builtins.concatStringsSep "\n" (map (v: v.snippet) cfg.modules);
-      } ''
-        substituteAll ${./ldap_authorized_keys.sh} $out
-        chmod a+x $out
-        '';
-      ldap_authorized_keys = pkgs.runCommand "ldap_authorized_keys" {
-        buildInputs = [ pkgs.makeWrapper ];
-      } ''
-        makeWrapper "${fullScript}" "$out" --prefix PATH : ${lib.makeBinPath deps}
-        '';
-    in {
-      enable = true;
-      mode = "0755";
-      user = "root";
-      source = ldap_authorized_keys;
-    };
-  });
-}
diff --git a/modules/private/system.nix b/modules/private/system.nix
deleted file mode 100644 (file)
index 5f3d79e..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-{ pkgs, lib, config, name, nodes, ... }:
-{
-  config = {
-    deployment.secrets."secret_vars.yml" = {
-      source = builtins.toString ../../nixops/secrets/vars.yml;
-      destination = config.secrets.secretsVars;
-      owner.user = "root";
-      owner.group = "root";
-      permissions = "0400";
-    };
-
-    networking.extraHosts = builtins.concatStringsSep "\n"
-      (lib.mapAttrsToList (n: v: "${v.config.hostEnv.ips.main.ip4} ${n}") nodes);
-
-    users.extraUsers.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.nix_repository ];
-    secrets.deleteSecretsVars = true;
-    secrets.gpgKeys = [
-      ../../nixops/public_keys/Immae.pub
-    ];
-    secrets.secretsVars = "/run/keys/vars.yml";
-
-    services.openssh.enable = true;
-
-    nixpkgs.overlays = builtins.attrValues (import ../../overlays) ++ [
-      (self: super: {
-        postgresql = self.postgresql_pam;
-        mariadb = self.mariadb_pam;
-      }) # don’t put them as generic overlay because of home-manager
-    ];
-
-    services.journald.extraConfig = ''
-      #Should be "warning" but disabled for now, it prevents anything from being stored
-      MaxLevelStore=info
-      MaxRetentionSec=1year
-      '';
-
-    users.users =
-      builtins.listToAttrs (map (x: lib.attrsets.nameValuePair x.name ({
-        isNormalUser = true;
-        home = "/home/${x.name}";
-        createHome = true;
-        linger = true;
-      } // x)) (config.hostEnv.users pkgs))
-      // {
-        root.packages = let
-          nagios-cli = pkgs.writeScriptBin "nagios-cli" ''
-            #!${pkgs.stdenv.shell}
-            sudo -u naemon ${pkgs.nagios-cli}/bin/nagios-cli -c ${./monitoring/nagios-cli.cfg}
-            '';
-        in
-          [
-            pkgs.telnet
-            pkgs.htop
-            pkgs.iftop
-            pkgs.bind.dnsutils
-            pkgs.httpie
-            pkgs.iotop
-            pkgs.whois
-            pkgs.ngrep
-            pkgs.tcpdump
-            pkgs.tshark
-            pkgs.tcpflow
-            # pkgs.mitmproxy # failing
-            pkgs.nmap
-            pkgs.p0f
-            pkgs.socat
-            pkgs.lsof
-            pkgs.psmisc
-            pkgs.openssl
-            pkgs.wget
-
-            pkgs.cnagios
-            nagios-cli
-
-            pkgs.pv
-            pkgs.smartmontools
-          ];
-      };
-
-    users.mutableUsers = lib.mkDefault false;
-
-    environment.etc.cnagios.source = "${pkgs.cnagios}/share/doc/cnagios";
-    environment.systemPackages = [
-      pkgs.git
-      pkgs.vim
-      pkgs.rsync
-      pkgs.strace
-    ] ++
-    (lib.optional (builtins.length (config.hostEnv.users pkgs) > 0) pkgs.home-manager);
-
-    systemd.targets.maintenance = {
-      description = "Maintenance target with only sshd";
-      after = [ "network-online.target" "sshd.service" ];
-      requires = [ "network-online.target" "sshd.service" ];
-      unitConfig.AllowIsolate = "yes";
-    };
-  };
-}
diff --git a/modules/private/system/dilion/vms.nix b/modules/private/system/dilion/vms.nix
deleted file mode 100644 (file)
index af96622..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-# inspired from https://nixos.wiki/wiki/Virtualization_in_NixOS
-{ config, pkgs, lib, ... }@args:
-let
-  pools = {
-    niximages = {
-      type = "dir";
-      target = "/etc/libvirtd/base-images";
-    };
-    buildbot-disks = rec {
-      preStart = ''
-        mkdir -p ${target}
-      '';
-      type = "dir";
-      target = "/var/lib/libvirt/images/buildbot-disks";
-    };
-    zfspool = {
-      # pool-define-as --name zfspool --source-name zpool/libvirt --type zfs
-      type = "zfs";
-      xml = ''
-        <source>
-          <name>zpool/libvirt</name>
-        </source>
-      '';
-    };
-  };
-  networks = {
-    immae = {
-      bridgeNumber = "1";
-      ipRange = "192.168.100";
-    };
-  };
-  guests = {
-    caldance = {
-      pool = "zfspool";
-      cpus = "1";
-      memory = "2";
-      network = "immae";
-      diskSize = "10GiB";
-      extraDevicesXML = ''
-        <filesystem type="mount">
-          <source dir="/var/lib/caldance"/>
-          <target dir="home"/>
-        </filesystem>
-      '';
-    };
-    buildbot = {
-      pool = "zfspool";
-      cpus = "1";
-      memory = "3";
-      network = "immae";
-      diskSize = "10GiB";
-      destroyVolumeOnExit = true;
-    };
-  };
-  toImage = f: "${import ./vms/base_image.nix f (args // { myEnv = config.myEnv; })}/nixos.qcow2";
-in
-{
-  environment.etc."libvirtd/base-images/nixos.qcow2".source = toImage ./vms/base_configuration.nix;
-  environment.etc."libvirtd/base-images/buildbot.qcow2".source = toImage ./vms/buildbot_configuration.nix;
-  systemd.services = lib.mapAttrs' (name: guest: lib.nameValuePair "libvirtd-guest-${name}" {
-    after = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ];
-    requires = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ];
-    wantedBy = [ "multi-user.target" ];
-    serviceConfig = {
-      Type = "oneshot";
-      RemainAfterExit = "yes";
-    };
-    script =
-      let
-        xml = pkgs.writeText "libvirt-guest-${name}.xml"
-        ''
-          <domain type="kvm">
-            <name>${name}</name>
-            <uuid>UUID</uuid>
-            <memory unit="GiB">${guest.memory}</memory>
-            <vcpu>${guest.cpus}</vcpu>
-            <os>
-              <type arch="x86_64">hvm</type>
-            </os>
-            <devices>
-              <emulator>/run/current-system/sw/bin/qemu-system-x86_64</emulator>
-              <disk type="volume">
-                <source pool="${guest.pool}" volume="guest-${name}" />
-                <target dev="vda" bus="virtio"/>
-              </disk>
-              ${guest.extraDevicesXML or ""}
-              <input type="keyboard" bus="usb"/>
-              <graphics type="vnc" port="-1" autoport="yes"/>
-              <interface type="network">
-                <source network="${guest.network}" />
-              </interface>
-            </devices>
-            <features>
-              <acpi/>
-            </features>
-          </domain>
-        '';
-      in
-      guest.preStart or "" + ''
-        if ! ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then
-          ${pkgs.libvirt}/bin/virsh vol-create-as --pool ${guest.pool} --name 'guest-${name}' --capacity '${guest.diskSize}'
-          volume_path=$(${pkgs.libvirt}/bin/virsh vol-path --pool ${guest.pool} --vol 'guest-${name}')
-          ${pkgs.qemu}/bin/qemu-img convert /etc/libvirtd/base-images/nixos.qcow2 $volume_path
-        fi
-        uuid="$(${pkgs.libvirt}/bin/virsh domuuid '${name}' || true)"
-        ${pkgs.libvirt}/bin/virsh define <(sed "s/UUID/$uuid/" '${xml}')
-        ${pkgs.libvirt}/bin/virsh start '${name}'
-      '';
-    preStop = ''
-      ${pkgs.libvirt}/bin/virsh shutdown '${name}'
-      let "timeout = $(date +%s) + 10"
-      while [ "$(${pkgs.libvirt}/bin/virsh list --name | grep --count '^${name}$')" -gt 0 ]; do
-        if [ "$(date +%s)" -ge "$timeout" ]; then
-          # Meh, we warned it...
-          ${pkgs.libvirt}/bin/virsh destroy '${name}'
-        else
-          # The machine is still running, let's give it some time to shut down
-          sleep 0.5
-        fi
-      done
-    '' + lib.optionalString (guest.destroyVolumeOnExit or false) ''
-        if ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then
-          ${pkgs.libvirt}/bin/virsh vol-wipe --pool ${guest.pool} --vol 'guest-${name}' || true
-          ${pkgs.libvirt}/bin/virsh vol-delete --pool ${guest.pool} --vol 'guest-${name}'
-        fi
-    '';
-  }) guests // (lib.mapAttrs' (name: network: lib.nameValuePair "libvirtd-network-${name}" {
-    after = [ "libvirtd.service" ];
-    requires = [ "libvirtd.service" ];
-    wantedBy = [ "multi-user.target" ];
-    serviceConfig = {
-      Type = "oneshot";
-      RemainAfterExit = "yes";
-    };
-    script = let
-      xml = pkgs.writeText "libvirt-network-${name}.xml" ''
-        <network>
-          <name>${name}</name>
-          <uuid>UUID</uuid>
-          <forward mode='nat' />
-          <bridge name='virbr${network.bridgeNumber}' />
-          <domain name='${name}' localOnly='yes'/>
-          <ip address='${network.ipRange}.1' netmask='255.255.255.0'>
-            <dhcp>
-              <range start='${network.ipRange}.2' end='${network.ipRange}.254'/>
-            </dhcp>
-          </ip>
-        </network>
-      '';
-    in ''
-      uuid="$(${pkgs.libvirt}/bin/virsh net-uuid '${name}' || true)"
-      ${pkgs.libvirt}/bin/virsh net-define <(sed "s/UUID/$uuid/" '${xml}')
-      ${pkgs.libvirt}/bin/virsh net-start '${name}'
-    '';
-    preStop = ''
-      ${pkgs.libvirt}/bin/virsh net-destroy '${name}'
-    '';
-  }) networks) // (lib.mapAttrs' (name: pool: lib.nameValuePair "libvirtd-pool-${name}" {
-    after = [ "libvirtd.service" ];
-    requires = [ "libvirtd.service" ];
-    wantedBy = [ "multi-user.target" ];
-    serviceConfig = {
-      Type = "oneshot";
-      RemainAfterExit = "yes";
-    };
-    script = let
-      xml = pkgs.writeText "libvirt-pool-${name}.xml" ''
-        <pool type="${pool.type}">
-          <name>${name}</name>
-          <uuid>UUID</uuid>
-          ${pool.xml or ""}
-          ${if pool ? target then ''
-            <target>
-              <path>${pool.target}</path>
-            </target>
-          '' else ""}
-        </pool>
-      '';
-    in pool.preStart or "" + ''
-      uuid="$(${pkgs.libvirt}/bin/virsh pool-uuid '${name}' || true)"
-      ${pkgs.libvirt}/bin/virsh pool-define <(sed "s/UUID/$uuid/" '${xml}')
-      ${pkgs.libvirt}/bin/virsh pool-start '${name}' || true
-    '';
-  }) pools);
-}
diff --git a/modules/private/system/eldiron.nix b/modules/private/system/eldiron.nix
deleted file mode 100644 (file)
index 8b2784d..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-{ config, pkgs, lib, ... }:
-{
-  deployment = {
-    targetUser = "root";
-    targetHost = config.hostEnv.ips.main.ip4;
-    substituteOnDestination = true;
-  };
-  # ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age
-  secrets.ageKeys = [ "age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj" ];
-  boot = {
-    kernelModules = [ "kvm-intel" ];
-    blacklistedKernelModules = [ "nvidiafb" ];
-    loader.timeout = 1;
-    loader.grub.devices = [ "/dev/sda" "/dev/sdb" ];
-    kernel.sysctl = {
-      # https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md
-      "net.ipv4.tcp_sack" = 0;
-    };
-    supportedFilesystems = [ "zfs" ];
-    kernelParams = ["zfs.zfs_arc_max=6442450944"];
-    kernelPackages = pkgs.linuxPackages_latest;
-    initrd.availableKernelModules = [ "ahci" "sd_mod" ];
-    initrd.secrets = {
-      "/boot/pass.key" = "/boot/pass.key";
-    };
-  };
-  services.udev.extraRules = ''
-    ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:56:a0:88", NAME="eth0"
-  '';
-  nix.maxJobs = 8;
-  powerManagement.cpuFreqGovernor = "powersave";
-  myEnv = import ../../../nixops/secrets/environment.nix;
-
-  fileSystems = {
-    # pools:
-    #     zpool: ashift=12
-    #     zfast: ashift=12
-    # zfs:
-    #     zpool/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy
-    #     zpool/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key
-    #     zpool/root/var: atime=on
-    #     zfast/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy
-    #     zfast/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key
-    #     zfast/root/etc: ø
-    #     zfast/root/nix: ø
-    #     zfast/root/tmp: async=disabled
-    #     zfast/root/var: atime=on
-    #     zfast/root/var/lib: ø
-    #     zfast/root/var/lib/mysql: logbias=throughput ; atime=off ; primarycache=metadata
-    #     zfast/root/var/lib/postgresql: recordsize=8K ; atime=off ; logbias=throughput
-    #     zfast/root/var/lib/postgresql/11.0: ø
-    #     zfast/root/var/lib/postgresql/11.0/pg_wal: ø
-    "/"     = { fsType = "zfs"; device = "zpool/root"; };
-    "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/e6bb18fb-ff56-4b5f-ae9f-e60d40dc0622"; };
-    "/etc"  = { fsType = "zfs"; device = "zpool/root/etc"; };
-    "/nix"  = { fsType = "zfs"; device = "zfast/root/nix"; };
-    "/tmp"  = { fsType = "zfs"; device = "zfast/root/tmp"; };
-    "/var"  = { fsType = "zfs"; device = "zpool/root/var"; };
-    "/var/lib/mysql" = { fsType = "zfs"; device = "zfast/root/var/lib/mysql"; };
-    "/var/lib/postgresql"             = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql"; };
-    "/var/lib/postgresql/11.0"        = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0"; };
-    "/var/lib/postgresql/11.0/pg_wal" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0/pg_wal"; };
-  };
-  swapDevices = [ { label = "swap1"; } { label = "swap2"; } ];
-  hardware.enableRedistributableFirmware = true;
-
-  services.zfs = {
-    autoScrub = {
-      enable = false;
-    };
-  };
-  networking = {
-    hostId = "8262ca33"; # generated with head -c4 /dev/urandom | od -A none -t x4
-    firewall.enable = true;
-    # FIXME: on next reboot, remove the /27 and the localCommands
-    interfaces."eth0".ipv4.addresses =
-      pkgs.lib.attrsets.mapAttrsToList
-        (n: ips: { address = ips.ip4; prefixLength = 32; })
-        (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips)
-      ++ [ { address = config.hostEnv.ips.main.ip4; prefixLength = 27; } ];
-    interfaces."eth0".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
-      (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
-      config.hostEnv.ips);
-    defaultGateway = "176.9.151.65";
-    localCommands = ''
-      # FIXME: Those commands were added by nixops and may not be
-      # actually needed
-      ip -6 addr add '2a01:4f8:160:3445::/64' dev 'eth0' || true
-      ip -4 route change '176.9.151.64/27' via '176.9.151.65' dev 'eth0' || true
-      ip -6 route add default via 'fe80::1' dev eth0 || true
-    '';
-    nameservers = [
-      "213.133.98.98"
-      "213.133.99.99"
-      "213.133.100.100"
-      "2a01:4f8:0:a0a1::add:1010"
-      "2a01:4f8:0:a102::add:9999"
-      "2a01:4f8:0:a111::add:9898"
-    ];
-  };
-
-  imports = builtins.attrValues (import ../..);
-
-  myServices.buildbot.enable = true;
-  myServices.databases.enable = true;
-  myServices.gitolite.enable = true;
-  myServices.monitoring.enable = true;
-  myServices.irc.enable = true;
-  myServices.pub.enable = true;
-  myServices.tasks.enable = true;
-  myServices.mpd.enable = true;
-  myServices.dns.enable = true;
-  myServices.certificates.enable = true;
-  myServices.websites.enable = true;
-  myServices.gemini.enable = true;
-  myServices.mail.enable = true;
-  myServices.ejabberd.enable = true;
-  myServices.vpn.enable = true;
-  myServices.ftp.enable = true;
-
-  services.netdata.enable = true;
-  services.netdata.config.global."memory mode" = "none";
-  services.netdata.config.health."enabled" = "no";
-  services.netdata.config.web.mode = "none";
-  users.users."${config.services.netdata.user}".extraGroups = [ "keys" ];
-  environment.etc."netdata/stream.conf".source = config.secrets.fullPaths."netdata-stream.conf";
-  secrets.keys = {
-    "netdata-stream.conf" = {
-      user = config.services.netdata.user;
-      group = config.services.netdata.group;
-      permissions = "0400";
-      text = ''
-        [stream]
-            enabled = yes
-            destination = ${config.myEnv.monitoring.netdata_aggregator}
-            api key = ${config.myEnv.monitoring.netdata_keys.eldiron}
-      '';
-    };
-    "zrepl_backup/identity" = {
-      user = "root";
-      group = "root";
-      permissions = "0400";
-      text = config.myEnv.zrepl_backup.ssh_key.private;
-    };
-  };
-  programs.ssh.knownHosts.dilion = {
-    hostNames = ["dilion.immae.eu"];
-    publicKey = let
-      profile = config.myEnv.rsync_backup.profiles.dilion;
-    in
-      "${profile.host_key_type} ${profile.host_key}";
-  };
-
-  services.cron = {
-    enable = true;
-    mailto = "cron@immae.eu";
-    systemCronJobs = [
-      ''
-        0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "immae.eu.*Recipient address rejected"
-        # Need a way to blacklist properly
-        # 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "NOQUEUE:"
-        0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtp -g "status=bounced"
-      ''
-    ];
-  };
-
-  environment.systemPackages = [ pkgs.bindfs ];
-
-  services.zrepl = {
-    enable = true;
-    config = let
-      redis_dump = pkgs.writeScript "redis-dump" ''
-        #! ${pkgs.stdenv.shell}
-        ${pkgs.redis}/bin/redis-cli bgsave
-      '';
-    in ''
-      jobs:
-        - type: push
-          # must not change
-          name: "backup-to-dilion"
-          filesystems:
-            "zpool/root": true
-            "zpool/root/etc": true
-            "zpool/root/var<": true
-          connect:
-            type: ssh+stdinserver
-            host: dilion.immae.eu
-            user: backup
-            port: 22
-            identity_file: ${config.secrets.fullPaths."zrepl_backup/identity"}
-          snapshotting:
-            type: periodic
-            prefix: zrepl_
-            interval: 1h
-            #hooks:
-            #  - type: mysql-lock-tables
-            #    dsn: "${config.myEnv.zrepl_backup.mysql.user}:${config.myEnv.zrepl_backup.mysql.password}@tcp(localhost)/"
-            #    filesystems:
-            #      "zpool/root/var": true
-            #  - type: command
-            #    path: ${redis_dump}
-            #    err_is_fatal: false
-            #    filesystems:
-            #      "zpool/root/var": true
-          send:
-            encrypted: true
-          pruning:
-            keep_sender:
-              - type: regex
-                regex: "^manual_.*"
-              - type: grid
-                grid: 24x1h | 7x1d | 4x7d | 6x30d
-                regex: "^zrepl_.*"
-            keep_receiver:
-              - type: regex
-                regex: "^manual_.*"
-              - type: grid
-                grid: 6x4h | 7x1d | 4x7d | 6x30d
-                regex: "^zrepl_.*"
-    '';
-  };
-  # This value determines the NixOS release with which your system is
-  # to be compatible, in order to avoid breaking some software such as
-  # database servers. You should change this only after NixOS release
-  # notes say you should.
-  # https://nixos.org/nixos/manual/release-notes.html
-  system.stateVersion = "20.03"; # Did you read the comment?
-}
diff --git a/modules/private/system/quatresaisons.nix b/modules/private/system/quatresaisons.nix
deleted file mode 100644 (file)
index 82db70f..0000000
+++ /dev/null
@@ -1,436 +0,0 @@
-{ config, pkgs, lib, ... }:
-let
-  serverSpecificConfig = config.myEnv.serverSpecific.quatresaisons;
-  yarnModules = pkgs.yarn2nix-moretea.mkYarnModules rec {
-    name = "landing";
-    pname = name;
-    version = "v1.0.0";
-    packageJSON = "${pkgs.sources.webapps-landing}/package.json";
-    yarnLock = "${pkgs.sources.webapps-landing}/yarn.lock";
-    yarnNix = ../websites/tools/tools/landing/yarn-packages.nix;
-  };
-  toLanding = landingConfig: pkgs.stdenv.mkDerivation rec {
-    pname = "landing";
-    version = "v1.0.0";
-    src = pkgs.sources.webapps-landing;
-
-    buildInputs = [ yarnModules pkgs.yarn2nix-moretea.yarn ];
-    configurePhase = ''
-      ln -s ${yarnModules}/node_modules .
-    '';
-    buildPhase = ''
-      yarn build
-    '';
-    installPhase = ''
-      cp -a dist $out
-      cp -f ${landingConfig} $out/config.yml
-      ln -s service-worker.js $out/worker.js
-    '';
-  };
-  normalUsers = serverSpecificConfig.users;
-  sponsoredUser = pkgs.writeScriptBin "sponsored_user" ''
-    #!/usr/bin/env bash
-
-    set -euo pipefail
-    [ -z "''${SUDO_USER+x}" ] && echo "Must be run with sudo" && exit 1
-
-    mygroup=$(id -ng $SUDO_USER)
-
-    sponsored=$(getent group $mygroup | cut -d':' -f4)
-
-    echo "Sponsored users: ''${sponsored:-<none>}"
-
-    log () {
-      touch /var/log/sponsored_users
-      chmod go-rwx /var/log/sponsored_users
-      echo "`date` $mygroup $1" | LANG=C cat -v | tr '\012' ' ' | sed 's:$:\x0a:' >> /var/log/sponsored_users
-    }
-
-    create_user () {
-      log "creates $1: $2"
-      useradd -m -G users,$mygroup -g $mygroup -p '!' "$1"
-      touch /var/lib/nixos/sponsored_users
-      chmod go-rwx /var/lib/nixos/sponsored_users
-      echo "$mygroup $1 $2" >> /var/lib/nixos/sponsored_users
-      (${pkgs.openldap}/bin/ldapadd -c -D cn=root,dc=salle-s,dc=org \
-        -y ${config.secrets.fullPaths."ldap/sync_password"} 2>/dev/null >/dev/null || true) <<EOF
-    dn: uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org
-    objectClass: inetOrgPerson
-    cn: $1
-    description:: $(echo -n "$2" | base64)
-    sn: $1
-    uid: $1
-    EOF
-      while ! passwd "$1"; do
-        echo "please give an initial password"
-      done
-    }
-
-    delete_user () {
-      IFS=",";
-      for u in $sponsored; do
-      if [ "$u" = "$1" ]; then
-        log "deletes $1"
-        userdel -r "$1"
-        sed -i -e "/^$mygroup $1/d" /var/lib/nixos/sponsored_users
-        ${pkgs.openldap}/bin/ldapdelete -D cn=root,dc=salle-s,dc=org \
-          -y ${config.secrets.fullPaths."ldap/sync_password"} \
-          "uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org"
-        echo "deleted"
-        exit 0
-      fi
-      done
-
-      echo "User does not exist or does not belong to you";
-      exit 1
-    }
-
-    reset_password () {
-      IFS=",";
-      for u in $sponsored; do
-      if [ "$u" = "$1" ]; then
-        log "resets password for $1"
-        passwd "$1"
-        exit 0
-      fi
-      done
-
-      echo "User does not exist or does not belong to you";
-      exit 1
-    }
-
-    reset_ldap_password () {
-      if [ "$1" = "$mygroup" ]; then
-        log "resets web password"
-        ${pkgs.openldap}/bin/ldappasswd -D cn=root,dc=salle-s,dc=org \
-          -y ${config.secrets.fullPaths."ldap/sync_password"} \
-          -S "uid=$mygroup,ou=users,dc=salle-s,dc=org"
-      else
-        IFS=",";
-        for u in $sponsored; do
-        if [ "$u" = "$1" ]; then
-          log "resets web password of $1"
-          ${pkgs.openldap}/bin/ldappasswd -D cn=root,dc=salle-s,dc=org \
-            -y ${config.secrets.fullPaths."ldap/sync_password"} \
-            -S "uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org"
-          exit 0
-        fi
-        done
-
-        echo "User does not exist or does not belong to you";
-        exit 1
-      fi
-    }
-
-    show_help () {
-      echo "sponsored_users create username realname"
-      echo "    create a new sub-user attached to your account"
-      echo "sponsored_users (delete|reset_password) username"
-      echo "    delete a sub-user attached to your account or reset his password"
-      echo "sponsored_users reset_ldap_password username"
-      echo "    reset the web password of a sub-user or yourself"
-    }
-
-    [ -z "''${1+x}" -o -z "''${2+x}" ] && { show_help ; exit 0; }
-    action="$1"
-    username="$2"
-    shift
-    shift
-
-    case "$action" in
-      create)
-        [ -z "''${1+x}" ] && { show_help ; echo "Conformément à la charte https://4c.salle-s.org/charte veuillez préciser le nom réel du futur utilisateur du compte $username, juste pour root." ; exit 1; }
-        create_user "$username" "$*";
-        ;;
-      delete)
-        delete_user "$username";
-        ;;
-      reset_password)
-        reset_password "$username";
-        ;;
-      reset_ldap_password)
-        reset_ldap_password "$username";
-        ;;
-      *)
-        show_help
-        ;;
-    esac
-  '';
-in
-{
-  deployment = {
-    targetUser = "root";
-    targetHost = config.hostEnv.ips.main.ip4;
-    substituteOnDestination = true;
-  };
-  # ssh-keyscan quatresaison | nix-shell -p ssh-to-age --run ssh-to-age
-  secrets.ageKeys = [ "age1yz8u6xvh2fltvyp96ep8crce3qx4tuceyhun6pwddfe0uvcrkarscxl7e7" ];
-
-  programs.ssh.package = pkgs.openssh.overrideAttrs(old: {
-    PATH_PASSWD_PROG = "/run/wrappers/bin/passwd";
-    buildFlags = [ "SSH_KEYSIGN=/run/wrappers/bin/ssh-keysign" ];
-  });
-
-  imports = builtins.attrValues (import ../..) ++
-    [ ./quatresaisons/nextcloud.nix ./quatresaisons/databases.nix ];
-
-  myEnv = import ../../../nixops/secrets/environment.nix;
-
-  fileSystems = {
-    "/"     = { device = "/dev/disk/by-uuid/865931b4-c5cc-439f-8e42-8072c7a30634"; fsType = "ext4"; };
-    "/home" = { device = "/dev/disk/by-uuid/76020bc4-5b88-464c-8952-9a59072c597f"; fsType = "ext4"; neededForBoot = true; };
-    "/boot" = { device = "/dev/disk/by-uuid/0fb8421a-61e5-4ed5-a795-4dd3a9b2152a"; fsType = "ext4"; };
-    "/var/lib" = { device = "/home/var_lib"; fsType = "none"; options = [ "defaults,bind" ]; };
-  };
-  powerManagement.cpuFreqGovernor = "powersave";
-  hardware.enableRedistributableFirmware = true;
-
-  boot.initrd.availableKernelModules = [ "ahci" "megaraid_sas" "sd_mod" ];
-  boot.initrd.kernelModules = [ "dm-snapshot" ];
-  boot.kernelModules = [ "kvm-intel" ];
-
-  boot.loader.grub.enable = true;
-  boot.loader.grub.version = 2;
-  boot.loader.grub.device = "/dev/sda";
-
-  networking.firewall.enable = false;
-  networking.firewall.allowedTCPPorts = [ 80 443 ];
-  networking.useDHCP = false;
-  networking.interfaces.eth0.useDHCP = true;
-  networking.interfaces.eth0.ipv6.addresses = [
-    { address = pkgs.lib.head config.hostEnv.ips.main.ip6; prefixLength = 64; }
-  ];
-  networking.defaultGateway6 = { address = "fe80::1"; interface = "eth0"; };
-  services.udev.extraRules = ''
-    ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:8b:2f:f0", NAME="eth0"
-  '';
-  security.pam.services.chage.text = ''
-    auth      sufficient pam_rootok.so
-    auth      required   pam_unix.so
-    account   required   pam_unix.so
-    session   required   pam_unix.so
-    password  required   pam_permit.so
-  '';
-  security.pam.services.sshd.makeHomeDir = true;
-  security.pam.services.passwd_default = {};
-  security.pam.services.passwd.text = ''
-    password        required        pam_cracklib.so enforce_for_root difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
-  '' + config.security.pam.services.passwd_default.text;
-
-  system.activationScripts.ldapSync = {
-    deps = [ "secrets" "users" ];
-    text =
-      let
-        com = "-D cn=root,dc=salle-s,dc=org -y ${config.secrets.fullPaths."ldap/sync_password"}";
-      in ''
-      # Add users
-      ${pkgs.openldap}/bin/ldapadd -c ${com} -f ${config.secrets.fullPaths."ldap/ldaptree.ldif"} 2>/dev/null >/dev/null || true
-
-      # Remove obsolete users
-      ${pkgs.openldap}/bin/ldapsearch -LLL ${com} -s one -b "ou=users,dc=salle-s,dc=org" "uid" |\
-        grep "^uid" | ${pkgs.gnused}/bin/sed -e "s/uid: //" | while read ldapuser; do
-
-        for user in ${builtins.concatStringsSep " " (builtins.attrNames normalUsers)}; do
-          if [ "$user" = "$ldapuser" ]; then
-            continue 2
-          fi
-        done
-        ${pkgs.openldap}/bin/ldapdelete -r ${com} uid=$ldapuser,ou=users,dc=salle-s,dc=org
-      done
-
-      # Subusers
-      if [ -f /var/lib/nixos/sponsored_users ]; then
-        cat /var/lib/nixos/sponsored_users | while read mainUser subUser name; do
-          (${pkgs.openldap}/bin/ldapadd -c ${com} 2>/dev/null >/dev/null || true) <<EOF
-      dn: uid=$subUser,uid=$mainUser,ou=users,dc=salle-s,dc=org
-      objectClass: inetOrgPerson
-      cn: $subUser
-      description:: $(echo -n "$name" | base64)
-      sn: $subUser
-      uid: $subUser
-      EOF
-        done
-      fi
-    '';
-  };
-
-  secrets.keys = {
-    "ldap/sync_password" = {
-      permissions = "0400";
-      text = serverSpecificConfig.ldap_sync_password;
-    };
-    "ldap/ldaptree.ldif" = {
-      permissions = "0400";
-      text = serverSpecificConfig.ldap_service_users
-        + (builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: v: ''
-        dn: uid=${n},ou=users,dc=salle-s,dc=org
-        objectClass: inetOrgPerson
-        cn: ${n}
-        description: ${v._meta.name or n} ${v._meta.email}
-        sn: ${n}
-        uid: ${n}
-      '') normalUsers));
-    };
-  };
-
-  myServices.monitoring.enable = true;
-  myServices.certificates.enable = true;
-  users.mutableUsers = true;
-  system.stateVersion = "21.03";
-  programs.zsh.enable = true;
-
-  users.motd = ''
-    Bienvenue sur quatresaisons.salle-s.org !
-
-    * Charte :
-      https://4c.salle-s.org/charte
-    * Gérer les utilisateurs unix additionnels :
-      sudo sponsored_user -h
-    * Applications web :
-      * tableau de bord : https://4c.salle-s.org/
-      * nextcloud : https://nextcloud.4c.salle-s.org/
-  '';
-
-  users.groups =
-    lib.mapAttrs (n: v: { gid = v.uid; }) normalUsers
-    // { wwwrun = { gid = config.ids.gids.wwwrun; }; };
-  users.users =
-    let
-      defaultNormal = n: {
-        group = n;
-        extraGroups = [ "users" ];
-        isNormalUser = true;
-      };
-    in
-      lib.mapAttrs (n: v: defaultNormal n // (lib.filterAttrs (k: _: k != "_meta") v)) normalUsers
-      // {
-        sponsored-separator = {
-          uid = 10000;
-          group = "users";
-          home = "/var/empty";
-          extraGroups = [];
-          isNormalUser = true;
-          createHome = false;
-        };
-        wwwrun = {
-          group = "wwwrun";
-          description = "Apache httpd user";
-          uid = config.ids.uids.wwwrun;
-          extraGroups = [ "keys" ];
-        };
-      };
-
-  system.activationScripts.usersPost = {
-    deps = [ "users" "groups" ];
-    text = builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: v: ''
-      if getent shadow "${n}" | grep -q '^${n}:${v.initialHashedPassword or "!"}:1'; then
-        chage -d 0 "${n}"
-        [ '${v.initialHashedPassword or "!"}' = '!' ] && passwd -d "${n}"
-      fi
-    '') normalUsers);
-  };
-  security.sudo.extraRules = [
-    {
-      commands = [
-        { command = "${sponsoredUser}/bin/sponsored_user"; options = [ "NOPASSWD" ]; }
-        { command = "/run/current-system/sw/bin/sponsored_user"; options = [ "NOPASSWD" ]; }
-      ];
-      users = builtins.attrNames normalUsers;
-      runAs = "root";
-    }
-  ];
-
-  environment.systemPackages = [
-    sponsoredUser
-    pkgs.git pkgs.vim pkgs.rsync pkgs.strace pkgs.home-manager
-    pkgs.telnet pkgs.htop pkgs.iftop pkgs.bind.dnsutils pkgs.httpie
-    pkgs.iotop pkgs.whois pkgs.ngrep pkgs.tcpdump pkgs.tshark
-    pkgs.tcpflow pkgs.nmap pkgs.p0f pkgs.socat pkgs.lsof pkgs.psmisc
-    pkgs.openssl pkgs.wget pkgs.pv pkgs.smartmontools pkgs.youtube-dl
-    pkgs.unzip pkgs.octave pkgs.feh pkgs.xv pkgs.sshfs pkgs.gdb
-    pkgs.file pkgs.lynx pkgs.tmux pkgs.awesome pkgs.libreoffice
-    pkgs.evince pkgs.firefox pkgs.xcalib pkgs.python3 pkgs.python2
-    pkgs.xorg.xkbcomp pkgs.subversion pkgs.xclip pkgs.imagemagick
-    pkgs.bc pkgs.sox pkgs.zip pkgs.gnome3.gnome-screenshot
-    pkgs.datadog-process-agent
-  ];
-
-  services.websites.env.production = {
-    enable = true;
-    adminAddr = "httpd@immae.eu";
-    httpdName = "Prod";
-    modules = [ "http2" "deflate" "filter" ];
-    extraConfig = [
-      ''
-        LogFormat "%{Host}i:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedVhost
-        Protocols h2 http/1.1
-        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
-      '' ];
-    ips =
-      let ips = config.hostEnv.ips.main;
-      in [ips.ip4] ++ (ips.ip6 or []);
-
-    fallbackVhost = {
-      certName    = "quatresaisons";
-      hosts       = [ "quatresaisons.immae.eu" ];
-      root        = pkgs.runCommand "empty" {} "mkdir $out && touch $out/index.html";
-      extraConfig = [ "DirectoryIndex index.html" ];
-    };
-    vhostConfs.salle-s = {
-      certName = "quatresaisons";
-      addToCerts = true;
-      hosts = [ "salle-s.org" ];
-      root = toLanding ./quatresaisons/landing.yml;
-      extraConfig = [
-        ''
-          <Directory ${toLanding ./quatresaisons/landing.yml}>
-            AllowOverride None
-            Require all granted
-            DirectoryIndex index.html
-          </Directory>
-      ''
-      ];
-    };
-    vhostConfs.tools = {
-      certName = "quatresaisons";
-      addToCerts = true;
-      hosts = [ "4c.salle-s.org" "quatresaisons.salle-s.org" "quatre-saisons.salle-s.org" ];
-      root = toLanding ./quatresaisons/landing_4c.yml;
-      extraConfig = [
-        ''
-          Alias /charte ${serverSpecificConfig.charte_path}
-          <Directory ${serverSpecificConfig.charte_path}>
-            AllowOverride None
-            Require all granted
-            DirectoryIndex index.html index.txt
-          </Directory>
-
-          <Directory ${toLanding ./quatresaisons/landing_4c.yml}>
-            AllowOverride None
-            Require all granted
-            DirectoryIndex index.html
-          </Directory>
-      ''
-      ];
-    };
-  };
-  system.activationScripts.httpd = '' 
-    install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php
-    install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php/sessions
-  '';
-
-  services.phpfpm = {
-    phpOptions = ''
-      session.save_path = "/var/lib/php/sessions"
-      post_max_size = 20M
-      ; 15 days (seconds)
-      session.gc_maxlifetime = 1296000
-      ; 30 days (minutes)
-      session.cache_expire = 43200
-      '';
-    settings = {
-      log_level = "notice";
-    };
-  };
-
-}
diff --git a/modules/private/system/quatresaisons/databases.nix b/modules/private/system/quatresaisons/databases.nix
deleted file mode 100644 (file)
index f7b27e0..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-{ pkgs, config, lib, ... }:
-{
-  config = let
-    serverSpecificConfig = config.myEnv.serverSpecific.quatresaisons;
-    phpLdapAdmin = pkgs.webapps.phpldapadmin.override { config = config.secrets.fullPaths."webapps/tools-ldap"; };
-  in {
-    services.postgresql.enable = true;
-    services.postgresql.package = pkgs.postgresql_12;
-    services.postgresql.ensureUsers = [
-      { name = "naemon"; }
-    ];
-    secrets.keys = {
-      "ldap/password" = {
-        permissions = "0400";
-        user = "openldap";
-        group = "openldap";
-        text = "rootpw      ${serverSpecificConfig.ldap_root_pw}";
-      };
-      "webapps/tools-ldap" = {
-        user = "wwwrun";
-        group = "wwwrun";
-        permissions = "0400";
-        text = ''
-          <?php
-          $config->custom->appearance['show_clear_password'] = true;
-          $config->custom->appearance['hide_template_warning'] = true;
-          $config->custom->appearance['theme'] = "tango";
-          $config->custom->appearance['minimalMode'] = false;
-          $config->custom->appearance['tree'] = 'AJAXTree';
-
-          $servers = new Datastore();
-
-          $servers->newServer('ldap_pla');
-          $servers->setValue('server','name','LDAP');
-          $servers->setValue('server','host','ldap://localhost');
-          $servers->setValue('login','auth_type','cookie');
-          $servers->setValue('login','bind_id','${serverSpecificConfig.ldap_phpldapadmin_dn}');
-          $servers->setValue('login','bind_pass','${serverSpecificConfig.ldap_phpldapadmin_password}');
-          $servers->setValue('appearance','pla_password_hash','ssha');
-          $servers->setValue('login','attr','uid');
-          $servers->setValue('login','fallback_dn',true);
-        '';
-      };
-    };
-
-    users.users.openldap.extraGroups = [ "keys" ];
-    services.openldap = {
-      enable = true;
-      dataDir = "/var/lib/openldap";
-      urlList = [ "ldap://localhost" ];
-      logLevel = "none";
-      extraConfig = ''
-        pidfile     /run/slapd/slapd.pid
-        argsfile    /run/slapd/slapd.args
-
-        moduleload  back_hdb
-        backend     hdb
-      '';
-
-      extraDatabaseConfig = ''
-        moduleload  memberof
-        overlay     memberof
-
-        moduleload  syncprov
-        overlay     syncprov
-        syncprov-checkpoint 100 10
-
-        index   objectClass       eq
-        index   uid               pres,eq
-        #index   uidMember         pres,eq
-        index   mail              pres,sub,eq
-        index   cn                pres,sub,eq
-        index   sn                pres,sub,eq
-        index   dc                eq
-        index   member            eq
-        index   memberOf          eq
-
-        # No one must access that information except root
-        access to attrs=description
-          by * none
-
-        access to attrs=entry,uid filter="(uid=*)"
-          by dn.exact="${serverSpecificConfig.ldap_phpldapadmin_dn}" read
-          by * break
-
-        access to dn.subtree="ou=users,dc=salle-s,dc=org"
-          by dn.subtree="ou=services,dc=salle-s,dc=org" read
-          by * break
-
-        access to *
-          by self read
-          by anonymous auth
-          by * break
-      '';
-      rootpwFile = config.secrets.fullPaths."ldap/password";
-      suffix = "dc=salle-s,dc=org";
-      rootdn = "cn=root,dc=salle-s,dc=org";
-      database = "hdb";
-    };
-
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-    services.websites.env.production.vhostConfs.tools.extraConfig = [
-      ''
-        Alias /ldap "${phpLdapAdmin}/htdocs"
-        <Directory "${phpLdapAdmin}/htdocs">
-          DirectoryIndex index.php
-          <FilesMatch "\.php$">
-            SetHandler "proxy:unix:${config.services.phpfpm.pools.ldap.socket}|fcgi://localhost"
-          </FilesMatch>
-
-          AllowOverride None
-          Require all granted
-        </Directory>
-      ''
-    ];
-    services.phpfpm.pools.ldap = {
-      user = "wwwrun";
-      group = "wwwrun";
-      settings =
-        let
-          basedir = builtins.concatStringsSep ":" [ phpLdapAdmin config.secrets.fullPaths."webapps/tools-ldap" ];
-        in {
-          "listen.owner" = "wwwrun";
-          "listen.group" = "wwwrun";
-          "pm" = "ondemand";
-          "pm.max_children" = "60";
-          "pm.process_idle_timeout" = "60";
-
-          # Needed to avoid clashes in browser cookies (same domain)
-          "php_value[session.name]" = "LdapPHPSESSID";
-          "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/phpldapadmin";
-          "php_admin_value[session.save_path]" = "/var/lib/php/sessions/phpldapadmin";
-        };
-      phpPackage = pkgs.php72;
-    };
-    system.activationScripts.ldap = {
-      deps = [ "users" ];
-      text = ''
-        install -m 0755 -o wwwrun -g wwwrun -d /var/lib/php/sessions/phpldapadmin
-        '';
-    };
-    systemd.services.phpfpm-ldap = {
-      after = lib.mkAfter [ "openldap.service" ];
-      wants = [ "openldap.service" ];
-    };
-  };
-}
diff --git a/modules/private/system/quatresaisons/landing.yml b/modules/private/system/quatresaisons/landing.yml
deleted file mode 100644 (file)
index cf4ba87..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
----
-# Homepage configuration
-# See https://fontawesome.com/icons for icons options
-
-title: "Websites dashboard"
-subtitle: "Salle-S"
-footer: false
-#footer: '<p>Created with <span class="has-text-danger">❤️</span> with <a href="https://bulma.io/">bulma</a>, <a href="https://vuejs.org/">vuejs</a> & <a href="https://fontawesome.com/">font awesome</a> // Fork me on <a href="https://github.com/bastienwirtz/homer"><i class="fab fa-github-alt"></i></a></p>'  # set false if you want to hide it.
-
-# Optional navbar
-# links: [] # Allows for navbar (dark mode, layout, and search) without any links
-links: []
-
-# Services
-# First level array represent a group.
-# Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed).
-services:
-  - name: "Quatramaran"
-    items:
-      - name: "Roundcube"
-        logo: "assets/tools/roundcube.svg"
-        url: "https://quatramaran.salle-s.org/roundcube/"
-      - name: "Les dessous de paillasse"
-        url: "https://dessous-de-paillasse.salle-s.org"
-  - name: "Quatre Saisons"
-    items:
-      - name: "Charte d’utilisation"
-        icon: "fas fa-scroll"
-        url: "https://4c.salle-s.org/charte/"
-      - name: "Nextcloud"
-        logo: "assets/tools/nextcloud.png"
-        url: "https://nextcloud.4c.salle-s.org"
diff --git a/modules/private/system/quatresaisons/landing_4c.yml b/modules/private/system/quatresaisons/landing_4c.yml
deleted file mode 100644 (file)
index 0b9f6b6..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
----
-# Homepage configuration
-# See https://fontawesome.com/icons for icons options
-
-title: "Websites dashboard"
-subtitle: "Quatre saisons"
-footer: false
-#footer: '<p>Created with <span class="has-text-danger">❤️</span> with <a href="https://bulma.io/">bulma</a>, <a href="https://vuejs.org/">vuejs</a> & <a href="https://fontawesome.com/">font awesome</a> // Fork me on <a href="https://github.com/bastienwirtz/homer"><i class="fab fa-github-alt"></i></a></p>'  # set false if you want to hide it.
-
-# Optional navbar
-# links: [] # Allows for navbar (dark mode, layout, and search) without any links
-links: []
-
-# Services
-# First level array represent a group.
-# Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed).
-services:
-  - items:
-      - name: "Charte d’utilisation"
-        icon: "fas fa-scroll"
-        url: "https://4c.salle-s.org/charte/"
-      - name: "Nextcloud"
-        logo: "assets/tools/nextcloud.png"
-        url: "https://nextcloud.4c.salle-s.org"
diff --git a/modules/private/system/quatresaisons/nextcloud.nix b/modules/private/system/quatresaisons/nextcloud.nix
deleted file mode 100644 (file)
index 89d69d5..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  nextcloud = pkgs.webapps.nextcloud.withApps (a: [
-    a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.circles
-    a.contacts a.cookbook a.deck a.extract a.files_markdown
-    a.files_readmemd a.flowupload a.gpxedit a.gpxpod a.keeweb a.maps
-    a.metadata a.music a.notes a.ocsms a.passman a.polls a.spreed
-    a.social a.tasks
-  ]);
-  varDir = "/var/lib/nextcloud";
-  phpFpm = rec {
-    basedir = builtins.concatStringsSep ":" ([ nextcloud varDir ] ++ nextcloud.apps);
-    pool = {
-      "listen.owner" = "wwwrun";
-      "listen.group" = "wwwrun";
-      "pm" = "ondemand";
-      "pm.max_children" = "60";
-      "pm.process_idle_timeout" = "60";
-
-      "php_admin_value[output_buffering]" = "0";
-      "php_admin_value[max_execution_time]" = "1800";
-      "php_admin_value[zend_extension]" = "opcache";
-      #already enabled by default?
-      #"php_value[opcache.enable]" = "1";
-      "php_value[opcache.enable_cli]" = "1";
-      "php_value[opcache.interned_strings_buffer]" = "8";
-      "php_value[opcache.max_accelerated_files]" = "10000";
-      "php_value[opcache.memory_consumption]" = "128";
-      "php_value[opcache.save_comments]" = "1";
-      "php_value[opcache.revalidate_freq]" = "1";
-      "php_admin_value[memory_limit]" = "512M";
-
-      "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp";
-      "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
-    };
-  };
-in {
-  config = {
-    services.postgresql.ensureDatabases = [ "nextcloud" ];
-    services.postgresql.ensureUsers = [
-      { name = "nextcloud"; ensurePermissions = { "DATABASE nextcloud" = "ALL PRIVILEGES"; }; }
-    ];
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-
-    services.websites.env.production.vhostConfs.cloud = {
-      certName    = "quatresaisons";
-      addToCerts  = true;
-      hosts       = ["nextcloud.4c.salle-s.org" ];
-      root        = nextcloud;
-      extraConfig = 
-        [
-        ''
-          SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
-          <Directory ${nextcloud}>
-            AcceptPathInfo On
-            DirectoryIndex index.php
-            Options FollowSymlinks
-            Require all granted
-            AllowOverride all
-
-            <IfModule mod_headers.c>
-              Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
-            </IfModule>
-            <FilesMatch "\.php$">
-              CGIPassAuth on
-              SetHandler "proxy:unix:${config.services.phpfpm.pools.nextcloud.socket}|fcgi://localhost"
-            </FilesMatch>
-
-          </Directory>
-        ''
-      ];
-    };
-    services.websites.env.production.vhostConfs.cloud_wait = let
-      content = pkgs.writeText "contenu" ''
-        nextcloud est un service qui a besoin de pérennité du nom
-        "nextcloud.salle-s.org", on va peut-etre y arriver, c'est une
-        question de jours, voir le message informatique.internet:8017
-      '';
-    in {
-      certName    = "quatresaisons";
-      addToCerts  = true;
-      hosts       = ["nextcloud.salle-s.org" ];
-      root        = content;
-      extraConfig =
-        [
-        ''
-          Alias / ${content}
-        ''
-      ];
-    };
-
-    users.users.root.packages = let
-      occ = pkgs.writeScriptBin "nextcloud-occ" ''
-        #! ${pkgs.stdenv.shell}
-        cd ${nextcloud}
-        NEXTCLOUD_CONFIG_DIR="${nextcloud}/config" \
-          exec \
-          sudo -E -u wwwrun ${pkgs.php74}/bin/php \
-          -c ${pkgs.php74}/etc/php.ini \
-          occ $*
-        '';
-    in [ occ ];
-
-    system.activationScripts.nextcloud = {
-      deps = [ "users" ];
-      text = let
-        confs = lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) nextcloud.otherConfig;
-      in
-        ''
-        install -m 0755 -o wwwrun -g wwwrun -d ${varDir}
-        install -m 0755 -o wwwrun -g wwwrun -d ${varDir}/config
-        install -m 0750 -o wwwrun -g wwwrun -d ${varDir}/phpSessions
-        ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v:
-          "install -D -m 0644 -o wwwrun -g wwwrun -T ${v} ${varDir}/config/${n}.json"
-          ) confs)}
-      '';
-    };
-    services.phpfpm.pools.nextcloud = {
-      user = "wwwrun";
-      group = "wwwrun";
-      settings = phpFpm.pool;
-      phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache all.imagick ]);
-    };
-
-    services.cron = {
-      enable = true;
-      systemCronJobs = let
-        script = pkgs.writeScriptBin "nextcloud-cron" ''
-          #! ${pkgs.stdenv.shell}
-          export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive
-          export PATH=/run/wrappers/bin:$PATH
-          ${pkgs.php74}/bin/php -d memory_limit=512M -f ${nextcloud}/cron.php
-          '';
-      in [
-        ''
-          */15 * * * * wwwrun ${script}/bin/nextcloud-cron
-        ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/bakeer/cloud.nix b/modules/private/websites/bakeer/cloud.nix
deleted file mode 100644 (file)
index bf78317..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  cfg = config.myServices.websites.bakeer.cloud;
-  nextcloud = config.myServices.tools.cloud.farm.package;
-in {
-  options.myServices.websites.bakeer.cloud.enable = lib.mkEnableOption "enable Bakeer’s cloud";
-
-  config = lib.mkIf cfg.enable {
-    myServices.tools.cloud.farm.instances = [ "bakeer" ];
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-    services.websites.env.production.vhostConfs.bakeer = {
-      certName     = "bakeer";
-      certMainHost = "bakeer.immae.eu";
-      addToCerts   = true;
-      hosts        = ["bakeer.immae.eu" "baxsolution.immae.eu"];
-      root         = nextcloud;
-      extraConfig  = [
-        config.myServices.tools.cloud.farm.vhosts.bakeer
-      ];
-    };
-  };
-}
-
diff --git a/modules/private/websites/capitaines/discourse_static/discourse.png b/modules/private/websites/capitaines/discourse_static/discourse.png
deleted file mode 100644 (file)
index 91ce42d..0000000
Binary files a/modules/private/websites/capitaines/discourse_static/discourse.png and /dev/null differ
diff --git a/modules/private/websites/capitaines/discourse_static/index.html b/modules/private/websites/capitaines/discourse_static/index.html
deleted file mode 100644 (file)
index 4c2ead0..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html lang='en'>
-  <head>
-    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
-    <title>This instance is now closed - Discourse</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>
diff --git a/modules/private/websites/capitaines/landing_pages.nix b/modules/private/websites/capitaines/landing_pages.nix
deleted file mode 100644 (file)
index edba8b9..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-{ lib, config,  ... }:
-let
-  cfg = config.myServices.websites.capitaines.landing_pages;
-  certName = "capitaines";
-  domain = "capitaines.fr";
-in {
-  options.myServices.websites.capitaines.landing_pages.enable = lib.mkEnableOption "enable Capitaines's landing pages";
-
-  config = lib.mkIf cfg.enable {
-    services.websites.env.production.vhostConfs.capitaines_mastodon = rec {
-      inherit certName;
-      certMainHost = "mastodon.${domain}";
-      hosts        = [ certMainHost ];
-      root         = ./mastodon_static;
-      extraConfig  = [
-        ''
-        ErrorDocument 404 /index.html
-        <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>
-        '' ];
-    };
-  };
-}
diff --git a/modules/private/websites/capitaines/mastodon_static/index.html b/modules/private/websites/capitaines/mastodon_static/index.html
deleted file mode 100644 (file)
index fae4152..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html lang='en'>
-  <head>
-    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
-    <title>This instance is now closed - 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>
diff --git a/modules/private/websites/capitaines/mastodon_static/oops.png b/modules/private/websites/capitaines/mastodon_static/oops.png
deleted file mode 100644 (file)
index 0abddad..0000000
Binary files a/modules/private/websites/capitaines/mastodon_static/oops.png and /dev/null differ
diff --git a/modules/private/websites/chloe/app/default.nix b/modules/private/websites/chloe/app/default.nix
deleted file mode 100644 (file)
index d23e3e0..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{ environment ? "prod"
-, varDir ? "/var/lib/chloe_${environment}"
-, spip, stdenv, sassc, sources }:
-let
-  siteDir = stdenv.mkDerivation {
-    version = sources.websites-chloe-app.version;
-    pname = "chloe";
-    src = sources.websites-chloe-app;
-    buildPhase = ''
-      make
-      '';
-    installPhase = ''
-      cp -a . $out
-      '';
-    buildInputs = [ sassc ];
-  };
-in
-spip.override {
-  ldap = true;
-  siteName = "chloe";
-  inherit environment siteDir varDir;
-}
diff --git a/modules/private/websites/chloe/config/chmod.php b/modules/private/websites/chloe/config/chmod.php
deleted file mode 100644 (file)
index aae16cd..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-if (!defined("_ECRIRE_INC_VERSION")) return;
-if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', 0777);
-?>
\ No newline at end of file
diff --git a/modules/private/websites/chloe/config/connect.php b/modules/private/websites/chloe/config/connect.php
deleted file mode 100644 (file)
index 18b0933..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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'
-);
-?>
diff --git a/modules/private/websites/chloe/config/ldap.php b/modules/private/websites/chloe/config/ldap.php
deleted file mode 100644 (file)
index 825b7ed..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?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");
-?>
diff --git a/modules/private/websites/chloe/integration.nix b/modules/private/websites/chloe/integration.nix
deleted file mode 100644 (file)
index 533568e..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  apacheUser = config.services.httpd.Inte.user;
-  apacheGroup = config.services.httpd.Inte.group;
-  ccfg = config.myEnv.websites.chloe.integration;
-  webRoot = "/var/lib/ftp/immae/chloe";
-  varDir = "/var/lib/ftp/immae/chloe_var";
-  cfg = config.myServices.websites.chloe.integration;
-in {
-  options.myServices.websites.chloe.integration.enable = lib.mkEnableOption "enable Chloe's website in integration";
-
-  config = lib.mkIf cfg.enable {
-    secrets.keys."websites/chloe/integration" = {
-      user = apacheUser;
-      group = apacheGroup;
-      permissions = "0400";
-      text = ''
-        SetEnv SPIP_CONFIG_DIR     "${./config}"
-        SetEnv SPIP_VAR_DIR        "${varDir}"
-        SetEnv SPIP_SITE           "chloe-dev"
-        SetEnv SPIP_LDAP_BASE      "dc=immae,dc=eu"
-        SetEnv SPIP_LDAP_HOST      "ldaps://ldap.immae.eu"
-        SetEnv SPIP_LDAP_SEARCH_DN "${ccfg.ldap.dn}"
-        SetEnv SPIP_LDAP_SEARCH_PW "${ccfg.ldap.password}"
-        SetEnv SPIP_LDAP_SEARCH    "${ccfg.ldap.filter}"
-        SetEnv SPIP_MYSQL_HOST     "${ccfg.mysql.host}"
-        SetEnv SPIP_MYSQL_PORT     "${ccfg.mysql.port}"
-        SetEnv SPIP_MYSQL_DB       "${ccfg.mysql.database}"
-        SetEnv SPIP_MYSQL_USER     "${ccfg.mysql.user}"
-        SetEnv SPIP_MYSQL_PASSWORD "${ccfg.mysql.password}"
-      '';
-    };
-    systemd.services.phpfpm-chloe_integration.after = lib.mkAfter [ "mysql.service" ];
-    systemd.services.phpfpm-chloe_integration.wants = [ "mysql.service" ];
-    services.phpfpm.pools.chloe_integration = {
-      user = config.services.httpd.Inte.user;
-      group = config.services.httpd.Inte.group;
-      settings = {
-        "listen.owner" = apacheUser;
-        "listen.group" = apacheGroup;
-        "php_admin_value[upload_max_filesize]" = "20M";
-        "php_admin_value[post_max_size]" = "20M";
-        # "php_admin_flag[log_errors]" = "on";
-        "php_admin_value[open_basedir]" = "${../../../../pkgs/webapps/spip/spip_mes_options.php}:${./config}:${webRoot}:${varDir}:/tmp";
-        "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-      };
-      phpPackage = pkgs.php72;
-    };
-    system.activationScripts.chloe_integration = {
-      deps = [ "wrappers" ];
-      text = ''
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${varDir} ${varDir}/IMG ${varDir}/tmp ${varDir}/local
-        install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${varDir}/phpSessions
-      '';
-    };
-    services.websites.env.integration.modules = [ "proxy_fcgi" ];
-    services.websites.env.integration.vhostConfs.chloe_integration = {
-      certName    = "integration";
-      addToCerts  = true;
-      hosts       = ["test.chc.immae.dev" ];
-      root        = webRoot;
-      extraConfig = [
-      ''
-        Include ${config.secrets.fullPaths."websites/chloe/integration"}
-
-        RewriteEngine On
-
-        <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"
-    ];
-  };
-}
diff --git a/modules/private/websites/chloe/production.nix b/modules/private/websites/chloe/production.nix
deleted file mode 100644 (file)
index 211232c..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-  ccfg = config.myEnv.websites.chloe.production;
-  app = pkgs.callPackage ./app {
-    inherit (ccfg) environment;
-    inherit (pkgs.webapps) spip;
-    varDir = "/var/lib/chloe_production";
-  };
-  cfg = config.myServices.websites.chloe.production;
-in {
-  options.myServices.websites.chloe.production.enable = lib.mkEnableOption "enable Chloe's website in production";
-
-  config = lib.mkIf cfg.enable {
-    secrets.keys."websites/chloe/production" = {
-      user = apacheUser;
-      group = apacheGroup;
-      permissions = "0400";
-      text = ''
-        SetEnv SPIP_CONFIG_DIR     "${./config}"
-        SetEnv SPIP_VAR_DIR        "${app.varDir}"
-        SetEnv SPIP_SITE           "chloe-${app.environment}"
-        SetEnv SPIP_LDAP_BASE      "dc=immae,dc=eu"
-        SetEnv SPIP_LDAP_HOST      "ldaps://ldap.immae.eu"
-        SetEnv SPIP_LDAP_SEARCH_DN "${ccfg.ldap.dn}"
-        SetEnv SPIP_LDAP_SEARCH_PW "${ccfg.ldap.password}"
-        SetEnv SPIP_LDAP_SEARCH    "${ccfg.ldap.filter}"
-        SetEnv SPIP_MYSQL_HOST     "${ccfg.mysql.host}"
-        SetEnv SPIP_MYSQL_PORT     "${ccfg.mysql.port}"
-        SetEnv SPIP_MYSQL_DB       "${ccfg.mysql.database}"
-        SetEnv SPIP_MYSQL_USER     "${ccfg.mysql.user}"
-        SetEnv SPIP_MYSQL_PASSWORD "${ccfg.mysql.password}"
-      '';
-    };
-    services.webstats.sites = [ { name = "osteopathe-cc.fr"; } ];
-
-    systemd.services.phpfpm-chloe_production.after = lib.mkAfter [ "mysql.service" ];
-    systemd.services.phpfpm-chloe_production.wants =  [ "mysql.service" ];
-    services.phpfpm.pools.chloe_production = {
-      user = config.services.httpd.Prod.user;
-      group = config.services.httpd.Prod.group;
-      settings = {
-        "listen.owner" = apacheUser;
-        "listen.group" = apacheGroup;
-        "php_admin_value[upload_max_filesize]" = "20M";
-        "php_admin_value[post_max_size]" = "20M";
-        # "php_admin_flag[log_errors]" = "on";
-        "php_admin_value[open_basedir]" = "${app.spipConfig}:${./config}:${app}:${app.varDir}:/tmp";
-        "php_admin_value[session.save_path]" = "${app.varDir}/phpSessions";
-        "pm" = "dynamic";
-        "pm.max_children" = "20";
-        "pm.start_servers" = "2";
-        "pm.min_spare_servers" = "1";
-        "pm.max_spare_servers" = "3";
-      };
-      phpPackage = pkgs.php72;
-    };
-    system.activationScripts.chloe_production = {
-      deps = [ "wrappers" ];
-      text = ''
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir} ${app.varDir}/IMG ${app.varDir}/tmp ${app.varDir}/local
-        install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions
-      '';
-    };
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-    services.websites.env.production.vhostConfs.chloe = {
-      certName     = "chloe";
-      certMainHost = "osteopathe-cc.fr";
-      hosts        = ["osteopathe-cc.fr" "www.osteopathe-cc.fr" ];
-      root         = app.webRoot;
-      extraConfig  = [
-        ''
-          Use Stats osteopathe-cc.fr
-
-          RewriteEngine On
-          RewriteCond "%{HTTP_HOST}" "!^www\.osteopathe-cc\.fr$" [NC]
-          RewriteRule ^(.+)$ https://www.osteopathe-cc.fr$1 [R=302,L]
-
-          Include ${config.secrets.fullPaths."websites/chloe/production"}
-
-          RewriteEngine On
-          RewriteRule ^/news.rss  /spip.php?page=backend&id_rubrique=1
-
-          <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"
-    ];
-  };
-}
diff --git a/modules/private/websites/cip-ca/sympa.nix b/modules/private/websites/cip-ca/sympa.nix
deleted file mode 100644 (file)
index bb66fc6..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-{ lib, config, ... }:
-let
-  cfg = config.myServices.websites.cip-ca.sympa;
-in
-{
-  options.myServices.websites.cip-ca.sympa.enable = lib.mkEnableOption "enable cip-ca’s sympa website";
-  config = lib.mkIf cfg.enable {
-    services.websites.env.tools.vhostConfs.cipca_sympa = {
-      certName     = "cip-ca";
-      certMainHost = "mail.cip-ca.fr";
-      hosts        = [ "mail.cip-ca.fr" ];
-      root         = null;
-      extraConfig = [
-        ''
-          Alias /static-sympa/ /var/lib/sympa/static_content/
-          <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>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/commons/adminer.nix b/modules/private/websites/commons/adminer.nix
deleted file mode 100644 (file)
index eae6a9a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-{ config, callPackage }:
-callPackage ../tools/tools/adminer.nix {
-  forcePhpSocket = config.services.phpfpm.pools.adminer.socket;
-}
diff --git a/modules/private/websites/connexionswing/app/default.nix b/modules/private/websites/connexionswing/app/default.nix
deleted file mode 100644 (file)
index b14b03b..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-{ environment, varDir, secretsPath
-, composerEnv, fetchurl, fetchgit, sources }:
-let
-  app = composerEnv.buildPackage (
-    import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
-    rec {
-      pname = "connexionswing";
-      name = "${pname}-${version}";
-      version = sources.websites-connexionswing-app.version;
-      src = sources.websites-connexionswing-app;
-      noDev = (environment == "prod");
-      preInstall = ''
-          export SYMFONY_ENV="${environment}"
-      '';
-      postInstall = ''
-          cd $out
-          ${if environment == "prod" then "php ./bin/console assetic:dump --env=prod --no-debug" else ""}
-          rm app/config/parameters.yml
-          ln -sf ${secretsPath} app/config/parameters.yml
-          rm -rf var/{logs,cache}
-          ln -sf ${varDir}/var/{logs,cache} var/
-          ln -sf ${varDir}/{medias,uploads} web/images/
-      '';
-      passthru = {
-        inherit varDir environment;
-        webRoot = "${app}/web";
-      };
-    });
-in app
diff --git a/modules/private/websites/connexionswing/app/php-packages.nix b/modules/private/websites/connexionswing/app/php-packages.nix
deleted file mode 100644 (file)
index 10bb737..0000000
+++ /dev/null
@@ -1,597 +0,0 @@
-# Generated with composer2nix and adapted to return only the list of
-# packages
-{ composerEnv, fetchurl, fetchgit ? null }:
-{
-  packages = {
-    "behat/transliterator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
-        src = fetchurl {
-          url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
-          sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
-        };
-      };
-    };
-    "components/bootstrap" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "components-bootstrap-670295b9d6170a79acc8586a15e729bf24128275";
-        src = fetchurl {
-          url = https://api.github.com/repos/components/bootstrap/zipball/670295b9d6170a79acc8586a15e729bf24128275;
-          sha256 = "0lcq9cjnywvf1nd8k99flgcf2dmfgyyxzsvcpip8xiibmh5x04p9";
-        };
-      };
-    };
-    "components/jquery" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "components-jquery-5dd7297d7603e11e53bdcca2a71074d92de37b8f";
-        src = fetchurl {
-          url = https://api.github.com/repos/components/jquery/zipball/5dd7297d7603e11e53bdcca2a71074d92de37b8f;
-          sha256 = "1maplw3yic1pzbwwl2amjlivipsi1w0r8bq7i0mmjaqf7wij506i";
-        };
-      };
-    };
-    "components/jqueryui" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "components-jqueryui-44ecf3794cc56b65954cc19737234a3119d036cc";
-        src = fetchurl {
-          url = https://api.github.com/repos/components/jqueryui/zipball/44ecf3794cc56b65954cc19737234a3119d036cc;
-          sha256 = "1y0ppxk44jkxbh38i05sg0zcgk927s5wy6sjngwr5qifibqbcbhk";
-        };
-      };
-    };
-    "composer/ca-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "composer-ca-bundle-d2c0a83b7533d6912e8d516756ebd34f893e9169";
-        src = fetchurl {
-          url = https://api.github.com/repos/composer/ca-bundle/zipball/d2c0a83b7533d6912e8d516756ebd34f893e9169;
-          sha256 = "1as399dzrfbjnifb87j1g5cvrbacyddbay8fv59i56xx1bdq7lwc";
-        };
-      };
-    };
-    "doctrine/annotations" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-annotations-54cacc9b81758b14e3ce750f205a393d52339e97";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97;
-          sha256 = "1wi5skihqbcinlkrkr15nmmvqkn2gydqib8xl232abdvfq1q0w24";
-        };
-      };
-    };
-    "doctrine/cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-cache-eb152c5100571c7a45470ff2a35095ab3f3b900b";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b;
-          sha256 = "0iq0qqv1smlqz63jhj2fpjy54c5dwfwxyf5c89iky6i0yb81gwyd";
-        };
-      };
-    };
-    "doctrine/collections" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-collections-1a4fb7e902202c33cce8c55989b945612943c2ba";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba;
-          sha256 = "0fkiwkx7zbmfnh4p21za807lh1n7g1f4lpgy8y59g4r5krvpl90w";
-        };
-      };
-    };
-    "doctrine/common" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-common-4acb8f89626baafede6ee5475bc5844096eba8a9";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9;
-          sha256 = "0qjqframvg81z3lwqaj5haanqj9v3dfbj170pxmwlgmrfsbr16zh";
-        };
-      };
-    };
-    "doctrine/dbal" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873;
-          sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3";
-        };
-      };
-    };
-    "doctrine/doctrine-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-bundle-703fad32e4c8cbe609caf45a71a1d4266c830f0f";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/703fad32e4c8cbe609caf45a71a1d4266c830f0f;
-          sha256 = "0v2f63j22i3im8jbmv7spi8j42fay6dnxjvbxnbwj190ajxl6sdp";
-        };
-      };
-    };
-    "doctrine/doctrine-cache-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-cache-bundle-4c8e363f96427924e7e519c5b5119b4f54512697";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/4c8e363f96427924e7e519c5b5119b4f54512697;
-          sha256 = "1irm04iijzq6gziknwyb10a9s0xbzh04xs5i2d6aac86cc29187c";
-        };
-      };
-    };
-    "doctrine/doctrine-migrations-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-migrations-bundle-a9e506369f931351a2a6dd2aef588a822802b1b7";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/a9e506369f931351a2a6dd2aef588a822802b1b7;
-          sha256 = "1jgrqsgdwcm2g8rml76qr6b19s1vxfbnrp43qr6n1g9kbx7y9wg9";
-        };
-      };
-    };
-    "doctrine/inflector" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-inflector-90b2128806bfde671b6952ab8bea493942c1fdae";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae;
-          sha256 = "01vmclj3k7xil51jg329fznshh8d07pvm4mr89lvfn1d7fyrq6qw";
-        };
-      };
-    };
-    "doctrine/instantiator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-instantiator-8e884e78f9f0eb1329e445619e04456e64d8051d";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d;
-          sha256 = "15dcja45rnwya431pcm826l68k1g8f1fabl7rih69alcdyvdlln4";
-        };
-      };
-    };
-    "doctrine/lexer" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
-          sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
-        };
-      };
-    };
-    "doctrine/migrations" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-migrations-c81147c0f2938a6566594455367e095150547f72";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/migrations/zipball/c81147c0f2938a6566594455367e095150547f72;
-          sha256 = "0x8hvxbm3f40sx25nq8zlh1kr936pagghzp89l0gdy5bar7cdzi5";
-        };
-      };
-    };
-    "doctrine/orm" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-orm-810a7baf81462a5ddf10e8baa8cb94b6eec02754";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/doctrine2/zipball/810a7baf81462a5ddf10e8baa8cb94b6eec02754;
-          sha256 = "1hmkc7917kgnav9hmlgvlp7qwm3zjj910ci71g9yqwjh6s28wrf1";
-        };
-      };
-    };
-    "fig/link-util" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac;
-          sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64";
-        };
-      };
-    };
-    "friendsofsymfony/jsrouting-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "friendsofsymfony-jsrouting-bundle-49c1069132dcef371fb526351569deabeb6f0d8e";
-        src = fetchurl {
-          url = https://api.github.com/repos/FriendsOfSymfony/FOSJsRoutingBundle/zipball/49c1069132dcef371fb526351569deabeb6f0d8e;
-          sha256 = "0ymmxhxbjnzj8bk3zq55vq0xvsaq82348v321gy2jyi90d19p5j7";
-        };
-      };
-    };
-    "gedmo/doctrine-extensions" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "gedmo-doctrine-extensions-1e400fbd05b7e5f912f55fe95805450f7d3bed60";
-        src = fetchurl {
-          url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/1e400fbd05b7e5f912f55fe95805450f7d3bed60;
-          sha256 = "14hmivynyzc1c9l5kxj9gbwjrkv9m9lrjjx2r1m74wdhi5p0p20v";
-        };
-      };
-    };
-    "immae/connexionswing-ckeditor-component" = {
-      targetDir = "";
-      src = fetchgit {
-        name = "immae-connexionswing-ckeditor-component-3b35bd273a79f6b01fda7a246aed64aca147ea7a";
-        url = "https://git.immae.eu/perso/Immae/Projets/packagist/connexionswing-ckeditor-component.git";
-        rev = "3b35bd273a79f6b01fda7a246aed64aca147ea7a";
-        sha256 = "1w0y6k28ci73n0db9gwvqg7grzvh1z718ys9v1ik8cla7zw83bni";
-      };
-    };
-    "immae/jquery-touchswipe" = {
-      targetDir = "";
-      src = fetchgit {
-        name = "immae-jquery-touchswipe-3e15949df974d6612d76dc9ee75cd976dbcc2114";
-        url = "https://git.immae.eu/perso/Immae/Projets/packagist/jquery-touchswipe.git";
-        rev = "3e15949df974d6612d76dc9ee75cd976dbcc2114";
-        sha256 = "1pnvki1j3a65cdwwqs0id790ni813lh3r0m7556gdn0hsqa1cc4d";
-      };
-    };
-    "incenteev/composer-parameter-handler" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550";
-        src = fetchurl {
-          url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550;
-          sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm";
-        };
-      };
-    };
-    "jdorn/sql-formatter" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
-        src = fetchurl {
-          url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
-          sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
-        };
-      };
-    };
-    "kriswallsmith/assetic" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1";
-        src = fetchurl {
-          url = https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1;
-          sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8";
-        };
-      };
-    };
-    "monolog/monolog" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "monolog-monolog-fd8c787753b3a2ad11bc60c063cff1358a32a3b4";
-        src = fetchurl {
-          url = https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4;
-          sha256 = "0avf3y8raw23krwdb7kw9qb5bsr5ls4i7qd2vh7hcds3qjixg3h9";
-        };
-      };
-    };
-    "ocramius/proxy-manager" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "ocramius-proxy-manager-57e9272ec0e8deccf09421596e0e2252df440e11";
-        src = fetchurl {
-          url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/57e9272ec0e8deccf09421596e0e2252df440e11;
-          sha256 = "10crhcnhz42b01i6lv6ysgc7awp7yw82p4i2a4sg6bjihw677yps";
-        };
-      };
-    };
-    "paragonie/random_compat" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "paragonie-random_compat-258c89a6b97de7dfaf5b8c7607d0478e236b04fb";
-        src = fetchurl {
-          url = https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb;
-          sha256 = "11arrici2mgfj7r847wm423pqrvfj9wn9jcgyxnq4rzyahaxz5l1";
-        };
-      };
-    };
-    "psr/cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
-          sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
-        };
-      };
-    };
-    "psr/container" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
-          sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
-        };
-      };
-    };
-    "psr/link" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562;
-          sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13";
-        };
-      };
-    };
-    "psr/log" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-log-4ebe3a8bf773a19edfe0a84b6585ba3d401b724d";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d;
-          sha256 = "1mlcv17fjw39bjpck176ah1z393b6pnbw3jqhhrblj27c70785md";
-        };
-      };
-    };
-    "psr/simple-cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
-          sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
-        };
-      };
-    };
-    "ricbra/robots-txt-bundle" = {
-      targetDir = "Ricbra/Bundle/RobotsTxtBundle";
-      src = composerEnv.buildZipPackage {
-        name = "ricbra-robots-txt-bundle-80d122a708893a762041464890e59a76babd6c22";
-        src = fetchurl {
-          url = https://api.github.com/repos/ricbra/robots-txt-bundle/zipball/80d122a708893a762041464890e59a76babd6c22;
-          sha256 = "0w3lfzy1ys0bwl3shy4ychldfd711w1p2y13i1az2z2gh731d0ad";
-        };
-      };
-    };
-    "robloach/component-installer" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "robloach-component-installer-908a859aa7c4949ba9ad67091e67bac10b66d3d7";
-        src = fetchurl {
-          url = https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7;
-          sha256 = "19y5sv4k338bihzmm8iac6q43r18vxhmbpvrdhz8jn39r51ampq9";
-        };
-      };
-    };
-    "sensio/distribution-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensio-distribution-bundle-eb6266b3b472e4002538610b28a0a04bcf94891a";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/eb6266b3b472e4002538610b28a0a04bcf94891a;
-          sha256 = "0wyffqj924lz9cv0vbahyngjw1g850v0p34swygzzgp3cr0ank13";
-        };
-      };
-    };
-    "sensio/framework-extra-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensio-framework-extra-bundle-bb907234df776b68922eb4b25bfa061683597b6a";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a;
-          sha256 = "011hcljjcfq5qy4a7mlf0hwqxyb58yci40ini0n5rqandcyk2nck";
-        };
-      };
-    };
-    "sensiolabs/security-checker" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensiolabs-security-checker-dc270d5fec418cc6ac983671dba5d80ffaffb142";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/security-checker/zipball/dc270d5fec418cc6ac983671dba5d80ffaffb142;
-          sha256 = "0fnshyd6f8j91a7y604nh6sqgscjl48mfa0727g2r4hkdfz8hpd1";
-        };
-      };
-    };
-    "swiftmailer/swiftmailer" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "swiftmailer-swiftmailer-7ffc1ea296ed14bf8260b6ef11b80208dbadba91";
-        src = fetchurl {
-          url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91;
-          sha256 = "1vl5pzgvr2yfrj1yfs02mi917b0gr56v76ibi40r51a3346zhp6v";
-        };
-      };
-    };
-    "symfony/assetic-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-assetic-bundle-2e0a23a4874838e26de6f025e02fc63328921a4c";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/assetic-bundle/zipball/2e0a23a4874838e26de6f025e02fc63328921a4c;
-          sha256 = "17rxrkyzxa6x5nn7qhhhdgx4z0nlznnq5fifza4wv9znca8bbwyc";
-        };
-      };
-    };
-    "symfony/monolog-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-monolog-bundle-8781649349fe418d51d194f8c9d212c0b97c40dd";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/monolog-bundle/zipball/8781649349fe418d51d194f8c9d212c0b97c40dd;
-          sha256 = "0wcqhg1vfdj3mxacr3fxpgqwy1rk9znjg9bmzx4jymk8l16i7bq8";
-        };
-      };
-    };
-    "symfony/polyfill-apcu" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-apcu-9b83bd010112ec196410849e840d9b9fefcb15ad";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/9b83bd010112ec196410849e840d9b9fefcb15ad;
-          sha256 = "0iiiqbn0bs0zqc95nz8l1qa5ysy0iifx4f27r9wnhzsh6f1h02mv";
-        };
-      };
-    };
-    "symfony/polyfill-intl-icu" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-intl-icu-80ee17ae83c10cd513e5144f91a73607a21edb4e";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/80ee17ae83c10cd513e5144f91a73607a21edb4e;
-          sha256 = "1hck9bn8zfb1pmx2yccf4w5dd9rbmvwii7hncin6px6nasi6wzvv";
-        };
-      };
-    };
-    "symfony/polyfill-mbstring" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-mbstring-3296adf6a6454a050679cde90f95350ad604b171";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171;
-          sha256 = "02wyx9fjx9lyc5q5d3bnn8aw9xag8im2wqanmbkljwd5vmx9k9b2";
-        };
-      };
-    };
-    "symfony/polyfill-php56" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-php56-af98553c84912459db3f636329567809d639a8f6";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-php56/zipball/af98553c84912459db3f636329567809d639a8f6;
-          sha256 = "1l1ydsd7cq3s97cpgl4fw1qxc2wmv27yfxa3q8ng9p66ypzvkw42";
-        };
-      };
-    };
-    "symfony/polyfill-php70" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-php70-77454693d8f10dd23bb24955cffd2d82db1007a6";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-php70/zipball/77454693d8f10dd23bb24955cffd2d82db1007a6;
-          sha256 = "146d620ca725iqdh7j0dqb99h20d4vs641c9vjy9x4jws3rgj905";
-        };
-      };
-    };
-    "symfony/polyfill-util" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-util-1a5ad95d9436cbff3296034fe9f8d586dce3fb3a";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-util/zipball/1a5ad95d9436cbff3296034fe9f8d586dce3fb3a;
-          sha256 = "0l7w4dlr7y3qijpaiq7hfhbhv1qqz9jjknr1n6k4vrss2a8d1sxk";
-        };
-      };
-    };
-    "symfony/swiftmailer-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec;
-          sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01";
-        };
-      };
-    };
-    "symfony/symfony" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-symfony-4babd75194d45f7a4412560038924f3008c67ef2";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/symfony/zipball/4babd75194d45f7a4412560038924f3008c67ef2;
-          sha256 = "1347qp994yg6k91v5gwdwnn202bz92m0pj4090b59z5nqxh7463d";
-        };
-      };
-    };
-    "twig/extensions" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "twig-extensions-d188c76168b853481cc75879ea045bf93d718e9c";
-        src = fetchurl {
-          url = https://api.github.com/repos/twigphp/Twig-extensions/zipball/d188c76168b853481cc75879ea045bf93d718e9c;
-          sha256 = "0d6wywys5fqzi3m8g8h3sb5phl5y3a7vfc95n214mqp0iwrcmzwm";
-        };
-      };
-    };
-    "twig/twig" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "twig-twig-b48680b6eb7d16b5025b9bfc4108d86f6b8af86f";
-        src = fetchurl {
-          url = https://api.github.com/repos/twigphp/Twig/zipball/b48680b6eb7d16b5025b9bfc4108d86f6b8af86f;
-          sha256 = "1q82f246wq7whl11lx00n0skwmllppvpzg20x6q4frmw44dc6v9a";
-        };
-      };
-    };
-    "willdurand/jsonp-callback-validator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "willdurand-jsonp-callback-validator-1a7d388bb521959e612ef50c5c7b1691b097e909";
-        src = fetchurl {
-          url = https://api.github.com/repos/willdurand/JsonpCallbackValidator/zipball/1a7d388bb521959e612ef50c5c7b1691b097e909;
-          sha256 = "19ds8f3nbss4b2xvqkcjkcvz0l4c5nhrm8w8yxc8a508r0jmd9in";
-        };
-      };
-    };
-    "zendframework/zend-code" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-code-95033f061b083e16cdee60530ec260d7d628b887";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-code/zipball/95033f061b083e16cdee60530ec260d7d628b887;
-          sha256 = "0h77qf267l2sp9wg3n61dpgpf6wh6p5jssy8mrg7vlns2j03f9f5";
-        };
-      };
-    };
-    "zendframework/zend-eventmanager" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd;
-          sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n";
-        };
-      };
-    };
-  };
-  devPackages = {
-    "doctrine/data-fixtures" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-data-fixtures-17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/data-fixtures/zipball/17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e;
-          sha256 = "15k7vl58kwh02g0a93rab82ifbgmc91srgminzlkjq5kx8agh7ab";
-        };
-      };
-    };
-    "doctrine/doctrine-fixtures-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-fixtures-bundle-74b8cc70a4a25b774628ee59f4cdf3623a146273";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273;
-          sha256 = "1bbflq8k6izwqgp9ka2gyb5y96a80b4lnlc5wrgc5gnih7hqidlf";
-        };
-      };
-    };
-    "sensio/generator-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65;
-          sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3";
-        };
-      };
-    };
-    "symfony/phpunit-bridge" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-phpunit-bridge-7470518370113785f67a7fd8e6e1667661e88805";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/7470518370113785f67a7fd8e6e1667661e88805;
-          sha256 = "0jd28ag0wks9sv62rkwsbx68csvdl5gabbz2h01hkqpa23gdkhs9";
-        };
-      };
-    };
-  };
-}
diff --git a/modules/private/websites/connexionswing/integration.nix b/modules/private/websites/connexionswing/integration.nix
deleted file mode 100644 (file)
index 9cf2b94..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  secrets = config.myEnv.websites.connexionswing.integration;
-  webRoot = "/var/lib/ftp/immae/connexionswing/web";
-  varDir = "/var/lib/ftp/immae/connexionswing_var";
-  cfg = config.myServices.websites.connexionswing.integration;
-  pcfg = config.services.phpApplication;
-in {
-  options.myServices.websites.connexionswing.integration.enable = lib.mkEnableOption "enable Connexionswing's website in integration";
-
-  config = lib.mkIf cfg.enable {
-    services.phpApplication.apps.connexionswing_integration = {
-      websiteEnv = "integration";
-      httpdUser = config.services.httpd.Inte.user;
-      httpdGroup = config.services.httpd.Inte.group;
-      inherit webRoot varDir;
-      varDirPaths = {
-        "medias" = "0700";
-        "uploads" = "0700";
-        "var" = "0700";
-      };
-      app = "/var/lib/ftp/immae/connexionswing";
-      serviceDeps = [ "mysql.service" ];
-      preStartActions = [
-        "./bin/console --env=dev cache:clear --no-warmup"
-      ];
-      phpOpenbasedir = [ "/tmp" "/run/wrappers/bin/sendmail" ];
-      phpPool = {
-        "php_admin_value[upload_max_filesize]" = "20M";
-        "php_admin_value[post_max_size]" = "20M";
-        #"php_admin_flag[log_errors]" = "on";
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-        };
-      phpEnv = {
-        SYMFONY_DEBUG_MODE = "\"yes\"";
-      };
-      phpWatchFiles = [
-        config.secrets.fullPaths."websites/connexionswing/integration"
-      ];
-      phpPackage = pkgs.php72;
-    };
-
-    secrets.keys."websites/connexionswing/integration" = {
-      user = config.services.httpd.Inte.user;
-      group = config.services.httpd.Inte.group;
-      permissions = "0400";
-      text = ''
-        # This file is auto-generated during the composer install
-        parameters:
-            database_host: ${secrets.mysql.host}
-            database_port: ${secrets.mysql.port}
-            database_name: ${secrets.mysql.database}
-            database_user: ${secrets.mysql.user}
-            database_password: ${secrets.mysql.password}
-            database_server_version: ${pkgs.mariadb.mysqlVersion}
-            mailer_transport: sendmail
-            mailer_host: null
-            mailer_user: null
-            mailer_password: null
-            subscription_email: ${secrets.email}
-            allow_robots: true
-            secret: ${secrets.secret}
-      '';
-    };
-
-    services.websites.env.integration.vhostConfs.connexionswing_integration = {
-      certName    = "integration";
-      addToCerts  = true;
-      hosts       = ["connexionswing.cs.immae.dev" "sandetludo.cs.immae.dev" ];
-      root        = webRoot;
-      extraConfig = [
-        ''
-        <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>
-        ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/connexionswing/production.nix b/modules/private/websites/connexionswing/production.nix
deleted file mode 100644 (file)
index 4b0407f..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  secrets = config.myEnv.websites.connexionswing.production;
-  app = pkgs.callPackage ./app {
-    composerEnv = pkgs.composerEnv.override { php = pkgs.php72; };
-    environment = secrets.environment;
-    varDir = "/var/lib/connexionswing_production";
-    secretsPath = config.secrets.fullPaths."websites/connexionswing/production";
-  };
-  cfg = config.myServices.websites.connexionswing.production;
-  pcfg = config.services.phpApplication;
-in {
-  options.myServices.websites.connexionswing.production.enable = lib.mkEnableOption "enable Connexionswing's website in production";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "connexionswing.com"; } ];
-    services.phpApplication.apps.connexionswing_production = {
-      websiteEnv = "production";
-      httpdUser = config.services.httpd.Prod.user;
-      httpdGroup = config.services.httpd.Prod.group;
-      inherit (app) webRoot varDir;
-      varDirPaths = {
-        "medias" = "0700";
-        "uploads" = "0700";
-        "var" = "0700";
-      };
-      inherit app;
-      serviceDeps = [ "mysql.service" ];
-      preStartActions = [
-        "./bin/console --env=${app.environment} cache:clear --no-warmup"
-      ];
-      phpOpenbasedir = [ "/tmp" "/run/wrappers/bin/sendmail" ];
-      phpPool = {
-        "php_admin_value[upload_max_filesize]" = "20M";
-        "php_admin_value[post_max_size]" = "20M";
-        #"php_admin_flag[log_errors]" = "on";
-        "pm" = "dynamic";
-        "pm.max_children" = "20";
-        "pm.start_servers" = "2";
-        "pm.min_spare_servers" = "1";
-        "pm.max_spare_servers" = "3";
-      };
-      phpWatchFiles = [
-        config.secrets.fullPaths."websites/connexionswing/production"
-      ];
-      phpPackage = pkgs.php72;
-    };
-
-    secrets.keys."websites/connexionswing/production" = {
-      user = config.services.httpd.Prod.user;
-      group = config.services.httpd.Prod.group;
-      permissions = "0400";
-      text = ''
-        # This file is auto-generated during the composer install
-        parameters:
-            database_host: ${secrets.mysql.host}
-            database_port: ${secrets.mysql.port}
-            database_name: ${secrets.mysql.database}
-            database_user: ${secrets.mysql.user}
-            database_password: ${secrets.mysql.password}
-            database_server_version: ${pkgs.mariadb.mysqlVersion}
-            mailer_transport: sendmail
-            mailer_host: null
-            mailer_user: null
-            mailer_password: null
-            subscription_email: ${secrets.email}
-            allow_robots: true
-            secret: ${secrets.secret}
-        services:
-          swiftmailer.mailer.default.transport:
-              class:     Swift_SendmailTransport
-              arguments: ['/run/wrappers/bin/sendmail -bs']
-      '';
-    };
-
-    services.websites.env.production.vhostConfs.connexionswing_production = {
-      certName     = "connexionswing";
-      certMainHost = "connexionswing.com";
-      hosts        = ["connexionswing.com" "sandetludo.com" "www.connexionswing.com" "www.sandetludo.com" ];
-      root         = app.webRoot;
-      extraConfig  = [
-        ''
-        <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>
-        ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/denise/aventuriers.nix b/modules/private/websites/denise/aventuriers.nix
deleted file mode 100644 (file)
index 2bbf7bf..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-{ lib, config, pkgs, ... }:
-let
-  cfg = config.myServices.websites.denise.aventuriers;
-  varDir = "/var/lib/buildbot/outputs/denise/aventuriers";
-in {
-  options.myServices.websites.denise.aventuriers.enable = lib.mkEnableOption "enable Denise's Aventuriers website";
-
-  config = lib.mkIf cfg.enable {
-    services.websites.env.production.vhostConfs.denise_aventuriers = {
-      certName     = "denise";
-      addToCerts   = true;
-      hosts        = [ "aventuriers.syanni.eu" ];
-      root         = varDir;
-      extraConfig  = [
-        ''
-          <Directory ${varDir}>
-            DirectoryIndex aventuriers.html
-            Options Indexes FollowSymLinks MultiViews Includes
-            AllowOverride None
-            Require all granted
-          </Directory>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/denise/bingo.nix b/modules/private/websites/denise/bingo.nix
deleted file mode 100644 (file)
index 9130462..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-{ lib, config, pkgs, ... }:
-let
-  cfg = config.myServices.websites.denise.bingo;
-  varDir = "/var/lib/buildbot/outputs/denise/bingo";
-  varDirBeta = "/var/lib/buildbot/outputs/denise/bingo_beta";
-  socket = "/run/denise_bingo/socket.sock";
-  socket_beta = "/run/denise_bingo_beta/socket.sock";
-in {
-  options.myServices.websites.denise.bingo.enable = lib.mkEnableOption "enable Denise's bingo website";
-
-  config = lib.mkIf cfg.enable {
-    services.websites.env.production.vhostConfs.denise_bingo = {
-      certName     = "denise";
-      addToCerts   = true;
-      hosts        = [ "bingo.syanni.eu" ];
-      root         = null;
-      extraConfig  = [
-        ''
-        ProxyPreserveHost on
-        ProxyVia On
-        ProxyRequests Off
-        ProxyPassMatch ^/.well-known/acme-challenge !
-        ProxyPass / unix://${socket}|http://bingo.syanni.eu/
-        ProxyPassReverse / unix://${socket}|http://bingo.syanni.eu/
-          ''
-      ];
-    };
-
-    systemd.services.denise-bingo = {
-      description = "Denise bingo website";
-      after = [ "network.target" ];
-      wantedBy = [ "multi-user.target" ];
-
-      serviceConfig = {
-        Type = "simple";
-        WorkingDirectory = varDir;
-        ExecStart = let
-          python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.matplotlib p.unidecode ]);
-        in
-          "${python}/bin/gunicorn -w4 -p /run/denise_bingo/gunicorn.pid --bind unix:${socket} app:app";
-        User = "wwwrun";
-        Restart = "always";
-        RestartSec = "5s";
-        PIDFile = "/run/denise_bingo/gunicorn.pid";
-        RuntimeDirectory = "denise_bingo";
-        StandardOutput = "journal";
-        StandardError = "inherit";
-      };
-    };
-
-    security.sudo.extraRules = [
-      {
-        commands = [
-          { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-bingo-beta.service"; }
-          { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-bingo.service"; }
-        ];
-        users = ["buildbot"];
-        runAs = "root";
-      }
-    ];
-    services.websites.env.integration.vhostConfs.denise_bingo_beta = {
-      certName     = "denise";
-      addToCerts   = true;
-      hosts        = [ "beta.bingo.syanni.eu" ];
-      root         = null;
-      extraConfig  = [
-        ''
-        ProxyPreserveHost on
-        ProxyVia On
-        ProxyRequests Off
-        ProxyPassMatch ^/.well-known/acme-challenge !
-        ProxyPass / unix://${socket_beta}|http://beta.bingo.syanni.eu/
-        ProxyPassReverse / unix://${socket_beta}|http://beta.bingo.syanni.eu/
-          ''
-      ];
-    };
-
-    systemd.services.denise-bingo-beta = {
-      description = "Denise bingo beta website";
-      after = [ "network.target" ];
-      wantedBy = [ "multi-user.target" ];
-
-      serviceConfig = {
-        Type = "simple";
-        WorkingDirectory = varDirBeta;
-        ExecStart = let
-          python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask ]);
-        in
-          "${python}/bin/gunicorn -w4 -p /run/denise_bingo_beta/gunicorn.pid --bind unix:${socket_beta} app:app";
-        User = "wwwrun";
-        Restart = "always";
-        RestartSec = "5s";
-        PIDFile = "/run/denise_bingo_beta/gunicorn.pid";
-        RuntimeDirectory = "denise_bingo_beta";
-        StandardOutput = "journal";
-        StandardError = "inherit";
-      };
-    };
-  };
-}
diff --git a/modules/private/websites/denise/denisejerome.nix b/modules/private/websites/denise/denisejerome.nix
deleted file mode 100644 (file)
index a75e591..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-{ lib, config, ... }:
-let
-  cfg = config.myServices.websites.denise.denisejerome;
-  varDir = "/var/lib/ftp/denise/denisejerome";
-  env = config.myEnv.websites.denisejerome;
-in {
-  options.myServices.websites.denise.denisejerome.enable = lib.mkEnableOption "enable Denise Jerome's website";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "denisejerome.piedsjaloux.fr"; } ];
-
-    services.websites.env.production.vhostConfs.denise_denisejerome = {
-      certName     = "denise";
-      certMainHost = "denisejerome.piedsjaloux.fr";
-      hosts        = ["denisejerome.piedsjaloux.fr" ];
-      root         = varDir;
-      extraConfig  = [
-        ''
-        Use Stats denisejerome.piedsjaloux.fr
-
-        <Directory ${varDir}>
-          DirectoryIndex index.htm index.html
-          Options Indexes FollowSymLinks MultiViews Includes
-          AllowOverride AuthConfig
-          Require all granted
-        </Directory>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/denise/evariste.nix b/modules/private/websites/denise/evariste.nix
deleted file mode 100644 (file)
index 42f9b2e..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-{ lib, config, pkgs, ... }:
-let
-  cfg = config.myServices.websites.denise.evariste;
-  nsiVarDir = "/var/lib/ftp/denise/nsievariste";
-  stmgVarDir = "/var/lib/ftp/denise/stmgevariste";
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-in {
-  options.myServices.websites.denise.evariste.enable = lib.mkEnableOption "enable NSI/STMG Evariste website";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [
-      { name = "nsievariste.immae.eu"; }
-      { name = "stmgevariste.immae.eu"; }
-    ];
-
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-    system.activationScripts.denise_evariste = {
-      deps = [ "httpd" ];
-      text = ''
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/denise_nsievariste
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/denise_stmgevariste
-        '';
-    };
-    services.phpfpm.pools.denise_nsievariste = {
-      user = apacheUser;
-      group = apacheGroup;
-      settings = {
-        "listen.owner" = apacheUser;
-        "listen.group" = apacheGroup;
-
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-
-        "php_admin_value[open_basedir]" = "/var/lib/php/sessions/denise_nsievariste:${nsiVarDir}:/tmp";
-        "php_admin_value[session.save_path]" = "/var/lib/php/sessions/denise_nsievariste";
-      };
-      phpPackage = pkgs.php72;
-    };
-    services.websites.env.production.vhostConfs.denise_nsievariste = {
-      certName     = "denise_evariste";
-      addToCerts   = true;
-      certMainHost = "nsievariste.immae.eu";
-      hosts        = ["nsievariste.immae.eu" ];
-      root         = nsiVarDir;
-      extraConfig  = [
-        ''
-        Use Stats nsievariste.immae.eu
-
-        <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>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/denise/oms.nix b/modules/private/websites/denise/oms.nix
deleted file mode 100644 (file)
index 2f18037..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-{ lib, config, pkgs, ... }:
-let
-  cfg = config.myServices.websites.denise.oms;
-  varDir = "/var/lib/buildbot/outputs/denise/oms";
-  varDirBeta = "/var/lib/buildbot/outputs/denise/oms_beta";
-  socket = "/run/denise_oms/socket.sock";
-  socket_beta = "/run/denise_oms_beta/socket.sock";
-in {
-  options.myServices.websites.denise.oms.enable = lib.mkEnableOption "enable Denise's OMS website";
-
-  config = lib.mkIf cfg.enable {
-    services.websites.env.production.vhostConfs.denise_oms = {
-      certName     = "denise";
-      addToCerts   = true;
-      hosts        = [ "oms.syanni.eu" ];
-      root         = null;
-      extraConfig  = [
-        ''
-        ProxyPreserveHost on
-        ProxyVia On
-        ProxyRequests Off
-        ProxyPassMatch ^/.well-known/acme-challenge !
-        ProxyPass / unix://${socket}|http://oms.syanni.eu/
-        ProxyPassReverse / unix://${socket}|http://oms.syanni.eu/
-          ''
-      ];
-    };
-
-    systemd.services.denise-oms = {
-      description = "Denise OMS website";
-      after = [ "network.target" ];
-      wantedBy = [ "multi-user.target" ];
-
-      serviceConfig = {
-        Type = "simple";
-        WorkingDirectory = varDir;
-        ExecStart = let
-          python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.matplotlib p.unidecode ]);
-        in
-          "${python}/bin/gunicorn -w4 -p /run/denise_oms/gunicorn.pid --bind unix:${socket} app:app";
-        User = "wwwrun";
-        Restart = "always";
-        RestartSec = "5s";
-        PIDFile = "/run/denise_oms/gunicorn.pid";
-        RuntimeDirectory = "denise_oms";
-        StandardOutput = "journal";
-        StandardError = "inherit";
-      };
-    };
-
-    security.sudo.extraRules = [
-      {
-        commands = [
-          { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-oms-beta.service"; }
-          { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-oms.service"; }
-        ];
-        users = ["buildbot"];
-        runAs = "root";
-      }
-    ];
-    services.websites.env.integration.vhostConfs.denise_oms_beta = {
-      certName     = "denise";
-      addToCerts   = true;
-      hosts        = [ "beta.oms.syanni.eu" ];
-      root         = null;
-      extraConfig  = [
-        ''
-        ProxyPreserveHost on
-        ProxyVia On
-        ProxyRequests Off
-        ProxyPassMatch ^/.well-known/acme-challenge !
-        ProxyPass / unix://${socket_beta}|http://beta.oms.syanni.eu/
-        ProxyPassReverse / unix://${socket_beta}|http://beta.oms.syanni.eu/
-          ''
-      ];
-    };
-
-    systemd.services.denise-oms-beta = {
-      description = "Denise OMS beta website";
-      after = [ "network.target" ];
-      wantedBy = [ "multi-user.target" ];
-
-      serviceConfig = {
-        Type = "simple";
-        WorkingDirectory = varDirBeta;
-        ExecStart = let
-          python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.matplotlib p.unidecode ]);
-        in
-          "${python}/bin/gunicorn -w4 -p /run/denise_oms_beta/gunicorn.pid --bind unix:${socket_beta} app:app";
-        User = "wwwrun";
-        Restart = "always";
-        RestartSec = "5s";
-        PIDFile = "/run/denise_oms_beta/gunicorn.pid";
-        RuntimeDirectory = "denise_oms_beta";
-        StandardOutput = "journal";
-        StandardError = "inherit";
-      };
-    };
-  };
-}
diff --git a/modules/private/websites/denise/production.nix b/modules/private/websites/denise/production.nix
deleted file mode 100644 (file)
index 9b28e9e..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-{ lib, config, pkgs, ... }:
-let
-  cfg = config.myServices.websites.denise.production;
-in {
-  options.myServices.websites.denise.production.enable = lib.mkEnableOption "enable Denise's website";
-
-  config = lib.mkIf cfg.enable {
-    services.websites.env.production.vhostConfs.denise_production = {
-      certName     = "denise";
-      addToCerts   = true;
-      hosts        = [ "syanni.eu" "www.syanni.eu" ];
-      root         = ../_www;
-      extraConfig  = [
-        ''
-        <Directory ${../_www}>
-          DirectoryIndex index.htm index.html
-          Options Indexes FollowSymLinks MultiViews Includes
-          AllowOverride AuthConfig
-          Require all granted
-        </Directory>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/emilia/atelierfringant.nix b/modules/private/websites/emilia/atelierfringant.nix
deleted file mode 100644 (file)
index b47452f..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  cfg = config.myServices.websites.emilia.atelierfringant;
-  varDir = "/var/lib/ftp/emilia/atelierfringant";
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-in {
-  options.myServices.websites.emilia.atelierfringant.enable = lib.mkEnableOption "enable Émilia's website";
-
-  config = lib.mkIf cfg.enable {
-    system.activationScripts.emilia_atelierfringant = {
-      deps = [ "httpd" ];
-      text = ''
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/ftp/emilia/atelierfringant
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/emilia
-        '';
-    };
-    systemd.services.phpfpm-emilia_atelierfringant.after = lib.mkAfter [ "mysql.service" ];
-    systemd.services.phpfpm-emilia_atelierfringant.wants = [ "mysql.service" ];
-    services.phpfpm.pools.emilia_atelierfringant = {
-      user = apacheUser;
-      group = apacheGroup;
-      settings = {
-        "listen.owner" = apacheUser;
-        "listen.group" = apacheGroup;
-
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-
-        "php_admin_value[open_basedir]" = "/var/lib/php/sessions/emilia:${varDir}:/tmp";
-        "php_admin_value[session.save_path]" = "/var/lib/php/sessions/emilia";
-      };
-      phpOptions = config.services.phpfpm.phpOptions + ''
-        disable_functions = "mail"
-      '';
-      phpPackage = pkgs.php72;
-    };
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-    services.websites.env.production.vhostConfs.emilia_atelierfringant = {
-      certName     = "emilia";
-      certMainHost = "atelierfringant.org";
-      hosts        = ["atelierfringant.org" "www.atelierfringant.org" ];
-      root         = varDir;
-      extraConfig  = [
-        ''
-        <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>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/emilia/moodle.nix b/modules/private/websites/emilia/moodle.nix
deleted file mode 100644 (file)
index 779c460..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  cfg = config.myServices.websites.emilia.moodle;
-  env = config.myEnv.websites.emilia;
-  varDir = "/var/lib/emilia_moodle";
-  siteDir = ./moodle;
-  # php_admin_value[upload_max_filesize] = 50000000
-  # php_admin_value[post_max_size] = 50000000
-  configFile = ''
-    <?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>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/emilia/moodle/pause.html b/modules/private/websites/emilia/moodle/pause.html
deleted file mode 100644 (file)
index 8b99c59..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-<!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&nbsp;!</h1>
-      <div>
-        <p>Le site et les cours de photographie sont actuellement en pause.</p>
-      </div>
-    </article>
-  </body>
-</html>
diff --git a/modules/private/websites/florian/app.nix b/modules/private/websites/florian/app.nix
deleted file mode 100644 (file)
index 2df344f..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; };
-  secrets = config.myEnv.websites.tellesflorian.integration;
-  webRoot = "/var/lib/ftp/immae/florian/web";
-  cfg = config.myServices.websites.florian.app;
-  pcfg = config.services.phpApplication;
-in {
-  options.myServices.websites.florian.app.enable = lib.mkEnableOption "enable Florian's app in integration";
-
-  config = lib.mkIf cfg.enable {
-    services.phpApplication.apps.florian_app = {
-      websiteEnv = "integration";
-      httpdUser = config.services.httpd.Inte.user;
-      httpdGroup = config.services.httpd.Inte.group;
-      inherit webRoot;
-      varDir = "/var/lib/ftp/immae/florian_var";
-      varDirPaths = {
-        "var" = "0700";
-      };
-      app = "/var/lib/ftp/immae/florian";
-      serviceDeps = [ "mysql.service" ];
-      preStartActions = [
-        "./bin/console --env=dev cache:clear --no-warmup"
-      ];
-      phpOpenbasedir = [ "/tmp" ];
-      phpPool = {
-        "php_admin_value[upload_max_filesize]" = "20M";
-        "php_admin_value[post_max_size]" = "20M";
-        #"php_admin_flag[log_errors]" = "on";
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-      };
-      phpEnv = {
-        SYMFONY_DEBUG_MODE = "\"yes\"";
-      };
-      phpWatchFiles = [
-        config.secrets.fullPaths."websites/florian/app"
-      ];
-      phpPackage = pkgs.php72;
-    };
-
-    secrets.keys = {
-      "websites/florian/app_passwords" = {
-        user = config.services.httpd.Inte.user;
-        group = config.services.httpd.Inte.group;
-        permissions = "0400";
-        text = ''
-          invite:${secrets.invite_passwords}
-        '';
-      };
-      "websites/florian/app" = {
-        user = config.services.httpd.Inte.user;
-        group = config.services.httpd.Inte.group;
-        permissions = "0400";
-        text = ''
-          # This file is auto-generated during the composer install
-          parameters:
-            database_host: ${secrets.mysql.host}
-            database_port: ${secrets.mysql.port}
-            database_name: ${secrets.mysql.database}
-            database_user: ${secrets.mysql.user}
-            database_password: ${secrets.mysql.password}
-            mailer_transport: smtp
-            mailer_host: 127.0.0.1
-            mailer_user: null
-            mailer_password: null
-            secret: ${secrets.secret}
-        '';
-      };
-    };
-
-    services.websites.env.integration.modules = adminer.apache.modules;
-    services.websites.env.integration.vhostConfs.florian_app = {
-      certName    = "integration";
-      addToCerts  = true;
-      hosts       = [ "app.tellesflorian.com" ];
-      root        = webRoot;
-      extraConfig = [
-        ''
-        <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)
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/florian/app/default.nix b/modules/private/websites/florian/app/default.nix
deleted file mode 100644 (file)
index 28a7ec1..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-{ environment, varDir, secretsPath
-, composerEnv, fetchurl, sources }:
-let
-  app = composerEnv.buildPackage (
-    import ./php-packages.nix { inherit composerEnv fetchurl; } //
-    rec {
-      version = sources.websites-florian-app.version;
-      pname = "tellesflorian";
-      name = "${pname}-${version}";
-      src = sources.websites-florian-app;
-      noDev = (environment == "prod");
-      preInstall = ''
-        export SYMFONY_ENV="${environment}"
-        '';
-      postInstall = ''
-        cd $out
-        rm app/config/parameters.yml
-        ln -sf ${secretsPath} app/config/parameters.yml
-        rm -rf var/{logs,cache}
-        ln -sf ${varDir}/var/{logs,cache,sessions} var/
-        '';
-      passthru = {
-        inherit varDir environment;
-        webRoot = "${app}/web";
-      };
-    });
-in app
diff --git a/modules/private/websites/florian/app/php-packages.nix b/modules/private/websites/florian/app/php-packages.nix
deleted file mode 100644 (file)
index 0c7e00c..0000000
+++ /dev/null
@@ -1,389 +0,0 @@
-# Generated with composer2nix and adapted to return only the list of
-# packages
-{ composerEnv, fetchurl }:
-{
-  packages = {
-    "composer/ca-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "composer-ca-bundle-943b2c4fcad1ef178d16a713c2468bf7e579c288";
-        src = fetchurl {
-          url = https://api.github.com/repos/composer/ca-bundle/zipball/943b2c4fcad1ef178d16a713c2468bf7e579c288;
-          sha256 = "1gljia7akifp57w4rjzyh1km23kwymmvglz0mgafdgqzczcw0m6w";
-        };
-      };
-    };
-    "doctrine/annotations" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-annotations-f25c8aab83e0c3e976fd7d19875f198ccf2f7535";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535;
-          sha256 = "08vm22fqq8r4bg2fk06y4inqnc8x0yfmsss28w5ra2011x2phq4z";
-        };
-      };
-    };
-    "doctrine/cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-cache-eb152c5100571c7a45470ff2a35095ab3f3b900b";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b;
-          sha256 = "0iq0qqv1smlqz63jhj2fpjy54c5dwfwxyf5c89iky6i0yb81gwyd";
-        };
-      };
-    };
-    "doctrine/collections" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-collections-6c1e4eef75f310ea1b3e30945e9f06e652128b8a";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a;
-          sha256 = "1dkxr2vjycykpcnnmq68rcnn1ww0kbpizd5pxxm6x9i2ilj8cbn7";
-        };
-      };
-    };
-    "doctrine/common" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-common-7bce00698899aa2c06fe7365c76e4d78ddb15fa3";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/common/zipball/7bce00698899aa2c06fe7365c76e4d78ddb15fa3;
-          sha256 = "12yizcsxsbhhi8hwaik4zalr12n5nxbpld05zygqhx6miyr92jyd";
-        };
-      };
-    };
-    "doctrine/dbal" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873;
-          sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3";
-        };
-      };
-    };
-    "doctrine/doctrine-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-bundle-eb6e4fb904a459be28872765ab6e2d246aac7c87";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/eb6e4fb904a459be28872765ab6e2d246aac7c87;
-          sha256 = "0kkisgyblc9hf9x3zpbb1wif51fa8mi6svyd44nls38k9k93dp17";
-        };
-      };
-    };
-    "doctrine/doctrine-cache-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-cache-bundle-9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1;
-          sha256 = "08bqz18vk4673pnm2r2pcph6pdchc36zajnma1p9c6dp21sv7iki";
-        };
-      };
-    };
-    "doctrine/inflector" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-inflector-90b2128806bfde671b6952ab8bea493942c1fdae";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae;
-          sha256 = "01vmclj3k7xil51jg329fznshh8d07pvm4mr89lvfn1d7fyrq6qw";
-        };
-      };
-    };
-    "doctrine/instantiator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-instantiator-8e884e78f9f0eb1329e445619e04456e64d8051d";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d;
-          sha256 = "15dcja45rnwya431pcm826l68k1g8f1fabl7rih69alcdyvdlln4";
-        };
-      };
-    };
-    "doctrine/lexer" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
-          sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
-        };
-      };
-    };
-    "doctrine/orm" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-orm-810a7baf81462a5ddf10e8baa8cb94b6eec02754";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/doctrine2/zipball/810a7baf81462a5ddf10e8baa8cb94b6eec02754;
-          sha256 = "1hmkc7917kgnav9hmlgvlp7qwm3zjj910ci71g9yqwjh6s28wrf1";
-        };
-      };
-    };
-    "fig/link-util" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac;
-          sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64";
-        };
-      };
-    };
-    "incenteev/composer-parameter-handler" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550";
-        src = fetchurl {
-          url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550;
-          sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm";
-        };
-      };
-    };
-    "jdorn/sql-formatter" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
-        src = fetchurl {
-          url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
-          sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
-        };
-      };
-    };
-    "monolog/monolog" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "monolog-monolog-fd8c787753b3a2ad11bc60c063cff1358a32a3b4";
-        src = fetchurl {
-          url = https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4;
-          sha256 = "0avf3y8raw23krwdb7kw9qb5bsr5ls4i7qd2vh7hcds3qjixg3h9";
-        };
-      };
-    };
-    "paragonie/random_compat" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "paragonie-random_compat-5da4d3c796c275c55f057af5a643ae297d96b4d8";
-        src = fetchurl {
-          url = https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8;
-          sha256 = "1hp6pin4923c300yi85m7qk04gsrbygv52wv5zm7giyyf0k0g073";
-        };
-      };
-    };
-    "psr/cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
-          sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
-        };
-      };
-    };
-    "psr/container" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
-          sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
-        };
-      };
-    };
-    "psr/link" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562;
-          sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13";
-        };
-      };
-    };
-    "psr/log" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-log-4ebe3a8bf773a19edfe0a84b6585ba3d401b724d";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d;
-          sha256 = "1mlcv17fjw39bjpck176ah1z393b6pnbw3jqhhrblj27c70785md";
-        };
-      };
-    };
-    "psr/simple-cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
-          sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
-        };
-      };
-    };
-    "sensio/distribution-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensio-distribution-bundle-eb6266b3b472e4002538610b28a0a04bcf94891a";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/eb6266b3b472e4002538610b28a0a04bcf94891a;
-          sha256 = "0wyffqj924lz9cv0vbahyngjw1g850v0p34swygzzgp3cr0ank13";
-        };
-      };
-    };
-    "sensio/framework-extra-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensio-framework-extra-bundle-bf4940572e43af679aaa13be98f3446a1c237bd8";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bf4940572e43af679aaa13be98f3446a1c237bd8;
-          sha256 = "1kb1n5w3kfc0kf4pslqdx5pgp0g4hmaag0i00wvjj2n3pjfm5lhf";
-        };
-      };
-    };
-    "sensiolabs/security-checker" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensiolabs-security-checker-dc270d5fec418cc6ac983671dba5d80ffaffb142";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/security-checker/zipball/dc270d5fec418cc6ac983671dba5d80ffaffb142;
-          sha256 = "0fnshyd6f8j91a7y604nh6sqgscjl48mfa0727g2r4hkdfz8hpd1";
-        };
-      };
-    };
-    "swiftmailer/swiftmailer" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "swiftmailer-swiftmailer-7ffc1ea296ed14bf8260b6ef11b80208dbadba91";
-        src = fetchurl {
-          url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91;
-          sha256 = "1vl5pzgvr2yfrj1yfs02mi917b0gr56v76ibi40r51a3346zhp6v";
-        };
-      };
-    };
-    "symfony/monolog-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-monolog-bundle-8781649349fe418d51d194f8c9d212c0b97c40dd";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/monolog-bundle/zipball/8781649349fe418d51d194f8c9d212c0b97c40dd;
-          sha256 = "0wcqhg1vfdj3mxacr3fxpgqwy1rk9znjg9bmzx4jymk8l16i7bq8";
-        };
-      };
-    };
-    "symfony/polyfill-apcu" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-apcu-e8ae2136ddb53dea314df56fcd88e318ab936c00";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/e8ae2136ddb53dea314df56fcd88e318ab936c00;
-          sha256 = "07wdszb9ircnidjk3fp3cvcrggxv3sfm996jzd0a9pm6vfz9hymv";
-        };
-      };
-    };
-    "symfony/polyfill-intl-icu" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-intl-icu-254919c03761d46c29291616576ed003f10e91c1";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/254919c03761d46c29291616576ed003f10e91c1;
-          sha256 = "01yivzv7p55fzrkkyvgd57zpyz82zn1qp0h6nzr77k01rkv3w0ds";
-        };
-      };
-    };
-    "symfony/polyfill-mbstring" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-mbstring-78be803ce01e55d3491c1397cf1c64beb9c1b63b";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/78be803ce01e55d3491c1397cf1c64beb9c1b63b;
-          sha256 = "0cqr8ni6wpbaxa9gyr40y5bsv54pa2g8kdarlfw3qg2rgzmk0yz1";
-        };
-      };
-    };
-    "symfony/polyfill-php56" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-php56-ebc999ce5f14204c5150b9bd15f8f04e621409d8";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ebc999ce5f14204c5150b9bd15f8f04e621409d8;
-          sha256 = "0b2j56l6d6rdggx7vr20d527df4pjfp4lgxpglsgbf5912rcyf83";
-        };
-      };
-    };
-    "symfony/polyfill-php70" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-php70-3532bfcd8f933a7816f3a0a59682fc404776600f";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-php70/zipball/3532bfcd8f933a7816f3a0a59682fc404776600f;
-          sha256 = "151m76lc9w0kxnnwk4zdcjlmj7fppibnp8jisgpvvq32ml3fizdi";
-        };
-      };
-    };
-    "symfony/polyfill-util" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-util-e17c808ec4228026d4f5a8832afa19be85979563";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-util/zipball/e17c808ec4228026d4f5a8832afa19be85979563;
-          sha256 = "17sdpdidc0b701f9rippjv1grfci7wrdpy2i1inlwwpr6zy782cq";
-        };
-      };
-    };
-    "symfony/swiftmailer-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec;
-          sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01";
-        };
-      };
-    };
-    "symfony/symfony" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-symfony-874d4d659774d7bab90538072c83ed532dd17dc5";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/symfony/zipball/874d4d659774d7bab90538072c83ed532dd17dc5;
-          sha256 = "02rsn3sc34jh107n576jfbh666k06y44yr7hw61nir0d864k8api";
-        };
-      };
-    };
-    "twig/twig" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "twig-twig-9c24f2cd39dc1906b76879e099970b7e53724601";
-        src = fetchurl {
-          url = https://api.github.com/repos/twigphp/Twig/zipball/9c24f2cd39dc1906b76879e099970b7e53724601;
-          sha256 = "0brfj2lahrrw1322zy6jyd380hjks1ynzzkmq3875a282gzrfkdz";
-        };
-      };
-    };
-  };
-  devPackages = {
-    "sensio/generator-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65;
-          sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3";
-        };
-      };
-    };
-    "symfony/phpunit-bridge" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-phpunit-bridge-32b06d2b0babf3216e55acfce42249321a304f03";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/32b06d2b0babf3216e55acfce42249321a304f03;
-          sha256 = "0vw4q3lvz8gfs0r93ds8yymz8586k0czwa01c7d172rc8x02v0qq";
-        };
-      };
-    };
-  };
-}
diff --git a/modules/private/websites/florian/integration.nix b/modules/private/websites/florian/integration.nix
deleted file mode 100644 (file)
index 8ac1f46..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; };
-  cfg = config.myServices.websites.florian.integration;
-  varDir = "/var/lib/ftp/florian/www.ft.immae.dev";
-  env = config.myEnv.websites.florian;
-in {
-  options.myServices.websites.florian.integration.enable = lib.mkEnableOption "enable Florian's website integration";
-
-  config = lib.mkIf cfg.enable {
-    security.acme.certs."ftp".extraDomains."ft.immae.dev" = null;
-
-    services.websites.env.integration.modules = adminer.apache.modules;
-    services.websites.env.integration.vhostConfs.florian_integration = {
-      certName    = "integration";
-      addToCerts  = true;
-      hosts       = [ "www.ft.immae.dev" ];
-      root        = varDir;
-      extraConfig = [
-        (adminer.apache.vhostConf null)
-        ''
-        ServerAdmin ${env.server_admin}
-
-        <Directory ${varDir}>
-          DirectoryIndex index.php index.htm index.html
-          Options Indexes FollowSymLinks MultiViews Includes
-          AllowOverride None
-          Require all granted
-        </Directory>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/florian/production.nix b/modules/private/websites/florian/production.nix
deleted file mode 100644 (file)
index 1c5ffa6..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; };
-  cfg = config.myServices.websites.florian.production;
-  varDir = "/var/lib/ftp/florian/tellesflorian.com";
-  env = config.myEnv.websites.florian;
-in {
-  options.myServices.websites.florian.production.enable = lib.mkEnableOption "enable Florian's website production";
-
-  config = lib.mkIf cfg.enable {
-    security.acme.certs."ftp".extraDomains."tellesflorian.com" = null;
-
-    services.websites.env.production.modules = adminer.apache.modules;
-    services.websites.env.production.vhostConfs.florian_production = {
-      certName     = "florian";
-      certMainHost = "tellesflorian.com";
-      hosts        = [ "tellesflorian.com" "www.tellesflorian.com" ];
-      root         = varDir;
-      extraConfig  = [
-        (adminer.apache.vhostConf null)
-        ''
-        ServerAdmin ${env.server_admin}
-
-        <Directory ${varDir}>
-          DirectoryIndex index.php index.htm index.html
-          Options Indexes FollowSymLinks MultiViews Includes
-          AllowOverride None
-          Require all granted
-        </Directory>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/immae/chatons/immae-eu.properties b/modules/private/websites/immae/chatons/immae-eu.properties
deleted file mode 100644 (file)
index 32b2d47..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-# https://framagit.org/chatons/chatonsinfos/-/blob/master/MODELES/organization.properties
-
-# [File]
-file.class = organization
-file.protocol = ChatonsInfos-0.1
-file.datetime = 2021-01-11T22:23:00
-file.generator = Immae avec ses doigts
-
-# [Organisation]
-organization.country.name = France
-organization.country.code = FR
-organization.name = ImmaeEu
-organization.description = ImmaeEu est un CHATONS des Alpes Maritimes
-organization.website = https://www.immae.eu
-organization.logo = https://assets.immae.eu/logo.jpg
-organization.socialnetworks.diaspora = https://diaspora.immae.eu/people/1a185f29cc76cb35
-organization.socialnetworks.facebook = https://www.facebook.com/ismael.bouya
-organization.socialnetworks.mastodon = https://mastodon.immae.eu/@immae
-organization.socialnetworks.peertube = https://peertube.immae.eu/accounts/immae/
-organization.socialnetworks.twitter = https://twitter.com/_immae
-organization.chatrooms.xmpp = ismael@immae.fr
-organization.chatrooms.irc = immae@freenode
-organization.chatrooms.matrix = @immae:matrix.org
-organization.owner.name = Ismaël Bouya
-organization.owner.website = https://www.immae.eu
-organization.owner.logo = https://assets.immae.eu/logo.jpg
-organization.contact.url = https://www.immae.eu/contacts_fr.html
-organization.contact.email = contact@mail.immae.eu
-organization.legal.url = https://www.immae.eu/mentions.html
-organization.guide.technical = https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/
-organization.status.level = ACTIVE
-organization.status.description = En activité
-organization.startdate = 01/01/2019
-
-organization.memberof.chatons.startdate = 01/07/2019
-organization.memberof.chatons.status.level = ACTIVE
-organization.memberof.chatons.status.description = Participe au collectif
-
-# [Subs]
-# Un lien vers un fichier properties complémentaire (type URL, optionnel, ex. https://www.chapril.org/.well-known/chapril.properties).
-subs.etherpad = https://www.immae.eu/.well-known/chatonsinfos/service-etherpad.properties
-
-
-# [Metrics]
-#metrics.http.total.2020 =
-
diff --git a/modules/private/websites/immae/chatons/service-etherpad.properties b/modules/private/websites/immae/chatons/service-etherpad.properties
deleted file mode 100644 (file)
index cfcab1d..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-# service.properties
-
-# [File]
-# Classe du fichier (valeur parmi Federation/Organization/Service/Device, obligatoire).
-file.class = service
-
-# Version de l'ontologie utilisée utilisé (type STRING, recommandé).
-file.protocol = ChatonsInfos-0.1
-
-# Date et horaire de génération du fichier (type DATETIME, recommandé).
-file.datetime = 2021-01-04T00:01:00
-
-# Nom du générateur du fichier (type STRING, recommandé). Exemple : Florian avec ses doigts
-file.generator = Immae avec ses doigts
-
-
-# [Service]
-# Nom du service (type STRING, obligatoire). Exemple : Pad Exemple
-service.name = Etherpard
-
-# Description du service (type STRING, recommandé).
-service.description = Éditeur de texte collaboratif en temps réel. on peut y écrire simultanément.
-
-# Lien du site web du service (type URL, recommandé). Exemple : https://pad.exemple.ext
-service.website = https://ether.immae.eu
-
-# Lien du logo du service (type URL, recommandé, ex. https://www.chapril.org/.well-known/statoolinfos/chapril-logo-mini.png.
-service.logo = https://ether.immae.eu/favicon.ico
-
-# Lien de la page web des mentions légales du service (type URL, recommandé). Exemple : https://pad.exemple.ext/cgu.html
-service.legal.url = https://www.immae.eu/mentions.html
-
-# Lien de la documentation web du service (type URL, recommandé).
-service.guide.technical = https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/
-
-# Lien des aides web pour le service (type URL, recommandé).
-service.guide.user =  
-
-# Lien de la page de support du service (type URL, recommandé). Exemple : https://exemple.ext/contact.html
-service.contact.url = https://www.immae.eu/contacts_fr.html
-
-# Courriel du support du service (type EMAIL, recommandé). Exemple : contact@exemple.ext
-service.contact.email = contact@mail.immae.eu
-
-# Date d'ouverture du service (type DATE, recommandé). Exemple : 20/03/2020
-service.startdate = 01/01/2019
-
-# Date de fermeture du service (type DATE, optionnel).
-service.enddate = 
-
-# Statut du service (un parmi {OK,WARNING,ALERT,ERROR,OVER,VOID}, obligatoire).
-service.status.level = OK
-
-# Description du statut du service (type STRING, optionnel, exemple : mise à jour en cours)
-service.status.description = OK
-
-# Inscriptions requises pour utiliser le service (parmi None;Free;Member;Client, obligatoire). 
-service.registration = None
-
-# [Software]
-# Nom du logiciel (type STRING, obligatoire).
-software.name = Etherpad
-
-# Lien du site web du logiciel (type URL, recommandé).
-software.website = https://etherpad.org/
-
-# Lien web vers la licence du logiciel (type URL, obligatoire).
-software.license.url = https://github.com/ether/etherpad-lite/blob/develop/LICENSE
-
-# Nom de la licence du logiciel (type STRING, obligatoire).
-software.license.name = Apache License Version 2.0
-
-# Version du logiciel (type STRING, recommandé).
-software.version = 1.8.3
-
-# Lien web vers les sources du logiciel (type URL, recommandé).
-software.source.url = https://github.com/ether/etherpad-lite
-
-# Liste de modules optionnels installés (type VALUES, optionnel, ex. Nextcloud-Calendar,Nextcloud-Talk).
-software.modules = ep_align,ep_bookmark,ep_colors,ep_comments_page,ep_cursortrace,ep_delete_empty_pads,ep_embedmedia,ep_font_size,ep_headings2,ep_immae_buttons,ep_ldapauth,ep_line_height,ep_markdown,ep_mypads,ep_page_view,ep_previewimages,ep_ruler,ep_scrollto,ep_set_title_on_pad,ep_subscript_and_superscript,ep_timesliderdiff
-
-
-# [Host]
-# Nom de l'hébergeur de la machine qui fait tourner le service, dans le cas d'un auto-hébergement c'est vous ! (type STRING, obligatoire). Exemple : OVH.
-host.name = Hetzner
-
-# Description de l'hébergeur (type STRING, optionnel).
-host.description = 
-
-# Type de serveur (un parmi NANO, PHYSICAL, VIRTUAL, SHARED, CLOUD, obligatoire, ex. PHYSICAL).
-#   NANO : nano-ordinateur (Raspberry Pi, Olimex…)
-#   PHYSICAL : machine physique
-#   VIRTUAL : machine virtuelle
-#   SHARED : hébergement mutualisé
-#   CLOUD : infrastructure multi-serveurs
-host.server.type = PHYSICAL
-
-# Type d'hébergement (un parmi HOME, HOSTEDBAY, HOSTEDSERVER, OUTSOURCED, obligatoire, ex. HOSTEDSERVER).
-#   HOME : hébergement à domicile
-#   HOSTEDBAY : serveur personnel hébergé dans une baie d'un fournisseur
-#   HOSTEDSERVER : serveur d'un fournisseur
-#   OUTSOURCED : infrastructure totalement sous-traitée
-host.provider.type = HOSTEDSERVER
-
-# Si vous avez du mal à remplir les champs précédents, ce tableau pourra vous aider :
-#                  NANO    PHYSICAL    VIRTUAL    SHARED    CLOUD
-# HOME              pm        pm          vm      shared    cloud
-# HOSTEDBAY         --        pm          vm      shared    cloud
-# HOSTEDSERVER      --        pm          vm      shared    cloud
-# OUTSOURCED        --        --         vps      shared    cloud
-# Légendes : pm : physical machine ; vm : virtual machine ; vps : virtual private server.
-
-# Pays de l'hébergeur (type STRING, recommandé). Exemple : France
-host.country.name = Allemagne
-
-# Code pays de l'hébergeur (type STRING, recommandé). Exemple : FR
-host.country.code = DE
-
-
-
-# [Subs]
-# Un lien vers un fichier properties complémentaire (type URL, optionnel). Exemple : https://
-subs.foo = 
-
-# [Metrics]
-# Nom du métrique (type STRING, recommandé).
-metrics.http.total.name = Nombre total de requêtes HTTP
-
-# Description du métrique (type STRING, recommandé).
-metrics.http.total.description = Somme des requêtes HTTP ipv4 et ipv6.
-
-# Métrique à valeur anuelle (type NUMERIC, optionnel).
-metrics.http.total.2020 =
-
-# Métrique à valeur mensuelle (type MONTHS, optionnel).
-metrics.http.total.2020.months=
-
-# Métrique à valeur hebdomadaire (type WEEKS, optionnel).
-metrics.http.total.2020.weeks=
-
-# Métrique à valeur quotidienne (type DAYS, optionnel).
-metrics.http.total.2020.days=
-
-
-# Nom du métrique (type STRING, recommandé).
-metrics.visitors.total.name = Nombre total de visiteurs
-
-# Description du métrique (type STRING, recommandé).
-metrics.visitors.total.description = 
-
-# Métrique à valeur anuelle (type NUMERIC, optionnel).
-metrics.visitors.total.2020 =
-
-# Métrique à valeur mensuelle (type MONTHS, optionnel).
-metrics.visitors.total.2020.months=
-
-# Métrique à valeur hebdomadaire (type WEEKS, optionnel).
-metrics.visitors.total.2020.weeks=
-
-# Métrique à valeur quotidienne (type DAYS, optionnel).
-metrics.visitors.total.2020.days=
-
-
-# [Metrics spécifiques au service]
diff --git a/modules/private/websites/immae/temp.nix b/modules/private/websites/immae/temp.nix
deleted file mode 100644 (file)
index 19aef1a..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  cfg = config.myServices.websites.immae.temp;
-  varDir = "/var/lib/immae_temp";
-  env = config.myEnv.websites.immae.temp;
-in {
-  options.myServices.websites.immae.temp.enable = lib.mkEnableOption "enable Temp' website";
-
-  config = lib.mkIf cfg.enable {
-    services.websites.env.production.vhostConfs.immae_temp = {
-      certName    = "immae";
-      addToCerts  = true;
-      hosts       = [ "temp.immae.eu" ];
-      root        = null;
-      extraConfig = [ ''
-        ProxyVia On
-        ProxyRequests Off
-        ProxyPreserveHost On
-        ProxyPass         / unix:///run/surfer/listen.sock|http://temp.immae.eu/
-        ProxyPassReverse  / unix:///run/surfer/listen.sock|http://temp.immae.eu/
-        <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";
-      };
-    };
-  };
-}
-
diff --git a/modules/private/websites/isabelle/aten_app/default.nix b/modules/private/websites/isabelle/aten_app/default.nix
deleted file mode 100644 (file)
index f967b9a..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-{ environment ? "prod"
-, varDir ? "/var/lib/aten_${environment}"
-, composerEnv, fetchgit, runCommand, nodejs-10_x, jq, libsass, python, fetchurl, yarn2nix-moretea, yarn, sources }:
-let
-  yarn2nix-moretea' = yarn2nix-moretea.override({
-    yarn = yarn.override({ nodejs = nodejs-10_x; });
-    nodejs = nodejs-10_x;
-  });
-  packagesource = sources.websites-isabelle-aten;
-  packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
-    cat ${packagesource}/package.json | jq -r '.version = "v1.0.0"|.name="aten"' > $out
-    '';
-  yarnModules = yarn2nix-moretea'.mkYarnModules rec {
-    name = "aten-yarn";
-    pname = name;
-    version = "v1.0.0";
-    packageJSON = packagejson;
-    yarnLock = "${packagesource}/yarn.lock";
-    yarnNix = ./yarn-packages.nix;
-    pkgConfig = {
-      node-sass = {
-        buildInputs = [ libsass python ];
-        postInstall = let
-          nodeHeaders = fetchurl {
-            url = "https://nodejs.org/download/release/v${nodejs-10_x.version}/node-v${nodejs-10_x.version}-headers.tar.gz";
-            sha256 = "15hkcbs328d3rc1s14rmky8lh8d3rr86l8k0bia0ggxzwl23lj9c";
-          };
-        in
-          ''
-            node scripts/build.js --tarball=${nodeHeaders}
-          '';
-      };
-    };
-  };
-  app = composerEnv.buildPackage (
-    import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
-    rec {
-      version = packagesource.version;
-      pname = "aten";
-      name = "${pname}-${version}";
-      src = packagesource;
-      noDev = (environment == "prod");
-      preInstall = ''
-        export SYMFONY_ENV="${environment}"
-        export APP_ENV="${environment}"
-        '';
-      postInstall = ''
-        ln -sf ${yarnModules}/node_modules .
-        yarn run --offline encore production
-        rm -rf var/{log,cache}
-        ln -sf ${varDir}/{log,cache} var/
-        '';
-      buildInputs = [ yarnModules yarn2nix-moretea'.yarn ];
-      passthru = {
-        inherit varDir;
-        inherit environment;
-        webRoot = "${app}/public";
-      };
-    }
-  );
-in app
diff --git a/modules/private/websites/isabelle/aten_app/php-packages.nix b/modules/private/websites/isabelle/aten_app/php-packages.nix
deleted file mode 100644 (file)
index 3647938..0000000
+++ /dev/null
@@ -1,740 +0,0 @@
-# Generated with composer2nix and adapted to return only the list of
-# packages
-{ composerEnv, fetchurl, fetchgit ? null }:
-{
-  packages = {
-    "behat/transliterator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
-        src = fetchurl {
-          url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
-          sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
-        };
-      };
-    };
-    "doctrine/annotations" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5;
-          sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7";
-        };
-      };
-    };
-    "doctrine/cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57;
-          sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i";
-        };
-      };
-    };
-    "doctrine/collections" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf;
-          sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis";
-        };
-      };
-    };
-    "doctrine/common" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d;
-          sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na";
-        };
-      };
-    };
-    "doctrine/dbal" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9;
-          sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj";
-        };
-      };
-    };
-    "doctrine/doctrine-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d;
-          sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3";
-        };
-      };
-    };
-    "doctrine/doctrine-cache-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927;
-          sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa";
-        };
-      };
-    };
-    "doctrine/doctrine-migrations-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce;
-          sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn";
-        };
-      };
-    };
-    "doctrine/event-manager" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3;
-          sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88";
-        };
-      };
-    };
-    "doctrine/inflector" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a;
-          sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5";
-        };
-      };
-    };
-    "doctrine/instantiator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda;
-          sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy";
-        };
-      };
-    };
-    "doctrine/lexer" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
-          sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
-        };
-      };
-    };
-    "doctrine/migrations" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6;
-          sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld";
-        };
-      };
-    };
-    "doctrine/orm" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8;
-          sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls";
-        };
-      };
-    };
-    "doctrine/persistence" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38;
-          sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7";
-        };
-      };
-    };
-    "doctrine/reflection" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6;
-          sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy";
-        };
-      };
-    };
-    "gedmo/doctrine-extensions" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27";
-        src = fetchurl {
-          url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27;
-          sha256 = "1i33xy9s18rncc1fllwi2qi7hrxj8g762fvgl9np7xndxa7kclyb";
-        };
-      };
-    };
-    "giggsey/libphonenumber-for-php" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "giggsey-libphonenumber-for-php-a71f260c2efce10ded8af030a20fa13edfb0e9be";
-        src = fetchurl {
-          url = https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/a71f260c2efce10ded8af030a20fa13edfb0e9be;
-          sha256 = "15id03c1msyhri7j4i63r535g3g56n3x99i8301as63w7m1ybfj5";
-        };
-      };
-    };
-    "giggsey/locale" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "giggsey-locale-da6845720b5d104d319d7e84576f54e44dd9e4f5";
-        src = fetchurl {
-          url = https://api.github.com/repos/giggsey/Locale/zipball/da6845720b5d104d319d7e84576f54e44dd9e4f5;
-          sha256 = "0gc8im06h5l794a0drd74s3inps22jr1zr5wnw0b89m06d4nw42j";
-        };
-      };
-    };
-    "jdorn/sql-formatter" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
-        src = fetchurl {
-          url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
-          sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
-        };
-      };
-    };
-    "ocramius/package-versions" = {
-      targetDir = "";
-      needsModifyRights = true;
-      src = composerEnv.buildZipPackage {
-        name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f";
-        src = fetchurl {
-          url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f;
-          sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881";
-        };
-      };
-    };
-    "ocramius/proxy-manager" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1";
-        src = fetchurl {
-          url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1;
-          sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn";
-        };
-      };
-    };
-    "opensoft/doctrine-postgres-types" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "opensoft-doctrine-postgres-types-7e69bdfeb2ae61c2f1e90872370cdf0135fb3006";
-        src = fetchurl {
-          url = https://api.github.com/repos/opensoft/doctrine-postgres-types/zipball/7e69bdfeb2ae61c2f1e90872370cdf0135fb3006;
-          sha256 = "1v9rjq82dxnpnb6bir6irkj54324a02qlybayvq2gf2807241bjj";
-        };
-      };
-    };
-    "presta/sitemap-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "presta-sitemap-bundle-16a2c0eae7320e3647013e48026a6a6bd14f75df";
-        src = fetchurl {
-          url = https://api.github.com/repos/prestaconcept/PrestaSitemapBundle/zipball/16a2c0eae7320e3647013e48026a6a6bd14f75df;
-          sha256 = "1hqh144awazafa2vpv091h9pyqrppbalcvzf9c1n6h387jwwj5l8";
-        };
-      };
-    };
-    "psr/cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
-          sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
-        };
-      };
-    };
-    "psr/container" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
-          sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
-        };
-      };
-    };
-    "psr/log" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd;
-          sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d";
-        };
-      };
-    };
-    "psr/simple-cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
-          sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
-        };
-      };
-    };
-    "sensio/framework-extra-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensio-framework-extra-bundle-1fdf591c4b388e62dbb2579de89c1560b33f865d";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/1fdf591c4b388e62dbb2579de89c1560b33f865d;
-          sha256 = "0hhw3lsvgm78rqphgmdrg2inc9997lwx0290x71hsixk08khnlb1";
-        };
-      };
-    };
-    "symfony/asset" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-asset-fb06338fd3762f8615b51a58e5e9299ccca03876";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/asset/zipball/fb06338fd3762f8615b51a58e5e9299ccca03876;
-          sha256 = "19fbnz2h4z5nxzcy8n3bfbcjwgncabwdlxh70qfkr7bswpsxr6p3";
-        };
-      };
-    };
-    "symfony/cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-cache-5c4b50d6ba4f1c8955c3454444c1e3cfddaaad41";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/cache/zipball/5c4b50d6ba4f1c8955c3454444c1e3cfddaaad41;
-          sha256 = "1wn2rd3n5nj300vsygh60vbjh2k9lh7s9c3ayl614hahrfcfb29s";
-        };
-      };
-    };
-    "symfony/config" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-config-005d9a083d03f588677d15391a716b1ac9b887c0";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/config/zipball/005d9a083d03f588677d15391a716b1ac9b887c0;
-          sha256 = "1h20qhkzsl5xwzs3rg1yyaq5yn8rg92krfzmpmfgv7d3jp1v03as";
-        };
-      };
-    };
-    "symfony/console" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-console-4dff24e5d01e713818805c1862d2e3f901ee7dd0";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/console/zipball/4dff24e5d01e713818805c1862d2e3f901ee7dd0;
-          sha256 = "016l3hxcbvyxz3kkkynk12gi8949hl3x09dwsh0x5wqikgnp64c2";
-        };
-      };
-    };
-    "symfony/contracts" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-contracts-1aa7ab2429c3d594dd70689604b5cf7421254cdf";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf;
-          sha256 = "0jhav49lngmrjg4r5kdpmc7lhmasn2fzkmbvhw62l4i1vnm5r5bm";
-        };
-      };
-    };
-    "symfony/debug" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-debug-e0a2b92ee0b5b934f973d90c2f58e18af109d276";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/debug/zipball/e0a2b92ee0b5b934f973d90c2f58e18af109d276;
-          sha256 = "0yzyaprsrmbc93gzwr1wdjx05kin7b4hqy5w74zkcxyab09pan7f";
-        };
-      };
-    };
-    "symfony/dependency-injection" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-dependency-injection-e4adc57a48d3fa7f394edfffa9e954086d7740e5";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/dependency-injection/zipball/e4adc57a48d3fa7f394edfffa9e954086d7740e5;
-          sha256 = "0g8ssf7qm0jf0anvflp033xwdim9z4g73k3kz1vs3smw4pffl6nv";
-        };
-      };
-    };
-    "symfony/doctrine-bridge" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-doctrine-bridge-3466c911438e176c20e1943c529131889432d12f";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/doctrine-bridge/zipball/3466c911438e176c20e1943c529131889432d12f;
-          sha256 = "0qq644z7l9j9fyydlj68p9f43a9i20rnmxy8pkq5sn4r0yn06bb8";
-        };
-      };
-    };
-    "symfony/event-dispatcher" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-event-dispatcher-921f49c3158a276d27c0d770a5a347a3b718b328";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/event-dispatcher/zipball/921f49c3158a276d27c0d770a5a347a3b718b328;
-          sha256 = "05i8syqbzhh11cf2i9d64s8b5x41mfsribfa62rvc0mhbqk7ifzf";
-        };
-      };
-    };
-    "symfony/filesystem" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-filesystem-2f4c8b999b3b7cadb2a69390b01af70886753710";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/filesystem/zipball/2f4c8b999b3b7cadb2a69390b01af70886753710;
-          sha256 = "1gi14q8gf250a3rzmr6arb08ljpzpfg868vm0z21fgmf0zh0dqr6";
-        };
-      };
-    };
-    "symfony/finder" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-finder-e53d477d7b5c4982d0e1bfd2298dbee63d01441d";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/finder/zipball/e53d477d7b5c4982d0e1bfd2298dbee63d01441d;
-          sha256 = "1mpxwgvfqzng36xbdvda6nk1zidyr9dgswccmr4z15k0i9gi0qsj";
-        };
-      };
-    };
-    "symfony/flex" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-flex-955774ecf07b10230bb5b44e150ba078b45f68fa";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/flex/zipball/955774ecf07b10230bb5b44e150ba078b45f68fa;
-          sha256 = "069v1s810mq5kqvx68x87lmlz0h9b2kgla1znnibnbh6j6k4qg6d";
-        };
-      };
-    };
-    "symfony/form" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-form-5ab767b7732154ca6f45c92e30e081178edf30ad";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/form/zipball/5ab767b7732154ca6f45c92e30e081178edf30ad;
-          sha256 = "1g65a7hl1kk6rpa6q52fyzy6vkjafr3233hi2qiggyp0qys20kcc";
-        };
-      };
-    };
-    "symfony/framework-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-framework-bundle-eb32d67140510f04fe9cc5fb9ad38fda09591db1";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/framework-bundle/zipball/eb32d67140510f04fe9cc5fb9ad38fda09591db1;
-          sha256 = "06dpqppwyngq1frww0q0zjs0gj8na0fi67czlhqf2x2lizgz6wjd";
-        };
-      };
-    };
-    "symfony/http-foundation" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-http-foundation-1b31f3017fadd8cb05cf2c8aebdbf3b12a943851";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/http-foundation/zipball/1b31f3017fadd8cb05cf2c8aebdbf3b12a943851;
-          sha256 = "0s6mx79gl6sp39bk8213xcdzx4ld5xim38s8lckm7wqnkvx94mfl";
-        };
-      };
-    };
-    "symfony/http-kernel" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-http-kernel-b39ceffc0388232c309cbde3a7c3685f2ec0a624";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/http-kernel/zipball/b39ceffc0388232c309cbde3a7c3685f2ec0a624;
-          sha256 = "17rb1hl9r8rlqw1cv9qx2ckvz81g2ylppirq035mya1a848y5ym5";
-        };
-      };
-    };
-    "symfony/inflector" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-inflector-f9a637c0359f74404d44cf0da0a3ce53bae0787e";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/inflector/zipball/f9a637c0359f74404d44cf0da0a3ce53bae0787e;
-          sha256 = "1sp1pk716biyplqpakcpq71ik2h2m1bvsz9cfj9zd63y2723xna3";
-        };
-      };
-    };
-    "symfony/intl" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-intl-748a1c54903344385f88fef75da293915b16a207";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/intl/zipball/748a1c54903344385f88fef75da293915b16a207;
-          sha256 = "1vwa2n7fglxs8rv1yrbxn6vgizg73asimg794igk27i90xdybfmc";
-        };
-      };
-    };
-    "symfony/lts" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-lts-c1affae45b78aee036effa1759237e7fa96d4af2";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/lts/zipball/c1affae45b78aee036effa1759237e7fa96d4af2;
-          sha256 = "0vk9pn4xl7ascvllak0gschdd1w2mxma3ng04j3r1n13zccxc33s";
-        };
-      };
-    };
-    "symfony/options-resolver" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-options-resolver-a9c38e8a3da2c03b3e71fdffa6efb0bda51390ba";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/options-resolver/zipball/a9c38e8a3da2c03b3e71fdffa6efb0bda51390ba;
-          sha256 = "1fjjlp09mwkjcxg98bihqlq4miq24k13691051f5p39lcy03zmb3";
-        };
-      };
-    };
-    "symfony/orm-pack" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-orm-pack-1b58f752cd917a08c9c8df020781d9c46a2275b1";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/orm-pack/zipball/1b58f752cd917a08c9c8df020781d9c46a2275b1;
-          sha256 = "1sk8jchaw29lmpq76yb24mc1csmifnkvbjdrgjdgqs6x5i39plli";
-        };
-      };
-    };
-    "symfony/polyfill-intl-icu" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644;
-          sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq";
-        };
-      };
-    };
-    "symfony/polyfill-mbstring" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494;
-          sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi";
-        };
-      };
-    };
-    "symfony/property-access" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-property-access-b6df4e1849f389468edb36e2e59877d4a8170723";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/property-access/zipball/b6df4e1849f389468edb36e2e59877d4a8170723;
-          sha256 = "16pbnv3x56gp5wxakmbphf3d4igkjyr3v693n3cjm62h72z4dxf3";
-        };
-      };
-    };
-    "symfony/routing" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-routing-649460207e77da6c545326c7f53618d23ad2c866";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/routing/zipball/649460207e77da6c545326c7f53618d23ad2c866;
-          sha256 = "1qjkgghs0kp4lk4711d3gx26vvilrrrjbbz02navzfqy4xjrf0sw";
-        };
-      };
-    };
-    "symfony/translation" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-translation-c0e2191e9bed845946ab3d99767513b56ca7dcd6";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/translation/zipball/c0e2191e9bed845946ab3d99767513b56ca7dcd6;
-          sha256 = "0gzq7f2izsiam9blha85bzvg7x6zc4f3x3bkwhzma6x6ipjfkla2";
-        };
-      };
-    };
-    "symfony/twig-bridge" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-twig-bridge-2e928d6c8244e7f3b32bcfac5814095a83179e60";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/twig-bridge/zipball/2e928d6c8244e7f3b32bcfac5814095a83179e60;
-          sha256 = "1f902j8b0lyqjss9r2mf7j63apv5z8ki57vmcdcw5jlqagbmw1y1";
-        };
-      };
-    };
-    "symfony/twig-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-twig-bundle-024820cbb4aeffc4843c4170b69c057fb4840fb3";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/twig-bundle/zipball/024820cbb4aeffc4843c4170b69c057fb4840fb3;
-          sha256 = "1qqfpxw228lc024whpr4j6aa6k9ly290nxz9c9ds826lllg2l1zh";
-        };
-      };
-    };
-    "symfony/validator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-validator-cd35bb14a0e81bd99835e36cac4db1e72ad1939b";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/validator/zipball/cd35bb14a0e81bd99835e36cac4db1e72ad1939b;
-          sha256 = "1809yz483mv5mmrw14v3b371dmjab7i455gxkrqm0z8n0wjdn6i3";
-        };
-      };
-    };
-    "symfony/var-exporter" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-var-exporter-a39222e357362424b61dcde50e2f7b5a7d3306db";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/var-exporter/zipball/a39222e357362424b61dcde50e2f7b5a7d3306db;
-          sha256 = "1ys2sc3ivgfxq7kj8cydxqh5179d3niqxsy10lgg18c5a6bsj41j";
-        };
-      };
-    };
-    "symfony/webpack-encore-pack" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-webpack-encore-pack-8d7f51379d7ae17aea7cf501d910a11896895ac4";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/webpack-encore-pack/zipball/8d7f51379d7ae17aea7cf501d910a11896895ac4;
-          sha256 = "0k6xavcyihx45dsrm1r2r1lbn7vryy463akz66w4gycx5dcqrw0j";
-        };
-      };
-    };
-    "symfony/yaml" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-yaml-c41175c801e3edfda90f32e292619d10c27103d7";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/yaml/zipball/c41175c801e3edfda90f32e292619d10c27103d7;
-          sha256 = "0bh9365mmvzhdk1m0b1xarlg0swx9pv916m7xifcmdrxn67w552p";
-        };
-      };
-    };
-    "twig/twig" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1";
-        src = fetchurl {
-          url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1;
-          sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n";
-        };
-      };
-    };
-    "zendframework/zend-code" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb;
-          sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1";
-        };
-      };
-    };
-    "zendframework/zend-eventmanager" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd;
-          sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n";
-        };
-      };
-    };
-  };
-  devPackages = {
-    "nikic/php-parser" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "nikic-php-parser-8aae5b59b83bb4d0dbf07b0a835f2680a658f610";
-        src = fetchurl {
-          url = https://api.github.com/repos/nikic/PHP-Parser/zipball/8aae5b59b83bb4d0dbf07b0a835f2680a658f610;
-          sha256 = "103ix4bsvrwyc4wxh9cqd38xffn25kq3phnpgk8b3z7dqvvr2pss";
-        };
-      };
-    };
-    "symfony/dotenv" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-dotenv-97f135ab40f969cbeae27d482ff63acbc33dbe2a";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/dotenv/zipball/97f135ab40f969cbeae27d482ff63acbc33dbe2a;
-          sha256 = "1jwpxb4w0mi5p89k51l1g84hnnj9s8kjl9jsx3xj39hhc3dy44pc";
-        };
-      };
-    };
-    "symfony/maker-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-maker-bundle-24b19cccad0c658eca516b35b08668d123fabf92";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/maker-bundle/zipball/24b19cccad0c658eca516b35b08668d123fabf92;
-          sha256 = "1wm17jl3gk0m5ma7nz40y7ryxgm0qncrxcrqdqg5x6afwla85grp";
-        };
-      };
-    };
-    "symfony/polyfill-php72" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-php72-9050816e2ca34a8e916c3a0ae8b9c2fccf68b631";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-php72/zipball/9050816e2ca34a8e916c3a0ae8b9c2fccf68b631;
-          sha256 = "1smd08fw64mf89s9ma099ayfjlz26wrix9hfr6kh5w4d0rzrhmlw";
-        };
-      };
-    };
-    "symfony/profiler-pack" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-profiler-pack-99c4370632c2a59bb0444852f92140074ef02209";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209;
-          sha256 = "12xisnrqq6q5l0v8bric0p23bsaxh50x43fq7wn2adnsz24nv9pi";
-        };
-      };
-    };
-    "symfony/stopwatch" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-stopwatch-ec076716412274e51f8a7ea675d9515e5c311123";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/stopwatch/zipball/ec076716412274e51f8a7ea675d9515e5c311123;
-          sha256 = "0fzh2bh7lm8f222hk5ihfkpi697babfrz1r0dghlws17hfbgzgax";
-        };
-      };
-    };
-    "symfony/var-dumper" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-var-dumper-db61258540350725f4beb6b84006e32398acd120";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/var-dumper/zipball/db61258540350725f4beb6b84006e32398acd120;
-          sha256 = "0pw3hf4mcc1q9miswrjbgr32x0a2dfjvpi16pjzw173xmf79i4iz";
-        };
-      };
-    };
-    "symfony/web-profiler-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-web-profiler-bundle-198cb0a6b85346bbab5e1bc74a0eb175b9fa2d08";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/web-profiler-bundle/zipball/198cb0a6b85346bbab5e1bc74a0eb175b9fa2d08;
-          sha256 = "0r4r3zf22860mdx8b2l72ghz8liyi3l39cc1934b2lkh2kghlsi6";
-        };
-      };
-    };
-  };
-}
diff --git a/modules/private/websites/isabelle/aten_app/yarn-packages.nix b/modules/private/websites/isabelle/aten_app/yarn-packages.nix
deleted file mode 100644 (file)
index c16d9dc..0000000
+++ /dev/null
@@ -1,7871 +0,0 @@
-{fetchurl, linkFarm}: rec {
-  offline_cache = linkFarm "offline" packages;
-  packages = [
-
-    {
-      name = "_symfony_webpack_encore___webpack_encore_0.19.0.tgz";
-      path = fetchurl {
-        name = "_symfony_webpack_encore___webpack_encore_0.19.0.tgz";
-        url  = "https://registry.yarnpkg.com/@symfony/webpack-encore/-/webpack-encore-0.19.0.tgz";
-        sha1 = "f0725dbbede5ff9d9fdbd7a07f84accafc83ca14";
-      };
-    }
-
-    {
-      name = "_types_node___node_10.5.3.tgz";
-      path = fetchurl {
-        name = "_types_node___node_10.5.3.tgz";
-        url  = "https://registry.yarnpkg.com/@types/node/-/node-10.5.3.tgz";
-        sha1 = "5bcfaf088ad17894232012877669634c06b20cc5";
-      };
-    }
-
-    {
-      name = "_types_tapable___tapable_0.2.5.tgz";
-      path = fetchurl {
-        name = "_types_tapable___tapable_0.2.5.tgz";
-        url  = "https://registry.yarnpkg.com/@types/tapable/-/tapable-0.2.5.tgz";
-        sha1 = "2443fc12da514c81346b1a665675559cee21fa75";
-      };
-    }
-
-    {
-      name = "_types_uglify_js___uglify_js_3.0.3.tgz";
-      path = fetchurl {
-        name = "_types_uglify_js___uglify_js_3.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.3.tgz";
-        sha1 = "801a5ca1dc642861f47c46d14b700ed2d610840b";
-      };
-    }
-
-    {
-      name = "_types_webpack___webpack_3.8.14.tgz";
-      path = fetchurl {
-        name = "_types_webpack___webpack_3.8.14.tgz";
-        url  = "https://registry.yarnpkg.com/@types/webpack/-/webpack-3.8.14.tgz";
-        sha1 = "e2bfdf7f604b3f7dc776eaa17446d7f7538f3de7";
-      };
-    }
-
-    {
-      name = "abbrev___abbrev_1.1.1.tgz";
-      path = fetchurl {
-        name = "abbrev___abbrev_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz";
-        sha1 = "f8f2c887ad10bf67f634f005b6987fed3179aac8";
-      };
-    }
-
-    {
-      name = "accepts___accepts_1.3.5.tgz";
-      path = fetchurl {
-        name = "accepts___accepts_1.3.5.tgz";
-        url  = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz";
-        sha1 = "eb777df6011723a3b14e8a72c0805c8e86746bd2";
-      };
-    }
-
-    {
-      name = "acorn_dynamic_import___acorn_dynamic_import_2.0.2.tgz";
-      path = fetchurl {
-        name = "acorn_dynamic_import___acorn_dynamic_import_2.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz";
-        sha1 = "c752bd210bef679501b6c6cb7fc84f8f47158cc4";
-      };
-    }
-
-    {
-      name = "acorn___acorn_4.0.13.tgz";
-      path = fetchurl {
-        name = "acorn___acorn_4.0.13.tgz";
-        url  = "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz";
-        sha1 = "105495ae5361d697bd195c825192e1ad7f253787";
-      };
-    }
-
-    {
-      name = "acorn___acorn_5.7.1.tgz";
-      path = fetchurl {
-        name = "acorn___acorn_5.7.1.tgz";
-        url  = "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz";
-        sha1 = "f095829297706a7c9776958c0afc8930a9b9d9d8";
-      };
-    }
-
-    {
-      name = "adjust_sourcemap_loader___adjust_sourcemap_loader_1.2.0.tgz";
-      path = fetchurl {
-        name = "adjust_sourcemap_loader___adjust_sourcemap_loader_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz";
-        sha1 = "e33fde95e50db9f2a802e3647e311d2fc5000c69";
-      };
-    }
-
-    {
-      name = "ajv_keywords___ajv_keywords_3.2.0.tgz";
-      path = fetchurl {
-        name = "ajv_keywords___ajv_keywords_3.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz";
-        sha1 = "e86b819c602cf8821ad637413698f1dec021847a";
-      };
-    }
-
-    {
-      name = "ajv___ajv_4.11.8.tgz";
-      path = fetchurl {
-        name = "ajv___ajv_4.11.8.tgz";
-        url  = "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz";
-        sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
-      };
-    }
-
-    {
-      name = "ajv___ajv_5.5.2.tgz";
-      path = fetchurl {
-        name = "ajv___ajv_5.5.2.tgz";
-        url  = "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz";
-        sha1 = "73b5eeca3fab653e3d3f9422b341ad42205dc965";
-      };
-    }
-
-    {
-      name = "ajv___ajv_6.5.2.tgz";
-      path = fetchurl {
-        name = "ajv___ajv_6.5.2.tgz";
-        url  = "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz";
-        sha1 = "678495f9b82f7cca6be248dd92f59bff5e1f4360";
-      };
-    }
-
-    {
-      name = "align_text___align_text_0.1.4.tgz";
-      path = fetchurl {
-        name = "align_text___align_text_0.1.4.tgz";
-        url  = "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz";
-        sha1 = "0cd90a561093f35d0a99256c22b7069433fad117";
-      };
-    }
-
-    {
-      name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
-      path = fetchurl {
-        name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz";
-        sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3";
-      };
-    }
-
-    {
-      name = "amdefine___amdefine_1.0.1.tgz";
-      path = fetchurl {
-        name = "amdefine___amdefine_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz";
-        sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
-      };
-    }
-
-    {
-      name = "ansi_html___ansi_html_0.0.7.tgz";
-      path = fetchurl {
-        name = "ansi_html___ansi_html_0.0.7.tgz";
-        url  = "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz";
-        sha1 = "813584021962a9e9e6fd039f940d12f56ca7859e";
-      };
-    }
-
-    {
-      name = "ansi_regex___ansi_regex_2.1.1.tgz";
-      path = fetchurl {
-        name = "ansi_regex___ansi_regex_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz";
-        sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
-      };
-    }
-
-    {
-      name = "ansi_regex___ansi_regex_3.0.0.tgz";
-      path = fetchurl {
-        name = "ansi_regex___ansi_regex_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz";
-        sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
-      };
-    }
-
-    {
-      name = "ansi_styles___ansi_styles_2.2.1.tgz";
-      path = fetchurl {
-        name = "ansi_styles___ansi_styles_2.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz";
-        sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
-      };
-    }
-
-    {
-      name = "ansi_styles___ansi_styles_3.2.1.tgz";
-      path = fetchurl {
-        name = "ansi_styles___ansi_styles_3.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz";
-        sha1 = "41fbb20243e50b12be0f04b8dedbf07520ce841d";
-      };
-    }
-
-    {
-      name = "anymatch___anymatch_2.0.0.tgz";
-      path = fetchurl {
-        name = "anymatch___anymatch_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz";
-        sha1 = "bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb";
-      };
-    }
-
-    {
-      name = "aproba___aproba_1.2.0.tgz";
-      path = fetchurl {
-        name = "aproba___aproba_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz";
-        sha1 = "6802e6264efd18c790a1b0d517f0f2627bf2c94a";
-      };
-    }
-
-    {
-      name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
-      path = fetchurl {
-        name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
-        url  = "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
-        sha1 = "4b35c2944f062a8bfcda66410760350fe9ddfc21";
-      };
-    }
-
-    {
-      name = "argparse___argparse_1.0.10.tgz";
-      path = fetchurl {
-        name = "argparse___argparse_1.0.10.tgz";
-        url  = "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz";
-        sha1 = "bcd6791ea5ae09725e17e5ad988134cd40b3d911";
-      };
-    }
-
-    {
-      name = "arr_diff___arr_diff_2.0.0.tgz";
-      path = fetchurl {
-        name = "arr_diff___arr_diff_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz";
-        sha1 = "8f3b827f955a8bd669697e4a4256ac3ceae356cf";
-      };
-    }
-
-    {
-      name = "arr_diff___arr_diff_4.0.0.tgz";
-      path = fetchurl {
-        name = "arr_diff___arr_diff_4.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz";
-        sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
-      };
-    }
-
-    {
-      name = "arr_flatten___arr_flatten_1.1.0.tgz";
-      path = fetchurl {
-        name = "arr_flatten___arr_flatten_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz";
-        sha1 = "36048bbff4e7b47e136644316c99669ea5ae91f1";
-      };
-    }
-
-    {
-      name = "arr_union___arr_union_3.1.0.tgz";
-      path = fetchurl {
-        name = "arr_union___arr_union_3.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz";
-        sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
-      };
-    }
-
-    {
-      name = "array_find_index___array_find_index_1.0.2.tgz";
-      path = fetchurl {
-        name = "array_find_index___array_find_index_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz";
-        sha1 = "df010aa1287e164bbda6f9723b0a96a1ec4187a1";
-      };
-    }
-
-    {
-      name = "array_flatten___array_flatten_1.1.1.tgz";
-      path = fetchurl {
-        name = "array_flatten___array_flatten_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz";
-        sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2";
-      };
-    }
-
-    {
-      name = "array_flatten___array_flatten_2.1.1.tgz";
-      path = fetchurl {
-        name = "array_flatten___array_flatten_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz";
-        sha1 = "426bb9da84090c1838d812c8150af20a8331e296";
-      };
-    }
-
-    {
-      name = "array_includes___array_includes_3.0.3.tgz";
-      path = fetchurl {
-        name = "array_includes___array_includes_3.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz";
-        sha1 = "184b48f62d92d7452bb31b323165c7f8bd02266d";
-      };
-    }
-
-    {
-      name = "array_union___array_union_1.0.2.tgz";
-      path = fetchurl {
-        name = "array_union___array_union_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz";
-        sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39";
-      };
-    }
-
-    {
-      name = "array_uniq___array_uniq_1.0.3.tgz";
-      path = fetchurl {
-        name = "array_uniq___array_uniq_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz";
-        sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
-      };
-    }
-
-    {
-      name = "array_unique___array_unique_0.2.1.tgz";
-      path = fetchurl {
-        name = "array_unique___array_unique_0.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz";
-        sha1 = "a1d97ccafcbc2625cc70fadceb36a50c58b01a53";
-      };
-    }
-
-    {
-      name = "array_unique___array_unique_0.3.2.tgz";
-      path = fetchurl {
-        name = "array_unique___array_unique_0.3.2.tgz";
-        url  = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz";
-        sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
-      };
-    }
-
-    {
-      name = "asn1.js___asn1.js_4.10.1.tgz";
-      path = fetchurl {
-        name = "asn1.js___asn1.js_4.10.1.tgz";
-        url  = "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz";
-        sha1 = "b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0";
-      };
-    }
-
-    {
-      name = "asn1___asn1_0.2.3.tgz";
-      path = fetchurl {
-        name = "asn1___asn1_0.2.3.tgz";
-        url  = "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz";
-        sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86";
-      };
-    }
-
-    {
-      name = "assert_plus___assert_plus_1.0.0.tgz";
-      path = fetchurl {
-        name = "assert_plus___assert_plus_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz";
-        sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
-      };
-    }
-
-    {
-      name = "assert_plus___assert_plus_0.2.0.tgz";
-      path = fetchurl {
-        name = "assert_plus___assert_plus_0.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz";
-        sha1 = "d74e1b87e7affc0db8aadb7021f3fe48101ab234";
-      };
-    }
-
-    {
-      name = "assert___assert_1.4.1.tgz";
-      path = fetchurl {
-        name = "assert___assert_1.4.1.tgz";
-        url  = "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz";
-        sha1 = "99912d591836b5a6f5b345c0f07eefc08fc65d91";
-      };
-    }
-
-    {
-      name = "assign_symbols___assign_symbols_1.0.0.tgz";
-      path = fetchurl {
-        name = "assign_symbols___assign_symbols_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz";
-        sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
-      };
-    }
-
-    {
-      name = "async_each___async_each_1.0.1.tgz";
-      path = fetchurl {
-        name = "async_each___async_each_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz";
-        sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d";
-      };
-    }
-
-    {
-      name = "async_foreach___async_foreach_0.1.3.tgz";
-      path = fetchurl {
-        name = "async_foreach___async_foreach_0.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz";
-        sha1 = "36121f845c0578172de419a97dbeb1d16ec34542";
-      };
-    }
-
-    {
-      name = "async___async_1.5.2.tgz";
-      path = fetchurl {
-        name = "async___async_1.5.2.tgz";
-        url  = "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz";
-        sha1 = "ec6a61ae56480c0c3cb241c95618e20892f9672a";
-      };
-    }
-
-    {
-      name = "async___async_2.6.1.tgz";
-      path = fetchurl {
-        name = "async___async_2.6.1.tgz";
-        url  = "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz";
-        sha1 = "b245a23ca71930044ec53fa46aa00a3e87c6a610";
-      };
-    }
-
-    {
-      name = "asynckit___asynckit_0.4.0.tgz";
-      path = fetchurl {
-        name = "asynckit___asynckit_0.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz";
-        sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
-      };
-    }
-
-    {
-      name = "atob___atob_2.1.1.tgz";
-      path = fetchurl {
-        name = "atob___atob_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz";
-        sha1 = "ae2d5a729477f289d60dd7f96a6314a22dd6c22a";
-      };
-    }
-
-    {
-      name = "autoprefixer___autoprefixer_6.7.7.tgz";
-      path = fetchurl {
-        name = "autoprefixer___autoprefixer_6.7.7.tgz";
-        url  = "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz";
-        sha1 = "1dbd1c835658e35ce3f9984099db00585c782014";
-      };
-    }
-
-    {
-      name = "aws_sign2___aws_sign2_0.6.0.tgz";
-      path = fetchurl {
-        name = "aws_sign2___aws_sign2_0.6.0.tgz";
-        url  = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz";
-        sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
-      };
-    }
-
-    {
-      name = "aws_sign2___aws_sign2_0.7.0.tgz";
-      path = fetchurl {
-        name = "aws_sign2___aws_sign2_0.7.0.tgz";
-        url  = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz";
-        sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
-      };
-    }
-
-    {
-      name = "aws4___aws4_1.7.0.tgz";
-      path = fetchurl {
-        name = "aws4___aws4_1.7.0.tgz";
-        url  = "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz";
-        sha1 = "d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289";
-      };
-    }
-
-    {
-      name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
-      path = fetchurl {
-        name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz";
-        sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b";
-      };
-    }
-
-    {
-      name = "babel_core___babel_core_6.26.3.tgz";
-      path = fetchurl {
-        name = "babel_core___babel_core_6.26.3.tgz";
-        url  = "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz";
-        sha1 = "b2e2f09e342d0f0c88e2f02e067794125e75c207";
-      };
-    }
-
-    {
-      name = "babel_generator___babel_generator_6.26.1.tgz";
-      path = fetchurl {
-        name = "babel_generator___babel_generator_6.26.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz";
-        sha1 = "1844408d3b8f0d35a404ea7ac180f087a601bd90";
-      };
-    }
-
-    {
-      name = "babel_helper_builder_binary_assignment_operator_visitor___babel_helper_builder_binary_assignment_operator_visitor_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_helper_builder_binary_assignment_operator_visitor___babel_helper_builder_binary_assignment_operator_visitor_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz";
-        sha1 = "cce4517ada356f4220bcae8a02c2b346f9a56664";
-      };
-    }
-
-    {
-      name = "babel_helper_call_delegate___babel_helper_call_delegate_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_helper_call_delegate___babel_helper_call_delegate_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz";
-        sha1 = "ece6aacddc76e41c3461f88bfc575bd0daa2df8d";
-      };
-    }
-
-    {
-      name = "babel_helper_define_map___babel_helper_define_map_6.26.0.tgz";
-      path = fetchurl {
-        name = "babel_helper_define_map___babel_helper_define_map_6.26.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz";
-        sha1 = "a5f56dab41a25f97ecb498c7ebaca9819f95be5f";
-      };
-    }
-
-    {
-      name = "babel_helper_explode_assignable_expression___babel_helper_explode_assignable_expression_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_helper_explode_assignable_expression___babel_helper_explode_assignable_expression_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz";
-        sha1 = "f25b82cf7dc10433c55f70592d5746400ac22caa";
-      };
-    }
-
-    {
-      name = "babel_helper_function_name___babel_helper_function_name_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_helper_function_name___babel_helper_function_name_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz";
-        sha1 = "d3475b8c03ed98242a25b48351ab18399d3580a9";
-      };
-    }
-
-    {
-      name = "babel_helper_get_function_arity___babel_helper_get_function_arity_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_helper_get_function_arity___babel_helper_get_function_arity_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz";
-        sha1 = "8f7782aa93407c41d3aa50908f89b031b1b6853d";
-      };
-    }
-
-    {
-      name = "babel_helper_hoist_variables___babel_helper_hoist_variables_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_helper_hoist_variables___babel_helper_hoist_variables_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz";
-        sha1 = "1ecb27689c9d25513eadbc9914a73f5408be7a76";
-      };
-    }
-
-    {
-      name = "babel_helper_optimise_call_expression___babel_helper_optimise_call_expression_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_helper_optimise_call_expression___babel_helper_optimise_call_expression_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz";
-        sha1 = "f7a13427ba9f73f8f4fa993c54a97882d1244257";
-      };
-    }
-
-    {
-      name = "babel_helper_regex___babel_helper_regex_6.26.0.tgz";
-      path = fetchurl {
-        name = "babel_helper_regex___babel_helper_regex_6.26.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz";
-        sha1 = "325c59f902f82f24b74faceed0363954f6495e72";
-      };
-    }
-
-    {
-      name = "babel_helper_remap_async_to_generator___babel_helper_remap_async_to_generator_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_helper_remap_async_to_generator___babel_helper_remap_async_to_generator_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz";
-        sha1 = "5ec581827ad723fecdd381f1c928390676e4551b";
-      };
-    }
-
-    {
-      name = "babel_helper_replace_supers___babel_helper_replace_supers_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_helper_replace_supers___babel_helper_replace_supers_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz";
-        sha1 = "bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a";
-      };
-    }
-
-    {
-      name = "babel_helpers___babel_helpers_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_helpers___babel_helpers_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz";
-        sha1 = "3471de9caec388e5c850e597e58a26ddf37602b2";
-      };
-    }
-
-    {
-      name = "babel_loader___babel_loader_7.1.5.tgz";
-      path = fetchurl {
-        name = "babel_loader___babel_loader_7.1.5.tgz";
-        url  = "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz";
-        sha1 = "e3ee0cd7394aa557e013b02d3e492bfd07aa6d68";
-      };
-    }
-
-    {
-      name = "babel_messages___babel_messages_6.23.0.tgz";
-      path = fetchurl {
-        name = "babel_messages___babel_messages_6.23.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz";
-        sha1 = "f3cdf4703858035b2a2951c6ec5edf6c62f2630e";
-      };
-    }
-
-    {
-      name = "babel_plugin_check_es2015_constants___babel_plugin_check_es2015_constants_6.22.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_check_es2015_constants___babel_plugin_check_es2015_constants_6.22.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz";
-        sha1 = "35157b101426fd2ffd3da3f75c7d1e91835bbf8a";
-      };
-    }
-
-    {
-      name = "babel_plugin_syntax_async_functions___babel_plugin_syntax_async_functions_6.13.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_syntax_async_functions___babel_plugin_syntax_async_functions_6.13.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz";
-        sha1 = "cad9cad1191b5ad634bf30ae0872391e0647be95";
-      };
-    }
-
-    {
-      name = "babel_plugin_syntax_exponentiation_operator___babel_plugin_syntax_exponentiation_operator_6.13.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_syntax_exponentiation_operator___babel_plugin_syntax_exponentiation_operator_6.13.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz";
-        sha1 = "9ee7e8337290da95288201a6a57f4170317830de";
-      };
-    }
-
-    {
-      name = "babel_plugin_syntax_trailing_function_commas___babel_plugin_syntax_trailing_function_commas_6.22.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_syntax_trailing_function_commas___babel_plugin_syntax_trailing_function_commas_6.22.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz";
-        sha1 = "ba0360937f8d06e40180a43fe0d5616fff532cf3";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_async_to_generator___babel_plugin_transform_async_to_generator_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_async_to_generator___babel_plugin_transform_async_to_generator_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz";
-        sha1 = "6536e378aff6cb1d5517ac0e40eb3e9fc8d08761";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_arrow_functions___babel_plugin_transform_es2015_arrow_functions_6.22.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_arrow_functions___babel_plugin_transform_es2015_arrow_functions_6.22.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz";
-        sha1 = "452692cb711d5f79dc7f85e440ce41b9f244d221";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_block_scoped_functions___babel_plugin_transform_es2015_block_scoped_functions_6.22.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_block_scoped_functions___babel_plugin_transform_es2015_block_scoped_functions_6.22.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz";
-        sha1 = "bbc51b49f964d70cb8d8e0b94e820246ce3a6141";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_block_scoping___babel_plugin_transform_es2015_block_scoping_6.26.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_block_scoping___babel_plugin_transform_es2015_block_scoping_6.26.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz";
-        sha1 = "d70f5299c1308d05c12f463813b0a09e73b1895f";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_classes___babel_plugin_transform_es2015_classes_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_classes___babel_plugin_transform_es2015_classes_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz";
-        sha1 = "5a4c58a50c9c9461e564b4b2a3bfabc97a2584db";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_computed_properties___babel_plugin_transform_es2015_computed_properties_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_computed_properties___babel_plugin_transform_es2015_computed_properties_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz";
-        sha1 = "6fe2a8d16895d5634f4cd999b6d3480a308159b3";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_destructuring___babel_plugin_transform_es2015_destructuring_6.23.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_destructuring___babel_plugin_transform_es2015_destructuring_6.23.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz";
-        sha1 = "997bb1f1ab967f682d2b0876fe358d60e765c56d";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_duplicate_keys___babel_plugin_transform_es2015_duplicate_keys_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_duplicate_keys___babel_plugin_transform_es2015_duplicate_keys_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz";
-        sha1 = "73eb3d310ca969e3ef9ec91c53741a6f1576423e";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_for_of___babel_plugin_transform_es2015_for_of_6.23.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_for_of___babel_plugin_transform_es2015_for_of_6.23.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz";
-        sha1 = "f47c95b2b613df1d3ecc2fdb7573623c75248691";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_function_name___babel_plugin_transform_es2015_function_name_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_function_name___babel_plugin_transform_es2015_function_name_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz";
-        sha1 = "834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_literals___babel_plugin_transform_es2015_literals_6.22.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_literals___babel_plugin_transform_es2015_literals_6.22.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz";
-        sha1 = "4f54a02d6cd66cf915280019a31d31925377ca2e";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_modules_amd___babel_plugin_transform_es2015_modules_amd_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_modules_amd___babel_plugin_transform_es2015_modules_amd_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz";
-        sha1 = "3b3e54017239842d6d19c3011c4bd2f00a00d154";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_modules_commonjs___babel_plugin_transform_es2015_modules_commonjs_6.26.2.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_modules_commonjs___babel_plugin_transform_es2015_modules_commonjs_6.26.2.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz";
-        sha1 = "58a793863a9e7ca870bdc5a881117ffac27db6f3";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_modules_systemjs___babel_plugin_transform_es2015_modules_systemjs_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_modules_systemjs___babel_plugin_transform_es2015_modules_systemjs_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz";
-        sha1 = "ff89a142b9119a906195f5f106ecf305d9407d23";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_modules_umd___babel_plugin_transform_es2015_modules_umd_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_modules_umd___babel_plugin_transform_es2015_modules_umd_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz";
-        sha1 = "ac997e6285cd18ed6176adb607d602344ad38468";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_object_super___babel_plugin_transform_es2015_object_super_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_object_super___babel_plugin_transform_es2015_object_super_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz";
-        sha1 = "24cef69ae21cb83a7f8603dad021f572eb278f8d";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_parameters___babel_plugin_transform_es2015_parameters_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_parameters___babel_plugin_transform_es2015_parameters_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz";
-        sha1 = "57ac351ab49caf14a97cd13b09f66fdf0a625f2b";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_shorthand_properties___babel_plugin_transform_es2015_shorthand_properties_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_shorthand_properties___babel_plugin_transform_es2015_shorthand_properties_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz";
-        sha1 = "24f875d6721c87661bbd99a4622e51f14de38aa0";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_spread___babel_plugin_transform_es2015_spread_6.22.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_spread___babel_plugin_transform_es2015_spread_6.22.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz";
-        sha1 = "d6d68a99f89aedc4536c81a542e8dd9f1746f8d1";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_sticky_regex___babel_plugin_transform_es2015_sticky_regex_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_sticky_regex___babel_plugin_transform_es2015_sticky_regex_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz";
-        sha1 = "00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_template_literals___babel_plugin_transform_es2015_template_literals_6.22.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_template_literals___babel_plugin_transform_es2015_template_literals_6.22.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz";
-        sha1 = "a84b3450f7e9f8f1f6839d6d687da84bb1236d8d";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_typeof_symbol___babel_plugin_transform_es2015_typeof_symbol_6.23.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_typeof_symbol___babel_plugin_transform_es2015_typeof_symbol_6.23.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz";
-        sha1 = "dec09f1cddff94b52ac73d505c84df59dcceb372";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_es2015_unicode_regex___babel_plugin_transform_es2015_unicode_regex_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_es2015_unicode_regex___babel_plugin_transform_es2015_unicode_regex_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz";
-        sha1 = "d38b12f42ea7323f729387f18a7c5ae1faeb35e9";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_exponentiation_operator___babel_plugin_transform_exponentiation_operator_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_exponentiation_operator___babel_plugin_transform_exponentiation_operator_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz";
-        sha1 = "2ab0c9c7f3098fa48907772bb813fe41e8de3a0e";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_regenerator___babel_plugin_transform_regenerator_6.26.0.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_regenerator___babel_plugin_transform_regenerator_6.26.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz";
-        sha1 = "e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f";
-      };
-    }
-
-    {
-      name = "babel_plugin_transform_strict_mode___babel_plugin_transform_strict_mode_6.24.1.tgz";
-      path = fetchurl {
-        name = "babel_plugin_transform_strict_mode___babel_plugin_transform_strict_mode_6.24.1.tgz";
-        url  = "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz";
-        sha1 = "d5faf7aa578a65bbe591cf5edae04a0c67020758";
-      };
-    }
-
-    {
-      name = "babel_preset_env___babel_preset_env_1.7.0.tgz";
-      path = fetchurl {
-        name = "babel_preset_env___babel_preset_env_1.7.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz";
-        sha1 = "dea79fa4ebeb883cd35dab07e260c1c9c04df77a";
-      };
-    }
-
-    {
-      name = "babel_register___babel_register_6.26.0.tgz";
-      path = fetchurl {
-        name = "babel_register___babel_register_6.26.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz";
-        sha1 = "6ed021173e2fcb486d7acb45c6009a856f647071";
-      };
-    }
-
-    {
-      name = "babel_runtime___babel_runtime_6.26.0.tgz";
-      path = fetchurl {
-        name = "babel_runtime___babel_runtime_6.26.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz";
-        sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
-      };
-    }
-
-    {
-      name = "babel_template___babel_template_6.26.0.tgz";
-      path = fetchurl {
-        name = "babel_template___babel_template_6.26.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz";
-        sha1 = "de03e2d16396b069f46dd9fff8521fb1a0e35e02";
-      };
-    }
-
-    {
-      name = "babel_traverse___babel_traverse_6.26.0.tgz";
-      path = fetchurl {
-        name = "babel_traverse___babel_traverse_6.26.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz";
-        sha1 = "46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee";
-      };
-    }
-
-    {
-      name = "babel_types___babel_types_6.26.0.tgz";
-      path = fetchurl {
-        name = "babel_types___babel_types_6.26.0.tgz";
-        url  = "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz";
-        sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497";
-      };
-    }
-
-    {
-      name = "babylon___babylon_6.18.0.tgz";
-      path = fetchurl {
-        name = "babylon___babylon_6.18.0.tgz";
-        url  = "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz";
-        sha1 = "af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3";
-      };
-    }
-
-    {
-      name = "balanced_match___balanced_match_0.4.2.tgz";
-      path = fetchurl {
-        name = "balanced_match___balanced_match_0.4.2.tgz";
-        url  = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz";
-        sha1 = "cb3f3e3c732dc0f01ee70b403f302e61d7709838";
-      };
-    }
-
-    {
-      name = "balanced_match___balanced_match_1.0.0.tgz";
-      path = fetchurl {
-        name = "balanced_match___balanced_match_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz";
-        sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
-      };
-    }
-
-    {
-      name = "base64_js___base64_js_1.3.0.tgz";
-      path = fetchurl {
-        name = "base64_js___base64_js_1.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz";
-        sha1 = "cab1e6118f051095e58b5281aea8c1cd22bfc0e3";
-      };
-    }
-
-    {
-      name = "base___base_0.11.2.tgz";
-      path = fetchurl {
-        name = "base___base_0.11.2.tgz";
-        url  = "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz";
-        sha1 = "7bde5ced145b6d551a90db87f83c558b4eb48a8f";
-      };
-    }
-
-    {
-      name = "batch___batch_0.6.1.tgz";
-      path = fetchurl {
-        name = "batch___batch_0.6.1.tgz";
-        url  = "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz";
-        sha1 = "dc34314f4e679318093fc760272525f94bf25c16";
-      };
-    }
-
-    {
-      name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
-      path = fetchurl {
-        name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
-        sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
-      };
-    }
-
-    {
-      name = "big.js___big.js_3.2.0.tgz";
-      path = fetchurl {
-        name = "big.js___big.js_3.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz";
-        sha1 = "a5fc298b81b9e0dca2e458824784b65c52ba588e";
-      };
-    }
-
-    {
-      name = "binary_extensions___binary_extensions_1.11.0.tgz";
-      path = fetchurl {
-        name = "binary_extensions___binary_extensions_1.11.0.tgz";
-        url  = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz";
-        sha1 = "46aa1751fb6a2f93ee5e689bb1087d4b14c6c205";
-      };
-    }
-
-    {
-      name = "block_stream___block_stream_0.0.9.tgz";
-      path = fetchurl {
-        name = "block_stream___block_stream_0.0.9.tgz";
-        url  = "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz";
-        sha1 = "13ebfe778a03205cfe03751481ebb4b3300c126a";
-      };
-    }
-
-    {
-      name = "bn.js___bn.js_4.11.8.tgz";
-      path = fetchurl {
-        name = "bn.js___bn.js_4.11.8.tgz";
-        url  = "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz";
-        sha1 = "2cde09eb5ee341f484746bb0309b3253b1b1442f";
-      };
-    }
-
-    {
-      name = "body_parser___body_parser_1.18.2.tgz";
-      path = fetchurl {
-        name = "body_parser___body_parser_1.18.2.tgz";
-        url  = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz";
-        sha1 = "87678a19d84b47d859b83199bd59bce222b10454";
-      };
-    }
-
-    {
-      name = "bonjour___bonjour_3.5.0.tgz";
-      path = fetchurl {
-        name = "bonjour___bonjour_3.5.0.tgz";
-        url  = "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz";
-        sha1 = "8e890a183d8ee9a2393b3844c691a42bcf7bc9f5";
-      };
-    }
-
-    {
-      name = "boolbase___boolbase_1.0.0.tgz";
-      path = fetchurl {
-        name = "boolbase___boolbase_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz";
-        sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
-      };
-    }
-
-    {
-      name = "boom___boom_2.10.1.tgz";
-      path = fetchurl {
-        name = "boom___boom_2.10.1.tgz";
-        url  = "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz";
-        sha1 = "39c8918ceff5799f83f9492a848f625add0c766f";
-      };
-    }
-
-    {
-      name = "bootstrap___bootstrap_4.1.3.tgz";
-      path = fetchurl {
-        name = "bootstrap___bootstrap_4.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.3.tgz";
-        sha1 = "0eb371af2c8448e8c210411d0cb824a6409a12be";
-      };
-    }
-
-    {
-      name = "brace_expansion___brace_expansion_1.1.11.tgz";
-      path = fetchurl {
-        name = "brace_expansion___brace_expansion_1.1.11.tgz";
-        url  = "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz";
-        sha1 = "3c7fcbf529d87226f3d2f52b966ff5271eb441dd";
-      };
-    }
-
-    {
-      name = "braces___braces_1.8.5.tgz";
-      path = fetchurl {
-        name = "braces___braces_1.8.5.tgz";
-        url  = "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz";
-        sha1 = "ba77962e12dff969d6b76711e914b737857bf6a7";
-      };
-    }
-
-    {
-      name = "braces___braces_2.3.2.tgz";
-      path = fetchurl {
-        name = "braces___braces_2.3.2.tgz";
-        url  = "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz";
-        sha1 = "5979fd3f14cd531565e5fa2df1abfff1dfaee729";
-      };
-    }
-
-    {
-      name = "brorand___brorand_1.1.0.tgz";
-      path = fetchurl {
-        name = "brorand___brorand_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz";
-        sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
-      };
-    }
-
-    {
-      name = "browserify_aes___browserify_aes_1.2.0.tgz";
-      path = fetchurl {
-        name = "browserify_aes___browserify_aes_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz";
-        sha1 = "326734642f403dabc3003209853bb70ad428ef48";
-      };
-    }
-
-    {
-      name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
-      path = fetchurl {
-        name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz";
-        sha1 = "8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0";
-      };
-    }
-
-    {
-      name = "browserify_des___browserify_des_1.0.2.tgz";
-      path = fetchurl {
-        name = "browserify_des___browserify_des_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz";
-        sha1 = "3af4f1f59839403572f1c66204375f7a7f703e9c";
-      };
-    }
-
-    {
-      name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
-      path = fetchurl {
-        name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz";
-        sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524";
-      };
-    }
-
-    {
-      name = "browserify_sign___browserify_sign_4.0.4.tgz";
-      path = fetchurl {
-        name = "browserify_sign___browserify_sign_4.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz";
-        sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298";
-      };
-    }
-
-    {
-      name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
-      path = fetchurl {
-        name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz";
-        sha1 = "2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f";
-      };
-    }
-
-    {
-      name = "browserslist___browserslist_1.7.7.tgz";
-      path = fetchurl {
-        name = "browserslist___browserslist_1.7.7.tgz";
-        url  = "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz";
-        sha1 = "0bd76704258be829b2398bb50e4b62d1a166b0b9";
-      };
-    }
-
-    {
-      name = "browserslist___browserslist_3.2.8.tgz";
-      path = fetchurl {
-        name = "browserslist___browserslist_3.2.8.tgz";
-        url  = "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz";
-        sha1 = "b0005361d6471f0f5952797a76fc985f1f978fc6";
-      };
-    }
-
-    {
-      name = "buffer_indexof___buffer_indexof_1.1.1.tgz";
-      path = fetchurl {
-        name = "buffer_indexof___buffer_indexof_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz";
-        sha1 = "52fabcc6a606d1a00302802648ef68f639da268c";
-      };
-    }
-
-    {
-      name = "buffer_xor___buffer_xor_1.0.3.tgz";
-      path = fetchurl {
-        name = "buffer_xor___buffer_xor_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz";
-        sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
-      };
-    }
-
-    {
-      name = "buffer___buffer_4.9.1.tgz";
-      path = fetchurl {
-        name = "buffer___buffer_4.9.1.tgz";
-        url  = "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz";
-        sha1 = "6d1bb601b07a4efced97094132093027c95bc298";
-      };
-    }
-
-    {
-      name = "builtin_modules___builtin_modules_1.1.1.tgz";
-      path = fetchurl {
-        name = "builtin_modules___builtin_modules_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz";
-        sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f";
-      };
-    }
-
-    {
-      name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
-      path = fetchurl {
-        name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz";
-        sha1 = "85982878e21b98e1c66425e03d0174788f569ee8";
-      };
-    }
-
-    {
-      name = "bytes___bytes_3.0.0.tgz";
-      path = fetchurl {
-        name = "bytes___bytes_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz";
-        sha1 = "d32815404d689699f85a4ea4fa8755dd13a96048";
-      };
-    }
-
-    {
-      name = "cache_base___cache_base_1.0.1.tgz";
-      path = fetchurl {
-        name = "cache_base___cache_base_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz";
-        sha1 = "0a7f46416831c8b662ee36fe4e7c59d76f666ab2";
-      };
-    }
-
-    {
-      name = "camelcase_keys___camelcase_keys_2.1.0.tgz";
-      path = fetchurl {
-        name = "camelcase_keys___camelcase_keys_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz";
-        sha1 = "308beeaffdf28119051efa1d932213c91b8f92e7";
-      };
-    }
-
-    {
-      name = "camelcase___camelcase_1.2.1.tgz";
-      path = fetchurl {
-        name = "camelcase___camelcase_1.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz";
-        sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39";
-      };
-    }
-
-    {
-      name = "camelcase___camelcase_2.1.1.tgz";
-      path = fetchurl {
-        name = "camelcase___camelcase_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz";
-        sha1 = "7c1d16d679a1bbe59ca02cacecfb011e201f5a1f";
-      };
-    }
-
-    {
-      name = "camelcase___camelcase_3.0.0.tgz";
-      path = fetchurl {
-        name = "camelcase___camelcase_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz";
-        sha1 = "32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a";
-      };
-    }
-
-    {
-      name = "camelcase___camelcase_4.1.0.tgz";
-      path = fetchurl {
-        name = "camelcase___camelcase_4.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz";
-        sha1 = "d545635be1e33c542649c69173e5de6acfae34dd";
-      };
-    }
-
-    {
-      name = "caniuse_api___caniuse_api_1.6.1.tgz";
-      path = fetchurl {
-        name = "caniuse_api___caniuse_api_1.6.1.tgz";
-        url  = "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz";
-        sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c";
-      };
-    }
-
-    {
-      name = "caniuse_db___caniuse_db_1.0.30000871.tgz";
-      path = fetchurl {
-        name = "caniuse_db___caniuse_db_1.0.30000871.tgz";
-        url  = "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000871.tgz";
-        sha1 = "f1995c1fe31892649a7605957a80c92518423d4d";
-      };
-    }
-
-    {
-      name = "caniuse_lite___caniuse_lite_1.0.30000865.tgz";
-      path = fetchurl {
-        name = "caniuse_lite___caniuse_lite_1.0.30000865.tgz";
-        url  = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz";
-        sha1 = "70026616e8afe6e1442f8bb4e1092987d81a2f25";
-      };
-    }
-
-    {
-      name = "caseless___caseless_0.12.0.tgz";
-      path = fetchurl {
-        name = "caseless___caseless_0.12.0.tgz";
-        url  = "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz";
-        sha1 = "1b681c21ff84033c826543090689420d187151dc";
-      };
-    }
-
-    {
-      name = "center_align___center_align_0.1.3.tgz";
-      path = fetchurl {
-        name = "center_align___center_align_0.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz";
-        sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad";
-      };
-    }
-
-    {
-      name = "chalk___chalk_1.1.3.tgz";
-      path = fetchurl {
-        name = "chalk___chalk_1.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz";
-        sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
-      };
-    }
-
-    {
-      name = "chalk___chalk_2.4.1.tgz";
-      path = fetchurl {
-        name = "chalk___chalk_2.4.1.tgz";
-        url  = "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz";
-        sha1 = "18c49ab16a037b6eb0152cc83e3471338215b66e";
-      };
-    }
-
-    {
-      name = "chokidar___chokidar_2.0.4.tgz";
-      path = fetchurl {
-        name = "chokidar___chokidar_2.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz";
-        sha1 = "356ff4e2b0e8e43e322d18a372460bbcf3accd26";
-      };
-    }
-
-    {
-      name = "chownr___chownr_1.0.1.tgz";
-      path = fetchurl {
-        name = "chownr___chownr_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz";
-        sha1 = "e2a75042a9551908bebd25b8523d5f9769d79181";
-      };
-    }
-
-    {
-      name = "cipher_base___cipher_base_1.0.4.tgz";
-      path = fetchurl {
-        name = "cipher_base___cipher_base_1.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz";
-        sha1 = "8760e4ecc272f4c363532f926d874aae2c1397de";
-      };
-    }
-
-    {
-      name = "clap___clap_1.2.3.tgz";
-      path = fetchurl {
-        name = "clap___clap_1.2.3.tgz";
-        url  = "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz";
-        sha1 = "4f36745b32008492557f46412d66d50cb99bce51";
-      };
-    }
-
-    {
-      name = "class_utils___class_utils_0.3.6.tgz";
-      path = fetchurl {
-        name = "class_utils___class_utils_0.3.6.tgz";
-        url  = "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz";
-        sha1 = "f93369ae8b9a7ce02fd41faad0ca83033190c463";
-      };
-    }
-
-    {
-      name = "clean_webpack_plugin___clean_webpack_plugin_0.1.19.tgz";
-      path = fetchurl {
-        name = "clean_webpack_plugin___clean_webpack_plugin_0.1.19.tgz";
-        url  = "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz";
-        sha1 = "ceda8bb96b00fe168e9b080272960d20fdcadd6d";
-      };
-    }
-
-    {
-      name = "cliui___cliui_2.1.0.tgz";
-      path = fetchurl {
-        name = "cliui___cliui_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz";
-        sha1 = "4b475760ff80264c762c3a1719032e91c7fea0d1";
-      };
-    }
-
-    {
-      name = "cliui___cliui_3.2.0.tgz";
-      path = fetchurl {
-        name = "cliui___cliui_3.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz";
-        sha1 = "120601537a916d29940f934da3b48d585a39213d";
-      };
-    }
-
-    {
-      name = "clone_deep___clone_deep_2.0.2.tgz";
-      path = fetchurl {
-        name = "clone_deep___clone_deep_2.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz";
-        sha1 = "00db3a1e173656730d1188c3d6aced6d7ea97713";
-      };
-    }
-
-    {
-      name = "clone___clone_1.0.4.tgz";
-      path = fetchurl {
-        name = "clone___clone_1.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz";
-        sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
-      };
-    }
-
-    {
-      name = "co___co_4.6.0.tgz";
-      path = fetchurl {
-        name = "co___co_4.6.0.tgz";
-        url  = "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz";
-        sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
-      };
-    }
-
-    {
-      name = "coa___coa_1.0.4.tgz";
-      path = fetchurl {
-        name = "coa___coa_1.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz";
-        sha1 = "a9ef153660d6a86a8bdec0289a5c684d217432fd";
-      };
-    }
-
-    {
-      name = "code_point_at___code_point_at_1.1.0.tgz";
-      path = fetchurl {
-        name = "code_point_at___code_point_at_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz";
-        sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
-      };
-    }
-
-    {
-      name = "collection_visit___collection_visit_1.0.0.tgz";
-      path = fetchurl {
-        name = "collection_visit___collection_visit_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz";
-        sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
-      };
-    }
-
-    {
-      name = "color_convert___color_convert_1.9.2.tgz";
-      path = fetchurl {
-        name = "color_convert___color_convert_1.9.2.tgz";
-        url  = "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz";
-        sha1 = "49881b8fba67df12a96bdf3f56c0aab9e7913147";
-      };
-    }
-
-    {
-      name = "color_name___color_name_1.1.1.tgz";
-      path = fetchurl {
-        name = "color_name___color_name_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz";
-        sha1 = "4b1415304cf50028ea81643643bd82ea05803689";
-      };
-    }
-
-    {
-      name = "color_name___color_name_1.1.3.tgz";
-      path = fetchurl {
-        name = "color_name___color_name_1.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz";
-        sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
-      };
-    }
-
-    {
-      name = "color_string___color_string_0.3.0.tgz";
-      path = fetchurl {
-        name = "color_string___color_string_0.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz";
-        sha1 = "27d46fb67025c5c2fa25993bfbf579e47841b991";
-      };
-    }
-
-    {
-      name = "color___color_0.11.4.tgz";
-      path = fetchurl {
-        name = "color___color_0.11.4.tgz";
-        url  = "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz";
-        sha1 = "6d7b5c74fb65e841cd48792ad1ed5e07b904d764";
-      };
-    }
-
-    {
-      name = "colormin___colormin_1.1.2.tgz";
-      path = fetchurl {
-        name = "colormin___colormin_1.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz";
-        sha1 = "ea2f7420a72b96881a38aae59ec124a6f7298133";
-      };
-    }
-
-    {
-      name = "colors___colors_1.1.2.tgz";
-      path = fetchurl {
-        name = "colors___colors_1.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz";
-        sha1 = "168a4701756b6a7f51a12ce0c97bfa28c084ed63";
-      };
-    }
-
-    {
-      name = "combined_stream___combined_stream_1.0.6.tgz";
-      path = fetchurl {
-        name = "combined_stream___combined_stream_1.0.6.tgz";
-        url  = "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz";
-        sha1 = "723e7df6e801ac5613113a7e445a9b69cb632818";
-      };
-    }
-
-    {
-      name = "commondir___commondir_1.0.1.tgz";
-      path = fetchurl {
-        name = "commondir___commondir_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz";
-        sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b";
-      };
-    }
-
-    {
-      name = "component_emitter___component_emitter_1.2.1.tgz";
-      path = fetchurl {
-        name = "component_emitter___component_emitter_1.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz";
-        sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
-      };
-    }
-
-    {
-      name = "compressible___compressible_2.0.14.tgz";
-      path = fetchurl {
-        name = "compressible___compressible_2.0.14.tgz";
-        url  = "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz";
-        sha1 = "326c5f507fbb055f54116782b969a81b67a29da7";
-      };
-    }
-
-    {
-      name = "compression___compression_1.7.3.tgz";
-      path = fetchurl {
-        name = "compression___compression_1.7.3.tgz";
-        url  = "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz";
-        sha1 = "27e0e176aaf260f7f2c2813c3e440adb9f1993db";
-      };
-    }
-
-    {
-      name = "concat_map___concat_map_0.0.1.tgz";
-      path = fetchurl {
-        name = "concat_map___concat_map_0.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz";
-        sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
-      };
-    }
-
-    {
-      name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz";
-      path = fetchurl {
-        name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz";
-        url  = "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz";
-        sha1 = "b06873934bc5e344fef611a196a6faae0aee015a";
-      };
-    }
-
-    {
-      name = "console_browserify___console_browserify_1.1.0.tgz";
-      path = fetchurl {
-        name = "console_browserify___console_browserify_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz";
-        sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10";
-      };
-    }
-
-    {
-      name = "console_control_strings___console_control_strings_1.1.0.tgz";
-      path = fetchurl {
-        name = "console_control_strings___console_control_strings_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz";
-        sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
-      };
-    }
-
-    {
-      name = "constants_browserify___constants_browserify_1.0.0.tgz";
-      path = fetchurl {
-        name = "constants_browserify___constants_browserify_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz";
-        sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
-      };
-    }
-
-    {
-      name = "content_disposition___content_disposition_0.5.2.tgz";
-      path = fetchurl {
-        name = "content_disposition___content_disposition_0.5.2.tgz";
-        url  = "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz";
-        sha1 = "0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4";
-      };
-    }
-
-    {
-      name = "content_type___content_type_1.0.4.tgz";
-      path = fetchurl {
-        name = "content_type___content_type_1.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz";
-        sha1 = "e138cc75e040c727b1966fe5e5f8c9aee256fe3b";
-      };
-    }
-
-    {
-      name = "convert_source_map___convert_source_map_0.3.5.tgz";
-      path = fetchurl {
-        name = "convert_source_map___convert_source_map_0.3.5.tgz";
-        url  = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz";
-        sha1 = "f1d802950af7dd2631a1febe0596550c86ab3190";
-      };
-    }
-
-    {
-      name = "convert_source_map___convert_source_map_1.5.1.tgz";
-      path = fetchurl {
-        name = "convert_source_map___convert_source_map_1.5.1.tgz";
-        url  = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz";
-        sha1 = "b8278097b9bc229365de5c62cf5fcaed8b5599e5";
-      };
-    }
-
-    {
-      name = "cookie_signature___cookie_signature_1.0.6.tgz";
-      path = fetchurl {
-        name = "cookie_signature___cookie_signature_1.0.6.tgz";
-        url  = "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz";
-        sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c";
-      };
-    }
-
-    {
-      name = "cookie___cookie_0.3.1.tgz";
-      path = fetchurl {
-        name = "cookie___cookie_0.3.1.tgz";
-        url  = "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz";
-        sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb";
-      };
-    }
-
-    {
-      name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
-      path = fetchurl {
-        name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
-        sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
-      };
-    }
-
-    {
-      name = "core_js___core_js_2.5.7.tgz";
-      path = fetchurl {
-        name = "core_js___core_js_2.5.7.tgz";
-        url  = "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz";
-        sha1 = "f972608ff0cead68b841a16a932d0b183791814e";
-      };
-    }
-
-    {
-      name = "core_util_is___core_util_is_1.0.2.tgz";
-      path = fetchurl {
-        name = "core_util_is___core_util_is_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz";
-        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
-      };
-    }
-
-    {
-      name = "create_ecdh___create_ecdh_4.0.3.tgz";
-      path = fetchurl {
-        name = "create_ecdh___create_ecdh_4.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz";
-        sha1 = "c9111b6f33045c4697f144787f9254cdc77c45ff";
-      };
-    }
-
-    {
-      name = "create_hash___create_hash_1.2.0.tgz";
-      path = fetchurl {
-        name = "create_hash___create_hash_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz";
-        sha1 = "889078af11a63756bcfb59bd221996be3a9ef196";
-      };
-    }
-
-    {
-      name = "create_hmac___create_hmac_1.1.7.tgz";
-      path = fetchurl {
-        name = "create_hmac___create_hmac_1.1.7.tgz";
-        url  = "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz";
-        sha1 = "69170c78b3ab957147b2b8b04572e47ead2243ff";
-      };
-    }
-
-    {
-      name = "cross_spawn___cross_spawn_3.0.1.tgz";
-      path = fetchurl {
-        name = "cross_spawn___cross_spawn_3.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz";
-        sha1 = "1256037ecb9f0c5f79e3d6ef135e30770184b982";
-      };
-    }
-
-    {
-      name = "cross_spawn___cross_spawn_5.1.0.tgz";
-      path = fetchurl {
-        name = "cross_spawn___cross_spawn_5.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz";
-        sha1 = "e8bd0efee58fcff6f8f94510a0a554bbfa235449";
-      };
-    }
-
-    {
-      name = "cryptiles___cryptiles_2.0.5.tgz";
-      path = fetchurl {
-        name = "cryptiles___cryptiles_2.0.5.tgz";
-        url  = "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz";
-        sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8";
-      };
-    }
-
-    {
-      name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
-      path = fetchurl {
-        name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
-        url  = "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz";
-        sha1 = "396cf9f3137f03e4b8e532c58f698254e00f80ec";
-      };
-    }
-
-    {
-      name = "css_color_names___css_color_names_0.0.4.tgz";
-      path = fetchurl {
-        name = "css_color_names___css_color_names_0.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz";
-        sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0";
-      };
-    }
-
-    {
-      name = "css_loader___css_loader_0.26.4.tgz";
-      path = fetchurl {
-        name = "css_loader___css_loader_0.26.4.tgz";
-        url  = "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.4.tgz";
-        sha1 = "b61e9e30db94303e6ffc892f10ecd09ad025a1fd";
-      };
-    }
-
-    {
-      name = "css_select___css_select_1.2.0.tgz";
-      path = fetchurl {
-        name = "css_select___css_select_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz";
-        sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
-      };
-    }
-
-    {
-      name = "css_selector_tokenizer___css_selector_tokenizer_0.7.0.tgz";
-      path = fetchurl {
-        name = "css_selector_tokenizer___css_selector_tokenizer_0.7.0.tgz";
-        url  = "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz";
-        sha1 = "e6988474ae8c953477bf5e7efecfceccd9cf4c86";
-      };
-    }
-
-    {
-      name = "css_what___css_what_2.1.0.tgz";
-      path = fetchurl {
-        name = "css_what___css_what_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz";
-        sha1 = "9467d032c38cfaefb9f2d79501253062f87fa1bd";
-      };
-    }
-
-    {
-      name = "css___css_2.2.3.tgz";
-      path = fetchurl {
-        name = "css___css_2.2.3.tgz";
-        url  = "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz";
-        sha1 = "f861f4ba61e79bedc962aa548e5780fd95cbc6be";
-      };
-    }
-
-    {
-      name = "cssesc___cssesc_0.1.0.tgz";
-      path = fetchurl {
-        name = "cssesc___cssesc_0.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz";
-        sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4";
-      };
-    }
-
-    {
-      name = "cssnano___cssnano_3.10.0.tgz";
-      path = fetchurl {
-        name = "cssnano___cssnano_3.10.0.tgz";
-        url  = "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz";
-        sha1 = "4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38";
-      };
-    }
-
-    {
-      name = "csso___csso_2.3.2.tgz";
-      path = fetchurl {
-        name = "csso___csso_2.3.2.tgz";
-        url  = "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz";
-        sha1 = "ddd52c587033f49e94b71fc55569f252e8ff5f85";
-      };
-    }
-
-    {
-      name = "currently_unhandled___currently_unhandled_0.4.1.tgz";
-      path = fetchurl {
-        name = "currently_unhandled___currently_unhandled_0.4.1.tgz";
-        url  = "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz";
-        sha1 = "988df33feab191ef799a61369dd76c17adf957ea";
-      };
-    }
-
-    {
-      name = "d___d_1.0.0.tgz";
-      path = fetchurl {
-        name = "d___d_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz";
-        sha1 = "754bb5bfe55451da69a58b94d45f4c5b0462d58f";
-      };
-    }
-
-    {
-      name = "dashdash___dashdash_1.14.1.tgz";
-      path = fetchurl {
-        name = "dashdash___dashdash_1.14.1.tgz";
-        url  = "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz";
-        sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
-      };
-    }
-
-    {
-      name = "date_now___date_now_0.1.4.tgz";
-      path = fetchurl {
-        name = "date_now___date_now_0.1.4.tgz";
-        url  = "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz";
-        sha1 = "eaf439fd4d4848ad74e5cc7dbef200672b9e345b";
-      };
-    }
-
-    {
-      name = "debug___debug_2.6.9.tgz";
-      path = fetchurl {
-        name = "debug___debug_2.6.9.tgz";
-        url  = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz";
-        sha1 = "5d128515df134ff327e90a4c93f4e077a536341f";
-      };
-    }
-
-    {
-      name = "debug___debug_3.1.0.tgz";
-      path = fetchurl {
-        name = "debug___debug_3.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz";
-        sha1 = "5bb5a0672628b64149566ba16819e61518c67261";
-      };
-    }
-
-    {
-      name = "decamelize___decamelize_1.2.0.tgz";
-      path = fetchurl {
-        name = "decamelize___decamelize_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz";
-        sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
-      };
-    }
-
-    {
-      name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
-      path = fetchurl {
-        name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
-        sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
-      };
-    }
-
-    {
-      name = "deep_equal___deep_equal_1.0.1.tgz";
-      path = fetchurl {
-        name = "deep_equal___deep_equal_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz";
-        sha1 = "f5d260292b660e084eff4cdbc9f08ad3247448b5";
-      };
-    }
-
-    {
-      name = "deep_extend___deep_extend_0.6.0.tgz";
-      path = fetchurl {
-        name = "deep_extend___deep_extend_0.6.0.tgz";
-        url  = "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz";
-        sha1 = "c4fa7c95404a17a9c3e8ca7e1537312b736330ac";
-      };
-    }
-
-    {
-      name = "define_properties___define_properties_1.1.2.tgz";
-      path = fetchurl {
-        name = "define_properties___define_properties_1.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz";
-        sha1 = "83a73f2fea569898fb737193c8f873caf6d45c94";
-      };
-    }
-
-    {
-      name = "define_property___define_property_0.2.5.tgz";
-      path = fetchurl {
-        name = "define_property___define_property_0.2.5.tgz";
-        url  = "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz";
-        sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
-      };
-    }
-
-    {
-      name = "define_property___define_property_1.0.0.tgz";
-      path = fetchurl {
-        name = "define_property___define_property_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz";
-        sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
-      };
-    }
-
-    {
-      name = "define_property___define_property_2.0.2.tgz";
-      path = fetchurl {
-        name = "define_property___define_property_2.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz";
-        sha1 = "d459689e8d654ba77e02a817f8710d702cb16e9d";
-      };
-    }
-
-    {
-      name = "defined___defined_1.0.0.tgz";
-      path = fetchurl {
-        name = "defined___defined_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz";
-        sha1 = "c98d9bcef75674188e110969151199e39b1fa693";
-      };
-    }
-
-    {
-      name = "del___del_3.0.0.tgz";
-      path = fetchurl {
-        name = "del___del_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz";
-        sha1 = "53ecf699ffcbcb39637691ab13baf160819766e5";
-      };
-    }
-
-    {
-      name = "delayed_stream___delayed_stream_1.0.0.tgz";
-      path = fetchurl {
-        name = "delayed_stream___delayed_stream_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz";
-        sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
-      };
-    }
-
-    {
-      name = "delegates___delegates_1.0.0.tgz";
-      path = fetchurl {
-        name = "delegates___delegates_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz";
-        sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
-      };
-    }
-
-    {
-      name = "depd___depd_1.1.1.tgz";
-      path = fetchurl {
-        name = "depd___depd_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz";
-        sha1 = "5783b4e1c459f06fa5ca27f991f3d06e7a310359";
-      };
-    }
-
-    {
-      name = "depd___depd_1.1.2.tgz";
-      path = fetchurl {
-        name = "depd___depd_1.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz";
-        sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
-      };
-    }
-
-    {
-      name = "des.js___des.js_1.0.0.tgz";
-      path = fetchurl {
-        name = "des.js___des.js_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz";
-        sha1 = "c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc";
-      };
-    }
-
-    {
-      name = "destroy___destroy_1.0.4.tgz";
-      path = fetchurl {
-        name = "destroy___destroy_1.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz";
-        sha1 = "978857442c44749e4206613e37946205826abd80";
-      };
-    }
-
-    {
-      name = "detect_indent___detect_indent_4.0.0.tgz";
-      path = fetchurl {
-        name = "detect_indent___detect_indent_4.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz";
-        sha1 = "f76d064352cdf43a1cb6ce619c4ee3a9475de208";
-      };
-    }
-
-    {
-      name = "detect_libc___detect_libc_1.0.3.tgz";
-      path = fetchurl {
-        name = "detect_libc___detect_libc_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz";
-        sha1 = "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b";
-      };
-    }
-
-    {
-      name = "detect_node___detect_node_2.0.3.tgz";
-      path = fetchurl {
-        name = "detect_node___detect_node_2.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz";
-        sha1 = "a2033c09cc8e158d37748fbde7507832bd6ce127";
-      };
-    }
-
-    {
-      name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
-      path = fetchurl {
-        name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz";
-        sha1 = "40e8ee98f55a2149607146921c63e1ae5f3d2875";
-      };
-    }
-
-    {
-      name = "dns_equal___dns_equal_1.0.0.tgz";
-      path = fetchurl {
-        name = "dns_equal___dns_equal_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz";
-        sha1 = "b39e7f1da6eb0a75ba9c17324b34753c47e0654d";
-      };
-    }
-
-    {
-      name = "dns_packet___dns_packet_1.3.1.tgz";
-      path = fetchurl {
-        name = "dns_packet___dns_packet_1.3.1.tgz";
-        url  = "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz";
-        sha1 = "12aa426981075be500b910eedcd0b47dd7deda5a";
-      };
-    }
-
-    {
-      name = "dns_txt___dns_txt_2.0.2.tgz";
-      path = fetchurl {
-        name = "dns_txt___dns_txt_2.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz";
-        sha1 = "b91d806f5d27188e4ab3e7d107d881a1cc4642b6";
-      };
-    }
-
-    {
-      name = "dom_converter___dom_converter_0.1.4.tgz";
-      path = fetchurl {
-        name = "dom_converter___dom_converter_0.1.4.tgz";
-        url  = "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz";
-        sha1 = "a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b";
-      };
-    }
-
-    {
-      name = "dom_serializer___dom_serializer_0.1.0.tgz";
-      path = fetchurl {
-        name = "dom_serializer___dom_serializer_0.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz";
-        sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82";
-      };
-    }
-
-    {
-      name = "domain_browser___domain_browser_1.2.0.tgz";
-      path = fetchurl {
-        name = "domain_browser___domain_browser_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz";
-        sha1 = "3d31f50191a6749dd1375a7f522e823d42e54eda";
-      };
-    }
-
-    {
-      name = "domelementtype___domelementtype_1.3.0.tgz";
-      path = fetchurl {
-        name = "domelementtype___domelementtype_1.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz";
-        sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2";
-      };
-    }
-
-    {
-      name = "domelementtype___domelementtype_1.1.3.tgz";
-      path = fetchurl {
-        name = "domelementtype___domelementtype_1.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz";
-        sha1 = "bd28773e2642881aec51544924299c5cd822185b";
-      };
-    }
-
-    {
-      name = "domhandler___domhandler_2.1.0.tgz";
-      path = fetchurl {
-        name = "domhandler___domhandler_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz";
-        sha1 = "d2646f5e57f6c3bab11cf6cb05d3c0acf7412594";
-      };
-    }
-
-    {
-      name = "domutils___domutils_1.1.6.tgz";
-      path = fetchurl {
-        name = "domutils___domutils_1.1.6.tgz";
-        url  = "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz";
-        sha1 = "bddc3de099b9a2efacc51c623f28f416ecc57485";
-      };
-    }
-
-    {
-      name = "domutils___domutils_1.5.1.tgz";
-      path = fetchurl {
-        name = "domutils___domutils_1.5.1.tgz";
-        url  = "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz";
-        sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
-      };
-    }
-
-    {
-      name = "ecc_jsbn___ecc_jsbn_0.1.1.tgz";
-      path = fetchurl {
-        name = "ecc_jsbn___ecc_jsbn_0.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz";
-        sha1 = "0fc73a9ed5f0d53c38193398523ef7e543777505";
-      };
-    }
-
-    {
-      name = "ee_first___ee_first_1.1.1.tgz";
-      path = fetchurl {
-        name = "ee_first___ee_first_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz";
-        sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
-      };
-    }
-
-    {
-      name = "electron_to_chromium___electron_to_chromium_1.3.52.tgz";
-      path = fetchurl {
-        name = "electron_to_chromium___electron_to_chromium_1.3.52.tgz";
-        url  = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz";
-        sha1 = "d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0";
-      };
-    }
-
-    {
-      name = "elliptic___elliptic_6.4.0.tgz";
-      path = fetchurl {
-        name = "elliptic___elliptic_6.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz";
-        sha1 = "cac9af8762c85836187003c8dfe193e5e2eae5df";
-      };
-    }
-
-    {
-      name = "emojis_list___emojis_list_2.1.0.tgz";
-      path = fetchurl {
-        name = "emojis_list___emojis_list_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz";
-        sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389";
-      };
-    }
-
-    {
-      name = "encodeurl___encodeurl_1.0.2.tgz";
-      path = fetchurl {
-        name = "encodeurl___encodeurl_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz";
-        sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
-      };
-    }
-
-    {
-      name = "enhanced_resolve___enhanced_resolve_3.4.1.tgz";
-      path = fetchurl {
-        name = "enhanced_resolve___enhanced_resolve_3.4.1.tgz";
-        url  = "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz";
-        sha1 = "0421e339fd71419b3da13d129b3979040230476e";
-      };
-    }
-
-    {
-      name = "entities___entities_1.1.1.tgz";
-      path = fetchurl {
-        name = "entities___entities_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz";
-        sha1 = "6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0";
-      };
-    }
-
-    {
-      name = "errno___errno_0.1.7.tgz";
-      path = fetchurl {
-        name = "errno___errno_0.1.7.tgz";
-        url  = "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz";
-        sha1 = "4684d71779ad39af177e3f007996f7c67c852618";
-      };
-    }
-
-    {
-      name = "error_ex___error_ex_1.3.2.tgz";
-      path = fetchurl {
-        name = "error_ex___error_ex_1.3.2.tgz";
-        url  = "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz";
-        sha1 = "b4ac40648107fdcdcfae242f428bea8a14d4f1bf";
-      };
-    }
-
-    {
-      name = "error_stack_parser___error_stack_parser_2.0.2.tgz";
-      path = fetchurl {
-        name = "error_stack_parser___error_stack_parser_2.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz";
-        sha1 = "4ae8dbaa2bf90a8b450707b9149dcabca135520d";
-      };
-    }
-
-    {
-      name = "es_abstract___es_abstract_1.12.0.tgz";
-      path = fetchurl {
-        name = "es_abstract___es_abstract_1.12.0.tgz";
-        url  = "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz";
-        sha1 = "9dbbdd27c6856f0001421ca18782d786bf8a6165";
-      };
-    }
-
-    {
-      name = "es_to_primitive___es_to_primitive_1.1.1.tgz";
-      path = fetchurl {
-        name = "es_to_primitive___es_to_primitive_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz";
-        sha1 = "45355248a88979034b6792e19bb81f2b7975dd0d";
-      };
-    }
-
-    {
-      name = "es5_ext___es5_ext_0.10.45.tgz";
-      path = fetchurl {
-        name = "es5_ext___es5_ext_0.10.45.tgz";
-        url  = "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz";
-        sha1 = "0bfdf7b473da5919d5adf3bd25ceb754fccc3653";
-      };
-    }
-
-    {
-      name = "es6_iterator___es6_iterator_2.0.3.tgz";
-      path = fetchurl {
-        name = "es6_iterator___es6_iterator_2.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz";
-        sha1 = "a7de889141a05a94b0854403b2d0a0fbfa98f3b7";
-      };
-    }
-
-    {
-      name = "es6_map___es6_map_0.1.5.tgz";
-      path = fetchurl {
-        name = "es6_map___es6_map_0.1.5.tgz";
-        url  = "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz";
-        sha1 = "9136e0503dcc06a301690f0bb14ff4e364e949f0";
-      };
-    }
-
-    {
-      name = "es6_set___es6_set_0.1.5.tgz";
-      path = fetchurl {
-        name = "es6_set___es6_set_0.1.5.tgz";
-        url  = "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz";
-        sha1 = "d2b3ec5d4d800ced818db538d28974db0a73ccb1";
-      };
-    }
-
-    {
-      name = "es6_symbol___es6_symbol_3.1.1.tgz";
-      path = fetchurl {
-        name = "es6_symbol___es6_symbol_3.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz";
-        sha1 = "bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77";
-      };
-    }
-
-    {
-      name = "es6_weak_map___es6_weak_map_2.0.2.tgz";
-      path = fetchurl {
-        name = "es6_weak_map___es6_weak_map_2.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz";
-        sha1 = "5e3ab32251ffd1538a1f8e5ffa1357772f92d96f";
-      };
-    }
-
-    {
-      name = "escape_html___escape_html_1.0.3.tgz";
-      path = fetchurl {
-        name = "escape_html___escape_html_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz";
-        sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
-      };
-    }
-
-    {
-      name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
-      path = fetchurl {
-        name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
-        url  = "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
-        sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
-      };
-    }
-
-    {
-      name = "escope___escope_3.6.0.tgz";
-      path = fetchurl {
-        name = "escope___escope_3.6.0.tgz";
-        url  = "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz";
-        sha1 = "e01975e812781a163a6dadfdd80398dc64c889c3";
-      };
-    }
-
-    {
-      name = "esprima___esprima_2.7.3.tgz";
-      path = fetchurl {
-        name = "esprima___esprima_2.7.3.tgz";
-        url  = "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz";
-        sha1 = "96e3b70d5779f6ad49cd032673d1c312767ba581";
-      };
-    }
-
-    {
-      name = "esrecurse___esrecurse_4.2.1.tgz";
-      path = fetchurl {
-        name = "esrecurse___esrecurse_4.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz";
-        sha1 = "007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf";
-      };
-    }
-
-    {
-      name = "estraverse___estraverse_4.2.0.tgz";
-      path = fetchurl {
-        name = "estraverse___estraverse_4.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz";
-        sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
-      };
-    }
-
-    {
-      name = "esutils___esutils_2.0.2.tgz";
-      path = fetchurl {
-        name = "esutils___esutils_2.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz";
-        sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b";
-      };
-    }
-
-    {
-      name = "etag___etag_1.8.1.tgz";
-      path = fetchurl {
-        name = "etag___etag_1.8.1.tgz";
-        url  = "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz";
-        sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
-      };
-    }
-
-    {
-      name = "event_emitter___event_emitter_0.3.5.tgz";
-      path = fetchurl {
-        name = "event_emitter___event_emitter_0.3.5.tgz";
-        url  = "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz";
-        sha1 = "df8c69eef1647923c7157b9ce83840610b02cc39";
-      };
-    }
-
-    {
-      name = "eventemitter3___eventemitter3_3.1.0.tgz";
-      path = fetchurl {
-        name = "eventemitter3___eventemitter3_3.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz";
-        sha1 = "090b4d6cdbd645ed10bf750d4b5407942d7ba163";
-      };
-    }
-
-    {
-      name = "events___events_1.1.1.tgz";
-      path = fetchurl {
-        name = "events___events_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz";
-        sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924";
-      };
-    }
-
-    {
-      name = "eventsource___eventsource_0.1.6.tgz";
-      path = fetchurl {
-        name = "eventsource___eventsource_0.1.6.tgz";
-        url  = "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz";
-        sha1 = "0acede849ed7dd1ccc32c811bb11b944d4f29232";
-      };
-    }
-
-    {
-      name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
-      path = fetchurl {
-        name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz";
-        sha1 = "7fcbdb198dc71959432efe13842684e0525acb02";
-      };
-    }
-
-    {
-      name = "execa___execa_0.7.0.tgz";
-      path = fetchurl {
-        name = "execa___execa_0.7.0.tgz";
-        url  = "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz";
-        sha1 = "944becd34cc41ee32a63a9faf27ad5a65fc59777";
-      };
-    }
-
-    {
-      name = "expand_brackets___expand_brackets_0.1.5.tgz";
-      path = fetchurl {
-        name = "expand_brackets___expand_brackets_0.1.5.tgz";
-        url  = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz";
-        sha1 = "df07284e342a807cd733ac5af72411e581d1177b";
-      };
-    }
-
-    {
-      name = "expand_brackets___expand_brackets_2.1.4.tgz";
-      path = fetchurl {
-        name = "expand_brackets___expand_brackets_2.1.4.tgz";
-        url  = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz";
-        sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
-      };
-    }
-
-    {
-      name = "expand_range___expand_range_1.8.2.tgz";
-      path = fetchurl {
-        name = "expand_range___expand_range_1.8.2.tgz";
-        url  = "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz";
-        sha1 = "a299effd335fe2721ebae8e257ec79644fc85337";
-      };
-    }
-
-    {
-      name = "express___express_4.16.3.tgz";
-      path = fetchurl {
-        name = "express___express_4.16.3.tgz";
-        url  = "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz";
-        sha1 = "6af8a502350db3246ecc4becf6b5a34d22f7ed53";
-      };
-    }
-
-    {
-      name = "extend_shallow___extend_shallow_2.0.1.tgz";
-      path = fetchurl {
-        name = "extend_shallow___extend_shallow_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz";
-        sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
-      };
-    }
-
-    {
-      name = "extend_shallow___extend_shallow_3.0.2.tgz";
-      path = fetchurl {
-        name = "extend_shallow___extend_shallow_3.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz";
-        sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
-      };
-    }
-
-    {
-      name = "extend___extend_3.0.2.tgz";
-      path = fetchurl {
-        name = "extend___extend_3.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz";
-        sha1 = "f8b1136b4071fbd8eb140aff858b1019ec2915fa";
-      };
-    }
-
-    {
-      name = "extglob___extglob_0.3.2.tgz";
-      path = fetchurl {
-        name = "extglob___extglob_0.3.2.tgz";
-        url  = "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz";
-        sha1 = "2e18ff3d2f49ab2765cec9023f011daa8d8349a1";
-      };
-    }
-
-    {
-      name = "extglob___extglob_2.0.4.tgz";
-      path = fetchurl {
-        name = "extglob___extglob_2.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz";
-        sha1 = "ad00fe4dc612a9232e8718711dc5cb5ab0285543";
-      };
-    }
-
-    {
-      name = "extract_text_webpack_plugin___extract_text_webpack_plugin_3.0.2.tgz";
-      path = fetchurl {
-        name = "extract_text_webpack_plugin___extract_text_webpack_plugin_3.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz";
-        sha1 = "5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7";
-      };
-    }
-
-    {
-      name = "extsprintf___extsprintf_1.3.0.tgz";
-      path = fetchurl {
-        name = "extsprintf___extsprintf_1.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz";
-        sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
-      };
-    }
-
-    {
-      name = "extsprintf___extsprintf_1.4.0.tgz";
-      path = fetchurl {
-        name = "extsprintf___extsprintf_1.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz";
-        sha1 = "e2689f8f356fad62cca65a3a91c5df5f9551692f";
-      };
-    }
-
-    {
-      name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz";
-      path = fetchurl {
-        name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz";
-        sha1 = "c053477817c86b51daa853c81e059b733d023614";
-      };
-    }
-
-    {
-      name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
-      path = fetchurl {
-        name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";
-        sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
-      };
-    }
-
-    {
-      name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
-      path = fetchurl {
-        name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";
-        sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2";
-      };
-    }
-
-    {
-      name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
-      path = fetchurl {
-        name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
-        url  = "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
-        sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
-      };
-    }
-
-    {
-      name = "fastparse___fastparse_1.1.1.tgz";
-      path = fetchurl {
-        name = "fastparse___fastparse_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz";
-        sha1 = "d1e2643b38a94d7583b479060e6c4affc94071f8";
-      };
-    }
-
-    {
-      name = "faye_websocket___faye_websocket_0.10.0.tgz";
-      path = fetchurl {
-        name = "faye_websocket___faye_websocket_0.10.0.tgz";
-        url  = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz";
-        sha1 = "4e492f8d04dfb6f89003507f6edbf2d501e7c6f4";
-      };
-    }
-
-    {
-      name = "faye_websocket___faye_websocket_0.11.1.tgz";
-      path = fetchurl {
-        name = "faye_websocket___faye_websocket_0.11.1.tgz";
-        url  = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz";
-        sha1 = "f0efe18c4f56e4f40afc7e06c719fd5ee6188f38";
-      };
-    }
-
-    {
-      name = "file_loader___file_loader_0.10.1.tgz";
-      path = fetchurl {
-        name = "file_loader___file_loader_0.10.1.tgz";
-        url  = "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.1.tgz";
-        sha1 = "815034119891fc6441fb5a64c11bc93c22ddd842";
-      };
-    }
-
-    {
-      name = "filename_regex___filename_regex_2.0.1.tgz";
-      path = fetchurl {
-        name = "filename_regex___filename_regex_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz";
-        sha1 = "c1c4b9bee3e09725ddb106b75c1e301fe2f18b26";
-      };
-    }
-
-    {
-      name = "fill_range___fill_range_2.2.4.tgz";
-      path = fetchurl {
-        name = "fill_range___fill_range_2.2.4.tgz";
-        url  = "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz";
-        sha1 = "eb1e773abb056dcd8df2bfdf6af59b8b3a936565";
-      };
-    }
-
-    {
-      name = "fill_range___fill_range_4.0.0.tgz";
-      path = fetchurl {
-        name = "fill_range___fill_range_4.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz";
-        sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
-      };
-    }
-
-    {
-      name = "finalhandler___finalhandler_1.1.1.tgz";
-      path = fetchurl {
-        name = "finalhandler___finalhandler_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz";
-        sha1 = "eebf4ed840079c83f4249038c9d703008301b105";
-      };
-    }
-
-    {
-      name = "find_cache_dir___find_cache_dir_1.0.0.tgz";
-      path = fetchurl {
-        name = "find_cache_dir___find_cache_dir_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz";
-        sha1 = "9288e3e9e3cc3748717d39eade17cf71fc30ee6f";
-      };
-    }
-
-    {
-      name = "find_up___find_up_1.1.2.tgz";
-      path = fetchurl {
-        name = "find_up___find_up_1.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz";
-        sha1 = "6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f";
-      };
-    }
-
-    {
-      name = "find_up___find_up_2.1.0.tgz";
-      path = fetchurl {
-        name = "find_up___find_up_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz";
-        sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
-      };
-    }
-
-    {
-      name = "flatten___flatten_1.0.2.tgz";
-      path = fetchurl {
-        name = "flatten___flatten_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz";
-        sha1 = "dae46a9d78fbe25292258cc1e780a41d95c03782";
-      };
-    }
-
-    {
-      name = "follow_redirects___follow_redirects_1.5.1.tgz";
-      path = fetchurl {
-        name = "follow_redirects___follow_redirects_1.5.1.tgz";
-        url  = "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz";
-        sha1 = "67a8f14f5a1f67f962c2c46469c79eaec0a90291";
-      };
-    }
-
-    {
-      name = "for_in___for_in_0.1.8.tgz";
-      path = fetchurl {
-        name = "for_in___for_in_0.1.8.tgz";
-        url  = "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz";
-        sha1 = "d8773908e31256109952b1fdb9b3fa867d2775e1";
-      };
-    }
-
-    {
-      name = "for_in___for_in_1.0.2.tgz";
-      path = fetchurl {
-        name = "for_in___for_in_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz";
-        sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
-      };
-    }
-
-    {
-      name = "for_own___for_own_0.1.5.tgz";
-      path = fetchurl {
-        name = "for_own___for_own_0.1.5.tgz";
-        url  = "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz";
-        sha1 = "5265c681a4f294dabbf17c9509b6763aa84510ce";
-      };
-    }
-
-    {
-      name = "for_own___for_own_1.0.0.tgz";
-      path = fetchurl {
-        name = "for_own___for_own_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz";
-        sha1 = "c63332f415cedc4b04dbfe70cf836494c53cb44b";
-      };
-    }
-
-    {
-      name = "foreach___foreach_2.0.5.tgz";
-      path = fetchurl {
-        name = "foreach___foreach_2.0.5.tgz";
-        url  = "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz";
-        sha1 = "0bee005018aeb260d0a3af3ae658dd0136ec1b99";
-      };
-    }
-
-    {
-      name = "forever_agent___forever_agent_0.6.1.tgz";
-      path = fetchurl {
-        name = "forever_agent___forever_agent_0.6.1.tgz";
-        url  = "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz";
-        sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
-      };
-    }
-
-    {
-      name = "form_data___form_data_2.1.4.tgz";
-      path = fetchurl {
-        name = "form_data___form_data_2.1.4.tgz";
-        url  = "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz";
-        sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1";
-      };
-    }
-
-    {
-      name = "form_data___form_data_2.3.2.tgz";
-      path = fetchurl {
-        name = "form_data___form_data_2.3.2.tgz";
-        url  = "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz";
-        sha1 = "4970498be604c20c005d4f5c23aecd21d6b49099";
-      };
-    }
-
-    {
-      name = "forwarded___forwarded_0.1.2.tgz";
-      path = fetchurl {
-        name = "forwarded___forwarded_0.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz";
-        sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84";
-      };
-    }
-
-    {
-      name = "fragment_cache___fragment_cache_0.2.1.tgz";
-      path = fetchurl {
-        name = "fragment_cache___fragment_cache_0.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz";
-        sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
-      };
-    }
-
-    {
-      name = "fresh___fresh_0.5.2.tgz";
-      path = fetchurl {
-        name = "fresh___fresh_0.5.2.tgz";
-        url  = "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz";
-        sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
-      };
-    }
-
-    {
-      name = "friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.0.tgz";
-      path = fetchurl {
-        name = "friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.0.tgz";
-        url  = "https://registry.yarnpkg.com/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz";
-        sha1 = "efc86cbb816224565861a1be7a9d84d0aafea136";
-      };
-    }
-
-    {
-      name = "fs_extra___fs_extra_2.1.2.tgz";
-      path = fetchurl {
-        name = "fs_extra___fs_extra_2.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz";
-        sha1 = "046c70163cef9aad46b0e4a7fa467fb22d71de35";
-      };
-    }
-
-    {
-      name = "fs_minipass___fs_minipass_1.2.5.tgz";
-      path = fetchurl {
-        name = "fs_minipass___fs_minipass_1.2.5.tgz";
-        url  = "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz";
-        sha1 = "06c277218454ec288df77ada54a03b8702aacb9d";
-      };
-    }
-
-    {
-      name = "fs.realpath___fs.realpath_1.0.0.tgz";
-      path = fetchurl {
-        name = "fs.realpath___fs.realpath_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz";
-        sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
-      };
-    }
-
-    {
-      name = "fsevents___fsevents_1.2.4.tgz";
-      path = fetchurl {
-        name = "fsevents___fsevents_1.2.4.tgz";
-        url  = "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz";
-        sha1 = "f41dcb1af2582af3692da36fc55cbd8e1041c426";
-      };
-    }
-
-    {
-      name = "fstream___fstream_1.0.11.tgz";
-      path = fetchurl {
-        name = "fstream___fstream_1.0.11.tgz";
-        url  = "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz";
-        sha1 = "5c1fb1f117477114f0632a0eb4b71b3cb0fd3171";
-      };
-    }
-
-    {
-      name = "function_bind___function_bind_1.1.1.tgz";
-      path = fetchurl {
-        name = "function_bind___function_bind_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz";
-        sha1 = "a56899d3ea3c9bab874bb9773b7c5ede92f4895d";
-      };
-    }
-
-    {
-      name = "gauge___gauge_2.7.4.tgz";
-      path = fetchurl {
-        name = "gauge___gauge_2.7.4.tgz";
-        url  = "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz";
-        sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
-      };
-    }
-
-    {
-      name = "gaze___gaze_1.1.3.tgz";
-      path = fetchurl {
-        name = "gaze___gaze_1.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz";
-        sha1 = "c441733e13b927ac8c0ff0b4c3b033f28812924a";
-      };
-    }
-
-    {
-      name = "get_caller_file___get_caller_file_1.0.3.tgz";
-      path = fetchurl {
-        name = "get_caller_file___get_caller_file_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz";
-        sha1 = "f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a";
-      };
-    }
-
-    {
-      name = "get_stdin___get_stdin_4.0.1.tgz";
-      path = fetchurl {
-        name = "get_stdin___get_stdin_4.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz";
-        sha1 = "b968c6b0a04384324902e8bf1a5df32579a450fe";
-      };
-    }
-
-    {
-      name = "get_stream___get_stream_3.0.0.tgz";
-      path = fetchurl {
-        name = "get_stream___get_stream_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz";
-        sha1 = "8e943d1358dc37555054ecbe2edb05aa174ede14";
-      };
-    }
-
-    {
-      name = "get_value___get_value_2.0.6.tgz";
-      path = fetchurl {
-        name = "get_value___get_value_2.0.6.tgz";
-        url  = "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz";
-        sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
-      };
-    }
-
-    {
-      name = "getpass___getpass_0.1.7.tgz";
-      path = fetchurl {
-        name = "getpass___getpass_0.1.7.tgz";
-        url  = "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz";
-        sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
-      };
-    }
-
-    {
-      name = "glob_base___glob_base_0.3.0.tgz";
-      path = fetchurl {
-        name = "glob_base___glob_base_0.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz";
-        sha1 = "dbb164f6221b1c0b1ccf82aea328b497df0ea3c4";
-      };
-    }
-
-    {
-      name = "glob_parent___glob_parent_2.0.0.tgz";
-      path = fetchurl {
-        name = "glob_parent___glob_parent_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz";
-        sha1 = "81383d72db054fcccf5336daa902f182f6edbb28";
-      };
-    }
-
-    {
-      name = "glob_parent___glob_parent_3.1.0.tgz";
-      path = fetchurl {
-        name = "glob_parent___glob_parent_3.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz";
-        sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
-      };
-    }
-
-    {
-      name = "glob___glob_6.0.4.tgz";
-      path = fetchurl {
-        name = "glob___glob_6.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz";
-        sha1 = "0f08860f6a155127b2fadd4f9ce24b1aab6e4d22";
-      };
-    }
-
-    {
-      name = "glob___glob_7.1.2.tgz";
-      path = fetchurl {
-        name = "glob___glob_7.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz";
-        sha1 = "c19c9df9a028702d678612384a6552404c636d15";
-      };
-    }
-
-    {
-      name = "globals___globals_9.18.0.tgz";
-      path = fetchurl {
-        name = "globals___globals_9.18.0.tgz";
-        url  = "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz";
-        sha1 = "aa3896b3e69b487f17e31ed2143d69a8e30c2d8a";
-      };
-    }
-
-    {
-      name = "globby___globby_6.1.0.tgz";
-      path = fetchurl {
-        name = "globby___globby_6.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz";
-        sha1 = "f5a6d70e8395e21c858fb0489d64df02424d506c";
-      };
-    }
-
-    {
-      name = "globule___globule_1.2.1.tgz";
-      path = fetchurl {
-        name = "globule___globule_1.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz";
-        sha1 = "5dffb1b191f22d20797a9369b49eab4e9839696d";
-      };
-    }
-
-    {
-      name = "graceful_fs___graceful_fs_4.1.11.tgz";
-      path = fetchurl {
-        name = "graceful_fs___graceful_fs_4.1.11.tgz";
-        url  = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz";
-        sha1 = "0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658";
-      };
-    }
-
-    {
-      name = "handle_thing___handle_thing_1.2.5.tgz";
-      path = fetchurl {
-        name = "handle_thing___handle_thing_1.2.5.tgz";
-        url  = "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz";
-        sha1 = "fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4";
-      };
-    }
-
-    {
-      name = "har_schema___har_schema_1.0.5.tgz";
-      path = fetchurl {
-        name = "har_schema___har_schema_1.0.5.tgz";
-        url  = "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz";
-        sha1 = "d263135f43307c02c602afc8fe95970c0151369e";
-      };
-    }
-
-    {
-      name = "har_schema___har_schema_2.0.0.tgz";
-      path = fetchurl {
-        name = "har_schema___har_schema_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz";
-        sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
-      };
-    }
-
-    {
-      name = "har_validator___har_validator_4.2.1.tgz";
-      path = fetchurl {
-        name = "har_validator___har_validator_4.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz";
-        sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a";
-      };
-    }
-
-    {
-      name = "har_validator___har_validator_5.0.3.tgz";
-      path = fetchurl {
-        name = "har_validator___har_validator_5.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz";
-        sha1 = "ba402c266194f15956ef15e0fcf242993f6a7dfd";
-      };
-    }
-
-    {
-      name = "has_ansi___has_ansi_2.0.0.tgz";
-      path = fetchurl {
-        name = "has_ansi___has_ansi_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz";
-        sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
-      };
-    }
-
-    {
-      name = "has_flag___has_flag_1.0.0.tgz";
-      path = fetchurl {
-        name = "has_flag___has_flag_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz";
-        sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa";
-      };
-    }
-
-    {
-      name = "has_flag___has_flag_2.0.0.tgz";
-      path = fetchurl {
-        name = "has_flag___has_flag_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz";
-        sha1 = "e8207af1cc7b30d446cc70b734b5e8be18f88d51";
-      };
-    }
-
-    {
-      name = "has_flag___has_flag_3.0.0.tgz";
-      path = fetchurl {
-        name = "has_flag___has_flag_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz";
-        sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
-      };
-    }
-
-    {
-      name = "has_unicode___has_unicode_2.0.1.tgz";
-      path = fetchurl {
-        name = "has_unicode___has_unicode_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz";
-        sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
-      };
-    }
-
-    {
-      name = "has_value___has_value_0.3.1.tgz";
-      path = fetchurl {
-        name = "has_value___has_value_0.3.1.tgz";
-        url  = "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz";
-        sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
-      };
-    }
-
-    {
-      name = "has_value___has_value_1.0.0.tgz";
-      path = fetchurl {
-        name = "has_value___has_value_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz";
-        sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
-      };
-    }
-
-    {
-      name = "has_values___has_values_0.1.4.tgz";
-      path = fetchurl {
-        name = "has_values___has_values_0.1.4.tgz";
-        url  = "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz";
-        sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
-      };
-    }
-
-    {
-      name = "has_values___has_values_1.0.0.tgz";
-      path = fetchurl {
-        name = "has_values___has_values_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz";
-        sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
-      };
-    }
-
-    {
-      name = "has___has_1.0.3.tgz";
-      path = fetchurl {
-        name = "has___has_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz";
-        sha1 = "722d7cbfc1f6aa8241f16dd814e011e1f41e8796";
-      };
-    }
-
-    {
-      name = "hash_base___hash_base_3.0.4.tgz";
-      path = fetchurl {
-        name = "hash_base___hash_base_3.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz";
-        sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918";
-      };
-    }
-
-    {
-      name = "hash.js___hash.js_1.1.5.tgz";
-      path = fetchurl {
-        name = "hash.js___hash.js_1.1.5.tgz";
-        url  = "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz";
-        sha1 = "e38ab4b85dfb1e0c40fe9265c0e9b54854c23812";
-      };
-    }
-
-    {
-      name = "hawk___hawk_3.1.3.tgz";
-      path = fetchurl {
-        name = "hawk___hawk_3.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz";
-        sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4";
-      };
-    }
-
-    {
-      name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
-      path = fetchurl {
-        name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz";
-        sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1";
-      };
-    }
-
-    {
-      name = "hoek___hoek_2.16.3.tgz";
-      path = fetchurl {
-        name = "hoek___hoek_2.16.3.tgz";
-        url  = "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz";
-        sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
-      };
-    }
-
-    {
-      name = "home_or_tmp___home_or_tmp_2.0.0.tgz";
-      path = fetchurl {
-        name = "home_or_tmp___home_or_tmp_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz";
-        sha1 = "e36c3f2d2cae7d746a857e38d18d5f32a7882db8";
-      };
-    }
-
-    {
-      name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
-      path = fetchurl {
-        name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
-        url  = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz";
-        sha1 = "97f236977bd6e125408930ff6de3eec6281ec047";
-      };
-    }
-
-    {
-      name = "hpack.js___hpack.js_2.1.6.tgz";
-      path = fetchurl {
-        name = "hpack.js___hpack.js_2.1.6.tgz";
-        url  = "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz";
-        sha1 = "87774c0949e513f42e84575b3c45681fade2a0b2";
-      };
-    }
-
-    {
-      name = "html_comment_regex___html_comment_regex_1.1.1.tgz";
-      path = fetchurl {
-        name = "html_comment_regex___html_comment_regex_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz";
-        sha1 = "668b93776eaae55ebde8f3ad464b307a4963625e";
-      };
-    }
-
-    {
-      name = "html_entities___html_entities_1.2.1.tgz";
-      path = fetchurl {
-        name = "html_entities___html_entities_1.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz";
-        sha1 = "0df29351f0721163515dfb9e5543e5f6eed5162f";
-      };
-    }
-
-    {
-      name = "htmlparser2___htmlparser2_3.3.0.tgz";
-      path = fetchurl {
-        name = "htmlparser2___htmlparser2_3.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz";
-        sha1 = "cc70d05a59f6542e43f0e685c982e14c924a9efe";
-      };
-    }
-
-    {
-      name = "http_deceiver___http_deceiver_1.2.7.tgz";
-      path = fetchurl {
-        name = "http_deceiver___http_deceiver_1.2.7.tgz";
-        url  = "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz";
-        sha1 = "fa7168944ab9a519d337cb0bec7284dc3e723d87";
-      };
-    }
-
-    {
-      name = "http_errors___http_errors_1.6.2.tgz";
-      path = fetchurl {
-        name = "http_errors___http_errors_1.6.2.tgz";
-        url  = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz";
-        sha1 = "0a002cc85707192a7e7946ceedc11155f60ec736";
-      };
-    }
-
-    {
-      name = "http_errors___http_errors_1.6.3.tgz";
-      path = fetchurl {
-        name = "http_errors___http_errors_1.6.3.tgz";
-        url  = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz";
-        sha1 = "8b55680bb4be283a0b5bf4ea2e38580be1d9320d";
-      };
-    }
-
-    {
-      name = "http_parser_js___http_parser_js_0.4.13.tgz";
-      path = fetchurl {
-        name = "http_parser_js___http_parser_js_0.4.13.tgz";
-        url  = "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz";
-        sha1 = "3bd6d6fde6e3172c9334c3b33b6c193d80fe1137";
-      };
-    }
-
-    {
-      name = "http_proxy_middleware___http_proxy_middleware_0.17.4.tgz";
-      path = fetchurl {
-        name = "http_proxy_middleware___http_proxy_middleware_0.17.4.tgz";
-        url  = "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz";
-        sha1 = "642e8848851d66f09d4f124912846dbaeb41b833";
-      };
-    }
-
-    {
-      name = "http_proxy___http_proxy_1.17.0.tgz";
-      path = fetchurl {
-        name = "http_proxy___http_proxy_1.17.0.tgz";
-        url  = "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz";
-        sha1 = "7ad38494658f84605e2f6db4436df410f4e5be9a";
-      };
-    }
-
-    {
-      name = "http_signature___http_signature_1.1.1.tgz";
-      path = fetchurl {
-        name = "http_signature___http_signature_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz";
-        sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf";
-      };
-    }
-
-    {
-      name = "http_signature___http_signature_1.2.0.tgz";
-      path = fetchurl {
-        name = "http_signature___http_signature_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz";
-        sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
-      };
-    }
-
-    {
-      name = "https_browserify___https_browserify_1.0.0.tgz";
-      path = fetchurl {
-        name = "https_browserify___https_browserify_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz";
-        sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
-      };
-    }
-
-    {
-      name = "iconv_lite___iconv_lite_0.4.19.tgz";
-      path = fetchurl {
-        name = "iconv_lite___iconv_lite_0.4.19.tgz";
-        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz";
-        sha1 = "f7468f60135f5e5dad3399c0a81be9a1603a082b";
-      };
-    }
-
-    {
-      name = "iconv_lite___iconv_lite_0.4.23.tgz";
-      path = fetchurl {
-        name = "iconv_lite___iconv_lite_0.4.23.tgz";
-        url  = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz";
-        sha1 = "297871f63be507adcfbfca715d0cd0eed84e9a63";
-      };
-    }
-
-    {
-      name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz";
-      path = fetchurl {
-        name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz";
-        sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded";
-      };
-    }
-
-    {
-      name = "ieee754___ieee754_1.1.12.tgz";
-      path = fetchurl {
-        name = "ieee754___ieee754_1.1.12.tgz";
-        url  = "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz";
-        sha1 = "50bf24e5b9c8bb98af4964c941cdb0918da7b60b";
-      };
-    }
-
-    {
-      name = "ignore_walk___ignore_walk_3.0.1.tgz";
-      path = fetchurl {
-        name = "ignore_walk___ignore_walk_3.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz";
-        sha1 = "a83e62e7d272ac0e3b551aaa82831a19b69f82f8";
-      };
-    }
-
-    {
-      name = "import_local___import_local_1.0.0.tgz";
-      path = fetchurl {
-        name = "import_local___import_local_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz";
-        sha1 = "5e4ffdc03f4fe6c009c6729beb29631c2f8227bc";
-      };
-    }
-
-    {
-      name = "in_publish___in_publish_2.0.0.tgz";
-      path = fetchurl {
-        name = "in_publish___in_publish_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz";
-        sha1 = "e20ff5e3a2afc2690320b6dc552682a9c7fadf51";
-      };
-    }
-
-    {
-      name = "indent_string___indent_string_2.1.0.tgz";
-      path = fetchurl {
-        name = "indent_string___indent_string_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz";
-        sha1 = "8e2d48348742121b4a8218b7a137e9a52049dc80";
-      };
-    }
-
-    {
-      name = "indexes_of___indexes_of_1.0.1.tgz";
-      path = fetchurl {
-        name = "indexes_of___indexes_of_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz";
-        sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607";
-      };
-    }
-
-    {
-      name = "indexof___indexof_0.0.1.tgz";
-      path = fetchurl {
-        name = "indexof___indexof_0.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz";
-        sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
-      };
-    }
-
-    {
-      name = "inflight___inflight_1.0.6.tgz";
-      path = fetchurl {
-        name = "inflight___inflight_1.0.6.tgz";
-        url  = "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz";
-        sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
-      };
-    }
-
-    {
-      name = "inherits___inherits_2.0.3.tgz";
-      path = fetchurl {
-        name = "inherits___inherits_2.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz";
-        sha1 = "633c2c83e3da42a502f52466022480f4208261de";
-      };
-    }
-
-    {
-      name = "inherits___inherits_2.0.1.tgz";
-      path = fetchurl {
-        name = "inherits___inherits_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz";
-        sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
-      };
-    }
-
-    {
-      name = "ini___ini_1.3.5.tgz";
-      path = fetchurl {
-        name = "ini___ini_1.3.5.tgz";
-        url  = "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz";
-        sha1 = "eee25f56db1c9ec6085e0c22778083f596abf927";
-      };
-    }
-
-    {
-      name = "internal_ip___internal_ip_1.2.0.tgz";
-      path = fetchurl {
-        name = "internal_ip___internal_ip_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz";
-        sha1 = "ae9fbf93b984878785d50a8de1b356956058cf5c";
-      };
-    }
-
-    {
-      name = "interpret___interpret_1.1.0.tgz";
-      path = fetchurl {
-        name = "interpret___interpret_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz";
-        sha1 = "7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614";
-      };
-    }
-
-    {
-      name = "invariant___invariant_2.2.4.tgz";
-      path = fetchurl {
-        name = "invariant___invariant_2.2.4.tgz";
-        url  = "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz";
-        sha1 = "610f3c92c9359ce1db616e538008d23ff35158e6";
-      };
-    }
-
-    {
-      name = "invert_kv___invert_kv_1.0.0.tgz";
-      path = fetchurl {
-        name = "invert_kv___invert_kv_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz";
-        sha1 = "104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6";
-      };
-    }
-
-    {
-      name = "ip___ip_1.1.5.tgz";
-      path = fetchurl {
-        name = "ip___ip_1.1.5.tgz";
-        url  = "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz";
-        sha1 = "bdded70114290828c0a039e72ef25f5aaec4354a";
-      };
-    }
-
-    {
-      name = "ipaddr.js___ipaddr.js_1.8.0.tgz";
-      path = fetchurl {
-        name = "ipaddr.js___ipaddr.js_1.8.0.tgz";
-        url  = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz";
-        sha1 = "eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e";
-      };
-    }
-
-    {
-      name = "is_absolute_url___is_absolute_url_2.1.0.tgz";
-      path = fetchurl {
-        name = "is_absolute_url___is_absolute_url_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz";
-        sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6";
-      };
-    }
-
-    {
-      name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
-      path = fetchurl {
-        name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
-        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
-        sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
-      };
-    }
-
-    {
-      name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
-      path = fetchurl {
-        name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
-        sha1 = "169c2f6d3df1f992618072365c9b0ea1f6878656";
-      };
-    }
-
-    {
-      name = "is_arrayish___is_arrayish_0.2.1.tgz";
-      path = fetchurl {
-        name = "is_arrayish___is_arrayish_0.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz";
-        sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
-      };
-    }
-
-    {
-      name = "is_binary_path___is_binary_path_1.0.1.tgz";
-      path = fetchurl {
-        name = "is_binary_path___is_binary_path_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz";
-        sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
-      };
-    }
-
-    {
-      name = "is_buffer___is_buffer_1.1.6.tgz";
-      path = fetchurl {
-        name = "is_buffer___is_buffer_1.1.6.tgz";
-        url  = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz";
-        sha1 = "efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be";
-      };
-    }
-
-    {
-      name = "is_builtin_module___is_builtin_module_1.0.0.tgz";
-      path = fetchurl {
-        name = "is_builtin_module___is_builtin_module_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz";
-        sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe";
-      };
-    }
-
-    {
-      name = "is_callable___is_callable_1.1.4.tgz";
-      path = fetchurl {
-        name = "is_callable___is_callable_1.1.4.tgz";
-        url  = "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz";
-        sha1 = "1e1adf219e1eeb684d691f9d6a05ff0d30a24d75";
-      };
-    }
-
-    {
-      name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
-      path = fetchurl {
-        name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
-        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
-        sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
-      };
-    }
-
-    {
-      name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
-      path = fetchurl {
-        name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
-        sha1 = "d84876321d0e7add03990406abbbbd36ba9268c7";
-      };
-    }
-
-    {
-      name = "is_date_object___is_date_object_1.0.1.tgz";
-      path = fetchurl {
-        name = "is_date_object___is_date_object_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz";
-        sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16";
-      };
-    }
-
-    {
-      name = "is_descriptor___is_descriptor_0.1.6.tgz";
-      path = fetchurl {
-        name = "is_descriptor___is_descriptor_0.1.6.tgz";
-        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz";
-        sha1 = "366d8240dde487ca51823b1ab9f07a10a78251ca";
-      };
-    }
-
-    {
-      name = "is_descriptor___is_descriptor_1.0.2.tgz";
-      path = fetchurl {
-        name = "is_descriptor___is_descriptor_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz";
-        sha1 = "3b159746a66604b04f8c81524ba365c5f14d86ec";
-      };
-    }
-
-    {
-      name = "is_dotfile___is_dotfile_1.0.3.tgz";
-      path = fetchurl {
-        name = "is_dotfile___is_dotfile_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz";
-        sha1 = "a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1";
-      };
-    }
-
-    {
-      name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
-      path = fetchurl {
-        name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz";
-        sha1 = "2238098fc221de0bcfa5d9eac4c45d638aa1c534";
-      };
-    }
-
-    {
-      name = "is_extendable___is_extendable_0.1.1.tgz";
-      path = fetchurl {
-        name = "is_extendable___is_extendable_0.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz";
-        sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
-      };
-    }
-
-    {
-      name = "is_extendable___is_extendable_1.0.1.tgz";
-      path = fetchurl {
-        name = "is_extendable___is_extendable_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz";
-        sha1 = "a7470f9e426733d81bd81e1155264e3a3507cab4";
-      };
-    }
-
-    {
-      name = "is_extglob___is_extglob_1.0.0.tgz";
-      path = fetchurl {
-        name = "is_extglob___is_extglob_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz";
-        sha1 = "ac468177c4943405a092fc8f29760c6ffc6206c0";
-      };
-    }
-
-    {
-      name = "is_extglob___is_extglob_2.1.1.tgz";
-      path = fetchurl {
-        name = "is_extglob___is_extglob_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz";
-        sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
-      };
-    }
-
-    {
-      name = "is_finite___is_finite_1.0.2.tgz";
-      path = fetchurl {
-        name = "is_finite___is_finite_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz";
-        sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa";
-      };
-    }
-
-    {
-      name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
-      path = fetchurl {
-        name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
-        sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
-      };
-    }
-
-    {
-      name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
-      path = fetchurl {
-        name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
-        sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
-      };
-    }
-
-    {
-      name = "is_glob___is_glob_2.0.1.tgz";
-      path = fetchurl {
-        name = "is_glob___is_glob_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz";
-        sha1 = "d096f926a3ded5600f3fdfd91198cb0888c2d863";
-      };
-    }
-
-    {
-      name = "is_glob___is_glob_3.1.0.tgz";
-      path = fetchurl {
-        name = "is_glob___is_glob_3.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz";
-        sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
-      };
-    }
-
-    {
-      name = "is_glob___is_glob_4.0.0.tgz";
-      path = fetchurl {
-        name = "is_glob___is_glob_4.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz";
-        sha1 = "9521c76845cc2610a85203ddf080a958c2ffabc0";
-      };
-    }
-
-    {
-      name = "is_number___is_number_2.1.0.tgz";
-      path = fetchurl {
-        name = "is_number___is_number_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz";
-        sha1 = "01fcbbb393463a548f2f466cce16dece49db908f";
-      };
-    }
-
-    {
-      name = "is_number___is_number_3.0.0.tgz";
-      path = fetchurl {
-        name = "is_number___is_number_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz";
-        sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
-      };
-    }
-
-    {
-      name = "is_number___is_number_4.0.0.tgz";
-      path = fetchurl {
-        name = "is_number___is_number_4.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz";
-        sha1 = "0026e37f5454d73e356dfe6564699867c6a7f0ff";
-      };
-    }
-
-    {
-      name = "is_path_cwd___is_path_cwd_1.0.0.tgz";
-      path = fetchurl {
-        name = "is_path_cwd___is_path_cwd_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz";
-        sha1 = "d225ec23132e89edd38fda767472e62e65f1106d";
-      };
-    }
-
-    {
-      name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz";
-      path = fetchurl {
-        name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz";
-        sha1 = "5ac48b345ef675339bd6c7a48a912110b241cf52";
-      };
-    }
-
-    {
-      name = "is_path_inside___is_path_inside_1.0.1.tgz";
-      path = fetchurl {
-        name = "is_path_inside___is_path_inside_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz";
-        sha1 = "8ef5b7de50437a3fdca6b4e865ef7aa55cb48036";
-      };
-    }
-
-    {
-      name = "is_plain_obj___is_plain_obj_1.1.0.tgz";
-      path = fetchurl {
-        name = "is_plain_obj___is_plain_obj_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz";
-        sha1 = "71a50c8429dfca773c92a390a4a03b39fcd51d3e";
-      };
-    }
-
-    {
-      name = "is_plain_object___is_plain_object_2.0.4.tgz";
-      path = fetchurl {
-        name = "is_plain_object___is_plain_object_2.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz";
-        sha1 = "2c163b3fafb1b606d9d17928f05c2a1c38e07677";
-      };
-    }
-
-    {
-      name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
-      path = fetchurl {
-        name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz";
-        sha1 = "3334dc79774368e92f016e6fbc0a88f5cd6e6bc4";
-      };
-    }
-
-    {
-      name = "is_primitive___is_primitive_2.0.0.tgz";
-      path = fetchurl {
-        name = "is_primitive___is_primitive_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz";
-        sha1 = "207bab91638499c07b2adf240a41a87210034575";
-      };
-    }
-
-    {
-      name = "is_regex___is_regex_1.0.4.tgz";
-      path = fetchurl {
-        name = "is_regex___is_regex_1.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz";
-        sha1 = "5517489b547091b0930e095654ced25ee97e9491";
-      };
-    }
-
-    {
-      name = "is_stream___is_stream_1.1.0.tgz";
-      path = fetchurl {
-        name = "is_stream___is_stream_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz";
-        sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
-      };
-    }
-
-    {
-      name = "is_svg___is_svg_2.1.0.tgz";
-      path = fetchurl {
-        name = "is_svg___is_svg_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz";
-        sha1 = "cf61090da0d9efbcab8722deba6f032208dbb0e9";
-      };
-    }
-
-    {
-      name = "is_symbol___is_symbol_1.0.1.tgz";
-      path = fetchurl {
-        name = "is_symbol___is_symbol_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz";
-        sha1 = "3cc59f00025194b6ab2e38dbae6689256b660572";
-      };
-    }
-
-    {
-      name = "is_typedarray___is_typedarray_1.0.0.tgz";
-      path = fetchurl {
-        name = "is_typedarray___is_typedarray_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz";
-        sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
-      };
-    }
-
-    {
-      name = "is_utf8___is_utf8_0.2.1.tgz";
-      path = fetchurl {
-        name = "is_utf8___is_utf8_0.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz";
-        sha1 = "4b0da1442104d1b336340e80797e865cf39f7d72";
-      };
-    }
-
-    {
-      name = "is_windows___is_windows_1.0.2.tgz";
-      path = fetchurl {
-        name = "is_windows___is_windows_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz";
-        sha1 = "d1850eb9791ecd18e6182ce12a30f396634bb19d";
-      };
-    }
-
-    {
-      name = "is_wsl___is_wsl_1.1.0.tgz";
-      path = fetchurl {
-        name = "is_wsl___is_wsl_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz";
-        sha1 = "1f16e4aa22b04d1336b66188a66af3c600c3a66d";
-      };
-    }
-
-    {
-      name = "isarray___isarray_0.0.1.tgz";
-      path = fetchurl {
-        name = "isarray___isarray_0.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz";
-        sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
-      };
-    }
-
-    {
-      name = "isarray___isarray_1.0.0.tgz";
-      path = fetchurl {
-        name = "isarray___isarray_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz";
-        sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
-      };
-    }
-
-    {
-      name = "isexe___isexe_2.0.0.tgz";
-      path = fetchurl {
-        name = "isexe___isexe_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz";
-        sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
-      };
-    }
-
-    {
-      name = "isobject___isobject_2.1.0.tgz";
-      path = fetchurl {
-        name = "isobject___isobject_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz";
-        sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
-      };
-    }
-
-    {
-      name = "isobject___isobject_3.0.1.tgz";
-      path = fetchurl {
-        name = "isobject___isobject_3.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz";
-        sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
-      };
-    }
-
-    {
-      name = "isstream___isstream_0.1.2.tgz";
-      path = fetchurl {
-        name = "isstream___isstream_0.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz";
-        sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
-      };
-    }
-
-    {
-      name = "jquery___jquery_3.3.1.tgz";
-      path = fetchurl {
-        name = "jquery___jquery_3.3.1.tgz";
-        url  = "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz";
-        sha1 = "958ce29e81c9790f31be7792df5d4d95fc57fbca";
-      };
-    }
-
-    {
-      name = "js_base64___js_base64_2.4.8.tgz";
-      path = fetchurl {
-        name = "js_base64___js_base64_2.4.8.tgz";
-        url  = "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz";
-        sha1 = "57a9b130888f956834aa40c5b165ba59c758f033";
-      };
-    }
-
-    {
-      name = "js_tokens___js_tokens_4.0.0.tgz";
-      path = fetchurl {
-        name = "js_tokens___js_tokens_4.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz";
-        sha1 = "19203fb59991df98e3a287050d4647cdeaf32499";
-      };
-    }
-
-    {
-      name = "js_tokens___js_tokens_3.0.2.tgz";
-      path = fetchurl {
-        name = "js_tokens___js_tokens_3.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz";
-        sha1 = "9866df395102130e38f7f996bceb65443209c25b";
-      };
-    }
-
-    {
-      name = "js_yaml___js_yaml_3.7.0.tgz";
-      path = fetchurl {
-        name = "js_yaml___js_yaml_3.7.0.tgz";
-        url  = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz";
-        sha1 = "5c967ddd837a9bfdca5f2de84253abe8a1c03b80";
-      };
-    }
-
-    {
-      name = "jsbn___jsbn_0.1.1.tgz";
-      path = fetchurl {
-        name = "jsbn___jsbn_0.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz";
-        sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
-      };
-    }
-
-    {
-      name = "jsesc___jsesc_1.3.0.tgz";
-      path = fetchurl {
-        name = "jsesc___jsesc_1.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz";
-        sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b";
-      };
-    }
-
-    {
-      name = "jsesc___jsesc_0.5.0.tgz";
-      path = fetchurl {
-        name = "jsesc___jsesc_0.5.0.tgz";
-        url  = "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz";
-        sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
-      };
-    }
-
-    {
-      name = "json_loader___json_loader_0.5.7.tgz";
-      path = fetchurl {
-        name = "json_loader___json_loader_0.5.7.tgz";
-        url  = "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz";
-        sha1 = "dca14a70235ff82f0ac9a3abeb60d337a365185d";
-      };
-    }
-
-    {
-      name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz";
-      path = fetchurl {
-        name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz";
-        url  = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz";
-        sha1 = "349a6d44c53a51de89b40805c5d5e59b417d3340";
-      };
-    }
-
-    {
-      name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
-      path = fetchurl {
-        name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
-        url  = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
-        sha1 = "69f6a87d9513ab8bb8fe63bdb0979c448e684660";
-      };
-    }
-
-    {
-      name = "json_schema___json_schema_0.2.3.tgz";
-      path = fetchurl {
-        name = "json_schema___json_schema_0.2.3.tgz";
-        url  = "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz";
-        sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
-      };
-    }
-
-    {
-      name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
-      path = fetchurl {
-        name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz";
-        sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af";
-      };
-    }
-
-    {
-      name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
-      path = fetchurl {
-        name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
-        sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
-      };
-    }
-
-    {
-      name = "json3___json3_3.3.2.tgz";
-      path = fetchurl {
-        name = "json3___json3_3.3.2.tgz";
-        url  = "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz";
-        sha1 = "3c0434743df93e2f5c42aee7b19bcb483575f4e1";
-      };
-    }
-
-    {
-      name = "json5___json5_0.5.1.tgz";
-      path = fetchurl {
-        name = "json5___json5_0.5.1.tgz";
-        url  = "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz";
-        sha1 = "1eade7acc012034ad84e2396767ead9fa5495821";
-      };
-    }
-
-    {
-      name = "jsonfile___jsonfile_2.4.0.tgz";
-      path = fetchurl {
-        name = "jsonfile___jsonfile_2.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz";
-        sha1 = "3736a2b428b87bbda0cc83b53fa3d633a35c2ae8";
-      };
-    }
-
-    {
-      name = "jsonify___jsonify_0.0.0.tgz";
-      path = fetchurl {
-        name = "jsonify___jsonify_0.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz";
-        sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73";
-      };
-    }
-
-    {
-      name = "jsprim___jsprim_1.4.1.tgz";
-      path = fetchurl {
-        name = "jsprim___jsprim_1.4.1.tgz";
-        url  = "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz";
-        sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
-      };
-    }
-
-    {
-      name = "killable___killable_1.0.0.tgz";
-      path = fetchurl {
-        name = "killable___killable_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz";
-        sha1 = "da8b84bd47de5395878f95d64d02f2449fe05e6b";
-      };
-    }
-
-    {
-      name = "kind_of___kind_of_3.2.2.tgz";
-      path = fetchurl {
-        name = "kind_of___kind_of_3.2.2.tgz";
-        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz";
-        sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
-      };
-    }
-
-    {
-      name = "kind_of___kind_of_4.0.0.tgz";
-      path = fetchurl {
-        name = "kind_of___kind_of_4.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz";
-        sha1 = "20813df3d712928b207378691a45066fae72dd57";
-      };
-    }
-
-    {
-      name = "kind_of___kind_of_5.1.0.tgz";
-      path = fetchurl {
-        name = "kind_of___kind_of_5.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz";
-        sha1 = "729c91e2d857b7a419a1f9aa65685c4c33f5845d";
-      };
-    }
-
-    {
-      name = "kind_of___kind_of_6.0.2.tgz";
-      path = fetchurl {
-        name = "kind_of___kind_of_6.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz";
-        sha1 = "01146b36a6218e64e58f3a8d66de5d7fc6f6d051";
-      };
-    }
-
-    {
-      name = "lazy_cache___lazy_cache_1.0.4.tgz";
-      path = fetchurl {
-        name = "lazy_cache___lazy_cache_1.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz";
-        sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e";
-      };
-    }
-
-    {
-      name = "lcid___lcid_1.0.0.tgz";
-      path = fetchurl {
-        name = "lcid___lcid_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz";
-        sha1 = "308accafa0bc483a3867b4b6f2b9506251d1b835";
-      };
-    }
-
-    {
-      name = "load_json_file___load_json_file_1.1.0.tgz";
-      path = fetchurl {
-        name = "load_json_file___load_json_file_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz";
-        sha1 = "956905708d58b4bab4c2261b04f59f31c99374c0";
-      };
-    }
-
-    {
-      name = "load_json_file___load_json_file_2.0.0.tgz";
-      path = fetchurl {
-        name = "load_json_file___load_json_file_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz";
-        sha1 = "7947e42149af80d696cbf797bcaabcfe1fe29ca8";
-      };
-    }
-
-    {
-      name = "loader_runner___loader_runner_2.3.0.tgz";
-      path = fetchurl {
-        name = "loader_runner___loader_runner_2.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz";
-        sha1 = "f482aea82d543e07921700d5a46ef26fdac6b8a2";
-      };
-    }
-
-    {
-      name = "loader_utils___loader_utils_1.1.0.tgz";
-      path = fetchurl {
-        name = "loader_utils___loader_utils_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz";
-        sha1 = "c98aef488bcceda2ffb5e2de646d6a754429f5cd";
-      };
-    }
-
-    {
-      name = "locate_path___locate_path_2.0.0.tgz";
-      path = fetchurl {
-        name = "locate_path___locate_path_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz";
-        sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
-      };
-    }
-
-    {
-      name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz";
-      path = fetchurl {
-        name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz";
-        sha1 = "8c38a099500f215ad09e59f1722fd0c52bfe0a4e";
-      };
-    }
-
-    {
-      name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz";
-      path = fetchurl {
-        name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz";
-        sha1 = "8da0e6a876cf344c0ad8a54882111dd3c5c7ca36";
-      };
-    }
-
-    {
-      name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz";
-      path = fetchurl {
-        name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz";
-        sha1 = "e531c27644cf8b57a99e17ed95b35c748789392e";
-      };
-    }
-
-    {
-      name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz";
-      path = fetchurl {
-        name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz";
-        sha1 = "838a5bae2fdaca63ac22dee8e19fa4e6d6970b11";
-      };
-    }
-
-    {
-      name = "lodash._getnative___lodash._getnative_3.9.1.tgz";
-      path = fetchurl {
-        name = "lodash._getnative___lodash._getnative_3.9.1.tgz";
-        url  = "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz";
-        sha1 = "570bc7dede46d61cdcde687d65d3eecbaa3aaff5";
-      };
-    }
-
-    {
-      name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz";
-      path = fetchurl {
-        name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz";
-        url  = "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz";
-        sha1 = "5203ad7ba425fae842460e696db9cf3e6aac057c";
-      };
-    }
-
-    {
-      name = "lodash.assign___lodash.assign_3.2.0.tgz";
-      path = fetchurl {
-        name = "lodash.assign___lodash.assign_3.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz";
-        sha1 = "3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa";
-      };
-    }
-
-    {
-      name = "lodash.assign___lodash.assign_4.2.0.tgz";
-      path = fetchurl {
-        name = "lodash.assign___lodash.assign_4.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz";
-        sha1 = "0d99f3ccd7a6d261d19bdaeb9245005d285808e7";
-      };
-    }
-
-    {
-      name = "lodash.camelcase___lodash.camelcase_4.3.0.tgz";
-      path = fetchurl {
-        name = "lodash.camelcase___lodash.camelcase_4.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz";
-        sha1 = "b28aa6288a2b9fc651035c7711f65ab6190331a6";
-      };
-    }
-
-    {
-      name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
-      path = fetchurl {
-        name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz";
-        sha1 = "e23f3f9c4f8fbdde872529c1071857a086e5ccef";
-      };
-    }
-
-    {
-      name = "lodash.debounce___lodash.debounce_4.0.8.tgz";
-      path = fetchurl {
-        name = "lodash.debounce___lodash.debounce_4.0.8.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz";
-        sha1 = "82d79bff30a67c4005ffd5e2515300ad9ca4d7af";
-      };
-    }
-
-    {
-      name = "lodash.defaults___lodash.defaults_3.1.2.tgz";
-      path = fetchurl {
-        name = "lodash.defaults___lodash.defaults_3.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz";
-        sha1 = "c7308b18dbf8bc9372d701a73493c61192bd2e2c";
-      };
-    }
-
-    {
-      name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
-      path = fetchurl {
-        name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz";
-        sha1 = "d09178716ffea4dde9e5fb7b37f6f0802274580c";
-      };
-    }
-
-    {
-      name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz";
-      path = fetchurl {
-        name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz";
-        sha1 = "2f573d85c6a24289ff00663b491c1d338ff3458a";
-      };
-    }
-
-    {
-      name = "lodash.isarray___lodash.isarray_3.0.4.tgz";
-      path = fetchurl {
-        name = "lodash.isarray___lodash.isarray_3.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz";
-        sha1 = "79e4eb88c36a8122af86f844aa9bcd851b5fbb55";
-      };
-    }
-
-    {
-      name = "lodash.keys___lodash.keys_3.1.2.tgz";
-      path = fetchurl {
-        name = "lodash.keys___lodash.keys_3.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz";
-        sha1 = "4dbc0472b156be50a0b286855d1bd0b0c656098a";
-      };
-    }
-
-    {
-      name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
-      path = fetchurl {
-        name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz";
-        sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe";
-      };
-    }
-
-    {
-      name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz";
-      path = fetchurl {
-        name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz";
-        sha1 = "639057e726c3afbdb3e7d42741caa8d6e4335927";
-      };
-    }
-
-    {
-      name = "lodash.restparam___lodash.restparam_3.6.1.tgz";
-      path = fetchurl {
-        name = "lodash.restparam___lodash.restparam_3.6.1.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz";
-        sha1 = "936a4e309ef330a7645ed4145986c85ae5b20805";
-      };
-    }
-
-    {
-      name = "lodash.tail___lodash.tail_4.1.1.tgz";
-      path = fetchurl {
-        name = "lodash.tail___lodash.tail_4.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz";
-        sha1 = "d2333a36d9e7717c8ad2f7cacafec7c32b444664";
-      };
-    }
-
-    {
-      name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
-      path = fetchurl {
-        name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
-        url  = "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
-        sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
-      };
-    }
-
-    {
-      name = "lodash___lodash_4.17.10.tgz";
-      path = fetchurl {
-        name = "lodash___lodash_4.17.10.tgz";
-        url  = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz";
-        sha1 = "1b7793cf7259ea38fb3661d4d38b3260af8ae4e7";
-      };
-    }
-
-    {
-      name = "loglevel___loglevel_1.6.1.tgz";
-      path = fetchurl {
-        name = "loglevel___loglevel_1.6.1.tgz";
-        url  = "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz";
-        sha1 = "e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa";
-      };
-    }
-
-    {
-      name = "longest___longest_1.0.1.tgz";
-      path = fetchurl {
-        name = "longest___longest_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz";
-        sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097";
-      };
-    }
-
-    {
-      name = "loose_envify___loose_envify_1.4.0.tgz";
-      path = fetchurl {
-        name = "loose_envify___loose_envify_1.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz";
-        sha1 = "71ee51fa7be4caec1a63839f7e682d8132d30caf";
-      };
-    }
-
-    {
-      name = "loud_rejection___loud_rejection_1.6.0.tgz";
-      path = fetchurl {
-        name = "loud_rejection___loud_rejection_1.6.0.tgz";
-        url  = "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz";
-        sha1 = "5b46f80147edee578870f086d04821cf998e551f";
-      };
-    }
-
-    {
-      name = "lru_cache___lru_cache_4.1.3.tgz";
-      path = fetchurl {
-        name = "lru_cache___lru_cache_4.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz";
-        sha1 = "a1175cf3496dfc8436c156c334b4955992bce69c";
-      };
-    }
-
-    {
-      name = "make_dir___make_dir_1.3.0.tgz";
-      path = fetchurl {
-        name = "make_dir___make_dir_1.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz";
-        sha1 = "79c1033b80515bd6d24ec9933e860ca75ee27f0c";
-      };
-    }
-
-    {
-      name = "map_cache___map_cache_0.2.2.tgz";
-      path = fetchurl {
-        name = "map_cache___map_cache_0.2.2.tgz";
-        url  = "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz";
-        sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
-      };
-    }
-
-    {
-      name = "map_obj___map_obj_1.0.1.tgz";
-      path = fetchurl {
-        name = "map_obj___map_obj_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz";
-        sha1 = "d933ceb9205d82bdcf4886f6742bdc2b4dea146d";
-      };
-    }
-
-    {
-      name = "map_visit___map_visit_1.0.0.tgz";
-      path = fetchurl {
-        name = "map_visit___map_visit_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz";
-        sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
-      };
-    }
-
-    {
-      name = "math_expression_evaluator___math_expression_evaluator_1.2.17.tgz";
-      path = fetchurl {
-        name = "math_expression_evaluator___math_expression_evaluator_1.2.17.tgz";
-        url  = "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz";
-        sha1 = "de819fdbcd84dccd8fae59c6aeb79615b9d266ac";
-      };
-    }
-
-    {
-      name = "math_random___math_random_1.0.1.tgz";
-      path = fetchurl {
-        name = "math_random___math_random_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz";
-        sha1 = "8b3aac588b8a66e4975e3cdea67f7bb329601fac";
-      };
-    }
-
-    {
-      name = "md5.js___md5.js_1.3.4.tgz";
-      path = fetchurl {
-        name = "md5.js___md5.js_1.3.4.tgz";
-        url  = "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz";
-        sha1 = "e9bdbde94a20a5ac18b04340fc5764d5b09d901d";
-      };
-    }
-
-    {
-      name = "media_typer___media_typer_0.3.0.tgz";
-      path = fetchurl {
-        name = "media_typer___media_typer_0.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz";
-        sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
-      };
-    }
-
-    {
-      name = "mem___mem_1.1.0.tgz";
-      path = fetchurl {
-        name = "mem___mem_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz";
-        sha1 = "5edd52b485ca1d900fe64895505399a0dfa45f76";
-      };
-    }
-
-    {
-      name = "memory_fs___memory_fs_0.4.1.tgz";
-      path = fetchurl {
-        name = "memory_fs___memory_fs_0.4.1.tgz";
-        url  = "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz";
-        sha1 = "3a9a20b8462523e447cfbc7e8bb80ed667bfc552";
-      };
-    }
-
-    {
-      name = "meow___meow_3.7.0.tgz";
-      path = fetchurl {
-        name = "meow___meow_3.7.0.tgz";
-        url  = "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz";
-        sha1 = "72cb668b425228290abbfa856892587308a801fb";
-      };
-    }
-
-    {
-      name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
-      path = fetchurl {
-        name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz";
-        sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61";
-      };
-    }
-
-    {
-      name = "methods___methods_1.1.2.tgz";
-      path = fetchurl {
-        name = "methods___methods_1.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz";
-        sha1 = "5529a4d67654134edcc5266656835b0f851afcee";
-      };
-    }
-
-    {
-      name = "micromatch___micromatch_2.3.11.tgz";
-      path = fetchurl {
-        name = "micromatch___micromatch_2.3.11.tgz";
-        url  = "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz";
-        sha1 = "86677c97d1720b363431d04d0d15293bd38c1565";
-      };
-    }
-
-    {
-      name = "micromatch___micromatch_3.1.10.tgz";
-      path = fetchurl {
-        name = "micromatch___micromatch_3.1.10.tgz";
-        url  = "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz";
-        sha1 = "70859bc95c9840952f359a068a3fc49f9ecfac23";
-      };
-    }
-
-    {
-      name = "miller_rabin___miller_rabin_4.0.1.tgz";
-      path = fetchurl {
-        name = "miller_rabin___miller_rabin_4.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz";
-        sha1 = "f080351c865b0dc562a8462966daa53543c78a4d";
-      };
-    }
-
-    {
-      name = "mime_db___mime_db_1.35.0.tgz";
-      path = fetchurl {
-        name = "mime_db___mime_db_1.35.0.tgz";
-        url  = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz";
-        sha1 = "0569d657466491283709663ad379a99b90d9ab47";
-      };
-    }
-
-    {
-      name = "mime_types___mime_types_2.1.19.tgz";
-      path = fetchurl {
-        name = "mime_types___mime_types_2.1.19.tgz";
-        url  = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz";
-        sha1 = "71e464537a7ef81c15f2db9d97e913fc0ff606f0";
-      };
-    }
-
-    {
-      name = "mime___mime_1.4.1.tgz";
-      path = fetchurl {
-        name = "mime___mime_1.4.1.tgz";
-        url  = "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz";
-        sha1 = "121f9ebc49e3766f311a76e1fa1c8003c4b03aa6";
-      };
-    }
-
-    {
-      name = "mime___mime_1.6.0.tgz";
-      path = fetchurl {
-        name = "mime___mime_1.6.0.tgz";
-        url  = "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz";
-        sha1 = "32cd9e5c64553bd58d19a568af452acff04981b1";
-      };
-    }
-
-    {
-      name = "mimic_fn___mimic_fn_1.2.0.tgz";
-      path = fetchurl {
-        name = "mimic_fn___mimic_fn_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz";
-        sha1 = "820c86a39334640e99516928bd03fca88057d022";
-      };
-    }
-
-    {
-      name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
-      path = fetchurl {
-        name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
-        sha1 = "2e194de044626d4a10e7f7fbc00ce73e83e4d5c7";
-      };
-    }
-
-    {
-      name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
-      path = fetchurl {
-        name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz";
-        sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
-      };
-    }
-
-    {
-      name = "minimatch___minimatch_3.0.4.tgz";
-      path = fetchurl {
-        name = "minimatch___minimatch_3.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz";
-        sha1 = "5166e286457f03306064be5497e8dbb0c3d32083";
-      };
-    }
-
-    {
-      name = "minimist___minimist_0.0.8.tgz";
-      path = fetchurl {
-        name = "minimist___minimist_0.0.8.tgz";
-        url  = "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz";
-        sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
-      };
-    }
-
-    {
-      name = "minimist___minimist_1.2.0.tgz";
-      path = fetchurl {
-        name = "minimist___minimist_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz";
-        sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284";
-      };
-    }
-
-    {
-      name = "minipass___minipass_2.3.3.tgz";
-      path = fetchurl {
-        name = "minipass___minipass_2.3.3.tgz";
-        url  = "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz";
-        sha1 = "a7dcc8b7b833f5d368759cce544dccb55f50f233";
-      };
-    }
-
-    {
-      name = "minizlib___minizlib_1.1.0.tgz";
-      path = fetchurl {
-        name = "minizlib___minizlib_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz";
-        sha1 = "11e13658ce46bc3a70a267aac58359d1e0c29ceb";
-      };
-    }
-
-    {
-      name = "mixin_deep___mixin_deep_1.3.1.tgz";
-      path = fetchurl {
-        name = "mixin_deep___mixin_deep_1.3.1.tgz";
-        url  = "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz";
-        sha1 = "a49e7268dce1a0d9698e45326c5626df3543d0fe";
-      };
-    }
-
-    {
-      name = "mixin_object___mixin_object_2.0.1.tgz";
-      path = fetchurl {
-        name = "mixin_object___mixin_object_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz";
-        sha1 = "4fb949441dab182540f1fe035ba60e1947a5e57e";
-      };
-    }
-
-    {
-      name = "mkdirp___mkdirp_0.5.1.tgz";
-      path = fetchurl {
-        name = "mkdirp___mkdirp_0.5.1.tgz";
-        url  = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz";
-        sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
-      };
-    }
-
-    {
-      name = "ms___ms_2.0.0.tgz";
-      path = fetchurl {
-        name = "ms___ms_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz";
-        sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
-      };
-    }
-
-    {
-      name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz";
-      path = fetchurl {
-        name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz";
-        sha1 = "899f11d9686e5e05cb91b35d5f0e63b773cfc901";
-      };
-    }
-
-    {
-      name = "multicast_dns___multicast_dns_6.2.3.tgz";
-      path = fetchurl {
-        name = "multicast_dns___multicast_dns_6.2.3.tgz";
-        url  = "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz";
-        sha1 = "a0ec7bd9055c4282f790c3c82f4e28db3b31b229";
-      };
-    }
-
-    {
-      name = "nan___nan_2.10.0.tgz";
-      path = fetchurl {
-        name = "nan___nan_2.10.0.tgz";
-        url  = "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz";
-        sha1 = "96d0cd610ebd58d4b4de9cc0c6828cda99c7548f";
-      };
-    }
-
-    {
-      name = "nanomatch___nanomatch_1.2.13.tgz";
-      path = fetchurl {
-        name = "nanomatch___nanomatch_1.2.13.tgz";
-        url  = "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz";
-        sha1 = "b87a8aa4fc0de8fe6be88895b38983ff265bd119";
-      };
-    }
-
-    {
-      name = "needle___needle_2.2.1.tgz";
-      path = fetchurl {
-        name = "needle___needle_2.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz";
-        sha1 = "b5e325bd3aae8c2678902fa296f729455d1d3a7d";
-      };
-    }
-
-    {
-      name = "negotiator___negotiator_0.6.1.tgz";
-      path = fetchurl {
-        name = "negotiator___negotiator_0.6.1.tgz";
-        url  = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz";
-        sha1 = "2b327184e8992101177b28563fb5e7102acd0ca9";
-      };
-    }
-
-    {
-      name = "neo_async___neo_async_2.5.1.tgz";
-      path = fetchurl {
-        name = "neo_async___neo_async_2.5.1.tgz";
-        url  = "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz";
-        sha1 = "acb909e327b1e87ec9ef15f41b8a269512ad41ee";
-      };
-    }
-
-    {
-      name = "next_tick___next_tick_1.0.0.tgz";
-      path = fetchurl {
-        name = "next_tick___next_tick_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz";
-        sha1 = "ca86d1fe8828169b0120208e3dc8424b9db8342c";
-      };
-    }
-
-    {
-      name = "node_forge___node_forge_0.7.5.tgz";
-      path = fetchurl {
-        name = "node_forge___node_forge_0.7.5.tgz";
-        url  = "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz";
-        sha1 = "6c152c345ce11c52f465c2abd957e8639cd674df";
-      };
-    }
-
-    {
-      name = "node_gyp___node_gyp_3.7.0.tgz";
-      path = fetchurl {
-        name = "node_gyp___node_gyp_3.7.0.tgz";
-        url  = "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz";
-        sha1 = "789478e8f6c45e277aa014f3e28f958f286f9203";
-      };
-    }
-
-    {
-      name = "node_libs_browser___node_libs_browser_2.1.0.tgz";
-      path = fetchurl {
-        name = "node_libs_browser___node_libs_browser_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz";
-        sha1 = "5f94263d404f6e44767d726901fff05478d600df";
-      };
-    }
-
-    {
-      name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
-      path = fetchurl {
-        name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
-        url  = "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz";
-        sha1 = "3070040716afdc778747b61b6887bf78880b80fc";
-      };
-    }
-
-    {
-      name = "node_sass___node_sass_4.9.2.tgz";
-      path = fetchurl {
-        name = "node_sass___node_sass_4.9.2.tgz";
-        url  = "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.2.tgz";
-        sha1 = "5e63fe6bd0f2ae3ac9d6c14ede8620e2b8bdb437";
-      };
-    }
-
-    {
-      name = "nopt___nopt_3.0.6.tgz";
-      path = fetchurl {
-        name = "nopt___nopt_3.0.6.tgz";
-        url  = "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz";
-        sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
-      };
-    }
-
-    {
-      name = "nopt___nopt_4.0.1.tgz";
-      path = fetchurl {
-        name = "nopt___nopt_4.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz";
-        sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d";
-      };
-    }
-
-    {
-      name = "normalize_package_data___normalize_package_data_2.4.0.tgz";
-      path = fetchurl {
-        name = "normalize_package_data___normalize_package_data_2.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
-        sha1 = "12f95a307d58352075a04907b84ac8be98ac012f";
-      };
-    }
-
-    {
-      name = "normalize_path___normalize_path_2.1.1.tgz";
-      path = fetchurl {
-        name = "normalize_path___normalize_path_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz";
-        sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
-      };
-    }
-
-    {
-      name = "normalize_range___normalize_range_0.1.2.tgz";
-      path = fetchurl {
-        name = "normalize_range___normalize_range_0.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz";
-        sha1 = "2d10c06bdfd312ea9777695a4d28439456b75942";
-      };
-    }
-
-    {
-      name = "normalize_url___normalize_url_1.9.1.tgz";
-      path = fetchurl {
-        name = "normalize_url___normalize_url_1.9.1.tgz";
-        url  = "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz";
-        sha1 = "2cc0d66b31ea23036458436e3620d85954c66c3c";
-      };
-    }
-
-    {
-      name = "npm_bundled___npm_bundled_1.0.3.tgz";
-      path = fetchurl {
-        name = "npm_bundled___npm_bundled_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz";
-        sha1 = "7e71703d973af3370a9591bafe3a63aca0be2308";
-      };
-    }
-
-    {
-      name = "npm_packlist___npm_packlist_1.1.11.tgz";
-      path = fetchurl {
-        name = "npm_packlist___npm_packlist_1.1.11.tgz";
-        url  = "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz";
-        sha1 = "84e8c683cbe7867d34b1d357d893ce29e28a02de";
-      };
-    }
-
-    {
-      name = "npm_run_path___npm_run_path_2.0.2.tgz";
-      path = fetchurl {
-        name = "npm_run_path___npm_run_path_2.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz";
-        sha1 = "35a9232dfa35d7067b4cb2ddf2357b1871536c5f";
-      };
-    }
-
-    {
-      name = "npmlog___npmlog_4.1.2.tgz";
-      path = fetchurl {
-        name = "npmlog___npmlog_4.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz";
-        sha1 = "08a7f2a8bf734604779a9efa4ad5cc717abb954b";
-      };
-    }
-
-    {
-      name = "nth_check___nth_check_1.0.1.tgz";
-      path = fetchurl {
-        name = "nth_check___nth_check_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz";
-        sha1 = "9929acdf628fc2c41098deab82ac580cf149aae4";
-      };
-    }
-
-    {
-      name = "num2fraction___num2fraction_1.2.2.tgz";
-      path = fetchurl {
-        name = "num2fraction___num2fraction_1.2.2.tgz";
-        url  = "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz";
-        sha1 = "6f682b6a027a4e9ddfa4564cd2589d1d4e669ede";
-      };
-    }
-
-    {
-      name = "number_is_nan___number_is_nan_1.0.1.tgz";
-      path = fetchurl {
-        name = "number_is_nan___number_is_nan_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz";
-        sha1 = "097b602b53422a522c1afb8790318336941a011d";
-      };
-    }
-
-    {
-      name = "oauth_sign___oauth_sign_0.8.2.tgz";
-      path = fetchurl {
-        name = "oauth_sign___oauth_sign_0.8.2.tgz";
-        url  = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz";
-        sha1 = "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43";
-      };
-    }
-
-    {
-      name = "object_assign___object_assign_4.1.1.tgz";
-      path = fetchurl {
-        name = "object_assign___object_assign_4.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz";
-        sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
-      };
-    }
-
-    {
-      name = "object_copy___object_copy_0.1.0.tgz";
-      path = fetchurl {
-        name = "object_copy___object_copy_0.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz";
-        sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
-      };
-    }
-
-    {
-      name = "object_keys___object_keys_1.0.12.tgz";
-      path = fetchurl {
-        name = "object_keys___object_keys_1.0.12.tgz";
-        url  = "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz";
-        sha1 = "09c53855377575310cca62f55bb334abff7b3ed2";
-      };
-    }
-
-    {
-      name = "object_path___object_path_0.9.2.tgz";
-      path = fetchurl {
-        name = "object_path___object_path_0.9.2.tgz";
-        url  = "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz";
-        sha1 = "0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5";
-      };
-    }
-
-    {
-      name = "object_visit___object_visit_1.0.1.tgz";
-      path = fetchurl {
-        name = "object_visit___object_visit_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz";
-        sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
-      };
-    }
-
-    {
-      name = "object.omit___object.omit_2.0.1.tgz";
-      path = fetchurl {
-        name = "object.omit___object.omit_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz";
-        sha1 = "1a9c744829f39dbb858c76ca3579ae2a54ebd1fa";
-      };
-    }
-
-    {
-      name = "object.pick___object.pick_1.3.0.tgz";
-      path = fetchurl {
-        name = "object.pick___object.pick_1.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz";
-        sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
-      };
-    }
-
-    {
-      name = "obuf___obuf_1.1.2.tgz";
-      path = fetchurl {
-        name = "obuf___obuf_1.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz";
-        sha1 = "09bea3343d41859ebd446292d11c9d4db619084e";
-      };
-    }
-
-    {
-      name = "on_finished___on_finished_2.3.0.tgz";
-      path = fetchurl {
-        name = "on_finished___on_finished_2.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz";
-        sha1 = "20f1336481b083cd75337992a16971aa2d906947";
-      };
-    }
-
-    {
-      name = "on_headers___on_headers_1.0.1.tgz";
-      path = fetchurl {
-        name = "on_headers___on_headers_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz";
-        sha1 = "928f5d0f470d49342651ea6794b0857c100693f7";
-      };
-    }
-
-    {
-      name = "once___once_1.4.0.tgz";
-      path = fetchurl {
-        name = "once___once_1.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz";
-        sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
-      };
-    }
-
-    {
-      name = "open_iconic___open_iconic_1.1.1.tgz";
-      path = fetchurl {
-        name = "open_iconic___open_iconic_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/open-iconic/-/open-iconic-1.1.1.tgz";
-        sha1 = "9dcfc8c7cd3c61cdb4a236b1a347894c97adc0c6";
-      };
-    }
-
-    {
-      name = "opn___opn_5.3.0.tgz";
-      path = fetchurl {
-        name = "opn___opn_5.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz";
-        sha1 = "64871565c863875f052cfdf53d3e3cb5adb53b1c";
-      };
-    }
-
-    {
-      name = "original___original_1.0.1.tgz";
-      path = fetchurl {
-        name = "original___original_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/original/-/original-1.0.1.tgz";
-        sha1 = "b0a53ff42ba997a8c9cd1fb5daaeb42b9d693190";
-      };
-    }
-
-    {
-      name = "os_browserify___os_browserify_0.3.0.tgz";
-      path = fetchurl {
-        name = "os_browserify___os_browserify_0.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz";
-        sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
-      };
-    }
-
-    {
-      name = "os_homedir___os_homedir_1.0.2.tgz";
-      path = fetchurl {
-        name = "os_homedir___os_homedir_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz";
-        sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
-      };
-    }
-
-    {
-      name = "os_locale___os_locale_1.4.0.tgz";
-      path = fetchurl {
-        name = "os_locale___os_locale_1.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz";
-        sha1 = "20f9f17ae29ed345e8bde583b13d2009803c14d9";
-      };
-    }
-
-    {
-      name = "os_locale___os_locale_2.1.0.tgz";
-      path = fetchurl {
-        name = "os_locale___os_locale_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz";
-        sha1 = "42bc2900a6b5b8bd17376c8e882b65afccf24bf2";
-      };
-    }
-
-    {
-      name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
-      path = fetchurl {
-        name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
-        sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
-      };
-    }
-
-    {
-      name = "osenv___osenv_0.1.5.tgz";
-      path = fetchurl {
-        name = "osenv___osenv_0.1.5.tgz";
-        url  = "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz";
-        sha1 = "85cdfafaeb28e8677f416e287592b5f3f49ea410";
-      };
-    }
-
-    {
-      name = "p_finally___p_finally_1.0.0.tgz";
-      path = fetchurl {
-        name = "p_finally___p_finally_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz";
-        sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae";
-      };
-    }
-
-    {
-      name = "p_limit___p_limit_1.3.0.tgz";
-      path = fetchurl {
-        name = "p_limit___p_limit_1.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz";
-        sha1 = "b86bd5f0c25690911c7590fcbfc2010d54b3ccb8";
-      };
-    }
-
-    {
-      name = "p_locate___p_locate_2.0.0.tgz";
-      path = fetchurl {
-        name = "p_locate___p_locate_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz";
-        sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
-      };
-    }
-
-    {
-      name = "p_map___p_map_1.2.0.tgz";
-      path = fetchurl {
-        name = "p_map___p_map_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz";
-        sha1 = "e4e94f311eabbc8633a1e79908165fca26241b6b";
-      };
-    }
-
-    {
-      name = "p_try___p_try_1.0.0.tgz";
-      path = fetchurl {
-        name = "p_try___p_try_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz";
-        sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
-      };
-    }
-
-    {
-      name = "pako___pako_1.0.6.tgz";
-      path = fetchurl {
-        name = "pako___pako_1.0.6.tgz";
-        url  = "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz";
-        sha1 = "0101211baa70c4bca4a0f63f2206e97b7dfaf258";
-      };
-    }
-
-    {
-      name = "parse_asn1___parse_asn1_5.1.1.tgz";
-      path = fetchurl {
-        name = "parse_asn1___parse_asn1_5.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz";
-        sha1 = "f6bf293818332bd0dab54efb16087724745e6ca8";
-      };
-    }
-
-    {
-      name = "parse_glob___parse_glob_3.0.4.tgz";
-      path = fetchurl {
-        name = "parse_glob___parse_glob_3.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz";
-        sha1 = "b2c376cfb11f35513badd173ef0bb6e3a388391c";
-      };
-    }
-
-    {
-      name = "parse_json___parse_json_2.2.0.tgz";
-      path = fetchurl {
-        name = "parse_json___parse_json_2.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz";
-        sha1 = "f480f40434ef80741f8469099f8dea18f55a4dc9";
-      };
-    }
-
-    {
-      name = "parseurl___parseurl_1.3.2.tgz";
-      path = fetchurl {
-        name = "parseurl___parseurl_1.3.2.tgz";
-        url  = "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz";
-        sha1 = "fc289d4ed8993119460c156253262cdc8de65bf3";
-      };
-    }
-
-    {
-      name = "pascalcase___pascalcase_0.1.1.tgz";
-      path = fetchurl {
-        name = "pascalcase___pascalcase_0.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz";
-        sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
-      };
-    }
-
-    {
-      name = "path_browserify___path_browserify_0.0.0.tgz";
-      path = fetchurl {
-        name = "path_browserify___path_browserify_0.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz";
-        sha1 = "a0b870729aae214005b7d5032ec2cbbb0fb4451a";
-      };
-    }
-
-    {
-      name = "path_dirname___path_dirname_1.0.2.tgz";
-      path = fetchurl {
-        name = "path_dirname___path_dirname_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz";
-        sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
-      };
-    }
-
-    {
-      name = "path_exists___path_exists_2.1.0.tgz";
-      path = fetchurl {
-        name = "path_exists___path_exists_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz";
-        sha1 = "0feb6c64f0fc518d9a754dd5efb62c7022761f4b";
-      };
-    }
-
-    {
-      name = "path_exists___path_exists_3.0.0.tgz";
-      path = fetchurl {
-        name = "path_exists___path_exists_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz";
-        sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
-      };
-    }
-
-    {
-      name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
-      path = fetchurl {
-        name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
-        sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
-      };
-    }
-
-    {
-      name = "path_is_inside___path_is_inside_1.0.2.tgz";
-      path = fetchurl {
-        name = "path_is_inside___path_is_inside_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz";
-        sha1 = "365417dede44430d1c11af61027facf074bdfc53";
-      };
-    }
-
-    {
-      name = "path_key___path_key_2.0.1.tgz";
-      path = fetchurl {
-        name = "path_key___path_key_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz";
-        sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
-      };
-    }
-
-    {
-      name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
-      path = fetchurl {
-        name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
-        url  = "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz";
-        sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c";
-      };
-    }
-
-    {
-      name = "path_type___path_type_1.1.0.tgz";
-      path = fetchurl {
-        name = "path_type___path_type_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz";
-        sha1 = "59c44f7ee491da704da415da5a4070ba4f8fe441";
-      };
-    }
-
-    {
-      name = "path_type___path_type_2.0.0.tgz";
-      path = fetchurl {
-        name = "path_type___path_type_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz";
-        sha1 = "f012ccb8415b7096fc2daa1054c3d72389594c73";
-      };
-    }
-
-    {
-      name = "pbkdf2___pbkdf2_3.0.16.tgz";
-      path = fetchurl {
-        name = "pbkdf2___pbkdf2_3.0.16.tgz";
-        url  = "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz";
-        sha1 = "7404208ec6b01b62d85bf83853a8064f8d9c2a5c";
-      };
-    }
-
-    {
-      name = "performance_now___performance_now_0.2.0.tgz";
-      path = fetchurl {
-        name = "performance_now___performance_now_0.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz";
-        sha1 = "33ef30c5c77d4ea21c5a53869d91b56d8f2555e5";
-      };
-    }
-
-    {
-      name = "performance_now___performance_now_2.1.0.tgz";
-      path = fetchurl {
-        name = "performance_now___performance_now_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz";
-        sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
-      };
-    }
-
-    {
-      name = "pify___pify_2.3.0.tgz";
-      path = fetchurl {
-        name = "pify___pify_2.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz";
-        sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c";
-      };
-    }
-
-    {
-      name = "pify___pify_3.0.0.tgz";
-      path = fetchurl {
-        name = "pify___pify_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz";
-        sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176";
-      };
-    }
-
-    {
-      name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
-      path = fetchurl {
-        name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
-        sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
-      };
-    }
-
-    {
-      name = "pinkie___pinkie_2.0.4.tgz";
-      path = fetchurl {
-        name = "pinkie___pinkie_2.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz";
-        sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
-      };
-    }
-
-    {
-      name = "pkg_dir___pkg_dir_2.0.0.tgz";
-      path = fetchurl {
-        name = "pkg_dir___pkg_dir_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz";
-        sha1 = "f6d5d1109e19d63edf428e0bd57e12777615334b";
-      };
-    }
-
-    {
-      name = "pkg_up___pkg_up_1.0.0.tgz";
-      path = fetchurl {
-        name = "pkg_up___pkg_up_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz";
-        sha1 = "3e08fb461525c4421624a33b9f7e6d0af5b05a26";
-      };
-    }
-
-    {
-      name = "popper.js___popper.js_1.14.4.tgz";
-      path = fetchurl {
-        name = "popper.js___popper.js_1.14.4.tgz";
-        url  = "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.4.tgz";
-        sha1 = "8eec1d8ff02a5a3a152dd43414a15c7b79fd69b6";
-      };
-    }
-
-    {
-      name = "portfinder___portfinder_1.0.13.tgz";
-      path = fetchurl {
-        name = "portfinder___portfinder_1.0.13.tgz";
-        url  = "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz";
-        sha1 = "bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9";
-      };
-    }
-
-    {
-      name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
-      path = fetchurl {
-        name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
-        sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
-      };
-    }
-
-    {
-      name = "postcss_calc___postcss_calc_5.3.1.tgz";
-      path = fetchurl {
-        name = "postcss_calc___postcss_calc_5.3.1.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz";
-        sha1 = "77bae7ca928ad85716e2fda42f261bf7c1d65b5e";
-      };
-    }
-
-    {
-      name = "postcss_colormin___postcss_colormin_2.2.2.tgz";
-      path = fetchurl {
-        name = "postcss_colormin___postcss_colormin_2.2.2.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz";
-        sha1 = "6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b";
-      };
-    }
-
-    {
-      name = "postcss_convert_values___postcss_convert_values_2.6.1.tgz";
-      path = fetchurl {
-        name = "postcss_convert_values___postcss_convert_values_2.6.1.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz";
-        sha1 = "bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d";
-      };
-    }
-
-    {
-      name = "postcss_discard_comments___postcss_discard_comments_2.0.4.tgz";
-      path = fetchurl {
-        name = "postcss_discard_comments___postcss_discard_comments_2.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz";
-        sha1 = "befe89fafd5b3dace5ccce51b76b81514be00e3d";
-      };
-    }
-
-    {
-      name = "postcss_discard_duplicates___postcss_discard_duplicates_2.1.0.tgz";
-      path = fetchurl {
-        name = "postcss_discard_duplicates___postcss_discard_duplicates_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz";
-        sha1 = "b9abf27b88ac188158a5eb12abcae20263b91932";
-      };
-    }
-
-    {
-      name = "postcss_discard_empty___postcss_discard_empty_2.1.0.tgz";
-      path = fetchurl {
-        name = "postcss_discard_empty___postcss_discard_empty_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz";
-        sha1 = "d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5";
-      };
-    }
-
-    {
-      name = "postcss_discard_overridden___postcss_discard_overridden_0.1.1.tgz";
-      path = fetchurl {
-        name = "postcss_discard_overridden___postcss_discard_overridden_0.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz";
-        sha1 = "8b1eaf554f686fb288cd874c55667b0aa3668d58";
-      };
-    }
-
-    {
-      name = "postcss_discard_unused___postcss_discard_unused_2.2.3.tgz";
-      path = fetchurl {
-        name = "postcss_discard_unused___postcss_discard_unused_2.2.3.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz";
-        sha1 = "bce30b2cc591ffc634322b5fb3464b6d934f4433";
-      };
-    }
-
-    {
-      name = "postcss_filter_plugins___postcss_filter_plugins_2.0.3.tgz";
-      path = fetchurl {
-        name = "postcss_filter_plugins___postcss_filter_plugins_2.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz";
-        sha1 = "82245fdf82337041645e477114d8e593aa18b8ec";
-      };
-    }
-
-    {
-      name = "postcss_merge_idents___postcss_merge_idents_2.1.7.tgz";
-      path = fetchurl {
-        name = "postcss_merge_idents___postcss_merge_idents_2.1.7.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz";
-        sha1 = "4c5530313c08e1d5b3bbf3d2bbc747e278eea270";
-      };
-    }
-
-    {
-      name = "postcss_merge_longhand___postcss_merge_longhand_2.0.2.tgz";
-      path = fetchurl {
-        name = "postcss_merge_longhand___postcss_merge_longhand_2.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz";
-        sha1 = "23d90cd127b0a77994915332739034a1a4f3d658";
-      };
-    }
-
-    {
-      name = "postcss_merge_rules___postcss_merge_rules_2.1.2.tgz";
-      path = fetchurl {
-        name = "postcss_merge_rules___postcss_merge_rules_2.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz";
-        sha1 = "d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721";
-      };
-    }
-
-    {
-      name = "postcss_message_helpers___postcss_message_helpers_2.0.0.tgz";
-      path = fetchurl {
-        name = "postcss_message_helpers___postcss_message_helpers_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz";
-        sha1 = "a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e";
-      };
-    }
-
-    {
-      name = "postcss_minify_font_values___postcss_minify_font_values_1.0.5.tgz";
-      path = fetchurl {
-        name = "postcss_minify_font_values___postcss_minify_font_values_1.0.5.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz";
-        sha1 = "4b58edb56641eba7c8474ab3526cafd7bbdecb69";
-      };
-    }
-
-    {
-      name = "postcss_minify_gradients___postcss_minify_gradients_1.0.5.tgz";
-      path = fetchurl {
-        name = "postcss_minify_gradients___postcss_minify_gradients_1.0.5.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz";
-        sha1 = "5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1";
-      };
-    }
-
-    {
-      name = "postcss_minify_params___postcss_minify_params_1.2.2.tgz";
-      path = fetchurl {
-        name = "postcss_minify_params___postcss_minify_params_1.2.2.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz";
-        sha1 = "ad2ce071373b943b3d930a3fa59a358c28d6f1f3";
-      };
-    }
-
-    {
-      name = "postcss_minify_selectors___postcss_minify_selectors_2.1.1.tgz";
-      path = fetchurl {
-        name = "postcss_minify_selectors___postcss_minify_selectors_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz";
-        sha1 = "b2c6a98c0072cf91b932d1a496508114311735bf";
-      };
-    }
-
-    {
-      name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.1.0.tgz";
-      path = fetchurl {
-        name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz";
-        sha1 = "b614c9720be6816eaee35fb3a5faa1dba6a05ddb";
-      };
-    }
-
-    {
-      name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz";
-      path = fetchurl {
-        name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz";
-        sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069";
-      };
-    }
-
-    {
-      name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz";
-      path = fetchurl {
-        name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz";
-        sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90";
-      };
-    }
-
-    {
-      name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz";
-      path = fetchurl {
-        name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz";
-        sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20";
-      };
-    }
-
-    {
-      name = "postcss_normalize_charset___postcss_normalize_charset_1.1.1.tgz";
-      path = fetchurl {
-        name = "postcss_normalize_charset___postcss_normalize_charset_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz";
-        sha1 = "ef9ee71212d7fe759c78ed162f61ed62b5cb93f1";
-      };
-    }
-
-    {
-      name = "postcss_normalize_url___postcss_normalize_url_3.0.8.tgz";
-      path = fetchurl {
-        name = "postcss_normalize_url___postcss_normalize_url_3.0.8.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz";
-        sha1 = "108f74b3f2fcdaf891a2ffa3ea4592279fc78222";
-      };
-    }
-
-    {
-      name = "postcss_ordered_values___postcss_ordered_values_2.2.3.tgz";
-      path = fetchurl {
-        name = "postcss_ordered_values___postcss_ordered_values_2.2.3.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz";
-        sha1 = "eec6c2a67b6c412a8db2042e77fe8da43f95c11d";
-      };
-    }
-
-    {
-      name = "postcss_reduce_idents___postcss_reduce_idents_2.4.0.tgz";
-      path = fetchurl {
-        name = "postcss_reduce_idents___postcss_reduce_idents_2.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz";
-        sha1 = "c2c6d20cc958284f6abfbe63f7609bf409059ad3";
-      };
-    }
-
-    {
-      name = "postcss_reduce_initial___postcss_reduce_initial_1.0.1.tgz";
-      path = fetchurl {
-        name = "postcss_reduce_initial___postcss_reduce_initial_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz";
-        sha1 = "68f80695f045d08263a879ad240df8dd64f644ea";
-      };
-    }
-
-    {
-      name = "postcss_reduce_transforms___postcss_reduce_transforms_1.0.4.tgz";
-      path = fetchurl {
-        name = "postcss_reduce_transforms___postcss_reduce_transforms_1.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz";
-        sha1 = "ff76f4d8212437b31c298a42d2e1444025771ae1";
-      };
-    }
-
-    {
-      name = "postcss_selector_parser___postcss_selector_parser_2.2.3.tgz";
-      path = fetchurl {
-        name = "postcss_selector_parser___postcss_selector_parser_2.2.3.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz";
-        sha1 = "f9437788606c3c9acee16ffe8d8b16297f27bb90";
-      };
-    }
-
-    {
-      name = "postcss_svgo___postcss_svgo_2.1.6.tgz";
-      path = fetchurl {
-        name = "postcss_svgo___postcss_svgo_2.1.6.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz";
-        sha1 = "b6df18aa613b666e133f08adb5219c2684ac108d";
-      };
-    }
-
-    {
-      name = "postcss_unique_selectors___postcss_unique_selectors_2.0.2.tgz";
-      path = fetchurl {
-        name = "postcss_unique_selectors___postcss_unique_selectors_2.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz";
-        sha1 = "981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d";
-      };
-    }
-
-    {
-      name = "postcss_value_parser___postcss_value_parser_3.3.0.tgz";
-      path = fetchurl {
-        name = "postcss_value_parser___postcss_value_parser_3.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz";
-        sha1 = "87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15";
-      };
-    }
-
-    {
-      name = "postcss_zindex___postcss_zindex_2.2.0.tgz";
-      path = fetchurl {
-        name = "postcss_zindex___postcss_zindex_2.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz";
-        sha1 = "d2109ddc055b91af67fc4cb3b025946639d2af22";
-      };
-    }
-
-    {
-      name = "postcss___postcss_5.2.18.tgz";
-      path = fetchurl {
-        name = "postcss___postcss_5.2.18.tgz";
-        url  = "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz";
-        sha1 = "badfa1497d46244f6390f58b319830d9107853c5";
-      };
-    }
-
-    {
-      name = "postcss___postcss_6.0.23.tgz";
-      path = fetchurl {
-        name = "postcss___postcss_6.0.23.tgz";
-        url  = "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz";
-        sha1 = "61c82cc328ac60e677645f979054eb98bc0e3324";
-      };
-    }
-
-    {
-      name = "prepend_http___prepend_http_1.0.4.tgz";
-      path = fetchurl {
-        name = "prepend_http___prepend_http_1.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz";
-        sha1 = "d4f4562b0ce3696e41ac52d0e002e57a635dc6dc";
-      };
-    }
-
-    {
-      name = "preserve___preserve_0.2.0.tgz";
-      path = fetchurl {
-        name = "preserve___preserve_0.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz";
-        sha1 = "815ed1f6ebc65926f865b310c0713bcb3315ce4b";
-      };
-    }
-
-    {
-      name = "pretty_error___pretty_error_2.1.1.tgz";
-      path = fetchurl {
-        name = "pretty_error___pretty_error_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz";
-        sha1 = "5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3";
-      };
-    }
-
-    {
-      name = "private___private_0.1.8.tgz";
-      path = fetchurl {
-        name = "private___private_0.1.8.tgz";
-        url  = "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz";
-        sha1 = "2381edb3689f7a53d653190060fcf822d2f368ff";
-      };
-    }
-
-    {
-      name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
-      path = fetchurl {
-        name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz";
-        sha1 = "a37d732f4271b4ab1ad070d35508e8290788ffaa";
-      };
-    }
-
-    {
-      name = "process___process_0.11.10.tgz";
-      path = fetchurl {
-        name = "process___process_0.11.10.tgz";
-        url  = "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz";
-        sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182";
-      };
-    }
-
-    {
-      name = "proxy_addr___proxy_addr_2.0.4.tgz";
-      path = fetchurl {
-        name = "proxy_addr___proxy_addr_2.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz";
-        sha1 = "ecfc733bf22ff8c6f407fa275327b9ab67e48b93";
-      };
-    }
-
-    {
-      name = "prr___prr_1.0.1.tgz";
-      path = fetchurl {
-        name = "prr___prr_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz";
-        sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
-      };
-    }
-
-    {
-      name = "pseudomap___pseudomap_1.0.2.tgz";
-      path = fetchurl {
-        name = "pseudomap___pseudomap_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz";
-        sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
-      };
-    }
-
-    {
-      name = "public_encrypt___public_encrypt_4.0.2.tgz";
-      path = fetchurl {
-        name = "public_encrypt___public_encrypt_4.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz";
-        sha1 = "46eb9107206bf73489f8b85b69d91334c6610994";
-      };
-    }
-
-    {
-      name = "punycode___punycode_1.3.2.tgz";
-      path = fetchurl {
-        name = "punycode___punycode_1.3.2.tgz";
-        url  = "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz";
-        sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
-      };
-    }
-
-    {
-      name = "punycode___punycode_1.4.1.tgz";
-      path = fetchurl {
-        name = "punycode___punycode_1.4.1.tgz";
-        url  = "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz";
-        sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
-      };
-    }
-
-    {
-      name = "punycode___punycode_2.1.1.tgz";
-      path = fetchurl {
-        name = "punycode___punycode_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz";
-        sha1 = "b58b010ac40c22c5657616c8d2c2c02c7bf479ec";
-      };
-    }
-
-    {
-      name = "q___q_1.5.1.tgz";
-      path = fetchurl {
-        name = "q___q_1.5.1.tgz";
-        url  = "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz";
-        sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7";
-      };
-    }
-
-    {
-      name = "qs___qs_6.5.1.tgz";
-      path = fetchurl {
-        name = "qs___qs_6.5.1.tgz";
-        url  = "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz";
-        sha1 = "349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8";
-      };
-    }
-
-    {
-      name = "qs___qs_6.4.0.tgz";
-      path = fetchurl {
-        name = "qs___qs_6.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz";
-        sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233";
-      };
-    }
-
-    {
-      name = "qs___qs_6.5.2.tgz";
-      path = fetchurl {
-        name = "qs___qs_6.5.2.tgz";
-        url  = "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz";
-        sha1 = "cb3ae806e8740444584ef154ce8ee98d403f3e36";
-      };
-    }
-
-    {
-      name = "query_string___query_string_4.3.4.tgz";
-      path = fetchurl {
-        name = "query_string___query_string_4.3.4.tgz";
-        url  = "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz";
-        sha1 = "bbb693b9ca915c232515b228b1a02b609043dbeb";
-      };
-    }
-
-    {
-      name = "querystring_es3___querystring_es3_0.2.1.tgz";
-      path = fetchurl {
-        name = "querystring_es3___querystring_es3_0.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz";
-        sha1 = "9ec61f79049875707d69414596fd907a4d711e73";
-      };
-    }
-
-    {
-      name = "querystring___querystring_0.2.0.tgz";
-      path = fetchurl {
-        name = "querystring___querystring_0.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz";
-        sha1 = "b209849203bb25df820da756e747005878521620";
-      };
-    }
-
-    {
-      name = "querystringify___querystringify_2.0.0.tgz";
-      path = fetchurl {
-        name = "querystringify___querystringify_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz";
-        sha1 = "fa3ed6e68eb15159457c89b37bc6472833195755";
-      };
-    }
-
-    {
-      name = "randomatic___randomatic_3.0.0.tgz";
-      path = fetchurl {
-        name = "randomatic___randomatic_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz";
-        sha1 = "d35490030eb4f7578de292ce6dfb04a91a128923";
-      };
-    }
-
-    {
-      name = "randombytes___randombytes_2.0.6.tgz";
-      path = fetchurl {
-        name = "randombytes___randombytes_2.0.6.tgz";
-        url  = "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz";
-        sha1 = "d302c522948588848a8d300c932b44c24231da80";
-      };
-    }
-
-    {
-      name = "randomfill___randomfill_1.0.4.tgz";
-      path = fetchurl {
-        name = "randomfill___randomfill_1.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz";
-        sha1 = "c92196fc86ab42be983f1bf31778224931d61458";
-      };
-    }
-
-    {
-      name = "range_parser___range_parser_1.2.0.tgz";
-      path = fetchurl {
-        name = "range_parser___range_parser_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz";
-        sha1 = "f49be6b487894ddc40dcc94a322f611092e00d5e";
-      };
-    }
-
-    {
-      name = "raw_body___raw_body_2.3.2.tgz";
-      path = fetchurl {
-        name = "raw_body___raw_body_2.3.2.tgz";
-        url  = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz";
-        sha1 = "bcd60c77d3eb93cde0050295c3f379389bc88f89";
-      };
-    }
-
-    {
-      name = "rc___rc_1.2.8.tgz";
-      path = fetchurl {
-        name = "rc___rc_1.2.8.tgz";
-        url  = "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz";
-        sha1 = "cd924bf5200a075b83c188cd6b9e211b7fc0d3ed";
-      };
-    }
-
-    {
-      name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
-      path = fetchurl {
-        name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz";
-        sha1 = "9d63c13276c065918d57f002a57f40a1b643fb02";
-      };
-    }
-
-    {
-      name = "read_pkg_up___read_pkg_up_2.0.0.tgz";
-      path = fetchurl {
-        name = "read_pkg_up___read_pkg_up_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz";
-        sha1 = "6b72a8048984e0c41e79510fd5e9fa99b3b549be";
-      };
-    }
-
-    {
-      name = "read_pkg___read_pkg_1.1.0.tgz";
-      path = fetchurl {
-        name = "read_pkg___read_pkg_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz";
-        sha1 = "f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28";
-      };
-    }
-
-    {
-      name = "read_pkg___read_pkg_2.0.0.tgz";
-      path = fetchurl {
-        name = "read_pkg___read_pkg_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz";
-        sha1 = "8ef1c0623c6a6db0dc6713c4bfac46332b2368f8";
-      };
-    }
-
-    {
-      name = "readable_stream___readable_stream_1.0.34.tgz";
-      path = fetchurl {
-        name = "readable_stream___readable_stream_1.0.34.tgz";
-        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz";
-        sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c";
-      };
-    }
-
-    {
-      name = "readable_stream___readable_stream_2.3.6.tgz";
-      path = fetchurl {
-        name = "readable_stream___readable_stream_2.3.6.tgz";
-        url  = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz";
-        sha1 = "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf";
-      };
-    }
-
-    {
-      name = "readdirp___readdirp_2.1.0.tgz";
-      path = fetchurl {
-        name = "readdirp___readdirp_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz";
-        sha1 = "4ed0ad060df3073300c48440373f72d1cc642d78";
-      };
-    }
-
-    {
-      name = "redent___redent_1.0.0.tgz";
-      path = fetchurl {
-        name = "redent___redent_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz";
-        sha1 = "cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde";
-      };
-    }
-
-    {
-      name = "reduce_css_calc___reduce_css_calc_1.3.0.tgz";
-      path = fetchurl {
-        name = "reduce_css_calc___reduce_css_calc_1.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz";
-        sha1 = "747c914e049614a4c9cfbba629871ad1d2927716";
-      };
-    }
-
-    {
-      name = "reduce_function_call___reduce_function_call_1.0.2.tgz";
-      path = fetchurl {
-        name = "reduce_function_call___reduce_function_call_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz";
-        sha1 = "5a200bf92e0e37751752fe45b0ab330fd4b6be99";
-      };
-    }
-
-    {
-      name = "regenerate___regenerate_1.4.0.tgz";
-      path = fetchurl {
-        name = "regenerate___regenerate_1.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz";
-        sha1 = "4a856ec4b56e4077c557589cae85e7a4c8869a11";
-      };
-    }
-
-    {
-      name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
-      path = fetchurl {
-        name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
-        url  = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
-        sha1 = "be05ad7f9bf7d22e056f9726cee5017fbf19e2e9";
-      };
-    }
-
-    {
-      name = "regenerator_transform___regenerator_transform_0.10.1.tgz";
-      path = fetchurl {
-        name = "regenerator_transform___regenerator_transform_0.10.1.tgz";
-        url  = "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz";
-        sha1 = "1e4996837231da8b7f3cf4114d71b5691a0680dd";
-      };
-    }
-
-    {
-      name = "regex_cache___regex_cache_0.4.4.tgz";
-      path = fetchurl {
-        name = "regex_cache___regex_cache_0.4.4.tgz";
-        url  = "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz";
-        sha1 = "75bdc58a2a1496cec48a12835bc54c8d562336dd";
-      };
-    }
-
-    {
-      name = "regex_not___regex_not_1.0.2.tgz";
-      path = fetchurl {
-        name = "regex_not___regex_not_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz";
-        sha1 = "1f4ece27e00b0b65e0247a6810e6a85d83a5752c";
-      };
-    }
-
-    {
-      name = "regex_parser___regex_parser_2.2.9.tgz";
-      path = fetchurl {
-        name = "regex_parser___regex_parser_2.2.9.tgz";
-        url  = "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.9.tgz";
-        sha1 = "a372f45a248b62976a568037c1b6e60a60599192";
-      };
-    }
-
-    {
-      name = "regexpu_core___regexpu_core_1.0.0.tgz";
-      path = fetchurl {
-        name = "regexpu_core___regexpu_core_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz";
-        sha1 = "86a763f58ee4d7c2f6b102e4764050de7ed90c6b";
-      };
-    }
-
-    {
-      name = "regexpu_core___regexpu_core_2.0.0.tgz";
-      path = fetchurl {
-        name = "regexpu_core___regexpu_core_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz";
-        sha1 = "49d038837b8dcf8bfa5b9a42139938e6ea2ae240";
-      };
-    }
-
-    {
-      name = "regjsgen___regjsgen_0.2.0.tgz";
-      path = fetchurl {
-        name = "regjsgen___regjsgen_0.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz";
-        sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7";
-      };
-    }
-
-    {
-      name = "regjsparser___regjsparser_0.1.5.tgz";
-      path = fetchurl {
-        name = "regjsparser___regjsparser_0.1.5.tgz";
-        url  = "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz";
-        sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c";
-      };
-    }
-
-    {
-      name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
-      path = fetchurl {
-        name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
-        sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
-      };
-    }
-
-    {
-      name = "renderkid___renderkid_2.0.1.tgz";
-      path = fetchurl {
-        name = "renderkid___renderkid_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz";
-        sha1 = "898cabfc8bede4b7b91135a3ffd323e58c0db319";
-      };
-    }
-
-    {
-      name = "repeat_element___repeat_element_1.1.2.tgz";
-      path = fetchurl {
-        name = "repeat_element___repeat_element_1.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz";
-        sha1 = "ef089a178d1483baae4d93eb98b4f9e4e11d990a";
-      };
-    }
-
-    {
-      name = "repeat_string___repeat_string_1.6.1.tgz";
-      path = fetchurl {
-        name = "repeat_string___repeat_string_1.6.1.tgz";
-        url  = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz";
-        sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
-      };
-    }
-
-    {
-      name = "repeating___repeating_2.0.1.tgz";
-      path = fetchurl {
-        name = "repeating___repeating_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz";
-        sha1 = "5214c53a926d3552707527fbab415dbc08d06dda";
-      };
-    }
-
-    {
-      name = "request___request_2.87.0.tgz";
-      path = fetchurl {
-        name = "request___request_2.87.0.tgz";
-        url  = "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz";
-        sha1 = "32f00235cd08d482b4d0d68db93a829c0ed5756e";
-      };
-    }
-
-    {
-      name = "request___request_2.81.0.tgz";
-      path = fetchurl {
-        name = "request___request_2.81.0.tgz";
-        url  = "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz";
-        sha1 = "c6928946a0e06c5f8d6f8a9333469ffda46298a0";
-      };
-    }
-
-    {
-      name = "require_directory___require_directory_2.1.1.tgz";
-      path = fetchurl {
-        name = "require_directory___require_directory_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz";
-        sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
-      };
-    }
-
-    {
-      name = "require_main_filename___require_main_filename_1.0.1.tgz";
-      path = fetchurl {
-        name = "require_main_filename___require_main_filename_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz";
-        sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
-      };
-    }
-
-    {
-      name = "requires_port___requires_port_1.0.0.tgz";
-      path = fetchurl {
-        name = "requires_port___requires_port_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz";
-        sha1 = "925d2601d39ac485e091cf0da5c6e694dc3dcaff";
-      };
-    }
-
-    {
-      name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
-      path = fetchurl {
-        name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz";
-        sha1 = "00a9f7387556e27038eae232caa372a6a59b665a";
-      };
-    }
-
-    {
-      name = "resolve_from___resolve_from_3.0.0.tgz";
-      path = fetchurl {
-        name = "resolve_from___resolve_from_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz";
-        sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
-      };
-    }
-
-    {
-      name = "resolve_url_loader___resolve_url_loader_2.3.0.tgz";
-      path = fetchurl {
-        name = "resolve_url_loader___resolve_url_loader_2.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.3.0.tgz";
-        sha1 = "e1b37034d48f22f8cfb9f04c026faaa070fdaf26";
-      };
-    }
-
-    {
-      name = "resolve_url___resolve_url_0.2.1.tgz";
-      path = fetchurl {
-        name = "resolve_url___resolve_url_0.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz";
-        sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
-      };
-    }
-
-    {
-      name = "ret___ret_0.1.15.tgz";
-      path = fetchurl {
-        name = "ret___ret_0.1.15.tgz";
-        url  = "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz";
-        sha1 = "b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc";
-      };
-    }
-
-    {
-      name = "rework_visit___rework_visit_1.0.0.tgz";
-      path = fetchurl {
-        name = "rework_visit___rework_visit_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz";
-        sha1 = "9945b2803f219e2f7aca00adb8bc9f640f842c9a";
-      };
-    }
-
-    {
-      name = "rework___rework_1.0.1.tgz";
-      path = fetchurl {
-        name = "rework___rework_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz";
-        sha1 = "30806a841342b54510aa4110850cd48534144aa7";
-      };
-    }
-
-    {
-      name = "right_align___right_align_0.1.3.tgz";
-      path = fetchurl {
-        name = "right_align___right_align_0.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz";
-        sha1 = "61339b722fe6a3515689210d24e14c96148613ef";
-      };
-    }
-
-    {
-      name = "rimraf___rimraf_2.6.2.tgz";
-      path = fetchurl {
-        name = "rimraf___rimraf_2.6.2.tgz";
-        url  = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz";
-        sha1 = "2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36";
-      };
-    }
-
-    {
-      name = "ripemd160___ripemd160_2.0.2.tgz";
-      path = fetchurl {
-        name = "ripemd160___ripemd160_2.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz";
-        sha1 = "a1c1a6f624751577ba5d07914cbc92850585890c";
-      };
-    }
-
-    {
-      name = "safe_buffer___safe_buffer_5.1.1.tgz";
-      path = fetchurl {
-        name = "safe_buffer___safe_buffer_5.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz";
-        sha1 = "893312af69b2123def71f57889001671eeb2c853";
-      };
-    }
-
-    {
-      name = "safe_buffer___safe_buffer_5.1.2.tgz";
-      path = fetchurl {
-        name = "safe_buffer___safe_buffer_5.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz";
-        sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d";
-      };
-    }
-
-    {
-      name = "safe_regex___safe_regex_1.1.0.tgz";
-      path = fetchurl {
-        name = "safe_regex___safe_regex_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz";
-        sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
-      };
-    }
-
-    {
-      name = "safer_buffer___safer_buffer_2.1.2.tgz";
-      path = fetchurl {
-        name = "safer_buffer___safer_buffer_2.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz";
-        sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a";
-      };
-    }
-
-    {
-      name = "sass_graph___sass_graph_2.2.4.tgz";
-      path = fetchurl {
-        name = "sass_graph___sass_graph_2.2.4.tgz";
-        url  = "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz";
-        sha1 = "13fbd63cd1caf0908b9fd93476ad43a51d1e0b49";
-      };
-    }
-
-    {
-      name = "sass_loader___sass_loader_7.0.3.tgz";
-      path = fetchurl {
-        name = "sass_loader___sass_loader_7.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.3.tgz";
-        sha1 = "6ca10871a1cc7549f8143db5a9958242c4e4ca2a";
-      };
-    }
-
-    {
-      name = "sax___sax_1.2.4.tgz";
-      path = fetchurl {
-        name = "sax___sax_1.2.4.tgz";
-        url  = "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz";
-        sha1 = "2816234e2378bddc4e5354fab5caa895df7100d9";
-      };
-    }
-
-    {
-      name = "schema_utils___schema_utils_0.3.0.tgz";
-      path = fetchurl {
-        name = "schema_utils___schema_utils_0.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz";
-        sha1 = "f5877222ce3e931edae039f17eb3716e7137f8cf";
-      };
-    }
-
-    {
-      name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz";
-      path = fetchurl {
-        name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz";
-        url  = "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz";
-        sha1 = "8eb06db9a9723333824d3f5530641149847ce5d1";
-      };
-    }
-
-    {
-      name = "select_hose___select_hose_2.0.0.tgz";
-      path = fetchurl {
-        name = "select_hose___select_hose_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz";
-        sha1 = "625d8658f865af43ec962bfc376a37359a4994ca";
-      };
-    }
-
-    {
-      name = "selfsigned___selfsigned_1.10.3.tgz";
-      path = fetchurl {
-        name = "selfsigned___selfsigned_1.10.3.tgz";
-        url  = "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz";
-        sha1 = "d628ecf9e3735f84e8bafba936b3cf85bea43823";
-      };
-    }
-
-    {
-      name = "semver___semver_5.5.0.tgz";
-      path = fetchurl {
-        name = "semver___semver_5.5.0.tgz";
-        url  = "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz";
-        sha1 = "dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab";
-      };
-    }
-
-    {
-      name = "semver___semver_5.3.0.tgz";
-      path = fetchurl {
-        name = "semver___semver_5.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz";
-        sha1 = "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f";
-      };
-    }
-
-    {
-      name = "send___send_0.16.2.tgz";
-      path = fetchurl {
-        name = "send___send_0.16.2.tgz";
-        url  = "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz";
-        sha1 = "6ecca1e0f8c156d141597559848df64730a6bbc1";
-      };
-    }
-
-    {
-      name = "serve_index___serve_index_1.9.1.tgz";
-      path = fetchurl {
-        name = "serve_index___serve_index_1.9.1.tgz";
-        url  = "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz";
-        sha1 = "d3768d69b1e7d82e5ce050fff5b453bea12a9239";
-      };
-    }
-
-    {
-      name = "serve_static___serve_static_1.13.2.tgz";
-      path = fetchurl {
-        name = "serve_static___serve_static_1.13.2.tgz";
-        url  = "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz";
-        sha1 = "095e8472fd5b46237db50ce486a43f4b86c6cec1";
-      };
-    }
-
-    {
-      name = "set_blocking___set_blocking_2.0.0.tgz";
-      path = fetchurl {
-        name = "set_blocking___set_blocking_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz";
-        sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
-      };
-    }
-
-    {
-      name = "set_immediate_shim___set_immediate_shim_1.0.1.tgz";
-      path = fetchurl {
-        name = "set_immediate_shim___set_immediate_shim_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz";
-        sha1 = "4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61";
-      };
-    }
-
-    {
-      name = "set_value___set_value_0.4.3.tgz";
-      path = fetchurl {
-        name = "set_value___set_value_0.4.3.tgz";
-        url  = "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz";
-        sha1 = "7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1";
-      };
-    }
-
-    {
-      name = "set_value___set_value_2.0.0.tgz";
-      path = fetchurl {
-        name = "set_value___set_value_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz";
-        sha1 = "71ae4a88f0feefbbf52d1ea604f3fb315ebb6274";
-      };
-    }
-
-    {
-      name = "setimmediate___setimmediate_1.0.5.tgz";
-      path = fetchurl {
-        name = "setimmediate___setimmediate_1.0.5.tgz";
-        url  = "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz";
-        sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285";
-      };
-    }
-
-    {
-      name = "setprototypeof___setprototypeof_1.0.3.tgz";
-      path = fetchurl {
-        name = "setprototypeof___setprototypeof_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz";
-        sha1 = "66567e37043eeb4f04d91bd658c0cbefb55b8e04";
-      };
-    }
-
-    {
-      name = "setprototypeof___setprototypeof_1.1.0.tgz";
-      path = fetchurl {
-        name = "setprototypeof___setprototypeof_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz";
-        sha1 = "d0bd85536887b6fe7c0d818cb962d9d91c54e656";
-      };
-    }
-
-    {
-      name = "sha.js___sha.js_2.4.11.tgz";
-      path = fetchurl {
-        name = "sha.js___sha.js_2.4.11.tgz";
-        url  = "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz";
-        sha1 = "37a5cf0b81ecbc6943de109ba2960d1b26584ae7";
-      };
-    }
-
-    {
-      name = "shallow_clone___shallow_clone_1.0.0.tgz";
-      path = fetchurl {
-        name = "shallow_clone___shallow_clone_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz";
-        sha1 = "4480cd06e882ef68b2ad88a3ea54832e2c48b571";
-      };
-    }
-
-    {
-      name = "shebang_command___shebang_command_1.2.0.tgz";
-      path = fetchurl {
-        name = "shebang_command___shebang_command_1.2.0.tgz";
-        url  = "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz";
-        sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
-      };
-    }
-
-    {
-      name = "shebang_regex___shebang_regex_1.0.0.tgz";
-      path = fetchurl {
-        name = "shebang_regex___shebang_regex_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz";
-        sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
-      };
-    }
-
-    {
-      name = "signal_exit___signal_exit_3.0.2.tgz";
-      path = fetchurl {
-        name = "signal_exit___signal_exit_3.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz";
-        sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
-      };
-    }
-
-    {
-      name = "slash___slash_1.0.0.tgz";
-      path = fetchurl {
-        name = "slash___slash_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz";
-        sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55";
-      };
-    }
-
-    {
-      name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
-      path = fetchurl {
-        name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
-        sha1 = "6c175f86ff14bdb0724563e8f3c1b021a286853b";
-      };
-    }
-
-    {
-      name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
-      path = fetchurl {
-        name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
-        sha1 = "f956479486f2acd79700693f6f7b805e45ab56e2";
-      };
-    }
-
-    {
-      name = "snapdragon___snapdragon_0.8.2.tgz";
-      path = fetchurl {
-        name = "snapdragon___snapdragon_0.8.2.tgz";
-        url  = "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz";
-        sha1 = "64922e7c565b0e14204ba1aa7d6964278d25182d";
-      };
-    }
-
-    {
-      name = "sntp___sntp_1.0.9.tgz";
-      path = fetchurl {
-        name = "sntp___sntp_1.0.9.tgz";
-        url  = "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz";
-        sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198";
-      };
-    }
-
-    {
-      name = "sockjs_client___sockjs_client_1.1.4.tgz";
-      path = fetchurl {
-        name = "sockjs_client___sockjs_client_1.1.4.tgz";
-        url  = "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz";
-        sha1 = "5babe386b775e4cf14e7520911452654016c8b12";
-      };
-    }
-
-    {
-      name = "sockjs___sockjs_0.3.19.tgz";
-      path = fetchurl {
-        name = "sockjs___sockjs_0.3.19.tgz";
-        url  = "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz";
-        sha1 = "d976bbe800af7bd20ae08598d582393508993c0d";
-      };
-    }
-
-    {
-      name = "sort_keys___sort_keys_1.1.2.tgz";
-      path = fetchurl {
-        name = "sort_keys___sort_keys_1.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz";
-        sha1 = "441b6d4d346798f1b4e49e8920adfba0e543f9ad";
-      };
-    }
-
-    {
-      name = "source_list_map___source_list_map_0.1.8.tgz";
-      path = fetchurl {
-        name = "source_list_map___source_list_map_0.1.8.tgz";
-        url  = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz";
-        sha1 = "c550b2ab5427f6b3f21f5afead88c4f5587b2106";
-      };
-    }
-
-    {
-      name = "source_list_map___source_list_map_2.0.0.tgz";
-      path = fetchurl {
-        name = "source_list_map___source_list_map_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz";
-        sha1 = "aaa47403f7b245a92fbc97ea08f250d6087ed085";
-      };
-    }
-
-    {
-      name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
-      path = fetchurl {
-        name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
-        url  = "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz";
-        sha1 = "72e2cc34095543e43b2c62b2c4c10d4a9054f259";
-      };
-    }
-
-    {
-      name = "source_map_support___source_map_support_0.4.18.tgz";
-      path = fetchurl {
-        name = "source_map_support___source_map_support_0.4.18.tgz";
-        url  = "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz";
-        sha1 = "0286a6de8be42641338594e97ccea75f0a2c585f";
-      };
-    }
-
-    {
-      name = "source_map_url___source_map_url_0.4.0.tgz";
-      path = fetchurl {
-        name = "source_map_url___source_map_url_0.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz";
-        sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
-      };
-    }
-
-    {
-      name = "source_map___source_map_0.1.43.tgz";
-      path = fetchurl {
-        name = "source_map___source_map_0.1.43.tgz";
-        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz";
-        sha1 = "c24bc146ca517c1471f5dacbe2571b2b7f9e3346";
-      };
-    }
-
-    {
-      name = "source_map___source_map_0.4.4.tgz";
-      path = fetchurl {
-        name = "source_map___source_map_0.4.4.tgz";
-        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz";
-        sha1 = "eba4f5da9c0dc999de68032d8b4f76173652036b";
-      };
-    }
-
-    {
-      name = "source_map___source_map_0.5.7.tgz";
-      path = fetchurl {
-        name = "source_map___source_map_0.5.7.tgz";
-        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz";
-        sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
-      };
-    }
-
-    {
-      name = "source_map___source_map_0.6.1.tgz";
-      path = fetchurl {
-        name = "source_map___source_map_0.6.1.tgz";
-        url  = "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz";
-        sha1 = "74722af32e9614e9c287a8d0bbde48b5e2f1a263";
-      };
-    }
-
-    {
-      name = "spdx_correct___spdx_correct_3.0.0.tgz";
-      path = fetchurl {
-        name = "spdx_correct___spdx_correct_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz";
-        sha1 = "05a5b4d7153a195bc92c3c425b69f3b2a9524c82";
-      };
-    }
-
-    {
-      name = "spdx_exceptions___spdx_exceptions_2.1.0.tgz";
-      path = fetchurl {
-        name = "spdx_exceptions___spdx_exceptions_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz";
-        sha1 = "2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9";
-      };
-    }
-
-    {
-      name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
-      path = fetchurl {
-        name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
-        sha1 = "99e119b7a5da00e05491c9fa338b7904823b41d0";
-      };
-    }
-
-    {
-      name = "spdx_license_ids___spdx_license_ids_3.0.0.tgz";
-      path = fetchurl {
-        name = "spdx_license_ids___spdx_license_ids_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz";
-        sha1 = "7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87";
-      };
-    }
-
-    {
-      name = "spdy_transport___spdy_transport_2.1.0.tgz";
-      path = fetchurl {
-        name = "spdy_transport___spdy_transport_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz";
-        sha1 = "4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1";
-      };
-    }
-
-    {
-      name = "spdy___spdy_3.4.7.tgz";
-      path = fetchurl {
-        name = "spdy___spdy_3.4.7.tgz";
-        url  = "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz";
-        sha1 = "42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc";
-      };
-    }
-
-    {
-      name = "split_string___split_string_3.1.0.tgz";
-      path = fetchurl {
-        name = "split_string___split_string_3.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz";
-        sha1 = "7cb09dda3a86585705c64b39a6466038682e8fe2";
-      };
-    }
-
-    {
-      name = "sprintf_js___sprintf_js_1.0.3.tgz";
-      path = fetchurl {
-        name = "sprintf_js___sprintf_js_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz";
-        sha1 = "04e6926f662895354f3dd015203633b857297e2c";
-      };
-    }
-
-    {
-      name = "sshpk___sshpk_1.14.2.tgz";
-      path = fetchurl {
-        name = "sshpk___sshpk_1.14.2.tgz";
-        url  = "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz";
-        sha1 = "c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98";
-      };
-    }
-
-    {
-      name = "stackframe___stackframe_1.0.4.tgz";
-      path = fetchurl {
-        name = "stackframe___stackframe_1.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz";
-        sha1 = "357b24a992f9427cba6b545d96a14ed2cbca187b";
-      };
-    }
-
-    {
-      name = "static_extend___static_extend_0.1.2.tgz";
-      path = fetchurl {
-        name = "static_extend___static_extend_0.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz";
-        sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
-      };
-    }
-
-    {
-      name = "statuses___statuses_1.5.0.tgz";
-      path = fetchurl {
-        name = "statuses___statuses_1.5.0.tgz";
-        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz";
-        sha1 = "161c7dac177659fd9811f43771fa99381478628c";
-      };
-    }
-
-    {
-      name = "statuses___statuses_1.4.0.tgz";
-      path = fetchurl {
-        name = "statuses___statuses_1.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz";
-        sha1 = "bb73d446da2796106efcc1b601a253d6c46bd087";
-      };
-    }
-
-    {
-      name = "stdout_stream___stdout_stream_1.4.0.tgz";
-      path = fetchurl {
-        name = "stdout_stream___stdout_stream_1.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz";
-        sha1 = "a2c7c8587e54d9427ea9edb3ac3f2cd522df378b";
-      };
-    }
-
-    {
-      name = "stream_browserify___stream_browserify_2.0.1.tgz";
-      path = fetchurl {
-        name = "stream_browserify___stream_browserify_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz";
-        sha1 = "66266ee5f9bdb9940a4e4514cafb43bb71e5c9db";
-      };
-    }
-
-    {
-      name = "stream_http___stream_http_2.8.3.tgz";
-      path = fetchurl {
-        name = "stream_http___stream_http_2.8.3.tgz";
-        url  = "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz";
-        sha1 = "b2d242469288a5a27ec4fe8933acf623de6514fc";
-      };
-    }
-
-    {
-      name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz";
-      path = fetchurl {
-        name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz";
-        sha1 = "279b225df1d582b1f54e65addd4352e18faa0713";
-      };
-    }
-
-    {
-      name = "string_width___string_width_1.0.2.tgz";
-      path = fetchurl {
-        name = "string_width___string_width_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz";
-        sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
-      };
-    }
-
-    {
-      name = "string_width___string_width_2.1.1.tgz";
-      path = fetchurl {
-        name = "string_width___string_width_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz";
-        sha1 = "ab93f27a8dc13d28cac815c462143a6d9012ae9e";
-      };
-    }
-
-    {
-      name = "string_decoder___string_decoder_1.1.1.tgz";
-      path = fetchurl {
-        name = "string_decoder___string_decoder_1.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz";
-        sha1 = "9cf1611ba62685d7030ae9e4ba34149c3af03fc8";
-      };
-    }
-
-    {
-      name = "string_decoder___string_decoder_0.10.31.tgz";
-      path = fetchurl {
-        name = "string_decoder___string_decoder_0.10.31.tgz";
-        url  = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz";
-        sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
-      };
-    }
-
-    {
-      name = "stringstream___stringstream_0.0.6.tgz";
-      path = fetchurl {
-        name = "stringstream___stringstream_0.0.6.tgz";
-        url  = "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz";
-        sha1 = "7880225b0d4ad10e30927d167a1d6f2fd3b33a72";
-      };
-    }
-
-    {
-      name = "strip_ansi___strip_ansi_3.0.1.tgz";
-      path = fetchurl {
-        name = "strip_ansi___strip_ansi_3.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz";
-        sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
-      };
-    }
-
-    {
-      name = "strip_ansi___strip_ansi_4.0.0.tgz";
-      path = fetchurl {
-        name = "strip_ansi___strip_ansi_4.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz";
-        sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
-      };
-    }
-
-    {
-      name = "strip_bom___strip_bom_2.0.0.tgz";
-      path = fetchurl {
-        name = "strip_bom___strip_bom_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz";
-        sha1 = "6219a85616520491f35788bdbf1447a99c7e6b0e";
-      };
-    }
-
-    {
-      name = "strip_bom___strip_bom_3.0.0.tgz";
-      path = fetchurl {
-        name = "strip_bom___strip_bom_3.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz";
-        sha1 = "2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3";
-      };
-    }
-
-    {
-      name = "strip_eof___strip_eof_1.0.0.tgz";
-      path = fetchurl {
-        name = "strip_eof___strip_eof_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz";
-        sha1 = "bb43ff5598a6eb05d89b59fcd129c983313606bf";
-      };
-    }
-
-    {
-      name = "strip_indent___strip_indent_1.0.1.tgz";
-      path = fetchurl {
-        name = "strip_indent___strip_indent_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz";
-        sha1 = "0c7962a6adefa7bbd4ac366460a638552ae1a0a2";
-      };
-    }
-
-    {
-      name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
-      path = fetchurl {
-        name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz";
-        sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a";
-      };
-    }
-
-    {
-      name = "style_loader___style_loader_0.13.2.tgz";
-      path = fetchurl {
-        name = "style_loader___style_loader_0.13.2.tgz";
-        url  = "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz";
-        sha1 = "74533384cf698c7104c7951150b49717adc2f3bb";
-      };
-    }
-
-    {
-      name = "summernote___summernote_0.8.10.tgz";
-      path = fetchurl {
-        name = "summernote___summernote_0.8.10.tgz";
-        url  = "https://registry.yarnpkg.com/summernote/-/summernote-0.8.10.tgz";
-        sha1 = "21a5d7f18a3b07500b58b60d5907417a54897520";
-      };
-    }
-
-    {
-      name = "supports_color___supports_color_2.0.0.tgz";
-      path = fetchurl {
-        name = "supports_color___supports_color_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz";
-        sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
-      };
-    }
-
-    {
-      name = "supports_color___supports_color_3.2.3.tgz";
-      path = fetchurl {
-        name = "supports_color___supports_color_3.2.3.tgz";
-        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz";
-        sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6";
-      };
-    }
-
-    {
-      name = "supports_color___supports_color_4.5.0.tgz";
-      path = fetchurl {
-        name = "supports_color___supports_color_4.5.0.tgz";
-        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz";
-        sha1 = "be7a0de484dec5c5cddf8b3d59125044912f635b";
-      };
-    }
-
-    {
-      name = "supports_color___supports_color_5.4.0.tgz";
-      path = fetchurl {
-        name = "supports_color___supports_color_5.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz";
-        sha1 = "1c6b337402c2137605efe19f10fec390f6faab54";
-      };
-    }
-
-    {
-      name = "svgo___svgo_0.7.2.tgz";
-      path = fetchurl {
-        name = "svgo___svgo_0.7.2.tgz";
-        url  = "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz";
-        sha1 = "9f5772413952135c6fefbf40afe6a4faa88b4bb5";
-      };
-    }
-
-    {
-      name = "tapable___tapable_0.2.8.tgz";
-      path = fetchurl {
-        name = "tapable___tapable_0.2.8.tgz";
-        url  = "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz";
-        sha1 = "99372a5c999bf2df160afc0d74bed4f47948cd22";
-      };
-    }
-
-    {
-      name = "tar___tar_2.2.1.tgz";
-      path = fetchurl {
-        name = "tar___tar_2.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz";
-        sha1 = "8e4d2a256c0e2185c6b18ad694aec968b83cb1d1";
-      };
-    }
-
-    {
-      name = "tar___tar_4.4.4.tgz";
-      path = fetchurl {
-        name = "tar___tar_4.4.4.tgz";
-        url  = "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz";
-        sha1 = "ec8409fae9f665a4355cc3b4087d0820232bb8cd";
-      };
-    }
-
-    {
-      name = "thunky___thunky_1.0.2.tgz";
-      path = fetchurl {
-        name = "thunky___thunky_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz";
-        sha1 = "a862e018e3fb1ea2ec3fce5d55605cf57f247371";
-      };
-    }
-
-    {
-      name = "time_stamp___time_stamp_2.0.0.tgz";
-      path = fetchurl {
-        name = "time_stamp___time_stamp_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz";
-        sha1 = "95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357";
-      };
-    }
-
-    {
-      name = "timers_browserify___timers_browserify_2.0.10.tgz";
-      path = fetchurl {
-        name = "timers_browserify___timers_browserify_2.0.10.tgz";
-        url  = "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz";
-        sha1 = "1d28e3d2aadf1d5a5996c4e9f95601cd053480ae";
-      };
-    }
-
-    {
-      name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
-      path = fetchurl {
-        name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
-        sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
-      };
-    }
-
-    {
-      name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
-      path = fetchurl {
-        name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz";
-        sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47";
-      };
-    }
-
-    {
-      name = "to_object_path___to_object_path_0.3.0.tgz";
-      path = fetchurl {
-        name = "to_object_path___to_object_path_0.3.0.tgz";
-        url  = "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz";
-        sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
-      };
-    }
-
-    {
-      name = "to_regex_range___to_regex_range_2.1.1.tgz";
-      path = fetchurl {
-        name = "to_regex_range___to_regex_range_2.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz";
-        sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
-      };
-    }
-
-    {
-      name = "to_regex___to_regex_3.0.2.tgz";
-      path = fetchurl {
-        name = "to_regex___to_regex_3.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz";
-        sha1 = "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce";
-      };
-    }
-
-    {
-      name = "tough_cookie___tough_cookie_2.3.4.tgz";
-      path = fetchurl {
-        name = "tough_cookie___tough_cookie_2.3.4.tgz";
-        url  = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz";
-        sha1 = "ec60cee38ac675063ffc97a5c18970578ee83655";
-      };
-    }
-
-    {
-      name = "trim_newlines___trim_newlines_1.0.0.tgz";
-      path = fetchurl {
-        name = "trim_newlines___trim_newlines_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz";
-        sha1 = "5887966bb582a4503a41eb524f7d35011815a613";
-      };
-    }
-
-    {
-      name = "trim_right___trim_right_1.0.1.tgz";
-      path = fetchurl {
-        name = "trim_right___trim_right_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz";
-        sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003";
-      };
-    }
-
-    {
-      name = "true_case_path___true_case_path_1.0.2.tgz";
-      path = fetchurl {
-        name = "true_case_path___true_case_path_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz";
-        sha1 = "7ec91130924766c7f573be3020c34f8fdfd00d62";
-      };
-    }
-
-    {
-      name = "tty_browserify___tty_browserify_0.0.0.tgz";
-      path = fetchurl {
-        name = "tty_browserify___tty_browserify_0.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz";
-        sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6";
-      };
-    }
-
-    {
-      name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
-      path = fetchurl {
-        name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
-        url  = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
-        sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
-      };
-    }
-
-    {
-      name = "tweetnacl___tweetnacl_0.14.5.tgz";
-      path = fetchurl {
-        name = "tweetnacl___tweetnacl_0.14.5.tgz";
-        url  = "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz";
-        sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
-      };
-    }
-
-    {
-      name = "type_is___type_is_1.6.16.tgz";
-      path = fetchurl {
-        name = "type_is___type_is_1.6.16.tgz";
-        url  = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz";
-        sha1 = "f89ce341541c672b25ee7ae3c73dee3b2be50194";
-      };
-    }
-
-    {
-      name = "uglify_js___uglify_js_2.8.29.tgz";
-      path = fetchurl {
-        name = "uglify_js___uglify_js_2.8.29.tgz";
-        url  = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz";
-        sha1 = "29c5733148057bb4e1f75df35b7a9cb72e6a59dd";
-      };
-    }
-
-    {
-      name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz";
-      path = fetchurl {
-        name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz";
-        sha1 = "6e0924d6bda6b5afe349e39a6d632850a0f882b7";
-      };
-    }
-
-    {
-      name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_0.4.6.tgz";
-      path = fetchurl {
-        name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_0.4.6.tgz";
-        url  = "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz";
-        sha1 = "b951f4abb6bd617e66f63eb891498e391763e309";
-      };
-    }
-
-    {
-      name = "union_value___union_value_1.0.0.tgz";
-      path = fetchurl {
-        name = "union_value___union_value_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz";
-        sha1 = "5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4";
-      };
-    }
-
-    {
-      name = "uniq___uniq_1.0.1.tgz";
-      path = fetchurl {
-        name = "uniq___uniq_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz";
-        sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
-      };
-    }
-
-    {
-      name = "uniqs___uniqs_2.0.0.tgz";
-      path = fetchurl {
-        name = "uniqs___uniqs_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz";
-        sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02";
-      };
-    }
-
-    {
-      name = "unpipe___unpipe_1.0.0.tgz";
-      path = fetchurl {
-        name = "unpipe___unpipe_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz";
-        sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
-      };
-    }
-
-    {
-      name = "unset_value___unset_value_1.0.0.tgz";
-      path = fetchurl {
-        name = "unset_value___unset_value_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz";
-        sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
-      };
-    }
-
-    {
-      name = "upath___upath_1.1.0.tgz";
-      path = fetchurl {
-        name = "upath___upath_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz";
-        sha1 = "35256597e46a581db4793d0ce47fa9aebfc9fabd";
-      };
-    }
-
-    {
-      name = "uri_js___uri_js_4.2.2.tgz";
-      path = fetchurl {
-        name = "uri_js___uri_js_4.2.2.tgz";
-        url  = "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz";
-        sha1 = "94c540e1ff772956e2299507c010aea6c8838eb0";
-      };
-    }
-
-    {
-      name = "urix___urix_0.1.0.tgz";
-      path = fetchurl {
-        name = "urix___urix_0.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz";
-        sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
-      };
-    }
-
-    {
-      name = "url_parse___url_parse_1.4.1.tgz";
-      path = fetchurl {
-        name = "url_parse___url_parse_1.4.1.tgz";
-        url  = "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.1.tgz";
-        sha1 = "4dec9dad3dc8585f862fed461d2e19bbf623df30";
-      };
-    }
-
-    {
-      name = "url___url_0.11.0.tgz";
-      path = fetchurl {
-        name = "url___url_0.11.0.tgz";
-        url  = "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz";
-        sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
-      };
-    }
-
-    {
-      name = "use___use_3.1.1.tgz";
-      path = fetchurl {
-        name = "use___use_3.1.1.tgz";
-        url  = "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz";
-        sha1 = "d50c8cac79a19fbc20f2911f56eb973f4e10070f";
-      };
-    }
-
-    {
-      name = "util_deprecate___util_deprecate_1.0.2.tgz";
-      path = fetchurl {
-        name = "util_deprecate___util_deprecate_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz";
-        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
-      };
-    }
-
-    {
-      name = "util___util_0.10.3.tgz";
-      path = fetchurl {
-        name = "util___util_0.10.3.tgz";
-        url  = "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz";
-        sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
-      };
-    }
-
-    {
-      name = "util___util_0.10.4.tgz";
-      path = fetchurl {
-        name = "util___util_0.10.4.tgz";
-        url  = "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz";
-        sha1 = "3aa0125bfe668a4672de58857d3ace27ecb76901";
-      };
-    }
-
-    {
-      name = "utila___utila_0.3.3.tgz";
-      path = fetchurl {
-        name = "utila___utila_0.3.3.tgz";
-        url  = "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz";
-        sha1 = "d7e8e7d7e309107092b05f8d9688824d633a4226";
-      };
-    }
-
-    {
-      name = "utila___utila_0.4.0.tgz";
-      path = fetchurl {
-        name = "utila___utila_0.4.0.tgz";
-        url  = "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz";
-        sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c";
-      };
-    }
-
-    {
-      name = "utils_merge___utils_merge_1.0.1.tgz";
-      path = fetchurl {
-        name = "utils_merge___utils_merge_1.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz";
-        sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
-      };
-    }
-
-    {
-      name = "uuid___uuid_3.3.2.tgz";
-      path = fetchurl {
-        name = "uuid___uuid_3.3.2.tgz";
-        url  = "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz";
-        sha1 = "1b4af4955eb3077c501c23872fc6513811587131";
-      };
-    }
-
-    {
-      name = "validate_npm_package_license___validate_npm_package_license_3.0.3.tgz";
-      path = fetchurl {
-        name = "validate_npm_package_license___validate_npm_package_license_3.0.3.tgz";
-        url  = "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz";
-        sha1 = "81643bcbef1bdfecd4623793dc4648948ba98338";
-      };
-    }
-
-    {
-      name = "vary___vary_1.1.2.tgz";
-      path = fetchurl {
-        name = "vary___vary_1.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz";
-        sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc";
-      };
-    }
-
-    {
-      name = "vendors___vendors_1.0.2.tgz";
-      path = fetchurl {
-        name = "vendors___vendors_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz";
-        sha1 = "7fcb5eef9f5623b156bcea89ec37d63676f21801";
-      };
-    }
-
-    {
-      name = "verror___verror_1.10.0.tgz";
-      path = fetchurl {
-        name = "verror___verror_1.10.0.tgz";
-        url  = "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz";
-        sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
-      };
-    }
-
-    {
-      name = "vm_browserify___vm_browserify_0.0.4.tgz";
-      path = fetchurl {
-        name = "vm_browserify___vm_browserify_0.0.4.tgz";
-        url  = "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz";
-        sha1 = "5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73";
-      };
-    }
-
-    {
-      name = "watchpack___watchpack_1.6.0.tgz";
-      path = fetchurl {
-        name = "watchpack___watchpack_1.6.0.tgz";
-        url  = "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz";
-        sha1 = "4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00";
-      };
-    }
-
-    {
-      name = "wbuf___wbuf_1.7.3.tgz";
-      path = fetchurl {
-        name = "wbuf___wbuf_1.7.3.tgz";
-        url  = "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz";
-        sha1 = "c1d8d149316d3ea852848895cb6a0bfe887b87df";
-      };
-    }
-
-    {
-      name = "webpack_chunk_hash___webpack_chunk_hash_0.5.0.tgz";
-      path = fetchurl {
-        name = "webpack_chunk_hash___webpack_chunk_hash_0.5.0.tgz";
-        url  = "https://registry.yarnpkg.com/webpack-chunk-hash/-/webpack-chunk-hash-0.5.0.tgz";
-        sha1 = "1dba38203d73c1e6ab069b6810a5a37402399dec";
-      };
-    }
-
-    {
-      name = "webpack_dev_middleware___webpack_dev_middleware_1.12.2.tgz";
-      path = fetchurl {
-        name = "webpack_dev_middleware___webpack_dev_middleware_1.12.2.tgz";
-        url  = "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz";
-        sha1 = "f8fc1120ce3b4fc5680ceecb43d777966b21105e";
-      };
-    }
-
-    {
-      name = "webpack_dev_server___webpack_dev_server_2.11.2.tgz";
-      path = fetchurl {
-        name = "webpack_dev_server___webpack_dev_server_2.11.2.tgz";
-        url  = "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz";
-        sha1 = "1f4f4c78bf1895378f376815910812daf79a216f";
-      };
-    }
-
-    {
-      name = "webpack_sources___webpack_sources_1.1.0.tgz";
-      path = fetchurl {
-        name = "webpack_sources___webpack_sources_1.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz";
-        sha1 = "a101ebae59d6507354d71d8013950a3a8b7a5a54";
-      };
-    }
-
-    {
-      name = "webpack___webpack_3.12.0.tgz";
-      path = fetchurl {
-        name = "webpack___webpack_3.12.0.tgz";
-        url  = "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz";
-        sha1 = "3f9e34360370602fcf639e97939db486f4ec0d74";
-      };
-    }
-
-    {
-      name = "websocket_driver___websocket_driver_0.7.0.tgz";
-      path = fetchurl {
-        name = "websocket_driver___websocket_driver_0.7.0.tgz";
-        url  = "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz";
-        sha1 = "0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb";
-      };
-    }
-
-    {
-      name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
-      path = fetchurl {
-        name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz";
-        sha1 = "5d2ff22977003ec687a4b87073dfbbac146ccf29";
-      };
-    }
-
-    {
-      name = "whet.extend___whet.extend_0.9.9.tgz";
-      path = fetchurl {
-        name = "whet.extend___whet.extend_0.9.9.tgz";
-        url  = "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz";
-        sha1 = "f877d5bf648c97e5aa542fadc16d6a259b9c11a1";
-      };
-    }
-
-    {
-      name = "which_module___which_module_1.0.0.tgz";
-      path = fetchurl {
-        name = "which_module___which_module_1.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz";
-        sha1 = "bba63ca861948994ff307736089e3b96026c2a4f";
-      };
-    }
-
-    {
-      name = "which_module___which_module_2.0.0.tgz";
-      path = fetchurl {
-        name = "which_module___which_module_2.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz";
-        sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
-      };
-    }
-
-    {
-      name = "which___which_1.3.1.tgz";
-      path = fetchurl {
-        name = "which___which_1.3.1.tgz";
-        url  = "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz";
-        sha1 = "a45043d54f5805316da8d62f9f50918d3da70b0a";
-      };
-    }
-
-    {
-      name = "wide_align___wide_align_1.1.3.tgz";
-      path = fetchurl {
-        name = "wide_align___wide_align_1.1.3.tgz";
-        url  = "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz";
-        sha1 = "ae074e6bdc0c14a431e804e624549c633b000457";
-      };
-    }
-
-    {
-      name = "window_size___window_size_0.1.0.tgz";
-      path = fetchurl {
-        name = "window_size___window_size_0.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz";
-        sha1 = "5438cd2ea93b202efa3a19fe8887aee7c94f9c9d";
-      };
-    }
-
-    {
-      name = "wordwrap___wordwrap_0.0.2.tgz";
-      path = fetchurl {
-        name = "wordwrap___wordwrap_0.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz";
-        sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f";
-      };
-    }
-
-    {
-      name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
-      path = fetchurl {
-        name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz";
-        sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85";
-      };
-    }
-
-    {
-      name = "wrappy___wrappy_1.0.2.tgz";
-      path = fetchurl {
-        name = "wrappy___wrappy_1.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz";
-        sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
-      };
-    }
-
-    {
-      name = "xtend___xtend_4.0.1.tgz";
-      path = fetchurl {
-        name = "xtend___xtend_4.0.1.tgz";
-        url  = "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz";
-        sha1 = "a5c6d532be656e23db820efb943a1f04998d63af";
-      };
-    }
-
-    {
-      name = "y18n___y18n_3.2.1.tgz";
-      path = fetchurl {
-        name = "y18n___y18n_3.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz";
-        sha1 = "6d15fba884c08679c0d77e88e7759e811e07fa41";
-      };
-    }
-
-    {
-      name = "yallist___yallist_2.1.2.tgz";
-      path = fetchurl {
-        name = "yallist___yallist_2.1.2.tgz";
-        url  = "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz";
-        sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
-      };
-    }
-
-    {
-      name = "yallist___yallist_3.0.2.tgz";
-      path = fetchurl {
-        name = "yallist___yallist_3.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz";
-        sha1 = "8452b4bb7e83c7c188d8041c1a837c773d6d8bb9";
-      };
-    }
-
-    {
-      name = "yargs_parser___yargs_parser_4.2.1.tgz";
-      path = fetchurl {
-        name = "yargs_parser___yargs_parser_4.2.1.tgz";
-        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz";
-        sha1 = "29cceac0dc4f03c6c87b4a9f217dd18c9f74871c";
-      };
-    }
-
-    {
-      name = "yargs_parser___yargs_parser_5.0.0.tgz";
-      path = fetchurl {
-        name = "yargs_parser___yargs_parser_5.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz";
-        sha1 = "275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a";
-      };
-    }
-
-    {
-      name = "yargs_parser___yargs_parser_7.0.0.tgz";
-      path = fetchurl {
-        name = "yargs_parser___yargs_parser_7.0.0.tgz";
-        url  = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz";
-        sha1 = "8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9";
-      };
-    }
-
-    {
-      name = "yargs___yargs_6.6.0.tgz";
-      path = fetchurl {
-        name = "yargs___yargs_6.6.0.tgz";
-        url  = "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz";
-        sha1 = "782ec21ef403345f830a808ca3d513af56065208";
-      };
-    }
-
-    {
-      name = "yargs___yargs_7.1.0.tgz";
-      path = fetchurl {
-        name = "yargs___yargs_7.1.0.tgz";
-        url  = "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz";
-        sha1 = "6ba318eb16961727f5d284f8ea003e8d6154d0c8";
-      };
-    }
-
-    {
-      name = "yargs___yargs_8.0.2.tgz";
-      path = fetchurl {
-        name = "yargs___yargs_8.0.2.tgz";
-        url  = "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz";
-        sha1 = "6299a9055b1cefc969ff7e79c1d918dceb22c360";
-      };
-    }
-
-    {
-      name = "yargs___yargs_3.10.0.tgz";
-      path = fetchurl {
-        name = "yargs___yargs_3.10.0.tgz";
-        url  = "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz";
-        sha1 = "f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1";
-      };
-    }
-  ];
-}
diff --git a/modules/private/websites/isabelle/aten_integration.nix b/modules/private/websites/isabelle/aten_integration.nix
deleted file mode 100644 (file)
index c55ef92..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  secrets = config.myEnv.websites.isabelle.aten_integration;
-  webRoot = "/var/lib/ftp/immae/aten/public";
-  cfg = config.myServices.websites.isabelle.aten_integration;
-  pcfg = config.services.phpApplication;
-in {
-  options.myServices.websites.isabelle.aten_integration.enable = lib.mkEnableOption "enable Aten's website in integration";
-
-  config = lib.mkIf cfg.enable {
-    services.phpApplication.apps.isabelle_aten_integration = {
-      websiteEnv = "integration";
-      httpdUser = config.services.httpd.Inte.user;
-      httpdGroup = config.services.httpd.Inte.group;
-      httpdWatchFiles = [
-        config.secrets.fullPaths."websites/isabelle/aten_integration"
-      ];
-      inherit webRoot;
-      varDir = "/var/lib/ftp/immae/aten_var";
-      app = "/var/lib/ftp/immae/aten";
-      serviceDeps = [ "postgresql.service" ];
-      preStartActions = [
-        "APP_ENV=dev ./bin/console --env=dev cache:clear --no-warmup"
-      ];
-      phpOpenbasedir = [ "/tmp" ];
-      phpPool = {
-        "php_admin_value[upload_max_filesize]" = "20M";
-        "php_admin_value[post_max_size]" = "20M";
-        #"php_admin_flag[log_errors]" = "on";
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-      };
-      phpEnv = {
-        SYMFONY_DEBUG_MODE = "\"yes\"";
-      };
-      phpPackage = pkgs.php72;
-    };
-
-    secrets.keys."websites/isabelle/aten_integration" = {
-      user = config.services.httpd.Inte.user;
-      group = config.services.httpd.Inte.group;
-      permissions = "0400";
-      text = let
-        # cf:
-        #   https://secure.php.net/manual/fr/function.parse-url.php
-        #   vendor/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php#parseDatabaseUrlQuery
-        psql_url = with secrets.postgresql; "pdo-pgsql://${user}:${password}@invalid:${port}/${database}?host=${socket}";
-      in ''
-        SetEnv APP_ENV      "dev"
-        SetEnv APP_SECRET   "${secrets.secret}"
-        SetEnv DATABASE_URL "${psql_url}"
-        '';
-    };
-    services.websites.env.integration.vhostConfs.isabelle_aten_integration = {
-      certName    = "integration";
-      addToCerts  = true;
-      hosts       = [ "aten.ic.immae.dev" ];
-      root        = webRoot;
-      extraConfig = [
-        ''
-        <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>
-        ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/isabelle/aten_production.nix b/modules/private/websites/isabelle/aten_production.nix
deleted file mode 100644 (file)
index 928a815..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  secrets = config.myEnv.websites.isabelle.aten_production;
-  app = pkgs.callPackage ./aten_app {
-    composerEnv = pkgs.composerEnv.override { php = pkgs.php72; };
-    environment = secrets.environment;
-    varDir = "/var/lib/isabelle_aten_production";
-  };
-  cfg = config.myServices.websites.isabelle.aten_production;
-  pcfg = config.services.phpApplication;
-in {
-  options.myServices.websites.isabelle.aten_production.enable = lib.mkEnableOption "enable Aten's website in production";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "aten.pro"; } ];
-    services.phpApplication.apps.isabelle_aten_production = {
-      websiteEnv = "production";
-      httpdUser = config.services.httpd.Prod.user;
-      httpdGroup = config.services.httpd.Prod.group;
-      httpdWatchFiles = [
-        config.secrets.fullPaths."websites/isabelle/aten_production"
-      ];
-      inherit (app) webRoot varDir;
-      inherit app;
-      serviceDeps = [ "postgresql.service" ];
-      preStartActions = [
-        "APP_ENV=${app.environment} ./bin/console --env=${app.environment} cache:clear --no-warmup"
-      ];
-      phpOpenbasedir = [ "/tmp" ];
-      phpPool = {
-        "php_admin_value[upload_max_filesize]" = "20M";
-        "php_admin_value[post_max_size]" = "20M";
-        #"php_admin_flag[log_errors]" = "on";
-        "pm" = "dynamic";
-        "pm.max_children" = "20";
-        "pm.start_servers" = "2";
-        "pm.min_spare_servers" = "1";
-        "pm.max_spare_servers" = "3";
-      };
-      phpPackage = pkgs.php72;
-    };
-
-    secrets.keys."websites/isabelle/aten_production" = {
-      user = config.services.httpd.Prod.user;
-      group = config.services.httpd.Prod.group;
-      permissions = "0400";
-      text = let
-        # cf:
-        #   https://secure.php.net/manual/fr/function.parse-url.php
-        #   vendor/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php#parseDatabaseUrlQuery
-        psql_url = with secrets.postgresql; "pdo-pgsql://${user}:${password}@invalid:${port}/${database}?host=${socket}";
-      in ''
-        SetEnv APP_ENV      "${app.environment}"
-        SetEnv APP_SECRET   "${secrets.secret}"
-        SetEnv DATABASE_URL "${psql_url}"
-        '';
-    };
-    services.websites.env.production.vhostConfs.isabelle_aten_production = {
-      certName     = "isabelle";
-      certMainHost = "aten.pro";
-      hosts       = [ "aten.pro" "www.aten.pro" ];
-      root        = app.webRoot;
-      extraConfig = [
-        ''
-        <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>
-        ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/isabelle/config/chmod.php b/modules/private/websites/isabelle/config/chmod.php
deleted file mode 100644 (file)
index aae16cd..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-if (!defined("_ECRIRE_INC_VERSION")) return;
-if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', 0777);
-?>
\ No newline at end of file
diff --git a/modules/private/websites/isabelle/config/connect.php b/modules/private/websites/isabelle/config/connect.php
deleted file mode 100644 (file)
index 18b0933..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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'
-);
-?>
diff --git a/modules/private/websites/isabelle/config/ldap.php b/modules/private/websites/isabelle/config/ldap.php
deleted file mode 100644 (file)
index 825b7ed..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?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");
-?>
diff --git a/modules/private/websites/isabelle/iridologie.nix b/modules/private/websites/isabelle/iridologie.nix
deleted file mode 100644 (file)
index cd733c1..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  icfg = config.myEnv.websites.isabelle.iridologie;
-  cfg = config.myServices.websites.isabelle.iridologie;
-  app = pkgs.callPackage ./iridologie_app {
-    inherit (icfg) environment;
-    inherit (pkgs.webapps) spip;
-    varDir = "/var/lib/isabelle_iridologie";
-  };
-
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-  secretsPath = config.secrets.fullPaths."websites/isabelle/iridologie";
-in {
-  options.myServices.websites.isabelle.iridologie.enable = lib.mkEnableOption "enable Iridologie's website";
-
-  config = lib.mkIf cfg.enable {
-    secrets.keys."websites/isabelle/iridologie" = {
-      user = apacheUser;
-      group = apacheGroup;
-      permissions = "0400";
-      text = ''
-        SetEnv SPIP_CONFIG_DIR     "${./config}"
-        SetEnv SPIP_VAR_DIR        "${app.varDir}"
-        SetEnv SPIP_SITE           "iridologie-${app.environment}"
-        SetEnv SPIP_LDAP_BASE      "dc=immae,dc=eu"
-        SetEnv SPIP_LDAP_HOST      "ldaps://ldap.immae.eu"
-        SetEnv SPIP_LDAP_SEARCH_DN "${icfg.ldap.dn}"
-        SetEnv SPIP_LDAP_SEARCH_PW "${icfg.ldap.password}"
-        SetEnv SPIP_LDAP_SEARCH    "${icfg.ldap.filter}"
-        SetEnv SPIP_MYSQL_HOST     "${icfg.mysql.host}"
-        SetEnv SPIP_MYSQL_PORT     "${icfg.mysql.port}"
-        SetEnv SPIP_MYSQL_DB       "${icfg.mysql.database}"
-        SetEnv SPIP_MYSQL_USER     "${icfg.mysql.user}"
-        SetEnv SPIP_MYSQL_PASSWORD "${icfg.mysql.password}"
-      '';
-    };
-    services.webstats.sites = [ { name = "iridologie.icommandeur.org"; } ];
-
-    systemd.services.phpfpm-isabelle_iridologie.after = lib.mkAfter [ "mysql.service" ];
-    systemd.services.phpfpm-isabelle_iridologie.wants = [ "mysql.service" ];
-    services.phpfpm.pools.isabelle_iridologie = {
-      user = config.services.httpd.Prod.user;
-      group = config.services.httpd.Prod.group;
-      settings = {
-        "listen.owner" = "${apacheUser}";
-        "listen.group" = "${apacheGroup}";
-        "php_admin_value[upload_max_filesize]" = "20M";
-        "php_admin_value[post_max_size]" = "20M";
-        #"php_admin_flag[log_errors]" = "on";
-        "php_admin_value[open_basedir]" = "${app.spipConfig}:${./config}:${app}:${app.varDir}:/tmp";
-        "php_admin_value[session.save_path]" = "${app.varDir}/phpSessions";
-        "pm" = "dynamic";
-        "pm.max_children" = "20";
-        "pm.start_servers" = "2";
-        "pm.min_spare_servers" = "1";
-        "pm.max_spare_servers" = "3";
-      };
-      phpPackage = pkgs.php72;
-    };
-    system.activationScripts.isabelle_iridologie = {
-      deps = [ "wrappers" ];
-      text = ''
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir} ${app.varDir}/IMG ${app.varDir}/tmp ${app.varDir}/local
-        install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions
-      '';
-    };
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-    services.websites.env.production.vhostConfs.isabelle_iridologie = {
-      certName     = "isabelle";
-      addToCerts   = true;
-      hosts        = [ "iridologie.icommandeur.org" "icommandeur.org" "www.icommandeur.org" ];
-      root         = app.webRoot;
-      extraConfig  = [
-        ''
-          RewriteEngine On
-          RewriteCond "%{HTTP_HOST}" "!^iridologie\.icommandeur\.org$" [NC]
-          RewriteRule ^(.+)$ https://iridologie.icommandeur.org$1 [R=302,L]
-
-          Include ${secretsPath}
-
-          RewriteEngine On
-
-          <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
-    ];
-  };
-}
diff --git a/modules/private/websites/isabelle/iridologie_app/default.nix b/modules/private/websites/isabelle/iridologie_app/default.nix
deleted file mode 100644 (file)
index edb7eef..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{ environment ? "prod"
-, varDir ? "/var/lib/iridologie_${environment}"
-, spip, stdenv, sassc, sources }:
-let
-  siteDir = stdenv.mkDerivation rec {
-    version = sources.websites-isabelle-iridologie.version;
-    pname = "iridologie";
-    name = "${pname}-${version}";
-    src = sources.websites-isabelle-iridologie;
-    installPhase = ''
-      cp -a . $out
-      '';
-  };
-in
-spip.override {
-  ldap = true;
-  siteName = "iridologie";
-  inherit environment siteDir varDir;
-}
diff --git a/modules/private/websites/jerome/naturaloutil.nix b/modules/private/websites/jerome/naturaloutil.nix
deleted file mode 100644 (file)
index 0974ce3..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; };
-  cfg = config.myServices.websites.jerome.naturaloutil;
-  varDir = "/var/lib/ftp/jerome";
-  env = config.myEnv.websites.jerome;
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-  secretsPath = config.secrets.fullPaths."websites/jerome/naturaloutil";
-in {
-  options.myServices.websites.jerome.naturaloutil.enable = lib.mkEnableOption "enable Jerome Naturaloutil's website";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "naturaloutil.immae.eu"; } ];
-
-    security.acme.certs."ftp".extraDomains."naturaloutil.immae.eu" = null;
-
-    secrets.keys."websites/jerome/naturaloutil" = {
-      user = apacheUser;
-      group = apacheGroup;
-      permissions = "0400";
-      text = ''
-        <?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>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/leila/production.nix b/modules/private/websites/leila/production.nix
deleted file mode 100644 (file)
index 8385bc7..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  cfg = config.myServices.websites.leila.production;
-  varDir = "/var/lib/ftp/leila";
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-in {
-  options.myServices.websites.leila.production.enable = lib.mkEnableOption "enable Leila's websites in production";
-
-  config = lib.mkIf cfg.enable {
-    services.phpfpm.pools.leila = {
-      user = apacheUser;
-      group = apacheGroup;
-      settings = {
-        "listen.owner" = apacheUser;
-        "listen.group" = apacheGroup;
-
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-
-        "php_admin_value[open_basedir]" = "${varDir}:/tmp";
-        "php_admin_value[max_execution_time]" = "1800";
-      };
-      phpOptions = config.services.phpfpm.phpOptions + ''
-        disable_functions = "mail"
-      '';
-      phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick ]);
-      phpEnv = {
-        PATH = lib.makeBinPath [ pkgs.imagemagick ];
-      };
-    };
-
-    services.webstats.sites = [
-      { name = "leila.bouya.org"; }
-      { name = "chorale.leila.bouya.org"; }
-      { name = "syrwennecreation.bouya.org"; }
-    ];
-
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-    services.websites.env.production.vhostConfs.leila_chorale = {
-      certName    = "leila";
-      addToCerts  = true;
-      hosts       = [ "chorale.leila.bouya.org" "chorale-vocanta.fr.nf" "www.chorale-vocanta.fr.nf" ];
-      root        = "${varDir}/Chorale";
-      extraConfig = [
-        ''
-        Use Stats chorale.leila.bouya.org
-        <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>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/ludivine/app/default.nix b/modules/private/websites/ludivine/app/default.nix
deleted file mode 100644 (file)
index 323b6e0..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-{ environment, varDir, secretsPath
-, composerEnv, fetchurl, fetchgit, imagemagick, sass, ruby, sources }:
-let
-  app = composerEnv.buildPackage (
-    import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
-    rec {
-      name = "${pname}-${version}";
-      pname = "ludivinecassal";
-      version = sources.websites-ludivine-app.version;
-      src = sources.websites-ludivine-app;
-      noDev = (environment == "prod");
-      preInstall = ''
-        export SYMFONY_ENV="${environment}"
-        cp app/config/parameters.yml.dist app/config/parameters.yml
-        cat >> app/config/parameters.yml <<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
diff --git a/modules/private/websites/ludivine/app/php-packages.nix b/modules/private/websites/ludivine/app/php-packages.nix
deleted file mode 100644 (file)
index 4dd5ef5..0000000
+++ /dev/null
@@ -1,868 +0,0 @@
-# Generated with composer2nix and adapted to return only the list of
-# packages
-{ composerEnv, fetchurl, fetchgit ? null }:
-{
-  packages = {
-    "behat/transliterator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
-        src = fetchurl {
-          url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
-          sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
-        };
-      };
-    };
-    "components/bootstrap" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "components-bootstrap-5d60b2efd3159e1a9e203901849b3493c5aac61f";
-        src = fetchurl {
-          url = https://api.github.com/repos/components/bootstrap/zipball/5d60b2efd3159e1a9e203901849b3493c5aac61f;
-          sha256 = "0jdyxl86dr2lf8az1vby84i7kdn1qcqkp8fy60rs18gav0aqp4fg";
-        };
-      };
-    };
-    "components/jquery" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "components-jquery-459648cda77875519c5da3ae1dd0ed5d170aa649";
-        src = fetchurl {
-          url = https://api.github.com/repos/components/jquery/zipball/459648cda77875519c5da3ae1dd0ed5d170aa649;
-          sha256 = "04jv8yifhwx0cpkw3y3ng0bs2dv77pzrdd640p59rjxwba6r1lbb";
-        };
-      };
-    };
-    "components/jqueryui" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "components-jqueryui-c34f8dbf3ba57b3784b93f26119f436c0e8288e1";
-        src = fetchurl {
-          url = https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1;
-          sha256 = "00nkg6z8g6l3jysyzsfmfxhxqcdsd3jfqib28j8kn2frzx508xv9";
-        };
-      };
-    };
-    "composer/ca-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "composer-ca-bundle-8afa52cd417f4ec417b4bfe86b68106538a87660";
-        src = fetchurl {
-          url = https://api.github.com/repos/composer/ca-bundle/zipball/8afa52cd417f4ec417b4bfe86b68106538a87660;
-          sha256 = "18b0gq29frjf4yhl4sl3i3zbz6zr3qjgsjb8cjdhz65vpb50581p";
-        };
-      };
-    };
-    "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";
-        };
-      };
-    };
-  };
-}
diff --git a/modules/private/websites/ludivine/integration.nix b/modules/private/websites/ludivine/integration.nix
deleted file mode 100644 (file)
index 49aa113..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-{ 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>
-        ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/ludivine/production.nix b/modules/private/websites/ludivine/production.nix
deleted file mode 100644 (file)
index 7a18b88..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  secrets = config.myEnv.websites.ludivine.production;
-  app = pkgs.callPackage ./app {
-    composerEnv = pkgs.composerEnv.override { php = pkgs.php72; };
-    environment = secrets.environment;
-    varDir = "/var/lib/ludivine_production";
-    secretsPath = config.secrets.fullPaths."websites/ludivine/production";
-  };
-  pcfg = config.services.phpApplication;
-  cfg = config.myServices.websites.ludivine.production;
-in {
-  options.myServices.websites.ludivine.production.enable = lib.mkEnableOption "enable Ludivine's website in production";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "ludivinecassal.com"; } ];
-    services.phpApplication.apps.ludivine_production = {
-      websiteEnv = "production";
-      httpdUser = config.services.httpd.Prod.user;
-      httpdGroup = config.services.httpd.Prod.group;
-      inherit (app) webRoot varDir;
-      varDirPaths = {
-        "tmp" = "0700";
-      };
-      inherit app;
-      serviceDeps = [ "mysql.service" ];
-      preStartActions = [
-        "./bin/console --env=${app.environment} cache:clear --no-warmup"
-      ];
-      phpOpenbasedir = [ "/tmp" ];
-      phpPool = {
-        "php_admin_value[upload_max_filesize]" = "20M";
-        "php_admin_value[post_max_size]" = "20M";
-        #"php_admin_flag[log_errors]" = "on";
-        "pm" = "dynamic";
-        "pm.max_children" = "20";
-        "pm.start_servers" = "2";
-        "pm.min_spare_servers" = "1";
-        "pm.max_spare_servers" = "3";
-      };
-      phpWatchFiles = [
-        config.secrets.fullPaths."websites/ludivine/production"
-      ];
-      phpEnv = {
-        PATH = lib.makeBinPath [
-          # below ones don't need to be in the PATH but they’re used in
-          # secrets
-          pkgs.imagemagick pkgs.sass pkgs.ruby
-        ];
-      };
-      phpPackage = pkgs.php72;
-    };
-
-    secrets.keys."websites/ludivine/production" = {
-      user = config.services.httpd.Prod.user;
-      group = config.services.httpd.Prod.group;
-      permissions = "0400";
-      text = ''
-        # This file is auto-generated during the composer install
-        parameters:
-            database_host: ${secrets.mysql.host}
-            database_port: ${secrets.mysql.port}
-            database_name: ${secrets.mysql.database}
-            database_user: ${secrets.mysql.user}
-            database_password: ${secrets.mysql.password}
-            database_server_version: ${pkgs.mariadb.mysqlVersion}
-            mailer_transport: smtp
-            mailer_host: 127.0.0.1
-            mailer_user: null
-            mailer_password: null
-            secret: ${secrets.secret}
-            ldap_host: ldap.immae.eu
-            ldap_port: 636
-            ldap_version: 3
-            ldap_ssl: true
-            ldap_tls: false
-            ldap_user_bind: 'uid={username},ou=users,dc=immae,dc=eu'
-            ldap_base_dn: 'dc=immae,dc=eu'
-            ldap_search_dn: '${secrets.ldap.dn}'
-            ldap_search_password: '${secrets.ldap.password}'
-            ldap_search_filter: '${secrets.ldap.filter}'
-        leapt_im:
-            binary_path: ${pkgs.imagemagick}/bin
-        assetic:
-            sass: ${pkgs.sass}/bin/sass
-            ruby: ${pkgs.ruby}/bin/ruby
-      '';
-    };
-
-    services.websites.env.production.vhostConfs.ludivine_production = {
-      certName     = "ludivine";
-      certMainHost = "ludivinecassal.com";
-      hosts        = ["ludivinecassal.com" "www.ludivinecassal.com" ];
-      root         = app.webRoot;
-      extraConfig  = [
-        ''
-        RewriteEngine on
-        RewriteCond "%{HTTP_HOST}" "!^ludivinecassal\.com$" [NC]
-        RewriteRule ^(.+)$ https://ludivinecassal.com$1 [R=302,L]
-
-        <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>
-        ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/nassime/production.nix b/modules/private/websites/nassime/production.nix
deleted file mode 100644 (file)
index 1179351..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  cfg = config.myServices.websites.nassime.production;
-  varDir = "/var/lib/ftp/nassime";
-  env = config.myEnv.websites.nassime;
-  domain = "nassime.bouya.org";
-in {
-  options.myServices.websites.nassime.production.enable = lib.mkEnableOption "enable Nassime's website";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = domain; } ];
-
-    security.acme.certs."ftp".extraDomains."${domain}" = null;
-
-    services.websites.env.production.vhostConfs.nassime = {
-      certName     = "nassime";
-      certMainHost = domain;
-      hosts        = [ domain ];
-      root         = varDir;
-      extraConfig  = [
-        ''
-        Use Stats ${domain}
-        ServerAdmin ${env.server_admin}
-
-        <Directory ${varDir}>
-          DirectoryIndex index.htm index.html
-          Options Indexes FollowSymLinks MultiViews Includes
-          AllowOverride None
-          Require all granted
-        </Directory>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/nath/villon.nix b/modules/private/websites/nath/villon.nix
deleted file mode 100644 (file)
index 57a1df5..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  cfg = config.myServices.websites.nath.villon;
-  varDir = "/var/lib/ftp/nath";
-  env = config.myEnv.websites.nath;
-  domain = "sntvillon.immae.eu";
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-in {
-  options.myServices.websites.nath.villon.enable = lib.mkEnableOption "enable Nath's website";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = domain; } ];
-
-    system.activationScripts.nath_villon = {
-      deps = [ "users" ];
-      text = ''
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${varDir}
-      '';
-    };
-    security.acme.certs."ftp".extraDomains."${domain}" = null;
-
-    services.websites.env.production.vhostConfs.nath_villon = {
-      certName     = "nath";
-      certMainHost = domain;
-      hosts        = [ domain ];
-      root         = varDir;
-      extraConfig  = [
-        ''
-        Use Stats ${domain}
-
-        <Directory ${varDir}>
-          DirectoryIndex index.htm index.html
-          Options Indexes FollowSymLinks MultiViews Includes
-          AllowOverride None
-          Require all granted
-        </Directory>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/papa/maison_bbc.nix b/modules/private/websites/papa/maison_bbc.nix
deleted file mode 100644 (file)
index 3eb736e..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-{ lib, config, ... }:
-let
-  cfg = config.myServices.websites.papa.maison_bbc;
-in {
-  options.myServices.websites.papa.maison_bbc.enable = lib.mkEnableOption "enable Papa Maison bbc website";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "maison.bbc.bouya.org"; } ];
-
-    services.websites.env.production.vhostConfs.papa_maison_bbc = {
-      certName     = "papa";
-      addToCerts   = true;
-      hosts        = [ "maison.bbc.bouya.org" ];
-      root         = ./maison_bbc_static;
-      extraConfig  = [
-        ''
-        ErrorDocument 404 /index.html
-        <Directory ${./maison_bbc_static}>
-          DirectoryIndex index.htm index.html
-          AllowOverride None
-          Require all granted
-        </Directory>
-          ''
-      ];
-    };
-  };
-}
-
diff --git a/modules/private/websites/papa/maison_bbc_static/data.json b/modules/private/websites/papa/maison_bbc_static/data.json
deleted file mode 100644 (file)
index 1784d27..0000000
+++ /dev/null
@@ -1,4101 +0,0 @@
-{
-  "mean_consumption": {
-    "data": [
-      {
-        "x": "2010-01-01 00:00:00",
-        "y": 0
-      },
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 0.3
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 0.3
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2014-10-01 00:00:00",
-        "y": 0.7
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 8.1
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 8.8
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 8.2
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 7.2
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 1.2
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 0
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 0
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 0
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 0
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 0
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 0
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 0
-      },
-      {
-        "x": "2016-09-01 00:00:00",
-        "y": 0
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2018-01-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2018-02-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2018-04-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2018-05-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2018-06-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2018-07-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2018-08-01 00:00:00",
-        "y": 0.8
-      },
-      {
-        "x": "2019-03-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2019-04-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2019-05-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2019-06-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2019-07-01 00:00:00",
-        "y": 0.4
-      },
-      {
-        "x": "2019-08-01 00:00:00",
-        "y": 0.6
-      },
-      {
-        "x": "2020-03-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2020-04-01 00:00:00",
-        "y": 0.5
-      },
-      {
-        "x": "2020-05-01 00:00:00",
-        "y": 0.5
-      }
-    ],
-    "name": "Consommation moyenne",
-    "unit": "kW",
-    "hide": false
-  },
-  "total_consumption": {
-    "data": [
-      {
-        "x": "2010-01-01 00:00:00",
-        "y": 74.8
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 629
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 859.3
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 1150.7
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 1440.1
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 1829.6
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 2218.6
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 468.7
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 2924.1
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": -3217.1
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": -2847.2
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 224.6
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 536.5
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 882
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 1207.7
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 1565.4
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 1924.1
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 2323.5
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 2754.8
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 3176.7
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 3530.1
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 3975
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 4364.8
-      },
-      {
-        "x": "2014-10-01 00:00:00",
-        "y": 1485.8
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 9.3
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 6
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 10
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 10.9
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 13.1
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 1.6
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 2.1
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 2.8
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 2.2
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 2.8
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 0
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 2.1
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 43.2
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 78.6
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 118.2
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 155.2
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 203.1
-      },
-      {
-        "x": "2016-09-01 00:00:00",
-        "y": 213.7
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 4567.8
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 46.2
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 404.3
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 711.3
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 1098.7
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 1365.4
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 1705.3
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 2041.5
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 2400.8
-      },
-      {
-        "x": "2018-01-01 00:00:00",
-        "y": 2816.8
-      },
-      {
-        "x": "2018-02-01 00:00:00",
-        "y": 3236.5
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 3610
-      },
-      {
-        "x": "2018-04-01 00:00:00",
-        "y": 4047.8
-      },
-      {
-        "x": "2018-05-01 00:00:00",
-        "y": 4447.2
-      },
-      {
-        "x": "2018-06-01 00:00:00",
-        "y": 4704.1
-      },
-      {
-        "x": "2018-07-01 00:00:00",
-        "y": 260.9
-      },
-      {
-        "x": "2018-08-01 00:00:00",
-        "y": 502.7
-      },
-      {
-        "x": "2019-03-01 00:00:00",
-        "y": 896.9
-      },
-      {
-        "x": "2019-04-01 00:00:00",
-        "y": 1268.4
-      },
-      {
-        "x": "2019-05-01 00:00:00",
-        "y": 1625.5
-      },
-      {
-        "x": "2019-06-01 00:00:00",
-        "y": 1944.8
-      },
-      {
-        "x": "2019-07-01 00:00:00",
-        "y": 2256.8
-      },
-      {
-        "x": "2019-08-01 00:00:00",
-        "y": 2714.7
-      },
-      {
-        "x": "2020-03-01 00:00:00",
-        "y": 314.9
-      },
-      {
-        "x": "2020-04-01 00:00:00",
-        "y": 679.7
-      },
-      {
-        "x": "2020-05-01 00:00:00",
-        "y": 1084.7
-      }
-    ],
-    "name": "Consommation totale",
-    "unit": "kWh",
-    "hide": false
-  },
-  "Chambre_RDC_temperature": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 22.3
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 25.1
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 22.6
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 20.7
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 18
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 20
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 20.1
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 15.6
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 20.3
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 18.1
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 21.5
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 22.3
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 25.1
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 21.4
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 20.3
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 20.4
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 20.5
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 19.8
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 20.6
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 21.3
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 21.9
-      },
-      {
-        "x": "2014-06-01 00:00:00",
-        "y": 25
-      },
-      {
-        "x": "2014-10-01 00:00:00",
-        "y": 22.4
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 20.6
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 18.2
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 20
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 20
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 19.6
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 21.4
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 20.4
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 24.2
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 24.5
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 23.6
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 22.2
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 20.9
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 20.6
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 19.5
-      },
-      {
-        "x": "2016-01-01 00:00:00",
-        "y": 19.8
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 20.4
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 19.8
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 19.5
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 21.3
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 22.9
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 24.4
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 24
-      },
-      {
-        "x": "2016-09-01 00:00:00",
-        "y": 23.5
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 21.1
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 20.6
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 22.2
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 23.7
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 23.9
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 23.4
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 22.9
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 22
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 19.7
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 20
-      },
-      {
-        "x": "2018-01-01 00:00:00",
-        "y": 20
-      },
-      {
-        "x": "2018-02-01 00:00:00",
-        "y": 20.2
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 19.9
-      },
-      {
-        "x": "2018-04-01 00:00:00",
-        "y": 21.1
-      },
-      {
-        "x": "2018-05-01 00:00:00",
-        "y": 22.3
-      },
-      {
-        "x": "2018-06-01 00:00:00",
-        "y": 23.5
-      },
-      {
-        "x": "2018-07-01 00:00:00",
-        "y": 23.8
-      },
-      {
-        "x": "2018-08-01 00:00:00",
-        "y": 23.5
-      },
-      {
-        "x": "2019-03-01 00:00:00",
-        "y": 21.7
-      },
-      {
-        "x": "2019-04-01 00:00:00",
-        "y": 21.7
-      },
-      {
-        "x": "2019-05-01 00:00:00",
-        "y": 21.7
-      },
-      {
-        "x": "2019-06-01 00:00:00",
-        "y": 23.6
-      },
-      {
-        "x": "2019-07-01 00:00:00",
-        "y": 24.4
-      },
-      {
-        "x": "2019-08-01 00:00:00",
-        "y": 23.3
-      },
-      {
-        "x": "2020-03-01 00:00:00",
-        "y": 22
-      }
-    ],
-    "name": "Chambre_RDC",
-    "unit": "°C",
-    "hide": false
-  },
-  "Exterieure_temperature": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 18.6
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 20.2
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 24.7
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 23.2
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 21.7
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 13.3
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 6.1
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 3.3
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 1.9
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 6.6
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 10.2
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 11.2
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 16.9
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 28.9
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 16.9
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 5.9
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 4.5
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 6.9
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 6.8
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 8.3
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 11.6
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 12
-      },
-      {
-        "x": "2014-06-01 00:00:00",
-        "y": 17.3
-      },
-      {
-        "x": "2014-10-01 00:00:00",
-        "y": 13.5
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 9.9
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 4.5
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 4.4
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 4.4
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 7.7
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 12.4
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 14.1
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 18.8
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 21.5
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 20.7
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 14.3
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 10.4
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 9.3
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 7.7
-      },
-      {
-        "x": "2016-01-01 00:00:00",
-        "y": 6
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 5.6
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 6.6
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 9.6
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 14.5
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 17.9
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 21.3
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 20.4
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 14.2
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 9.7
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 16.8
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 23.9
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 21.4
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 20.7
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 15.8
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 14.2
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 7.5
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 4.2
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 10.2
-      },
-      {
-        "x": "2018-04-01 00:00:00",
-        "y": 17.6
-      },
-      {
-        "x": "2018-05-01 00:00:00",
-        "y": 16.1
-      },
-      {
-        "x": "2018-06-01 00:00:00",
-        "y": 22.4
-      },
-      {
-        "x": "2018-07-01 00:00:00",
-        "y": 30
-      },
-      {
-        "x": "2018-08-01 00:00:00",
-        "y": 19.8
-      }
-    ],
-    "name": "Exterieure",
-    "unit": "°C",
-    "hide": false
-  },
-  "Sejour_temperature": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 22.8
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 23
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 25.3
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 23.3
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 21.7
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 19.9
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 20.1
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 20
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 15.8
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 20.5
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 20.8
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 20.9
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 22
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 25
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 22.9
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 21.5
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 20.3
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 20.7
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 20.6
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 19.9
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 21.2
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 21.7
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 22.3
-      },
-      {
-        "x": "2014-06-01 00:00:00",
-        "y": 25.6
-      },
-      {
-        "x": "2014-10-01 00:00:00",
-        "y": 22.8
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 20.9
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 18
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 20
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 20
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 19.6
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 21.8
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 20.5
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 24.4
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 21.6
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 23.9
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 23.1
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 21.4
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 21.1
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 20.1
-      },
-      {
-        "x": "2016-01-01 00:00:00",
-        "y": 20.1
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 20.3
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 20.2
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 19.7
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 21.6
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 23.2
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 24.7
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 24.5
-      },
-      {
-        "x": "2016-09-01 00:00:00",
-        "y": 23.7
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 21.7
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 21
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 22.6
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 24
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 24.3
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 23.7
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 23.3
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 22.6
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 20.3
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 19.9
-      },
-      {
-        "x": "2018-01-01 00:00:00",
-        "y": 19.9
-      },
-      {
-        "x": "2018-02-01 00:00:00",
-        "y": 19.9
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 20.3
-      },
-      {
-        "x": "2018-04-01 00:00:00",
-        "y": 21.6
-      },
-      {
-        "x": "2018-05-01 00:00:00",
-        "y": 22.6
-      },
-      {
-        "x": "2018-06-01 00:00:00",
-        "y": 23.8
-      },
-      {
-        "x": "2018-07-01 00:00:00",
-        "y": 23.9
-      },
-      {
-        "x": "2018-08-01 00:00:00",
-        "y": 23.7
-      },
-      {
-        "x": "2019-03-01 00:00:00",
-        "y": 23.3
-      },
-      {
-        "x": "2019-04-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2019-05-01 00:00:00",
-        "y": 22.2
-      },
-      {
-        "x": "2019-06-01 00:00:00",
-        "y": 23.8
-      },
-      {
-        "x": "2019-07-01 00:00:00",
-        "y": 24.6
-      },
-      {
-        "x": "2019-08-01 00:00:00",
-        "y": 23.3
-      },
-      {
-        "x": "2020-03-01 00:00:00",
-        "y": 23.5
-      }
-    ],
-    "name": "Sejour",
-    "unit": "°C",
-    "hide": false
-  },
-  "Garage_temperature": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 20.2
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 19.4
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 22.2
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 17
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 13.8
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 9.2
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 7.6
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 5.3
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 3.4
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 7.3
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 10.7
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 12.4
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 17.2
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 23
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 20.2
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 17.1
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 14.5
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 8.2
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 5.9
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 7.9
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 7.6
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 9
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 12.6
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 14.2
-      },
-      {
-        "x": "2014-06-01 00:00:00",
-        "y": 21.5
-      },
-      {
-        "x": "2014-10-01 00:00:00",
-        "y": 14.6
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 11.2
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 6.7
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 6.3
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 5.1
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 8.6
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 13.3
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 14.2
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 20.9
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 23.2
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 21.8
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 16.3
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 12.5
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 10.8
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 7.5
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 55.6
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 8
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 11.4
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 15.2
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 18.5
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 21.3
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 22.6
-      },
-      {
-        "x": "2016-09-01 00:00:00",
-        "y": 18.8
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 15.2
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 11.5
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 16.7
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 21.7
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 21.5
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 21.1
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 16.4
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 14.2
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 9
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 7
-      },
-      {
-        "x": "2018-01-01 00:00:00",
-        "y": 9.3
-      },
-      {
-        "x": "2018-02-01 00:00:00",
-        "y": 4
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 9.4
-      },
-      {
-        "x": "2018-04-01 00:00:00",
-        "y": 12.9
-      },
-      {
-        "x": "2019-03-01 00:00:00",
-        "y": 13.9
-      },
-      {
-        "x": "2019-04-01 00:00:00",
-        "y": 14.1
-      },
-      {
-        "x": "2019-05-01 00:00:00",
-        "y": 16.4
-      },
-      {
-        "x": "2019-06-01 00:00:00",
-        "y": 24
-      },
-      {
-        "x": "2019-07-01 00:00:00",
-        "y": 24.2
-      },
-      {
-        "x": "2020-03-01 00:00:00",
-        "y": 21.3
-      },
-      {
-        "x": "2020-05-01 00:00:00",
-        "y": 21
-      }
-    ],
-    "name": "Garage",
-    "unit": "°C",
-    "hide": true
-  },
-  "Soufflage_temperature": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 22
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 22.3
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 24.1
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 20.7
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 18.1
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 14.6
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 16.5
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 16.7
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 13.4
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 18.2
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 19.8
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 20.4
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 24.9
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 22.8
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 22.3
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 20.2
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 17
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 17.8
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 18.3
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 17.8
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 19.1
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 20.7
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 24.1
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 6.6
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 6.4
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 4.8
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 9.9
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 15.3
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 15.8
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 20.1
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 21.8
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 21.9
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 17.1
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 13.2
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 12.8
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 11.1
-      },
-      {
-        "x": "2016-01-01 00:00:00",
-        "y": 11.7
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 11.3
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 24.2
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 18.5
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 22.2
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 24.2
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 23.8
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 23
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 20.9
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 19.3
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 14.6
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 14.9
-      },
-      {
-        "x": "2018-01-01 00:00:00",
-        "y": 16.4
-      },
-      {
-        "x": "2018-02-01 00:00:00",
-        "y": 13.5
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 14.7
-      }
-    ],
-    "name": "Soufflage",
-    "unit": "°C",
-    "hide": true
-  },
-  "Mezzanine_temperature": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 23.3
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 23.5
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 25.9
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 23.1
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 21.5
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 19.7
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 19.4
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 19
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 15.3
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 19.9
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 20.5
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 20.8
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 22.2
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 25.7
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 23.1
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 23
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 21.5
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 19.5
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 20
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 20
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 19.6
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 21.1
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 21.6
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 22.3
-      },
-      {
-        "x": "2014-06-01 00:00:00",
-        "y": 25.9
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 21.3
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 20.9
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 19.9
-      },
-      {
-        "x": "2016-01-01 00:00:00",
-        "y": 19.6
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 17.6
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 19.9
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 19.5
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 21.6
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 23.5
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 25.4
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 25.1
-      },
-      {
-        "x": "2016-09-01 00:00:00",
-        "y": 24.2
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 21.8
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 20.6
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 22.8
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 24.9
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 24.9
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 24.2
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 23.2
-      },
-      {
-        "x": "2019-03-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2019-04-01 00:00:00",
-        "y": 22.6
-      },
-      {
-        "x": "2019-05-01 00:00:00",
-        "y": 22.2
-      },
-      {
-        "x": "2019-06-01 00:00:00",
-        "y": 24.4
-      },
-      {
-        "x": "2019-07-01 00:00:00",
-        "y": 25.6
-      },
-      {
-        "x": "2019-08-01 00:00:00",
-        "y": 23.9
-      }
-    ],
-    "name": "Mezzanine",
-    "unit": "°C",
-    "hide": false
-  },
-  "Extraction_temperature": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 22
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 22.4
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 24.6
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 21.7
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 19.2
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 17.3
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 18.4
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 20.3
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 16.2
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 20.8
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 21.4
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 21.7
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 25.5
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 21.3
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 19.3
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 20.6
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 20.8
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 18.8
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": -90.2
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 24
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 20.4
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 24.4
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 24.7
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 23.7
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 22.8
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 21.8
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 17.9
-      }
-    ],
-    "name": "Extraction",
-    "unit": "°C",
-    "hide": true
-  },
-  "Bureau_temperature": {
-    "data": [
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 26
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 26.3
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 24.8
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 24.4
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 23.6
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 23.9
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 18
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 23.2
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 22.6
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 22.6
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 26.1
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 23.9
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 23.5
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 22.2
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 23.7
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 23.9
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 23.5
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 22.8
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 22.9
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 23.6
-      },
-      {
-        "x": "2014-06-01 00:00:00",
-        "y": 27
-      },
-      {
-        "x": "2014-10-01 00:00:00",
-        "y": 24
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 22.5
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 20.9
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 23.5
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 23.7
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 22.4
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 23.3
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 23.2
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 26
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 26.3
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 24.3
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 23.7
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 22.6
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 22.5
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 22
-      },
-      {
-        "x": "2016-01-01 00:00:00",
-        "y": 22.8
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 20.8
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 22.8
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 22.1
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 23.1
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 24.4
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 26.3
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 26
-      },
-      {
-        "x": "2016-09-01 00:00:00",
-        "y": 24.9
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 22.9
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 23.9
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 24.6
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 25.2
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 33.8
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 38.6
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 35.3
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 35.2
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 36.2
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 24.3
-      },
-      {
-        "x": "2018-01-01 00:00:00",
-        "y": 23.6
-      },
-      {
-        "x": "2018-02-01 00:00:00",
-        "y": 24.6
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2018-04-01 00:00:00",
-        "y": 24.8
-      },
-      {
-        "x": "2018-05-01 00:00:00",
-        "y": 26.1
-      },
-      {
-        "x": "2018-06-01 00:00:00",
-        "y": 26.5
-      },
-      {
-        "x": "2018-07-01 00:00:00",
-        "y": 30
-      },
-      {
-        "x": "2018-08-01 00:00:00",
-        "y": 27.5
-      },
-      {
-        "x": "2019-03-01 00:00:00",
-        "y": 25.3
-      },
-      {
-        "x": "2019-04-01 00:00:00",
-        "y": 26.1
-      },
-      {
-        "x": "2019-05-01 00:00:00",
-        "y": 25.2
-      },
-      {
-        "x": "2019-06-01 00:00:00",
-        "y": 27.3
-      },
-      {
-        "x": "2019-07-01 00:00:00",
-        "y": 30.2
-      },
-      {
-        "x": "2019-08-01 00:00:00",
-        "y": 25.6
-      },
-      {
-        "x": "2020-03-01 00:00:00",
-        "y": 36
-      },
-      {
-        "x": "2020-04-01 00:00:00",
-        "y": 35.2
-      },
-      {
-        "x": "2020-05-01 00:00:00",
-        "y": 37.4
-      }
-    ],
-    "name": "Bureau",
-    "unit": "°C",
-    "hide": false
-  },
-  "Temp_Nord_temperature": {
-    "data": [
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 22.9
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 15.4
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 12.8
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 8.5
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 18.1
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 22
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 16.8
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 21.2
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 21.3
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 21.9
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 26.2
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 24.5
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 23.6
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 22
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 22.5
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 22.7
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 22.5
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 20.7
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 21.5
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 22.4
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 23.4
-      },
-      {
-        "x": "2014-06-01 00:00:00",
-        "y": 26.8
-      },
-      {
-        "x": "2014-10-01 00:00:00",
-        "y": 23.7
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 22.1
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 19.2
-      }
-    ],
-    "name": "Temp_Nord",
-    "unit": "°C",
-    "hide": true
-  },
-  "Chambre_RDC_hygrometrie": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 63
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 67
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 62
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 46
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 42
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 44
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 62
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 49
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 45
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 53
-      },
-      {
-        "x": "2014-06-01 00:00:00",
-        "y": 63
-      },
-      {
-        "x": "2014-10-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 43
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 46
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 63
-      },
-      {
-        "x": "2016-01-01 00:00:00",
-        "y": 64
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 53
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 61
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 58
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2016-09-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 51
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 58
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 49
-      },
-      {
-        "x": "2018-01-01 00:00:00",
-        "y": 51
-      },
-      {
-        "x": "2018-02-01 00:00:00",
-        "y": 43
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 44
-      },
-      {
-        "x": "2018-04-01 00:00:00",
-        "y": 49
-      },
-      {
-        "x": "2018-05-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2018-06-01 00:00:00",
-        "y": 61
-      },
-      {
-        "x": "2018-07-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2018-08-01 00:00:00",
-        "y": 51
-      },
-      {
-        "x": "2019-03-01 00:00:00",
-        "y": 41
-      },
-      {
-        "x": "2019-04-01 00:00:00",
-        "y": 43
-      },
-      {
-        "x": "2019-05-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2019-06-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2019-07-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2019-08-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2020-03-01 00:00:00",
-        "y": 51
-      }
-    ],
-    "name": "Chambre_RDC",
-    "unit": "%",
-    "hide": false
-  },
-  "Exterieure_hygrometrie": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 63
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 49
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 53
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 69
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 82
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 85
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 80
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 72
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 67
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 74
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 70
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 40
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 75
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 84
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 74
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 79
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 74
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 65
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 66
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 67
-      },
-      {
-        "x": "2014-06-01 00:00:00",
-        "y": 68
-      },
-      {
-        "x": "2014-10-01 00:00:00",
-        "y": 76
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 79
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 82
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 81
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 70
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 69
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 82
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 68
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 65
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 74
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 75
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 69
-      },
-      {
-        "x": "2016-01-01 00:00:00",
-        "y": 78
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 76
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 67
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 67
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 64
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 68
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 49
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 46
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 41
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 62
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 62
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2018-04-01 00:00:00",
-        "y": 41
-      },
-      {
-        "x": "2018-05-01 00:00:00",
-        "y": 61
-      },
-      {
-        "x": "2018-06-01 00:00:00",
-        "y": 43
-      },
-      {
-        "x": "2018-07-01 00:00:00",
-        "y": 35
-      },
-      {
-        "x": "2018-08-01 00:00:00",
-        "y": 37
-      }
-    ],
-    "name": "Exterieure",
-    "unit": "%",
-    "hide": false
-  },
-  "Sejour_hygrometrie": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 63
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 61
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 45
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 41
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 43
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 45
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 58
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 44
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 51
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 46
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 44
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 45
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 49
-      },
-      {
-        "x": "2014-06-01 00:00:00",
-        "y": 61
-      },
-      {
-        "x": "2014-10-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 46
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 46
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 41
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 45
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 44
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 53
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 49
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2016-01-01 00:00:00",
-        "y": 63
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 49
-      },
-      {
-        "x": "2016-09-01 00:00:00",
-        "y": 51
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 51
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2018-01-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2018-02-01 00:00:00",
-        "y": 41
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 41
-      },
-      {
-        "x": "2018-04-01 00:00:00",
-        "y": 46
-      },
-      {
-        "x": "2018-05-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2018-06-01 00:00:00",
-        "y": 58
-      },
-      {
-        "x": "2018-07-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2018-08-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2019-03-01 00:00:00",
-        "y": 36
-      },
-      {
-        "x": "2019-04-01 00:00:00",
-        "y": 39
-      },
-      {
-        "x": "2019-05-01 00:00:00",
-        "y": 46
-      },
-      {
-        "x": "2019-06-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2019-07-01 00:00:00",
-        "y": 49
-      },
-      {
-        "x": "2019-08-01 00:00:00",
-        "y": 45
-      },
-      {
-        "x": "2020-03-01 00:00:00",
-        "y": 45
-      }
-    ],
-    "name": "Sejour",
-    "unit": "%",
-    "hide": false
-  },
-  "Soufflage_hygrometrie": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 64
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 58
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 71
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 84
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 66
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 40
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 41
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 38
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 39
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 43
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 58
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 40
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 40
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 37
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 45
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 82
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 84
-      },
-      {
-        "x": "2015-02-01 00:00:00",
-        "y": 78
-      },
-      {
-        "x": "2015-03-01 00:00:00",
-        "y": 72
-      },
-      {
-        "x": "2015-04-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2015-05-01 00:00:00",
-        "y": 75
-      },
-      {
-        "x": "2015-06-01 00:00:00",
-        "y": 72
-      },
-      {
-        "x": "2015-07-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2015-08-01 00:00:00",
-        "y": 61
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 61
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 80
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 88
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 90
-      },
-      {
-        "x": "2016-01-01 00:00:00",
-        "y": 96
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 97
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 68
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 64
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 71
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 73
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 74
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 76
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 72
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 72
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 82
-      },
-      {
-        "x": "2017-12-01 00:00:00",
-        "y": 67
-      },
-      {
-        "x": "2018-01-01 00:00:00",
-        "y": 72
-      },
-      {
-        "x": "2018-02-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2018-03-01 00:00:00",
-        "y": 59
-      }
-    ],
-    "name": "Soufflage",
-    "unit": "%",
-    "hide": true
-  },
-  "Mezzanine_hygrometrie": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 64
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 64
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 49
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 43
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 45
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 46
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 53
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 58
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 61
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 51
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 45
-      },
-      {
-        "x": "2014-01-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2014-02-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2014-03-01 00:00:00",
-        "y": 45
-      },
-      {
-        "x": "2014-04-01 00:00:00",
-        "y": 46
-      },
-      {
-        "x": "2014-05-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2014-06-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2015-09-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2015-10-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2015-11-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2015-12-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2016-01-01 00:00:00",
-        "y": 66
-      },
-      {
-        "x": "2016-02-01 00:00:00",
-        "y": 65
-      },
-      {
-        "x": "2016-03-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2016-04-01 00:00:00",
-        "y": 51
-      },
-      {
-        "x": "2016-05-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2016-06-01 00:00:00",
-        "y": 58
-      },
-      {
-        "x": "2016-07-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2016-08-01 00:00:00",
-        "y": 49
-      },
-      {
-        "x": "2016-09-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2019-03-01 00:00:00",
-        "y": 39
-      },
-      {
-        "x": "2019-04-01 00:00:00",
-        "y": 40
-      },
-      {
-        "x": "2019-05-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2019-06-01 00:00:00",
-        "y": 53
-      },
-      {
-        "x": "2019-07-01 00:00:00",
-        "y": 48
-      },
-      {
-        "x": "2019-08-01 00:00:00",
-        "y": 46
-      }
-    ],
-    "name": "Mezzanine",
-    "unit": "%",
-    "hide": false
-  },
-  "Extraction_hygrometrie": {
-    "data": [
-      {
-        "x": "2012-06-01 00:00:00",
-        "y": 64
-      },
-      {
-        "x": "2012-07-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2012-08-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2012-09-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2012-10-01 00:00:00",
-        "y": 65
-      },
-      {
-        "x": "2012-11-01 00:00:00",
-        "y": 77
-      },
-      {
-        "x": "2012-12-01 00:00:00",
-        "y": 62
-      },
-      {
-        "x": "2013-01-01 00:00:00",
-        "y": 43
-      },
-      {
-        "x": "2013-02-01 00:00:00",
-        "y": 40
-      },
-      {
-        "x": "2013-03-01 00:00:00",
-        "y": 40
-      },
-      {
-        "x": "2013-04-01 00:00:00",
-        "y": 42
-      },
-      {
-        "x": "2013-05-01 00:00:00",
-        "y": 45
-      },
-      {
-        "x": "2013-06-01 00:00:00",
-        "y": 52
-      },
-      {
-        "x": "2013-07-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2013-08-01 00:00:00",
-        "y": 57
-      },
-      {
-        "x": "2013-09-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2013-10-01 00:00:00",
-        "y": 58
-      },
-      {
-        "x": "2013-11-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2013-12-01 00:00:00",
-        "y": 39
-      },
-      {
-        "x": "2014-11-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2014-12-01 00:00:00",
-        "y": 47
-      },
-      {
-        "x": "2015-01-01 00:00:00",
-        "y": 89
-      },
-      {
-        "x": "2017-03-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2017-04-01 00:00:00",
-        "y": 50
-      },
-      {
-        "x": "2017-05-01 00:00:00",
-        "y": 56
-      },
-      {
-        "x": "2017-06-01 00:00:00",
-        "y": 59
-      },
-      {
-        "x": "2017-07-01 00:00:00",
-        "y": 58
-      },
-      {
-        "x": "2017-08-01 00:00:00",
-        "y": 60
-      },
-      {
-        "x": "2017-09-01 00:00:00",
-        "y": 55
-      },
-      {
-        "x": "2017-10-01 00:00:00",
-        "y": 54
-      },
-      {
-        "x": "2017-11-01 00:00:00",
-        "y": 57
-      }
-    ],
-    "name": "Extraction",
-    "unit": "%",
-    "hide": true
-  }
-}
diff --git a/modules/private/websites/papa/maison_bbc_static/favicon.ico b/modules/private/websites/papa/maison_bbc_static/favicon.ico
deleted file mode 100644 (file)
index 03990f9..0000000
Binary files a/modules/private/websites/papa/maison_bbc_static/favicon.ico and /dev/null differ
diff --git a/modules/private/websites/papa/maison_bbc_static/index.html b/modules/private/websites/papa/maison_bbc_static/index.html
deleted file mode 100644 (file)
index 78c318c..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-<!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&nbsp;!</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>
-
diff --git a/modules/private/websites/papa/maison_bbc_static/lamaison.png b/modules/private/websites/papa/maison_bbc_static/lamaison.png
deleted file mode 100644 (file)
index dad243c..0000000
Binary files a/modules/private/websites/papa/maison_bbc_static/lamaison.png and /dev/null differ
diff --git a/modules/private/websites/papa/surveillance.nix b/modules/private/websites/papa/surveillance.nix
deleted file mode 100644 (file)
index a8e5149..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  cfg = config.myServices.websites.papa.surveillance;
-  varDir = "/var/lib/ftp/papa";
-  apacheUser = config.services.httpd.Prod.user;
-in {
-  options.myServices.websites.papa.surveillance.enable = lib.mkEnableOption "enable Papa surveillance's website";
-
-  config = lib.mkIf cfg.enable {
-    security.acme.certs."ftp".extraDomains."surveillance.maison.bbc.bouya.org" = null;
-
-    services.cron = {
-      systemCronJobs = let
-        script = pkgs.writeScript "cleanup-papa" ''
-          #!${pkgs.stdenv.shell}
-          d=$(date -d "7 days ago" +%Y%m%d)
-          for i in /var/lib/ftp/papa/*/20[0-9][0-9][0-9][0-9][0-9][0-9]; do
-            if [ "$d" -gt $(basename $i) ]; then
-              rm -rf "$i"
-            fi
-          done
-          '';
-      in
-        [
-        ''
-          0 6 * * * ${apacheUser} ${script}
-        ''
-      ];
-    };
-
-    services.websites.env.production.vhostConfs.papa_surveillance = {
-      certName     = "papa";
-      certMainHost = "surveillance.maison.bbc.bouya.org";
-      hosts        = [ "surveillance.maison.bbc.bouya.org" ];
-      root         = varDir;
-      extraConfig  = [
-        ''
-        Use Apaxy "${varDir}" "title .duplicity-ignore"
-        <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>
-          ''
-      ];
-    };
-  };
-}
-
diff --git a/modules/private/websites/patrick_fodella/altermondia.nix b/modules/private/websites/patrick_fodella/altermondia.nix
deleted file mode 100644 (file)
index 2a41aa3..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  cfg = config.myServices.websites.patrick_fodella.altermondia;
-  varDir = "/var/lib/ftp/patrick_fodella/altermondia";
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-in {
-  options.myServices.websites.patrick_fodella.altermondia.enable = lib.mkEnableOption "enable Patrick Fodella Altermondia's website";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "altermondia.org"; } ];
-
-    system.activationScripts.patrick_fodella_altermondia = {
-      deps = [ "httpd" ];
-      text = ''
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/patrick_fodella_altermondia
-        '';
-    };
-    systemd.services.phpfpm-patrick_fodella_altermondia.after = lib.mkAfter [ "mysql.service" ];
-    systemd.services.phpfpm-patrick_fodella_altermondia.wants = [ "mysql.service" ];
-    services.phpfpm.pools.patrick_fodella_altermondia = {
-      user = apacheUser;
-      group = apacheGroup;
-      settings = {
-        "listen.owner" = apacheUser;
-        "listen.group" = apacheGroup;
-
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-
-        "php_admin_value[open_basedir]" = "/var/lib/php/sessions/patrick_fodella_altermondia:${varDir}:/tmp";
-        "php_admin_value[session.save_path]" = "/var/lib/php/sessions/patrick_fodella_altermondia";
-      };
-      phpOptions = config.services.phpfpm.phpOptions + ''
-        disable_functions = "mail"
-      '';
-      phpPackage = pkgs.php72;
-    };
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-    services.websites.env.production.vhostConfs.patrick_fodella_altermondia = {
-      certName     = "patrick_fodella";
-      addToCerts   = true;
-      hosts        = ["altermondia.org" "www.altermondia.org" ];
-      root         = varDir;
-      extraConfig  = [
-        ''
-        Use Stats altermondia.org
-
-        RewriteEngine on
-        RewriteCond "%{HTTP_HOST}" "!^altermondia\.org$" [NC]
-        RewriteRule ^(.+)$ https://altermondia.org$1 [R=302,L]
-
-        <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>
-          ''
-      ];
-    };
-  };
-}
-
diff --git a/modules/private/websites/patrick_fodella/ecolyeu.nix b/modules/private/websites/patrick_fodella/ecolyeu.nix
deleted file mode 100644 (file)
index 00dab76..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  cfg = config.myServices.websites.patrick_fodella.ecolyeu;
-  varDir = "/var/lib/ftp/patrick_fodella/ecolyeu_pessicart";
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-in {
-  options.myServices.websites.patrick_fodella.ecolyeu.enable = lib.mkEnableOption "enable Patrick Fodella Ecolyeu's website";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "ecolyeu-pessicart-nice.fr"; } ];
-
-    system.activationScripts.patrick_fodella_ecolyeu = {
-      deps = [ "httpd" ];
-      text = ''
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/patrick_fodella_ecolyeu
-        '';
-    };
-    systemd.services.phpfpm-patrick_fodella_ecolyeu.after = lib.mkAfter [ "mysql.service" ];
-    systemd.services.phpfpm-patrick_fodella_ecolyeu.wants = [ "mysql.service" ];
-    services.phpfpm.pools.patrick_fodella_ecolyeu = {
-      user = apacheUser;
-      group = apacheGroup;
-      settings = {
-        "listen.owner" = apacheUser;
-        "listen.group" = apacheGroup;
-
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-
-        "php_admin_value[open_basedir]" = "/var/lib/php/sessions/patrick_fodella_ecolyeu:${varDir}:/tmp";
-        "php_admin_value[session.save_path]" = "/var/lib/php/sessions/patrick_fodella_ecolyeu";
-      };
-      phpOptions = config.services.phpfpm.phpOptions + ''
-        disable_functions = "mail"
-      '';
-      phpPackage = pkgs.php72;
-    };
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-    services.websites.env.production.vhostConfs.patrick_fodella_ecolyeu = {
-      certName     = "patrick_fodella";
-      certMainHost = "ecolyeu-pessicart-nice.fr";
-      hosts        = ["ecolyeu-pessicart-nice.fr" "www.ecolyeu-pessicart-nice.fr" ];
-      root         = varDir;
-      extraConfig  = [
-        ''
-        Use Stats ecolyeu-pessicart-nice.fr
-
-        RewriteEngine on
-        RewriteCond "%{HTTP_HOST}" "!^www\.ecolyeu-pessicart-nice\.fr$" [NC]
-        RewriteRule ^(.+)$ https://www.ecolyeu-pessicart-nice.fr$1 [R=302,L]
-
-        <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>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/piedsjaloux/app/default.nix b/modules/private/websites/piedsjaloux/app/default.nix
deleted file mode 100644 (file)
index 4525a18..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-{ environment, varDir, secretsPath
-, composerEnv, fetchurl, fetchgit, sources }:
-let
-  app = composerEnv.buildPackage (
-    import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
-    rec {
-      version = sources.websites-piedsjaloux-app.version;
-      pname = "piedsjaloux";
-      name = "${pname}-${version}";
-      src = sources.websites-piedsjaloux-app;
-      noDev = (environment == "prod");
-      preInstall = ''
-        export SYMFONY_ENV="${environment}"
-        '';
-      # /!\ miniatures and data need to be in the same physical dir due to a
-      #     bug in leapt.im (searches for data/../miniatures)
-      postInstall = ''
-        cd $out
-        rm app/config/parameters.yml
-        ln -sf ${secretsPath} app/config/parameters.yml
-        rm -rf var/{logs,cache,data,miniatures,tmp}
-        ln -sf ${varDir}/{logs,cache,data,miniatures,tmp} var/
-        '';
-        passthru = {
-          inherit varDir environment secretsPath;
-          webRoot = "${app}/web";
-      };
-    });
-in app
diff --git a/modules/private/websites/piedsjaloux/app/php-packages.nix b/modules/private/websites/piedsjaloux/app/php-packages.nix
deleted file mode 100644 (file)
index 7b99936..0000000
+++ /dev/null
@@ -1,1009 +0,0 @@
-# Generated with composer2nix and adapted to return only the list of
-# packages
-{ composerEnv, fetchurl, fetchgit ? null }:
-{
-  packages = {
-    "behat/transliterator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
-        src = fetchurl {
-          url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
-          sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
-        };
-      };
-    };
-    "components/bootstrap" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "components-bootstrap-5d60b2efd3159e1a9e203901849b3493c5aac61f";
-        src = fetchurl {
-          url = https://api.github.com/repos/components/bootstrap/zipball/5d60b2efd3159e1a9e203901849b3493c5aac61f;
-          sha256 = "0jdyxl86dr2lf8az1vby84i7kdn1qcqkp8fy60rs18gav0aqp4fg";
-        };
-      };
-    };
-    "components/jquery" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "components-jquery-459648cda77875519c5da3ae1dd0ed5d170aa649";
-        src = fetchurl {
-          url = https://api.github.com/repos/components/jquery/zipball/459648cda77875519c5da3ae1dd0ed5d170aa649;
-          sha256 = "04jv8yifhwx0cpkw3y3ng0bs2dv77pzrdd640p59rjxwba6r1lbb";
-        };
-      };
-    };
-    "components/jqueryui" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "components-jqueryui-c34f8dbf3ba57b3784b93f26119f436c0e8288e1";
-        src = fetchurl {
-          url = https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1;
-          sha256 = "00nkg6z8g6l3jysyzsfmfxhxqcdsd3jfqib28j8kn2frzx508xv9";
-        };
-      };
-    };
-    "composer/ca-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "composer-ca-bundle-8afa52cd417f4ec417b4bfe86b68106538a87660";
-        src = fetchurl {
-          url = https://api.github.com/repos/composer/ca-bundle/zipball/8afa52cd417f4ec417b4bfe86b68106538a87660;
-          sha256 = "18b0gq29frjf4yhl4sl3i3zbz6zr3qjgsjb8cjdhz65vpb50581p";
-        };
-      };
-    };
-    "container-interop/container-interop" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "container-interop-container-interop-79cbf1341c22ec75643d841642dd5d6acd83bdb8";
-        src = fetchurl {
-          url = https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8;
-          sha256 = "1pxm461g5flcq50yabr01nw8w17n3g7klpman9ps3im4z0604m52";
-        };
-      };
-    };
-    "dmishh/settings-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "dmishh-settings-bundle-0ee48b015691694a8dcbd3ee654d33386e7bf478";
-        src = fetchurl {
-          url = https://api.github.com/repos/dmishh/SettingsBundle/zipball/0ee48b015691694a8dcbd3ee654d33386e7bf478;
-          sha256 = "0m2fw5shvnkqlz0nm27ggpmkipfh377y1hjsw343zv1nn72nxfqf";
-        };
-      };
-    };
-    "doctrine/annotations" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5;
-          sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7";
-        };
-      };
-    };
-    "doctrine/cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57;
-          sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i";
-        };
-      };
-    };
-    "doctrine/collections" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf;
-          sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis";
-        };
-      };
-    };
-    "doctrine/common" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d;
-          sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na";
-        };
-      };
-    };
-    "doctrine/dbal" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9;
-          sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj";
-        };
-      };
-    };
-    "doctrine/doctrine-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d;
-          sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3";
-        };
-      };
-    };
-    "doctrine/doctrine-cache-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927;
-          sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa";
-        };
-      };
-    };
-    "doctrine/doctrine-migrations-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce;
-          sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn";
-        };
-      };
-    };
-    "doctrine/event-manager" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3;
-          sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88";
-        };
-      };
-    };
-    "doctrine/inflector" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a;
-          sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5";
-        };
-      };
-    };
-    "doctrine/instantiator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda;
-          sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy";
-        };
-      };
-    };
-    "doctrine/lexer" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
-          sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
-        };
-      };
-    };
-    "doctrine/migrations" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6;
-          sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld";
-        };
-      };
-    };
-    "doctrine/orm" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8;
-          sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls";
-        };
-      };
-    };
-    "doctrine/persistence" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38;
-          sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7";
-        };
-      };
-    };
-    "doctrine/reflection" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6;
-          sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy";
-        };
-      };
-    };
-    "eko/feedbundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "eko-feedbundle-d4e626616d9ccf6527212d3bdda15f9af3838e4f";
-        src = fetchurl {
-          url = https://api.github.com/repos/eko/FeedBundle/zipball/d4e626616d9ccf6527212d3bdda15f9af3838e4f;
-          sha256 = "145f4mq2bpsdayaiqmgz1asmjx2is4v327h2ny2wp03knnkjvnfq";
-        };
-      };
-    };
-    "fig/link-util" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac;
-          sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64";
-        };
-      };
-    };
-    "gedmo/doctrine-extensions" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27";
-        src = fetchurl {
-          url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27;
-          sha256 = "1i33xy9s18rncc1fllwi2qi7hrxj8g762fvgl9np7xndxa7kclyb";
-        };
-      };
-    };
-    "gregwar/captcha" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "gregwar-captcha-cf953dd79748406e0292cea8c565399681e4d345";
-        src = fetchurl {
-          url = https://api.github.com/repos/Gregwar/Captcha/zipball/cf953dd79748406e0292cea8c565399681e4d345;
-          sha256 = "153m7bkhs3drxk0jfbq67a8vr1m13g7isc4ck44k5hyfzpcazb5i";
-        };
-      };
-    };
-    "gregwar/captcha-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "gregwar-captcha-bundle-c2d5468556890dd25e0b53bd345fc205562c86f7";
-        src = fetchurl {
-          url = https://api.github.com/repos/Gregwar/CaptchaBundle/zipball/c2d5468556890dd25e0b53bd345fc205562c86f7;
-          sha256 = "04wcvqq457h6v7mzmrar946swd9akk27fmfig4qj8hpxzj250cgk";
-        };
-      };
-    };
-    "helios-ag/fm-bbcode-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "helios-ag-fm-bbcode-bundle-d88ff5ca6c0ab71ec094d5a7d56b0bc8bc100363";
-        src = fetchurl {
-          url = https://api.github.com/repos/helios-ag/FMBbCodeBundle/zipball/d88ff5ca6c0ab71ec094d5a7d56b0bc8bc100363;
-          sha256 = "13g9ddd2p3nf1vrbkf6l00qdqz89rq6d8l20p68dmiy7mb6kpynl";
-        };
-      };
-    };
-    "immae/piedsjaloux-ckeditor-component" = {
-      targetDir = "";
-      src = fetchgit {
-        name = "immae-piedsjaloux-ckeditor-component-9946db9daaa76448d0e43247472cdedd2a5ea22a";
-        url = "https://git.immae.eu/perso/Immae/Projets/packagist/piedsjaloux-ckeditor-component.git";
-        rev = "9946db9daaa76448d0e43247472cdedd2a5ea22a";
-        sha256 = "183rgl23li3bqsynfmvv2s7jvlmqf6a5pskgrcxlaxcrr0d09n8c";
-      };
-    };
-    "incenteev/composer-parameter-handler" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550";
-        src = fetchurl {
-          url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550;
-          sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm";
-        };
-      };
-    };
-    "jdorn/sql-formatter" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
-        src = fetchurl {
-          url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
-          sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
-        };
-      };
-    };
-    "kriswallsmith/assetic" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1";
-        src = fetchurl {
-          url = https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1;
-          sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8";
-        };
-      };
-    };
-    "leapt/im-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "leapt-im-bundle-83442778d118f6edb537b93f9746c3a97e56c3d1";
-        src = fetchurl {
-          url = https://api.github.com/repos/leapt/im-bundle/zipball/83442778d118f6edb537b93f9746c3a97e56c3d1;
-          sha256 = "1gm4ih3v1j0xjm7mrpspd3yacdwvbqgag22cyqmix0hc9hw3pc6a";
-        };
-      };
-    };
-    "luxifer/doctrine-functions" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "luxifer-doctrine-functions-e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c";
-        src = fetchurl {
-          url = https://api.github.com/repos/luxifer/doctrine-functions/zipball/e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c;
-          sha256 = "1sw4826nvs5q0y2na9m26rbxfiaw0kfqwhky7x7apicgx5adqfa9";
-        };
-      };
-    };
-    "mjohnson/decoda" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "mjohnson-decoda-8cd0928b78a4bf5ade48b80c934370fc1f5f84a1";
-        src = fetchurl {
-          url = https://api.github.com/repos/milesj/decoda/zipball/8cd0928b78a4bf5ade48b80c934370fc1f5f84a1;
-          sha256 = "0wcxz9yirz4zir06xvnlchqgppmyasymak06gn46jn6v6c9dsykc";
-        };
-      };
-    };
-    "monolog/monolog" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "monolog-monolog-bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266";
-        src = fetchurl {
-          url = https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266;
-          sha256 = "0h3nnxjf2bdh7nmpqnpij99lqv6bw13r2bx83d8vn5zvblwg5png";
-        };
-      };
-    };
-    "ocramius/package-versions" = {
-      targetDir = "";
-      needsModifyRights = true;
-      src = composerEnv.buildZipPackage {
-        name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f";
-        src = fetchurl {
-          url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f;
-          sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881";
-        };
-      };
-    };
-    "ocramius/proxy-manager" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1";
-        src = fetchurl {
-          url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1;
-          sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn";
-        };
-      };
-    };
-    "paragonie/random_compat" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "paragonie-random_compat-84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95";
-        src = fetchurl {
-          url = https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95;
-          sha256 = "03nsccdvcb79l64b7lsmx0n8ldf5z3v8niqr7bpp6wg401qp9p09";
-        };
-      };
-    };
-    "psr/cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
-          sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
-        };
-      };
-    };
-    "psr/container" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
-          sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
-        };
-      };
-    };
-    "psr/link" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562;
-          sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13";
-        };
-      };
-    };
-    "psr/log" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd;
-          sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d";
-        };
-      };
-    };
-    "psr/simple-cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
-          sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
-        };
-      };
-    };
-    "robloach/component-installer" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "robloach-component-installer-908a859aa7c4949ba9ad67091e67bac10b66d3d7";
-        src = fetchurl {
-          url = https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7;
-          sha256 = "19y5sv4k338bihzmm8iac6q43r18vxhmbpvrdhz8jn39r51ampq9";
-        };
-      };
-    };
-    "sensio/distribution-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensio-distribution-bundle-59eac70f15f97ee945924948a6f5e2f6f86b7a4b";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/59eac70f15f97ee945924948a6f5e2f6f86b7a4b;
-          sha256 = "05mj4c0ahwg6l2wipyqfyyjjp1m2vvl7ymp61nvwv7zhvqacvljs";
-        };
-      };
-    };
-    "sensio/framework-extra-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensio-framework-extra-bundle-bb907234df776b68922eb4b25bfa061683597b6a";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a;
-          sha256 = "011hcljjcfq5qy4a7mlf0hwqxyb58yci40ini0n5rqandcyk2nck";
-        };
-      };
-    };
-    "sensiolabs/security-checker" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensiolabs-security-checker-46be3f58adac13084497961e10eed9a7fb4d44d1";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/security-checker/zipball/46be3f58adac13084497961e10eed9a7fb4d44d1;
-          sha256 = "1caqf3hdfsajj9nb8fpinvs6apv90g1srwxcyxdnr6a8d6g0p6qi";
-        };
-      };
-    };
-    "swiftmailer/swiftmailer" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "swiftmailer-swiftmailer-181b89f18a90f8925ef805f950d47a7190e9b950";
-        src = fetchurl {
-          url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950;
-          sha256 = "0hkmawv3bhbqdavy4wxqhzajg5zqd7chsi8w27y2zdi5r35az75d";
-        };
-      };
-    };
-    "symfony/assetic-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-assetic-bundle-2e0a23a4874838e26de6f025e02fc63328921a4c";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/assetic-bundle/zipball/2e0a23a4874838e26de6f025e02fc63328921a4c;
-          sha256 = "17rxrkyzxa6x5nn7qhhhdgx4z0nlznnq5fifza4wv9znca8bbwyc";
-        };
-      };
-    };
-    "symfony/monolog-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-monolog-bundle-572e143afc03419a75ab002c80a2fd99299195ff";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/monolog-bundle/zipball/572e143afc03419a75ab002c80a2fd99299195ff;
-          sha256 = "0g8icydnwfbqcbc56pqyc8bv1vp31331w0r75r3hqh225p2j1nd7";
-        };
-      };
-    };
-    "symfony/polyfill-apcu" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-apcu-19e1b73bf255265ad0b568f81766ae2a3266d8d2";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/19e1b73bf255265ad0b568f81766ae2a3266d8d2;
-          sha256 = "0jg33c81kwkpxk0b18jkslz9jkbkxl5k48h6m5b33dm63p1fj05r";
-        };
-      };
-    };
-    "symfony/polyfill-ctype" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-ctype-e3d826245268269cd66f8326bd8bc066687b4a19";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19;
-          sha256 = "16md0qmy5jvvl7lc6n6r5hxjdr5i30vl6n9rpkm4b11rh2nqh7mh";
-        };
-      };
-    };
-    "symfony/polyfill-intl-icu" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644;
-          sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq";
-        };
-      };
-    };
-    "symfony/polyfill-mbstring" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494;
-          sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi";
-        };
-      };
-    };
-    "symfony/polyfill-php56" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-php56-ff208829fe1aa48ab9af356992bb7199fed551af";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ff208829fe1aa48ab9af356992bb7199fed551af;
-          sha256 = "0vmpiwakc7hpbr6jwpk7cqcy41ybgwl6jkn3q8c4ryxynknn5hfk";
-        };
-      };
-    };
-    "symfony/polyfill-php70" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-php70-6b88000cdd431cd2e940caa2cb569201f3f84224";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-php70/zipball/6b88000cdd431cd2e940caa2cb569201f3f84224;
-          sha256 = "08h77r1i2q4pwdd0yk3pfhqqgk0z7gwmkzmvykx9bfv1z7a0h8ik";
-        };
-      };
-    };
-    "symfony/polyfill-util" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-util-3b58903eae668d348a7126f999b0da0f2f93611c";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-util/zipball/3b58903eae668d348a7126f999b0da0f2f93611c;
-          sha256 = "00bb5mgljk6d54nyvd4gmc7mbzfr4b4q7h3rxmv8rzq613wcjp3i";
-        };
-      };
-    };
-    "symfony/swiftmailer-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec;
-          sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01";
-        };
-      };
-    };
-    "symfony/symfony" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-symfony-f6b8ddc362b1cf3fb06548693c3adbb736092412";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/symfony/zipball/f6b8ddc362b1cf3fb06548693c3adbb736092412;
-          sha256 = "0ip7k5xf34w4p1zvv2nkv4nyik3asidk3zlgzyc1v57429z0f28q";
-        };
-      };
-    };
-    "twig/extensions" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "twig-extensions-57873c8b0c1be51caa47df2cdb824490beb16202";
-        src = fetchurl {
-          url = https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202;
-          sha256 = "1sjajjd6vnczvdrl9b8zhzr06l5dflzqiwg9d33d92q8gli4j7jn";
-        };
-      };
-    };
-    "twig/twig" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1";
-        src = fetchurl {
-          url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1;
-          sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n";
-        };
-      };
-    };
-    "zendframework/zend-code" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb;
-          sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1";
-        };
-      };
-    };
-    "zendframework/zend-escaper" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-escaper-31d8aafae982f9568287cb4dce987e6aff8fd074";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-escaper/zipball/31d8aafae982f9568287cb4dce987e6aff8fd074;
-          sha256 = "16gwqh9zpclc3fmf89cf738mxfh36ar3wdf9i0wvby0g0nhknkd7";
-        };
-      };
-    };
-    "zendframework/zend-eventmanager" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd;
-          sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n";
-        };
-      };
-    };
-    "zendframework/zend-feed" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-feed-6641f4cf3f4586c63f83fd70b6d19966025c8888";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-feed/zipball/6641f4cf3f4586c63f83fd70b6d19966025c8888;
-          sha256 = "0wl2pf4cq0snlp3gbl2ia662i48yils464qlfqf7gdmbn1ryzcpi";
-        };
-      };
-    };
-    "zendframework/zend-http" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-http-2c8aed3d25522618573194e7cc51351f8cd4a45b";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-http/zipball/2c8aed3d25522618573194e7cc51351f8cd4a45b;
-          sha256 = "1vy6b24ihwv1g08hjnw4pd7c5171g866jnlr3j6fg0xqv79s4dn9";
-        };
-      };
-    };
-    "zendframework/zend-loader" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-loader-78f11749ea340f6ca316bca5958eef80b38f9b6c";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-loader/zipball/78f11749ea340f6ca316bca5958eef80b38f9b6c;
-          sha256 = "056zp0xchc4ckijg969im5him3j4cji6hsy26fiaycwprniaqdmg";
-        };
-      };
-    };
-    "zendframework/zend-servicemanager" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-servicemanager-a1ed6140d0d3ee803fec96582593ed024950067b";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-servicemanager/zipball/a1ed6140d0d3ee803fec96582593ed024950067b;
-          sha256 = "0s3aplkilrd8b18xh55h9m1yvnp9b6vnlgby4gqhqv8npnxxqir9";
-        };
-      };
-    };
-    "zendframework/zend-stdlib" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-stdlib-66536006722aff9e62d1b331025089b7ec71c065";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-stdlib/zipball/66536006722aff9e62d1b331025089b7ec71c065;
-          sha256 = "0cl0lcgqb5aja6iijp0wrclxra57imwsmhkfpahdl2bsgs1inf2f";
-        };
-      };
-    };
-    "zendframework/zend-uri" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-uri-3b6463645c6766f78ce537c70cb4fdabee1e725f";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-uri/zipball/3b6463645c6766f78ce537c70cb4fdabee1e725f;
-          sha256 = "0zkb88y9qbgshm8ys5yjxhz6a7fhxl7waygwn37pqsbvz74mbbvp";
-        };
-      };
-    };
-    "zendframework/zend-validator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "zendframework-zend-validator-f0789b4c4c099afdd2ecc58cc209a26c64bd4f17";
-        src = fetchurl {
-          url = https://api.github.com/repos/zendframework/zend-validator/zipball/f0789b4c4c099afdd2ecc58cc209a26c64bd4f17;
-          sha256 = "1lwxbr3jlldll4ccw5cn2ny1cbzh279mnfz7m1djqc8qnw16c8jl";
-        };
-      };
-    };
-  };
-  devPackages = {
-    "doctrine/data-fixtures" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-data-fixtures-3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/data-fixtures/zipball/3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a;
-          sha256 = "0wbxhy7hq17laqgnq9x9ygysv0n1kn7s4x3v89pk7iy622pil3sm";
-        };
-      };
-    };
-    "doctrine/doctrine-fixtures-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-doctrine-fixtures-bundle-74b8cc70a4a25b774628ee59f4cdf3623a146273";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273;
-          sha256 = "1bbflq8k6izwqgp9ka2gyb5y96a80b4lnlc5wrgc5gnih7hqidlf";
-        };
-      };
-    };
-    "fzaninotto/faker" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "fzaninotto-faker-d0190b156bcca848d401fb80f31f504f37141c8d";
-        src = fetchurl {
-          url = https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d;
-          sha256 = "1x7xrxw14x7b0iq7sxi9ynswk8ljga62i77ch7xip4dwgq1dypvi";
-        };
-      };
-    };
-    "league/factory-muffin" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "league-factory-muffin-316ed2bac70178567f995d877b831804c9c58d5a";
-        src = fetchurl {
-          url = https://api.github.com/repos/thephpleague/factory-muffin/zipball/316ed2bac70178567f995d877b831804c9c58d5a;
-          sha256 = "1fxh0hsqifmnhgkwyd460x3w9wn74369lmak3f1m24mn2asiynxq";
-        };
-      };
-    };
-    "league/factory-muffin-faker" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "league-factory-muffin-faker-30dbd11bb6be03b47e52bd60006ae198d20ab426";
-        src = fetchurl {
-          url = https://api.github.com/repos/thephpleague/factory-muffin-faker/zipball/30dbd11bb6be03b47e52bd60006ae198d20ab426;
-          sha256 = "0dsimjdnsmzdd4vwjzw1gz1bb4zlhmv66g3fc9k4nj5bqch6mny1";
-        };
-      };
-    };
-    "mikey179/vfsStream" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "mikey179-vfsStream-d5fec95f541d4d71c4823bb5e30cf9b9e5b96145";
-        src = fetchurl {
-          url = https://github.com/bovigo/vfsStream/archive/v1.6.5.zip;
-          sha256 = "16vi7ci8nxq5hxnzzjmmia73gdm55qcwn006c6hgdwa3i58dnr4l";
-        };
-      };
-    };
-    "phpdocumentor/reflection-common" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpdocumentor-reflection-common-21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6";
-        src = fetchurl {
-          url = https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6;
-          sha256 = "1yaf1zg9lnkfnq2ndpviv0hg5bza9vjvv5l4wgcn25lx1p8a94w2";
-        };
-      };
-    };
-    "phpdocumentor/reflection-docblock" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpdocumentor-reflection-docblock-94fd0001232e47129dd3504189fa1c7225010d08";
-        src = fetchurl {
-          url = https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08;
-          sha256 = "03zvxqb5n9ddvysj8mjdwf59h7sagj5x5z15nhs7mqpcky1w388x";
-        };
-      };
-    };
-    "phpdocumentor/type-resolver" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpdocumentor-type-resolver-9c977708995954784726e25d0cd1dddf4e65b0f7";
-        src = fetchurl {
-          url = https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7;
-          sha256 = "0h888r2iy2290yp9i3fij8wd5b7960yi7yn1rwh26x1xxd83n2mb";
-        };
-      };
-    };
-    "phpspec/prophecy" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpspec-prophecy-4ba436b55987b4bf311cb7c6ba82aa528aac0a06";
-        src = fetchurl {
-          url = https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06;
-          sha256 = "0sz9fg8r4yvpgrhsh6qaic3p89pafdj8bdf4izbcccq6mdhclxn6";
-        };
-      };
-    };
-    "phpunit/php-code-coverage" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpunit-php-code-coverage-eabf68b476ac7d0f73793aada060f1c1a9bf8979";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979;
-          sha256 = "0xfkf2kaqrid0ajr8qfh3qnpiqqddl0cmmdy6hd7l9y7ziy6qz8d";
-        };
-      };
-    };
-    "phpunit/php-file-iterator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpunit-php-file-iterator-730b01bc3e867237eaac355e06a36b85dd93a8b4";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4;
-          sha256 = "0kbg907g9hrx7pv8v0wnf4ifqywdgvigq6y6z00lyhgd0b8is060";
-        };
-      };
-    };
-    "phpunit/php-text-template" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpunit-php-text-template-31f8b717e51d9a2afca6c9f046f5d69fc27c8686";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686;
-          sha256 = "1y03m38qqvsbvyakd72v4dram81dw3swyn5jpss153i5nmqr4p76";
-        };
-      };
-    };
-    "phpunit/php-timer" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpunit-php-timer-3dcf38ca72b158baf0bc245e9184d3fdffa9c46f";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f;
-          sha256 = "1j04r0hqzrv6m1jk5nb92k2nnana72nscqpfk3rgv3fzrrv69ljr";
-        };
-      };
-    };
-    "phpunit/php-token-stream" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpunit-php-token-stream-1ce90ba27c42e4e44e6d8458241466380b51fa16";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16;
-          sha256 = "0j1v83m268cddhyzi8qvqfzhpz12hrm3dyw6skyqvljdp7l9x6lk";
-        };
-      };
-    };
-    "phpunit/phpunit" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpunit-phpunit-46023de9a91eec7dfb06cc56cb4e260017298517";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517;
-          sha256 = "0mxhgcmc575hw3n7czindgqiha8jhdi4p19h883vf15fg6xf5iv6";
-        };
-      };
-    };
-    "phpunit/phpunit-mock-objects" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpunit-phpunit-mock-objects-ac8e7a3db35738d56ee9a76e78a4e03d97628983";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983;
-          sha256 = "0s7nyyafdqw2hp7wsd2mxnjxpk26630vv3wii6hcdb0q8xy8r78i";
-        };
-      };
-    };
-    "sebastian/comparator" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sebastian-comparator-2b7424b55f5047b47ac6e5ccb20b2aea4011d9be";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be;
-          sha256 = "0ymarxgnr8b3iy0w18h5z13iiv0ja17vjryryzfcwlqqhlc6w7iq";
-        };
-      };
-    };
-    "sebastian/diff" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sebastian-diff-7f066a26a962dbe58ddea9f72a4e82874a3975a4";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4;
-          sha256 = "1ppx21vjj79z6d584ryq451k7kvdc511awmqjkj9g4vxj1s1h3j6";
-        };
-      };
-    };
-    "sebastian/environment" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sebastian-environment-be2c607e43ce4c89ecd60e75c6a85c126e754aea";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea;
-          sha256 = "0gzgnk847kf18krq4ybbi2knzj7i0kdghsdlj6qynzzrlf7idij0";
-        };
-      };
-    };
-    "sebastian/exporter" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sebastian-exporter-42c4c2eec485ee3e159ec9884f95b431287edde4";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4;
-          sha256 = "1p5mc4lqwxn79v06jjlgqxynblywcxw2mkhbf6r4jlz0bsrqafxn";
-        };
-      };
-    };
-    "sebastian/global-state" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sebastian-global-state-bc37d50fea7d017d3d340f230811c9f1d7280af4";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4;
-          sha256 = "0y1x16mf9q38s7rlc7k2s6sxn2ccxmyk1q5zgh24hr4yp035f0pb";
-        };
-      };
-    };
-    "sebastian/recursion-context" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sebastian-recursion-context-b19cc3298482a335a95f3016d2f8a6950f0fbcd7";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7;
-          sha256 = "1i9xdv55nkg1yy5q4lmpq1jsjif69hjrwmr1zha6b5qjf6ivlvjm";
-        };
-      };
-    };
-    "sebastian/version" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sebastian-version-58b3a85e7999757d6ad81c787a1fbf5ff6c628c6";
-        src = fetchurl {
-          url = https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6;
-          sha256 = "1s71b6ss29pcsm0120myriwnzla1kpj13f3f739c7k1wfm69h4wz";
-        };
-      };
-    };
-    "sensio/generator-bundle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65";
-        src = fetchurl {
-          url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65;
-          sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3";
-        };
-      };
-    };
-    "symfony/phpunit-bridge" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-phpunit-bridge-2155067dfc73e0e77dbc26f236af17e4df552de5";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/2155067dfc73e0e77dbc26f236af17e4df552de5;
-          sha256 = "1fhqyhvns69pkv086d1sp918bakqq9pk9d16nzck2s4pfdf097pj";
-        };
-      };
-    };
-    "webmozart/assert" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "webmozart-assert-83e253c8e0be5b0257b881e1827274667c5c17a9";
-        src = fetchurl {
-          url = https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9;
-          sha256 = "04w7rrjy43k93376an7xhnxqn2ibbw5fra7rqky7j1dl1f0hkn6d";
-        };
-      };
-    };
-  };
-}
diff --git a/modules/private/websites/piedsjaloux/integration.nix b/modules/private/websites/piedsjaloux/integration.nix
deleted file mode 100644 (file)
index 3502964..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  secrets = config.myEnv.websites.piedsjaloux.integration;
-  webRoot = "/var/lib/ftp/immae/piedsjaloux/web";
-  cfg = config.myServices.websites.piedsjaloux.integration;
-  pcfg = config.services.phpApplication;
-  texlive = pkgs.texlive.combine { inherit (pkgs.texlive) attachfile preprint scheme-small; };
-in {
-  options.myServices.websites.piedsjaloux.integration.enable = lib.mkEnableOption "enable PiedsJaloux's website in integration";
-
-  config = lib.mkIf cfg.enable {
-    services.phpApplication.apps.piedsjaloux_integration = {
-      websiteEnv = "integration";
-      httpdUser = config.services.httpd.Inte.user;
-      httpdGroup = config.services.httpd.Inte.group;
-      inherit webRoot;
-      varDir = "/var/lib/ftp/immae/piedsjaloux_var";
-      varDirPaths = {
-        "tmp" = "0700";
-      };
-      app = "/var/lib/ftp/immae/piedsjaloux";
-      serviceDeps = [ "mysql.service" ];
-      preStartActions = [
-        "./bin/console --env=dev cache:clear --no-warmup"
-      ];
-      phpOpenbasedir = [ "/tmp" ];
-      phpPool = {
-        "php_admin_value[upload_max_filesize]" = "20M";
-        "php_admin_value[post_max_size]" = "20M";
-        #"php_admin_flag[log_errors]" = "on";
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-      };
-      phpEnv = {
-        PATH = lib.makeBinPath [
-          pkgs.apg pkgs.unzip
-          # below ones don't need to be in the PATH but they’re used in
-          # secrets
-          pkgs.imagemagick texlive
-        ];
-        SYMFONY_DEBUG_MODE = "\"yes\"";
-      };
-      phpWatchFiles = [
-        config.secrets.fullPaths."websites/piedsjaloux/integration"
-      ];
-      phpPackage = pkgs.php72;
-    };
-
-    secrets.keys."websites/piedsjaloux/integration" = {
-      user = config.services.httpd.Inte.user;
-      group = config.services.httpd.Inte.group;
-      permissions = "0400";
-      text = ''
-        # This file is auto-generated during the composer install
-        parameters:
-            database_host: ${secrets.mysql.host}
-            database_port: ${secrets.mysql.port}
-            database_name: ${secrets.mysql.database}
-            database_user: ${secrets.mysql.user}
-            database_password: ${secrets.mysql.password}
-            database_server_version: ${pkgs.mariadb.mysqlVersion}
-            mailer_transport: smtp
-            mailer_host: 127.0.0.1
-            mailer_user: null
-            mailer_password: null
-            secret: ${secrets.secret}
-            pdflatex: "${texlive}/bin/pdflatex"
-        leapt_im:
-            binary_path: ${pkgs.imagemagick}/bin
-      '';
-    };
-
-    services.websites.env.integration.vhostConfs.piedsjaloux_integration = {
-      certName     = "integration";
-      addToCerts  = true;
-      hosts       = [ "test.pj.immae.dev" ];
-      root        = webRoot;
-      extraConfig = [
-        ''
-        <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>
-        ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/piedsjaloux/production.nix b/modules/private/websites/piedsjaloux/production.nix
deleted file mode 100644 (file)
index 422c7f0..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  secrets = config.myEnv.websites.piedsjaloux.production;
-  app = pkgs.callPackage ./app {
-    composerEnv = pkgs.composerEnv.override { php = pkgs.php72; };
-    environment = secrets.environment;
-    varDir = "/var/lib/piedsjaloux_production";
-    secretsPath = config.secrets.fullPaths."websites/piedsjaloux/production";
-  };
-  cfg = config.myServices.websites.piedsjaloux.production;
-  pcfg = config.services.phpApplication;
-  texlive = pkgs.texlive.combine { inherit (pkgs.texlive) attachfile preprint scheme-small; };
-in {
-  options.myServices.websites.piedsjaloux.production.enable = lib.mkEnableOption "enable PiedsJaloux's website in production";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "piedsjaloux.fr"; } ];
-    services.phpApplication.apps.piedsjaloux_production = {
-      websiteEnv = "production";
-      httpdUser = config.services.httpd.Prod.user;
-      httpdGroup = config.services.httpd.Prod.group;
-      inherit (app) webRoot varDir;
-      varDirPaths = {
-        "tmp" = "0700";
-      };
-      inherit app;
-      serviceDeps = [ "mysql.service" ];
-      preStartActions = [
-        "./bin/console --env=${app.environment} cache:clear --no-warmup"
-      ];
-      phpOpenbasedir = [ "/tmp" ];
-      phpPool = {
-        "php_admin_value[upload_max_filesize]" = "20M";
-        "php_admin_value[post_max_size]" = "20M";
-        #"php_admin_flag[log_errors]" = "on";
-        "pm" = "dynamic";
-        "pm.max_children" = "20";
-        "pm.start_servers" = "2";
-        "pm.min_spare_servers" = "1";
-        "pm.max_spare_servers" = "3";
-      };
-      phpEnv = {
-        PATH = lib.makeBinPath [
-          pkgs.apg pkgs.unzip
-          # below ones don't need to be in the PATH but they’re used in
-          # secrets
-          pkgs.imagemagick texlive
-        ];
-      };
-      phpWatchFiles = [
-        app.secretsPath
-      ];
-      phpPackage = pkgs.php72;
-    };
-
-    secrets.keys."websites/piedsjaloux/production" = {
-      user = config.services.httpd.Prod.user;
-      group = config.services.httpd.Prod.group;
-      permissions = "0400";
-      text = ''
-        # This file is auto-generated during the composer install
-        parameters:
-            database_host: ${secrets.mysql.host}
-            database_port: ${secrets.mysql.port}
-            database_name: ${secrets.mysql.database}
-            database_user: ${secrets.mysql.user}
-            database_password: ${secrets.mysql.password}
-            database_server_version: ${pkgs.mariadb.mysqlVersion}
-            mailer_transport: smtp
-            mailer_host: 127.0.0.1
-            mailer_user: null
-            mailer_password: null
-            secret: ${secrets.secret}
-            pdflatex: "${texlive}/bin/pdflatex"
-        leapt_im:
-            binary_path: ${pkgs.imagemagick}/bin
-      '';
-    };
-
-    services.websites.env.production.vhostConfs.piedsjaloux_production = {
-      certName     = "piedsjaloux";
-      certMainHost = "piedsjaloux.fr";
-      hosts        = [ "piedsjaloux.fr" "www.piedsjaloux.fr" ];
-      root         = app.webRoot;
-      extraConfig  = [
-        ''
-        RewriteEngine on
-        RewriteCond "%{HTTP_HOST}" "!^www.piedsjaloux\.fr$" [NC]
-        RewriteRule ^(.+)$ https://www.piedsjaloux.fr$1 [R=302,L]
-
-        <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>
-        ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/ressourcerie_banon/cloud.nix b/modules/private/websites/ressourcerie_banon/cloud.nix
deleted file mode 100644 (file)
index 5179218..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  cfg = config.myServices.websites.ressourcerie_banon.cloud;
-  nextcloud = config.myServices.tools.cloud.farm.package;
-in {
-  options.myServices.websites.ressourcerie_banon.cloud.enable = lib.mkEnableOption "enable Ressourcerie Banon’s cloud";
-
-  config = lib.mkIf cfg.enable {
-    myServices.tools.cloud.farm.instances = [ "ressourcerie_banon" ];
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-    services.websites.env.production.vhostConfs.ressourcerie_banon_cloud = {
-      certName     = "ressourcerie_banon";
-      addToCerts   = true;
-      hosts        = ["cloud.le-garage-autonome.org"];
-      root         = nextcloud;
-      extraConfig  = [ config.myServices.tools.cloud.farm.vhosts.ressourcerie_banon ];
-    };
-  };
-}
-
diff --git a/modules/private/websites/ressourcerie_banon/cryptpad.nix b/modules/private/websites/ressourcerie_banon/cryptpad.nix
deleted file mode 100644 (file)
index 7aea728..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  cfg = config.myServices.websites.ressourcerie_banon.cryptpad;
-  envCfg = config.myEnv.tools.cryptpad.ressourcerie_banon;
-  port = envCfg.port;
-  configFile = pkgs.writeText "config.js" ''
-    // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js
-    module.exports = {
-      httpUnsafeOrigin: 'https://${domain}',
-      httpPort: ${toString port},
-      adminEmail: '${envCfg.email}',
-      filePath: './datastore/',
-      archivePath: './data/archive',
-      pinPath: './data/pins',
-      taskPath: './data/tasks',
-      blockPath: './block',
-      blobPath: './blob',
-      blobStagingPath: './data/blobstage',
-      decreePath: './data/decrees',
-      logPath: './data/logs',
-      logToStdout: false,
-      logLevel: 'info',
-      logFeedback: false,
-      verbose: false,
-      inactiveTime: false,
-      adminKeys: ${builtins.toJSON envCfg.admins},
-    };
-  '';
-  domain = "pad.le-garage-autonome.org";
-in {
-  options.myServices.websites.ressourcerie_banon.cryptpad.enable = lib.mkEnableOption "Enable Ressourcerie Banon’s cryptpad";
-
-  config = lib.mkIf cfg.enable {
-    myServices.tools.cryptpad.farm.hosts.ressourcerie_banon = {
-      inherit domain port;
-      config = configFile;
-    };
-    services.websites.env.production.modules = [ "proxy_wstunnel" ];
-    services.websites.env.production.vhostConfs.ressourcerie_banon_cryptpad = {
-      certName = "ressourcerie_banon";
-      addToCerts = true;
-      hosts = [domain];
-      root = config.myServices.tools.cryptpad.farm.vhostRoots.ressourcerie_banon;
-      extraConfig = [
-        config.myServices.tools.cryptpad.farm.vhosts.ressourcerie_banon
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/ressourcerie_banon/production.nix b/modules/private/websites/ressourcerie_banon/production.nix
deleted file mode 100644 (file)
index fa00d92..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  cfg = config.myServices.websites.ressourcerie_banon.production;
-  varDir = "/var/lib/ftp/ressourcerie_banon";
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-in {
-  options.myServices.websites.ressourcerie_banon.production.enable = lib.mkEnableOption "enable Ressourcerie Banon's website";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "ressourcerie-banon.org"; } ];
-
-    system.activationScripts.ressourcerie_banon = {
-      deps = [ "httpd" ];
-      text = ''
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/ressourcerie_banon
-        '';
-    };
-    systemd.services.phpfpm-ressourcerie_banon.after = lib.mkAfter [ "mysql.service" ];
-    systemd.services.phpfpm-ressourcerie_banon.wants = [ "mysql.service" ];
-    services.phpfpm.pools.ressourcerie_banon = {
-      user = apacheUser;
-      group = apacheGroup;
-      settings = {
-        "listen.owner" = apacheUser;
-        "listen.group" = apacheGroup;
-
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-
-        "php_admin_value[open_basedir]" = "/var/lib/php/sessions/ressourcerie_banon:${varDir}:/tmp";
-        "php_admin_value[session.save_path]" = "/var/lib/php/sessions/ressourcerie_banon";
-      };
-      phpOptions = config.services.phpfpm.phpOptions + ''
-        disable_functions = "mail"
-      '';
-      phpPackage = pkgs.php72;
-    };
-    services.websites.env.production.modules = [ "proxy_fcgi" ];
-    services.websites.env.production.vhostConfs.ressourcerie_banon = {
-      certName     = "ressourcerie_banon";
-      certMainHost = "ressourcerie-banon.org";
-      hosts        = ["ressourcerie-banon.org" "www.ressourcerie-banon.org" "ressourcerie-sault.org" "www.ressourcerie-sault.org" "le-garage-autonome.org"
-      "www.le-garage-autonome.org"];
-      root         = varDir;
-      extraConfig  = [
-        ''
-        Use Stats ressourcerie-banon.org
-
-        RewriteEngine on
-        RewriteCond "%{HTTP_HOST}" "!^ressourcerie-banon\.org$" [NC]
-        RewriteRule ^(.+)$ https://ressourcerie-banon.org$1 [R=302,L]
-
-        <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>
-          ''
-      ];
-    };
-  };
-}
-
diff --git a/modules/private/websites/richie/production.nix b/modules/private/websites/richie/production.nix
deleted file mode 100644 (file)
index a548cff..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-{ lib, config, pkgs, ... }:
-let
-  cfg = config.myServices.websites.richie.production;
-  vardir = "/var/lib/richie_production";
-  richieSrc = pkgs.stdenv.mkDerivation rec {
-    version = pkgs.sources.websites-richie-app.version;
-    pname = "richie";
-    name = "${pname}-${version}";
-    src = pkgs.sources.websites-richie-app;
-    phases = "installPhase";
-    installPhase = ''
-      cp -a $src $out
-      chmod -R u+w $out
-      ln -sf ${vardir}/files $out/
-      ln -sf ${vardir}/drapeaux $out/images/
-      ln -sf ${vardir}/photos $out/
-      sed -i "s@localedef --list-archive@localedef --list-archive /run/current-system/sw/lib/locale/locale-archive@" $out/admin/parametres.php
-      '';
-  };
-  secretPath = config.secrets.fullPaths."websites/richie/production";
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-in
-{
-  options.myServices.websites.richie.production.enable = lib.mkEnableOption "enable Richie's website";
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "europe-richie.org"; } ];
-
-    secrets.keys."websites/richie/production" = {
-      user = apacheUser;
-      group = apacheGroup;
-      permissions = "0400";
-      text = with config.myEnv.websites.richie; ''
-        <?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>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/syden/peertube.nix b/modules/private/websites/syden/peertube.nix
deleted file mode 100644 (file)
index 64d4a5d..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  scfg = config.myServices.websites.syden.peertube;
-  name = "peertube";
-  dataDir = "/var/lib/syden_peertube";
-  package = (pkgs.mylibs.flakeCompat ../../../../flakes/private/peertube).packages.x86_64-linux.peertube_syden;
-  env = config.myEnv.tools.syden_peertube;
-in
-{
-  options.myServices.websites.syden.peertube.enable = lib.mkEnableOption "enable Syden's website";
-
-  config = lib.mkIf scfg.enable {
-    users.users.peertube = {
-      uid = config.ids.uids.peertube;
-      group = "peertube";
-      description = "Peertube user";
-      useDefaultShell = true;
-      extraGroups = [ "keys" ];
-    };
-    users.groups.peertube.gid = config.ids.gids.peertube;
-
-    secrets.keys."websites/syden/peertube" = {
-      user = "peertube";
-      group = "peertube";
-      permissions = "0640";
-      text = ''
-        listen:
-          hostname: 'localhost'
-          port: ${toString env.listenPort}
-        webserver:
-          https: true
-          hostname: 'record-links.immae.eu'
-          port: 443
-        database:
-          hostname: '${env.postgresql.socket}'
-          port: 5432
-          suffix: '_syden'
-          username: '${env.postgresql.user}'
-          password: '${env.postgresql.password}'
-          pool:
-            max: 5
-        redis:
-          socket: '${env.redis.socket}'
-          auth: null
-          db: ${env.redis.db}
-        smtp:
-          transport: sendmail
-          sendmail: '/run/wrappers/bin/sendmail'
-          from_address: 'peertube@tools.immae.eu'
-        storage:
-          tmp: '${dataDir}/storage/tmp/'
-          avatars: '${dataDir}/storage/avatars/'
-          videos: '${dataDir}/storage/videos/'
-          streaming_playlists: '${dataDir}/storage/streaming-playlists/'
-          redundancy: '${dataDir}/storage/videos/'
-          logs: '${dataDir}/storage/logs/'
-          previews: '${dataDir}/storage/previews/'
-          thumbnails: '${dataDir}/storage/thumbnails/'
-          torrents: '${dataDir}/storage/torrents/'
-          captions: '${dataDir}/storage/captions/'
-          cache: '${dataDir}/storage/cache/'
-          plugins: '${dataDir}/storage/plugins/'
-          client_overrides: '${dataDir}/storage/client-overrides/'
-        '';
-    };
-
-    services.filesWatcher.syden_peertube = {
-      restart = true;
-      paths = [ config.secrets.fullPaths."websites/syden/peertube" ];
-    };
-
-    systemd.services.syden_peertube = {
-      description = "Peertube";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" "postgresql.service" ];
-      wants = [ "postgresql.service" ];
-
-      environment.NODE_CONFIG_DIR = "${dataDir}/config";
-      environment.NODE_ENV = "production";
-      environment.HOME = package;
-
-      path = [ pkgs.nodejs pkgs.bashInteractive pkgs.ffmpeg pkgs.openssl ];
-
-      script = ''
-        install -m 0750 -d ${dataDir}/config
-        ln -sf ${config.secrets.fullPaths."websites/syden/peertube"} ${dataDir}/config/production.yaml
-        ln -sf ${package}/config/default.yaml ${dataDir}/config/default.yaml
-        exec npm run start
-      '';
-
-      serviceConfig = {
-        User = "peertube";
-        Group = "peertube";
-        WorkingDirectory = package;
-        StateDirectory = "syden_peertube";
-        StateDirectoryMode = 0750;
-        PrivateTmp = true;
-        ProtectHome = true;
-        ProtectControlGroups = true;
-        Restart = "always";
-        Type = "simple";
-        TimeoutSec = 60;
-      };
-
-      unitConfig.RequiresMountsFor = dataDir;
-    };
-
-    services.websites.env.production.vhostConfs.syden_peertube = {
-      certName     = "syden";
-      addToCerts   = true;
-      certMainHost = "record-links.immae.eu";
-      hosts        = [ "record-links.immae.eu" ];
-      root         = null;
-      extraConfig  = [ ''
-          RewriteEngine On
-
-          RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
-          RewriteCond %{QUERY_STRING} transport=websocket    [NC]
-          RewriteRule /(.*)           ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L]
-
-          RewriteCond %{REQUEST_URI}  ^/tracker/socket       [NC]
-          RewriteRule /(.*)           ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L]
-
-          ProxyPass /        http://localhost:${toString env.listenPort}/
-          ProxyPassReverse / http://localhost:${toString env.listenPort}/
-
-          ProxyPreserveHost On
-          RequestHeader set X-Real-IP %{REMOTE_ADDR}s
-      '' ];
-    };
-  };
-}
diff --git a/modules/private/websites/telio_tortay/production.nix b/modules/private/websites/telio_tortay/production.nix
deleted file mode 100644 (file)
index 16eca74..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; };
-  cfg = config.myServices.websites.telio_tortay.production;
-  varDir = "/var/lib/ftp/telio_tortay";
-  env = config.myEnv.websites.telio_tortay;
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-in {
-  options.myServices.websites.telio_tortay.production.enable = lib.mkEnableOption "enable Telio Tortay's website";
-
-  config = lib.mkIf cfg.enable {
-    services.webstats.sites = [ { name = "telio-tortay.immae.eu"; } ];
-
-    security.acme.certs."ftp".extraDomains."telio-tortay.immae.eu" = null;
-
-    system.activationScripts.telio_tortay = {
-      deps = [ "httpd" ];
-      text = ''
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/ftp/telio_tortay/logs
-        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/telio_tortay
-        '';
-    };
-    systemd.services.phpfpm-telio_tortay.after = lib.mkAfter [ "mysql.service" ];
-    systemd.services.phpfpm-telio_tortay.wants = [ "mysql.service" ];
-    services.phpfpm.pools.telio_tortay = {
-      user = apacheUser;
-      group = apacheGroup;
-      settings = {
-        "listen.owner" = apacheUser;
-        "listen.group" = apacheGroup;
-
-        "pm" = "ondemand";
-        "pm.max_children" = "5";
-        "pm.process_idle_timeout" = "60";
-
-        "php_admin_value[open_basedir]" = "/var/lib/php/sessions/telio_tortay:${varDir}:/tmp";
-        "php_admin_value[session.save_path]" = "/var/lib/php/sessions/telio_tortay";
-      };
-      phpOptions = config.services.phpfpm.phpOptions + ''
-        disable_functions = "mail"
-      '';
-      phpPackage = pkgs.php72;
-    };
-    services.websites.env.production.modules = adminer.apache.modules ++ [ "proxy_fcgi" ];
-    services.websites.env.production.vhostConfs.telio_tortay = {
-      certName     = "telio_tortay";
-      certMainHost = "telio-tortay.immae.eu";
-      hosts        = ["telio-tortay.immae.eu" "realistesmedia.fr" "www.realistesmedia.fr" ];
-      root         = varDir;
-      extraConfig  = [
-        (adminer.apache.vhostConf null)
-        ''
-        Use Stats telio-tortay.immae.eu
-        ServerAdmin ${env.server_admin}
-        ErrorLog "${varDir}/logs/error_log"
-        CustomLog "${varDir}/logs/access_log" combined
-
-        <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>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/tools/assets/default.nix b/modules/private/websites/tools/assets/default.nix
deleted file mode 100644 (file)
index 0eb476d..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  cfg = config.myServices.websites.tools.assets;
-  assets_urls = lib.mapAttrs (k: v: pkgs.fetchurl v) config.myEnv.tools.assets;
-  assets = pkgs.runCommand "assets" {} (''
-    mkdir -p $out
-    cp -a ${./static}/* $out/
-  '' + builtins.concatStringsSep "\n"
-    (lib.mapAttrsToList (k: v: ''
-      install -D -m644 -T ${v} $out/${k}
-    '') assets_urls));
-in
-{
-  options.myServices.websites.tools.assets = {
-    enable = lib.mkEnableOption "Enable assets website";
-  };
-  config = lib.mkIf cfg.enable {
-    services.websites.env.tools.vhostConfs.assets = {
-      certName = "eldiron";
-      addToCerts = true;
-      hosts = [ "assets.immae.eu" ];
-      root = assets;
-      extraConfig = [
-        ''
-          Use Apaxy "${assets}" "title"
-          <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>
-        ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/tools/cloud/default.nix b/modules/private/websites/tools/cloud/default.nix
deleted file mode 100644 (file)
index 44163de..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  nextcloud = pkgs.webapps.nextcloud.withApps (a: [
-    a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.contacts
-    a.cookbook a.deck a.extract a.files_markdown a.files_readmemd
-    a.flowupload a.gpxedit a.gpxpod a.keeweb a.maps a.metadata a.music
-    a.notes a.ocsms a.passman a.polls a.spreed a.tasks
-  ]);
-  env = config.myEnv.tools.nextcloud;
-  varDir = "/var/lib/nextcloud";
-  cfg = config.myServices.websites.tools.cloud;
-  phpFpm = rec {
-    basedir = builtins.concatStringsSep ":" ([ nextcloud varDir ] ++ nextcloud.apps);
-    pool = {
-      "listen.owner" = "wwwrun";
-      "listen.group" = "wwwrun";
-      "pm" = "ondemand";
-      "pm.max_children" = "60";
-      "pm.process_idle_timeout" = "60";
-
-      "php_admin_value[output_buffering]" = "0";
-      "php_admin_value[max_execution_time]" = "1800";
-      "php_admin_value[zend_extension]" = "opcache";
-      #already enabled by default?
-      #"php_value[opcache.enable]" = "1";
-      "php_value[opcache.enable_cli]" = "1";
-      "php_value[opcache.interned_strings_buffer]" = "8";
-      "php_value[opcache.max_accelerated_files]" = "10000";
-      "php_value[opcache.memory_consumption]" = "128";
-      "php_value[opcache.save_comments]" = "1";
-      "php_value[opcache.revalidate_freq]" = "1";
-      "php_admin_value[memory_limit]" = "512M";
-
-      "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp";
-      "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
-    };
-  };
-in {
-  options.myServices.websites.tools.cloud = {
-    enable = lib.mkEnableOption "enable cloud website";
-  };
-
-  config = lib.mkIf cfg.enable {
-    services.websites.env.tools.modules = [ "proxy_fcgi" ];
-
-    services.websites.env.tools.vhostConfs.cloud = {
-      certName    = "eldiron";
-      addToCerts  = true;
-      hosts       = ["cloud.immae.eu" ];
-      root        = nextcloud;
-      extraConfig = [
-        ''
-          SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
-          <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
-        ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/tools/cloud/farm.nix b/modules/private/websites/tools/cloud/farm.nix
deleted file mode 100644 (file)
index 7be774c..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  cfg = config.myServices.tools.cloud.farm;
-  apacheUser = config.services.httpd.Prod.user;
-  apacheGroup = config.services.httpd.Prod.group;
-  nextcloud = (pkgs.webapps.nextcloud.override { varDir = null; }).withApps (a: [
-    a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.contacts
-    a.cookbook a.deck a.extract a.files_markdown a.files_readmemd
-    a.flowupload a.gpxedit a.gpxpod a.impersonate a.keeweb a.maps
-    a.metadata a.music a.notes a.ocsms a.passman a.polls a.spreed
-    a.tasks
-  ]);
-  toVardir = name: "/var/lib/nextcloud_farm/${name}";
-  varDirs = map toVardir cfg.instances;
-  phpBaseDir = builtins.concatStringsSep ":" ([ nextcloud ] ++ varDirs ++ nextcloud.apps);
-  toVhost = name: ''
-    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
-    SetEnv NEXTCLOUD_CONFIG_DIR "${toVardir name}"
-    <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;
-    };
-  };
-}
diff --git a/modules/private/websites/tools/cryptpad/default.nix b/modules/private/websites/tools/cryptpad/default.nix
deleted file mode 100644 (file)
index 69b9877..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-{ config, pkgs, lib, ... }:
-let
-  cfg = config.myServices.websites.tools.cryptpad;
-  envCfg = config.myEnv.tools.cryptpad.immaeEu;
-  domain = "cryptpad.immae.eu";
-  port = envCfg.port;
-  configFile = pkgs.writeText "config.js" ''
-    // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js
-    module.exports = {
-      httpUnsafeOrigin: 'https://${domain}',
-      httpPort: ${toString port},
-      adminEmail: '${envCfg.email}',
-      filePath: './datastore/',
-      archivePath: './data/archive',
-      pinPath: './data/pins',
-      taskPath: './data/tasks',
-      blockPath: './block',
-      blobPath: './blob',
-      blobStagingPath: './data/blobstage',
-      decreePath: './data/decrees',
-      logPath: './data/logs',
-      logToStdout: false,
-      logLevel: 'info',
-      logFeedback: false,
-      verbose: false,
-      inactiveTime: false,
-      maxUploadSize: 100 * 1024 * 1024,
-      adminKeys: ${builtins.toJSON envCfg.admins},
-    };
-  '';
-in
-{
-  options.myServices.websites.tools.cryptpad.enable = lib.mkEnableOption "Enable Cryptpad";
-  config = lib.mkIf cfg.enable {
-    myServices.tools.cryptpad.farm.hosts.immaeEu = {
-      inherit domain port;
-      config = configFile;
-    };
-    services.websites.env.tools.modules = [ "proxy_wstunnel" ];
-    services.websites.env.tools.vhostConfs.cryptpad = {
-      certName = "eldiron";
-      addToCerts = true;
-      hosts = [domain];
-      root = config.myServices.tools.cryptpad.farm.vhostRoots.immaeEu;
-      extraConfig = [
-        config.myServices.tools.cryptpad.farm.vhosts.immaeEu
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/tools/dav/default.nix b/modules/private/websites/tools/dav/default.nix
deleted file mode 100644 (file)
index b3aa03d..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-    infcloud = rec {
-      root = pkgs.webapps.infcloud;
-      vhostConf = ''
-          Alias /carddavmate ${root}
-          Alias /caldavzap ${root}
-          Alias /infcloud ${root}
-          <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;
-      };
-    };
-  };
-}
-
diff --git a/modules/private/websites/tools/db/default.nix b/modules/private/websites/tools/db/default.nix
deleted file mode 100644 (file)
index fc8d989..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-    adminer = pkgs.callPackage ../../commons/adminer.nix { inherit config; };
-
-    cfg = config.myServices.websites.tools.db;
-in {
-  options.myServices.websites.tools.db = {
-    enable = lib.mkEnableOption "enable database's website";
-  };
-
-  config = lib.mkIf cfg.enable {
-    services.websites.env.tools.modules = adminer.apache.modules;
-    services.websites.env.tools.vhostConfs.db-1 = {
-      certName    = "eldiron";
-      addToCerts  = true;
-      hosts       = ["db-1.immae.eu" ];
-      root        = null;
-      extraConfig = [ (adminer.apache.vhostConf null) ];
-    };
-  };
-}
diff --git a/modules/private/websites/tools/git/default.nix b/modules/private/websites/tools/git/default.nix
deleted file mode 100644 (file)
index 8f611ee..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-    mantisbt = pkgs.callPackage ./mantisbt.nix {
-      inherit (pkgs.webapps) mantisbt_2 mantisbt_2-plugins;
-      env = config.myEnv.tools.mantisbt;
-      inherit config;
-    };
-    gitweb = pkgs.callPackage ./gitweb.nix {
-      gitoliteDir = config.myServices.gitolite.gitoliteDir;
-    };
-
-    cfg = config.myServices.websites.tools.git;
-in {
-  options.myServices.websites.tools.git = {
-    enable = lib.mkEnableOption "enable git's website";
-  };
-
-  config = lib.mkIf cfg.enable {
-    secrets.keys = mantisbt.keys;
-    services.websites.env.tools.modules =
-      gitweb.apache.modules ++
-      mantisbt.apache.modules;
-
-    system.activationScripts.mantisbt = mantisbt.activationScript;
-    services.websites.env.tools.vhostConfs.git = {
-      certName    = "eldiron";
-      addToCerts  = true;
-      hosts       = ["git.immae.eu" ];
-      root        = gitweb.apache.root;
-      extraConfig = [
-        gitweb.apache.vhostConf
-        (mantisbt.apache.vhostConf config.services.phpfpm.pools.mantisbt.socket)
-        ''
-          RewriteEngine on
-          RewriteCond %{REQUEST_URI}       ^/releases
-          RewriteRule /releases(.*)        https://release.immae.eu$1 [P,L]
-          ''
-      ];
-    };
-    services.phpfpm.pools = {
-      mantisbt = {
-        user = config.services.httpd.Tools.user;
-        group = config.services.httpd.Tools.group;
-        settings = mantisbt.phpFpm.pool;
-        phpPackage = pkgs.php72;
-      };
-    };
-  };
-}
diff --git a/modules/private/websites/tools/im/default.nix b/modules/private/websites/tools/im/default.nix
deleted file mode 100644 (file)
index 94dc4f8..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-{ config, lib, pkgs, ... }:
-let
-  cfg = config.myServices.websites.tools.im;
-in
-{
-  options.myServices.websites.tools.im = {
-    enable = lib.mkEnableOption "enable im website";
-  };
-
-  config = lib.mkIf cfg.enable {
-    services.websites.env.tools.vhostConfs.im = {
-      certName   = "eldiron";
-      addToCerts = true;
-      hosts      = ["im.immae.fr"];
-      root       = ./www;
-      extraConfig = [
-        ''
-          Alias /glowing-bear ${pkgs.glowing-bear}
-          Alias /converse ${./www}/converse.html
-          ProxyPreserveHost On
-          <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>
-          ''
-      ];
-    };
-  };
-}
diff --git a/modules/private/websites/tools/mail/default.nix b/modules/private/websites/tools/mail/default.nix
deleted file mode 100644 (file)
index 390f7ad..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-{ lib, pkgs, config,  ... }:
-let
-  roundcubemail = pkgs.callPackage ./roundcubemail.nix {
-    inherit (pkgs.webapps) roundcubemail;
-    env = config.myEnv.tools.roundcubemail;
-    inherit config;
-  };
-  rainloop = pkgs.callPackage ./rainloop.nix {
-    rainloop = pkgs.rainloop-community;
-  };
-  cfg = config.myServices.websites.tools.email;
-  pcfg = config.services.phpfpm.pools;
-in
-{
-  options.myServices.websites.tools.email = {
-    enable = lib.mkEnableOption "enable email website";
-  };
-
-  imports = [
-    ./mta-sts.nix
-  ];
-
-  config = lib.mkIf cfg.enable {
-    secrets.keys = roundcubemail.keys;
-
-    services.websites.env.tools.modules =
-      [ "proxy_fcgi" ]
-      ++ rainloop.apache.modules
-      ++ roundcubemail.apache.modules;
-
-    services.websites.env.tools.vhostConfs.mail = {
-      certName   = "mail";
-      addToCerts = true;
-      hosts      = ["mail.immae.eu"];
-      root       = ./www;
-      extraConfig = [
-        (rainloop.apache.vhostConf pcfg.rainloop.socket)
-        (roundcubemail.apache.vhostConf pcfg.roundcubemail.socket)
-        ''
-          <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;
-    };
-  };
-
-}
diff --git a/modules/private/websites/tools/tools/adminer.nix b/modules/private/websites/tools/tools/adminer.nix
deleted file mode 100644 (file)
index c280684..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-{ webapps, php74, myPhpPackages, lib, forcePhpSocket ? null }:
-rec {
-  activationScript = {
-    deps = [ "httpd" ];
-    text = ''
-      install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/adminer
-      '';
-  };
-  webRoot = webapps.adminer;
-  phpFpm = rec {
-    user = apache.user;
-    group = apache.group;
-    phpPackage = php74.withExtensions ({ enabled, all }: (lib.remove all.mysqli enabled) ++ [myPhpPackages.mysqli_pam]);
-    settings = {
-      "listen.owner" = apache.user;
-      "listen.group" = apache.group;
-      "pm" = "ondemand";
-      "pm.max_children" = "5";
-      "pm.process_idle_timeout" = "60";
-      #"php_admin_flag[log_errors]" = "on";
-      # Needed to avoid clashes in browser cookies (same domain)
-      "php_value[session.name]" = "AdminerPHPSESSID";
-      "php_admin_value[open_basedir]" = "${webRoot}:/tmp:/var/lib/php/sessions/adminer";
-      "php_admin_value[session.save_path]" = "/var/lib/php/sessions/adminer";
-    };
-  };
-  apache = rec {
-    user = "wwwrun";
-    group = "wwwrun";
-    modules = [ "proxy_fcgi" ];
-    root = webRoot;
-    vhostConf = socket: ''
-      Alias /adminer ${webRoot}
-      <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>
-      '';
-  };
-}
diff --git a/modules/private/websites/tools/tools/csp_reports.nix b/modules/private/websites/tools/tools/csp_reports.nix
deleted file mode 100644 (file)
index 9b3f0cf..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{ env }:
-rec {
-  keys."webapps/tools-csp-reports.conf" = {
-    user = "wwwrun";
-    group = "wwwrun";
-    permissions = "0400";
-    text = with env.postgresql; ''
-      env[CSP_REPORT_URI] = "host=${socket} dbname=${database} user=${user} password=${password}"
-    '';
-  };
-}
diff --git a/modules/private/websites/tools/tools/dokuwiki.nix b/modules/private/websites/tools/tools/dokuwiki.nix
deleted file mode 100644 (file)
index aee495a..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-{ lib, stdenv, dokuwiki, dokuwiki-plugins }:
-rec {
-  varDir = "/var/lib/dokuwiki";
-  activationScript = {
-    deps = [ "wrappers" ];
-    text = ''
-      if [ ! -d ${varDir} ]; then
-        install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
-          ${varDir}/animals
-        cp -a ${webRoot}/conf.dist ${varDir}/conf
-        cp -a ${webRoot}/data.dist ${varDir}/data
-        cp -a ${webRoot}/
-        chown -R ${apache.user}:${apache.user} ${varDir}/config ${varDir}/data
-        chmod -R 755 ${varDir}/config ${varDir}/data
-      fi
-      install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
-    '';
-  };
-  webRoot = dokuwiki.withPlugins (p: [ p.farmer p.todo ]);
-  apache = rec {
-    user = "wwwrun";
-    group = "wwwrun";
-    modules = [ "proxy_fcgi" ];
-    root = webRoot;
-    vhostConf = socket: ''
-      Alias /dokuwiki "${root}"
-      <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";
-    };
-  };
-}
diff --git a/modules/private/websites/tools/tools/landing.nix b/modules/private/websites/tools/tools/landing.nix
deleted file mode 100644 (file)
index 2acc323..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-{ sources, stdenv, yarn2nix-moretea }:
-let
-  yarnModules = yarn2nix-moretea.mkYarnModules rec {
-    name = "landing";
-    pname = name;
-    version = "v1.0.0";
-    packageJSON = "${sources.webapps-landing}/package.json";
-    yarnLock = "${sources.webapps-landing}/yarn.lock";
-    yarnNix = ./landing/yarn-packages.nix;
-  };
-in
-  stdenv.mkDerivation rec {
-    pname = "landing";
-    version = "v1.0.0";
-    src = sources.webapps-landing;
-
-    buildInputs = [ yarnModules yarn2nix-moretea.yarn ];
-    configurePhase = ''
-      ln -s ${yarnModules}/node_modules .
-    '';
-    buildPhase = ''
-      yarn build
-    '';
-    installPhase = ''
-      cp -a dist $out
-      cp ${./landing}/*.php $out/
-      ln -s service-worker.js $out/worker.js
-    '';
-  }
diff --git a/modules/private/websites/tools/tools/landing/report_csp_violation.php b/modules/private/websites/tools/tools/landing/report_csp_violation.php
deleted file mode 100644 (file)
index 30140b2..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<?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));
-}
diff --git a/modules/private/websites/tools/tools/webhooks.nix b/modules/private/websites/tools/tools/webhooks.nix
deleted file mode 100644 (file)
index 785e22b..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-{ 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";
-    };
-  };
-}
diff --git a/modules/webapps/diaspora.nix b/modules/webapps/diaspora.nix
deleted file mode 100644 (file)
index d9e9989..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-{ 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;
-    };
-  };
-}
diff --git a/modules/webapps/etherpad-lite.nix b/modules/webapps/etherpad-lite.nix
deleted file mode 100644 (file)
index 2e09952..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  name = "etherpad-lite";
-  cfg = config.services.etherpad-lite;
-
-  uid = config.ids.uids.etherpad-lite;
-  gid = config.ids.gids.etherpad-lite;
-in
-{
-  options.services.etherpad-lite = {
-    enable = lib.mkEnableOption "Enable Etherpad lite’s service";
-    user = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "User account under which Etherpad lite runs";
-    };
-    group = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "Group under which Etherpad lite runs";
-    };
-    dataDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/var/lib/${name}";
-      description = ''
-        The directory where Etherpad lite stores its data.
-      '';
-    };
-    socketsDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/run/${name}";
-      description = ''
-        The directory where Etherpad lite stores its sockets.
-      '';
-    };
-    configFile = lib.mkOption {
-      type = lib.types.path;
-      description = ''
-        The config file path for Etherpad lite.
-        '';
-    };
-    sessionKeyFile = lib.mkOption {
-      type = lib.types.path;
-      description = ''
-        The Session key file path for Etherpad lite.
-        '';
-    };
-    apiKeyFile = lib.mkOption {
-      type = lib.types.path;
-      description = ''
-        The API key file path for Etherpad lite.
-        '';
-    };
-    package = lib.mkOption {
-      type = lib.types.package;
-      default = pkgs.webapps.etherpad-lite;
-      description = ''
-        Etherpad lite package to use.
-        '';
-      example = lib.literalExample ''
-        pkgs.webapps.etherpad-lite.withModules (p: [ p.ep_align ]);
-      '';
-    };
-    modules = lib.mkOption {
-      type = lib.types.listOf lib.types.package;
-      default = [];
-      description = ''
-        Etherpad lite modules to use.
-        DEPRECATED: use package directly
-        '';
-    };
-    # Output variables
-    workdir = lib.mkOption {
-      type = lib.types.package;
-      default = cfg.package.withModules (_: cfg.modules);
-      description = ''
-      Adjusted Etherpad lite package with plugins
-      '';
-      readOnly = true;
-    };
-    systemdStateDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if varDir is outside of /var/lib
-      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
-        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
-      description = ''
-      Adjusted Etherpad lite data directory for systemd
-      '';
-      readOnly = true;
-    };
-    systemdRuntimeDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if socketsDir is outside of /run
-      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
-        lib.strings.removePrefix "/run/" cfg.socketsDir;
-      description = ''
-      Adjusted Etherpad lite sockets directory for systemd
-      '';
-      readOnly = true;
-    };
-    sockets = lib.mkOption {
-      type = lib.types.attrsOf lib.types.path;
-      default = {
-        node  = "${cfg.socketsDir}/etherpad-lite.sock";
-      };
-      readOnly = true;
-      description = ''
-        Etherpad lite sockets
-        '';
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    systemd.services.etherpad-lite = {
-      description = "Etherpad-lite";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" "postgresql.service" ];
-      wants = [ "postgresql.service" ];
-
-      environment.NODE_ENV = "production";
-      environment.HOME = cfg.workdir;
-
-      path = [ pkgs.nodejs ];
-
-      script = ''
-        exec ${pkgs.nodejs}/bin/node ${cfg.workdir}/src/node/server.js \
-          --sessionkey ${cfg.sessionKeyFile} \
-          --apikey ${cfg.apiKeyFile} \
-          --settings ${cfg.configFile}
-      '';
-
-      postStart = ''
-        while [ ! -S ${cfg.sockets.node} ]; do
-          sleep 0.5
-        done
-        chmod a+w ${cfg.sockets.node}
-        '';
-      serviceConfig = {
-        DynamicUser = true;
-        User = cfg.user;
-        Group = cfg.group;
-        WorkingDirectory = cfg.workdir;
-        PrivateTmp = true;
-        NoNewPrivileges = true;
-        PrivateDevices = true;
-        ProtectHome = true;
-        ProtectControlGroups = true;
-        ProtectKernelModules = true;
-        Restart = "always";
-        Type = "simple";
-        TimeoutSec = 60;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        StateDirectory= cfg.systemdStateDirectory;
-        ExecStartPre = [
-          "+${pkgs.coreutils}/bin/install -d -m 0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dataDir}/ep_initialized"
-          "+${pkgs.coreutils}/bin/chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} ${cfg.configFile} ${cfg.sessionKeyFile} ${cfg.apiKeyFile}"
-        ];
-      };
-    };
-
-  };
-}
diff --git a/modules/webapps/mastodon.nix b/modules/webapps/mastodon.nix
deleted file mode 100644 (file)
index df2dbb2..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  name = "mastodon";
-  cfg = config.services.mastodon;
-
-  uid = config.ids.uids.mastodon;
-  gid = config.ids.gids.mastodon;
-in
-{
-  options.services.mastodon = {
-    enable = lib.mkEnableOption "Enable Mastodon’s service";
-    user = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "User account under which Mastodon runs";
-    };
-    group = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "Group under which Mastodon runs";
-    };
-    dataDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/var/lib/${name}";
-      description = ''
-        The directory where Mastodon stores its data.
-      '';
-    };
-    socketsPrefix = lib.mkOption {
-      type = lib.types.str;
-      default = "live";
-      description = ''
-        The prefix to use for Mastodon sockets.
-        '';
-    };
-    socketsDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/run/${name}";
-      description = ''
-        The directory where Mastodon puts runtime files and sockets.
-        '';
-    };
-    configFile = lib.mkOption {
-      type = lib.types.path;
-      description = ''
-        The configuration file path for Mastodon.
-        '';
-    };
-    package = lib.mkOption {
-      type = lib.types.package;
-      default = pkgs.webapps.mastodon;
-      description = ''
-        Mastodon package to use.
-        '';
-    };
-    # Output variables
-    workdir = lib.mkOption {
-      type = lib.types.package;
-      default = cfg.package.override { varDir = cfg.dataDir; };
-      description = ''
-      Adjusted mastodon package with overriden varDir
-      '';
-      readOnly = true;
-    };
-    systemdStateDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if varDir is outside of /var/lib
-      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
-        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
-      description = ''
-      Adjusted Mastodon data directory for systemd
-      '';
-      readOnly = true;
-    };
-    systemdRuntimeDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if socketsDir is outside of /run
-      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
-        lib.strings.removePrefix "/run/" cfg.socketsDir;
-      description = ''
-      Adjusted Mastodon sockets directory for systemd
-      '';
-      readOnly = true;
-    };
-    sockets = lib.mkOption {
-      type = lib.types.attrsOf lib.types.path;
-      default = {
-        node  = "${cfg.socketsDir}/${cfg.socketsPrefix}_node.sock";
-        rails = "${cfg.socketsDir}/${cfg.socketsPrefix}_puma.sock";
-      };
-      readOnly = true;
-      description = ''
-        Mastodon sockets
-        '';
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    users.users = lib.optionalAttrs (cfg.user == name) {
-      "${name}" = {
-        inherit uid;
-        group = cfg.group;
-        description = "Mastodon user";
-        home = cfg.dataDir;
-        useDefaultShell = true;
-      };
-    };
-    users.groups = lib.optionalAttrs (cfg.group == name) {
-      "${name}" = {
-        inherit gid;
-      };
-    };
-
-    systemd.slices.mastodon = {
-      description = "Mastodon slice";
-    };
-
-    systemd.services.mastodon-streaming = {
-      description = "Mastodon Streaming";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" "mastodon-web.service" ];
-
-      environment.NODE_ENV = "production";
-      environment.SOCKET = cfg.sockets.node;
-
-      path = [ pkgs.nodejs pkgs.bashInteractive ];
-
-      script = ''
-        exec npm run start
-      '';
-
-      postStart = ''
-        while [ ! -S $SOCKET ]; do
-          sleep 0.5
-        done
-        chmod a+w $SOCKET
-      '';
-
-      postStop = ''
-        rm $SOCKET
-      '';
-
-      serviceConfig = {
-        Slice = "mastodon.slice";
-        User = cfg.user;
-        EnvironmentFile = cfg.configFile;
-        PrivateTmp = true;
-        Restart = "always";
-        TimeoutSec = 15;
-        Type = "simple";
-        WorkingDirectory = cfg.workdir;
-        StateDirectory = cfg.systemdStateDirectory;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        RuntimeDirectoryPreserve = "yes";
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-
-    systemd.services.mastodon-web = {
-      description = "Mastodon Web app";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" ];
-
-      environment.RAILS_ENV = "production";
-      environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
-      environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
-      environment.SOCKET = cfg.sockets.rails;
-
-      path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file pkgs.imagemagick ];
-
-      preStart = ''
-        install -m 0755 -d ${cfg.dataDir}/tmp/cache
-        ./bin/bundle exec rails db:migrate
-      '';
-
-      script = ''
-        exec ./bin/bundle exec puma -C config/puma.rb
-      '';
-
-      postStart = ''
-        exec ./bin/tootctl cache clear
-        '';
-      serviceConfig = {
-        Slice = "mastodon.slice";
-        User = cfg.user;
-        EnvironmentFile = cfg.configFile;
-        PrivateTmp = true;
-        Restart = "always";
-        TimeoutSec = 60;
-        Type = "simple";
-        WorkingDirectory = cfg.workdir;
-        StateDirectory = cfg.systemdStateDirectory;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        RuntimeDirectoryPreserve = "yes";
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-
-    systemd.services.mastodon-cleanup = {
-      description = "Cleanup mastodon";
-      startAt = "daily";
-      restartIfChanged = false;
-
-      environment.RAILS_ENV = "production";
-      environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
-      environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
-      environment.SOCKET = cfg.sockets.rails;
-
-      path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ];
-
-      script = ''
-        exec ./bin/tootctl media remove --days 30
-      '';
-
-      serviceConfig = {
-        User = cfg.user;
-        EnvironmentFile = cfg.configFile;
-        PrivateTmp = true;
-        Type = "oneshot";
-        WorkingDirectory = cfg.workdir;
-        StateDirectory = cfg.systemdStateDirectory;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        RuntimeDirectoryPreserve = "yes";
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-
-    systemd.services.mastodon-sidekiq = {
-      description = "Mastodon Sidekiq";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" "mastodon-web.service" ];
-
-      environment.RAILS_ENV="production";
-      environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
-      environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
-      environment.DB_POOL="5";
-
-      path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.imagemagick pkgs.ffmpeg pkgs.file ];
-
-      script = ''
-        exec ./bin/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push
-      '';
-
-      serviceConfig = {
-        Slice = "mastodon.slice";
-        User = cfg.user;
-        EnvironmentFile = cfg.configFile;
-        PrivateTmp = true;
-        Restart = "always";
-        TimeoutSec = 15;
-        Type = "simple";
-        WorkingDirectory = cfg.workdir;
-        StateDirectory = cfg.systemdStateDirectory;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        RuntimeDirectoryPreserve = "yes";
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-
-  };
-}
diff --git a/modules/webapps/mediagoblin.nix b/modules/webapps/mediagoblin.nix
deleted file mode 100644 (file)
index 3fe5e38..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
-{ lib, pkgs, config, ... }:
-let
-  name = "mediagoblin";
-  cfg = config.services.mediagoblin;
-
-  uid = config.ids.uids.mediagoblin;
-  gid = config.ids.gids.mediagoblin;
-
-  paste_local = pkgs.writeText "paste_local.ini" ''
-    [DEFAULT]
-    debug = false
-
-    [pipeline:main]
-    pipeline = mediagoblin
-
-    [app:mediagoblin]
-    use = egg:mediagoblin#app
-    config = ${cfg.configFile} ${cfg.package}/mediagoblin.ini
-    /mgoblin_static = ${cfg.package}/mediagoblin/static
-
-    [loggers]
-    keys = root
-
-    [handlers]
-    keys = console
-
-    [formatters]
-    keys = generic
-
-    [logger_root]
-    level = INFO
-    handlers = console
-
-    [handler_console]
-    class = StreamHandler
-    args = (sys.stderr,)
-    level = NOTSET
-    formatter = generic
-
-    [formatter_generic]
-    format = %(levelname)-7.7s [%(name)s] %(message)s
-
-    [filter:errors]
-    use = egg:mediagoblin#errors
-    debug = false
-
-    [server:main]
-    use = egg:waitress#main
-    unix_socket = ${cfg.sockets.paster}
-    unix_socket_perms = 777
-    url_scheme = https
-    '';
-in
-{
-  options.services.mediagoblin = {
-    enable = lib.mkEnableOption "Enable Mediagoblin’s service";
-    user = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "User account under which Mediagoblin runs";
-    };
-    group = lib.mkOption {
-      type = lib.types.str;
-      default = name;
-      description = "Group under which Mediagoblin runs";
-    };
-    dataDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/var/lib/${name}";
-      description = ''
-        The directory where Mediagoblin stores its data.
-      '';
-    };
-    socketsDir = lib.mkOption {
-      type = lib.types.path;
-      default = "/run/${name}";
-      description = ''
-        The directory where Mediagoblin puts runtime files and sockets.
-        '';
-    };
-    configFile = lib.mkOption {
-      type = lib.types.path;
-      description = ''
-        The configuration file path for Mediagoblin.
-        '';
-    };
-    package = lib.mkOption {
-      type = lib.types.package;
-      default = pkgs.webapps.mediagoblin;
-      example = lib.literalExample ''
-        pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch])
-      '';
-      description = ''
-        Mediagoblin package to use.
-        '';
-    };
-    systemdStateDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if varDir is outside of /var/lib
-      default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
-        lib.strings.removePrefix "/var/lib/" cfg.dataDir;
-      description = ''
-      Adjusted Mediagoblin data directory for systemd
-      '';
-      readOnly = true;
-    };
-    systemdRuntimeDirectory = lib.mkOption {
-      type = lib.types.str;
-      # Use ReadWritePaths= instead if socketsDir is outside of /run
-      default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
-        lib.strings.removePrefix "/run/" cfg.socketsDir;
-      description = ''
-      Adjusted Mediagoblin sockets directory for systemd
-      '';
-      readOnly = true;
-    };
-    sockets = lib.mkOption {
-      type = lib.types.attrsOf lib.types.path;
-      default = {
-        paster = "${cfg.socketsDir}/mediagoblin.sock";
-      };
-      readOnly = true;
-      description = ''
-        Mediagoblin sockets
-        '';
-    };
-    pids = lib.mkOption {
-      type = lib.types.attrsOf lib.types.path;
-      default = {
-        paster = "${cfg.socketsDir}/mediagoblin.pid";
-        celery = "${cfg.socketsDir}/mediagoblin-celeryd.pid";
-      };
-      readOnly = true;
-      description = ''
-        Mediagoblin pid files
-        '';
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    users.users = lib.optionalAttrs (cfg.user == name) {
-      "${name}" = {
-        inherit uid;
-        group = cfg.group;
-        description = "Mediagoblin user";
-        home = cfg.dataDir;
-        useDefaultShell = true;
-      };
-    };
-    users.groups = lib.optionalAttrs (cfg.group == name) {
-      "${name}" = {
-        inherit gid;
-      };
-    };
-
-    systemd.slices.mediagoblin = {
-      description = "Mediagoblin slice";
-    };
-    systemd.services.mediagoblin-web = {
-      description = "Mediagoblin service";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" ];
-      wants = [ "postgresql.service" "redis.service" ];
-
-      environment.SCRIPT_NAME = "/mediagoblin/";
-
-      script = ''
-        exec ./bin/paster serve \
-          ${paste_local} \
-          --pid-file=${cfg.pids.paster}
-        '';
-      preStop = ''
-        exec ./bin/paster serve \
-          --pid-file=${cfg.pids.paster} \
-          ${paste_local} stop
-        '';
-      preStart = ''
-        if [ -d ${cfg.dataDir}/plugin_static/ ]; then
-          rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
-          ln -sf ${cfg.package}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
-        fi
-        ./bin/gmg -cf ${cfg.configFile} dbupdate
-        '';
-
-      serviceConfig = {
-        Slice = "mediagoblin.slice";
-        User = cfg.user;
-        PrivateTmp = true;
-        Restart = "always";
-        TimeoutSec = 15;
-        Type = "simple";
-        WorkingDirectory = cfg.package;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        StateDirectory= cfg.systemdStateDirectory;
-        PIDFile = cfg.pids.paster;
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-
-    systemd.services.mediagoblin-celeryd = {
-      description = "Mediagoblin service";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "network.target" "mediagoblin-web.service" ];
-
-      environment.MEDIAGOBLIN_CONFIG = cfg.configFile;
-      environment.CELERY_CONFIG_MODULE = "mediagoblin.init.celery.from_celery";
-
-      script = ''
-        exec ./bin/celery worker \
-          --logfile=${cfg.dataDir}/celery.log \
-          --loglevel=INFO
-        '';
-
-      serviceConfig = {
-        Slice = "mediagoblin.slice";
-        User = cfg.user;
-        PrivateTmp = true;
-        Restart = "always";
-        TimeoutSec = 60;
-        Type = "simple";
-        WorkingDirectory = cfg.package;
-        RuntimeDirectory = cfg.systemdRuntimeDirectory;
-        StateDirectory= cfg.systemdStateDirectory;
-        PIDFile = cfg.pids.celery;
-      };
-
-      unitConfig.RequiresMountsFor = cfg.dataDir;
-    };
-  };
-}
diff --git a/modules/websites/default.nix b/modules/websites/default.nix
deleted file mode 100644 (file)
index 6658c66..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-{ lib, config, pkgs, ... }: with lib;
-let
-  cfg = config.services.websites;
-in
-{
-  options.services.websites = with types; {
-    certs = mkOption {
-      description = "Default websites configuration for certificates as accepted by acme";
-    };
-    env = mkOption {
-      default = {};
-      description = "Each type of website to enable will target a distinct httpd server";
-      type = attrsOf (submodule {
-        options = {
-          enable = mkEnableOption "Enable websites of this type";
-          adminAddr = mkOption {
-            type = str;
-            description = "Admin e-mail address of the instance";
-          };
-          httpdName = mkOption {
-            type = str;
-            description = "Name of the httpd instance to assign this type to";
-          };
-          ips = mkOption {
-            type = listOf str;
-            default = [];
-            description = "ips to listen to";
-          };
-          modules = mkOption {
-            type = listOf str;
-            default = [];
-            description = "Additional modules to load in Apache";
-          };
-          extraConfig = mkOption {
-            type = listOf lines;
-            default = [];
-            description = "Additional configuration to append to Apache";
-          };
-          nosslVhost = mkOption {
-            description = "A default nossl vhost for captive portals";
-            default = {};
-            type = submodule {
-              options = {
-                enable = mkEnableOption "Add default no-ssl vhost for this instance";
-                host = mkOption {
-                  type = str;
-                  description = "The hostname to use for this vhost";
-                };
-                root = mkOption {
-                  type = path;
-                  default = ./nosslVhost;
-                  description = "The root folder to serve";
-                };
-                indexFile = mkOption {
-                  type = str;
-                  default = "index.html";
-                  description = "The index file to show.";
-                };
-              };
-            };
-          };
-          fallbackVhost = mkOption {
-            description = "The fallback vhost that will be defined as first vhost in Apache";
-            type = submodule {
-              options = {
-                certName = mkOption { type = str; };
-                hosts    = mkOption { type = listOf str; };
-                root     = mkOption { type = nullOr path; };
-                forceSSL = mkOption {
-                  type = bool;
-                  default = true;
-                  description = ''
-                    Automatically create a corresponding non-ssl vhost
-                    that will only redirect to the ssl version
-                  '';
-                };
-                extraConfig = mkOption { type = listOf lines; default = []; };
-              };
-            };
-          };
-          vhostNoSSLConfs = mkOption {
-            default = {};
-            description = "List of no ssl vhosts to define for Apache";
-            type = attrsOf (submodule {
-              options = {
-                hosts    = mkOption { type = listOf str; };
-                root     = mkOption { type = nullOr path; };
-                extraConfig = mkOption { type = listOf lines; default = []; };
-              };
-            });
-          };
-          vhostConfs = mkOption {
-            default = {};
-            description = "List of vhosts to define for Apache";
-            type = attrsOf (submodule {
-              options = {
-                certName = mkOption { type = str; };
-                addToCerts = mkOption {
-                  type = bool;
-                  default = false;
-                  description = "Use these to certificates. Is ignored (considered true) if certMainHost is not null";
-                };
-                certMainHost = mkOption {
-                  type = nullOr str;
-                  description = "Use that host as 'main host' for acme certs";
-                  default = null;
-                };
-                hosts    = mkOption { type = listOf str; };
-                root     = mkOption { type = nullOr path; };
-                forceSSL = mkOption {
-                  type = bool;
-                  default = true;
-                  description = ''
-                    Automatically create a corresponding non-ssl vhost
-                    that will only redirect to the ssl version
-                  '';
-                };
-                extraConfig = mkOption { type = listOf lines; default = []; };
-              };
-            });
-          };
-          watchPaths = mkOption {
-            type = listOf str;
-            default = [];
-            description = ''
-              Paths to watch that should trigger a reload of httpd
-              '';
-          };
-        };
-      });
-    };
-  };
-
-  config.services.httpd = let
-    nosslVhost = ips: cfg: {
-      listen = map (ip: { inherit ip; port = 80; }) ips;
-      hostName = cfg.host;
-      logFormat = "combinedVhost";
-      documentRoot = cfg.root;
-      extraConfig = ''
-        <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;
-}
diff --git a/modules/websites/httpd-service-builder.nix b/modules/websites/httpd-service-builder.nix
deleted file mode 100644 (file)
index 1f7488d..0000000
+++ /dev/null
@@ -1,735 +0,0 @@
-# to help backporting this builder should stay as close as possible to
-# nixos/modules/services/web-servers/apache-httpd/default.nix
-{ httpdName, withUsers ? true }:
-{ config, lib, pkgs, ... }:
-
-with lib;
-
-let
-
-  cfg = config.services.httpd."${httpdName}";
-
-  runtimeDir = "/run/httpd_${httpdName}";
-
-  pkg = cfg.package.out;
-
-  httpdConf = cfg.configFile;
-
-  php = cfg.phpPackage.override { apacheHttpd = pkg.dev; /* otherwise it only gets .out */ };
-
-  phpMajorVersion = lib.versions.major (lib.getVersion php);
-
-  mod_perl = pkgs.apacheHttpdPackages.mod_perl.override { apacheHttpd = pkg; };
-
-  vhosts = attrValues cfg.virtualHosts;
-
-  mkListenInfo = hostOpts:
-    if hostOpts.listen != [] then hostOpts.listen
-    else (
-      optional (hostOpts.onlySSL || hostOpts.addSSL || hostOpts.forceSSL) { ip = "*"; port = 443; ssl = true; } ++
-      optional (!hostOpts.onlySSL) { ip = "*"; port = 80; ssl = false; }
-    );
-
-  listenInfo = unique (concatMap mkListenInfo vhosts);
-
-  enableHttp2 = any (vhost: vhost.http2) vhosts;
-  enableSSL = any (listen: listen.ssl) listenInfo;
-  enableUserDir = any (vhost: vhost.enableUserDir) vhosts;
-
-  # NOTE: generally speaking order of modules is very important
-  modules =
-    [ # required apache modules our httpd service cannot run without
-      "authn_core" "authz_core"
-      "log_config"
-      "mime" "autoindex" "negotiation" "dir"
-      "alias" "rewrite"
-      "unixd" "slotmem_shm" "socache_shmcb"
-      "mpm_${cfg.multiProcessingModule}"
-    ]
-    ++ (if cfg.multiProcessingModule == "prefork" then [ "cgi" ] else [ "cgid" ])
-    ++ optional enableHttp2 "http2"
-    ++ optional enableSSL "ssl"
-    ++ optional enableUserDir "userdir"
-    ++ optional cfg.enableMellon { name = "auth_mellon"; path = "${pkgs.apacheHttpdPackages.mod_auth_mellon}/modules/mod_auth_mellon.so"; }
-    ++ optional cfg.enablePHP { name = "php${phpMajorVersion}"; path = "${php}/modules/libphp${phpMajorVersion}.so"; }
-    ++ optional cfg.enablePerl { name = "perl"; path = "${mod_perl}/modules/mod_perl.so"; }
-    ++ cfg.extraModules;
-
-  loggingConf = (if cfg.logFormat != "none" then ''
-    ErrorLog ${cfg.logDir}/error.log
-
-    LogLevel notice
-
-    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
-    LogFormat "%h %l %u %t \"%r\" %>s %b" common
-    LogFormat "%{Referer}i -> %U" referer
-    LogFormat "%{User-agent}i" agent
-
-    CustomLog ${cfg.logDir}/access.log ${cfg.logFormat}
-  '' else ''
-    ErrorLog /dev/null
-  '');
-
-
-  browserHacks = ''
-    <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";
-        };
-      };
-
-  };
-}
diff --git a/modules/websites/httpd-service-builder.patch b/modules/websites/httpd-service-builder.patch
deleted file mode 100644 (file)
index f0ad836..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
---- /nix/store/xj651aslybfsma20hpbi5nznfcffq8ky-nixexprs.tar.xz/nixos/modules/services/web-servers/apache-httpd/default.nix    1970-01-01 01:00:01.000000000 +0100
-+++ modules/websites/httpd-service-builder.nix 2020-04-04 03:08:29.068490345 +0200
-@@ -1,12 +1,15 @@
-+# to help backporting this builder should stay as close as possible to
-+# nixos/modules/services/web-servers/apache-httpd/default.nix
-+{ httpdName, withUsers ? true }:
- { config, lib, pkgs, ... }:
- with lib;
- let
--  cfg = config.services.httpd;
-+  cfg = config.services.httpd."${httpdName}";
--  runtimeDir = "/run/httpd";
-+  runtimeDir = "/run/httpd_${httpdName}";
-   pkg = cfg.package.out;
-@@ -318,13 +321,6 @@
-         Require all denied
-     </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";
-         };
-       };
diff --git a/modules/websites/php-application.nix b/modules/websites/php-application.nix
deleted file mode 100644 (file)
index 3a43a45..0000000
+++ /dev/null
@@ -1,224 +0,0 @@
-{ lib, config, pkgs, ... }:
-with lib;
-let
-  cfg = config.services.phpApplication;
-  cfgByEnv = lists.groupBy (x: x.websiteEnv) (builtins.attrValues cfg.apps);
-in
-{
-  options = with types; {
-    services.phpApplication.apps = mkOption {
-      default = {};
-      description = ''
-        php applications to define
-        '';
-      type = attrsOf (submodule {
-        options = {
-          varDir = mkOption {
-            type = nullOr path;
-            description = ''
-              Path to application’s vardir.
-              '';
-          };
-          varDirPaths = mkOption {
-            type = attrsOf str;
-            default = {};
-            description = ''
-              Map of additional folders => mode to create under varDir
-              '';
-          };
-          mode = mkOption {
-            type = str;
-            default = "0700";
-            description = ''
-              Mode to apply to the vardir
-              '';
-          };
-          phpSession = mkOption {
-            type = bool;
-            default = true;
-            description = "Handle phpsession files separately in vardir";
-          };
-          phpListen = mkOption {
-            type = nullOr str;
-            default = null;
-            description = "Name of the socket to listen to. Defaults to app name if null";
-          };
-          phpPool = mkOption {
-            type = attrsOf str;
-            default = {};
-            description = "Pool configuration to append";
-          };
-          phpEnv = mkOption {
-            type = attrsOf str;
-            default = {};
-            description = "Pool environment to append";
-          };
-          phpPackage = mkOption {
-            type = attrsOf str;
-            default = pkgs.php;
-            description = "Php package to use";
-          };
-          phpOptions = mkOption {
-            type = lines;
-            default = "";
-            description = "php configuration to append";
-          };
-          phpOpenbasedir = mkOption {
-            type = listOf path;
-            default = [];
-            description = ''
-              paths to add to php open_basedir configuration in addition to app and vardir
-              '';
-          };
-          phpWatchFiles = mkOption {
-            type = listOf path;
-            default = [];
-            description = ''
-              Path to other files to watch to trigger preStart scripts
-              '';
-          };
-          websiteEnv = mkOption {
-            type = str;
-            description = ''
-              website instance name to use
-              '';
-          };
-          httpdUser = mkOption {
-            type = str;
-            default = config.services.httpd.user;
-            description = ''
-              httpd user to run the prestart scripts as.
-              '';
-          };
-          httpdGroup = mkOption {
-            type = str;
-            default = config.services.httpd.group;
-            description = ''
-              httpd group to run the prestart scripts as.
-              '';
-          };
-          httpdWatchFiles = mkOption {
-            type = listOf path;
-            default = [];
-            description = ''
-              Path to other files to watch to trigger httpd reload
-              '';
-          };
-          app = mkOption {
-            type = path;
-            description = ''
-              Path to application root
-              '';
-          };
-          webRoot = mkOption {
-            type = nullOr path;
-            description = ''
-              Path to the web root path of the application. May differ from the application itself (usually a subdirectory)
-              '';
-          };
-          preStartActions = mkOption {
-            type = listOf str;
-            default = [];
-            description = ''
-              List of actions to run as apache user at preStart when
-              whatchFiles or app dir changed.
-              '';
-          };
-          serviceDeps = mkOption {
-            type = listOf str;
-            default = [];
-            description = ''
-              List of systemd services this application depends on
-              '';
-          };
-        };
-      });
-    };
-    # Read-only variables
-    services.phpApplication.phpListenPaths = mkOption {
-      type = attrsOf path;
-      default = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
-        name config.services.phpfpm.pools."${name}".socket
-      ) cfg.apps;
-      readOnly = true;
-      description = ''
-        Full paths to listen for php
-        '';
-    };
-  };
-
-  config = {
-    services.websites.env = attrsets.mapAttrs' (name: cfgs: attrsets.nameValuePair
-      name {
-        modules = [ "proxy_fcgi" ];
-        watchPaths = builtins.concatLists (map (c: c.httpdWatchFiles) cfgs);
-      }
-    ) cfgByEnv;
-
-    services.phpfpm.pools = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
-      name {
-        user = icfg.httpdUser;
-        group = icfg.httpdUser;
-        settings = {
-          "listen.owner" = icfg.httpdUser;
-          "listen.group" = icfg.httpdGroup;
-          "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" ([icfg.app icfg.varDir] ++ icfg.phpWatchFiles ++ icfg.phpOpenbasedir);
-        }
-        // optionalAttrs (icfg.phpSession) { "php_admin_value[session.save_path]" = "${icfg.varDir}/phpSessions"; }
-        // icfg.phpPool;
-        phpOptions = config.services.phpfpm.phpOptions + icfg.phpOptions;
-        inherit (icfg) phpEnv phpPackage;
-      }
-    ) cfg.apps;
-
-    services.filesWatcher = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
-      "phpfpm-${name}" {
-        restart = true;
-        paths = icfg.phpWatchFiles;
-      }
-    ) (attrsets.filterAttrs (n: v: builtins.length v.phpWatchFiles > 0) cfg.apps);
-
-    systemd.services = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
-      "phpfpm-${name}" {
-        after = lib.mkAfter icfg.serviceDeps;
-        wants = icfg.serviceDeps;
-        preStart = lib.mkAfter (optionalString (!isNull icfg.varDir) ''
-          watchFilesChanged() {
-            ${optionalString (builtins.length icfg.phpWatchFiles == 0) "return 1"}
-            [ ! -f "${icfg.varDir}"/watchedFiles ] \
-              || ! sha512sum -c --status ${icfg.varDir}/watchedFiles
-          }
-          appDirChanged() {
-            [ ! -f "${icfg.varDir}/currentWebappDir" -o \
-              "${icfg.app}" != "$(cat ${icfg.varDir}/currentWebappDir 2>/dev/null)" ]
-          }
-          updateWatchFiles() {
-            ${optionalString (builtins.length icfg.phpWatchFiles == 0) "return 0"}
-            sha512sum ${builtins.concatStringsSep " " icfg.phpWatchFiles} > ${icfg.varDir}/watchedFiles
-          }
-
-          if watchFilesChanged || appDirChanged; then
-            pushd ${icfg.app} > /dev/null
-            ${builtins.concatStringsSep "\n  " (map (c: "/run/wrappers/bin/sudo -u ${icfg.httpdUser} ${c}") icfg.preStartActions) }
-            popd > /dev/null
-            echo -n "${icfg.app}" > ${icfg.varDir}/currentWebappDir
-            updateWatchFiles
-          fi
-        '');
-      }
-    ) cfg.apps;
-
-    system.activationScripts = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
-      name {
-        deps = [];
-        text = optionalString (!isNull icfg.varDir) ''
-          install -m ${icfg.mode} -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir}
-          '' + optionalString (icfg.phpSession) ''
-          install -m 0700 -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir}/phpSessions
-          '' + builtins.concatStringsSep "\n" (attrsets.mapAttrsToList (n: v: ''
-            install -m ${v} -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir}/${n}
-            '') icfg.varDirPaths);
-      }
-    ) cfg.apps;
-  };
-}
diff --git a/modules/zrepl.nix b/modules/zrepl.nix
deleted file mode 100644 (file)
index 5bcc17b..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-{ config, lib, pkgs, ... }:
-let
-  cfg = config.services.zrepl;
-in
-{
-  options = {
-    services.zrepl = {
-      enable = lib.mkEnableOption "Enable the zrepl daemon";
-
-      config = lib.mkOption {
-        type = lib.types.lines;
-        default = "";
-        description = "Configuration";
-      };
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    secrets.keys = {
-      "zrepl/zrepl.yml" = {
-        permissions = "0400";
-        text = cfg.config;
-        user = config.systemd.services.zrepl.serviceConfig.User or "root";
-        group = config.systemd.services.zrepl.serviceConfig.Group or "root";
-      };
-    };
-    services.filesWatcher.zrepl = {
-      restart = true;
-      paths = [ config.secrets.fullPaths."zrepl/zrepl.yml" ];
-    };
-    systemd.services.zrepl = {
-      description = "zrepl daemon";
-      wantedBy = [ "multi-user.target" ];
-      path = [ pkgs.zfs pkgs.openssh ];
-      serviceConfig = {
-        ExecStart =
-          let configFile = config.secrets.fullPaths."zrepl/zrepl.yml";
-          in "${pkgs.zrepl}/bin/zrepl daemon --config ${configFile}";
-        Type = "simple";
-        RuntimeDirectory= "zrepl";
-        RuntimeDirectoryMode= "0700";
-      };
-    };
-  };
-}
diff --git a/nix/README.md b/nix/README.md
deleted file mode 100644 (file)
index 7bf996c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-This directory is handled by niv, but it prefers to have a directory
-named "nix"
diff --git a/nix/sources.json b/nix/sources.json
deleted file mode 100644 (file)
index 1a1cf5a..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-{
-    "buildbot-cours-deps": {
-        "ref": "master",
-        "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Cours",
-        "rev": "33f139f2e2ea0a16b8ed813c5436e5a5bb506f6d",
-        "type": "git"
-    },
-    "buildbot-cours-nixpkgs": {
-        "branch": "nixos-unstable",
-        "description": "Frozen nixpkgs snapshot for texlive",
-        "homepage": "https://github.com/NixOS/nixpkgs",
-        "owner": "NixOS",
-        "repo": "nixpkgs-channels",
-        "rev": "fce7562cf46727fdaf801b232116bc9ce0512049",
-        "sha256": "14rvi69ji61x3z88vbn17rg5vxrnw2wbnanxb7y0qzyqrj7spapx",
-        "type": "tarball",
-        "url": "https://github.com/NixOS/nixpkgs-channels/archive/fce7562cf46727fdaf801b232116bc9ce0512049.tar.gz",
-        "url_template": "https://github.com/<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"
-    }
-}
diff --git a/nix/sources.nix b/nix/sources.nix
deleted file mode 100644 (file)
index 45c97d1..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-# 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); }
diff --git a/nixops/.gitignore b/nixops/.gitignore
deleted file mode 100644 (file)
index 2ea467b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/state
diff --git a/nixops/.sops.yaml b/nixops/.sops.yaml
deleted file mode 100644 (file)
index 04826a2..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-keys:
-  - &Immae F82806FDA1BF5B9A1B3014E7C9FCED6CA6B79454
-  # obtained with: ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age
-  - &eldiron age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj
-  - &monitoring-1 age1dn4lzhgxusqrpjjnzm7w8ml39ptf326htuzmpqdqs2gg3wq7cqzqxuvx8k
-  - &backup-2 age1kk3nr27qu42j28mcfdag5lhq0zu2pky7gfanvne8l4z2ctevjpgskmw0sr
-  - &dilion age1x49n6qa0arkdpq8530s7umgm0gqkq90exv4jep97q30rfnzknpaqate06a
-  - &quatresaisons age1yz8u6xvh2fltvyp96ep8crce3qx4tuceyhun6pwddfe0uvcrkarscxl7e7
-creation_rules:
-  - path_regex: vars.yml
-    key_groups:
-      - pgp:
-        - *Immae
-        age:
-        - *eldiron
-        - *monitoring-1
-        - *backup-2
-        - *dilion
-        - *quatresaisons
diff --git a/nixops/Makefile b/nixops/Makefile
deleted file mode 100644 (file)
index fb9da4c..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-ifndef NIXOPS_ENV_LOADED
-  $(error "Please load environment with direnv")
-endif
-
-###### Current channel information
-nix-info:
-       @version=$$(nix eval --raw nixpkgs.lib.version) && \
-         mainversion=$$(echo $$version | cut -d"." -f -2) && \
-         echo "https://releases.nixos.org/nixos/$$mainversion/nixos-$$version/nixexprs.tar.xz" && \
-         nix-instantiate --find-file nixpkgs
-.PHONY: nix-info
-
-###### Initial setup
-setup:
-       ./scripts/setup
-.PHONY: setup
-
-###### Morph regular tasks
-PROFILE=/nix/var/nix/profiles/per-user/immae/morph/immaeEu
-TARGET ?=
-MORPH_ARGS ?=
-ifdef TARGET
-  # multiple targets: --on="{machine1,machine2}" (works with * glob too)
-  override MORPH_ARGS +=--on=$(TARGET)
-endif
-SSH_ARGS ?=
-
-edit_env:
-       $(EDITOR) secrets/environment.nix || true
-       git -C secrets add environment.nix || true
-       git -C secrets commit -m "Edit environment.nix" environment.nix || true
-
-edit_vars:
-       sops secrets/vars.yml || true
-       git -C secrets add vars.yml || true
-       git -C secrets commit -m "Edit password for vars.yml using sops." vars.yml || true
-
-ssh-eldiron:
-       ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@eldiron $(SSH_ARGS)'
-
-ssh-dilion:
-       ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@dilion $(SSH_ARGS)'
-
-ssh-backup-2:
-       ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@backup-2 $(SSH_ARGS)'
-
-ssh-monitoring-1:
-       ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@monitoring-1 $(SSH_ARGS)'
-
-ssh-4c:
-       ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@quatresaisons $(SSH_ARGS)'
-
-debug:
-       ./scripts/with_env morph build --show-trace default.nix $(MORPH_ARGS)
-
-build:
-       ./scripts/with_env morph build default.nix $(MORPH_ARGS)
-
-dry-run:
-       ./scripts/with_env morph build --dry-run default.nix $(MORPH_ARGS)
-
-upload:
-       ./scripts/with_env morph push default.nix $(MORPH_ARGS)
-
-deploy:
-       ./scripts/with_env morph deploy default.nix switch --keep-result --upload-secrets $(MORPH_ARGS)
-       nix-env -p $(PROFILE) --set .gcroots/default.nix
-
-next-boot:
-       ./scripts/with_env morph deploy default.nix boot --keep-result --upload-secrets $(MORPH_ARGS)
-       nix-env -p $(PROFILE) --set .gcroots/default.nix
-
-deploy-reboot:
-       ./scripts/with_env morph deploy default.nix boot --reboot --upload-secrets $(MORPH_ARGS)
-
-.PHONY: ssh-eldiron ssh-dilion ssh-monitoring-1 ssh-backup-2 debug build upload deploy deploy-reboot
-
-###### Cleanup generations and garbage collection
-GEN ?= "+3"
-
-list-generations:
-       nix-env -p $(PROFILE) --list-generations
-       $(MAKE) ssh-eldiron SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --list-generations"
-.PHONY: list-generations
-
-delete-generations:
-       @echo "making sure that a complete build is done before cleaning up"
-       $(MAKE) build MORPH_ARGS=--keep-result
-       nix-env -p $(PROFILE) --delete-generations $(GEN)
-       $(MAKE) ssh-eldiron SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)"
-       $(MAKE) ssh-dilion SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)"
-       $(MAKE) ssh-backup-2 SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)"
-       $(MAKE) ssh-monitoring-1 SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)"
-.PHONY: delete-generations
-
-cleanup: delete-generations
-       nix-store --gc
-       $(MAKE) ssh-eldiron SSH_ARGS="nix-store --gc"
-       $(MAKE) ssh-dilion SSH_ARGS="nix-store --gc"
-       $(MAKE) ssh-backup-2 SSH_ARGS="nix-store --gc"
-       $(MAKE) ssh-monitoring-1 SSH_ARGS="nix-store --gc"
-.PHONY: cleanup
diff --git a/nixops/default.nix b/nixops/default.nix
deleted file mode 100644 (file)
index 1241443..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  dilion = import ../modules/private/system/dilion.nix;
-  eldiron = import ../modules/private/system/eldiron.nix;
-  backup-2 = import ../modules/private/system/backup-2.nix;
-  monitoring-1 = import ../modules/private/system/monitoring-1.nix;
-
-  quatresaisons = import ../modules/private/system/quatresaisons.nix;
-}
diff --git a/nixops/scripts/with_env b/nixops/scripts/with_env
deleted file mode 100755 (executable)
index c570ccf..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-
-if [ -z "$NIXOPS_ENV_LOADED" ]; then
-  echo "Please load the environment with direnv"
-  exit 1;
-fi
-
-umask 0077
-TEMP=$(mktemp -d /tmp/XXXXXX-nixops-files)
-chmod go-rwx $TEMP
-
-finish() {
-  rm -rf "$TEMP"
-}
-
-trap finish EXIT
-
-sops -d secrets/vars.yml | yq -r .ssl_keys.nix_repository > $TEMP/id_ed25519
-
-export SSH_IDENTITY_FILE="$TEMP/id_ed25519"
-
-"$@"
diff --git a/nixops/secrets b/nixops/secrets
deleted file mode 160000 (submodule)
index 8c6277e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 8c6277e3c2762e13d5f1f2ac06d2e815e02fab82
diff --git a/overlays/bonfire/default.nix b/overlays/bonfire/default.nix
deleted file mode 100644 (file)
index 6dc1034..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-self: super: {
-  bonfire = let
-    click = self.python3Packages.click.overridePythonAttrs(old: rec {
-      version = "6.7";
-      src = self.python3Packages.fetchPypi {
-        pname = "click";
-        inherit version;
-        sha256 = "02qkfpykbq35id8glfgwc38yc430427yd05z1wc5cnld8zgicmgi";
-      };
-      postPatch = ''
-        substituteInPlace click/_unicodefun.py --replace "'locale'" "'${self.locale}/bin/locale'"
-      '';
-      doCheck = false;
-    });
-    keyring = self.python3Packages.keyring.overridePythonAttrs(old: rec {
-      version = "20.0.1";
-      src = self.python3Packages.fetchPypi {
-        pname = "keyring";
-        inherit version;
-        sha256 = "963bfa7f090269d30bdc5e25589e5fd9dad2cf2a7c6f176a7f2386910e5d0d8d";
-      };
-    });
-  in
-    super.bonfire.overridePythonAttrs(old: {
-      version = "0.0.8";
-      src = self.fetchFromGitHub {
-        owner = "blue-yonder";
-        repo = "bonfire";
-        rev = "0a0f18469d484aba6871fa7421bbb2c00ccefcb0";
-        sha256 = "1y2r537ibghhmk6jngw0zwvh1vn2bihqcvji50ffh1j0qc6q3x6x";
-      };
-      postPatch = "";
-      propagatedBuildInputs = self.lib.subtractLists [ self.python3Packages.click self.python3Packages.keyring ] old.propagatedBuildInputs ++ [ click keyring ];
-      meta.broken = false;
-    });
-}
diff --git a/overlays/bugwarrior/default.nix b/overlays/bugwarrior/default.nix
deleted file mode 100644 (file)
index 2b25985..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-self: super: {
-  bugwarrior = super.python3Packages.bugwarrior.overridePythonAttrs(old: rec {
-    patches = old.patches or [] ++ [ ./mantisbt.patch ];
-  });
-}
diff --git a/overlays/bugwarrior/mantisbt.patch b/overlays/bugwarrior/mantisbt.patch
deleted file mode 100644 (file)
index 85e5af1..0000000
+++ /dev/null
@@ -1,379 +0,0 @@
-diff --git a/bugwarrior/services/mantisbt.py b/bugwarrior/services/mantisbt.py
-new file mode 100644
-index 0000000..e54af0d
---- /dev/null
-+++ b/bugwarrior/services/mantisbt.py
-@@ -0,0 +1,361 @@
-+from builtins import filter
-+import re
-+import six
-+
-+import requests
-+from jinja2 import Template
-+
-+from bugwarrior.config import asbool, aslist, die
-+from bugwarrior.services import IssueService, Issue, ServiceClient
-+
-+import logging
-+log = logging.getLogger(__name__)
-+
-+
-+class MantisbtClient(ServiceClient):
-+    def __init__(self, host, token):
-+        self.host = host
-+        self.session = requests.Session()
-+        self.session.headers['Authorization'] = token
-+
-+    def _api_url(self, path, **context):
-+        """ Build the full url to the API endpoint """
-+        baseurl = "https://{}/api/rest".format(self.host)
-+        return baseurl + path.format(**context)
-+
-+    def get_user(self):
-+        return self.json_response(self.session.get(self._api_url("/users/me")))
-+
-+    def get_projects(self):
-+        return self._getter(self._api_url("/projects"), subkey="projects")
-+
-+    def get_issues(self):
-+        url = self._api_url("/issues?page_size=50")
-+        return self._getter(url, page_size=50, subkey="issues")
-+
-+    def get_assigned_issues(self):
-+        """ Returns all issues assigned to authenticated user.
-+        """
-+        url = self._api_url("/issues?page_size=50&filter_id=assigned")
-+        return self._getter(url, page_size=50, subkey="issues")
-+
-+    def get_monitored_issues(self):
-+        """ Returns all issues monitored by authenticated user.
-+        """
-+        url = self._api_url("/issues?page_size=50&filter_id=monitored")
-+        return self._getter(url, page_size=50, subkey="issues")
-+
-+    def get_reported_issues(self):
-+        """ Returns all issues reported by authenticated user.
-+        """
-+        url = self._api_url("/issues?page_size=50&filter_id=reported")
-+        return self._getter(url, page_size=50, subkey="issues")
-+
-+    def _getter(self, url, page_size=None, subkey=None):
-+        """ Pagination utility.  Obnoxious. """
-+
-+        results = []
-+        link = dict(next=url)
-+        page_number = 1
-+
-+        while 'next' in link:
-+            if page_size is not None:
-+                response = self.session.get(link['next'] + "&page=" + str(page_number))
-+            else:
-+                response = self.session.get(link['next'])
-+
-+            json_res = self.json_response(response)
-+
-+            if subkey is not None:
-+                json_res = json_res[subkey]
-+
-+            results += json_res
-+
-+            if page_size is not None and len(json_res) == page_size:
-+                page_number += 1
-+            else:
-+                break
-+
-+        return results
-+
-+class MantisbtIssue(Issue):
-+    TITLE = 'mantisbttitle'
-+    BODY = 'mantisbtbody'
-+    CREATED_AT = 'mantisbtcreatedon'
-+    UPDATED_AT = 'mantisbtupdatedat'
-+    CLOSED_AT = 'mantisbtclosedon'
-+    URL = 'mantisbturl'
-+    PROJECT = 'mantisbtproject'
-+    NUMBER = 'mantisbtnumber'
-+    USER = 'mantisbtuser'
-+    CATEGORY = 'mantisbtcategory'
-+    STATE = 'mantisbtstate'
-+
-+    UDAS = {
-+        TITLE: {
-+            'type': 'string',
-+            'label': 'Mantisbt Title',
-+        },
-+        BODY: {
-+            'type': 'string',
-+            'label': 'Mantisbt Body',
-+        },
-+        CREATED_AT: {
-+            'type': 'date',
-+            'label': 'Mantisbt Created',
-+        },
-+        UPDATED_AT: {
-+            'type': 'date',
-+            'label': 'Mantisbt Updated',
-+        },
-+        CLOSED_AT: {
-+            'type': 'date',
-+            'label': 'Mantisbt Closed',
-+        },
-+        PROJECT: {
-+            'type': 'string',
-+            'label': 'Mantisbt Project',
-+        },
-+        URL: {
-+            'type': 'string',
-+            'label': 'Mantisbt URL',
-+        },
-+        NUMBER: {
-+            'type': 'numeric',
-+            'label': 'Mantisbt Issue #',
-+        },
-+        USER: {
-+            'type': 'string',
-+            'label': 'Mantisbt User',
-+        },
-+        CATEGORY: {
-+            'type': 'string',
-+            'label': 'Mantisbt Category',
-+        },
-+        STATE: {
-+            'type': 'string',
-+            'label': 'Mantisbt State',
-+        }
-+    }
-+    UNIQUE_KEY = (URL, NUMBER, )
-+
-+    def _normalize_tag(self, label):
-+        return re.sub(r'[^a-zA-Z0-9]', '_', label)
-+
-+    def to_taskwarrior(self):
-+        body = self.record.get('description')
-+        if body:
-+            body = body.replace('\r\n', '\n')
-+
-+        created = self.parse_date(self.record.get('created_at'))
-+        updated = self.parse_date(self.record.get('updated_at'))
-+        closed_date = None
-+        if self.record["status"]["name"] in ["closed", "resolved"]:
-+            for history in self.record.get("history", []):
-+                if history.get("field", {}).get("name", "") == "status"\
-+                        and history.get("new_value", {}).get("name", "") in ["closed", "resolved"]:
-+                    closed_date = history["created_at"]
-+        closed = self.parse_date(closed_date)
-+
-+        return {
-+            'project': self.record['project']['name'],
-+            'priority': self.origin['default_priority'],
-+            'annotations': self.get_annotations(),
-+            'tags': self.get_tags(),
-+            'entry': created,
-+            'end': closed,
-+
-+            self.TITLE: self.record.get('summary'),
-+            self.BODY: body,
-+            self.CREATED_AT: created,
-+            self.UPDATED_AT: updated,
-+            self.CLOSED_AT: closed,
-+            self.URL: self.get_url(),
-+            self.PROJECT: self.record['project'].get('name'),
-+            self.NUMBER: self.record['id'],
-+            self.USER: self.record['reporter'].get('name'),
-+            self.CATEGORY: self.record['category'].get('name'),
-+            self.STATE: self.record['status'].get('label'),
-+        }
-+
-+    def get_url(self):
-+        return "https://{}view.php?id={}".format(self.extra['host'], self.record["id"])
-+
-+    def get_annotations(self):
-+        annotations = []
-+
-+        context = self.record.copy()
-+        annotation_template = Template(self.origin['annotation_template'])
-+
-+        for annotation_dict in self.record.get('notes', []):
-+            context.update({
-+                'text': annotation_dict['text'],
-+                'date': annotation_dict['created_at'],
-+                'author': annotation_dict['reporter'].get('name', 'unknown'),
-+                'view': annotation_dict['view_state']['label'],
-+                })
-+            annotations.append(
-+                    annotation_template.render(context)
-+                    )
-+        return annotations
-+
-+    def get_tags(self):
-+        tags = []
-+
-+        context = self.record.copy()
-+        tag_template = Template(self.origin['tag_template'])
-+
-+        for tag_dict in self.record.get('tags', []):
-+            context.update({
-+                'tag': self._normalize_tag(tag_dict['name'])
-+            })
-+            tags.append(
-+                tag_template.render(context)
-+            )
-+
-+        return tags
-+
-+    def get_default_description(self):
-+        return self.build_default_description(
-+            title=self.record['summary'],
-+            url=self.get_processed_url(self.get_url()),
-+            number=self.record['id'],
-+        )
-+
-+
-+class MantisbtService(IssueService):
-+    ISSUE_CLASS = MantisbtIssue
-+    CONFIG_PREFIX = 'mantisbt'
-+
-+    def __init__(self, *args, **kw):
-+        super(MantisbtService, self).__init__(*args, **kw)
-+
-+        self.host = self.config.get('host', 'www.mantisbt.org/bugs/')
-+
-+        token = self.get_password('token')
-+
-+        self.client = MantisbtClient(self.host, token)
-+        self.user = None
-+
-+        self.exclude_projects = self.config.get('exclude_projects', [], aslist)
-+        self.include_projects = self.config.get('include_projects', [], aslist)
-+
-+        self.involved_issues = self.config.get(
-+            'involved_issues', default=True, to_type=asbool
-+        )
-+        self.assigned_issues = self.config.get(
-+            'assigned_issues', default=False, to_type=asbool
-+        )
-+        self.monitored_issues = self.config.get(
-+            'monitored_issues', default=False, to_type=asbool
-+        )
-+        self.reported_issues = self.config.get(
-+            'reported_issues', default=False, to_type=asbool
-+        )
-+        self.tag_template = self.config.get(
-+            'tag_template', default='{{tag}}', to_type=six.text_type
-+        )
-+        self.annotation_template = self.config.get(
-+            'annotation_template', default='{{date}} {{author}} ({{view}}): {{text}}', to_type=six.text_type
-+        )
-+
-+    def get_service_metadata(self):
-+        return {
-+            'tag_template': self.tag_template,
-+            'annotation_template': self.annotation_template,
-+        }
-+
-+    def filter_involved_issues(self, issue):
-+        _, issue = issue
-+        user = self.client.get_user()
-+        uid = user["id"]
-+        if issue["reporter"]["id"] != uid and \
-+                issue.get("handler", {}).get("id") != uid and \
-+                all([ x.get("user", {}).get("id") != uid for x in issue.get("history", [])]) and \
-+                all([ x.get("user", {}).get("id") != uid for x in issue.get("monitors", [])]):
-+            return False
-+        return self.filter_project_name(issue["project"]["name"])
-+
-+    def filter_issues(self, issue):
-+        _, issue = issue
-+        return self.filter_project_name(issue["project"]["name"])
-+
-+    def filter_project_name(self, name):
-+        if self.exclude_projects:
-+            if name in self.exclude_projects:
-+                return False
-+
-+        if self.include_projects:
-+            if name in self.include_projects:
-+                return True
-+            else:
-+                return False
-+
-+        return True
-+
-+    @staticmethod
-+    def get_keyring_service(service_config):
-+        host = service_config.get('host', 'www.mantisbt.org/bugs/')
-+        username = service_config.get('username', default='nousername')
-+        return "mantisbt://{username}@{host}".format(username=username,
-+                host=host)
-+
-+    @staticmethod
-+    def to_issue_dict(issues):
-+        return { i['id']: i for i in issues }
-+
-+    def get_owner(self, issue):
-+        return issue.get("handler", {}).get("name")
-+
-+    def get_author(self, issue):
-+        return issue.get("reporter", {}).get("name")
-+
-+    def issues(self):
-+        issues = {}
-+        is_limited = self.assigned_issues or self.monitored_issues or self.reported_issues
-+
-+        if self.assigned_issues:
-+            issues.update(
-+                filter(self.filter_issues, self.to_issue_dict(self.client.get_assigned_issues()).items())
-+            )
-+        if self.monitored_issues:
-+            issues.update(
-+                filter(self.filter_issues, self.to_issue_dict(self.client.get_monitored_issues()).items())
-+            )
-+        if self.reported_issues:
-+            issues.update(
-+                filter(self.filter_issues, self.to_issue_dict(self.client.get_reported_issues()).items())
-+            )
-+
-+        if not is_limited:
-+            all_issues = self.to_issue_dict(self.client.get_issues())
-+            if self.involved_issues:
-+                issues.update(
-+                    filter(self.filter_involved_issues, all_issues.items())
-+                )
-+            else:
-+                issues.update(
-+                    filter(self.filter_issues, all_issues.items())
-+                )
-+
-+        log.debug(" Found %i issues.", len(issues))
-+        if not is_limited:
-+            issues = list(filter(self.include, issues.values()))
-+        else:
-+            issues = list(issues.values())
-+        log.debug(" Pruned down to %i issues.", len(issues))
-+
-+        for issue in issues:
-+            issue_obj = self.get_issue_for_record(issue)
-+            extra = {
-+                'host': self.host
-+            }
-+            issue_obj.update_extra(extra)
-+            yield issue_obj
-+
-+    @classmethod
-+    def validate_config(cls, service_config, target):
-+        if 'token' not in service_config:
-+            die("[%s] has no 'mantisbt.token'" % target)
-+
-+        super(MantisbtService, cls).validate_config(service_config, target)
-diff --git a/setup.py b/setup.py
-index d6d957a..665e36e 100644
---- a/setup.py
-+++ b/setup.py
-@@ -80,6 +80,7 @@ setup(name='bugwarrior',
-       activecollab2=bugwarrior.services.activecollab2:ActiveCollab2Service
-       activecollab=bugwarrior.services.activecollab:ActiveCollabService
-       jira=bugwarrior.services.jira:JiraService
-+      mantisbt=bugwarrior.services.mantisbt:MantisbtService
-       megaplan=bugwarrior.services.megaplan:MegaplanService
-       phabricator=bugwarrior.services.phab:PhabricatorService
-       versionone=bugwarrior.services.versionone:VersionOneService
diff --git a/overlays/bundix/default.nix b/overlays/bundix/default.nix
deleted file mode 100644 (file)
index 6c4046c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-self: super: {
-  bundix = super.bundix.overrideAttrs (old: {
-    preBuild = (old.preBuild or "") + ''
-      sed -i -e "/case obj/a\      when nil\n        nil" lib/bundix/nixer.rb
-      '';
-  });
-}
diff --git a/overlays/databases/mysql/default.nix b/overlays/databases/mysql/default.nix
deleted file mode 100644 (file)
index f9e5791..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-self: super: rec {
-  mariadb_pam = super.mariadb.overrideAttrs(old: {
-    cmakeFlags = old.cmakeFlags ++ [ "-DWITH_AUTHENTICATION_PAM=ON" ];
-    buildInputs = old.buildInputs ++ [ self.pam ];
-    outputs = old.outputs ++ [ "dev" ];
-    postInstall = ''
-      mkdir -p $dev $dev/lib $dev/share
-      cp -a $out/include $dev
-      cp -a $out/lib/{libmariadbclient.a,libmysqlclient.a,libmysqlclient_r.a,libmysqlservices.a} $dev/lib
-      cp -a $out/lib/pkgconfig $dev/lib
-      cp -a $out/share/aclocal $dev/share
-    '' + old.postInstall;
-  });
-  # This patched version includes C headers from the server part (see
-  # above). It seems to be required to build pam support in clients.
-  libmysqlclient_pam = super.libmysqlclient.overrideAttrs(old: {
-    prePatch = old.prePatch or "" + ''
-      sed -i -e '/define INCLUDE/s|"$| -I@CMAKE_SYSROOT@@CMAKE_INSTALL_PREFIX@/@INSTALL_INCLUDEDIR@/mysql/server -I@CMAKE_SYSROOT@@CMAKE_INSTALL_PREFIX@/@INSTALL_INCLUDEDIR@/mysql/server/private"|' mariadb_config/mariadb_config.c.in
-    '';
-    postInstall = old.postInstall or "" + ''
-      cp -a ${mariadb_pam.dev}/include/* $out/include/mariadb
-    '';
-  });
-}
diff --git a/overlays/default.nix b/overlays/default.nix
deleted file mode 100644 (file)
index bdc99d2..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-let
-  flakeCompat = import ../lib/flake-compat.nix;
-  flakes = builtins.foldl' (a: b: a // b) {} (map (n: (flakeCompat n).overlays) [
-    ../flakes/backports
-    ../flakes/openarc
-    ../flakes/opendmarc
-    ../flakes/peertube
-    ../flakes/private/peertube
-  ]);
-in flakes // {
-  mylibs = self: super: { mylibs = import ../lib { pkgs = self; }; };
-  mypkgs = self: super: import ../pkgs { pkgs = self; };
-
-  bitlbee = import ./bitlbee;
-  bitlbee-discord = import ./bitlbee-discord;
-  bonfire = import ./bonfire;
-  bundix = import ./bundix;
-  bugwarrior = import ./bugwarrior;
-  dwm = import ./dwm;
-  elinks = import ./elinks;
-  gitweb = import ./gitweb;
-  gitolite = import ./gitolite;
-  goaccess = import ./goaccess;
-  kanboard = import ./kanboard;
-  ledger = import ./ledger;
-  lesspipe = import ./lesspipe;
-  mysql = import ./databases/mysql;
-  neomutt = import ./neomutt;
-  nixops = import ./nixops;
-  pass = import ./pass;
-  pelican = import ./pelican;
-  php-packages = import ./php-packages;
-  postfix = import ./postfix;
-  postgresql = import ./databases/postgresql;
-  procps-ng = import ./procps-ng;
-  sc-im = import ./sc-im;
-  shaarli = import ./shaarli;
-  slrn = import ./slrn;
-  taskwarrior = import ./taskwarrior;
-  vcsh = import ./vcsh;
-  weechat = import ./weechat;
-  ympd = import ./ympd;
-  doing = import ./doing;
-  khal = import ./khal;
-  nix-direnv = import ./nix-direnv;
-  morph = import ./morph;
-}
-// import ./python-packages
diff --git a/overlays/doing/default.nix b/overlays/doing/default.nix
deleted file mode 100644 (file)
index 7f95fb6..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-self: super: {
-  defaultGemConfig = super.defaultGemConfig // {
-    doing = attrs: {
-      postInstall = ''
-        installPath=$(cat $out/nix-support/gem-meta/install-path)
-        sed -i $installPath/lib/doing/wwid.rb -e "/Create a backup copy for the undo command/ {n;d}"
-      '';
-    };
-  };
-}
diff --git a/overlays/dwm/default.nix b/overlays/dwm/default.nix
deleted file mode 100644 (file)
index 96ed3ff..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-self: super: {
-  dwm = super.dwm.overrideAttrs(old: rec {
-    postPatch = ''
-      cp ${./dwm_config.h} ./config.h
-      '';
-  });
-}
diff --git a/overlays/dwm/dwm_config.h b/overlays/dwm/dwm_config.h
deleted file mode 100644 (file)
index b1587e8..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/* See LICENSE file for copyright and license details. */
-
-/* appearance */
-static const unsigned int borderpx  = 1;        /* border pixel of windows */
-static const unsigned int snap      = 32;       /* snap pixel */
-static const int showbar            = 1;        /* 0 means no bar */
-static const int topbar             = 1;        /* 0 means bottom bar */
-static const char *fonts[]          = { "monospace:size=10" };
-static const char dmenufont[]       = "monospace:size=10";
-static const char col_gray1[]       = "#222222";
-static const char col_gray2[]       = "#444444";
-static const char col_gray3[]       = "#bbbbbb";
-static const char col_gray4[]       = "#eeeeee";
-static const char col_cyan[]        = "#005577";
-static const char *colors[][3]      = {
-       /*               fg         bg         border   */
-       [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
-       [SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
-};
-
-/* tagging */
-static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
-
-static const Rule rules[] = {
-       /* xprop(1):
-        *      WM_CLASS(STRING) = instance, class
-        *      WM_NAME(STRING) = title
-        */
-       /* class       instance    title      tags mask     isfloating   monitor */
-       { "Nextcloud", NULL,       NULL,      9 << 8,       0,           -1 },
-};
-
-/* layout(s) */
-static const float mfact     = 0.55; /* factor of master area size [0.05..0.95] */
-static const int nmaster     = 1;    /* number of clients in master area */
-static const int resizehints = 1;    /* 1 means respect size hints in tiled resizals */
-
-static const Layout layouts[] = {
-       /* symbol     arrange function */
-       { "[M]",      monocle }, /* first entry is default */
-       { "[]=",      tile },
-       { "><>",      NULL },    /* no layout function means floating behavior */
-};
-
-/* key definitions */
-#define MODKEY Mod1Mask
-#define TAGKEYS(KEY,TAG) \
-       { MODKEY,                       KEY,      view,           {.ui = 1 << TAG} }, \
-       { MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
-       { MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << TAG} }, \
-       { MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << TAG} },
-
-/* helper for spawning shell commands in the pre dwm-5.0 fashion */
-#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
-
-/* commands */
-static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
-static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
-static const char *termcmd[]  = { "st", NULL };
-
-static Key keys[] = {
-       /* modifier                     key        function        argument */
-       { MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
-       { MODKEY,                       XK_t,      spawn,          {.v = termcmd } },
-       { MODKEY,                       XK_Tab,    view,           {0} },
-       { MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
-       { MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
-       { MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
-       { MODKEY,                       XK_Return, zoom,           {0} },
-       TAGKEYS(                        XK_1,                      0)
-       TAGKEYS(                        XK_2,                      1)
-       TAGKEYS(                        XK_3,                      2)
-       TAGKEYS(                        XK_4,                      3)
-       TAGKEYS(                        XK_5,                      4)
-       TAGKEYS(                        XK_6,                      5)
-       TAGKEYS(                        XK_7,                      6)
-       TAGKEYS(                        XK_8,                      7)
-       TAGKEYS(                        XK_9,                      8)
-       { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
-};
-
-/* button definitions */
-/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
-static Button buttons[] = {
-       /* click                event mask      button          function        argument */
-       { ClkLtSymbol,          0,              Button1,        setlayout,      {0} },
-       { ClkLtSymbol,          0,              Button3,        setlayout,      {.v = &layouts[2]} },
-       { ClkWinTitle,          0,              Button2,        zoom,           {0} },
-       { ClkStatusText,        0,              Button2,        spawn,          {.v = termcmd } },
-       { ClkClientWin,         MODKEY,         Button1,        movemouse,      {0} },
-       { ClkClientWin,         MODKEY,         Button2,        togglefloating, {0} },
-       { ClkClientWin,         MODKEY,         Button3,        resizemouse,    {0} },
-       { ClkTagBar,            0,              Button1,        view,           {0} },
-       { ClkTagBar,            0,              Button3,        toggleview,     {0} },
-       { ClkTagBar,            MODKEY,         Button1,        tag,            {0} },
-       { ClkTagBar,            MODKEY,         Button3,        toggletag,      {0} },
-};
-
diff --git a/overlays/elinks/default.nix b/overlays/elinks/default.nix
deleted file mode 100644 (file)
index 1744dc0..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-self: super: {
-  elinks = super.elinks.overrideAttrs (old:
-    self.mylibs.fetchedGithub ./elinks.json // rec {
-      preConfigure = ''sh autogen.sh'';
-      buildInputs = old.buildInputs ++ (with self; [ gettext automake autoconf ]);
-      configureFlags = [
-        "--disable-smb" "--without-x" "--enable-cgi"
-        "--enable-leds" "--enable-256-colors"
-        "--enable-html-highlight" "--with-zlib"
-        ];
-      patches = [];
-    }
-  );
-}
diff --git a/overlays/elinks/elinks.json b/overlays/elinks/elinks.json
deleted file mode 100644 (file)
index ea13b1f..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "f86be65-master",
-  "meta": {
-    "name": "elinks",
-    "url": "https://github.com/nabetaro/elinks",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "nabetaro",
-    "repo": "elinks",
-    "rev": "f86be659718c0cd0a67f88b42f07044c23d0d028",
-    "sha256": "1jxb7xgawcjkb3gw4gqyw26g02709wwdbhyczfckh3l4njxhy14m",
-    "fetchSubmodules": true
-  }
-}
diff --git a/overlays/kanboard/default.nix b/overlays/kanboard/default.nix
deleted file mode 100644 (file)
index 05f2882..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-self: super: {
-  kanboard = { kanboard_config ? "/etc/kanboard/config.php" }:
-    super.kanboard.overrideAttrs(old: rec {
-      name = "kanboard-${version}";
-      version = "1.2.9";
-      src = self.fetchFromGitHub {
-        owner = "kanboard";
-        repo = "kanboard";
-        rev = "c4152316b14936556edf3bcc4d11f16ba31b8ae7";
-        sha256 = "1hdr95cpxgdzrzhffs63gdl0g7122ma2zg8bkqwp42p5xphx0xan";
-      };
-      installPhase = ''
-        cp -a . $out
-        ln -s ${kanboard_config} $out/config.php
-        mv $out/data $out/dataold
-        '';
-    });
-}
diff --git a/overlays/khal/default.nix b/overlays/khal/default.nix
deleted file mode 100644 (file)
index 597cc0e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-self: super: {
-  khal = super.khal.overridePythonAttrs(old: {
-    postPatch = ''
-      sed -i "s/Invalid value for \"ics\"/Invalid value for \\\'ics\\\'/" tests/cli_test.py
-      sed -i "s/Invalid value for \"\[ICS\]\"/Invalid value for \\\'[ICS]\\\'/" tests/cli_test.py
-    '';
-  });
-}
diff --git a/overlays/ledger/default.nix b/overlays/ledger/default.nix
deleted file mode 100644 (file)
index 9f2df57..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-self: super: {
-  ledger = super.ledger.overrideAttrs(old: rec {
-    #name = "${old.pname}-${version}";
-    #version = "3.2.1";
-    #src = self.fetchFromGitHub {
-    #  owner = "ledger";
-    #  repo = "ledger";
-    #  rev = "v${version}";
-    #  sha256 = "0x6jxwss3wwzbzlwmnwb8yzjk8f9wfawif4f1b74z2qg6hc4r7f6";
-    #};
-    patches = old.patches or [] ++ [
-      (self.fetchpatch {
-        name = "xdgconfig.patch";
-        url = "https://github.com/ledger/ledger/commit/c79674649dee7577d6061e3d0776922257520fd0.patch";
-        sha256 = "0n82mjz9i17800r7vs45sxpss14rivsf1j8hrv7jal24iyfm01dz";
-        excludes = [ "doc/NEWS.md" ];
-      })
-    ];
-  });
-}
diff --git a/overlays/lesspipe/default.nix b/overlays/lesspipe/default.nix
deleted file mode 100644 (file)
index e53feae..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-self: super: {
-  lesspipe = super.lesspipe.overrideAttrs(old: {
-    configureFlags = (old.configureFlags or []) ++ [ "--yes" ];
-  });
-}
diff --git a/overlays/morph/default.nix b/overlays/morph/default.nix
deleted file mode 100644 (file)
index 448f051..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-self: super: {
-  morph = super.morph.overrideAttrs(old: {
-    patches = (old.patches or []) ++ [ ./verbose_nix.patch ./dry-run.patch ];
-  });
-}
diff --git a/overlays/neomutt/default.nix b/overlays/neomutt/default.nix
deleted file mode 100644 (file)
index f03290a..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-self: super: {
-  neomutt = super.neomutt.overrideAttrs(old: {
-    patches = old.patches or [] ++ [
-      ./tx.patch
-    ];
-  });
-}
diff --git a/overlays/neomutt/tx.patch b/overlays/neomutt/tx.patch
deleted file mode 100644 (file)
index c8736df..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-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;
diff --git a/overlays/nix-direnv/default.nix b/overlays/nix-direnv/default.nix
deleted file mode 100644 (file)
index c4c96e2..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-self: super: {
-  nix-direnv = super.nix-direnv.overrideAttrs (old: {
-    postPatch = old.postPatch + ''
-      sed -i -e 's/TEMPDIR "$old_tmp"/TEMPDIR "$old_tmpdir"/' direnvrc
-      '';
-  });
-}
diff --git a/overlays/nixops/default.nix b/overlays/nixops/default.nix
deleted file mode 100644 (file)
index 14aec3b..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-self: super: {
-  nixops = super.nixops.overrideAttrs (old: {
-    patches = [
-        ./fix_glibc.patch
-        (self.fetchpatch {
-          name = "hetzner_cloud.patch";
-          url = "https://github.com/goodraven/nixops/commit/272e50d0b0262e49cdcaad42cdab57aad183d1c2.patch";
-          sha256 = "12wcrb0155ald52m7fbr2m5rrxdnwdwripq91ckscgsk42mdc517";
-        })
-       ];
-    preConfigure = (old.preConfigure or "") + ''
-      # https://github.com/NixOS/nixops/issues/1216
-      sed -i -e "/Register the paths in the Nix database./s/#.*$/export USER=root/" nix/libvirtd-image.nix
-
-      sed -i -e '/^import sys$/s/$/; sys.tracebacklimit = 0/' scripts/nixops
-      sed -i -e "/'keyFile'/s/'path'/'string'/" nixops/backends/__init__.py
-      sed -i -e "/security.initialRootPassword/d" nix/hetzner.nix
-      '';
-  });
-}
diff --git a/overlays/nixops/fix_glibc.patch b/overlays/nixops/fix_glibc.patch
deleted file mode 100644 (file)
index 1aeb093..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-diff --git a/nix/hetzner-bootstrap.nix b/nix/hetzner-bootstrap.nix
-index 035e6f9..def42a1 100644
---- a/nix/hetzner-bootstrap.nix
-+++ b/nix/hetzner-bootstrap.nix
-@@ -3,9 +3,7 @@ with import <nixpkgs> { system = "x86_64-linux"; };
- let
-   pkgsNative = import <nixpkgs> {};
-
--  nixpart = python2Packages.nixpart0.override {
--    useNixUdev = false;
--  };
-+  nixpart = python2Packages.nixpart0;
-
-   generateConfig = (import <nixpkgs/nixos> {
-     configuration = {};
diff --git a/overlays/nixops/hetzner_cloud.patch b/overlays/nixops/hetzner_cloud.patch
deleted file mode 100644 (file)
index b75c116..0000000
+++ /dev/null
@@ -1,480 +0,0 @@
-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
diff --git a/overlays/pass/default.nix b/overlays/pass/default.nix
deleted file mode 100644 (file)
index ad8facd..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-self: super: {
-  pass = super.pass.overrideAttrs (old: rec {
-    patches = old.patches ++ [ ./pass-fix-pass-init.patch ];
-  });
-}
diff --git a/overlays/pass/pass-fix-pass-init.patch b/overlays/pass/pass-fix-pass-init.patch
deleted file mode 100644 (file)
index 10a76c1..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-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
-
diff --git a/overlays/pelican/default.nix b/overlays/pelican/default.nix
deleted file mode 100644 (file)
index 4f8aece..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-self: super: {
-  pelican = with self.python3Packages;
-    pelican.overrideAttrs(old: {
-      propagatedBuildInputs = old.propagatedBuildInputs ++ [ pyyaml markdown ];
-      doInstallCheck = false;
-    });
-}
diff --git a/overlays/php-packages/default.nix b/overlays/php-packages/default.nix
deleted file mode 100644 (file)
index 90fb613..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-self: super: rec {
-  myPhpPackages.mysqli_pam = self.php74.extensions.mysqli.overrideAttrs(old: {
-    configureFlags = [ "--with-mysqli=${self.libmysqlclient_pam}/bin/mysql_config" "--with-mysql-sock=/run/mysqld/mysqld.sock" ];
-    patches = old.patches or [] ++ [ ./mysqli_patch.patch ];
-});
-}
diff --git a/overlays/procps-ng/default.nix b/overlays/procps-ng/default.nix
deleted file mode 100644 (file)
index 2d43a11..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-self: super: {
-  procps-ng = super.procps-ng.overrideAttrs(old: {
-    configureFlags = old.configureFlags ++ [ "--enable-watch8bit" ];
-  });
-}
diff --git a/overlays/python-packages/buildbot.nix b/overlays/python-packages/buildbot.nix
deleted file mode 100644 (file)
index ccf2f6a..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-self: super: {
-  pythonOverrides = self.buildPythonOverrides (pyself: pysuper: {
-    buildbot-plugins = pysuper.buildbot-plugins // {
-      buildslist = self.python3PackagesPlus.buildbot-plugins.buildslist;
-    };
-    buildbot-full = pysuper.buildbot-full.withPlugins [ pyself.buildbot-plugins.buildslist ];
-  }) super.pythonOverrides;
-}
diff --git a/overlays/python-packages/default.nix b/overlays/python-packages/default.nix
deleted file mode 100644 (file)
index 601eed1..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-let
-  fromMyPythonPackages = name: self: super: {
-    pythonOverrides = self.buildPythonOverrides (pyself: pysuper: {
-      "${name}" = self."${pyself.python.pname}PackagesPlus"."${name}";
-    }) super.pythonOverrides;
-  };
-in
-{
-  # https://github.com/NixOS/nixpkgs/issues/44426
-  # needs to come before all other in alphabetical order (or make use of
-  # lib.mkBefore)
-  __pythonOverlayFix = self: super: let
-    pyNames = [ "python3" "python36" "python37" "python38" ];
-    overriddenPython = name: [
-      { inherit name; value = super.${name}.override { packageOverrides = self.pythonOverrides; }; }
-      { name = "${name}Packages"; value = self.recurseIntoAttrs self.${name}.pkgs; }
-    ];
-    overriddenPythons = builtins.concatLists (map overriddenPython pyNames);
-  in {
-    pythonOverrides = pyself: pysuper: {};
-    buildPythonOverrides = newOverrides: currentOverrides: super.lib.composeExtensions newOverrides currentOverrides;
-  } // super.lib.attrsets.listToAttrs overriddenPythons;
-
-
-  blivet3 = fromMyPythonPackages "blivet3";
-  buildbot = import ./buildbot.nix;
-  wokkel = fromMyPythonPackages "wokkel";
-  pymilter = fromMyPythonPackages "pymilter";
-}
diff --git a/overlays/sc-im/default.nix b/overlays/sc-im/default.nix
deleted file mode 100644 (file)
index f728655..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-self: super: {
-  sc-im = super.sc-im.overrideAttrs (old: {
-    buildPhase = ''
-      cd src
-      sed -i Makefile -e 's@\...name.info@.local/state/$(name)info@'
-      cd ..
-      '' + old.buildPhase;
-  });
-}
diff --git a/overlays/shaarli/default.nix b/overlays/shaarli/default.nix
deleted file mode 100644 (file)
index 3b37ee8..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-self: super: {
-  shaarli = varDir: super.shaarli.overrideAttrs (old: rec {
-    version = "0.10.2";
-    src = self.fetchurl {
-      url = "https://github.com/shaarli/Shaarli/releases/download/v${version}/shaarli-v${version}-full.tar.gz";
-      sha256 = "0h8sspj7siy3vgpi2i3gdrjcr5935fr4dfwq2zwd70sjx2sh9s78";
-    };
-    patchPhase = "";
-    patches = (old.patches or []) ++ [ ./shaarli_ldap.patch ];
-    installPhase = (old.installPhase or "") + ''
-      cp .htaccess $out/
-      ln -sf ${varDir}/{cache,pagecache,tmp,data} $out/
-      '';
-  });
-}
diff --git a/overlays/slrn/default.nix b/overlays/slrn/default.nix
deleted file mode 100644 (file)
index 1bf5fe2..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-self: super: {
-  slrn = super.slrn.overrideAttrs (old: rec {
-    configureFlags = old.configureFlags ++ [ "--with-slrnpull" ];
-  });
-}
diff --git a/overlays/vcsh/default.nix b/overlays/vcsh/default.nix
deleted file mode 100644 (file)
index eb4d48e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-self: super: {
-  vcsh = super.vcsh.overrideAttrs(old: {
-    patchPhase = old.patchPhase or "" + ''
-      sed -i -e 's@-r "$XDG_CONFIG_HOME/vcsh/config.d/$VCSH_REPO_NAME"@-f "$XDG_CONFIG_HOME/vcsh/config.d/$VCSH_REPO_NAME"@' vcsh
-      '';
-  });
-}
diff --git a/overlays/weechat/default.nix b/overlays/weechat/default.nix
deleted file mode 100644 (file)
index e8cc792..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-self: super: {
-  weechat = super.weechat.override {
-    configure = { availablePlugins, ... }: {
-      plugins = with self; with availablePlugins; [
-         (python.withPackages (ps: with ps; [websocket_client emoji]))
-         perl
-         ruby
-        ];
-    };
-  };
-
-}
diff --git a/overlays/ympd/default.nix b/overlays/ympd/default.nix
deleted file mode 100644 (file)
index dda17aa..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-self: super: {
-  ympd = super.ympd.overrideAttrs(old: self.mylibs.fetchedGithub ./ympd.json // {
-    patches = (old.patches or []) ++ [ ./ympd-password-env.patch ];
-  });
-}
diff --git a/overlays/ympd/ympd.json b/overlays/ympd/ympd.json
deleted file mode 100644 (file)
index 51f06d5..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "612f8fc-master",
-  "meta": {
-    "name": "ympd",
-    "url": "https://github.com/notandy/ympd",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "notandy",
-    "repo": "ympd",
-    "rev": "612f8fc0b2c47fc89d403e4a044541c6b2b238c8",
-    "sha256": "01hnj10zl103mrn82vyd42fvq7w5az3jf1qz18889zv67kn73ll9",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/cnagios/cnagios.json b/pkgs/cnagios/cnagios.json
deleted file mode 100644 (file)
index 4c1c385..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "3bd27fb-master",
-  "meta": {
-    "name": "cnagios",
-    "url": "https://github.com/dannywarren/cnagios",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "dannywarren",
-    "repo": "cnagios",
-    "rev": "3bd27fb40e68f61ffd01bea6234b919a667b6fe4",
-    "sha256": "0iy5pmlcz6y3if72nav22xqxniiv1v8ywi0927m6s459hkw5n2rb",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/crypto/cardano/daedalus.json b/pkgs/crypto/cardano/daedalus.json
deleted file mode 100644 (file)
index dcd14c5..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "0.15.1",
-  "meta": {
-    "name": "daedalus",
-    "url": "https://github.com/input-output-hk/daedalus",
-    "branch": "refs/tags/0.15.1"
-  },
-  "github": {
-    "owner": "input-output-hk",
-    "repo": "daedalus",
-    "rev": "998fd3189c9a54fac496dfef7a6224714c67bc80",
-    "sha256": "1r3gwfv6hn7lzp4h2s6849m7x12nxadsql358ss615krvdlnb6rr",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/crypto/iota-cli-app/iota-cli-app.json b/pkgs/crypto/iota-cli-app/iota-cli-app.json
deleted file mode 100644 (file)
index 6b47dec..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "d7e2e08-master",
-  "meta": {
-    "name": "iota-cli-app",
-    "url": "https://github.com/iotaledger/cli-app",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "iotaledger",
-    "repo": "cli-app",
-    "rev": "d7e2e0856ae6bd34890fefb4245c07cd467a5032",
-    "sha256": "1n9kczsxdgjv8282nj2grlijvxipiskx0ndn169vz6v1l1hrwc8b",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/default.nix b/pkgs/default.nix
deleted file mode 100644 (file)
index 5f5df82..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-{ pkgs }:
-with pkgs;
-let
-  mylibs = import ../lib { inherit pkgs; };
-in
-rec {
-  sources = import ../nix/sources.nix;
-  myEnvironments = callPackage ../environments {};
-  boinctui = callPackage ./boinctui {};
-  cnagios = callPackage ./cnagios { inherit mylibs; };
-  commento = callPackage ./commento {};
-  flrn = callPackage ./flrn { inherit mylibs; slang = callPackage ./slang_1 {}; };
-  genius = callPackage ./genius {};
-  mtop = callPackage ./mtop {};
-  muttprint = callPackage ./muttprint {};
-  mutt-ics = callPackage ./mutt-ics { inherit mylibs; };
-  nagios-cli = callPackage ./nagios-cli { inherit mylibs; };
-  nagnu = callPackage ./nagnu { inherit mylibs; };
-  nb = callPackage ./nb {};
-  note = callPackage ./note {};
-  notmuch-python2 = callPackage ./notmuch/notmuch-python { pythonPackages = python2Packages; };
-  notmuch-python3 = callPackage ./notmuch/notmuch-python { pythonPackages = python3Packages; };
-  notmuch-vim = callPackage ./notmuch/notmuch-vim {};
-  pgloader = callPackage ./pgloader {};
-  predixy = callPackage ./predixy { inherit mylibs; };
-  rrsync_sudo = callPackage ./rrsync_sudo {};
-  signaldctl = callPackage ./signaldctl {};
-  telegram-history-dump = callPackage ./telegram-history-dump { inherit mylibs; };
-  telegramircd = callPackage ./telegramircd { inherit mylibs; telethon = callPackage ./telethon_sync {}; };
-  terminal-velocity = callPackage ./terminal-velocity {};
-  tiv = callPackage ./tiv {};
-  twins = callPackage ./twins {};
-  umami = callPackage ./umami {};
-  unicodeDoc = callPackage ./unicode {};
-
-  cardano = callPackage ./crypto/cardano { inherit mylibs; };
-  cardano-cli = callPackage ./crypto/cardano-cli {};
-  iota-cli-app = callPackage ./crypto/iota-cli-app { inherit mylibs; };
-  sia = callPackage ./crypto/sia {};
-
-  proftpd = callPackage ./proftpd {};
-  pure-ftpd = callPackage ./pure-ftpd {};
-
-  composerEnv = callPackage ./composer-env {};
-  webapps = callPackage ./webapps { inherit mylibs composerEnv; };
-
-  monitoring-plugins = callPackage ./monitoring-plugins {};
-  naemon = callPackage ./naemon { inherit mylibs monitoring-plugins; };
-  naemon-livestatus = callPackage ./naemon-livestatus { inherit mylibs naemon; };
-  gearmand = callPackage ./gearmand {};
-  status_engine = {
-    module = callPackage ./status_engine/module.nix { inherit mylibs; };
-    worker = callPackage ./status_engine/worker.nix { inherit mylibs composerEnv; };
-    interface = callPackage ./status_engine/interface.nix { inherit composerEnv; };
-  };
-
-  python3PackagesPlus = callPackage ./python-packages {
-    python = python3;
-    inherit mylibs;
-  };
-  dovecot_deleted-to-trash = callPackage ./dovecot/plugins/deleted_to_trash {
-    inherit mylibs;
-  };
-}
diff --git a/pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json b/pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json
deleted file mode 100644 (file)
index 2987a02..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "81b0754-master",
-  "meta": {
-    "name": "dovecot-deleted_to_trash",
-    "url": "https://github.com/lexbrugman/dovecot_deleted_to_trash",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "lexbrugman",
-    "repo": "dovecot_deleted_to_trash",
-    "rev": "81b07549accfc36467bf8527a53c295c7a02dbb9",
-    "sha256": "1b3k31g898s4fa0a9l4kvjsdyds772waaay84sjdxv09jw6mqs0f",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/flrn/flrn.json b/pkgs/flrn/flrn.json
deleted file mode 100644 (file)
index 3d7a944..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "860d642-master",
-  "meta": {
-    "name": "flrn",
-    "url": "https://github.com/Cigaes/flrn",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "Cigaes",
-    "repo": "flrn",
-    "rev": "860d642bd6389a209c8b697bd044f78d23406509",
-    "sha256": "0sqlxxpy1xg7cb2hbxcr0al46nyr6jjnns4b5i8w04z5sypa9r5c",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/mutt-ics/default.nix b/pkgs/mutt-ics/default.nix
deleted file mode 100644 (file)
index a8a529b..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-{ python3Packages, mylibs }:
-with python3Packages;
-buildPythonApplication (mylibs.fetchedGithub ./mutt-ics.json // {
-  propagatedBuildInputs = [ icalendar ];
-})
diff --git a/pkgs/mutt-ics/mutt-ics.json b/pkgs/mutt-ics/mutt-ics.json
deleted file mode 100644 (file)
index ae8ed37..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "d291187-master",
-  "meta": {
-    "name": "mutt-ics",
-    "url": "https://github.com/dmedvinsky/mutt-ics",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "dmedvinsky",
-    "repo": "mutt-ics",
-    "rev": "d29118788f291f67d34fefa6eda9f95846a2fe34",
-    "sha256": "0kqzngsvzjq5gpf60jhfmb2xzjznvk172khf4dlcb72n3ak4rb92",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/naemon-livestatus/naemon-livestatus.json b/pkgs/naemon-livestatus/naemon-livestatus.json
deleted file mode 100644 (file)
index c648d2b..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "33dbcfe-master",
-  "meta": {
-    "name": "naemon-livestatus",
-    "url": "https://github.com/naemon/naemon-livestatus",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "naemon",
-    "repo": "naemon-livestatus",
-    "rev": "33dbcfe18e42158f25c27cff95a1e07b73be53b0",
-    "sha256": "16jk0c6pwr7ck0g6s12hj6czbhgdr7c7f74zzsp5279af86y8fd6",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/naemon/naemon.json b/pkgs/naemon/naemon.json
deleted file mode 100644 (file)
index 2dc9809..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "d7ac1c8-master",
-  "meta": {
-    "name": "naemon",
-    "url": "https://github.com/naemon/naemon-core",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "naemon",
-    "repo": "naemon-core",
-    "rev": "d7ac1c824e01dbb1c4a6bd0550b324e7cf165d54",
-    "sha256": "003grwciplnqfn9jh2km2pm6xxp8fxvmwihg3vmch8f0vfwcmv1m",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/nagios-cli/default.nix b/pkgs/nagios-cli/default.nix
deleted file mode 100644 (file)
index 7d7e7cc..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-{ python2Packages, mylibs }:
-python2Packages.buildPythonApplication (mylibs.fetchedGithub ./nagios-cli.json)
diff --git a/pkgs/nagios-cli/nagios-cli.json b/pkgs/nagios-cli/nagios-cli.json
deleted file mode 100644 (file)
index fc91227..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "edc51ea-master",
-  "meta": {
-    "name": "nagios-cli",
-    "url": "https://github.com/tehmaze/nagios-cli",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "tehmaze",
-    "repo": "nagios-cli",
-    "rev": "edc51eaccf1086bb4469ce45c5e5155f2d71a2f9",
-    "sha256": "1qw5fv4niz079zqwmfr3kzjv8cc31rbhi9whdbv9c32qdi3h7vsp",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/nagnu/default.nix b/pkgs/nagnu/default.nix
deleted file mode 100644 (file)
index 2b9c0ec..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{ stdenv, mylibs, ncurses, curl }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./nagnu.json // rec {
-  buildInputs = [ ncurses curl ];
-  installPhase = ''
-    mkdir -p $out/bin
-    cp nagnu $out/bin
-    mkdir -p $out/share/doc/nagnu
-    cp nagnu.conf.sample $out/share/doc/nagnu
-    mkdir -p $out/share/man/man8
-    cp docs/nagnu.8 $out/share/man/man8
-    '';
-})
diff --git a/pkgs/nagnu/nagnu.json b/pkgs/nagnu/nagnu.json
deleted file mode 100644 (file)
index 60a8b07..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "c7e65fc-master",
-  "meta": {
-    "name": "nagnu",
-    "url": "https://github.com/frlen/nagnu",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "frlen",
-    "repo": "nagnu",
-    "rev": "c7e65fc02f46a3756a4cc47953ea2f3e57a84728",
-    "sha256": "1i2jm8ibvqcc734daamnzc3hx8q0nsry1x12q0kr5yvcsdjjgyy3",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/pgloader/default.nix b/pkgs/pgloader/default.nix
deleted file mode 100644 (file)
index 6093ada..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-# https://github.com/NixOS/nixpkgs/pull/61702
-{ stdenv, fetchurl, makeWrapper, sbcl, sqlite, freetds, libzip, curl, git, cacert, openssl }:
-stdenv.mkDerivation rec {
-  pname = "pgloader";
-  version = "3.6.1";
-  name = "${pname}-${version}";
-
-  src = fetchurl {
-    url = "https://github.com/dimitri/pgloader/releases/download/v3.6.1/pgloader-bundle-3.6.1.tgz";
-    sha256 = "1sm8xmq30d1biin5br0y3vrv4fydbrzfqglz1hnvrkdyxrg7d6f9";
-  };
-
-  nativeBuildInputs = [ git makeWrapper ];
-  buildInputs = [ sbcl cacert sqlite freetds libzip curl openssl ];
-
-  LD_LIBRARY_PATH = stdenv.lib.makeLibraryPath [ sqlite libzip curl git openssl freetds ];
-
-  buildPhase = ''
-    export PATH=$PATH:$out/bin
-    export HOME=$TMPDIR
-
-    make pgloader
-  '';
-
-  dontStrip = true;
-  enableParallelBuilding = false;
-
-  installPhase = ''
-    install -Dm755 bin/pgloader "$out/bin/pgloader"
-    wrapProgram $out/bin/pgloader --prefix LD_LIBRARY_PATH : "${LD_LIBRARY_PATH}"
-  '';
-
-  meta = with stdenv.lib; {
-    homepage = https://pgloader.io/;
-    description = "pgloader loads data into PostgreSQL and allows you to implement Continuous Migration from your current database to PostgreSQL";
-    maintainers = with maintainers; [ mguentner ];
-    license = licenses.postgresql;
-    platforms = platforms.all;
-  };
-}
diff --git a/pkgs/predixy/default.nix b/pkgs/predixy/default.nix
deleted file mode 100644 (file)
index 7e7a9ba..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{ stdenv, mylibs }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./predixy.json // {
-  installPhase = ''
-    mkdir -p $out/bin
-    cp src/predixy $out/bin
-    mkdir -p $out/share
-    cp -r doc $out/share
-    cp -r conf $out/share/doc
-    '';
-})
diff --git a/pkgs/predixy/predixy.json b/pkgs/predixy/predixy.json
deleted file mode 100644 (file)
index 9f9759c..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "dacf3fb-master",
-  "meta": {
-    "name": "predixy",
-    "url": "https://github.com/joyieldInc/predixy",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "joyieldInc",
-    "repo": "predixy",
-    "rev": "dacf3fb30c2602dc044040df04e194d44b49c1be",
-    "sha256": "0sbvy0jg551lwkfq8qh0a49cl9mhfnkhi3cnk25l8pz4jcdrr9k9",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/python-packages/blivet/default.nix b/pkgs/python-packages/blivet/default.nix
deleted file mode 100644 (file)
index 108d548..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-{ lib, writeText, poetry2nix, python, pythonPackages,
-  gobject-introspection, libblockdev, libbytesize, fetchFromGitHub,
-  pkg-config, parted, systemd,
-  with_dmraid ? false,
-  with_fs_btrfs ? false,
-  with_fs_fat ? false,
-  with_fs_f2fs ? false,
-  with_fs_hfs_plus ? false,
-  with_fs_jfs ? false,
-  with_fs_nfs ? false,
-  with_fs_nfsv4 ? false,
-  with_fs_ntfs ? false,
-  with_fs_reiserfs ? false,
-  with_fs_xfs ? false,
-  with_luks ? false,
-  with_lvm ? false,
-  with_mdadm ? false,
-  with_multipath ? false,
-  with_optical ? false,
-  with_iscsi ? false,
-  dmraid, multipath_tools, lvm2, eject, kmod, utillinux, lsof,
-  openiscsi, coreutils, dosfstools, e2fsprogs, jfsutils, btrfs-progs,
-  xfsprogs, f2fs-tools, hfsprogs, nfs-utils, ntfs3g, ntfsprogs,
-  reiserfsprogs, devicemapper, cryptsetup, mdadm
-}@args:
-let
-  # FIXME: blivet/tasks/fsmount.py links to /sbin
-  additionalPackages =
-      lib.optionals with_dmraid [ dmraid ]
-   ++ lib.optionals with_fs_btrfs [ btrfs-progs ]
-   ++ lib.optionals with_fs_fat [ dosfstools ]
-   ++ lib.optionals with_fs_f2fs [ f2fs-tools ]
-   ++ lib.optionals with_fs_hfs_plus [ hfsprogs ]
-   ++ lib.optionals with_fs_jfs [ jfsutils ]
-   ++ lib.optionals with_fs_nfs [ nfs-utils ]
-   ++ lib.optionals with_fs_ntfs [ ntfs3g ntfsprogs ]
-   ++ lib.optionals with_fs_reiserfs [ reiserfsprogs ]
-   ++ lib.optionals with_fs_xfs [ xfsprogs.bin ]
-   ++ lib.optionals with_luks [ devicemapper cryptsetup ]
-   ++ lib.optionals with_lvm [ lvm2 ]
-   ++ lib.optionals with_mdadm [ mdadm ]
-   ++ lib.optionals with_multipath [ multipath_tools ]
-   ++ lib.optionals with_optical [ eject ]
-   ++ lib.optionals with_iscsi [ openiscsi ];
-in
-# nix-shell -E "with import <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;
-}
diff --git a/pkgs/python-packages/blivet/fix_path.patch b/pkgs/python-packages/blivet/fix_path.patch
deleted file mode 100644 (file)
index 29c4052..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-diff --git a/blivet/tasks/fsmount.py b/blivet/tasks/fsmount.py
-index 15f79a3e..bb3fe873 100644
---- a/blivet/tasks/fsmount.py
-+++ b/blivet/tasks/fsmount.py
-@@ -19,6 +19,7 @@
- #
- # Red Hat Author(s): Anne Mulhern <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
diff --git a/pkgs/python-packages/blivet/poetry.lock b/pkgs/python-packages/blivet/poetry.lock
deleted file mode 100644 (file)
index c45011a..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-[[package]]
-name = "distro"
-version = "1.5.0"
-description = "Distro - an OS platform information API"
-category = "main"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "pycairo"
-version = "1.19.1"
-description = "Python interface for cairo"
-category = "main"
-optional = false
-python-versions = ">=3.5, <4"
-
-[[package]]
-name = "pygobject"
-version = "3.36.1"
-description = "Python bindings for GObject Introspection"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
-
-[package.dependencies]
-pycairo = ">=1.11.1"
-
-[[package]]
-name = "pyparted"
-version = "3.11.6"
-description = "Python bindings for GNU parted"
-category = "main"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "pyudev"
-version = "0.22.0"
-description = "A libudev binding"
-category = "main"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-six = "*"
-
-[[package]]
-name = "selinux"
-version = "0.2.1"
-description = "shim selinux module"
-category = "main"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
-
-[package.dependencies]
-distro = ">=1.3.0"
-setuptools = ">=39.0"
-
-[[package]]
-name = "six"
-version = "1.15.0"
-description = "Python 2 and 3 compatibility utilities"
-category = "main"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
-
-[metadata]
-lock-version = "1.0"
-python-versions = "^3.8"
-content-hash = "636edb46b1deb0f6d5db636b0bc6639205335c9915480b156a417067137548f8"
-
-[metadata.files]
-distro = [
-    {file = "distro-1.5.0-py2.py3-none-any.whl", hash = "sha256:df74eed763e18d10d0da624258524ae80486432cd17392d9c3d96f5e83cd2799"},
-    {file = "distro-1.5.0.tar.gz", hash = "sha256:0e58756ae38fbd8fc3020d54badb8eae17c5b9dcbed388b17bb55b8a5928df92"},
-]
-pycairo = [
-    {file = "pycairo-1.19.1.tar.gz", hash = "sha256:2c143183280feb67f5beb4e543fd49990c28e7df427301ede04fc550d3562e84"},
-]
-pygobject = [
-    {file = "PyGObject-3.36.1.tar.gz", hash = "sha256:012a589aec687bfa809a1ff9f5cd775dc7f6fcec1a6bc7fe88e1002a68f8ba34"},
-]
-pyparted = [
-    {file = "pyparted-3.11.6.tar.gz", hash = "sha256:727ccdf308c194069aa9797f7a6a973bc95b2e407cdf5d58d6c8bc4c9dec92dc"},
-]
-pyudev = [
-    {file = "pyudev-0.22.0.tar.gz", hash = "sha256:69bb1beb7ac52855b6d1b9fe909eefb0017f38d917cba9939602c6880035b276"},
-]
-selinux = [
-    {file = "selinux-0.2.1-py2.py3-none-any.whl", hash = "sha256:820adcf1b4451c9cc7759848797703263ba0eb6a4cad76d73548a9e0d57b7926"},
-    {file = "selinux-0.2.1.tar.gz", hash = "sha256:d435f514e834e3fdc0941f6a29d086b80b2ea51b28112aee6254bd104ee42a74"},
-]
-six = [
-    {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
-    {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
-]
diff --git a/pkgs/python-packages/blivet/pyproject.toml b/pkgs/python-packages/blivet/pyproject.toml
deleted file mode 100644 (file)
index cf86aa1..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-[tool.poetry]
-name = "blivet"
-version = "3.3.0"
-description = "A python module for system storage configuration"
-authors = ["David Lehman <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"
diff --git a/pkgs/python-packages/buildbot/plugins/default.nix b/pkgs/python-packages/buildbot/plugins/default.nix
deleted file mode 100644 (file)
index 22a8507..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-{ callPackage, python }:
-{
-  buildslist = callPackage ./buildslist {
-    pythonPackages = python.pkgs;
-  };
-}
diff --git a/pkgs/python-packages/default.nix b/pkgs/python-packages/default.nix
deleted file mode 100644 (file)
index 441c5bc..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-{ mylibs, callPackage, python }:
-{
-  blivet3 = callPackage ./blivet { inherit python; pythonPackages = python.pkgs; };
-  buildbot-plugins = callPackage ./buildbot/plugins { inherit python; };
-  wokkel = callPackage ./wokkel.nix { pythonPackages = python.pkgs; };
-  pymilter = callPackage ./pymilter.nix { pythonPackages = python.pkgs; };
-}
diff --git a/pkgs/python-packages/pymilter.nix b/pkgs/python-packages/pymilter.nix
deleted file mode 100644 (file)
index 736794e..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{ pythonPackages, libmilter }: with pythonPackages;
-buildPythonPackage rec {
-  pname = "pymilter";
-  version = "1.0.4";
-  src = fetchPypi {
-    inherit pname version;
-    sha256 = "1bpcvq7d72q0zi7c8h5knhasywwz9gxc23n9fxmw874n5k8hsn7k";
-  };
-  doCheck = false;
-  buildInputs = [ libmilter ];
-}
diff --git a/pkgs/python-packages/wokkel.nix b/pkgs/python-packages/wokkel.nix
deleted file mode 100644 (file)
index 3237f2b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{ pythonPackages }: with pythonPackages;
-buildPythonPackage rec {
-  pname = "wokkel";
-  version = "18.0.0";
-  src = fetchPypi {
-    inherit pname version;
-    sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016";
-  };
-  propagatedBuildInputs = [ twisted.extras.tls twisted incremental dateutil ];
-  doCheck = false;
-}
diff --git a/pkgs/status_engine/module.json b/pkgs/status_engine/module.json
deleted file mode 100644 (file)
index 5ed06d2..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "d461e95-master",
-  "meta": {
-    "name": "statusengine-module",
-    "url": "https://github.com/statusengine/module",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "statusengine",
-    "repo": "module",
-    "rev": "d461e95a11fffaac604d11ac42d237b5e13071bc",
-    "sha256": "1awmq9rck9xy82pambnd2wh66ndif8x8jpk4qbbghs9f2sd48x1n",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/status_engine/module.nix b/pkgs/status_engine/module.nix
deleted file mode 100644 (file)
index 43d2b09..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{ stdenv, mylibs, gearmand, json_c, libuuid, libevent, pkgconfig, glib }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./module.json // {
-  patches = [ ./host_perfdata.patch ];
-  buildInputs = [ gearmand json_c libuuid libevent pkgconfig glib ];
-  makeFlags = "all";
-  installPhase = ''
-    mkdir -p $out/lib/status-engine
-    cp -a src/bin/* $out/lib/status-engine
-    '';
-})
diff --git a/pkgs/status_engine/worker.json b/pkgs/status_engine/worker.json
deleted file mode 100644 (file)
index 301bab5..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "02267d4-master",
-  "meta": {
-    "name": "worker",
-    "url": "https://github.com/statusengine/worker",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "statusengine",
-    "repo": "worker",
-    "rev": "02267d495ae69137d6765dc6b0f453f80216f1cf",
-    "sha256": "06ci4mkmifdf1z15yc8rxl44ppi45vjz4s136yaccq9d8vk9iyd4",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/status_engine/worker.nix b/pkgs/status_engine/worker.nix
deleted file mode 100644 (file)
index 1232303..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-{ stdenv, mylibs, composerEnv, fetchurl, gearmand, callPackage, php73, config_file ? "/var/lib/status_engine/ui.yml" }:
-let
-  gearman = php73.buildPecl rec {
-    version = "2.0.6";
-    pname = "gearman";
-    src = fetchurl {
-      url = "https://github.com/wcgallego/pecl-gearman/archive/${pname}-${version}.tar.gz";
-      sha256 = "0bliga4j41xkvdfh6bqi6k8x6mfxbi5sl9gix97axs7w0ncyfprz";
-    };
-    configureFlags = [ "--with-gearman=${gearmand}" ];
-    nativeBuildInputs = [ gearmand ];
-  };
-in
-(composerEnv.override {
-  php = php73.withExtensions({ enabled, all }: enabled ++ (with all; [gearman redis mbstring bcmath json iconv]));
-}).buildPackage (mylibs.fetchedGithub ./worker.json //
-  import ./worker_php_packages.nix { inherit composerEnv fetchurl; } // rec {
-    postInstall = ''
-      ln -s ${config_file} $out/etc/config.yml
-      '';
-  preInstall = ''
-    cp ${./worker_composer.lock} $out/composer.lock
-    '';
-})
diff --git a/pkgs/status_engine/worker_composer.lock b/pkgs/status_engine/worker_composer.lock
deleted file mode 100644 (file)
index 63f2646..0000000
+++ /dev/null
@@ -1,1457 +0,0 @@
-{
-    "_readme": [
-        "This file locks the dependencies of your project to a known state",
-        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
-        "This file is @generated automatically"
-    ],
-    "content-hash": "0b9940904a72531dd233d2c1b0ea28a0",
-    "packages": [
-        {
-            "name": "crate/crate-dbal",
-            "version": "0.3.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/crate/crate-dbal.git",
-                "reference": "3329f19d39f648bdd7613e5c8dc7e230f45814d9"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/crate/crate-dbal/zipball/3329f19d39f648bdd7613e5c8dc7e230f45814d9",
-                "reference": "3329f19d39f648bdd7613e5c8dc7e230f45814d9",
-                "shasum": ""
-            },
-            "require": {
-                "crate/crate-pdo": "~0.6.0",
-                "doctrine/dbal": "~2.5.5",
-                "php": "~5.5|~7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.0",
-                "squizlabs/php_codesniffer": "~1.5.2"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "Crate\\DBAL": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache2"
-            ],
-            "description": "A Doctrine Database Abstraction Layer for the Crate.io DBMS",
-            "homepage": "https://github.com/crate/crate-dbal",
-            "keywords": [
-                "crate",
-                "database",
-                "dbal",
-                "doctrine"
-            ],
-            "time": "2017-04-07T13:26:54+00:00"
-        },
-        {
-            "name": "crate/crate-pdo",
-            "version": "0.6.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/crate/crate-pdo.git",
-                "reference": "31a88d1004235327a4651a10a5b98a7803b3cde3"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/crate/crate-pdo/zipball/31a88d1004235327a4651a10a5b98a7803b3cde3",
-                "reference": "31a88d1004235327a4651a10a5b98a7803b3cde3",
-                "shasum": ""
-            },
-            "require": {
-                "ext-pdo": "*",
-                "guzzlehttp/guzzle": "~6.0",
-                "php": "~5.5|~7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.0",
-                "squizlabs/php_codesniffer": "~1.5.2"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "Crate\\": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache2"
-            ],
-            "description": "A PDO adapter for interacting with the Crate.io DBMS",
-            "homepage": "https://github.com/crate/crate-pdo",
-            "keywords": [
-                "crate",
-                "database",
-                "pdo"
-            ],
-            "time": "2017-07-17T12:50:03+00:00"
-        },
-        {
-            "name": "doctrine/annotations",
-            "version": "1.10.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/annotations.git",
-                "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/annotations/zipball/5db60a4969eba0e0c197a19c077780aadbc43c5d",
-                "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d",
-                "shasum": ""
-            },
-            "require": {
-                "doctrine/lexer": "1.*",
-                "ext-tokenizer": "*",
-                "php": "^7.1 || ^8.0"
-            },
-            "require-dev": {
-                "doctrine/cache": "1.*",
-                "phpunit/phpunit": "^7.5"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.9.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Guilherme Blanco",
-                    "email": "guilhermeblanco@gmail.com"
-                },
-                {
-                    "name": "Roman Borschel",
-                    "email": "roman@code-factory.org"
-                },
-                {
-                    "name": "Benjamin Eberlei",
-                    "email": "kontakt@beberlei.de"
-                },
-                {
-                    "name": "Jonathan Wage",
-                    "email": "jonwage@gmail.com"
-                },
-                {
-                    "name": "Johannes Schmitt",
-                    "email": "schmittjoh@gmail.com"
-                }
-            ],
-            "description": "Docblock Annotations Parser",
-            "homepage": "http://www.doctrine-project.org",
-            "keywords": [
-                "annotations",
-                "docblock",
-                "parser"
-            ],
-            "time": "2020-05-25T17:24:27+00:00"
-        },
-        {
-            "name": "doctrine/cache",
-            "version": "1.10.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/cache.git",
-                "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/cache/zipball/35a4a70cd94e09e2259dfae7488afc6b474ecbd3",
-                "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3",
-                "shasum": ""
-            },
-            "require": {
-                "php": "~7.1 || ^8.0"
-            },
-            "conflict": {
-                "doctrine/common": ">2.2,<2.4"
-            },
-            "require-dev": {
-                "alcaeus/mongo-php-adapter": "^1.1",
-                "doctrine/coding-standard": "^6.0",
-                "mongodb/mongodb": "^1.1",
-                "phpunit/phpunit": "^7.0",
-                "predis/predis": "~1.0"
-            },
-            "suggest": {
-                "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.9.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Guilherme Blanco",
-                    "email": "guilhermeblanco@gmail.com"
-                },
-                {
-                    "name": "Roman Borschel",
-                    "email": "roman@code-factory.org"
-                },
-                {
-                    "name": "Benjamin Eberlei",
-                    "email": "kontakt@beberlei.de"
-                },
-                {
-                    "name": "Jonathan Wage",
-                    "email": "jonwage@gmail.com"
-                },
-                {
-                    "name": "Johannes Schmitt",
-                    "email": "schmittjoh@gmail.com"
-                }
-            ],
-            "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.",
-            "homepage": "https://www.doctrine-project.org/projects/cache.html",
-            "keywords": [
-                "abstraction",
-                "apcu",
-                "cache",
-                "caching",
-                "couchdb",
-                "memcached",
-                "php",
-                "redis",
-                "xcache"
-            ],
-            "funding": [
-                {
-                    "url": "https://www.doctrine-project.org/sponsorship.html",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://www.patreon.com/phpdoctrine",
-                    "type": "patreon"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2020-05-27T16:24:54+00:00"
-        },
-        {
-            "name": "doctrine/collections",
-            "version": "1.6.5",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/collections.git",
-                "reference": "fc0206348e17e530d09463fef07ba8968406cd6d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/collections/zipball/fc0206348e17e530d09463fef07ba8968406cd6d",
-                "reference": "fc0206348e17e530d09463fef07ba8968406cd6d",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1.3 || ^8.0"
-            },
-            "require-dev": {
-                "doctrine/coding-standard": "^6.0",
-                "phpstan/phpstan-shim": "^0.9.2",
-                "phpunit/phpunit": "^7.0",
-                "vimeo/psalm": "^3.8.1"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Guilherme Blanco",
-                    "email": "guilhermeblanco@gmail.com"
-                },
-                {
-                    "name": "Roman Borschel",
-                    "email": "roman@code-factory.org"
-                },
-                {
-                    "name": "Benjamin Eberlei",
-                    "email": "kontakt@beberlei.de"
-                },
-                {
-                    "name": "Jonathan Wage",
-                    "email": "jonwage@gmail.com"
-                },
-                {
-                    "name": "Johannes Schmitt",
-                    "email": "schmittjoh@gmail.com"
-                }
-            ],
-            "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.",
-            "homepage": "https://www.doctrine-project.org/projects/collections.html",
-            "keywords": [
-                "array",
-                "collections",
-                "iterators",
-                "php"
-            ],
-            "funding": [
-                {
-                    "url": "https://www.doctrine-project.org/sponsorship.html",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://www.patreon.com/phpdoctrine",
-                    "type": "patreon"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2020-05-25T19:24:35+00:00"
-        },
-        {
-            "name": "doctrine/common",
-            "version": "v2.7.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/common.git",
-                "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9",
-                "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9",
-                "shasum": ""
-            },
-            "require": {
-                "doctrine/annotations": "1.*",
-                "doctrine/cache": "1.*",
-                "doctrine/collections": "1.*",
-                "doctrine/inflector": "1.*",
-                "doctrine/lexer": "1.*",
-                "php": "~5.6|~7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^5.4.6"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.7.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Doctrine\\Common\\": "lib/Doctrine/Common"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Roman Borschel",
-                    "email": "roman@code-factory.org"
-                },
-                {
-                    "name": "Benjamin Eberlei",
-                    "email": "kontakt@beberlei.de"
-                },
-                {
-                    "name": "Guilherme Blanco",
-                    "email": "guilhermeblanco@gmail.com"
-                },
-                {
-                    "name": "Jonathan Wage",
-                    "email": "jonwage@gmail.com"
-                },
-                {
-                    "name": "Johannes Schmitt",
-                    "email": "schmittjoh@gmail.com"
-                }
-            ],
-            "description": "Common Library for Doctrine projects",
-            "homepage": "http://www.doctrine-project.org",
-            "keywords": [
-                "annotations",
-                "collections",
-                "eventmanager",
-                "persistence",
-                "spl"
-            ],
-            "time": "2017-07-22T08:35:12+00:00"
-        },
-        {
-            "name": "doctrine/dbal",
-            "version": "v2.5.13",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/dbal.git",
-                "reference": "729340d8d1eec8f01bff708e12e449a3415af873"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873",
-                "reference": "729340d8d1eec8f01bff708e12e449a3415af873",
-                "shasum": ""
-            },
-            "require": {
-                "doctrine/common": ">=2.4,<2.8-dev",
-                "php": ">=5.3.2"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "4.*",
-                "symfony/console": "2.*||^3.0"
-            },
-            "suggest": {
-                "symfony/console": "For helpful console commands such as SQL execution and import of files."
-            },
-            "bin": [
-                "bin/doctrine-dbal"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.5.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "Doctrine\\DBAL\\": "lib/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Roman Borschel",
-                    "email": "roman@code-factory.org"
-                },
-                {
-                    "name": "Benjamin Eberlei",
-                    "email": "kontakt@beberlei.de"
-                },
-                {
-                    "name": "Guilherme Blanco",
-                    "email": "guilhermeblanco@gmail.com"
-                },
-                {
-                    "name": "Jonathan Wage",
-                    "email": "jonwage@gmail.com"
-                }
-            ],
-            "description": "Database Abstraction Layer",
-            "homepage": "http://www.doctrine-project.org",
-            "keywords": [
-                "database",
-                "dbal",
-                "persistence",
-                "queryobject"
-            ],
-            "time": "2017-07-22T20:44:48+00:00"
-        },
-        {
-            "name": "doctrine/inflector",
-            "version": "1.4.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/inflector.git",
-                "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c",
-                "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.2 || ^8.0"
-            },
-            "require-dev": {
-                "doctrine/coding-standard": "^7.0",
-                "phpstan/phpstan": "^0.11",
-                "phpstan/phpstan-phpunit": "^0.11",
-                "phpstan/phpstan-strict-rules": "^0.11",
-                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector",
-                    "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Guilherme Blanco",
-                    "email": "guilhermeblanco@gmail.com"
-                },
-                {
-                    "name": "Roman Borschel",
-                    "email": "roman@code-factory.org"
-                },
-                {
-                    "name": "Benjamin Eberlei",
-                    "email": "kontakt@beberlei.de"
-                },
-                {
-                    "name": "Jonathan Wage",
-                    "email": "jonwage@gmail.com"
-                },
-                {
-                    "name": "Johannes Schmitt",
-                    "email": "schmittjoh@gmail.com"
-                }
-            ],
-            "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
-            "homepage": "https://www.doctrine-project.org/projects/inflector.html",
-            "keywords": [
-                "inflection",
-                "inflector",
-                "lowercase",
-                "manipulation",
-                "php",
-                "plural",
-                "singular",
-                "strings",
-                "uppercase",
-                "words"
-            ],
-            "funding": [
-                {
-                    "url": "https://www.doctrine-project.org/sponsorship.html",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://www.patreon.com/phpdoctrine",
-                    "type": "patreon"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2020-05-29T07:19:59+00:00"
-        },
-        {
-            "name": "doctrine/lexer",
-            "version": "1.2.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/lexer.git",
-                "reference": "e864bbf5904cb8f5bb334f99209b48018522f042"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042",
-                "reference": "e864bbf5904cb8f5bb334f99209b48018522f042",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.2 || ^8.0"
-            },
-            "require-dev": {
-                "doctrine/coding-standard": "^6.0",
-                "phpstan/phpstan": "^0.11.8",
-                "phpunit/phpunit": "^8.2"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.2.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Guilherme Blanco",
-                    "email": "guilhermeblanco@gmail.com"
-                },
-                {
-                    "name": "Roman Borschel",
-                    "email": "roman@code-factory.org"
-                },
-                {
-                    "name": "Johannes Schmitt",
-                    "email": "schmittjoh@gmail.com"
-                }
-            ],
-            "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
-            "homepage": "https://www.doctrine-project.org/projects/lexer.html",
-            "keywords": [
-                "annotations",
-                "docblock",
-                "lexer",
-                "parser",
-                "php"
-            ],
-            "funding": [
-                {
-                    "url": "https://www.doctrine-project.org/sponsorship.html",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://www.patreon.com/phpdoctrine",
-                    "type": "patreon"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2020-05-25T17:44:05+00:00"
-        },
-        {
-            "name": "guzzlehttp/guzzle",
-            "version": "6.5.4",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/guzzle/guzzle.git",
-                "reference": "a4a1b6930528a8f7ee03518e6442ec7a44155d9d"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a4a1b6930528a8f7ee03518e6442ec7a44155d9d",
-                "reference": "a4a1b6930528a8f7ee03518e6442ec7a44155d9d",
-                "shasum": ""
-            },
-            "require": {
-                "ext-json": "*",
-                "guzzlehttp/promises": "^1.0",
-                "guzzlehttp/psr7": "^1.6.1",
-                "php": ">=5.5",
-                "symfony/polyfill-intl-idn": "1.17.0"
-            },
-            "require-dev": {
-                "ext-curl": "*",
-                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
-                "psr/log": "^1.1"
-            },
-            "suggest": {
-                "psr/log": "Required for using the Log middleware"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "6.5-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "GuzzleHttp\\": "src/"
-                },
-                "files": [
-                    "src/functions_include.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Michael Dowling",
-                    "email": "mtdowling@gmail.com",
-                    "homepage": "https://github.com/mtdowling"
-                }
-            ],
-            "description": "Guzzle is a PHP HTTP client library",
-            "homepage": "http://guzzlephp.org/",
-            "keywords": [
-                "client",
-                "curl",
-                "framework",
-                "http",
-                "http client",
-                "rest",
-                "web service"
-            ],
-            "time": "2020-05-25T19:35:05+00:00"
-        },
-        {
-            "name": "guzzlehttp/promises",
-            "version": "v1.3.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/guzzle/promises.git",
-                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
-                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.5.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.4-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "GuzzleHttp\\Promise\\": "src/"
-                },
-                "files": [
-                    "src/functions_include.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Michael Dowling",
-                    "email": "mtdowling@gmail.com",
-                    "homepage": "https://github.com/mtdowling"
-                }
-            ],
-            "description": "Guzzle promises library",
-            "keywords": [
-                "promise"
-            ],
-            "time": "2016-12-20T10:07:11+00:00"
-        },
-        {
-            "name": "guzzlehttp/psr7",
-            "version": "1.6.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/guzzle/psr7.git",
-                "reference": "239400de7a173fe9901b9ac7c06497751f00727a"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
-                "reference": "239400de7a173fe9901b9ac7c06497751f00727a",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.4.0",
-                "psr/http-message": "~1.0",
-                "ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
-            },
-            "provide": {
-                "psr/http-message-implementation": "1.0"
-            },
-            "require-dev": {
-                "ext-zlib": "*",
-                "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
-            },
-            "suggest": {
-                "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.6-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "GuzzleHttp\\Psr7\\": "src/"
-                },
-                "files": [
-                    "src/functions_include.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Michael Dowling",
-                    "email": "mtdowling@gmail.com",
-                    "homepage": "https://github.com/mtdowling"
-                },
-                {
-                    "name": "Tobias Schultze",
-                    "homepage": "https://github.com/Tobion"
-                }
-            ],
-            "description": "PSR-7 message implementation that also provides common utility methods",
-            "keywords": [
-                "http",
-                "message",
-                "psr-7",
-                "request",
-                "response",
-                "stream",
-                "uri",
-                "url"
-            ],
-            "time": "2019-07-01T23:21:34+00:00"
-        },
-        {
-            "name": "php-amqplib/php-amqplib",
-            "version": "v2.11.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/php-amqplib/php-amqplib.git",
-                "reference": "6353c5d2d3021a301914bc6566e695c99cfeb742"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/6353c5d2d3021a301914bc6566e695c99cfeb742",
-                "reference": "6353c5d2d3021a301914bc6566e695c99cfeb742",
-                "shasum": ""
-            },
-            "require": {
-                "ext-mbstring": "*",
-                "ext-sockets": "*",
-                "php": ">=5.6.3",
-                "phpseclib/phpseclib": "^2.0.0"
-            },
-            "conflict": {
-                "php": "7.4.0 - 7.4.1"
-            },
-            "replace": {
-                "videlalvaro/php-amqplib": "self.version"
-            },
-            "require-dev": {
-                "ext-curl": "*",
-                "nategood/httpful": "^0.2.20",
-                "phpunit/phpunit": "^5.7|^6.5|^7.0",
-                "squizlabs/php_codesniffer": "^2.5"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.11-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "PhpAmqpLib\\": "PhpAmqpLib/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "LGPL-2.1-or-later"
-            ],
-            "authors": [
-                {
-                    "name": "Alvaro Videla",
-                    "role": "Original Maintainer"
-                },
-                {
-                    "name": "Raúl Araya",
-                    "email": "nubeiro@gmail.com",
-                    "role": "Maintainer"
-                },
-                {
-                    "name": "Luke Bakken",
-                    "email": "luke@bakken.io",
-                    "role": "Maintainer"
-                },
-                {
-                    "name": "Ramūnas Dronga",
-                    "email": "github@ramuno.lt",
-                    "role": "Maintainer"
-                }
-            ],
-            "description": "Formerly videlalvaro/php-amqplib.  This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.",
-            "homepage": "https://github.com/php-amqplib/php-amqplib/",
-            "keywords": [
-                "message",
-                "queue",
-                "rabbitmq"
-            ],
-            "time": "2020-05-13T13:56:11+00:00"
-        },
-        {
-            "name": "phpseclib/phpseclib",
-            "version": "2.0.27",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/phpseclib/phpseclib.git",
-                "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc",
-                "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "require-dev": {
-                "phing/phing": "~2.7",
-                "phpunit/phpunit": "^4.8.35|^5.7|^6.0",
-                "sami/sami": "~2.0",
-                "squizlabs/php_codesniffer": "~2.0"
-            },
-            "suggest": {
-                "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
-                "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
-                "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
-                "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
-            },
-            "type": "library",
-            "autoload": {
-                "files": [
-                    "phpseclib/bootstrap.php"
-                ],
-                "psr-4": {
-                    "phpseclib\\": "phpseclib/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Jim Wigginton",
-                    "email": "terrafrost@php.net",
-                    "role": "Lead Developer"
-                },
-                {
-                    "name": "Patrick Monnerat",
-                    "email": "pm@datasphere.ch",
-                    "role": "Developer"
-                },
-                {
-                    "name": "Andreas Fischer",
-                    "email": "bantu@phpbb.com",
-                    "role": "Developer"
-                },
-                {
-                    "name": "Hans-Jürgen Petrich",
-                    "email": "petrich@tronic-media.com",
-                    "role": "Developer"
-                },
-                {
-                    "name": "Graham Campbell",
-                    "email": "graham@alt-three.com",
-                    "role": "Developer"
-                }
-            ],
-            "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
-            "homepage": "http://phpseclib.sourceforge.net",
-            "keywords": [
-                "BigInteger",
-                "aes",
-                "asn.1",
-                "asn1",
-                "blowfish",
-                "crypto",
-                "cryptography",
-                "encryption",
-                "rsa",
-                "security",
-                "sftp",
-                "signature",
-                "signing",
-                "ssh",
-                "twofish",
-                "x.509",
-                "x509"
-            ],
-            "funding": [
-                {
-                    "url": "https://github.com/terrafrost",
-                    "type": "github"
-                },
-                {
-                    "url": "https://www.patreon.com/phpseclib",
-                    "type": "patreon"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2020-04-04T23:17:33+00:00"
-        },
-        {
-            "name": "psr/http-message",
-            "version": "1.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/php-fig/http-message.git",
-                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
-                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Psr\\Http\\Message\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "PHP-FIG",
-                    "homepage": "http://www.php-fig.org/"
-                }
-            ],
-            "description": "Common interface for HTTP messages",
-            "homepage": "https://github.com/php-fig/http-message",
-            "keywords": [
-                "http",
-                "http-message",
-                "psr",
-                "psr-7",
-                "request",
-                "response"
-            ],
-            "time": "2016-08-06T14:39:51+00:00"
-        },
-        {
-            "name": "ralouphie/getallheaders",
-            "version": "3.0.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/ralouphie/getallheaders.git",
-                "reference": "120b605dfeb996808c31b6477290a714d356e822"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
-                "reference": "120b605dfeb996808c31b6477290a714d356e822",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.6"
-            },
-            "require-dev": {
-                "php-coveralls/php-coveralls": "^2.1",
-                "phpunit/phpunit": "^5 || ^6.5"
-            },
-            "type": "library",
-            "autoload": {
-                "files": [
-                    "src/getallheaders.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Ralph Khattar",
-                    "email": "ralph.khattar@gmail.com"
-                }
-            ],
-            "description": "A polyfill for getallheaders.",
-            "time": "2019-03-08T08:55:37+00:00"
-        },
-        {
-            "name": "symfony/console",
-            "version": "v2.8.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/console.git",
-                "reference": "d232bfc100dfd32b18ccbcab4bcc8f28697b7e41"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/d232bfc100dfd32b18ccbcab4bcc8f28697b7e41",
-                "reference": "d232bfc100dfd32b18ccbcab4bcc8f28697b7e41",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.9",
-                "symfony/polyfill-mbstring": "~1.0"
-            },
-            "require-dev": {
-                "psr/log": "~1.0",
-                "symfony/event-dispatcher": "~2.1|~3.0.0",
-                "symfony/process": "~2.1|~3.0.0"
-            },
-            "suggest": {
-                "psr/log": "For using the console logger",
-                "symfony/event-dispatcher": "",
-                "symfony/process": ""
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.8-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\Console\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony Console Component",
-            "homepage": "https://symfony.com",
-            "time": "2015-11-30T12:35:10+00:00"
-        },
-        {
-            "name": "symfony/polyfill-intl-idn",
-            "version": "v1.17.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/polyfill-intl-idn.git",
-                "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a",
-                "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3",
-                "symfony/polyfill-mbstring": "^1.3",
-                "symfony/polyfill-php72": "^1.10"
-            },
-            "suggest": {
-                "ext-intl": "For best performance"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.17-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Polyfill\\Intl\\Idn\\": ""
-                },
-                "files": [
-                    "bootstrap.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Laurent Bassin",
-                    "email": "laurent@bassin.info"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
-            "homepage": "https://symfony.com",
-            "keywords": [
-                "compatibility",
-                "idn",
-                "intl",
-                "polyfill",
-                "portable",
-                "shim"
-            ],
-            "funding": [
-                {
-                    "url": "https://symfony.com/sponsor",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/fabpot",
-                    "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2020-05-12T16:47:27+00:00"
-        },
-        {
-            "name": "symfony/polyfill-mbstring",
-            "version": "v1.17.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "fa79b11539418b02fc5e1897267673ba2c19419c"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c",
-                "reference": "fa79b11539418b02fc5e1897267673ba2c19419c",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "suggest": {
-                "ext-mbstring": "For best performance"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.17-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Polyfill\\Mbstring\\": ""
-                },
-                "files": [
-                    "bootstrap.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Nicolas Grekas",
-                    "email": "p@tchwork.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony polyfill for the Mbstring extension",
-            "homepage": "https://symfony.com",
-            "keywords": [
-                "compatibility",
-                "mbstring",
-                "polyfill",
-                "portable",
-                "shim"
-            ],
-            "funding": [
-                {
-                    "url": "https://symfony.com/sponsor",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/fabpot",
-                    "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2020-05-12T16:47:27+00:00"
-        },
-        {
-            "name": "symfony/polyfill-php72",
-            "version": "v1.17.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/polyfill-php72.git",
-                "reference": "f048e612a3905f34931127360bdd2def19a5e582"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582",
-                "reference": "f048e612a3905f34931127360bdd2def19a5e582",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.17-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Polyfill\\Php72\\": ""
-                },
-                "files": [
-                    "bootstrap.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Nicolas Grekas",
-                    "email": "p@tchwork.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
-            "homepage": "https://symfony.com",
-            "keywords": [
-                "compatibility",
-                "polyfill",
-                "portable",
-                "shim"
-            ],
-            "funding": [
-                {
-                    "url": "https://symfony.com/sponsor",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/fabpot",
-                    "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2020-05-12T16:47:27+00:00"
-        },
-        {
-            "name": "symfony/yaml",
-            "version": "v2.8.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/yaml.git",
-                "reference": "f79824187de95064a2f5038904c4d7f0227fedb5"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/f79824187de95064a2f5038904c4d7f0227fedb5",
-                "reference": "f79824187de95064a2f5038904c4d7f0227fedb5",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.9"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.8-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\Yaml\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony Yaml Component",
-            "homepage": "https://symfony.com",
-            "time": "2015-11-30T12:35:10+00:00"
-        }
-    ],
-    "packages-dev": [],
-    "aliases": [],
-    "minimum-stability": "stable",
-    "stability-flags": [],
-    "prefer-stable": false,
-    "prefer-lowest": false,
-    "platform": {
-        "php": ">=5.5.9",
-        "ext-redis": "*",
-        "ext-gearman": "*",
-        "ext-mbstring": "*",
-        "ext-bcmath": "*",
-        "ext-json": "*",
-        "ext-iconv": "*"
-    },
-    "platform-dev": [],
-    "plugin-api-version": "1.1.0"
-}
diff --git a/pkgs/status_engine/worker_php_packages.nix b/pkgs/status_engine/worker_php_packages.nix
deleted file mode 100644 (file)
index 1d956ad..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-# Generated with composer2nix and adapted to return only the list of
-# packages
-{ composerEnv, fetchurl }:
-{
-  packages = {
-    "crate/crate-dbal" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "crate-crate-dbal-3329f19d39f648bdd7613e5c8dc7e230f45814d9";
-        src = fetchurl {
-          url = https://api.github.com/repos/crate/crate-dbal/zipball/3329f19d39f648bdd7613e5c8dc7e230f45814d9;
-          sha256 = "013z63zcvrnmxphdm6qqy0if1397lmbb0g3yrpjbka98pg8zm99g";
-        };
-      };
-    };
-    "crate/crate-pdo" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "crate-crate-pdo-31a88d1004235327a4651a10a5b98a7803b3cde3";
-        src = fetchurl {
-          url = https://api.github.com/repos/crate/crate-pdo/zipball/31a88d1004235327a4651a10a5b98a7803b3cde3;
-          sha256 = "194f6daj9ghlwyplp86nazh1av6jadqznwqijqgr1g3dfmgb3y16";
-        };
-      };
-    };
-    "doctrine/annotations" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-annotations-5db60a4969eba0e0c197a19c077780aadbc43c5d";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/annotations/zipball/5db60a4969eba0e0c197a19c077780aadbc43c5d;
-          sha256 = "1a8psmvs90x4nflfvjvp6j9yjmq6z9jgsb3plrp5c7iy7snkq1v2";
-        };
-      };
-    };
-    "doctrine/cache" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-cache-35a4a70cd94e09e2259dfae7488afc6b474ecbd3";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/cache/zipball/35a4a70cd94e09e2259dfae7488afc6b474ecbd3;
-          sha256 = "1fk0c8vhjgl7j4b2vd4k7sshdrqysqwcp9mlxbapf8x7nmpa6i9b";
-        };
-      };
-    };
-    "doctrine/collections" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-collections-fc0206348e17e530d09463fef07ba8968406cd6d";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/collections/zipball/fc0206348e17e530d09463fef07ba8968406cd6d;
-          sha256 = "1aqnjna5cc5hyy6wypmayvl5lgz2qbym6innmr3qaq9nff6r9qlf";
-        };
-      };
-    };
-    "doctrine/common" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-common-4acb8f89626baafede6ee5475bc5844096eba8a9";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9;
-          sha256 = "0qjqframvg81z3lwqaj5haanqj9v3dfbj170pxmwlgmrfsbr16zh";
-        };
-      };
-    };
-    "doctrine/dbal" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873;
-          sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3";
-        };
-      };
-    };
-    "doctrine/inflector" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-inflector-4650c8b30c753a76bf44fb2ed00117d6f367490c";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c;
-          sha256 = "13jnzwpzz63i6zipmhb22lv35l5gq6wmji0532c94331wcq5bvv9";
-        };
-      };
-    };
-    "doctrine/lexer" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "doctrine-lexer-e864bbf5904cb8f5bb334f99209b48018522f042";
-        src = fetchurl {
-          url = https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042;
-          sha256 = "11lg9fcy0crb8inklajhx3kyffdbx7xzdj8kwl21xsgq9nm9iwvv";
-        };
-      };
-    };
-    "guzzlehttp/guzzle" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "guzzlehttp-guzzle-a4a1b6930528a8f7ee03518e6442ec7a44155d9d";
-        src = fetchurl {
-          url = https://api.github.com/repos/guzzle/guzzle/zipball/a4a1b6930528a8f7ee03518e6442ec7a44155d9d;
-          sha256 = "0midln6ji6b990vkc0syn631nf6r94lv5600dcc26lcivz8c4gk3";
-        };
-      };
-    };
-    "guzzlehttp/promises" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "guzzlehttp-promises-a59da6cf61d80060647ff4d3eb2c03a2bc694646";
-        src = fetchurl {
-          url = https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646;
-          sha256 = "1kpl91fzalcgkcs16lpakvzcnbkry3id4ynx6xhq477p4fipdciz";
-        };
-      };
-    };
-    "guzzlehttp/psr7" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "guzzlehttp-psr7-239400de7a173fe9901b9ac7c06497751f00727a";
-        src = fetchurl {
-          url = https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a;
-          sha256 = "0mfq93x7ayix6l3v5jkk40a9hnmrxaqr9vk1r26q39d1s6292ma7";
-        };
-      };
-    };
-    "php-amqplib/php-amqplib" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "php-amqplib-php-amqplib-6353c5d2d3021a301914bc6566e695c99cfeb742";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-amqplib/php-amqplib/zipball/6353c5d2d3021a301914bc6566e695c99cfeb742;
-          sha256 = "1nadc5afkn1fiws2w1wh0n032pr5b4dzfg1dcqyf2jnh0nsgq0xp";
-        };
-      };
-    };
-    "phpseclib/phpseclib" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "phpseclib-phpseclib-34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc";
-        src = fetchurl {
-          url = https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc;
-          sha256 = "1jlc8plx0v0rq3zqhc19a01r7xx7a2p6gl7mkzf2hn0kss50plz5";
-        };
-      };
-    };
-    "psr/http-message" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "psr-http-message-f6561bf28d520154e4b0ec72be95418abe6d9363";
-        src = fetchurl {
-          url = https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363;
-          sha256 = "195dd67hva9bmr52iadr4kyp2gw2f5l51lplfiay2pv6l9y4cf45";
-        };
-      };
-    };
-    "ralouphie/getallheaders" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "ralouphie-getallheaders-120b605dfeb996808c31b6477290a714d356e822";
-        src = fetchurl {
-          url = https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822;
-          sha256 = "1bv7ndkkankrqlr2b4kw7qp3fl0dxi6bp26bnim6dnlhavd6a0gg";
-        };
-      };
-    };
-    "symfony/console" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-console-d232bfc100dfd32b18ccbcab4bcc8f28697b7e41";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/console/zipball/d232bfc100dfd32b18ccbcab4bcc8f28697b7e41;
-          sha256 = "16kgs7x60y3vj0bbmljj80hq1x8fb6w1g0fd1j2hc1cbphgj8x67";
-        };
-      };
-    };
-    "symfony/polyfill-intl-idn" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-intl-idn-3bff59ea7047e925be6b7f2059d60af31bb46d6a";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a;
-          sha256 = "0c26v3xpchyiqckp663n7i3hgswbzy56r0jdwjizrsgqq731h6fp";
-        };
-      };
-    };
-    "symfony/polyfill-mbstring" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-mbstring-fa79b11539418b02fc5e1897267673ba2c19419c";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c;
-          sha256 = "17m46mkkcv7fsxf71si0cq8xdf6b1k272mc5bfwgl00h8s9bk0rs";
-        };
-      };
-    };
-    "symfony/polyfill-php72" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-polyfill-php72-f048e612a3905f34931127360bdd2def19a5e582";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582;
-          sha256 = "1lkjxh17nfaglh7v2m3zw2fy6b2w8nmxr7jb1gqqpvg74yqqz83f";
-        };
-      };
-    };
-    "symfony/yaml" = {
-      targetDir = "";
-      src = composerEnv.buildZipPackage {
-        name = "symfony-yaml-f79824187de95064a2f5038904c4d7f0227fedb5";
-        src = fetchurl {
-          url = https://api.github.com/repos/symfony/yaml/zipball/f79824187de95064a2f5038904c4d7f0227fedb5;
-          sha256 = "1pwx4bckfjz0afz62q02vl0i4wmg3c6f963jrhlx247b1z6isram";
-        };
-      };
-    };
-  };
-}
diff --git a/pkgs/telegram-history-dump/default.nix b/pkgs/telegram-history-dump/default.nix
deleted file mode 100644 (file)
index 050b351..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{ stdenv, ruby, mylibs }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./telegram-history-dump.json // {
-  installPhase = ''
-    mkdir -p $out/lib $out/bin
-    cp -a $src $out/lib/telegram-history-dump
-    ln -s $out/lib/telegram-history-dump/telegram-history-dump.rb $out/bin/telegram-history-dump
-    '';
-  buildInputs = [ ruby ];
-})
diff --git a/pkgs/telegram-history-dump/telegram-history-dump.json b/pkgs/telegram-history-dump/telegram-history-dump.json
deleted file mode 100644 (file)
index 487df73..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "468ea91-master",
-  "meta": {
-    "name": "telegram-history-dump",
-    "url": "https://github.com/tvdstaaij/telegram-history-dump",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "tvdstaaij",
-    "repo": "telegram-history-dump",
-    "rev": "468ea91e543529b54bc2c5ea28b1ea17f362fd3e",
-    "sha256": "1wmwiqacfa56bmwx50njnb15cg0fy6rbdrmrjd4xfbh8bs6yp0gh",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/telegramircd/telegramircd.json b/pkgs/telegramircd/telegramircd.json
deleted file mode 100644 (file)
index 3d219f8..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "40a0c7c-master",
-  "meta": {
-    "name": "telegramircd",
-    "url": "https://github.com/MaskRay/telegramircd",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "MaskRay",
-    "repo": "telegramircd",
-    "rev": "40a0c7cf60492bde3f44d43f06f62e3792480139",
-    "sha256": "123fjhgxq2fzn0ar8274jv7jjbxnlpidrj5333kbch7rpcipks0y",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/adminer/default.nix b/pkgs/webapps/adminer/default.nix
deleted file mode 100644 (file)
index 203b565..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{ stdenv, fetchurl }:
-stdenv.mkDerivation rec {
-  version = "4.7.1";
-  name = "adminer-${version}";
-  src = fetchurl {
-    url = "https://github.com/vrana/adminer/releases/download/v${version}/${name}.php";
-    sha256 = "00gnck9vd44wc6ihf7hh4ma6jvdsw69xgjlkbrdf6irnni6rnvhn";
-  };
-  phases = "installPhase";
-  installPhase = ''
-    mkdir -p $out
-    cp $src $out/index.php
-  '';
-}
diff --git a/pkgs/webapps/default.nix b/pkgs/webapps/default.nix
deleted file mode 100644 (file)
index cbee0b3..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-{ callPackage, mylibs, composerEnv }:
-rec {
-  adminer = callPackage ./adminer {};
-  apache-theme = callPackage ./apache-theme {};
-  awl = callPackage ./awl {};
-  davical = callPackage ./davical {};
-  diaspora = callPackage ./diaspora { inherit mylibs; };
-  dokuwiki = callPackage ./dokuwiki { inherit mylibs; };
-  etherpad-lite = callPackage ./etherpad-lite {};
-  grocy = callPackage ./grocy { inherit mylibs composerEnv; };
-  infcloud = callPackage ./infcloud {};
-  mantisbt_2 = callPackage ./mantisbt_2 {};
-  mastodon = callPackage ./mastodon { inherit mylibs; };
-  mediagoblin = callPackage ./mediagoblin { inherit mylibs; };
-  nextcloud = callPackage ./nextcloud {};
-  peertube = (mylibs.flakeCompat ../../flakes/peertube).default;
-  phpbb = callPackage ./phpbb {};
-  phpldapadmin = callPackage ./phpldapadmin {};
-  rompr = callPackage ./rompr { inherit mylibs; };
-  roundcubemail = callPackage ./roundcubemail {};
-  spip = callPackage ./spip {};
-  surfer = callPackage ./surfer { inherit mylibs; };
-  taskwarrior-web = callPackage ./taskwarrior-web { inherit mylibs; };
-  ttrss = callPackage ./ttrss {};
-  wallabag = callPackage ./wallabag { inherit composerEnv; };
-  yourls = callPackage ./yourls { inherit mylibs; };
-}
diff --git a/pkgs/webapps/diaspora/default.nix b/pkgs/webapps/diaspora/default.nix
deleted file mode 100644 (file)
index b435347..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-{ ldap ? false, varDir ? "/var/lib/diaspora", podmin_email ? null, config_dir ? "/etc/diaspora",
-  mylibs, stdenv, bundlerEnv, writeText,
-  cacert, defaultGemConfig, perl, ruby_2_4, nodejs, which, git }:
-let
-  diaspora_src = stdenv.mkDerivation (mylibs.fetchedGithub ./diaspora.json // rec {
-    buildPhase = ''
-      ${if ldap then "patch -p1 < ${./ldap.patch}" else ""}
-      # FIXME: bundlerEnv below doesn't take postgresql group for some
-      # reason
-      echo 'gem "pg",     "1.1.3"' >> Gemfile
-    '';
-    installPhase = ''
-      cp -a . $out
-    '';
-  });
-  gems = bundlerEnv {
-    name = "diaspora-env";
-    gemfile = "${diaspora_src}/Gemfile";
-    lockfile = "${diaspora_src}/Gemfile.lock";
-    gemset = if ldap then ./gemset_ldap.nix else ./gemset.nix;
-    groups = [ "postgresql" "default" "production" ];
-    gemConfig = defaultGemConfig // {
-      kostya-sigar = attrs: {
-        buildInputs = [ perl ];
-      };
-    };
-  };
-  build_config = writeText "diaspora.yml" ''
-    configuration:
-      environment:
-        certificate_authorities: '${cacert}/etc/ssl/certs/ca-bundle.crt'
-    ${if podmin_email != null then ''
-    # dummy comment for indentation
-      admins:
-        podmin_email: '${podmin_email}'
-    '' else ""}
-    production:
-      environment:
-    '';
-  dummy_token = writeText "secret_token.rb" ''
-    Diaspora::Application.config.secret_key_base = 'dummy'
-  '';
-in
-stdenv.mkDerivation {
-  name = "diaspora";
-  inherit diaspora_src;
-  builder = writeText "build_diaspora" ''
-    source $stdenv/setup
-    cp -a $diaspora_src $out
-    cd $out
-    chmod -R u+rwX .
-    tar -czf public/source.tar.gz ./{app,db,lib,script,Gemfile,Gemfile.lock,Rakefile,config.ru}
-    ln -s database.yml.example config/database.yml
-    ln -s ${build_config} config/diaspora.yml
-    ln -s ${dummy_token} config/initializers/secret_token.rb
-    ln -sf ${varDir}/schedule.yml config/schedule.yml
-    ln -sf ${varDir}/oidc_key.pem config/oidc_key.pem
-    ln -sf ${varDir}/uploads public/uploads
-    RAILS_ENV=production ${gems}/bin/rake assets:precompile
-    ln -sf ${config_dir}/database.yml config/database.yml
-    ln -sf ${config_dir}/diaspora.yml config/diaspora.yml
-    ln -sf ${config_dir}/secret_token.rb config/initializers/secret_token.rb
-    rm -rf tmp log
-    ln -sf ${varDir}/tmp tmp
-    ln -sf ${varDir}/log log
-    '';
-  propagatedBuildInputs = [ gems nodejs which git ];
-  passthru = { inherit gems varDir; };
-}
diff --git a/pkgs/webapps/diaspora/diaspora.json b/pkgs/webapps/diaspora/diaspora.json
deleted file mode 100644 (file)
index e6795aa..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "v0.7.10.0",
-  "meta": {
-    "name": "diaspora",
-    "url": "https://github.com/diaspora/diaspora",
-    "branch": "refs/tags/v0.7.10.0"
-  },
-  "github": {
-    "owner": "diaspora",
-    "repo": "diaspora",
-    "rev": "f0085cf5bb1c45bdfba866f628153d299e56eca8",
-    "sha256": "02mnb40rdkk6jlnvpy61fad59gbpgnlwz1k35w4wfqdwzq0znaqp",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/dokuwiki/dokuwiki.json b/pkgs/webapps/dokuwiki/dokuwiki.json
deleted file mode 100644 (file)
index fc03252..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "release_stable_2018-04-22b",
-  "meta": {
-    "name": "dokuwiki",
-    "url": "https://github.com/splitbrain/dokuwiki",
-    "branch": "refs/tags/release_stable_2018-04-22b"
-  },
-  "github": {
-    "owner": "splitbrain",
-    "repo": "dokuwiki",
-    "rev": "871dae1320b40211626c7ec665f5e6d5290aca95",
-    "sha256": "1syvd5dvv3v75swf8ig7dxqs0g5xikb0f6vlcy7g4c4ghldkw7nz",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/etherpad-lite/etherpad-lite.json b/pkgs/webapps/etherpad-lite/etherpad-lite.json
deleted file mode 100644 (file)
index 0d68df1..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "1.8.3",
-  "meta": {
-    "name": "etherpad-lite",
-    "url": "https://github.com/ether/etherpad-lite",
-    "branch": "refs/tags/1.8.3"
-  },
-  "github": {
-    "owner": "ether",
-    "repo": "etherpad-lite",
-    "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
-    "sha256": "1d726qldw3bil4x7j39aqk7m71kyjvxklai5238rrd5v82z28c1y",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/grocy/grocy.json b/pkgs/webapps/grocy/grocy.json
deleted file mode 100644 (file)
index cd75c18..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "d7738aa-master",
-  "meta": {
-    "name": "grocy",
-    "url": "https://github.com/grocy/grocy/",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "grocy",
-    "repo": "grocy",
-    "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
-    "sha256": "13zxzq71hvs3dzywrdwqflnkx6dpdc40l9klm4slv0fmmyclbbdf",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/mastodon/mastodon.json b/pkgs/webapps/mastodon/mastodon.json
deleted file mode 100644 (file)
index a0a6cfd..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "v2.9.4",
-  "meta": {
-    "name": "mastodon",
-    "url": "https://github.com/tootsuite/mastodon",
-    "branch": "refs/tags/v2.9.4"
-  },
-  "github": {
-    "owner": "tootsuite",
-    "repo": "mastodon",
-    "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
-    "sha256": "1x9pai1q73lsq1i685w7z4v3w478iyij65mar13k4hq9zdz9d2b0",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/mediagoblin/tempita.json b/pkgs/webapps/mediagoblin/tempita.json
deleted file mode 100644 (file)
index 5371e17..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "47414a7-master",
-  "meta": {
-    "name": "tempita",
-    "url": "https://github.com/gjhiggins/tempita",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "gjhiggins",
-    "repo": "tempita",
-    "rev": "47414a7c6e46a9a9afe78f0bce2ea299fa84d10d",
-    "sha256": "0f33jjjs5rvp7ar2j6ggyfykcrsrn04jaqcq71qfvycf6b7nw3rn",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/nextcloud/apps/apporder.nix b/pkgs/webapps/nextcloud/apps/apporder.nix
deleted file mode 100644 (file)
index 29fd6e2..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 16 && nextcloudVersion <= 18;
-buildApp rec {
-  appName = "apporder";
-  version = "0.9.0";
-  url = "https://github.com/juliushaertl/apporder/releases/download/v${version}/${appName}.tar.gz";
-  sha256 = "1add4i892n4bpmpxwrsr7x99fjyj5rk6maw04iwhviqqqr28fsw6";
-}
diff --git a/pkgs/webapps/nextcloud/apps/audioplayer.nix b/pkgs/webapps/nextcloud/apps/audioplayer.nix
deleted file mode 100644 (file)
index a49776f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 17 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "audioplayer";
-  version = "2.10.0";
-  url = "https://github.com/Rello/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
-  sha256 = "122wc05b0m8s5ksdhsiws98aqph894i7cffjkhfhq66c40a728s3";
-}
diff --git a/pkgs/webapps/nextcloud/apps/bookmarks.nix b/pkgs/webapps/nextcloud/apps/bookmarks.nix
deleted file mode 100644 (file)
index 1065c34..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 17 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "bookmarks";
-  version = "3.0.10";
-  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
-  sha256 = "0y12iqcc6yp25cisg7mg40ddx72531zdvsp2gcl37qi8vqf162ji";
-}
diff --git a/pkgs/webapps/nextcloud/apps/calendar.nix b/pkgs/webapps/nextcloud/apps/calendar.nix
deleted file mode 100644 (file)
index bc3ccea..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 17 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "calendar";
-  version = "2.0.3";
-  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
-  sha256 = "17pjsa657p9n1kslqkfcxd6n4ssh2yd4f5l5ww79mixfs34idbl9";
-}
diff --git a/pkgs/webapps/nextcloud/apps/carnet.nix b/pkgs/webapps/nextcloud/apps/carnet.nix
deleted file mode 100644 (file)
index 879ab17..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 13 && nextcloudVersion <= 18;
-buildApp rec {
-  appName = "carnet";
-  version = "0.20.0";
-  url = "https://github.com/PhieF/CarnetNextcloud/releases/download/v${version}/${appName}-nc-v${version}.tar.gz";
-  sha256 = "1hbvs88vj830xalyq8fv8xlnf7livsj1xmnjl4xgla803ch4aym8";
-}
diff --git a/pkgs/webapps/nextcloud/apps/circles.nix b/pkgs/webapps/nextcloud/apps/circles.nix
deleted file mode 100644 (file)
index 64a4f2f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 18 && nextcloudVersion <= 18;
-buildApp rec {
-  appName = "circles";
-  version = "0.18.9";
-  url = "https://github.com/nextcloud/circles/releases/download/v${version}/${appName}-${version}.tar.gz";
-  sha256 = "1a58zrjg4cc0igq14s5zfc5zva83mahmfr0mxvhvnasw7rwkpyzr";
-}
diff --git a/pkgs/webapps/nextcloud/apps/contacts.nix b/pkgs/webapps/nextcloud/apps/contacts.nix
deleted file mode 100644 (file)
index d80f0b5..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 17 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "contacts";
-  version = "3.3.0";
-  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
-  sha256 = "187avlksg4k7ci3jz4djfq8zfyq5jpvhbw2dzlp76wlppm1al4m0";
-}
diff --git a/pkgs/webapps/nextcloud/apps/cookbook.nix b/pkgs/webapps/nextcloud/apps/cookbook.nix
deleted file mode 100644 (file)
index 63cac0d..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 14 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "cookbook";
-  version = "0.6.5";
-  url = "https://github.com/mrzapp/nextcloud-cookbook/releases/download/v${version}/${appName}.tar.gz";
-  sha256 = "068dxdxy9ix37970mn348blkdrrnkzad26zgyx4f5s19wm439p5j";
-  installPhase = ''
-    sed -i -e "s/application..ld..json/application[^\"|\\\\']*ld[^\"|\\\\']*json/" lib/Service/RecipeService.php
-    mkdir -p $out
-    cp -R . $out/
-    '';
-}
-
diff --git a/pkgs/webapps/nextcloud/apps/deck.nix b/pkgs/webapps/nextcloud/apps/deck.nix
deleted file mode 100644 (file)
index ec693c6..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion == 18;
-buildApp rec {
-  appName = "deck";
-  version = "1.0.0";
-  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
-  sha256 = "13r9vd5bf75slrzhvi6bybazhh1vcx0n4a8a7hf97bxr7pq2f91j";
-}
diff --git a/pkgs/webapps/nextcloud/apps/extract.nix b/pkgs/webapps/nextcloud/apps/extract.nix
deleted file mode 100644 (file)
index daa9d2d..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 13 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "extract";
-  version = "1.2.4";
-  url = "https://github.com/PaulLereverend/NextcloudExtract/releases/download/${version}/${appName}.tar.gz";
-  sha256 = "0f1csv0warga12a1hkgdcnhnfiwfv5z2ab3mri4frn2qlh12wyby";
-}
diff --git a/pkgs/webapps/nextcloud/apps/files_markdown.nix b/pkgs/webapps/nextcloud/apps/files_markdown.nix
deleted file mode 100644 (file)
index 5810ec9..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 16 && nextcloudVersion <= 18;
-buildApp rec {
-  appName = "files_markdown";
-  version = "2.2.0";
-  url = "https://github.com/icewind1991/${appName}/releases/download/v${version}/${appName}.tar.gz";
-  sha256 = "05f793pznkkdgmr3wfqfbhwcg8s8kcvpfxnhzyj0pbw19srls2aw";
-}
diff --git a/pkgs/webapps/nextcloud/apps/files_readmemd.nix b/pkgs/webapps/nextcloud/apps/files_readmemd.nix
deleted file mode 100644 (file)
index c9728c0..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 16 && nextcloudVersion <= 18;
-buildApp rec {
-  appName = "files_readmemd";
-  version = "1.1.4";
-  url = "https://gitlab.univ-nantes.fr/uncloud/files_readmemd/-/wikis/uploads/e1d280e855f37e5f0a421c757868113c/${appName}.tar.gz";
-  sha256 = "1sfaghbyzfv3hg5vhj1nprb85zsl6lcr2x88ks6l9ndv49nfbvm9";
-}
diff --git a/pkgs/webapps/nextcloud/apps/flowupload.nix b/pkgs/webapps/nextcloud/apps/flowupload.nix
deleted file mode 100644 (file)
index 516ee32..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 15 && nextcloudVersion <= 18;
-buildApp rec {
-  appName = "flowupload";
-  version = "0.1.8";
-  url = "https://github.com/e-alfred/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
-  sha256 = "0llg5cr4fgqg512znp9bga77y7vdsi2pgsyl4m3a54c557zyjah3";
-}
diff --git a/pkgs/webapps/nextcloud/apps/gpxedit.nix b/pkgs/webapps/nextcloud/apps/gpxedit.nix
deleted file mode 100644 (file)
index cd3e878..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 14 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "gpxedit";
-  version = "0.0.13";
-  url = "https://gitlab.com/eneiluj/gpxedit-oc/wikis/uploads/a7c638d1b038514d07bb5c787b6e7961/${appName}-${version}.tar.gz";
-  sha256 = "1b15iqaq8fj3khpx3lh0fyqkhmj6x44fc59pg3cp3jrh3bpg0534";
-  otherConfig = {
-    mimetypealiases = {
-      "application/gpx+xml" = "gpx";
-    };
-    mimetypemapping = {
-      "gpx" = ["application/gpx+xml"];
-    };
-  };
-}
diff --git a/pkgs/webapps/nextcloud/apps/gpxpod.nix b/pkgs/webapps/nextcloud/apps/gpxpod.nix
deleted file mode 100644 (file)
index 0750144..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 14 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "gpxpod";
-  version = "4.2.1";
-  url = "https://gitlab.com/eneiluj/gpxpod-oc/wikis/uploads/0361f9dc50633f0f39d929442935435c/${appName}-${version}.tar.gz";
-  sha256 = "0ycpychq6g8axdprvd0ahgdy2pwfdbfyf1pxk4cprr4ab986aq1x";
-  otherConfig = {
-    mimetypealiases = {
-      "application/gpx+xml" = "gpx";
-    };
-    mimetypemapping = {
-      "gpx" = ["application/gpx+xml"];
-    };
-  };
-}
diff --git a/pkgs/webapps/nextcloud/apps/impersonate.nix b/pkgs/webapps/nextcloud/apps/impersonate.nix
deleted file mode 100644 (file)
index 66cc893..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 18 && nextcloudVersion < 19;
-buildApp rec {
-  appName = "impersonate";
-  version = "1.5.2";
-  url = "https://github.com/nextcloud/impersonate/releases/download/v${version}/${appName}.tar.gz";
-  sha256 = "03fm9d2p6ap9gyiw5anmlwsdmiyklrkpdgchfx2zfgxn38pjrz6d";
-}
-
diff --git a/pkgs/webapps/nextcloud/apps/keeweb.nix b/pkgs/webapps/nextcloud/apps/keeweb.nix
deleted file mode 100644 (file)
index 4ea1399..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 11 && nextcloudVersion <= 18;
-buildApp rec {
-  appName = "keeweb";
-  version = "0.6.2";
-  url = "https://github.com/jhass/nextcloud-keeweb/releases/download/v${version}/${appName}-${version}.tar.gz";
-  sha256 = "067801qz0fcfvmb14ja1ringzk53j1wp7ys2fl7lnlhf45r81vxx";
-  installPhase = ''
-    mkdir -p $out
-    cp -R . $out/
-    '';
-  otherConfig = {
-    mimetypemapping = {
-      "kdbx" = ["application/x-kdbx"];
-    };
-  };
-}
diff --git a/pkgs/webapps/nextcloud/apps/maps.nix b/pkgs/webapps/nextcloud/apps/maps.nix
deleted file mode 100644 (file)
index 898df6c..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 16 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "maps";
-  version = "0.1.6";
-  url = "https://github.com/nextcloud/maps/releases/download/v${version}/${appName}-${version}.tar.gz";
-  sha256 = "1yh5h96c91lgz58zcm7zdpblvsc6c6nflx8pldfds102x292mprk";
-}
diff --git a/pkgs/webapps/nextcloud/apps/metadata.nix b/pkgs/webapps/nextcloud/apps/metadata.nix
deleted file mode 100644 (file)
index 2d62f53..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 13 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "metadata";
-  version = "0.11.1";
-  url = "https://github.com/gino0631/nextcloud-metadata/releases/download/v${version}/${appName}.tar.gz";
-  sha256 = "11napkv5s29xk1gmbfvy610ab1kc06qxqzw606ix5x0d1x4m3h0c";
-}
diff --git a/pkgs/webapps/nextcloud/apps/music.nix b/pkgs/webapps/nextcloud/apps/music.nix
deleted file mode 100644 (file)
index e430dd9..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 9 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "music";
-  version = "0.14.1";
-  url = "https://github.com/owncloud/music/releases/download/v${version}/${appName}.zip";
-  zip = true;
-  sha256 = "06svn24qix0nbikwi0kxnli402vq99851bn5ljcsm10r74bnlw83";
-}
diff --git a/pkgs/webapps/nextcloud/apps/notes.nix b/pkgs/webapps/nextcloud/apps/notes.nix
deleted file mode 100644 (file)
index 7a06bbc..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 16 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "notes";
-  version = "3.3.0";
-  url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}.tar.gz";
-  sha256 = "03k0ijma7sccwqq9ch3bvgbg9kxr2wk0bmkxzxrc9in1d40d3k7f";
-}
diff --git a/pkgs/webapps/nextcloud/apps/ocsms.nix b/pkgs/webapps/nextcloud/apps/ocsms.nix
deleted file mode 100644 (file)
index aee1ff2..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 16 && nextcloudVersion <= 18;
-buildApp rec {
-  appName = "ocsms";
-  version = "2.1.7";
-  url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
-  sha256 = "1pfdzq16nbh4wfmkmif0dxacxg0fy4n4cp2d1hbq9k2z9awcx1vh";
-  installPhase = ''
-    mkdir -p $out
-    cp -R . $out/
-    '';
-}
diff --git a/pkgs/webapps/nextcloud/apps/passman.nix b/pkgs/webapps/nextcloud/apps/passman.nix
deleted file mode 100644 (file)
index 2de4882..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 17 && nextcloudVersion <= 18;
-buildApp rec {
-  # FIXME: it creates a /settings/user/additional setting url which
-  # doesn’t work
-  appName = "passman";
-  version = "2.3.5";
-  url = "https://releases.passman.cc/${appName}_${version}.tar.gz";
-  sha256 = "05gc288n43c7dhmq1jqfn8cfw7sycwdfhn36j8rh8nbx1irldbjn";
-}
diff --git a/pkgs/webapps/nextcloud/apps/polls.nix b/pkgs/webapps/nextcloud/apps/polls.nix
deleted file mode 100644 (file)
index 69e1102..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 16 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "polls";
-  version = "1.4.3";
-  url = "https://github.com/nextcloud/polls/releases/download/v${version}/${appName}.tar.gz";
-  sha256 = "07l5x5xblk6w8f6mqz3a5hjpry8qc3zgqi49z6bp5ipnzj0s6wm4";
-}
diff --git a/pkgs/webapps/nextcloud/apps/social.nix b/pkgs/webapps/nextcloud/apps/social.nix
deleted file mode 100644 (file)
index 75b790a..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 17 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "social";
-  version = "0.3.1";
-  url = "https://github.com/nextcloud/social/releases/download/v${version}/${appName}-${version}.tar.gz";
-  sha256 = "03hh6vr34p33dphrjqmc7s8mvsk5n7dl817j8qkf75203y8szhdy";
-}
-
diff --git a/pkgs/webapps/nextcloud/apps/spreed.nix b/pkgs/webapps/nextcloud/apps/spreed.nix
deleted file mode 100644 (file)
index b52c8c5..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion == 18;
-buildApp rec {
-  appName = "spreed";
-  version = "8.0.8";
-  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
-  sha256 = "19szk61ixzzrabs63l2fihx7k4f6a8k4kdzpa0xxzv5w9ssqjhbj";
-}
diff --git a/pkgs/webapps/nextcloud/apps/tasks.nix b/pkgs/webapps/nextcloud/apps/tasks.nix
deleted file mode 100644 (file)
index a2de465..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ buildApp, nextcloudVersion }:
-assert nextcloudVersion >= 16 && nextcloudVersion <= 19;
-buildApp rec {
-  appName = "tasks";
-  version = "0.12.2";
-  url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
-  sha256 = "092fg7dpx69jp5z0ka14ay6bnfdcnjq8zk2gc3rwpzc3llpdnqph";
-}
diff --git a/pkgs/webapps/nextcloud/default.nix b/pkgs/webapps/nextcloud/default.nix
deleted file mode 100644 (file)
index 5017fd2..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-{ varDir ? "/var/lib/nextcloud", nextcloudVersion ? 18, otherConfig ? {}, lib, stdenv, callPackage, fetchzip, fetchurl }:
-let
-  appNames = [
-    "apporder" "audioplayer" "bookmarks" "calendar" "carnet" "circles"
-    "contacts" "cookbook" "deck" "extract" "files_markdown"
-    "files_readmemd" "flowupload" "gpxedit" "gpxpod" "impersonate"
-    "keeweb" "maps" "metadata" "music" "notes" "ocsms" "passman" "polls"
-    "spreed" "social" "tasks"
-  ];
-  allApps = lib.attrsets.genAttrs appNames
-    (name: callPackage (./apps + "/${name}.nix") { inherit buildApp nextcloudVersion; });
-  buildApp = { appName, version, url, sha256, zip ? false, otherConfig ? {}, installPhase ? "mkdir -p $out && cp -R . $out/" }:
-    stdenv.mkDerivation rec {
-      name = "nextcloud-app-${appName}-${version}";
-      inherit version;
-      phases = "unpackPhase installPhase";
-      inherit installPhase;
-      src = (if zip then fetchzip else fetchurl) { inherit url sha256; };
-      passthru = {
-        inherit appName otherConfig;
-      };
-    };
-  toPassthru = pkg: apps: otherConfig: {
-    inherit apps otherConfig allApps buildApp varDir;
-    withApps = withApps pkg;
-  };
-  withApps = pkg: toApps:
-    let
-      apps = toApps allApps;
-      toInstallApp = n: ''
-        ln -sf ${n} $out/apps/${n.appName}
-      '';
-      zipped = lib.attrsets.zipAttrs ([pkg.otherConfig or {}] ++ map (v: v.otherConfig) apps);
-      appConfigs = with lib.attrsets; with lib.lists; {
-        mimetypealiases = foldr (h: prev: prev // h) {} (zipped.mimetypealiases or []);
-        mimetypemapping = mapAttrs (_: v: unique (flatten v)) (zipAttrs (zipped.mimetypemapping or []));
-      };
-      newNextcloud = pkg.overrideAttrs(old: {
-        installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallApp apps);
-        passthru = toPassthru newNextcloud (pkg.apps ++ apps) appConfigs;
-      });
-    in newNextcloud;
-  package = stdenv.mkDerivation rec {
-    name = "nextcloud-${version}";
-    version = "${builtins.toString nextcloudVersion}.0.4";
-
-    src = fetchurl {
-      url = "https://download.nextcloud.com/server/releases/${name}.tar.bz2";
-      sha256 = "0aa3f4xbkzacfw0h9aic0ywk5mqlwka83qaszizj8lmk68kf3n7s";
-    };
-
-    installPhase = ''
-      mkdir -p $out/
-      cp -R . $out/
-      rm -r $out/config
-      '' + lib.optionalString (varDir != null) ''
-        ln -sf ${varDir}/config $out/config
-      '';
-
-    passthru = toPassthru package [] otherConfig;
-    meta = {
-      description = "Sharing solution for files, calendars, contacts and more";
-      homepage = https://nextcloud.com;
-      maintainers = with lib.maintainers; [ schneefux bachp globin fpletz ];
-      license = lib.licenses.agpl3Plus;
-      platforms = with lib.platforms; unix;
-    };
-  };
-in package
diff --git a/pkgs/webapps/rompr/default.nix b/pkgs/webapps/rompr/default.nix
deleted file mode 100644 (file)
index 2accf00..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ varDir ? "/var/lib/rompr", stdenv, mylibs }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./rompr.json // {
-  installPhase = ''
-        cp -a . $out
-        ln -sf ${varDir}/prefs $out/prefs
-        ln -sf ${varDir}/albumart $out/albumart
-  '';
-})
diff --git a/pkgs/webapps/rompr/rompr.json b/pkgs/webapps/rompr/rompr.json
deleted file mode 100644 (file)
index 778d915..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "1.24",
-  "meta": {
-    "name": "rompr",
-    "url": "https://github.com/fatg3erman/RompR",
-    "branch": "refs/tags/1.24"
-  },
-  "github": {
-    "owner": "fatg3erman",
-    "repo": "RompR",
-    "rev": "0d8f597027ac71b320963fe3f33f461a136312ad",
-    "sha256": "13p3c4whhmvz1vvh9fva5gdx4xji288k108hjdi8b1yn506lzix2",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/taskwarrior-web/taskwarrior-web.json b/pkgs/webapps/taskwarrior-web/taskwarrior-web.json
deleted file mode 100644 (file)
index 70f396d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "a79cfe2-master",
-  "meta": {
-    "name": "taskwarrior-web",
-    "url": "https://github.com/theunraveler/taskwarrior-web",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "theunraveler",
-    "repo": "taskwarrior-web",
-    "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
-    "sha256": "028rb4wry2an19707bvy4n305f3s0hipg214224p1m0mb61c3cq4",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json b/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json
deleted file mode 100644 (file)
index e57fcce..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "0ea2092-master",
-  "meta": {
-    "name": "ttrss-af_feedmod",
-    "url": "https://github.com/mbirth/ttrss_plugin-af_feedmod",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "mbirth",
-    "repo": "ttrss_plugin-af_feedmod",
-    "rev": "0ea2092dd34067ecd898802cfca3570023d1ecfe",
-    "sha256": "02ibf47zcrsc2rr45wsix8gxyyf371davj8n8i0gj1zdq95klvnv",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix b/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix
deleted file mode 100644 (file)
index 8512be3..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{ patched ? false, stdenv, mylibs, lib }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./af_feedmod.json // {
-  patches = lib.optionals patched [ ./type_replace.patch ];
-  installPhase = ''
-    mkdir $out
-    cp init.php $out
-    '';
-  passthru.pluginName = "af_feedmod";
-})
diff --git a/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json b/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json
deleted file mode 100644 (file)
index c8aaab5..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "4d751b0-master",
-  "meta": {
-    "name": "ttrss-auth-ldap",
-    "url": "https://github.com/hydrian/TTRSS-Auth-LDAP",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "hydrian",
-    "repo": "TTRSS-Auth-LDAP",
-    "rev": "4d751b095c29a8dbe2dc7bb07777742956136e94",
-    "sha256": "0b9fl86acrzpcv41r7pj3bl8b3n72hpkdywzx9zjyfqv5pskxyim",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix b/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix
deleted file mode 100644 (file)
index 424a9f7..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ stdenv, mylibs }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./auth-ldap.json // {
-  installPhase = ''
-    mkdir $out
-    cp plugins/auth_ldap/init.php $out
-    '';
-  passthru.pluginName = "auth_ldap";
-})
diff --git a/pkgs/webapps/ttrss/plugins/feediron/default.nix b/pkgs/webapps/ttrss/plugins/feediron/default.nix
deleted file mode 100644 (file)
index 80bfda4..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{ patched ? false, stdenv, mylibs, lib }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./feediron.json // {
-  patches = lib.optionals patched [ ./json_reformat.patch ];
-  installPhase = ''
-    mkdir $out
-    cp -a . $out
-    '';
-  passthru.pluginName = "feediron";
-})
diff --git a/pkgs/webapps/ttrss/plugins/feediron/feediron.json b/pkgs/webapps/ttrss/plugins/feediron/feediron.json
deleted file mode 100644 (file)
index 5dbec92..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "407168c-master",
-  "meta": {
-    "name": "ttrss-feediron",
-    "url": "https://github.com/m42e/ttrss_plugin-feediron",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "m42e",
-    "repo": "ttrss_plugin-feediron",
-    "rev": "407168c628880b5ced572cc549db6d50e866d3c8",
-    "sha256": "17b95ifpcph6m03hjd1mhi8gi1hw9yd3fnffmw66fqr5c9l3zd9r",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix b/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix
deleted file mode 100644 (file)
index 3540f73..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ stdenv, mylibs }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./ff_instagram.json // {
-  installPhase = ''
-    mkdir $out
-    cp -a . $out
-    '';
-  passthru.pluginName = "ff_instagram";
-})
diff --git a/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json b/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json
deleted file mode 100644 (file)
index 1f241b9..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "0366ffb-master",
-  "meta": {
-    "name": "ttrss-ff_instagram",
-    "url": "https://github.com/wltb/ff_instagram",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "wltb",
-    "repo": "ff_instagram",
-    "rev": "0366ffb18c4d490c8fbfba2f5f3367a5af23cfe8",
-    "sha256": "0vvzl6wi6jmrqknsfddvckjgsgfizz1d923d1nyrpzjfn6bda1vk",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix b/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix
deleted file mode 100644 (file)
index 2cf3e05..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ stdenv, mylibs }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./tumblr_gdpr_ua.json // {
-  installPhase = ''
-    mkdir $out
-    cp -a . $out
-    '';
-  passthru.pluginName = "tumblr_gdpr_ua";
-})
diff --git a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json b/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json
deleted file mode 100644 (file)
index eafbcfe..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "287c584-master",
-  "meta": {
-    "name": "ttrss-tumblr_gdpr_ua",
-    "url": "https://github.com/hkockerbeck/ttrss-tumblr-gdpr-ua",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "hkockerbeck",
-    "repo": "ttrss-tumblr-gdpr-ua",
-    "rev": "287c584e68845d524f920156bff0b2eaa6f65117",
-    "sha256": "1fviawgcclqky4k4xv1sqzvpb8i74w9f0pclm09m78s8l85wh9py",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/yourls/plugins/ldap/default.nix b/pkgs/webapps/yourls/plugins/ldap/default.nix
deleted file mode 100644 (file)
index 01dc6fb..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{ stdenv, mylibs }:
-stdenv.mkDerivation (mylibs.fetchedGithub ./ldap.json // rec {
-  installPhase = ''
-    mkdir -p $out
-    cp plugin.php $out
-    '';
-  passthru.pluginName = "ldap";
-})
diff --git a/pkgs/webapps/yourls/plugins/ldap/ldap.json b/pkgs/webapps/yourls/plugins/ldap/ldap.json
deleted file mode 100644 (file)
index 9411e4a..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "2a3cb03-master",
-  "meta": {
-    "name": "yourls-ldap-plugin",
-    "url": "https://github.com/k3a/yourls-ldap-plugin",
-    "branch": "master"
-  },
-  "github": {
-    "owner": "k3a",
-    "repo": "yourls-ldap-plugin",
-    "rev": "2a3cb0334b8a6b81b284a7196e614bbd2b2b1615",
-    "sha256": "0cchbnli77d295lzf7kjmn4dcxj2bmdqa9qc3f8l8qgmp4n5n0gh",
-    "fetchSubmodules": true
-  }
-}
diff --git a/pkgs/webapps/yourls/yourls.json b/pkgs/webapps/yourls/yourls.json
deleted file mode 100644 (file)
index 0a79b18..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tag": "1.7.3",
-  "meta": {
-    "name": "yourls",
-    "url": "https://github.com/YOURLS/YOURLS",
-    "branch": "refs/tags/1.7.3"
-  },
-  "github": {
-    "owner": "YOURLS",
-    "repo": "YOURLS",
-    "rev": "077018822d3594229daa8343310d0b40804b9ddc",
-    "sha256": "1av6h619rwqn0yn0kjn2s2h3gmrhmxaaa9hd5ns4ralxgg731imd",
-    "fetchSubmodules": true
-  }
-}
diff --git a/scripts/fetch_version b/scripts/fetch_version
deleted file mode 100755 (executable)
index 5c4715a..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/usr/bin/env bash
-
-usage() {
-  echo "$0 file.json"
-  echo "$0 [-n|--name name] [-b|--branch branch_or_rev] [-f|--file out_file] [-h|--help] (-u|--url) url"
-  exit
-}
-
-branch="master"
-while [[ $# -gt 0 ]]; do
-  a="$1"
-  shift
-  case "$a" in
-    *.json)
-      file=$a
-      content=$(cat $a)
-      name="$(echo "$content" | jq -r ".meta.name")"
-      url="$(echo "$content" | jq -r ".meta.url")"
-      branch="$(echo "$content" | jq -r ".meta.branch")"
-      ;;
-    -n|--name)
-      name=$1
-      shift
-      ;;
-    -u|--url)
-      url=$1
-      shift
-      ;;
-    -b|--branch)
-      branch=$1
-      shift
-      ;;
-    -f|--file)
-      file=$1
-      shift
-      ;;
-    -h|--help)
-      usage
-      ;;
-  esac
-done
-if [ -z "$url" ]; then
-  usage
-fi
-if [ -z "$name" ]; then
-  name=$(echo "$url" | cut -d"/" -f5)
-fi
-if [ -z "$file" ]; then
-  file=$name.json
-fi
-
-# function fetch_ledger () {
-#   pushd $HOME/projets/ledger >/dev/null 2>/dev/null
-#   git fetch origin
-#   tag="$(git describe origin/next | sed -e "s/^v//")"
-#   rev="$(git show-ref -s refs/remotes/origin/next)"
-#   sha="$(nix-prefetch-url --unpack file://<(git archive --format=tar.gz HEAD) 2>/dev/null)"
-#   popd >/dev/null 2>/dev/null
-# }
-
-# awk_describe='BEGIN {
-#   FS = "[ /^]+"
-#   while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) {
-#     if (!sha)
-#       sha = substr($0, 1, 7)
-#     tag = $3
-#   }
-#   while ("curl -s " ARGV[1] "/releases/tag/" tag | getline)
-#     if ($3 ~ "commits")
-#       com = $2
-#   printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha
-# }'
-
-function get_ref () {
-  case "$1" in
-    refs/*)
-      echo "$1"
-      ;;
-    *)
-      echo "refs/heads/$1"
-      ;;
-  esac
-}
-
-function get_name () {
-  branch="$1"
-  rev="$2"
-  minirev=${rev:0:7}
-
-  case "$branch" in
-    refs/tags/*)
-      b="${branch#refs/tags/}"
-      echo "${b//\//-}"
-      ;;
-    refs/heads/*)
-      b=${branch#refs/heads/}
-      echo "$minirev-${b//\//-}"
-      ;;
-    refs/*)
-      b=${branch#refs/}
-      echo "$minirev-${b//\//-}"
-      ;;
-    *)
-      echo "$minirev-${branch//\//-}"
-      ;;
-  esac
-}
-
-function fetch_github () {
-  rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)"
-  sha="$(nix-prefetch-url --unpack $url/archive/$rev.tar.gz)"
-  # Différent du git-describe et github-spécifique
-  #tag=$(echo "$awk_describe" | awk -f - $url | sed -e "s/^v//")
-  tag=$(get_name $branch $rev)
-}
-
-function fetch_other () {
-  rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)"
-  sha="$(nix-prefetch-git --url $url --rev $(get_ref $branch) | jq -r '.sha256')"
-  tag=$(get_name $branch $rev)
-}
-
-case "$url" in
-  https://*github.com/*)
-    fetch_github 2>/dev/null
-    owner=$(echo "$url" | cut -d"/" -f4)
-    repo=$(echo "$url" | cut -d"/" -f5)
-
-    F='{
-      "tag": $tag,
-      "meta": {
-        "name": $name,
-        "url": $url,
-        "branch": $branch
-      },
-      "github": {
-        "owner": $owner,
-        "repo": $repo,
-        "rev": $rev,
-        "sha256": $sha,
-        "fetchSubmodules": true
-      }
-    }'
-    ;;
-  *)
-    fetch_other 2>/dev/null
-    F='{
-      "tag": $tag,
-      "meta": {
-        "name": $name,
-        "url": $url,
-        "branch": $branch
-      },
-      "git": {
-        "url": $url,
-        "rev": $rev,
-        "sha256": $sha,
-        "fetchSubmodules": true
-      }
-    }'
-    ;;
-esac
-
-jq -n \
-  --arg name "$name" \
-  --arg owner "$owner" \
-  --arg repo "$repo" \
-  --arg tag "$tag" \
-  --arg rev "$rev" \
-  --arg url "$url" \
-  --arg branch "$branch" \
-  --arg sha "$sha" \
-  "$F" > $file
index 127f8bd667a5f376f8f212696e07462b32ce4400..2b7278fac53ab23831626ed64472471379c679d7 100755 (executable)
@@ -19,7 +19,7 @@ git rebase --onto=$nur_root $first_commit master
 # The list below musn't get shrinked, it is used by filter-branch on
 # every commit
 clean_folder='
 # 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
   for broken in pkgs/crypto/cardano/default.nix; do
     if [ -f $broken ]; then
       rm -f $broken
diff --git a/scripts/refresh_flakes b/scripts/refresh_flakes
new file mode 100755 (executable)
index 0000000..2bbcad6
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+
+set -e
+
+declare -A refreshed
+
+while [ -n "$1" ]; do
+  case "$1" in
+    --no-new-inputs)
+      no_new_inputs="y"
+      shift;;
+    *)
+      flake_or_dir="$1"
+      shift;;
+  esac
+done
+
+refresh_deps() {
+  local flake
+  local inputs=()
+  local depname
+  local deppath
+  flake="$(realpath $1)"
+  if [ "${refreshed[$flake]}" = 1 ]; then
+    return
+  fi
+  pushd "$flake" 2>/dev/null >/dev/null
+  if [ -z "$no_new_inputs" ]; then
+    nix --no-warn-dirty flake lock
+  fi
+  if [ ! -e "$flake/flake.lock" ]; then
+    popd 2>/dev/null >/dev/null
+    refreshed[$flake]=1
+    return
+  fi
+
+  deps=$(jq -r '. as $root | .nodes[.root].inputs|values|to_entries|map({ key: .key, value: $root.nodes[.value].original.path })[]|select(.value != null)|.key + " " + .value' < flake.lock)
+  if [ -n "$deps" ]; then
+    while read depname deppath; do
+      refresh_deps "$deppath"
+      inputs+=(--update-input "$depname")
+    done <<<"$deps"
+  fi
+  nix --no-warn-dirty flake lock "${inputs[@]}"
+  popd 2>/dev/null >/dev/null
+  refreshed[$flake]=1
+}
+
+git_dir=$(git rev-parse --show-toplevel)
+
+# If argument is given (flake.nix or directory containing), refresh that argument
+# Otherwise, if we are in a subdirectory containing a flake.nix, refresh that
+# Otherwise, refresh all
+if [ -n "$flake_or_dir" ]; then
+  if [ -d "$flake_or_dir" -a -e "$1/flake.nix" ]; then
+    refresh_deps "$flake_or_dir"
+  elif [ -f "$flake_or_dir" -a -e "$(dirname $flake_or_dir)/flake.nix" ]; then
+    refresh_deps "$(dirname $flake_or_dir)"
+  else
+    echo "No flake.nix file in specified location"
+    exit 1
+  fi
+else
+  if [ "$(pwd)" != "$git_dir" -a -e "$(pwd)/flake.nix" ]; then
+    refresh_deps "$(pwd)"
+  else
+    find $git_dir -name "flake.lock" | while read flake; do
+      refresh_deps "$(dirname $flake)"
+    done
+  fi
+fi
similarity index 100%
rename from nixops/scripts/setup
rename to scripts/setup
diff --git a/scripts/update_flake b/scripts/update_flake
new file mode 100755 (executable)
index 0000000..3a9cd17
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+
+searched_file="$1"
+
+get_inputs() {
+  flake=$1
+  name=$2
+  cat "$flake" | jq -r --arg name "$name" '.nodes|to_entries[]|select(.value.original.path != null and (.value.original.path|test("(../)+" + $name)))|.key'
+}
+
+find flakes -name "flake.lock" | while read flake; do
+  for input in $(get_inputs "$flake" "$searched_file"); do
+    echo "updating $input in $(dirname "$flake")"
+    pushd "$(dirname "$flake")" >/dev/null 2>/dev/null
+    nix flake update --update-input "$input"
+    popd >/dev/null 2>/dev/null
+  done
+done
diff --git a/scripts/with_env b/scripts/with_env
new file mode 100755 (executable)
index 0000000..783d86c
--- /dev/null
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+
+if [ -z "$SOPS_VARS_FILE" ]; then
+  echo "Variable SOPS_VARS_FILE is needed with a path to the sops variables"
+  exit 1;
+fi
+
+umask 0077
+TEMP=$(mktemp -d /tmp/XXXXXX-nixops-files)
+chmod go-rwx $TEMP
+
+finish() {
+  rm -rf "$TEMP"
+}
+
+trap finish EXIT
+
+sops -d $SOPS_VARS_FILE | yq -r .ssl_keys.nix_repository > $TEMP/id_ed25519
+
+cat > $TEMP/ssh_config <<EOF
+Host *
+IdentityFile $TEMP/id_ed25519
+EOF
+export SSH_CONFIG_FILE="$TEMP/ssh_config"
+export SSH_IDENTITY_FILE="$TEMP/id_ed25519"
+
+"$@"
diff --git a/shell.nix b/shell.nix
deleted file mode 100644 (file)
index 2295f8c..0000000
--- a/shell.nix
+++ /dev/null
@@ -1,18 +0,0 @@
-{ 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 ];
-}
similarity index 70%
rename from modules/private/system/backup-2.nix
rename to systems/backup-2/base.nix
index c01a666b7deea692a212ca5cd8ef16fc1c544aea..97a364caa55efbf9ef58e6d36f95130256e45dea 100644 (file)
@@ -1,10 +1,5 @@
-{ config, pkgs, resources, name, ... }:
+{ config, pkgs, resources, name, lib, nixpkgs, secrets, ... }:
 {
 {
-  deployment = {
-    targetUser = "root";
-    targetHost = config.hostEnv.ips.main.ip4;
-    substituteOnDestination = true;
-  };
   # ssh-keyscan backup-2 | nix-shell -p ssh-to-age --run ssh-to-age
   secrets.ageKeys = [ "age1kk3nr27qu42j28mcfdag5lhq0zu2pky7gfanvne8l4z2ctevjpgskmw0sr" ];
   secrets.keys = {
   # ssh-keyscan backup-2 | nix-shell -p ssh-to-age --run ssh-to-age
   secrets.ageKeys = [ "age1kk3nr27qu42j28mcfdag5lhq0zu2pky7gfanvne8l4z2ctevjpgskmw0sr" ];
   secrets.keys = {
     };
   };
   boot.kernelPackages = pkgs.linuxPackages_latest;
     };
   };
   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" = {
 
   fileSystems = {
     "/backup2" = {
@@ -36,9 +44,9 @@
 
   networking = {
     firewall.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);
     interfaces."ens3".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
       (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
       config.hostEnv.ips);
@@ -47,9 +55,7 @@
 
   boot.loader.grub.device = "nodev";
 
 
   boot.loader.grub.device = "nodev";
 
-  myServices.certificates.enable = true;
   security.acme.certs."${name}" = {
   security.acme.certs."${name}" = {
-    user = config.services.nginx.user;
     group = config.services.nginx.group;
   };
   services.nginx = {
     group = config.services.nginx.group;
   };
   services.nginx = {
     enable = true;
   };
 
     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;
   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
         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";
           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
   # 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?
 }
 }
similarity index 89%
rename from modules/private/databases/mariadb_replication.nix
rename to systems/backup-2/databases/mariadb_replication.nix
index 68e6f7fdd809590e503d35d7e4793539b9d695a2..8d2b45727652fba98ea1db897726c5561c08e169 100644 (file)
@@ -38,7 +38,7 @@ in
               '';
           };
           port = lib.mkOption {
               '';
           };
           port = lib.mkOption {
-            type = lib.types.str;
+            type = lib.types.int;
             description = ''
               Port to connect to
               '';
             description = ''
               Port to connect to
               '';
@@ -73,6 +73,26 @@ in
   };
 
   config = lib.mkIf cfg.enable {
   };
 
   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";
     users.users.mysql = {
       description = "MySQL server user";
       group = "mysql";
@@ -87,7 +107,7 @@ in
         group = "mysql";
         permissions = "0400";
         text = ''
         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;
           '';
       })
           START SLAVE;
           '';
       })
@@ -192,7 +212,7 @@ in
               ${hcfg.package}/bin/mysqldump \
                 --defaults-file=${config.secrets.fullPaths."mysql_replication/${name}/mysqldump_remote"} \
                 -h ${hcfg.host} \
               ${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 \
                 --ssl \
                 --gtid \
                 --flush-privileges \
similarity index 96%
rename from modules/private/databases/openldap_replication.nix
rename to systems/backup-2/databases/openldap_replication.nix
index b456323460c2234bb0e6f30ea13f9b719c01eac8..b962224aaccf6ab7d5afc70843a16452f6af45ac 100644 (file)
@@ -1,19 +1,18 @@
-{ pkgs, config, lib, ... }:
+{ pkgs, config, lib, openldap, ... }:
 let
   cfg = config.myServices.databasesReplication.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
   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
 
     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}"
 
     suffix    "${hcfg.base}"
     rootdn    "cn=root,${hcfg.base}"
similarity index 88%
rename from modules/private/databases/postgresql_replication.nix
rename to systems/backup-2/databases/postgresql_replication.nix
index 135bbed0d90bfbc9cd239727ab3ddbfc5a88e649..5351a4f0053dee1438bb5e31b903534c177cce6e 100644 (file)
@@ -50,6 +50,26 @@ in
   };
 
   config = lib.mkIf cfg.enable {
   };
 
   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;
     users.users.postgres = {
       name = "postgres";
       uid = config.ids.uids.postgres;
@@ -90,6 +110,7 @@ in
           unix_socket_directories = '${dataDir}'
           data_directory = '${dataDir}'
           wal_level = logical
           unix_socket_directories = '${dataDir}'
           data_directory = '${dataDir}'
           wal_level = logical
+          max_connections = 300
           '';
       })
     ]) cfg.hosts));
           '';
       })
     ]) cfg.hosts));
similarity index 98%
rename from modules/private/databases/redis_replication.nix
rename to systems/backup-2/databases/redis_replication.nix
index 9e48939ecf0a938bcfa35f924b071217fea8c8fa..53fa90407947d367ca2df52529b7dc7e6373f992 100644 (file)
@@ -63,7 +63,7 @@ in
       config.redis = {
         encrypt = true;
         source = "127.0.0.1:16379";
       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";
       };
     };
         keyfile = config.secrets.fullPaths."redis/spiped_eldiron_keyfile";
       };
     };
similarity index 96%
rename from modules/private/databases/utils.nix
rename to systems/backup-2/databases/utils.nix
index 47988fce7ba466825539edb120d7a570172c40b6..1b3190ff1035cfe885e1af8a3a2afa6f8e20dab3 100644 (file)
@@ -16,7 +16,7 @@
       rev = "061f0564757289d3bea553b16f8fd5c4a0319c5e";
     };
     log2rotate = pkgs.writeScript "log2rotate" ''
       rev = "061f0564757289d3bea553b16f8fd5c4a0319c5e";
     };
     log2rotate = pkgs.writeScript "log2rotate" ''
-      #!${pkgs.python3}/bin/python
+      #!${pkgs.python38}/bin/python
 
       ${builtins.readFile "${log2rotateSrc}/log2rotate.py"}
     '';
 
       ${builtins.readFile "${log2rotateSrc}/log2rotate.py"}
     '';
diff --git a/systems/backup-2/flake.lock b/systems/backup-2/flake.lock
new file mode 100644 (file)
index 0000000..46003ba
--- /dev/null
@@ -0,0 +1,1159 @@
+{
+  "nodes": {
+    "backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_6",
+        "nixpkgs": "nixpkgs_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "chatons": {
+      "inputs": {
+        "environment": "environment"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "colmena": {
+      "inputs": {
+        "flake-compat": "flake-compat",
+        "flake-utils": "flake-utils_3",
+        "nixpkgs": "nixpkgs_3",
+        "stable": "stable"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "disko": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_4"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "flake-compat": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_2"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_2": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_3"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_2": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_3": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_4": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_5": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_6": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "mail-relay": {
+      "inputs": {
+        "environment": "environment_3",
+        "secrets": "secrets"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      }
+    },
+    "milters": {
+      "inputs": {
+        "environment": "environment_4",
+        "files-watcher": "files-watcher",
+        "openarc": "openarc",
+        "opendmarc": "opendmarc",
+        "secrets": "secrets_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      }
+    },
+    "monitoring": {
+      "inputs": {
+        "environment": "environment_5",
+        "naemon": "naemon",
+        "nixpkgs-lib": "nixpkgs-lib",
+        "secrets": "secrets_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "my-lib": {
+      "inputs": {
+        "colmena": "colmena",
+        "disko": "disko",
+        "flake-parts": "flake-parts",
+        "nixos-anywhere": "nixos-anywhere",
+        "nixpkgs": "nixpkgs_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_2",
+        "nixpkgs": "nixpkgs_11",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "nixos-2305": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere": {
+      "inputs": {
+        "disko": [
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305",
+        "nixos-images": "nixos-images",
+        "nixpkgs": "nixpkgs_5",
+        "treefmt-nix": "treefmt-nix"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-images": {
+      "inputs": {
+        "nixos-2305": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_2": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_3": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_10": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_11": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_3": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_4": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_5": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_6": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_7": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_8": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_9": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs",
+        "openarc": "openarc_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_3": {
+      "inputs": {
+        "files-watcher": "files-watcher_2",
+        "openarc": "openarc_4",
+        "secrets": "secrets_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      }
+    },
+    "openarc_4": {
+      "inputs": {
+        "flake-utils": "flake-utils_4",
+        "myuids": "myuids_4",
+        "nixpkgs": "nixpkgs_8",
+        "openarc": "openarc_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_2",
+        "myuids": "myuids_2",
+        "nixpkgs": "nixpkgs_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_2": {
+      "inputs": {
+        "environment": "environment_6",
+        "files-watcher": "files-watcher_3",
+        "opendmarc": "opendmarc_3",
+        "secrets": "secrets_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_3": {
+      "inputs": {
+        "flake-utils": "flake-utils_5",
+        "myuids": "myuids_5",
+        "nixpkgs": "nixpkgs_9"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "openldap": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "chatons": "chatons",
+        "environment": "environment_2",
+        "loginctl-linger": "loginctl-linger",
+        "mail-relay": "mail-relay",
+        "milters": "milters",
+        "monitoring": "monitoring",
+        "my-lib": "my-lib",
+        "myuids": "myuids_3",
+        "nixpkgs": "nixpkgs_7",
+        "openarc": "openarc_3",
+        "opendmarc": "opendmarc_2",
+        "openldap": "openldap",
+        "rsync_backup": "rsync_backup",
+        "secrets": "secrets_6",
+        "system": "system"
+      }
+    },
+    "rsync_backup": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
+        "path": "../../flakes/rsync_backup",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/rsync_backup",
+        "type": "path"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "stable": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "system": {
+      "inputs": {
+        "backports": "backports",
+        "environment": "environment_7",
+        "mypackages": "mypackages",
+        "myuids": "myuids_6",
+        "secrets-public": "secrets-public"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/systems/backup-2/flake.nix b/systems/backup-2/flake.nix
new file mode 100644 (file)
index 0000000..e6807d6
--- /dev/null
@@ -0,0 +1,51 @@
+{
+  inputs = {
+    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+
+    my-lib.url = "path:../../flakes/lib";
+
+    openldap.url = "path:../../flakes/private/openldap";
+    monitoring.url = "path:../../flakes/private/monitoring";
+    mail-relay.url = "path:../../flakes/private/mail-relay";
+    milters.url = "path:../../flakes/private/milters";
+    openarc.url = "path:../../flakes/private/openarc";
+    opendmarc.url = "path:../../flakes/private/opendmarc";
+    chatons.url = "path:../../flakes/private/chatons";
+    environment.url = "path:../../flakes/private/environment";
+    system.url = "path:../../flakes/private/system";
+
+    myuids.url = "path:../../flakes/myuids";
+    secrets.url = "path:../../flakes/secrets";
+    rsync_backup.url = "path:../../flakes/rsync_backup";
+    loginctl-linger.url = "path:../../flakes/loginctl-linger";
+  };
+  outputs = inputs@{ self, my-lib, nixpkgs, ...}:
+    my-lib.lib.mkColmenaFlake {
+      name = "backup-2";
+      inherit self nixpkgs;
+      system = "x86_64-linux";
+      targetHost = "95.217.19.143";
+      targetUser = "root";
+      nixosModules = {
+        base = ./base.nix;
+        system = inputs.system.nixosModule;
+        mail-relay = inputs.mail-relay.nixosModule;
+        milters = inputs.milters.nixosModule;
+        openarc = inputs.openarc.nixosModule;
+        opendmarc = inputs.opendmarc.nixosModule;
+        chatons = inputs.chatons.nixosModule;
+        monitoring = inputs.monitoring.nixosModule;
+        environment = inputs.environment.nixosModule;
+
+        myuids = inputs.myuids.nixosModule;
+        secrets = inputs.secrets.nixosModule;
+        rsync_backup = inputs.rsync_backup.nixosModule;
+        loginctl-linger = inputs.loginctl-linger.nixosModule;
+      };
+      moduleArgs = {
+        nixpkgs = inputs.nixpkgs;
+        openldap = inputs.openldap;
+        monitoring = inputs.monitoring;
+      };
+    };
+}
similarity index 68%
rename from modules/private/mail/relay.nix
rename to systems/backup-2/mail/relay.nix
index 668d3659a919db2edd6da4e44da8642e42707154..1b7e25e8a5d855c032f685bc07c63ad20b2d8db4 100644 (file)
@@ -1,17 +1,22 @@
-{ lib, pkgs, config, nodes, name, ... }:
+{ lib, pkgs, config, name, nodes, ... }:
+let
+  getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) (lib.filterAttrs (n: v: v.receive) p.emailPolicies);
+  bydomain = builtins.mapAttrs (n: getDomains) nodes.eldiron.config.myServices.dns.zones;
+  receiving_domains = lib.flatten (builtins.attrValues bydomain);
+in
 {
 {
+  options.myServices.mailBackup.enable = lib.mkEnableOption "enable MX backup services";
   config = lib.mkIf config.myServices.mailBackup.enable {
   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;
       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" = {
     };
     secrets.keys = {
       "postfix/mysql_alias_maps" = {
     };
     services.postfix = {
       mapFiles = let
     };
     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}";
         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" (
           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
             )
           );
         };
       in
-        recipient_maps // relay_restrictions // virtual_map;
+        virtual_map;
       config = {
         ### postfix module overrides
         readme_directory = "${pkgs.postfix}/share/postfix/doc";
       config = {
         ### postfix module overrides
         readme_directory = "${pkgs.postfix}/share/postfix/doc";
         alias_database = "\$alias_maps";
 
         ### Relay domains
         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
         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"}"
           virtual_alias_maps = [
             "hash:/etc/postfix/virtual"
             "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}"
             "pgsql:${config.secrets.fullPaths."postfix/sympa_mailbox_maps"}"
           ];
         in
             "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"
         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";
 
         ### Additional smtpd configuration
         smtpd_tls_received_header = "yes";
         smtp_tls_loglevel = "1";
 
         ### Force ip bind for smtp
         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 = [
         smtp_bind_address6 = builtins.head config.myEnv.servers."${name}".ips.main.ip6;
 
         smtpd_milters = [
diff --git a/systems/backup-2/monitoring.nix b/systems/backup-2/monitoring.nix
new file mode 100644 (file)
index 0000000..6d769e3
--- /dev/null
@@ -0,0 +1,117 @@
+{ config, pkgs, lib, name, openldap, monitoring, ... }:
+let
+  hostFQDN = config.hostEnv.fqdn;
+  emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
+in
+{
+  config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "file_date" "mysql" "openldap" "redis" "emails" "notify-secondary"];
+  config.myServices.monitoring.objects = lib.mkMerge [
+    (monitoring.lib.objectsCommon {
+      inherit hostFQDN;
+      hostName = name;
+      master = false;
+      processWarn = "60"; processAlert = "70";
+      loadWarn = "4.0"; loadAlert = "6.0";
+      load15Warn = "1.0"; load15Alert = "1.0";
+      interface = builtins.head (builtins.attrNames config.networking.interfaces);
+    })
+
+    {
+      service = [
+        (emailCheck "backup-2" hostFQDN // {
+          __passive_servicegroups = "webstatus-email";
+        })
+        {
+          service_description = "Size on /backup2 partition";
+          use = "local-service";
+          check_command = ["check_local_disk" "10%" "5%" "/backup2"];
+          __passive_servicegroups = "webstatus-resources";
+        }
+        {
+          service_description = "Last backup in /backup2/phare is not too old";
+          use = "local-service";
+          check_command = ["check_last_file_date" "/backup2/phare" "14" "backup"];
+          __passive_servicegroups = "webstatus-backup";
+        }
+        {
+          service_description = "Last backup in /backup2/dilion is not too old";
+          use = "local-service";
+          check_command = ["check_last_file_date" "/backup2/dilion" "14" "backup"];
+          __passive_servicegroups = "webstatus-backup";
+        }
+        {
+          service_description = "Last backup in /backup2/ulminfo is not too old";
+          use = "local-service";
+          check_command = ["check_last_file_date" "/backup2/ulminfo" "14" "backup"];
+          __passive_servicegroups = "webstatus-backup";
+        }
+        {
+          service_description = "Last postgresql dump in /backup2/eldiron/postgresql_backup is not too old";
+          use = "local-service";
+          check_command = ["check_last_file_date" "/backup2/eldiron/postgresql_backup" "7" "postgres"];
+          __passive_servicegroups = "webstatus-databases,webstatus-backup";
+        }
+        {
+          service_description = "Redis replication for eldiron is up to date";
+          use = "local-service";
+          check_command = ["check_redis_replication" "/run/redis_eldiron/redis.sock"];
+          __passive_servicegroups = "webstatus-databases";
+        }
+        {
+          service_description = "Last redis dump in /backup2/eldiron/redis_backup is not too old";
+          use = "local-service";
+          check_command = ["check_last_file_date" "/backup2/eldiron/redis_backup" "7" "redis"];
+          __passive_servicegroups = "webstatus-databases,webstatus-backup";
+        }
+        {
+          service_description = "Mysql replication for eldiron is up to date";
+          use = "local-service";
+          check_command = ["check_mysql_replication" "/run/mysqld_eldiron/mysqld.sock" config.secrets.fullPaths."mysql_replication/eldiron/client"];
+          __passive_servicegroups = "webstatus-databases";
+        }
+        {
+          service_description = "Last mysql dump in /backup2/eldiron/mysql_backup is not too old";
+          use = "local-service";
+          check_command = ["check_last_file_date" "/backup2/eldiron/mysql_backup" "7" "mysql"];
+          __passive_servicegroups = "webstatus-databases,webstatus-backup";
+        }
+        {
+          service_description = "Openldap replication for eldiron is up to date";
+          use = "local-service";
+          check_command = let
+            name = "eldiron";
+            hcfg = config.myServices.databasesReplication.openldap.hosts.eldiron;
+            base = config.myServices.databasesReplication.openldap.base;
+            ldapConfig = pkgs.writeText "slapd.conf" ''
+              include ${pkgs.openldap}/etc/schema/core.schema
+              include ${pkgs.openldap}/etc/schema/cosine.schema
+              include ${pkgs.openldap}/etc/schema/inetorgperson.schema
+              include ${pkgs.openldap}/etc/schema/nis.schema
+              include ${openldap.immae-schema}
+              moduleload  back_mdb
+              backend     mdb
+              database    mdb
+
+              suffix    "${hcfg.base}"
+              directory ${base}/${name}/openldap
+              '';
+          in [
+            "check_openldap_replication"
+            hcfg.url
+            hcfg.dn
+            config.secrets.fullPaths."openldap_replication/eldiron/replication_password"
+            hcfg.base
+            "${ldapConfig}"
+          ];
+          __passive_servicegroups = "webstatus-databases";
+        }
+        {
+          service_description = "Last openldap dump in /backup2/eldiron/openldap_backup is not too old";
+          use = "local-service";
+          check_command = ["check_last_file_date" "/backup2/eldiron/openldap_backup" "7" "openldap"];
+          __passive_servicegroups = "webstatus-databases,webstatus-backup";
+        }
+      ];
+    }
+  ];
+}
similarity index 50%
rename from modules/private/system/dilion.nix
rename to systems/dilion/base.nix
index fa92cd98a96bc1ccfad58ce56c42c6962a8cbf23..ac4bdaf669f054a14ddcfe2dcdded11a471eeb34 100644 (file)
@@ -1,24 +1,17 @@
-{ config, pkgs, name, lib, ... }:
+{ config, pkgs, name, lib, pkgs-no-overlay, secrets, ... }:
 {
 {
-  deployment = {
-    targetUser = "root";
-    targetHost = config.hostEnv.ips.main.ip4;
-    substituteOnDestination = true;
-  };
   # ssh-keyscan dilion | nix-shell -p ssh-to-age --run ssh-to-age
   secrets.ageKeys = [ "age1x49n6qa0arkdpq8530s7umgm0gqkq90exv4jep97q30rfnzknpaqate06a" ];
   # 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 = {
   boot = {
     loader = {
       grub = {
-        version = 2;
         devices = [ "/dev/sda" "/dev/sdb" "/dev/sdc" "/dev/sdd" ];
       };
       timeout = 1;
     };
     blacklistedKernelModules = [ "nvidiafb" ];
     supportedFilesystems = [ "zfs" ];
         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 = {
     kernelModules = [ "kvm-intel" ];
     initrd.availableKernelModules = [ "ahci" "sd_mod" ];
     initrd.secrets = {
     # available in nixos-20.09
     #zfs.requestEncryptionCredentials = [ "zpool/root" ];
   };
     # available in nixos-20.09
     #zfs.requestEncryptionCredentials = [ "zpool/root" ];
   };
-  nix.maxJobs = 8;
   powerManagement.cpuFreqGovernor = "powersave";
   hardware.enableRedistributableFirmware = true;
 
   powerManagement.cpuFreqGovernor = "powersave";
   hardware.enableRedistributableFirmware = true;
 
-  myEnv = import ../../../nixops/secrets/environment.nix;
-
   swapDevices = [ { label = "swap"; } ];
   fileSystems = {
     "/"           = { fsType = "zfs"; device = "zpool/root"; };
   swapDevices = [ { label = "swap"; } ];
   fileSystems = {
     "/"           = { fsType = "zfs"; device = "zpool/root"; };
     ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="10:bf:48:7f:e6:3b", NAME="eth0"
   '';
 
     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 =
   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
     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" ];
 
   system.nssModules = [ pkgs.libvirt ];
   system.nssDatabases.hosts = lib.mkForce [ "files" "libvirt_guest" "mymachines" "dns" "myhostname" ];
     shell = pkgs.bashInteractive;
     isSystemUser = true;
     group = "libvirtd";
     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
     ];
   };
 
     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" ];
   users.users.backup = {
     hashedPassword = "!";
     isSystemUser = true;
     extraGroups = [ "keys" ];
+    group = "backup";
     shell = pkgs.bashInteractive;
     openssh.authorizedKeys.keys = let
     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}"];
   };
     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;
   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.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 = {
 
   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
     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.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}" = {
     domain = "dilion.immae.eu";
   };
   security.acme.certs."${name}" = {
-    user = config.services.nginx.user;
     group = config.services.nginx.group;
     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;
   services.nginx = {
     enable = true;
     recommendedOptimisation = true;
     recommendedGzipSettings = true;
     recommendedProxySettings = true;
-    upstreams = {
-      caldance.servers."caldance:3031" = {};
-    };
     virtualHosts = {
       "dilion.immae.dev" = {
     virtualHosts = {
       "dilion.immae.dev" = {
-        acmeRoot = config.myServices.certificates.webroot;
+        acmeRoot = config.security.acme.defaults.webroot;
         useACMEHost = name;
         forceSSL = true;
         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.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
   # 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;
   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
           # 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
   };
   # This value determines the NixOS release with which your system is
   # to be compatible, in order to avoid breaking some software such as
   # database servers. You should change this only after NixOS release
   # notes say you should.
   # https://nixos.org/nixos/manual/release-notes.html
-  system.stateVersion = "20.03"; # Did you read the comment?
+  system.stateVersion = "23.05"; # Did you read the comment?
 }
 
 }
 
diff --git a/systems/dilion/flake.lock b/systems/dilion/flake.lock
new file mode 100644 (file)
index 0000000..6da2d47
--- /dev/null
@@ -0,0 +1,695 @@
+{
+  "nodes": {
+    "backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_2",
+        "nixpkgs": "nixpkgs_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "colmena": {
+      "inputs": {
+        "flake-compat": "flake-compat",
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs",
+        "stable": "stable"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "disko": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_2"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "flake-compat": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_2"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_2": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_3"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_2": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "monitoring": {
+      "inputs": {
+        "environment": "environment_2",
+        "naemon": "naemon",
+        "nixpkgs-lib": "nixpkgs-lib",
+        "secrets": "secrets"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "my-lib": {
+      "inputs": {
+        "colmena": "colmena",
+        "disko": "disko",
+        "flake-parts": "flake-parts",
+        "nixos-anywhere": "nixos-anywhere",
+        "nixpkgs": "nixpkgs_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_2",
+        "nixpkgs": "nixpkgs_7",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "nixos-2305": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere": {
+      "inputs": {
+        "disko": [
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305",
+        "nixos-images": "nixos-images",
+        "nixpkgs": "nixpkgs_3",
+        "treefmt-nix": "treefmt-nix"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-images": {
+      "inputs": {
+        "nixos-2305": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_2": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_3": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_3": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_4": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_5": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_6": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_7": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "environment": "environment",
+        "files-watcher": "files-watcher",
+        "loginctl-linger": "loginctl-linger",
+        "monitoring": "monitoring",
+        "my-lib": "my-lib",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs_5",
+        "secrets": "secrets_2",
+        "ssh": "ssh",
+        "system": "system"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "secrets_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "ssh": {
+      "inputs": {
+        "environment": "environment_3",
+        "secrets": "secrets_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      }
+    },
+    "stable": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "system": {
+      "inputs": {
+        "backports": "backports",
+        "environment": "environment_4",
+        "mypackages": "mypackages",
+        "myuids": "myuids_2",
+        "secrets-public": "secrets-public"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/systems/dilion/flake.nix b/systems/dilion/flake.nix
new file mode 100644 (file)
index 0000000..9747086
--- /dev/null
@@ -0,0 +1,43 @@
+{
+  inputs = {
+    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+
+    my-lib.url = "path:../../flakes/lib";
+
+    monitoring.url = "path:../../flakes/private/monitoring";
+    ssh.url = "path:../../flakes/private/ssh";
+    environment.url = "path:../../flakes/private/environment";
+    system.url = "path:../../flakes/private/system";
+
+    myuids.url = "path:../../flakes/myuids";
+    secrets.url = "path:../../flakes/secrets";
+    files-watcher.url = "path:../../flakes/files-watcher";
+    loginctl-linger.url = "path:../../flakes/loginctl-linger";
+  };
+  outputs = inputs@{ self, my-lib, nixpkgs, ...}:
+    my-lib.lib.mkColmenaFlake {
+      name = "dilion";
+      inherit self nixpkgs;
+      system = "x86_64-linux";
+      targetHost = "176.9.10.233";
+      targetUser = "root";
+      nixosModules = {
+        base = ./base.nix;
+        system = inputs.system.nixosModule;
+        monitoring = inputs.monitoring.nixosModule;
+        environment = inputs.environment.nixosModule;
+        ssh = inputs.ssh.nixosModule;
+
+        myuids = inputs.myuids.nixosModule;
+        secrets = inputs.secrets.nixosModule;
+        files-watcher = inputs.files-watcher.nixosModule;
+        loginctl-linger = inputs.loginctl-linger.nixosModule;
+      };
+      moduleArgs = {
+        nixpkgs = inputs.nixpkgs;
+        monitoring = inputs.monitoring;
+        environment = inputs.environment;
+        pkgs-no-overlay = inputs.nixpkgs.legacyPackages.x86_64-linux;
+      };
+    };
+}
diff --git a/systems/dilion/monitoring.nix b/systems/dilion/monitoring.nix
new file mode 100644 (file)
index 0000000..af7f224
--- /dev/null
@@ -0,0 +1,43 @@
+{ lib, pkgs, config, name, monitoring, ... }:
+let
+  hostFQDN = config.hostEnv.fqdn;
+  zfs_snapshot = name: {
+    service_description = "ZFS snapshot ${name} happened not too long ago";
+    use = "local-service";
+    check_command = ["check_zfs_snapshot" name];
+    __passive_servicegroups = "webstatus-resources";
+  };
+in
+{
+  config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "mdadm" "zfs" "notify-secondary"];
+  config.myServices.monitoring.objects = lib.mkMerge [
+    (monitoring.lib.objectsCommon {
+      inherit hostFQDN;
+      hostName = name;
+      master = false;
+      processWarn = "250"; processAlert = "400";
+      loadWarn = "1.0"; loadAlert = "1.2";
+      interface = builtins.head (builtins.attrNames config.networking.interfaces);
+    })
+
+    {
+      service = [
+        {
+          service_description = "No mdadm array is degraded";
+          use = "local-service";
+          check_command = ["check_mdadm"];
+          __passive_servicegroups = "webstatus-resources";
+        }
+        {
+          service_description = "No ZFS pool is degraded";
+          use = "local-service";
+          check_command = ["check_zfs"];
+          __passive_servicegroups = "webstatus-resources";
+        }
+        (zfs_snapshot "zpool/backup/eldiron/zpool/root")
+        (zfs_snapshot "zpool/backup/eldiron/zpool/root/etc")
+        (zfs_snapshot "zpool/backup/eldiron/zpool/root/var")
+      ];
+    }
+  ];
+}
diff --git a/systems/dilion/vms.nix b/systems/dilion/vms.nix
new file mode 100644 (file)
index 0000000..189e5ff
--- /dev/null
@@ -0,0 +1,200 @@
+# inspired from https://nixos.wiki/wiki/Virtualization_in_NixOS
+{ config, pkgs, lib, pkgs-no-overlay, ... }@args:
+let
+  toImage = f: "${import ./vms/base_image.nix f (args // { myEnv = config.myEnv; })}/nixos.qcow2";
+in
+{
+  options = {
+    myServices.vms.libvirt-guests = lib.mkOption {
+      type = lib.types.attrsOf (lib.types.submodule {
+        options = {
+          network = lib.mkOption { type = lib.types.str; description = "network to attach the guest to"; };
+          pool = lib.mkOption { type = lib.types.str; description = "pool to attach the guest to"; };
+          cpus = lib.mkOption { type = lib.types.int; default = 1; description = "number of cpus to assign"; };
+          memory = lib.mkOption { type = lib.types.int; description = "memory in GiB to assign"; };
+          diskSize = lib.mkOption { type = lib.types.int; description = "disk size in GiB"; };
+          destroyVolumeOnExit = lib.mkOption { type = lib.types.bool; description = "Whether to destroy the volume on exit"; default = false; };
+          extraDevicesXML = lib.mkOption { type = lib.types.lines; description = "Extra device configuration"; default = ""; };
+          preStart = lib.mkOption { type = lib.types.lines; default = ""; description = "Script to run as prestart"; };
+        };
+      });
+      default = {};
+      description = "Libvirt guests to start";
+    };
+    myServices.vms.libvirt-networks = lib.mkOption {
+      type = lib.types.attrsOf (lib.types.submodule {
+        options = {
+          bridgeNumber = lib.mkOption { type = lib.types.int; description = "bridge interface to create virbr<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;
+    }
+  ];
+}
similarity index 52%
rename from modules/private/system/dilion/vms/base_configuration.nix
rename to systems/dilion/vms/base_configuration.nix
index e2caba266c74f731fbeafd518ee87492e32ef34d..7b678866673bc5dda8968ac786ec008322fcd5ab 100644 (file)
@@ -1,12 +1,18 @@
-{ lib, config, ... }@args:
+{ lib, config, environment, ... }@args:
 {
 {
-  options.myEnv = (import ../../../environment.nix (args // { name = "dummy"; })).options.myEnv;
+  options.myEnv = (environment.nixosModule (args // { name = "dummy"; })).options.myEnv;
   config = {
   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 = {
     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;
         device = "/dev/vda";
       };
       timeout = 0;
similarity index 82%
rename from modules/private/system/dilion/vms/base_image.nix
rename to systems/dilion/vms/base_image.nix
index 8de85600dbddee6911c42be6a1009572139c4632..46b90eb7e2992b8ac2c6ff1942798847bd1029ac 100644 (file)
@@ -1,10 +1,14 @@
-configuration_file: { pkgs ? import <nixpkgs> {}, system ? builtins.currentSystem, myEnv, ... }:
+configuration_file: { pkgs, myEnv, nixpkgs, environment, pkgs-no-overlay, ... }:
 let
 let
-  config = (import <nixpkgs/nixos/lib/eval-config.nix> {
-    inherit system;
+  config = (import (nixpkgs + "/nixos/lib/eval-config.nix") {
+    inherit (pkgs) system;
     modules = [ {
     modules = [ {
+      _module.args.environment = environment;
       myEnv = myEnv;
       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.
 
       # We want our template image to be as small as possible, but the deployed image should be able to be
       # of any size. Hence we resize on the first boot.
@@ -22,7 +26,7 @@ let
       };
     } ];
   }).config;
       };
     } ];
   }).config;
-in pkgs.vmTools.runInLinuxVM (
+in pkgs-no-overlay.vmTools.runInLinuxVM (
   pkgs.runCommand "nixos-base-image"
     {
       memSize = 768;
   pkgs.runCommand "nixos-base-image"
     {
       memSize = 768;
@@ -30,13 +34,13 @@ in pkgs.vmTools.runInLinuxVM (
         ''
           mkdir $out
           diskImage=image.qcow2
         ''
           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...
           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 =
         '';
       buildInputs = [ pkgs.utillinux pkgs.perl pkgs.parted pkgs.e2fsprogs ];
       exportReferencesGraph =
similarity index 87%
rename from modules/private/system/dilion/vms/buildbot_configuration.nix
rename to systems/dilion/vms/buildbot_configuration.nix
index 05b02d42af499b0181555053651dbbded1e3dbf2..622f8ba0a815e3ae7991123342f00eb7524885a9 100644 (file)
@@ -1,9 +1,15 @@
 { pkgs, config, lib, ... }:
 {
   imports = [
 { pkgs, config, lib, ... }:
 {
   imports = [
-    <nixpkgs/nixos/modules/profiles/qemu-guest.nix>
     ./base_configuration.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" ''
   systemd.services.buildbot-worker.serviceConfig.ExecStartPre = let
     cfg = config.services.buildbot-worker;
     script = pkgs.writeScript "decode-dmi" ''
diff --git a/systems/eldiron/base.nix b/systems/eldiron/base.nix
new file mode 100644 (file)
index 0000000..cda518e
--- /dev/null
@@ -0,0 +1,371 @@
+{ config, pkgs, lib, php, name, secrets, ... }:
+{
+  # ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age
+  secrets.ageKeys = [ "age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj" ];
+  boot = {
+    kernelModules = [ "kvm-intel" ];
+    blacklistedKernelModules = [ "nvidiafb" ];
+    loader.timeout = 1;
+    loader.grub.devices = [ "/dev/sda" "/dev/sdc" ];
+    kernel.sysctl = {
+      # https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md
+      "net.ipv4.tcp_sack" = 0;
+    };
+    supportedFilesystems = [ "zfs" ];
+    kernelParams = ["zfs.zfs_arc_max=6442450944"];
+    kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
+    initrd.availableKernelModules = [ "ahci" "sd_mod" ];
+    initrd.secrets = {
+      "/boot/pass.key" = "/boot/pass.key";
+    };
+  };
+  services.udev.extraRules = ''
+    ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:56:a0:88", NAME="eth0"
+  '';
+  nix.settings.max-jobs = 8;
+  nixpkgs.config.permittedInsecurePackages = [
+    "python-2.7.18.6" # for nagios-cli
+    "nodejs-16.20.2" # for landing page building
+  ];
+
+  nixpkgs.overlays = [
+    php.overlays.php
+  ];
+  powerManagement.cpuFreqGovernor = "powersave";
+
+  security.acme.certs."${name}".postRun = builtins.concatStringsSep "\n" [
+    (lib.optionalString config.services.websites.env.production.enable "/run/current-system/sw/bin/machinectl shell httpd-production /usr/bin/env systemctl reload httpd.service")
+    (lib.optionalString config.services.websites.env.integration.enable "/run/current-system/sw/bin/machinectl shell httpd-integration /usr/bin/env systemctl reload httpd.service")
+  ];
+
+  fileSystems = {
+    # pools:
+    #     zpool: ashift=12
+    #     zfast: ashift=12
+    # zfs:
+    #     zpool/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy
+    #     zpool/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key
+    #     zpool/root/var: atime=on
+    #     zfast/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy
+    #     zfast/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key
+    #     zfast/root/etc: ø
+    #     zfast/root/nix: ø
+    #     zfast/root/tmp: async=disabled
+    #     zfast/root/var: atime=on
+    #     zfast/root/var/lib: ø
+    #     zfast/root/var/lib/mysql: logbias=throughput ; atime=off ; primarycache=metadata
+    #     zfast/root/var/lib/postgresql: recordsize=8K ; atime=off ; logbias=throughput
+    #     zfast/root/var/lib/postgresql/11.0: ø
+    #     zfast/root/var/lib/postgresql/11.0/pg_wal: ø
+    "/"     = { fsType = "zfs"; device = "zpool/root"; };
+    "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/e6bb18fb-ff56-4b5f-ae9f-e60d40dc0622"; };
+    "/etc"  = { fsType = "zfs"; device = "zpool/root/etc"; };
+    "/nix"  = { fsType = "zfs"; device = "zfast/root/nix"; };
+    "/tmp"  = { fsType = "zfs"; device = "zfast/root/tmp"; };
+    "/var"  = { fsType = "zfs"; device = "zpool/root/var"; };
+    "/var/lib/mysql" = { fsType = "zfs"; device = "zfast/root/var/lib/mysql"; };
+    "/var/lib/postgresql"             = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql"; };
+    "/var/lib/postgresql/11.0"        = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0"; };
+    "/var/lib/postgresql/11.0/pg_wal" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0/pg_wal"; };
+  };
+  swapDevices = [ { label = "swap1"; } { label = "swap2"; } ];
+  hardware.enableRedistributableFirmware = true;
+
+  services.zfs = {
+    autoScrub = {
+      enable = false;
+    };
+  };
+  networking = {
+    hostId = "8262ca33"; # generated with head -c4 /dev/urandom | od -A none -t x4
+    firewall.enable = true;
+    firewall.allowedTCPPorts = [ config.myEnv.ports.zrepl_flony ];
+    # FIXME: on next reboot, remove the /27 and the localCommands
+    interfaces."eth0".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
+      (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or []))
+      (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips))
+      ++ [ { address = lib.head config.hostEnv.ips.main.ip4; prefixLength = 27; } ];
+    interfaces."eth0".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
+      (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
+      config.hostEnv.ips);
+    defaultGateway = "176.9.151.65";
+    localCommands = ''
+      # FIXME: Those commands were added by nixops and may not be
+      # actually needed
+      ip -6 addr add '2a01:4f8:160:3445::/64' dev 'eth0' || true
+      ip -4 route change '176.9.151.64/27' via '176.9.151.65' dev 'eth0' || true
+      ip -6 route add default via 'fe80::1' dev eth0 || true
+    '';
+    nameservers = [
+      "213.133.98.98"
+      "213.133.99.99"
+      "213.133.100.100"
+      "2a01:4f8:0:a0a1::add:1010"
+      "2a01:4f8:0:a102::add:9999"
+      "2a01:4f8:0:a111::add:9898"
+    ];
+  };
+
+  imports = [
+    secrets.nixosModules.users-config-eldiron
+    ./databases
+    ./databases/mariadb.nix
+    ./databases/openldap
+    ./databases/postgresql.nix
+    ./databases/redis.nix
+
+
+    ./monitoring.nix
+    ./ejabberd
+    ./buildbot
+    ./coturn.nix
+    ./dns.nix
+    ./duply_backup.nix
+    ./gemini
+    ./gitolite
+    ./mail
+    ./websites
+    ./webstats
+    ./irc.nix
+    ./pub
+    ./tasks
+    ./ftp.nix
+    ./mpd.nix
+    ./vpn
+  ];
+
+  myServices.buildbot.enable = true;
+  myServices.databases.enable = true;
+  myServices.gitolite.enable = true;
+  myServices.monitoring.enable = true;
+  myServices.irc.enable = true;
+  myServices.pub.enable = true;
+  myServices.tasks.enable = true;
+  myServices.mpd.enable = true;
+  myServices.dns.enable = true;
+  myServices.websites.enable = true;
+  myServices.gemini.enable = true;
+  myServices.mail.enable = true;
+  myServices.ejabberd.enable = true;
+  myServices.vpn.enable = true;
+  myServices.ftp.enable = true;
+
+  myServices.chatonsProperties.hostings.infogerance = {
+    file.datetime = "2022-08-27T18:50:00";
+    hosting = {
+      name = "Infogérance";
+      description = "Administration de serveurs";
+      website = "https://www.immae.eu/";
+      logo = "https://assets.immae.eu/logo.jpg";
+      type = "HOSTEDSERVER";
+      status.level = "OK";
+      status.description = "OK";
+      registration.load = "OPEN";
+      install.type = "PACKAGE";
+    };
+  };
+
+  services.netdata.enable = true;
+  services.netdata.config.global."memory mode" = "none";
+  services.netdata.config.health."enabled" = "no";
+  services.netdata.config.web.mode = "none";
+  users.users."${config.services.netdata.user}".extraGroups = [ "keys" ];
+  services.netdata.configDir."stream.conf" = config.secrets.fullPaths."netdata-stream.conf";
+  secrets.keys = {
+    "ldap/pam_pgsql" = {
+      user = "root";
+      group = "root";
+      permissions = "0400";
+      text = ''
+        database = immae
+        user = immae_auth_read
+        password = {{ .postgresql.immae_auth_read }}
+        table = ldap_users
+        user_column = login
+        pw_type = function
+        auth_query = SELECT (mechanism = 'SSHA' AND password = encode(digest( %p || salt, 'sha1'), 'hex')) FROM ldap_users WHERE login = %u OR login || '@' || realm = %u
+        #pwd_query = WITH newsalt as (select gen_random_bytes(4)) UPDATE ldap_users SET password = encode(digest( %p || (SELECT * FROM newsalt), 'sha1'), 'hex'), salt = (SELECT * FROM newsalt), mechanism = 'SSHA' WHERE login = %u OR login || '@' || realm = %u
+      '';
+    };
+
+    "netdata-stream.conf" = {
+      user = config.services.netdata.user;
+      group = config.services.netdata.group;
+      permissions = "0400";
+      text = ''
+        [stream]
+            enabled = yes
+            destination = ${config.myEnv.monitoring.netdata_aggregator}
+            api key = ${config.myEnv.monitoring.netdata_keys.eldiron}
+      '';
+    };
+    "zrepl_backup/identity" = {
+      user = "root";
+      group = "root";
+      permissions = "0400";
+      text = config.myEnv.zrepl_backup.ssh_key.private;
+    };
+    "zrepl/${name}.key" = {
+      permissions = "0400";
+      text = config.myEnv.zrepl_backup.certs."${name}".key;
+      user = "root";
+      group = "root";
+    };
+  } // builtins.listToAttrs (map (x: lib.attrsets.nameValuePair "zrepl/certificates/${x}.crt" {
+    permissions = "0400";
+    text = config.myEnv.zrepl_backup.certs."${x}".certificate;
+    user = "root";
+    group = "root";
+  }) (builtins.attrNames config.myEnv.zrepl_backup.certs));
+
+  programs.ssh.knownHosts.dilion = {
+    extraHostNames = ["dilion.immae.eu"];
+    publicKey = config.myEnv.servers.dilion.hostKey;
+  };
+
+  services.cron = {
+    enable = true;
+    mailto = "cron@immae.eu";
+    systemCronJobs = [
+      ''
+        0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "immae.eu.*Recipient address rejected"
+        # Need a way to blacklist properly
+        # 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "NOQUEUE:"
+        0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtp -g "status=bounced"
+      ''
+    ];
+  };
+
+  environment.systemPackages = [ pkgs.bindfs ];
+
+  environment.etc."mdadm.conf" = {
+    enable = true;
+    mode = "0644";
+    user = "root";
+    text = "MAILADDR ${config.myEnv.monitoring.email}";
+  };
+
+  systemd.services.zrepl.path = [ pkgs.openssh ];
+  services.zrepl = {
+    enable = true;
+    settings = {
+      jobs = [
+        {
+          type = "push";
+          # must not change
+          name = "backup-to-dilion";
+          filesystems."zpool/root" = true;
+          filesystems."zpool/root/etc" = true;
+          filesystems."zpool/root/var<" = true;
+          connect = {
+            address = "dilion.immae.eu:19000";
+            type = "tls";
+            server_cn = "dilion";
+            ca = config.secrets.fullPaths."zrepl/certificates/dilion.crt";
+            cert = config.secrets.fullPaths."zrepl/certificates/eldiron.crt";
+            key = config.secrets.fullPaths."zrepl/eldiron.key";
+          };
+          snapshotting = {
+            type = "periodic";
+            prefix = "zrepl_";
+            interval = "1h";
+            # hooks = [
+            #   {
+            #     type = "mysql-lock-tables";
+            #     dsn = "${config.myEnv.zrepl_backup.mysql.user}:${config.myEnv.zrepl_backup.mysql.password}@tcp(localhost)/";
+            #     filesystems."zpool/root/var" = true;
+            #   }
+            #   {
+            #     type = "command";
+            #     path = pkgs.writeScript "redis-dump" ''
+            #       #!${pkgs.stdenv.shell}
+            #       ${pkgs.redis}/bin/redis-cli bgsave
+            #     '';
+            #     err_is_fatal = false;
+            #     filesystems."zpool/root/var" = true;
+            #   }
+            # ];
+          };
+          send.encrypted = true;
+          pruning.keep_sender = [
+            { type = "regex"; regex = "^manual_.*"; }
+            { type = "grid"; grid = "24x1h | 7x1d | 4x7d | 6x30d"; regex = "^zrepl_.*"; }
+          ];
+          pruning.keep_receiver = [
+            { type = "regex"; regex = "^manual_.*"; }
+            { type = "grid"; grid = "6x4h | 7x1d | 4x7d | 6x30d"; regex = "^zrepl_.*"; }
+          ];
+        }
+        {
+          type = "source";
+          # must not change
+          name = "backup-to-wd-zpool";
+          serve.type = "tls";
+          serve.listen = ":${builtins.toString config.myEnv.ports.zrepl_flony}";
+          serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt";
+          serve.cert = config.secrets.fullPaths."zrepl/certificates/eldiron.crt";
+          serve.key = config.secrets.fullPaths."zrepl/eldiron.key";
+          serve.client_cns = [ "flony" ];
+          filesystems."zpool/root" = true;
+          filesystems."zpool/root/etc" = true;
+          filesystems."zpool/root/var<" = true;
+          filesystems."zfast/root/var<" = true;
+          send.encrypted = true;
+          snapshotting.type = "manual";
+        }
+      ];
+    };
+  };
+
+  environment.etc."fail2ban/filter.d/postgresql.conf".text = ''
+    [Definition]
+    failregex = <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
+  '';
+}
similarity index 70%
rename from modules/private/buildbot/default.nix
rename to systems/eldiron/buildbot/default.nix
index ec28b632d799b7ad6822fafd89e54e8dfa36d15f..e86b081758c0a6ba91add4d0e5be917f72421109 100644 (file)
@@ -1,16 +1,7 @@
-{ lib, pkgs, config, ... }:
+{ lib, pkgs, config, buildbot, ... }:
 let
   varDir = "/var/lib/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 = {
 in
 {
   options = {
@@ -24,6 +15,80 @@ in
   };
 
   config = lib.mkIf config.myServices.buildbot.enable {
   };
 
   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;
 
     ids.uids.buildbot = config.myEnv.buildbot.user.uid;
     ids.gids.buildbot = config.myEnv.buildbot.user.gid;
 
@@ -34,7 +99,9 @@ in
       group = "buildbot";
       description = "Buildbot user";
       home = varDir;
       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
     };
 
     services.websites.env.tools.watchPaths = lib.attrsets.mapAttrsToList
@@ -96,12 +163,12 @@ in
               permissions = "0600";
               user = "buildbot";
               group = "buildbot";
               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 //
               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";
                     BUILDBOT_WORKER_PORT = builtins.toString project.workerPort;
                     BUILDBOT_HOST = config.hostEnv.fqdn;
                     BUILDBOT_VIRT_URL = "qemu+ssh://libvirt@dilion.immae.eu/system";
@@ -131,6 +198,16 @@ in
         group = "buildbot";
         text = config.myEnv.buildbot.ssh_key.private;
       };
         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}" {
     };
 
     services.filesWatcher = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
@@ -152,9 +229,9 @@ in
       description = "Buildbot Continuous Integration Server ${project.name}.";
       after = [ "network-online.target" ];
       wantedBy = [ "multi-user.target" ];
       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
       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
 
         tac_file = pkgs.writeText "buildbot.tac" ''
             import os
 
@@ -197,6 +274,7 @@ in
       ln -sf ${tac_file} ${varDir}/${project.name}/buildbot.tac
       # different buildbots may be trying that simultaneously, add the || true to avoid complaining in case of race
       install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ssh_key"} ${varDir}/buildbot_key || true
       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_secrets=${varDir}/${project.name}/secrets
       install -m 0700 -o buildbot -g buildbot -d $buildbot_secrets
       install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ldap"} $buildbot_secrets/ldap
@@ -207,23 +285,11 @@ in
       ${buildbot}/bin/buildbot upgrade-master ${varDir}/${project.name}
       '';
       environment = let
       ${buildbot}/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}";
         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 = {
       in { inherit PYTHONPATH HOME; };
 
       serviceConfig = {
diff --git a/systems/eldiron/coturn.nix b/systems/eldiron/coturn.nix
new file mode 100644 (file)
index 0000000..d8b02c5
--- /dev/null
@@ -0,0 +1,73 @@
+{ config, name, lib, pkgs, ... }:
+{
+  config = lib.mkIf (name == "eldiron") {
+    myServices.chatonsProperties.services.coturn = {
+      file.datetime = "2022-08-27T19:00:00";
+      service = {
+        name = "Coturn";
+        description = "coturn TURN server";
+        status.level = "OK";
+        status.description = "OK";
+        registration."" = ["MEMBER" "CLIENT"];
+        registration.load = "FULL";
+        install.type = "PACKAGE";
+      };
+      software = {
+        name = "coturn";
+        website = "https://github.com/coturn/coturn";
+        license.url = "https://github.com/coturn/coturn/blob/master/LICENSE";
+        license.name = "3-Clause BSD License";
+        version = pkgs.coturn.version;
+        source.url = "https://github.com/coturn/coturn";
+      };
+    };
+    networking.firewall.allowedTCPPorts = [
+      config.services.coturn.alt-listening-port
+      config.services.coturn.alt-tls-listening-port
+      config.services.coturn.listening-port
+      config.services.coturn.tls-listening-port
+    ];
+    networking.firewall.allowedTCPPortRanges = [
+      { from = config.services.coturn.min-port; to = config.services.coturn.max-port; }
+    ];
+    networking.firewall.allowedUDPPortRanges = [
+      { from = config.services.coturn.min-port; to = config.services.coturn.max-port; }
+    ];
+    networking.firewall.allowedUDPPorts = [
+      config.services.coturn.alt-listening-port
+      config.services.coturn.alt-tls-listening-port
+      config.services.coturn.listening-port
+      config.services.coturn.tls-listening-port
+    ];
+    #users.users.turnserver.extraGroups = [ "keys" ];
+    services.coturn = {
+      enable = true;
+      no-cli = true;
+      no-tls = true;
+      no-dtls = true;
+      use-auth-secret = true;
+      lt-cred-mech = true;
+      realm = "eldiron.immae.eu";
+      extraConfig = ''
+        fingerprint
+        total-quota=0
+        bps-capacity=0
+        stale-nonce
+        no-multicast-peers
+      '';
+      static-auth-secret = config.myEnv.coturn.auth_access_key;
+      #cert = "/var/lib/acme/eldiron/fullchain.pem";
+      #pkey = "/var/lib/acme/eldiron/key.pem";
+      listening-ips = [
+        "127.0.0.1"
+        "::1"
+      ] ++ config.myEnv.servers.eldiron.ips.main.ip4
+        ++ config.myEnv.servers.eldiron.ips.main.ip6;
+      relay-ips = [
+        "127.0.0.1"
+        "::1"
+      ] ++ config.myEnv.servers.eldiron.ips.main.ip4
+        ++ config.myEnv.servers.eldiron.ips.main.ip6;
+    };
+  };
+}
similarity index 82%
rename from modules/private/databases/default.nix
rename to systems/eldiron/databases/default.nix
index 1241658a18574846a057ca06b68d444a42db25f3..d8d3048787b64bd76d1551e07f7e16aaf876d58e 100644 (file)
@@ -1,16 +1,15 @@
-{ lib, config, nodes, ... }:
+{ lib, config, secrets, ... }:
 let
   cfg = config.myServices.databases;
 in
 {
   options.myServices = {
     databases.enable = lib.mkEnableOption "my databases service";
 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 {
   config.myServices.databases = lib.mkIf cfg.enable {
+
     mariadb = {
       enable = true;
       ldapConfig = {
     mariadb = {
       enable = true;
       ldapConfig = {
@@ -25,7 +24,7 @@ in
     };
 
     openldap = {
     };
 
     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;
       baseDn = config.myEnv.ldap.base;
       rootDn = config.myEnv.ldap.root_dn;
       rootPw = config.myEnv.ldap.root_pw;
@@ -45,7 +44,7 @@ in
       };
       replicationHosts = {
         backup-2 = {
       };
       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;
         };
       };
           ip6 = config.myEnv.servers.backup-2.ips.main.ip6;
         };
       };
similarity index 92%
rename from modules/private/databases/mariadb.nix
rename to systems/eldiron/databases/mariadb.nix
index 101eb3fb7c850157b9b31786199d4a4084543cb5..b4a6917a76018aaea2bc41ee5591bf4133b5ced4 100644 (file)
@@ -74,7 +74,7 @@ in {
   };
 
   config = lib.mkIf cfg.enable {
   };
 
   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.
 
     # for adminer, ssl is implemented with mysqli only, which is
     # currently disabled because it’s not compatible with pam.
@@ -96,6 +96,7 @@ in {
       dataDir = cfg.dataDir;
       settings = {
         mysqld = {
       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";
           ssl_ca = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";
           ssl_key = "${config.security.acme.certs.mysql.directory}/key.pem";
           ssl_cert = "${config.security.acme.certs.mysql.directory}/fullchain.pem";
@@ -107,13 +108,18 @@ in {
           # this introduces a small delay before storing on disk, but
           # makes it order of magnitudes quicker
           innodb_flush_log_at_trx_commit = "0";
           # this 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" ];
         };
       };
     };
 
     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 = ''
       group = "mysql";
       domain = "db-1.immae.eu";
       postRun = ''
diff --git a/systems/eldiron/databases/openldap/default.nix b/systems/eldiron/databases/openldap/default.nix
new file mode 100644 (file)
index 0000000..7cd15da
--- /dev/null
@@ -0,0 +1,304 @@
+{ lib, pkgs, config, openldap, ... }:
+let
+  cfg = config.myServices.databases.openldap;
+in
+{
+  options.myServices.databases = {
+    openldap = {
+      enable = lib.mkOption {
+        default = false;
+        example = true;
+        description = "Whether to enable ldap";
+        type = lib.types.bool;
+      };
+      baseDn = lib.mkOption {
+        type = lib.types.str;
+        description = ''
+          Base DN for LDAP
+        '';
+      };
+      rootDn = lib.mkOption {
+        type = lib.types.str;
+        description = ''
+          Root DN
+        '';
+      };
+      rootPw = lib.mkOption {
+        type = lib.types.str;
+        description = ''
+          Root (Hashed) password
+        '';
+      };
+      accessFile = lib.mkOption {
+        type = lib.types.path;
+        description = ''
+          The file path that defines the access
+        '';
+      };
+      dataDir = lib.mkOption {
+        type = lib.types.path;
+        default = "/var/lib/openldap/mdb";
+        description = ''
+          The directory where Openldap stores its data.
+        '';
+      };
+      socketsDir = lib.mkOption {
+        type = lib.types.path;
+        default = "/run/openldap";
+        description = ''
+          The directory where Openldap puts sockets and pid files.
+          '';
+      };
+      # Output variables
+      pids = lib.mkOption {
+        type = lib.types.attrsOf lib.types.path;
+        default = {
+          pid  = "${cfg.socketsDir}/slapd.pid";
+          args = "${cfg.socketsDir}/slapd.args";
+        };
+        readOnly = true;
+        description = ''
+          Slapd pid files
+          '';
+      };
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    myServices.dns.zones."immae.eu".subdomains.ldap =
+      with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
+
+    nixpkgs.overlays = [
+      (self: super: {
+        openldap_libressl_cyrus = (self.openldap.override {
+          openssl = self.libressl;
+          cyrus_sasl = self.cyrus_sasl.overrideAttrs (old: {
+            configureFlags = old.configureFlags ++ [ "--with-configdir=/etc/sasl2" ];
+          });
+        }).overrideAttrs (old: {
+          configureFlags = old.configureFlags ++ [ "--with-cyrus-sasl" "--enable-spasswd" ];
+        });
+      })
+    ];
+
+    secrets.keys = {
+       "ldap/password" = {
+        permissions = "0400";
+        user = "openldap";
+        group = "openldap";
+        text = "${cfg.rootPw}";
+      };
+      "ldap/access" = {
+        permissions = "0400";
+        user = "openldap";
+        group = "openldap";
+        text = builtins.readFile cfg.accessFile;
+      };
+      "ldap" = {
+        permissions = "0500";
+        user = "openldap";
+        group = "openldap";
+        isDir = true;
+      };
+    };
+    users.users.openldap.extraGroups = [ "keys" ];
+    networking.firewall.allowedTCPPorts = [ 636 389 ];
+
+    security.acme.certs."ldap" = {
+      group = "openldap";
+      domain = "ldap.immae.eu";
+      postRun = ''
+        systemctl restart openldap.service
+      '';
+    };
+
+    services.filesWatcher.openldap = {
+      restart = true;
+      paths = [ config.secrets.fullPaths."ldap" ];
+    };
+
+    services.openldap = {
+      enable = true;
+      urlList = [ "ldap://" "ldaps://" ];
+      package = pkgs.openldap_libressl_cyrus;
+      settings = {
+        attrs = {
+          olcPidFile = cfg.pids.pid;
+          olcArgsFile = cfg.pids.args;
+          olcLogLevel = "none";
+          olcTLSCertificateFile = "${config.security.acme.certs.ldap.directory}/cert.pem";
+          olcTLSCertificateKeyFile = "${config.security.acme.certs.ldap.directory}/key.pem";
+          olcTLSCACertificateFile = "${config.security.acme.certs.ldap.directory}/fullchain.pem";
+          olcTLSCACertificatePath = "${pkgs.cacert.unbundled}/etc/ssl/certs/";
+          # This makes openldap crash
+          # olcTLSCipherSuite = "DEFAULT";
+          #olcSaslHost = "kerberos.immae.eu";
+          # Map sasl "dn" to ldap dn
+          #olcAuthzRegexp = ''{0}"uid=([^,]*)(,cn=IMMAE.EU)?,cn=(gssapi|gss-spnego),cn=auth" "uid=$1,ou=users,dc=immae,dc=eu"'';
+        };
+        children = {
+          "cn=module{0}" = {
+            attrs = {
+              cn = "module{0}";
+              objectClass = [ "olcModuleList" ];
+              olcModuleLoad = [ "{0}back_mdb" "{1}memberof" "{2}syncprov" ];
+            };
+          };
+          "cn=schema".includes = map (schema:
+            "${config.services.openldap.package}/etc/schema/${schema}.ldif"
+            ) [ "core" "cosine" "inetorgperson" "nis" ] ++ [
+              "${openldap.immae-ldif}"
+            ];
+          "olcDatabase={0}config" = {
+            attrs = {
+              objectClass = "olcDatabaseConfig";
+              olcDatabase = "{0}config";
+              olcAccess = ["{0}to *  by * none"];
+            };
+          };
+          "olcDatabase={1}mdb" = {
+            attrs = {
+              objectClass = [ "olcDatabaseConfig" "olcMdbConfig" ];
+              olcDatabase = "{1}mdb";
+              olcDbIndex = [
+                "objectClass      eq"
+                "uid              pres,eq"
+                "mail             pres,eq,sub"
+                "cn               pres,eq,sub"
+                "sn               pres,eq,sub"
+                "dc               eq"
+                "member           eq"
+                "memberOf         eq"
+              ];
+              olcAccess = let
+                join = builtins.replaceStrings ["\n"] [" "];
+              in [
+                # First matching "to" + "by" wins
+                #### Replication needs full access
+                (join ''{0}to *
+                  by dn.base="uid=ldap_replication,cn=ldap,ou=services,dc=immae,dc=eu" read
+                  by * break
+                '')
+                #### Prevent modification of SASL passwords
+                (join ''{1}to attrs=userPassword val.regex="^.SASL..+"
+                  by self read
+                  by anonymous auth
+                  by * none
+                '')
+                #### Oneself needs access to users password
+                (join ''{2}to attrs=userPassword,shadowLastChange
+                  by self write
+                  by anonymous auth
+                  by * none
+                '')
+                #### Should be write, but disabled during migration to psql
+                (join ''{3}to attrs=immaeSshKey
+                  by self read
+                  by * break
+                '')
+
+                #### Anyone can auth, and I can see myself
+                (join ''{4}to *
+                  by self read
+                  by anonymous auth
+                  by * break
+                '')
+
+                #### Specific access for phpldapadmin
+                (join ''{5}to filter="(uid=*)"  attrs=entry,uid
+                  by dn.base="cn=phpldapadmin,ou=services,dc=immae,dc=eu" read
+                  by * break
+                '')
+
+                #### Hosts
+                # The attributes are available to every host
+                (join ''{6}to dn.one="ou=hosts,dc=immae,dc=eu"
+                  by dn.subtree="ou=hosts,dc=immae,dc=eu" read
+                  by dn.base="dc=immae,dc=eu" search
+                  by * break
+                '')
+                #### /Hosts
+
+                #### Local services
+                # this/-* & user : all your ancestors have access to you
+                # this/memberOf/-* & user : all those whom you belong to (in a group),
+                #                           and their ancestors, have access to you
+                # user/immaeAccessWriteDn*/member & this : you have write access to the
+                #                                          members of your immaeAccessDn
+                #                                          attributes
+                # user/immaeAccessDn*/member & this : you have access to the members
+                #                                        of your immaeAccessDn attributes
+                # user/immaeAccessReadSubtree* & this/-* : you have access to the
+                #                                         childrens of your immaeAccessReadSubtree
+                #                                         attributes
+                # this/memberOf/-* & user/immaeAccessReadSubtree*: you have access to
+                #                                                  the members of the childrens of your 
+                #                                                  immaeAccessReadSubtree attributes
+                # http://www.openldap.org/faq/data/cache/1133.html
+                (join ''{7}to dn.subtree="dc=immae,dc=eu"
+                  by dn.subtree="ou=external_services,dc=immae,dc=eu" break
+                  by set.exact="this/-* & user" read
+                  by set.exact="this/memberOf/-* & user" read
+                  by set.exact="user/immaeAccessWriteDn*/member & this" write
+                  by set.exact="user/immaeAccessDn*/member & this" read
+                  by set.exact="user/immaeAccessReadSubtree* & this/-*" read
+                  by set.exact="this/memberOf/-* & user/immaeAccessReadSubtree*" read
+                  by users search
+                  by * break
+                '')
+                #### /Local services
+
+                #### External services
+                # http://www.openldap.org/faq/data/cache/429.html
+                # FIXME: Find a way to whitelist?
+                (join ''{8}to attrs=immaeSshKey
+                  by dn.subtree="ou=external_services,dc=immae,dc=eu" none
+                '')
+                (join ''{9}to dn.subtree="dc=immae,dc=eu"
+                  by set.exact="this/-* & user" read
+                  by set.exact="this/memberOf/-* & user" read
+                  by set.exact="user/immaeAccessDn*/member & this/-*" read
+                  by users search
+                  by * none
+                '')
+                  #### /External services
+              ];
+              olcDbDirectory = cfg.dataDir;
+              olcRootDN = cfg.rootDn;
+              olcRootPW.path = config.secrets.fullPaths."ldap/password";
+              olcSuffix = cfg.baseDn;
+            };
+            children = {
+              "olcOverlay={0}memberof" = {
+                attrs = {
+                  objectClass = [ "olcOverlayConfig" "olcMemberOf" ];
+                  olcOverlay = "{0}memberof";
+                };
+              };
+              "olcOverlay={1}syncprov" = {
+                attrs = {
+                  objectClass = [ "olcOverlayConfig" "olcSyncProvConfig" ];
+                  olcOverlay = "{1}syncprov";
+                  olcSpCheckpoint = "100 10";
+                };
+              };
+            };
+          };
+        };
+      };
+    };
+    myServices.monitoring.fromMasterActivatedPlugins = [ "tcp" ];
+    myServices.monitoring.fromMasterObjects.service = [
+      {
+        service_description = "ldap SSL is up to date";
+        host_name = config.hostEnv.fqdn;
+        use = "external-service";
+        check_command = ["check_tcp_ssl" "636"];
+
+        servicegroups = "webstatus-ssl";
+        _webstatus_name = "LDAP";
+        _webstatus_url = "ldap.immae.eu";
+      }
+    ];
+  };
+}
similarity index 81%
rename from modules/private/databases/postgresql.nix
rename to systems/eldiron/databases/postgresql.nix
index a6c4cc998fdb138ccf53671992a916794b6eff95..721059a702097e70913b373810e36067cd5887d8 100644 (file)
@@ -97,8 +97,7 @@ in {
   config = lib.mkIf cfg.enable {
     networking.firewall.allowedTCPPorts = [ 5432 ];
 
   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 = ''
       group = "postgres";
       domain = "db-1.immae.eu";
       postRun = ''
@@ -108,10 +107,17 @@ in {
 
     systemd.services.postgresql.serviceConfig = {
       SupplementaryGroups = "keys";
 
     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
     };
     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}'" \
 
       ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (role: _: ''
         $PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='${role}'" \
@@ -134,32 +140,34 @@ in {
       enable = true;
       package = cfg.package;
       enableTCPIP = true;
       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
         # 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:
       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
         ));
             ++ map (ip4: "hostssl      ${v.database}   ${v.username}   ${ip4}/32               ${v.method}") v.ip4
           ) vs) cfg.authorizedHosts
         ));
similarity index 56%
rename from modules/private/databases/redis.nix
rename to systems/eldiron/databases/redis.nix
index 685fa464cf60efdb7f7ef64a1e9008c4590cd769..1f57aa98cd2c99121a10887ec97f9ca8a2fefd69 100644 (file)
@@ -32,16 +32,21 @@ in {
   config = lib.mkIf cfg.enable {
     users.users.redis.uid = config.ids.uids.redis;
     users.groups.redis.gid = config.ids.gids.redis;
   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;
       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.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;
 
     services.spiped = {
       enable = true;
@@ -68,38 +73,38 @@ in {
       script = "exec ${pkgs.spiped}/bin/spiped -F `cat /etc/spiped/redis.spec`";
     };
 
       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 = {
     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";
       "redis/spiped_keyfile" = {
         user = "spiped";
         group = "spiped";
@@ -112,22 +117,22 @@ in {
       description = "Redis slice";
     };
 
       description = "Redis slice";
     };
 
-    systemd.services.predixy = {
-      description = "Redis proxy";
-      wantedBy = [ "multi-user.target" ];
-      after = [ "redis.service" ];
+    #systemd.services.predixy = {
+    #  description = "Redis proxy";
+    #  wantedBy = [ "multi-user.target" ];
+    #  after = [ "redis.service" ];
 
 
-      serviceConfig = {
-        Slice = "redis.slice";
-        User = "redis";
-        Group = "redis";
-        SupplementaryGroups = "keys";
-        Type = "simple";
+    #  serviceConfig = {
+    #    Slice = "redis.slice";
+    #    User = "redis";
+    #    Group = "redis";
+    #    SupplementaryGroups = "keys";
+    #    Type = "simple";
 
 
-        ExecStart = "${pkgs.predixy}/bin/predixy ${config.secrets.fullPaths."redis/predixy.conf"}";
-      };
+    #    ExecStart = "${pkgs.predixy}/bin/predixy ${config.secrets.fullPaths."redis/predixy.conf"}";
+    #  };
 
 
-    };
+    #};
   };
 }
 
   };
 }
 
diff --git a/systems/eldiron/dns.nix b/systems/eldiron/dns.nix
new file mode 100644 (file)
index 0000000..486fcc1
--- /dev/null
@@ -0,0 +1,290 @@
+{ lib, pkgs, config, dns-nix, ... }:
+{
+  options.myServices.dns = {
+    enable = lib.mkEnableOption "enable DNS resolver";
+    helpers = lib.mkOption {
+      readOnly = true;
+      description = ''
+        Some useful constants or functions for zones definition
+      '';
+      default = rec {
+        servers = config.myEnv.servers;
+        ips = i: { A = i.ip4; AAAA = i.ip6; };
+        letsencrypt = [ { tag = "issue"; value = "letsencrypt.org"; issuerCritical = false; } ];
+        toKV = a: builtins.concatStringsSep ";" (builtins.attrValues (builtins.mapAttrs (n: v: "${n}=${v}") a));
+        mailMX = {
+          hasEmail = true;
+          subdomains = let
+            mxes = lib.filterAttrs (n: v: v ? mx && v.mx.enable) servers;
+          in
+            lib.mapAttrs' (n: v: lib.nameValuePair v.mx.subdomain (ips v.ips.main)) mxes;
+        };
+        zoneHeader = {
+          TTL = 3*60*60;
+          SOA = {
+            # yyyymmdd?? (increment ?? at each change)
+            serial = 2022121902; # Don't change this value, it is replaced automatically!
+            refresh = 10800;
+            retry = 3600;
+            expire = 604800;
+            minimum = 10800; # negative cache ttl
+            adminEmail = "hostmaster@immae.eu"; #email-address s/@/./
+            nameServer = "ns1.immae.eu.";
+          };
+        };
+        mailSend = {
+          # DKIM
+          subdomains._domainkey.subdomains.eldiron.TXT = [
+            (toKV config.myEnv.mail.dkim.eldiron.public)
+          ];
+          # old key, may still be used by verifiers
+          subdomains._domainkey.subdomains.immae_eu.TXT = [
+            (toKV config.myEnv.mail.dkim.immae_eu.public)
+          ];
+        };
+        mailCommon = name: {
+          MX = let
+            mxes = lib.filterAttrs (n: v: v ? mx && v.mx.enable) servers;
+          in
+            lib.mapAttrsToList (n: v: { preference = v.mx.priority; exchange = "${v.mx.subdomain}.${name}."; }) mxes;
+
+          # https://tools.ietf.org/html/rfc6186
+          SRV = [
+            { service = "submission"; proto = "tcp"; priority = 0; weight = 1; port = 587; target = "smtp.immae.eu."; }
+            { service = "submissions"; proto = "tcp"; priority = 0; weight = 1; port = 465; target = "smtp.immae.eu."; }
+
+            { service = "imap"; proto = "tcp"; priority = 0; weight = 1; port = 143; target = "imap.immae.eu."; }
+            { service = "imaps"; proto = "tcp"; priority = 0; weight = 1; port = 993; target = "imap.immae.eu."; }
+            { service = "sieve"; proto = "tcp"; priority = 0; weight = 1; port = 4190; target = "imap.immae.eu."; }
+
+            { service = "pop3"; proto = "tcp"; priority = 10; weight = 1; port = 110; target = "pop3.immae.eu."; }
+            { service = "pop3s"; proto = "tcp"; priority = 10; weight = 1; port = 995; target = "pop3.immae.eu."; }
+          ];
+
+          subdomains = {
+            # MTA-STS
+            # https://blog.delouw.ch/2018/12/16/using-mta-sts-to-enhance-email-transport-security-and-privacy/
+            # https://support.google.com/a/answer/9261504
+            _mta-sts.TXT = [ (toKV { v = "STSv1"; id = "20200109150200Z"; }) ]; # Don't change this value, it is updated automatically!
+            _tls.subdomains._smtp.TXT = [ (toKV { v = "TLSRPTv1"; "rua" = "mailto:postmaster+mta-sts@immae.eu"; }) ];
+            mta-sts = ips servers.eldiron.ips.main;
+
+            # DMARC
+            _dmarc.TXT = [ (toKV { v = "DMARC1"; p = "none"; adkim = "r"; aspf = "r"; fo = "1"; rua = "mailto:postmaster+rua@immae.eu"; ruf = "mailto:postmaster+ruf@immae.eu"; }) ];
+          };
+
+          # SPF
+          TXT = [ (toKV { v = "spf1 mx ~all"; }) ];
+        };
+      };
+    };
+    zones = lib.mkOption {
+      type = lib.types.attrsOf (dns-nix.lib.types.zone.substSubModules (
+        dns-nix.lib.types.zone.getSubModules ++ [
+          ({ name, ... }: {
+            options = {
+              hasEmail = lib.mkEnableOption "This domain has e-mails configuration";
+              emailPolicies = lib.mkOption {
+                default = {};
+                type = lib.types.attrsOf (lib.types.submodule {
+                  options = {
+                    receive = lib.mkEnableOption "Configure this domain to receive e-mail";
+                  };
+                });
+                apply = builtins.mapAttrs (n: v: v // {
+                  domain = name;
+                  fqdn = if n == "" then name else "${n}.${name}";
+                });
+              };
+              extraConfig = lib.mkOption {
+                type = lib.types.lines;
+                description = "Extra zone configuration for bind";
+                example = ''
+                  notify yes;
+                '';
+                default = "";
+              };
+              slaves = lib.mkOption {
+                type = lib.types.listOf lib.types.str;
+                description = "NS slave groups of this zone";
+                default = [];
+              };
+              ns = lib.mkOption {
+                type = lib.types.listOf lib.types.str;
+                default = [];
+              };
+            };
+          })
+        ]));
+      apply = let
+          toNS = n: builtins.map (d: "${d}.") (builtins.concatMap (s: builtins.attrNames config.myEnv.dns.ns."${s}") n);
+        in
+          builtins.mapAttrs (n: v: v // { NS = v.NS or [] ++ toNS (v.ns); });
+      default = {};
+      description = ''
+        attrset of zones to configure
+      '';
+    };
+  };
+  config = let
+    cfg = config.services.bind;
+  in lib.mkIf config.myServices.dns.enable {
+    myServices.chatonsProperties.hostings.dns-secondaire = {
+      file.datetime = "2022-08-22T02:00:00";
+      hosting = {
+        name = "DNS secondaire";
+        description = "DNS secondaire";
+        website = "ns1.immae.eu";
+        status.level = "OK";
+        status.description = "OK";
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+      software = {
+        name = "bind9";
+        website = pkgs.bind.meta.homepage;
+        license.url = pkgs.bind.meta.license.url;
+        license.name = pkgs.bind.meta.license.fullName;
+        version = pkgs.bind.version;
+        source.url = "https://www.isc.org/download/";
+      };
+    };
+    myServices.dns.zones = with config.myServices.dns.helpers; {
+      "imsite.eu" = lib.mkMerge [
+        zoneHeader
+        (ips servers.eldiron.ips.main)
+        {
+          ns = [ "immae" ];
+          CAA = letsencrypt;
+        }
+      ];
+      "immae.dev" = lib.mkMerge [
+        {
+          extraConfig = ''
+            notify yes;
+          '';
+          slaves = [ "raito" ];
+        }
+        zoneHeader
+        (ips servers.eldiron.ips.integration)
+        {
+          ns = [ "immae" "raito" ];
+          CAA = letsencrypt;
+        }
+      ];
+      "immae.eu" = lib.mkMerge [
+        {
+          extraConfig = ''
+            notify yes;
+          '';
+          slaves = [ "raito" ];
+        }
+        zoneHeader
+        (ips servers.eldiron.ips.production)
+        {
+          ns = [ "immae" "raito" ];
+          CAA = letsencrypt;
+
+          # ns1 has glue records in gandi.net
+          subdomains.ns1 = ips servers.eldiron.ips.main;
+          # raito / kurisu.dual.lahfa.xyz ; replace with eldiron in case of problem
+          subdomains.ns2.A = builtins.map (address: { inherit address; ttl = 600; }) servers.eldiron.ips.main.ip4;
+          subdomains.ns2.AAAA = builtins.map (address: { inherit address; ttl = 600; }) servers.eldiron.ips.main.ip6;
+        }
+        {
+          # Machines local users
+          emailPolicies.localhost.receive = false;
+          subdomains.localhost = lib.mkMerge [ (mailCommon "immae.eu") mailSend ];
+          emailPolicies.eldiron.receive = true;
+          subdomains.eldiron = lib.mkMerge [ (mailCommon "immae.eu") mailSend ];
+        }
+        {
+          # For each server "server" and each server ip group "ipgroup",
+          # define ipgroup.server.immae.eu
+          # "main" is set as server.immae.eu instead
+          # if main has an "alias", it is duplicated with this alias.
+          # If the server is a vm, use the v.immae.eu namespace (only main is created)
+          subdomains = let
+            vms = lib.filterAttrs (n: v: v.isVm) servers;
+            bms = lib.filterAttrs (n: v: !v.isVm) servers;
+            toIps = type: builtins.mapAttrs (n: v: ips v.ips."${type}");
+          in
+            lib.mkMerge [
+              (toIps "main" bms)
+
+              { v.subdomains = toIps "main" vms; }
+
+              (lib.mapAttrs (_: v: {
+                subdomains = lib.mapAttrs'
+                  (n': v': lib.nameValuePair "${if v'.alias == null then n' else v'.alias}" (ips v'))
+                  (lib.filterAttrs (n': v': n' != "main" || v'.alias != null) v.ips);
+                }) bms)
+            ];
+        }
+        {
+          # Outils
+          subdomains = {
+            status = ips servers.monitoring-1.ips.main;
+          };
+        }
+      ];
+    };
+    networking.firewall.allowedUDPPorts = [ 53 ];
+    networking.firewall.allowedTCPPorts = [ 53 ];
+    users.users.named.extraGroups = [ "keys" ];
+    services.bind = {
+      enable = true;
+      cacheNetworks = ["any"];
+      extraOptions = ''
+        allow-recursion { 127.0.0.1; };
+        allow-transfer  { none; };
+
+        notify-source    ${lib.head config.myEnv.servers.eldiron.ips.main.ip4};
+        notify-source-v6 ${lib.head config.myEnv.servers.eldiron.ips.main.ip6};
+        version   none;
+        hostname  none;
+        server-id none;
+        '';
+      zones =
+        builtins.mapAttrs (name: v: {
+          master = true;
+          extraConfig = v.extraConfig;
+          masters = [];
+          slaves =
+            lib.flatten (map (n: builtins.attrValues config.myEnv.dns.ns.${n}) v.slaves);
+          file = pkgs.runCommand "${name}.zone" {
+            text = v;
+            passAsFile = [ "text" ];
+            # Automatically change the increment when relevant change
+            # happened (both serial and mta-sts)
+          } ''
+            mv "$textPath" $out
+            increment=$(( 100*($(date -u +%-H) * 60 + $(date -u +%-M))/1440 ))
+            sed -i -e "s/2022121902/$(date -u +%Y%m%d)$increment/g" $out
+            sed -i -e "s/20200109150200Z/$(date -u +%Y%m%d%H%M%SZ)/g" $out
+          '';
+        }) config.myServices.dns.zones;
+    };
+    myServices.monitoring.fromMasterActivatedPlugins = [ "dns" ];
+    myServices.monitoring.fromMasterObjects.service = lib.mkMerge (lib.mapAttrsToList (name: z:
+      lib.optional (builtins.elem "immae" z.ns) {
+        service_description = "eldiron dns is active and authoritative for ${name}";
+        host_name = config.hostEnv.fqdn;
+        use = "dns-service";
+        check_command = ["check_dns" name "-A"];
+
+        servicegroups = "webstatus-dns";
+        _webstatus_name = name;
+      } ++
+      lib.optional (builtins.elem "raito" z.ns) {
+        service_description = "raito dns is active and authoritative for ${name}";
+        host_name = config.hostEnv.fqdn;
+        use = "dns-service";
+        check_command = ["check_external_dns" "kurisu.dual.lahfa.xyz" name "-A"];
+
+        servicegroups = "webstatus-dns";
+        _webstatus_name = "${name} (Secondary DNS Raito)";
+      }
+    ) config.myServices.dns.zones);
+  };
+}
similarity index 83%
rename from modules/duply_backup/default.nix
rename to systems/eldiron/duply_backup.nix
index 846b1d472a6c0fc8ca9c7c31034c0f77e2c28875..590d12502b0f587e731612c41dccda9d782ec1bb 100644 (file)
@@ -120,5 +120,32 @@ in
         sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh";
       })
     ];
         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";
+      }
+    ];
   };
 }
   };
 }
similarity index 54%
rename from modules/private/ejabberd/default.nix
rename to systems/eldiron/ejabberd/default.nix
index 4d86a648ada0d460d4e56670d1bd8ef3aaac3904..5268516104fd5dc0d2e2384abd3818de1a2a80e5 100644 (file)
@@ -1,4 +1,4 @@
-{ lib, pkgs, config, ... }:
+{ lib, pkgs, config, mypackages-lib, ... }:
 let
   cfg = config.myServices.ejabberd;
 in
 let
   cfg = config.myServices.ejabberd;
 in
@@ -14,22 +14,44 @@ in
   };
 
   config = lib.mkIf cfg.enable {
   };
 
   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 = {
     security.acme.certs = {
-      "ejabberd" = config.myServices.certificates.certConfig // {
-        user = "ejabberd";
+      "ejabberd" = {
         group = "ejabberd";
         domain = "eldiron.immae.eu";
         keyType = "rsa4096";
         postRun = ''
           systemctl restart ejabberd.service
           '';
         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 ];
       };
     };
     networking.firewall.allowedTCPPorts = [ 5222 5269 ];
@@ -88,5 +110,32 @@ in
         substituteAll ${./ejabberd.yml} $out
         '';
     };
         substituteAll ${./ejabberd.yml} $out
         '';
     };
+    secrets.keys."postfix/scripts/ejabberd-env" = {
+      user = "postfixscripts";
+      group = "root";
+      permissions = "0400";
+      text = builtins.toJSON {
+        jid = "notify_bot@immae.fr";
+        password = "{{ .xmpp.notify_bot }}";
+      };
+    };
+    services.postfix.extraAliases = let
+      nixpkgs = builtins.fetchTarball {
+        url = "https://github.com/NixOS/nixpkgs/archive/840c782d507d60aaa49aa9e3f6d0b0e780912742.tar.gz";
+        sha256 = "14q3kvnmgz19pgwyq52gxx0cs90ddf24pnplmq33pdddbb6c51zn";
+      };
+      pkgs' = import nixpkgs { inherit (pkgs) system; overlays = []; };
+      warn_xmpp_email = scriptEnv: pkgs'.runCommand "warn_xmpp_email" {
+        inherit scriptEnv;
+        pythonEnv = pkgs'.python3.withPackages (ps: [
+          ps.unidecode ps.slixmpp
+        ]);
+      } ''
+        substituteAll ${./warn_xmpp_email.py} $out
+        chmod a+x $out
+      '';
+    in ''
+      ejabberd: "|${mypackages-lib.postfixScript pkgs "ejabberd" (warn_xmpp_email config.secrets.fullPaths."postfix/scripts/ejabberd-env")}"
+    '';
   };
 }
   };
 }
diff --git a/systems/eldiron/ejabberd/warn_xmpp_email.py b/systems/eldiron/ejabberd/warn_xmpp_email.py
new file mode 100755 (executable)
index 0000000..d482b43
--- /dev/null
@@ -0,0 +1,112 @@
+#!@pythonEnv@/bin/python3
+
+import sys
+import json
+import slixmpp
+import asyncio
+import logging
+import io
+
+CONFIG = json.load(open("@scriptEnv@", "r"))
+
+def sanitize(string):
+    import re
+    from unidecode import unidecode
+    return re.compile(r"[^-.A-Za-z0-9_]").sub("_", unidecode(string))
+
+def parse_email():
+    import email
+    from email.header import decode_header
+
+    mail = email.message_from_file(sys.stdin)
+    try:
+        d = decode_header(mail["subject"])[0]
+        if d[1] is not None:
+            subject = d[0].decode(d[1])
+        else:
+            subject = d[0]
+    except Exception as e:
+        subject = mail["subject"]
+    sender = mail["from"]
+    recipient = mail["X-Original-To"]
+
+    body = ""
+    html = None
+    files = {}
+    for part in mail.walk():
+        if part.get_content_type() == "text/plain":
+            body += "\n-------------------\n"
+            try:
+                body += part.get_payload(decode=True).decode(encoding=part.get_content_charset() or "utf-8")
+            except Exception as e:
+                body += part.get_payload(decode=False)
+        elif part.get_content_type() == "text/html":
+            html = part.get_payload(decode=True)
+        elif part.get_content_type() != "text/html" and\
+                part.get_content_maintype() != "multipart":
+
+            filename = part.get_filename() or "{}.dat".format(part["Content-ID"])
+            files[sanitize(filename)] = (part.get_content_type(), part.get_payload(decode=True))
+
+    return [body, html, subject, sender, recipient, files]
+
+[body, html, subject, sender, recipient, files] = parse_email()
+
+class Bot(slixmpp.ClientXMPP):
+    def __init__(self, jid, password, body, html, subject, sender, recipient, files):
+        super().__init__(jid, password)
+
+        self.got_error = False
+        self.body = body
+        self.html = html
+        self.subject = subject
+        self.sender = sender
+        self.recipient = recipient
+        self.files = files
+        self.register_plugin('xep_0363')
+        self.add_event_handler("session_start", self.session_start)
+        self.add_event_handler("message", self.message)
+
+    @asyncio.coroutine
+    def session_start(self, event):
+        files = []
+        if self.html is not None:
+            url = yield from self['xep_0363'].upload_file(
+                    "mail.html",
+                    content_type="text/html",
+                    input_file=io.BytesIO(self.html))
+            files.append(("HTML version", url))
+        for f in self.files:
+            url = yield from self['xep_0363'].upload_file(
+                    f,
+                    content_type=self.files[f][0],
+                    input_file=io.BytesIO(self.files[f][1])
+                    )
+            files.append((f, url))
+
+        text = """
+New e-mail message from {sender}
+Subject: {subject}
+{body}
+""".format(sender=self.sender, subject=self.subject, body=self.body)
+        if len(files) > 0:
+            text += "\n\nAttachments:"
+        for f in files:
+            text += "\n{}: {}".format(f[0], f[1])
+        self.send_message(mto=self.recipient, mbody=text, msubject=self.subject, mtype='message')
+        yield from asyncio.sleep(5)
+        self.disconnect()
+
+    @asyncio.coroutine
+    def message(self, msg):
+        if msg["type"] == "error":
+            self.got_error = True
+
+logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s %(message)s')
+xmpp = Bot(CONFIG["jid"], CONFIG["password"], body, html, subject, sender, recipient, files)
+xmpp.connect()
+xmpp.process(forever=False)
+if xmpp.got_error:
+    sys.exit(1)
+else:
+    sys.exit(0)
diff --git a/systems/eldiron/flake.lock b/systems/eldiron/flake.lock
new file mode 100644 (file)
index 0000000..99a5c92
--- /dev/null
@@ -0,0 +1,2758 @@
+{
+  "nodes": {
+    "backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_12",
+        "nixpkgs": "nixpkgs_15"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "buildslist": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585697026,
+        "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
+        "ref": "master",
+        "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
+        "revCount": 4,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
+      }
+    },
+    "colmena": {
+      "inputs": {
+        "flake-compat": "flake-compat",
+        "flake-utils": "flake-utils_2",
+        "nixpkgs": "nixpkgs",
+        "stable": "stable"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "copanier": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1633895178,
+        "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
+        "type": "github"
+      },
+      "original": {
+        "owner": "spiral-project",
+        "repo": "copanier",
+        "type": "github"
+      }
+    },
+    "diaspora": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1551139311,
+        "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
+        "owner": "diaspora",
+        "repo": "diaspora",
+        "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
+        "type": "github"
+      },
+      "original": {
+        "owner": "diaspora",
+        "ref": "v0.7.10.0",
+        "repo": "diaspora",
+        "type": "github"
+      }
+    },
+    "disko": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_2"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "dns-nix": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1635273082,
+        "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=",
+        "owner": "kirelagin",
+        "repo": "dns.nix",
+        "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "kirelagin",
+        "repo": "dns.nix",
+        "type": "github"
+      }
+    },
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "etherpad-lite": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1587951095,
+        "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
+        "owner": "ether",
+        "repo": "etherpad-lite",
+        "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ether",
+        "ref": "1.8.3",
+        "repo": "etherpad-lite",
+        "type": "github"
+      }
+    },
+    "files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "flake-compat": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_2": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_3"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_3": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_4"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_4": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_5"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_5": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_6"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_6": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_7"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1614513358,
+        "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_10": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_11": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_12": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_13": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_14": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_15": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_16": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_17": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_18": {
+      "locked": {
+        "lastModified": 1649676176,
+        "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_19": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_2": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_20": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_21": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_22": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_23": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_3": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_4": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_5": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_6": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_7": {
+      "locked": {
+        "lastModified": 1609246779,
+        "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_8": {
+      "locked": {
+        "lastModified": 1631561581,
+        "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_9": {
+      "locked": {
+        "lastModified": 1610051610,
+        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "grocy": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1585166193,
+        "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      },
+      "original": {
+        "owner": "grocy",
+        "repo": "grocy",
+        "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
+        "type": "github"
+      }
+    },
+    "mastodon": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1582790581,
+        "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
+        "owner": "tootsuite",
+        "repo": "mastodon",
+        "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tootsuite",
+        "ref": "v2.9.4",
+        "repo": "mastodon",
+        "type": "github"
+      }
+    },
+    "mediagoblin": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1531090939,
+        "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "revCount": 4805,
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      },
+      "original": {
+        "ref": "stable",
+        "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
+        "submodules": true,
+        "type": "git",
+        "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
+      }
+    },
+    "my-lib": {
+      "inputs": {
+        "colmena": "colmena",
+        "disko": "disko",
+        "flake-parts": "flake-parts",
+        "nixos-anywhere": "nixos-anywhere",
+        "nixpkgs": "nixpkgs_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_2",
+        "nixpkgs": "nixpkgs_16",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_2": {
+      "inputs": {
+        "flake-parts": "flake-parts_3",
+        "nixpkgs": "nixpkgs_19",
+        "webapps-ttrss": "webapps-ttrss_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_3": {
+      "inputs": {
+        "flake-parts": "flake-parts_4",
+        "nixpkgs": "nixpkgs_21",
+        "webapps-ttrss": "webapps-ttrss_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "mypackages_4": {
+      "inputs": {
+        "flake-parts": "flake-parts_6",
+        "nixpkgs": "nixpkgs_29",
+        "webapps-ttrss": "webapps-ttrss_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../mypackages",
+        "type": "path"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_10": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_11": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_12": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_13": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_14": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_6": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_7": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_8": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_9": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "nixos-2305": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere": {
+      "inputs": {
+        "disko": [
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305",
+        "nixos-images": "nixos-images",
+        "nixpkgs": "nixpkgs_3",
+        "treefmt-nix": "treefmt-nix"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-images": {
+      "inputs": {
+        "nixos-2305": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_2": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_3": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_4": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_5": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_6": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_7": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_10": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_11": {
+      "locked": {
+        "lastModified": 1631570365,
+        "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_12": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_13": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_14": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_15": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_16": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_17": {
+      "locked": {
+        "lastModified": 1633901457,
+        "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_18": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_19": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_20": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_21": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_22": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_23": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_24": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_25": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_26": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_27": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_28": {
+      "locked": {
+        "lastModified": 1611097871,
+        "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_29": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs_3": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_30": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_31": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_4": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_5": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_7": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_8": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_9": {
+      "locked": {
+        "lastModified": 1597943282,
+        "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_4",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs_7",
+        "openarc": "openarc_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_3": {
+      "inputs": {
+        "flake-utils": "flake-utils_6",
+        "myuids": "myuids_3",
+        "nixpkgs": "nixpkgs_9",
+        "openarc": "openarc_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../openarc",
+        "type": "path"
+      }
+    },
+    "openarc_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "openarc_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1537545083,
+        "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "trusteddomainproject",
+        "repo": "OpenARC",
+        "type": "github"
+      }
+    },
+    "opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_5",
+        "myuids": "myuids_2",
+        "nixpkgs": "nixpkgs_8"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "opendmarc_2": {
+      "inputs": {
+        "flake-utils": "flake-utils_7",
+        "myuids": "myuids_4",
+        "nixpkgs": "nixpkgs_10"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../opendmarc",
+        "type": "path"
+      }
+    },
+    "paste": {
+      "inputs": {
+        "flake-utils": "flake-utils_8",
+        "nixpkgs": "nixpkgs_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
+        "path": "../../paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../paste",
+        "type": "path"
+      }
+    },
+    "peertube": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1611184594,
+        "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
+        "ref": "gitolite_local/open_instance",
+        "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
+        "revCount": 6316,
+        "type": "git",
+        "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1610436329,
+        "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
+        "owner": "Chocobozzz",
+        "repo": "PeerTube",
+        "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "Chocobozzz",
+        "ref": "v3.0.1",
+        "repo": "PeerTube",
+        "type": "github"
+      }
+    },
+    "peertube_open_instance": {
+      "inputs": {
+        "flake-utils": "flake-utils_9",
+        "myuids": "myuids_5",
+        "nixpkgs": "nixpkgs_12",
+        "peertube": "peertube"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "peertube_origin": {
+      "inputs": {
+        "flake-utils": "flake-utils_10",
+        "myuids": "myuids_6",
+        "nixpkgs": "nixpkgs_13",
+        "peertube": "peertube_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "./../../peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "./../../peertube",
+        "type": "path"
+      }
+    },
+    "private-buildbot": {
+      "inputs": {
+        "buildslist": "buildslist",
+        "flake-utils": "flake-utils_3",
+        "nixpkgs": "nixpkgs_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
+        "path": "../../flakes/private/buildbot",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/buildbot",
+        "type": "path"
+      }
+    },
+    "private-chatons": {
+      "inputs": {
+        "environment": "environment"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "private-environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "private-milters": {
+      "inputs": {
+        "environment": "environment_2",
+        "files-watcher": "files-watcher",
+        "openarc": "openarc",
+        "opendmarc": "opendmarc",
+        "secrets": "secrets"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/milters",
+        "type": "path"
+      }
+    },
+    "private-monitoring": {
+      "inputs": {
+        "environment": "environment_3",
+        "naemon": "naemon",
+        "nixpkgs-lib": "nixpkgs-lib_2",
+        "secrets": "secrets_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "private-openarc": {
+      "inputs": {
+        "files-watcher": "files-watcher_2",
+        "openarc": "openarc_3",
+        "secrets": "secrets_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openarc",
+        "type": "path"
+      }
+    },
+    "private-opendmarc": {
+      "inputs": {
+        "environment": "environment_4",
+        "files-watcher": "files-watcher_3",
+        "opendmarc": "opendmarc_2",
+        "secrets": "secrets_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/opendmarc",
+        "type": "path"
+      }
+    },
+    "private-openldap": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/openldap",
+        "type": "path"
+      }
+    },
+    "private-paste": {
+      "inputs": {
+        "paste": "paste"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
+        "path": "../../flakes/private/paste",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/paste",
+        "type": "path"
+      }
+    },
+    "private-peertube": {
+      "inputs": {
+        "peertube_open_instance": "peertube_open_instance",
+        "peertube_origin": "peertube_origin"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
+        "path": "../../flakes/private/peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/peertube",
+        "type": "path"
+      }
+    },
+    "private-php": {
+      "inputs": {
+        "flake-utils": "flake-utils_11",
+        "nixpkgs": "nixpkgs_14",
+        "nixpkgs-4": "nixpkgs-4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "private-ssh": {
+      "inputs": {
+        "environment": "environment_5",
+        "secrets": "secrets_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/ssh",
+        "type": "path"
+      }
+    },
+    "private-system": {
+      "inputs": {
+        "backports": "backports",
+        "environment": "environment_6",
+        "mypackages": "mypackages",
+        "myuids": "myuids_7",
+        "secrets-public": "secrets-public"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "public-copanier": {
+      "inputs": {
+        "copanier": "copanier",
+        "flake-utils": "flake-utils_13",
+        "nixpkgs": "nixpkgs_17"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
+        "path": "../../flakes/copanier",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/copanier",
+        "type": "path"
+      }
+    },
+    "public-diaspora": {
+      "inputs": {
+        "diaspora": "diaspora",
+        "flake-utils": "flake-utils_14",
+        "myuids": "myuids_8",
+        "nixpkgs": "nixpkgs_18"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
+        "path": "../../flakes/diaspora",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/diaspora",
+        "type": "path"
+      }
+    },
+    "public-etherpad-lite": {
+      "inputs": {
+        "etherpad-lite": "etherpad-lite",
+        "flake-utils": "flake-utils_15",
+        "mypackages": "mypackages_2",
+        "nixpkgs": "nixpkgs_20"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
+        "path": "../../flakes/etherpad-lite",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/etherpad-lite",
+        "type": "path"
+      }
+    },
+    "public-fiche": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
+        "path": "../../flakes/fiche",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/fiche",
+        "type": "path"
+      }
+    },
+    "public-files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "public-grocy": {
+      "inputs": {
+        "flake-utils": "flake-utils_16",
+        "grocy": "grocy",
+        "mypackages": "mypackages_3",
+        "nixpkgs": "nixpkgs_22"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
+        "path": "../../flakes/grocy",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/grocy",
+        "type": "path"
+      }
+    },
+    "public-loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "public-mastodon": {
+      "inputs": {
+        "flake-utils": "flake-utils_17",
+        "mastodon": "mastodon",
+        "myuids": "myuids_9",
+        "nixpkgs": "nixpkgs_23"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
+        "path": "../../flakes/mastodon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mastodon",
+        "type": "path"
+      }
+    },
+    "public-mediagoblin": {
+      "inputs": {
+        "flake-utils": "flake-utils_18",
+        "mediagoblin": "mediagoblin",
+        "myuids": "myuids_10",
+        "nixpkgs": "nixpkgs_24"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
+        "path": "../../flakes/mediagoblin",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mediagoblin",
+        "type": "path"
+      }
+    },
+    "public-multi-apache-container": {
+      "inputs": {
+        "files-watcher": "files-watcher_4",
+        "myuids": "myuids_11"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      }
+    },
+    "public-mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_5",
+        "nixpkgs": "nixpkgs_25",
+        "webapps-ttrss": "webapps-ttrss_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../flakes/mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/mypackages",
+        "type": "path"
+      }
+    },
+    "public-myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "public-openarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_19",
+        "myuids": "myuids_12",
+        "nixpkgs": "nixpkgs_26",
+        "openarc": "openarc_5"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
+        "path": "../../flakes/openarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/openarc",
+        "type": "path"
+      }
+    },
+    "public-opendmarc": {
+      "inputs": {
+        "flake-utils": "flake-utils_20",
+        "myuids": "myuids_13",
+        "nixpkgs": "nixpkgs_27"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
+        "path": "../../flakes/opendmarc",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/opendmarc",
+        "type": "path"
+      }
+    },
+    "public-peertube": {
+      "inputs": {
+        "flake-utils": "flake-utils_21",
+        "myuids": "myuids_14",
+        "nixpkgs": "nixpkgs_28",
+        "peertube": "peertube_3"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
+        "path": "../../flakes/peertube",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/peertube",
+        "type": "path"
+      }
+    },
+    "public-secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "public-surfer": {
+      "inputs": {
+        "flake-utils": "flake-utils_22",
+        "mypackages": "mypackages_4",
+        "nixpkgs": "nixpkgs_30",
+        "surfer": "surfer"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
+        "path": "../../flakes/surfer",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/surfer",
+        "type": "path"
+      }
+    },
+    "public-taskwarrior-web": {
+      "inputs": {
+        "flake-utils": "flake-utils_23",
+        "nixpkgs": "nixpkgs_31",
+        "taskwarrior-web": "taskwarrior-web"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
+        "path": "../../flakes/taskwarrior-web",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/taskwarrior-web",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "dns-nix": "dns-nix",
+        "my-lib": "my-lib",
+        "nixpkgs": "nixpkgs_5",
+        "private-buildbot": "private-buildbot",
+        "private-chatons": "private-chatons",
+        "private-environment": "private-environment",
+        "private-milters": "private-milters",
+        "private-monitoring": "private-monitoring",
+        "private-openarc": "private-openarc",
+        "private-opendmarc": "private-opendmarc",
+        "private-openldap": "private-openldap",
+        "private-paste": "private-paste",
+        "private-peertube": "private-peertube",
+        "private-php": "private-php",
+        "private-ssh": "private-ssh",
+        "private-system": "private-system",
+        "public-copanier": "public-copanier",
+        "public-diaspora": "public-diaspora",
+        "public-etherpad-lite": "public-etherpad-lite",
+        "public-fiche": "public-fiche",
+        "public-files-watcher": "public-files-watcher",
+        "public-grocy": "public-grocy",
+        "public-loginctl-linger": "public-loginctl-linger",
+        "public-mastodon": "public-mastodon",
+        "public-mediagoblin": "public-mediagoblin",
+        "public-multi-apache-container": "public-multi-apache-container",
+        "public-mypackages": "public-mypackages",
+        "public-myuids": "public-myuids",
+        "public-openarc": "public-openarc",
+        "public-opendmarc": "public-opendmarc",
+        "public-peertube": "public-peertube",
+        "public-secrets": "public-secrets",
+        "public-surfer": "public-surfer",
+        "public-taskwarrior-web": "public-taskwarrior-web"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "stable": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "surfer": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1588637864,
+        "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "revCount": 318,
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      },
+      "original": {
+        "rev": "476177380452c9c7c5b1624805feedc824c5995e",
+        "type": "git",
+        "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
+      }
+    },
+    "taskwarrior-web": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546434241,
+        "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "theunraveler",
+        "repo": "taskwarrior-web",
+        "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
+        "type": "github"
+      }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    },
+    "webapps-ttrss_5": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/systems/eldiron/flake.nix b/systems/eldiron/flake.nix
new file mode 100644 (file)
index 0000000..790b638
--- /dev/null
@@ -0,0 +1,90 @@
+{
+  inputs = {
+    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+    dns-nix.url = "github:kirelagin/dns.nix";
+    dns-nix.inputs.nixpkgs.follows = "nixpkgs";
+
+    my-lib.url = "path:../../flakes/lib";
+
+    public-etherpad-lite.url = "path:../../flakes/etherpad-lite";
+    public-grocy.url = "path:../../flakes/grocy";
+    public-openarc.url = "path:../../flakes/openarc";
+    public-opendmarc.url = "path:../../flakes/opendmarc";
+    public-peertube.url = "path:../../flakes/peertube";
+    public-diaspora.url = "path:../../flakes/diaspora";
+    public-mastodon.url = "path:../../flakes/mastodon";
+    public-mediagoblin.url = "path:../../flakes/mediagoblin";
+    public-surfer.url = "path:../../flakes/surfer";
+    public-myuids.url = "path:../../flakes/myuids";
+    public-copanier.url = "path:../../flakes/copanier";
+    public-secrets.url = "path:../../flakes/secrets";
+    public-files-watcher.url = "path:../../flakes/files-watcher";
+    public-fiche.url = "path:../../flakes/fiche";
+    public-mypackages.url = "path:../../flakes/mypackages";
+    public-loginctl-linger.url = "path:../../flakes/loginctl-linger";
+    public-multi-apache-container.url = "path:../../flakes/multi-apache-container";
+    public-taskwarrior-web.url = "path:../../flakes/taskwarrior-web";
+
+    private-peertube.url = "path:../../flakes/private/peertube";
+    private-buildbot.url = "path:../../flakes/private/buildbot";
+    private-php.url = "path:../../flakes/private/php";
+    private-environment.url = "path:../../flakes/private/environment";
+    private-openarc.url = "path:../../flakes/private/openarc";
+    private-openldap.url = "path:../../flakes/private/openldap";
+    private-opendmarc.url = "path:../../flakes/private/opendmarc";
+    private-milters.url = "path:../../flakes/private/milters";
+    private-monitoring.url = "path:../../flakes/private/monitoring";
+    private-paste.url = "path:../../flakes/private/paste";
+    private-ssh.url = "path:../../flakes/private/ssh";
+    private-chatons.url = "path:../../flakes/private/chatons";
+    private-system.url = "path:../../flakes/private/system";
+  };
+  outputs = inputs@{ self, my-lib, nixpkgs, dns-nix, ...}:
+    my-lib.lib.mkColmenaFlake {
+      name = "eldiron";
+      inherit self nixpkgs;
+      system = "x86_64-linux";
+      targetHost = "176.9.151.89";
+      targetUser = "root";
+      nixosModules = with inputs; {
+        base = ./base.nix;
+        myuids = public-myuids.nixosModule;
+        secrets = public-secrets.nixosModule;
+        loginctl-linger = public-loginctl-linger.nixosModule;
+        files-watcher = public-files-watcher.nixosModule;
+        multi-apache-container = public-multi-apache-container.nixosModule;
+        etherpad-lite = public-etherpad-lite.nixosModule;
+        mastodon = public-mastodon.nixosModule;
+        mediagoblin = public-mediagoblin.nixosModule;
+        peertube = public-peertube.nixosModule;
+        diaspora = public-diaspora.nixosModule;
+        fiche = public-fiche.nixosModule;
+
+        environment = private-environment.nixosModule;
+        openarc = private-openarc.nixosModule;
+        opendmarc = private-opendmarc.nixosModule;
+        ssh = private-ssh.nixosModule;
+        chatons = private-chatons.nixosModule;
+        system = private-system.nixosModule;
+        monitoring = private-monitoring.nixosModule;
+        paste = private-paste.nixosModule;
+        milters = private-milters.nixosModule;
+      };
+      moduleArgs = with inputs; {
+        dns-nix = dns-nix;
+        nixpkgsRaw = nixpkgs.legacyPackages.x86_64-linux;
+        mypackages-lib = public-mypackages.lib.x86_64-linux;
+        etherpad-lite = public-etherpad-lite.defaultPackage.x86_64-linux;
+        taskwarrior-web = public-taskwarrior-web.defaultPackage.x86_64-linux;
+        copanier = public-copanier.defaultPackage.x86_64-linux;
+        grocy = public-grocy.defaultPackage.x86_64-linux;
+        surfer = public-surfer.defaultPackage.x86_64-linux;
+        mediagoblin = public-mediagoblin.defaultPackage.x86_64-linux;
+        buildbot = private-buildbot.packages.x86_64-linux.buildbot-full;
+        openldap = private-openldap;
+        monitoring = private-monitoring;
+        peertube = private-peertube.packages.x86_64-linux;
+        php = private-php;
+      };
+    };
+}
similarity index 68%
rename from modules/private/ftp.nix
rename to systems/eldiron/ftp.nix
index cae25c1dc5fdc2828efa59701213e15ffcba4f3f..6aa1afc731cd95c0c8128ca099126ee7ead3aa60 100644 (file)
@@ -30,14 +30,88 @@ in
   };
 
   config = lib.mkIf config.myServices.ftp.enable {
   };
 
   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";
       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
       '');
       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 = {
     };
 
     networking = {
@@ -227,6 +301,7 @@ in
           SFTPAuthMethods              password publickey
 
           SFTPOptions                  IgnoreSFTPSetOwners
           SFTPAuthMethods              password publickey
 
           SFTPOptions                  IgnoreSFTPSetOwners
+          AllowChrootSymlinks          off
         </VirtualHost>
         '';
     in lib.mkIf proftpd-enabled {
         </VirtualHost>
         '';
     in lib.mkIf proftpd-enabled {
@@ -243,6 +318,22 @@ in
     services.cron.systemCronJobs = lib.mkIf proftpd-enabled [
       "*/2 * * * * nobody ${./ftp_sync.sh}"
     ];
     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";
+      }
+
+    ];
+
   };
 
 }
   };
 
 }
similarity index 91%
rename from modules/private/ftp_sync.sh
rename to systems/eldiron/ftp_sync.sh
index 8b0d9c5f2736f69d10f45b3d177f37983fc246fb..aff7178007032c9f20fec8c37c776e8fabb7c634 100755 (executable)
@@ -4,7 +4,7 @@ LDAPSEARCH=ldapsearch
 
 LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu"
 LDAP_PASS=$(cat /etc/ssh/ldap_password)
 
 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)"
 
 LDAP_BASE="dc=immae,dc=eu"
 LDAP_FILTER="(memberOf=cn=users,cn=ftp,ou=services,dc=immae,dc=eu)"
 
@@ -43,5 +43,5 @@ $key"
 $(echo "$key" | cut -d" " -f2-)"
     fi
   fi
 $(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"
 handle_keys "$uids" "$keys"
diff --git a/systems/eldiron/gemini/default.nix b/systems/eldiron/gemini/default.nix
new file mode 100644 (file)
index 0000000..600afbc
--- /dev/null
@@ -0,0 +1,50 @@
+{ lib, config, pkgs, ... }:
+let
+  configFile = pkgs.writeText "config.yaml" ''
+    listen: ":1965"
+    hosts:
+      immae.eu:
+        cert: /var/lib/acme/immae/full.pem
+        key: /var/lib/acme/immae/key.pem
+        paths:
+          - path: /
+            root: ${./public}
+  '';
+in
+{
+  options.myServices.gemini.enable = lib.mkEnableOption "enable Gemini capsule";
+  config = lib.mkIf config.myServices.gemini.enable {
+    security.acme.certs.immae.postRun = ''
+      systemctl restart gemini.service
+    '';
+    myServices.chatonsProperties.hostings.gemini = {
+      file.datetime = "2022-08-27T18:00:00";
+      hosting = {
+        name = "Hébergement Gemini";
+        description = "Hébergement de capsules Gemini";
+        type = "INSTANCE";
+        website = "gemini://immae.eu";
+        status.level = "OK";
+        status.description = "OK";
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+      software = {
+        name = "twins";
+        website = "https://code.rocketnine.space/tslocum/twins";
+        license.url = "https://code.rocketnine.space/tslocum/twins/src/branch/master/LICENSE";
+        license.name = "MIT License";
+        version = pkgs.twins.version;
+        source.url = "https://code.rocketnine.space/tslocum/twins";
+      };
+    };
+    networking.firewall.allowedTCPPorts = [ 1965 ];
+    systemd.services.gemini = {
+      description = "Gemini capsule server";
+      wantedBy = [ "multi-user.target" ];
+      after = [ "network.target" ];
+      serviceConfig.ExecStart = "${pkgs.twins}/bin/twins -config ${configFile}";
+      serviceConfig.Type = "simple";
+    };
+  };
+}
diff --git a/systems/eldiron/gitolite/default.nix b/systems/eldiron/gitolite/default.nix
new file mode 100644 (file)
index 0000000..1885234
--- /dev/null
@@ -0,0 +1,127 @@
+{ lib, pkgs, config, ... }:
+let
+    cfg = config.myServices.gitolite;
+in {
+  options.myServices.gitolite = {
+    enable = lib.mkEnableOption "my gitolite service";
+    gitoliteDir = lib.mkOption {
+      type = lib.types.str;
+      default = "/var/lib/gitolite";
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    myServices.dns.zones."immae.eu".subdomains.git =
+      with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
+
+    myServices.chatonsProperties.services.gitolite = {
+      file.datetime = "2022-08-21T10:01:00";
+      service = {
+        name = "Gitolite";
+        description = "Gitolite allows you to setup git hosting on a central server, with fine-grained access control and many more powerful features.";
+        website = "https://git.immae.eu";
+        logo = "https://git.immae.eu/cgit-css/favicon.ico";
+        status.level = "OK";
+        status.description = "OK";
+        registration."" = ["MEMBER" "CLIENT"];
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+        guide.user = "https://www.immae.eu/docs/forge-logicielle.html";
+      };
+      software = {
+        name = "Gitolite";
+        website = "https://gitolite.com/gitolite/";
+        license.url = "https://github.com/sitaramc/gitolite/blob/master/COPYING";
+        license.name = "GNU General Public License v2.0";
+        version = pkgs.gitolite.version;
+        source.url = "https://github.com/sitaramc/gitolite";
+      };
+    };
+    myServices.ssh.modules.gitolite = {
+      snippet = builtins.readFile ./ldap_gitolite.sh;
+      dependencies = [ pkgs.gitolite ];
+      vars.ldap_group = "cn=users,cn=gitolite,ou=services,dc=immae,dc=eu";
+      vars.shell_path = "${pkgs.gitolite}/bin/gitolite-shell";
+      vars.services = let
+        toLine = login: key: ''command="${pkgs.gitolite}/bin/gitolite-shell ${login}",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ${key}'';
+      in builtins.concatStringsSep "\n" [
+        (toLine "naemon" config.myEnv.monitoring.ssh_public_key)
+        (toLine "buildbot" config.myEnv.buildbot.ssh_key.public)
+      ];
+    };
+    networking.firewall.allowedTCPPorts = [ 9418 ];
+
+    secrets.keys."gitolite/ldap_password" = {
+      user = "gitolite";
+      group = "gitolite";
+      permissions = "0400";
+      text = config.myEnv.tools.gitolite.ldap.password;
+    };
+
+    services.gitDaemon = {
+      enable = true;
+      user = "gitolite";
+      group = "gitolite";
+      basePath = "${cfg.gitoliteDir}/repositories";
+    };
+
+    system.activationScripts.gitolite = let
+      deps = [ pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.coreutils ];
+      gitolite_ldap_groups = pkgs.runCommand "gitolite_ldap_groups.sh" {
+        buildInputs = [ pkgs.makeWrapper ];
+      } ''
+        makeWrapper "${./gitolite_ldap_groups.sh}" "$out" \
+          --prefix PATH : ${lib.makeBinPath deps} \
+          --set LDAP_PASS_PATH ${config.secrets.fullPaths."gitolite/ldap_password"}
+        '';
+    in {
+      deps = [ "users" ];
+      text = ''
+        if [ -d ${cfg.gitoliteDir} ]; then
+          ln -sf ${gitolite_ldap_groups} ${cfg.gitoliteDir}/gitolite_ldap_groups.sh
+          chmod g+rx ${cfg.gitoliteDir}
+        fi
+        if [ -f ${cfg.gitoliteDir}/projects.list ]; then
+          chmod g+r ${cfg.gitoliteDir}/projects.list
+        fi
+      '';
+    };
+
+    users.users.wwwrun.extraGroups = [ "gitolite" ];
+    users.users.gitolite.extraGroups = [ "keys" ];
+
+    users.users.gitolite.packages = let
+      python-packages = python-packages: with python-packages; [
+        simplejson
+        apprise
+        sleekxmpp
+        urllib3
+        pyyaml
+      ];
+    in
+      [
+        # For some reason it absolutely wants to include "doc" output
+        ((pkgs.python39.withPackages python-packages) // { doc = ""; })
+        pkgs.nettools
+        pkgs.findutils
+      ];
+    # Installation: https://git.immae.eu/mantisbt/view.php?id=93
+    services.gitolite = {
+      enable = true;
+      adminPubkey = config.myEnv.sshd.rootKeys.immae_dilion;
+    };
+    myServices.monitoring.fromMasterActivatedPlugins = [ "git" ];
+    myServices.monitoring.fromMasterObjects.service = [
+      {
+        service_description = "gitolite is working";
+        host_name = config.hostEnv.fqdn;
+        use = "external-web-service";
+        check_command = "check_git";
+
+        servicegroups = "webstatus-remote-services";
+        _webstatus_name = "Git";
+        _webstatus_url = "git.immae.eu";
+      }
+    ];
+  };
+}
similarity index 84%
rename from modules/private/gitolite/gitolite_ldap_groups.sh
rename to systems/eldiron/gitolite/gitolite_ldap_groups.sh
index 3d7117e728f0ca80201c3a5492f390043602f8c0..ffa2dab308de09c7d8d6b8e6d9f4f98d0813b44f 100755 (executable)
@@ -1,13 +1,13 @@
 #!/usr/bin/env bash
 
 uid_param="$1"
 #!/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_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)
 
 ldap_filter="(&(memberOf=cn=groups,cn=gitolite,ou=services,dc=immae,dc=eu)(|(member=uid=${uid_param},ou=users,dc=immae,dc=eu)(member=uid=${uid_param},ou=group_users,dc=immae,dc=eu)))"
 ldap_result=$(ldapsearch ${ldap_options} -LLL "${ldap_filter}" cn | grep 'cn:' | cut -d' ' -f2)
diff --git a/systems/eldiron/gitolite/ldap_gitolite.sh b/systems/eldiron/gitolite/ldap_gitolite.sh
new file mode 100644 (file)
index 0000000..75a39bf
--- /dev/null
@@ -0,0 +1,28 @@
+### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh
+LDAP_GITOLITE_MEMBER="@gitolite_ldap_group@"
+GITOLITE_SHELL="@gitolite_shell_path@"
+
+if [[ $user == gitolite ]]; then
+  allowed_logins=$(LDAP_BASE=$USER_LDAP_BASE \
+    ldap_search '(memberOf='$LDAP_GITOLITE_MEMBER')' '' \
+      | grep ^dn \
+      | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \
+      | paste -sd,)
+
+  psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'git' = ANY(usage) AND login IN ($allowed_logins);" | while IFS='|' read user key; do
+    if [[ $user == "immae" ]] || [[ $user == "denise" ]]; then
+      # Capitalize first letter (backward compatibility)
+      user=$(sed -r 's/^([a-z])/\U\1/' <<< "$user")
+    fi
+    if [ ! -z "$key" ]; then
+      if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
+        echo -n 'command="'$GITOLITE_SHELL' '$user'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty '
+        echo $key
+      fi
+    fi
+  done
+cat <<EOF
+@gitolite_services@
+EOF
+  exit 0
+fi
diff --git a/systems/eldiron/irc.nix b/systems/eldiron/irc.nix
new file mode 100644 (file)
index 0000000..c48a4b3
--- /dev/null
@@ -0,0 +1,80 @@
+{ 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";
+        };
+      };
+    };
+  };
+}
diff --git a/systems/eldiron/mail/default.nix b/systems/eldiron/mail/default.nix
new file mode 100644 (file)
index 0000000..4e13f6a
--- /dev/null
@@ -0,0 +1,44 @@
+{ 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";
+    };
+  };
+}
similarity index 77%
rename from modules/private/mail/dovecot.nix
rename to systems/eldiron/mail/dovecot.nix
index b6fdc026efcd8a66d2e22f27c92de69d52ce78ed..a1282e3def28da74253b494669a595dd86ab6e46 100644 (file)
@@ -13,6 +13,36 @@ let
 in
 {
   config = lib.mkIf config.myServices.mail.enable {
 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;
     systemd.services.dovecot2.serviceConfig.Slice = "mail.slice";
     secrets.keys."dovecot/ldap" = {
       user = config.services.dovecot2.user;
@@ -47,6 +77,13 @@ in
       uid = config.ids.uids.vhost;
     };
     users.groups.vhost.gid = config.ids.gids.vhost;
       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 = {
 
     # https://blog.zeninc.net/index.php?post/2018/04/01/Un-annuaire-pour-les-gouverner-tous.......
     services.dovecot2 = {
@@ -58,7 +95,7 @@ in
       protocols = [ "sieve" ];
       modules = [
         pkgs.dovecot_pigeonhole
       protocols = [ "sieve" ];
       modules = [
         pkgs.dovecot_pigeonhole
-        pkgs.dovecot_fts-xapian
+        pkgs.dovecot_fts_xapian
       ];
       mailUser = "vhost";
       mailGroup = "vhost";
       ];
       mailUser = "vhost";
       mailGroup = "vhost";
@@ -70,13 +107,13 @@ in
         Drafts = { auto = "subscribe"; specialUse = "Drafts"; };
       };
       mailLocation = "mbox:~/Mail:INBOX=~/Mail/Inbox:INDEX=~/.imap";
         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";
       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
         ''
       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
         ''
 
           ssl_alt_key = </var/lib/acme/mail-rsa/key.pem
         ''
 
@@ -273,20 +310,39 @@ in
       postRun = ''
         systemctl restart dovecot2.service
       '';
       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
       '';
     };
     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";
+      }
+
+    ];
   };
 }
 
   };
 }
 
similarity index 71%
rename from modules/private/mail/postfix.nix
rename to systems/eldiron/mail/postfix.nix
index ae98a8a8c82e0d5d0ba2f20b4eae4cc442a0ee93..f95ee1bb04217e6d9114fd8e04122a13433c3336 100644 (file)
@@ -1,6 +1,62 @@
-{ 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 {
   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;
     secrets.keys = {
       "postfix/mysql_alias_maps" = {
         user = config.services.postfix.user;
           version = 3
           '';
       };
           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 ];
 
 
     networking.firewall.allowedTCPPorts = [ 25 465 587 ];
 
     };
     services.postfix = {
       extraAliases = let
     };
     services.postfix = {
       extraAliases = let
-        toScript = name: script: pkgs.writeScript name ''
+        testmail = pkgs.writeScript "testmail" ''
           #! ${pkgs.stdenv.shell}
           #! ${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
       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}";
         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" (
           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));
         };
         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 ",";
             joined = builtins.concatStringsSep ",";
+            admins = joined config.myEnv.mail.postfix.admins;
           in pkgs.writeText "host-sender-login"
           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
         };
       in
-        recipient_maps // relay_restrictions // virtual_map // sasl_access;
+        virtual_map // sasl_access;
       config = {
         ### postfix module overrides
         readme_directory = "${pkgs.postfix}/share/postfix/doc";
       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"}"
         ];
           "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_mailbox_maps = [
           "ldap:${config.secrets.fullPaths."postfix/ldap_mailboxes"}"
         ];
         virtual_transport = "dovecot";
 
         ### Relay domains
         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"
         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";
 
         ### Additional smtpd configuration
         smtpd_tls_received_header = "yes";
         smtp_tls_loglevel = "1";
 
         ### Force ip bind for smtp
         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_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_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";
         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 = [
 
         ### opendkim, opendmarc, openarc milters
         non_smtpd_milters = [
 
         smtp_use_tls = true;
         smtpd_use_tls = true;
 
         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";
 
         maximal_queue_lifetime = "6w";
         bounce_queue_lifetime = "6w";
       enable = true;
       enableSmtp = true;
       enableSubmission = true;
       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)
         # 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_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
         # 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"}"
         ];
           "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";
         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"
           # 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}
             # here.
             rspamc_dovecot = pkgs.writeScriptBin "rspamc_dovecot" ''
               #! ${pkgs.stdenv.shell}
+              set -o pipefail
               sender="$1"
               original_recipient="$2"
               user="$3"
 
               ${pkgs.coreutils}/bin/cat - | \
               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"
                 ${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"
               '';
           in [
             "flags=ODRhu" "user=vhost:vhost"
       postRun = ''
         systemctl restart postfix.service
         '';
       postRun = ''
         systemctl restart postfix.service
         '';
-      extraDomains = {
-        "smtp.immae.eu" = null;
-      };
+      extraDomainNames = [ "smtp.immae.eu" ];
     };
     security.acme.certs."mail-rsa" = {
       postRun = ''
         systemctl restart postfix.service
         '';
     };
     security.acme.certs."mail-rsa" = {
       postRun = ''
         systemctl restart postfix.service
         '';
-      extraDomains = {
-        "smtp.immae.eu" = null;
-      };
+      extraDomainNames = [ "smtp.immae.eu" ];
     };
     system.activationScripts.testmail = {
       deps = [ "users" ];
     };
     system.activationScripts.testmail = {
       deps = [ "users" ];
         '';
     };
     systemd.services.postfix.serviceConfig.Slice = "mail.slice";
         '';
     };
     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";
+      }
+    ];
   };
 }
   };
 }
similarity index 97%
rename from modules/private/mail/rspamd.nix
rename to systems/eldiron/mail/rspamd.nix
index 05f13006732865b0b717529a15162e1fbb618e8b..a300cc531d4049354cf2fecf0a355c0ffe59babb 100644 (file)
@@ -26,6 +26,7 @@
       [ "*/20 * * * * vhost ${cron_script}/scan_reported_mails" ];
 
     systemd.services.rspamd.serviceConfig.Slice = "mail.slice";
       [ "*/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;
     services.rspamd = {
       enable = true;
       debug = false;
similarity index 84%
rename from modules/private/mail/sympa.nix
rename to systems/eldiron/mail/sympa.nix
index 0626ac0c4611f24f8cae211975eb5de5b8cefd87..8e801dd938a00c0d2f4d95023aa91762da2f5666 100644 (file)
@@ -5,13 +5,43 @@ let
 in
 {
   config = lib.mkIf config.myServices.mail.enable {
 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";
     myServices.databases.postgresql.authorizedHosts = {
       backup-2 = [
         {
           username = "sympa";
           database = "sympa";
-          ip4 = [config.myEnv.servers.backup-2.ips.main.ip4];
-          ip6 = config.myEnv.servers.backup-2.ips.main.ip6;
+          ip4 = config.myEnv.servers.backup-2.ips.main.ip4;
+          ip6 = map (v: "${v}/128") config.myEnv.servers.backup-2.ips.main.ip6;
         }
       ];
     };
         }
       ];
     };
@@ -105,9 +135,6 @@ in
         sympa_virtual = pkgs.writeText "virtual.sympa" ''
           sympa-request@${domain} postmaster@immae.eu
           sympa-owner@${domain}   postmaster@immae.eu
         sympa_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
         '';
         sympa_transport = pkgs.writeText "transport.sympa" ''
           ${domain}                        error:User unknown in recipient table
@@ -115,11 +142,6 @@ in
           listmaster@${domain}             sympa:listmaster@${domain}
           bounce@${domain}                 sympabounce:sympa@${domain}
           abuse-feedback-report@${domain}  sympabounce:sympa@${domain}
           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 = {
         '';
       };
       config = {
@@ -172,10 +194,6 @@ in
           webHost = "mail.immae.eu";
           webLocation = "/sympa";
         };
           webHost = "mail.immae.eu";
           webLocation = "/sympa";
         };
-        "cip-ca.fr" = {
-          webHost = "mail.cip-ca.fr";
-          webLocation = "/sympa";
-        };
       };
 
       database = {
       };
 
       database = {
@@ -191,6 +209,7 @@ in
         log_smtp = "on";
         sendmail_aliases = "/var/lib/sympa/sympa_transport";
         aliases_program = "${pkgs.postfix}/bin/postmap";
         log_smtp = "on";
         sendmail_aliases = "/var/lib/sympa/sympa_transport";
         aliases_program = "${pkgs.postfix}/bin/postmap";
+        create_list = "listmaster";
       };
       settingsFile = {
         "virtual.sympa".enable = false;
       };
       settingsFile = {
         "virtual.sympa".enable = false;
diff --git a/systems/eldiron/monitoring.nix b/systems/eldiron/monitoring.nix
new file mode 100644 (file)
index 0000000..2aa7f8f
--- /dev/null
@@ -0,0 +1,51 @@
+{ config, pkgs, lib, name, monitoring, ... }:
+let
+  hostFQDN = config.hostEnv.fqdn;
+  emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
+in
+{
+  config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "emails" "mdadm" "postfix" "postgresql" "zfs" "notify-secondary"];
+  config.myServices.monitoring.pluginsArgs.postgresql.package = config.myServices.databases.postgresql.package;
+  config.myServices.monitoring.objects = lib.mkMerge [
+    (monitoring.lib.objectsCommon {
+      inherit hostFQDN;
+      hostName = name;
+      master = false;
+      processWarn = "550"; processAlert = "650";
+      loadWarn = "1.0"; loadAlert = "1.2";
+      interface = builtins.head (builtins.attrNames config.networking.interfaces);
+    })
+
+    {
+      service = [
+        {
+          service_description = "No mdadm array is degraded";
+          use = "local-service";
+          check_command = ["check_mdadm"];
+          __passive_servicegroups = "webstatus-resources";
+        }
+        {
+          service_description = "Postgresql replication for backup-2 is up to date";
+          use = "local-service";
+          check_command = ["check_postgresql_replication" "backup-2" "/run/postgresql" "5432"];
+          __passive_servicegroups = "webstatus-databases";
+        }
+        {
+          service_description = "No ZFS pool is degraded";
+          use = "local-service";
+          check_command = ["check_zfs"];
+          __passive_servicegroups = "webstatus-resources";
+        }
+        {
+          service_description = "mailq is empty";
+          use = "local-service";
+          check_command = ["check_mailq"];
+          __passive_servicegroups = "webstatus-email";
+        }
+        (emailCheck "eldiron" hostFQDN // {
+          __passive_servicegroups = "webstatus-email";
+        })
+      ];
+    }
+  ];
+}
diff --git a/systems/eldiron/pub/default.nix b/systems/eldiron/pub/default.nix
new file mode 100644 (file)
index 0000000..ca8122a
--- /dev/null
@@ -0,0 +1,100 @@
+{ lib, pkgs, config,  ... }:
+let
+  restrict = pkgs.runCommand "restrict" {
+    file = ./restrict;
+    buildInputs = [ pkgs.makeWrapper ];
+  } ''
+    mkdir -p $out/bin
+    cp $file $out/bin/restrict
+    chmod a+x $out/bin/restrict
+    patchShebangs $out/bin/restrict
+    wrapProgram $out/bin/restrict \
+      --prefix PATH : ${lib.makeBinPath [ pkgs.bubblewrap pkgs.rrsync ]} \
+      --set TMUX_RESTRICT ${./tmux.restrict.conf}
+  '';
+in
+{
+  options = {
+    myServices.pub.enable = lib.mkOption {
+      type = lib.types.bool;
+      default = false;
+      description = ''
+        Whether to enable pub user.
+      '';
+    };
+    myServices.pub.usersProfiles = lib.mkOption {
+      type = lib.types.attrsOf (lib.types.listOf lib.types.package);
+      default = {};
+      description = ''
+        specific user profile
+      '';
+    };
+    myServices.pub.restrictCommand = lib.mkOption {
+      type = lib.types.path;
+      readOnly = true;
+      default = "${restrict}/bin/restrict";
+      description = ''
+        path to the restrict shell
+      '';
+    };
+  };
+
+  config = lib.mkIf config.myServices.pub.enable {
+    myServices.dns.zones."immae.eu".subdomains.pub =
+      with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
+
+    myServices.chatonsProperties.services.vm-like = {
+      file.datetime = "2022-08-22T01:00:00";
+      service = {
+        name = "Comptes shell";
+        description = "Compte shell cloisonné";
+        logo = "https://www.openssh.com/favicon.ico";
+        website = "pub.immae.eu";
+        status.level = "OK";
+        status.description = "OK";
+        registration."" = ["MEMBER" "CLIENT"];
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+      software = {
+        name = "Openssh";
+        website = "https://www.openssh.com/";
+        license.url = "https://github.com/openssh/openssh-portable/blob/master/LICENCE";
+        license.name = "BSD Licence";
+        version = pkgs.openssh.version;
+        source.url = "https://github.com/openssh/openssh-portable";
+      };
+    };
+    myServices.ssh.modules.pub = {
+      snippet = builtins.readFile ./ldap_pub.sh;
+      dependencies = [ pkgs.coreutils ];
+      vars.ldap_forward_group = "cn=forward,cn=pub,ou=services,dc=immae,dc=eu";
+      vars.ldap_pub_group = "cn=restrict,cn=pub,ou=services,dc=immae,dc=eu";
+      vars.echo_command = "${pkgs.coreutils}/bin/echo";
+      vars.restrict_command = "${restrict}/bin/restrict";
+    };
+
+    system.extraSystemBuilderCmds = let
+      toPath = u: paths: pkgs.buildEnv {
+        name = "${u}-profile";
+        inherit paths;
+      };
+    in ''
+      mkdir -p $out/pub
+      ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (u: m: "ln -s ${toPath u m} $out/pub/${u}") config.myServices.pub.usersProfiles)}
+    '';
+    users.users.pub = let
+    in {
+      createHome = true;
+      description = "Restricted shell user";
+      home = "/var/lib/pub";
+      uid = config.myEnv.users.pub.uid;
+      isNormalUser = true;
+      group = "nogroup";
+      useDefaultShell = true;
+      packages = [
+        pkgs.tmux
+      ];
+    };
+  };
+}
diff --git a/systems/eldiron/pub/ldap_pub.sh b/systems/eldiron/pub/ldap_pub.sh
new file mode 100644 (file)
index 0000000..9f03ffe
--- /dev/null
@@ -0,0 +1,38 @@
+### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh
+LDAP_PUB_RESTRICT_MEMBER="@pub_ldap_pub_group@"
+LDAP_PUB_FORWARD_MEMBER="@pub_ldap_forward_group@"
+ECHO="@pub_echo_command@"
+
+if [[ $user == pub ]]; then
+  allowed_logins=$(LDAP_BASE=$USER_LDAP_BASE \
+    ldap_search '(memberOf='$LDAP_PUB_RESTRICT_MEMBER')' '' \
+      | grep ^dn \
+      | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \
+      | paste -sd,)
+
+  allowed_forwards=$(LDAP_BASE=$USER_LDAP_BASE \
+    ldap_search '(memberOf='$LDAP_PUB_FORWARD_MEMBER')' '' \
+      | grep ^dn \
+      | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \
+      | paste -sd,)
+
+  psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'pub' = ANY(usage) AND login IN ($allowed_logins);" | while IFS='|' read user key; do
+    if [ ! -z "$key" ]; then
+      if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
+        echo -n 'command="@pub_restrict_command@ '$user'" '
+        echo $key
+      fi
+    fi
+  done
+
+  psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'forward' = ANY(usage) AND login IN ($allowed_logins,$allowed_forwards);" | while IFS='|' read user key; do
+    if [ ! -z "$key" ]; then
+      if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
+        echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" '
+        echo $key
+      fi
+    fi
+  done
+  exit 0
+fi
+
similarity index 82%
rename from modules/private/pub/restrict
rename to systems/eldiron/pub/restrict
index b2f3be369f1a60fb0efb56d7d04e8cdcc0a687c2..698e394e3d5903ef726acd308fe804c61d413138 100644 (file)
@@ -24,6 +24,13 @@ rsync*)
                | while read i; do
             printf '%s--ro-bind\0'$i'\0'$i'\0' ''
           done
                | 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
         }
 
         set -euo pipefail
@@ -52,12 +59,12 @@ rsync*)
               --setenv LOCALE_ARCHIVE "/etc/locale-archive" \
               --setenv XDG_RUNTIME_DIR "/run/user/`id -u`" \
               --setenv PS1 "$user@pub $ " \
               --setenv 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) \
               --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)
         ;;
               11< <(getent passwd $UID 65534) \
               12< <(getent group $(id -g) 65534)
         ;;
similarity index 88%
rename from modules/private/tasks/default.nix
rename to systems/eldiron/tasks/default.nix
index 64802550ac73a8e9591a1d76dd414daba66d1715..0772a5fd2727e07194ce80937285f9a8536828a2 100644 (file)
@@ -1,4 +1,4 @@
-{ lib, pkgs, config,  ... }:
+{ lib, pkgs, config, taskwarrior-web, ... }:
 let
   cfg = config.myServices.tasks;
   server_vardir = config.services.taskserver.dataDir;
 let
   cfg = config.myServices.tasks;
   server_vardir = config.services.taskserver.dataDir;
@@ -40,7 +40,6 @@ let
     chmod a+x $out/bin/taskserver-user-certs
     patchShebangs $out/bin/taskserver-user-certs
     '';
     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
   socketsDir = "/run/taskwarrior-web";
   varDir = "/var/lib/taskwarrior-web";
   taskwebPages = let
@@ -86,6 +85,31 @@ in {
   };
 
   config = lib.mkIf cfg.enable {
   };
 
   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";
     secrets.keys = {
       "webapps/tools-taskwarrior-web" = {
         user = "wwwrun";
@@ -101,19 +125,11 @@ in {
             SetEnv TASKD_LDAP_FILTER   "${env.ldap.filter}"
           '';
       };
             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;
         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
           -----BEGIN CERTIFICATE-----
           MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
           TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
@@ -144,17 +160,28 @@ in {
           4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
           mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
           emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
           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}
       '';
         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";
     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 = [ ''
       hosts       = [ "task.immae.eu" ];
       root        = ./www;
       extraConfig = [ ''
@@ -225,17 +252,19 @@ in {
 
           # Needed to avoid clashes in browser cookies (same domain)
           "php_value[session.name]" = "TaskPHPSESSID";
 
           # 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";
         };
           "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
       domain = fqdn;
       postRun = ''
         systemctl restart taskserver.service
similarity index 100%
rename from modules/private/tasks/www/index.php
rename to systems/eldiron/tasks/www/index.php
index 49ccd24ebd3a92758cdd7821ba884219062a0c76..bde773d0a65bf1ea64140355410c382d693659a0 100644 (file)
@@ -142,6 +142,7 @@ configuration files, and add that to your Taskwarrior configuration:
 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.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) {
 <?php if (count($entries) > 1) {
   echo "# Chose one of them\n";
   foreach($entries as $entry) {
@@ -151,7 +152,6 @@ taskd.server=<?php echo $host ."\n"; ?>
 } else { ?>
 taskd.credentials=<?php echo $entries[0][0]; ?>/<?php echo $entries[0][1]; ?>/<?php echo $entries[0][2]; ?>
 <?php } ?>
 } 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>
 </pre>
 For Mirakel, download and import the file:
 <ul>
similarity index 61%
rename from modules/private/vpn/default.nix
rename to systems/eldiron/vpn/default.nix
index d4b197d2e9fc3bb33ebd4697788941bb3660c0c6..df56249f7ed4e15fa4b8c5cf900869f3b165a18b 100644 (file)
@@ -8,6 +8,33 @@ in
   };
 
   config = lib.mkIf cfg.enable {
   };
 
   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";
     secrets.keys = {
       "tinc/key.priv" = {
         user = "root";
@@ -52,7 +79,7 @@ in
       description = "Tinc Daemon - Immae";
       wantedBy = [ "multi-user.target" ];
       after = [ "network.target" ];
       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";
       serviceConfig = {
         Slice = "tinc.slice";
         Type = "simple";
diff --git a/systems/eldiron/websites/assets/default.nix b/systems/eldiron/websites/assets/default.nix
new file mode 100644 (file)
index 0000000..02a4952
--- /dev/null
@@ -0,0 +1,98 @@
+{ lib, pkgs, config, ... }:
+let
+  cfg = config.myServices.websites.tools.assets;
+  fetchFont = v: pkgs.runCommand "fetch-font" {
+    outputHashAlgo = "sha256";
+    outputHashMode = "recursive";
+    outputHash = v.sha256;
+  } ''
+    mkdir -p $out
+    ${pkgs.curl}/bin/curl -k --output $out/font.css -H "User-Agent: Firefox/100.0" "${v.url}"
+    cat $out/font.css | grep -o "https://[^ )]*" | while read url; do
+      filename=$(echo "$url" | sed -e "s@.*/@@g")
+      ${pkgs.curl}/bin/curl -k --output "$out/$filename" "$url"
+      sed -i -e "s@$url@./$filename@" "$out/font.css"
+    done
+  '';
+  fetchTgz = v: pkgs.runCommand "fetch-tgz" {
+    outputHashAlgo = "sha256";
+    outputHashMode = "recursive";
+    outputHash = v.sha256;
+  } ''
+    mkdir -p $out
+    cd $out
+    ${pkgs.curl}/bin/curl -L -k "${v.url}" | tar -xz --strip-components=${builtins.toString v.tgzRemoveComponents}
+  '';
+  fetchAsset = v:
+    if v.assetType == "googleFont"
+    then fetchFont v
+    else if v.assetType == "tgz"
+    then fetchTgz v
+    else pkgs.fetchurl { url = v.url; sha256 = v.sha256; };
+  assets_urls = lib.mapAttrs (k: fetchAsset) config.myEnv.tools.assets;
+  assets = pkgs.runCommand "assets" {} (''
+    mkdir -p $out
+    cp -a ${./static}/* $out/
+  '' + builtins.concatStringsSep "\n"
+    (lib.mapAttrsToList (k: v: ''
+      if [ -d "${v}" ]; then
+        mkdir -p "$out/$(dirname "${k}")"
+        cp -a "${v}" "$out/${k}"
+        chmod -R u+rwX "$out/${k}"
+      else
+        install -D -m644 -T "${v}" "$out/${k}"
+      fi
+    '') assets_urls));
+in
+{
+  options.myServices.websites.tools.assets = {
+    enable = lib.mkEnableOption "Enable assets website";
+  };
+  config = lib.mkIf cfg.enable {
+    myServices.dns.zones."immae.eu".subdomains.assets =
+      with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
+
+    services.websites.env.production.bindMounts."/run/imgproxy" = {};
+    security.acme.certs.eldiron.extraDomainNames = [ "assets.immae.eu" ];
+    services.websites.env.tools.vhostConfs.assets = {
+      certName = "eldiron";
+      hosts = [ "assets.immae.eu" ];
+      root = assets;
+      extraConfig = [
+        ''
+          Use Apaxy "${assets}" "title"
+          <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";
+      };
+    };
+  };
+}
diff --git a/systems/eldiron/websites/cloud/add-htaccess.php b/systems/eldiron/websites/cloud/add-htaccess.php
new file mode 100644 (file)
index 0000000..e11d943
--- /dev/null
@@ -0,0 +1,70 @@
+<?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";
+  };
+}
diff --git a/systems/eldiron/websites/cloud/default.nix b/systems/eldiron/websites/cloud/default.nix
new file mode 100644 (file)
index 0000000..e1df883
--- /dev/null
@@ -0,0 +1,151 @@
+{ lib, pkgs, config,  ... }:
+let
+  ncfg = config.myServices.tools.cloud.farm.instances.immae;
+  env = config.myEnv.tools.nextcloud;
+  cfg = config.myServices.websites.tools.cloud;
+in {
+  options.myServices.websites.tools.cloud = {
+    enable = lib.mkEnableOption "enable cloud website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    myServices.dns.zones."immae.eu".subdomains.cloud =
+      with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
+
+    myServices.chatonsProperties.hostings.nextcloud = {
+      file.datetime = "2022-08-21T19:50:00";
+      hosting = {
+        name = "Nextcloud";
+        description = "The self-hosted productivity platform that keeps you in control";
+        website = "https://cloud.immae.eu/";
+        logo = "https://cloud.immae.eu/core/img/favicon.ico";
+        type = "INSTANCE";
+        status.level = "OK";
+        status.description = "OK";
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+    };
+    myServices.chatonsProperties.services.nextcloud = {
+      file.datetime = "2022-08-21T19:50:00";
+      service = {
+        name = "Nextcloud";
+        description = "The self-hosted productivity platform that keeps you in control";
+        website = "https://cloud.immae.eu/";
+        logo = "https://cloud.immae.eu/core/img/favicon.ico";
+        status.level = "OK";
+        status.description = "OK";
+        registration."" = ["MEMBER" "CLIENT"];
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+        guide.user = "https://www.immae.eu/docs/nextcloud.html";
+      };
+      software = {
+        name = "Nextcloud";
+        website = "https://nextcloud.com/";
+        license.url = "https://github.com/nextcloud/server/blob/master/COPYING";
+        license.name = "GNU Affero General Public License v3.0";
+        version = ncfg.rootDir.version;
+        source.url = "https://github.com/nextcloud/server";
+        modules = map (a: a.appName) ncfg.rootDir.apps;
+      };
+    };
+
+    myServices.tools.cloud.farm.instances.immae = {
+      nextcloud = pkgs.webapps-nextcloud_27.override ({
+        # Allow /index.php redirects
+        postInstall = ''
+          cd $out
+          ${pkgs.php81}/bin/php ${./add-htaccess.php} /
+        '';
+      });
+      apps = a: [
+        a.side_menu a.audioplayer a.bookmarks a.calendar a.carnet a.contacts
+        a.cookbook a.deck a.extract a.files_markdown a.files_mindmap
+        a.gpxpod a.keeweb a.maps a.metadata a.music
+        a.notes a.passman a.polls a.spreed a.tasks
+      ];
+      varDir = "/var/lib/nextcloud";
+      secretsPath = "webapps/tools-nextcloud";
+      phpPackage = pkgs.php81;
+      # Be careful when editing that: config from here takes
+      # precedence over the regular one, but if a key got removed, it my
+      # still exist in the default config file
+      config = let
+        env = config.myEnv.tools.nextcloud;
+      in {
+        "dbtype" = "pgsql";
+        "dbname" = env.postgresql.database;
+        "dbhost" = env.postgresql.socket;
+        "dbport" = "";
+        "dbtableprefix" = "oc_";
+        "dbuser" = env.postgresql.user;
+        "dbpassword" = env.postgresql.password;
+
+        "instanceid" = env.instance_id;
+        "passwordsalt" = env.password_salt;
+        "secret" = env.secret;
+
+        "trusted_domains" = [ "cloud.immae.eu" ];
+        "overwrite.cli.url" = "https://cloud.immae.eu";
+
+        "lost_password_link" = "disabled";
+
+        "remember_login_cookie_lifetime" = 60*60*24*30;
+        "session_keepalive" = true;
+        "session_lifefime" = 60*60*24*30;
+
+        "maxZipInputSize" = 0;
+        "allowZipDownload" = true;
+
+        # set by Carnet
+        "has_rebuilt_cache" = true;
+
+        "memcache.distributed" = "\\OC\\Memcache\\Redis";
+        "memcache.locking" = "\\OC\\Memcache\\Redis";
+        "filelocking.enabled" = true;
+        "redis" = {
+          "host" = env.redis.socket;
+          "port" = 0;
+          "dbindex" = env.redis.db;
+        };
+
+        "ldapIgnoreNamingRules" = false;
+        "ldapProviderFactory" = "\\OCA\\User_LDAP\\LDAPProviderFactory";
+
+        "mail_smtpmode" = "sendmail";
+        "mail_smtphost" = "127.0.0.1";
+        "mail_smtpname" = "";
+        "mail_smtppassword" = "";
+        "mail_from_address" = "nextcloud";
+        "mail_smtpauth" = false;
+        "mail_domain" = "tools.immae.eu";
+      };
+    };
+    services.websites.env.tools.modules = [ "proxy_fcgi" ];
+
+    security.acme.certs.eldiron.extraDomainNames = [ "cloud.immae.eu" ];
+    services.websites.env.tools.vhostConfs.cloud = {
+      certName    = "eldiron";
+      hosts       = ["cloud.immae.eu" ];
+      root        = ncfg.rootDir;
+      extraConfig = [
+        ncfg.vhost
+      ];
+    };
+
+    myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
+    myServices.monitoring.fromMasterObjects.service = [
+      {
+        service_description = "owncloud website is running on cloud.immae.eu";
+        host_name = config.hostEnv.fqdn;
+        use = "external-web-service";
+        check_command = ["check_https" "cloud.immae.eu" "/" "a safe home for all your data"];
+
+        servicegroups = "webstatus-webapps";
+        _webstatus_name = "Nextcloud";
+        _webstatus_url = "https://cloud.immae.eu";
+      }
+    ];
+  };
+}
diff --git a/systems/eldiron/websites/cloud/farm.nix b/systems/eldiron/websites/cloud/farm.nix
new file mode 100644 (file)
index 0000000..df24cba
--- /dev/null
@@ -0,0 +1,221 @@
+{ lib, pkgs, config, ... }:
+let
+  scfg = config.secrets.fullPaths;
+  cfg = config.myServices.tools.cloud.farm;
+  apacheUser = config.services.websites.env.production.user;
+  apacheGroup = config.services.websites.env.production.group;
+  additionalConfs = icfg: lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) icfg.rootDir.otherConfig;
+  overrideConfig = icfg: pkgs.writeText "override.config.php" ''
+    <?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;
+  };
+}
similarity index 63%
rename from modules/private/websites/tools/commento/default.nix
rename to systems/eldiron/websites/commento/default.nix
index c36255b63e487c66b3c7701411df2aa5b7c92f1a..c5131b81587df433d08c21a12bba79d8b7187393 100644 (file)
@@ -12,6 +12,31 @@ in
     enable = lib.mkEnableOption "Enable commento website";
   };
   config = lib.mkIf cfg.enable {
     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";
     secrets.keys = {
       "commento/env" = {
         permissions = "0400";
@@ -31,9 +56,9 @@ in
       };
     };
 
       };
     };
 
+    security.acme.certs.eldiron.extraDomainNames = [ "commento.immae.eu" ];
     services.websites.env.tools.vhostConfs.commento = {
       certName = "eldiron";
     services.websites.env.tools.vhostConfs.commento = {
       certName = "eldiron";
-      addToCerts = true;
       hosts = [ "commento.immae.eu" ];
       root = null;
       extraConfig = [
       hosts = [ "commento.immae.eu" ];
       root = null;
       extraConfig = [
diff --git a/systems/eldiron/websites/cryptpad/default.nix b/systems/eldiron/websites/cryptpad/default.nix
new file mode 100644 (file)
index 0000000..4635548
--- /dev/null
@@ -0,0 +1,89 @@
+{ config, pkgs, lib, ... }:
+let
+  cfg = config.myServices.websites.tools.cryptpad;
+  envCfg = config.myEnv.tools.cryptpad;
+  domain = "cryptpad.immae.eu";
+  port = envCfg.port;
+  configFile = pkgs.writeText "config.js" ''
+    // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js
+    module.exports = {
+      httpUnsafeOrigin: 'https://${domain}',
+      httpPort: ${toString port},
+      adminEmail: '${envCfg.email}',
+      filePath: './datastore/',
+      archivePath: './data/archive',
+      pinPath: './data/pins',
+      taskPath: './data/tasks',
+      blockPath: './block',
+      blobPath: './blob',
+      blobStagingPath: './data/blobstage',
+      decreePath: './data/decrees',
+      logPath: './data/logs',
+      logToStdout: false,
+      logLevel: 'info',
+      logFeedback: false,
+      verbose: false,
+      inactiveTime: false,
+      maxUploadSize: 100 * 1024 * 1024,
+      adminKeys: ${builtins.toJSON envCfg.admins},
+    };
+  '';
+in
+{
+  options.myServices.websites.tools.cryptpad.enable = lib.mkEnableOption "Enable Cryptpad";
+  config = lib.mkIf cfg.enable {
+    myServices.dns.zones."immae.eu".subdomains.cryptpad =
+      with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
+
+    myServices.chatonsProperties.hostings.cryptpad = {
+      file.datetime = "2022-08-21T01:20:00";
+      hosting = {
+        name = "Cryptpad";
+        description = "Collaboration suite, encrypted and open-source";
+        website = "https://cryptpad.immae.eu/";
+        logo = "https://cryptpad.immae.eu/customize/favicon/main-favicon.png";
+        type = "INSTANCE";
+        status.level = "OK";
+        status.description = "OK";
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+    };
+    myServices.chatonsProperties.services.cryptpad = {
+      file.datetime = "2022-08-21T01:20:00";
+      service = {
+        name = "Cryptpad";
+        description = "Collaboration suite, encrypted and open-source";
+        website = "https://cryptpad.immae.eu/";
+        logo = "https://cryptpad.immae.eu/customize/favicon/main-favicon.png";
+        status.level = "OK";
+        status.description = "OK";
+        registration."" = ["NONE" "FREE" "MEMBER" "CLIENT"];
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+      software = {
+        name = "Cryptpad";
+        website = "https://cryptpad.org/";
+        license.url = "https://github.com/xwiki-labs/cryptpad/blob/main/LICENSE";
+        license.name = "GNU Affero General Public License v3.0";
+        version = pkgs.cryptpad.version;
+        source.url = "https://github.com/xwiki-labs/cryptpad";
+      };
+    };
+    myServices.tools.cryptpad.farm.hosts.immaeEu = {
+      inherit domain port;
+      config = configFile;
+    };
+    services.websites.env.tools.modules = [ "proxy_wstunnel" ];
+    security.acme.certs.eldiron.extraDomainNames = [ domain ];
+    services.websites.env.tools.vhostConfs.cryptpad = {
+      certName = "eldiron";
+      hosts = [domain];
+      root = config.myServices.tools.cryptpad.farm.vhostRoots.immaeEu;
+      extraConfig = [
+        config.myServices.tools.cryptpad.farm.vhosts.immaeEu
+      ];
+    };
+  };
+}
similarity index 96%
rename from modules/private/websites/tools/cryptpad/farm.nix
rename to systems/eldiron/websites/cryptpad/farm.nix
index b35f348fb4abfd3afa8b60e2edc7463e70a5e7c8..58393ab32ac127c3c79681f90ceb4a0fa2e54d73 100644 (file)
@@ -161,6 +161,12 @@ in
       type = lib.types.attrsOf lib.types.path;
       default = lib.genAttrs (builtins.attrNames cfg.hosts) toVhostRoot;
     };
       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 != {}) {
   };
   config = {
     users.users = lib.optionalAttrs (cfg.hosts != {}) {
similarity index 93%
rename from modules/private/websites/tools/dav/davical.nix
rename to systems/eldiron/websites/dav/davical.nix
index bc5ecf695bf5aed35d303ce199d5d0503f70c71e..b418cb8359c367536e8f0f0ccd19020aac2c98af 100644 (file)
@@ -1,11 +1,5 @@
 { stdenv, fetchurl, gettext, writeText, env, awl, davical, config }:
 rec {
 { 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;
   keys."webapps/dav-davical" = {
     user = apache.user;
     group = apache.group;
@@ -120,9 +114,10 @@ rec {
 
       # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "DavicalPHPSESSID";
 
       # 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[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";
       "php_flag[magic_quotes_gpc]" = "Off";
       "php_flag[register_globals]" = "Off";
       "php_admin_value[error_reporting]" = "E_ALL & ~E_NOTICE";
diff --git a/systems/eldiron/websites/dav/default.nix b/systems/eldiron/websites/dav/default.nix
new file mode 100644 (file)
index 0000000..109715d
--- /dev/null
@@ -0,0 +1,140 @@
+{ 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";
+      }
+    ];
+  };
+}
+
diff --git a/systems/eldiron/websites/db/default.nix b/systems/eldiron/websites/db/default.nix
new file mode 100644 (file)
index 0000000..339948f
--- /dev/null
@@ -0,0 +1,32 @@
+{ lib, pkgs, config,  ... }:
+let
+    cfg = config.myServices.websites.tools.db;
+in {
+  options.myServices.websites.tools.db = {
+    enable = lib.mkEnableOption "enable database's website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    services.websites.env.tools.modules = [ "proxy_fcgi" ];
+    security.acme.certs.eldiron.extraDomainNames = [ "db-1.immae.eu" ];
+    services.websites.env.tools.vhostConfs.db-1 = {
+      certName    = "eldiron";
+      hosts       = ["db-1.immae.eu" ];
+      root        = null;
+      extraConfig = [ ''
+        Alias /adminer ${pkgs.webapps-adminer}
+        <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>
+        ''
+      ];
+    };
+  };
+}
similarity index 73%
rename from modules/private/websites/default.nix
rename to systems/eldiron/websites/default.nix
index 4864034990d81cefb848fc5042a039fb401dc145..68205deebf4ce5b15d6f0e0681fb0708f38b6172 100644 (file)
@@ -1,8 +1,14 @@
-{ lib, pkgs, config, ... }:
+{ lib, pkgs, config, mypackages-lib, ... }:
 let
   www_root = ./_www;
 let
   www_root = ./_www;
-  theme_root = pkgs.webapps.apache-theme.theme;
+  theme_root = (mypackages-lib.apache-theme {}).theme;
   apacheConfig = {
   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:
     cache = {
       # This setting permits to ignore time-based cache for files in the
       # nix store:
@@ -73,7 +79,7 @@ let
       '';
     };
     apaxy = {
       '';
     };
     apaxy = {
-      extraConfig = (pkgs.webapps.apache-theme.override { inherit theme_root; }).apacheConfig;
+      extraConfig = (mypackages-lib.apache-theme { inherit theme_root; }).apacheConfig;
     };
     http2 = {
       modules = [ "http2" ];
     };
     http2 = {
       modules = [ "http2" ];
@@ -99,9 +105,69 @@ let
     lib.imap0 (i: e: ''Header always set "X-Moomin-${pad 2 (builtins.toString i)}" "${e}"'') lines;
 in
 {
     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 {
   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 ];
 
     users.users.wwwrun.extraGroups = [ "keys" ];
     networking.firewall.allowedTCPPorts = [ 80 443 ];
 
@@ -144,17 +210,19 @@ in
       };
     };
 
       };
     };
 
-    services.filesWatcher.httpdProd.paths = [ config.secrets.fullPaths."apache-ldap" ];
-    services.filesWatcher.httpdInte.paths = [ config.secrets.fullPaths."apache-ldap" ];
-    services.filesWatcher.httpdTools.paths = [ config.secrets.fullPaths."apache-ldap" ];
-
     services.websites.env.production = {
       enable = true;
     services.websites.env.production = {
       enable = true;
+      moduleType = "container";
       adminAddr = "httpd@immae.eu";
       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;
       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 = {
       modules = makeModules;
       extraConfig = makeExtraConfig;
       fallbackVhost = {
@@ -167,28 +235,34 @@ in
 
     services.websites.env.integration = {
       enable = true;
 
     services.websites.env.integration = {
       enable = true;
+      moduleType = "container";
       adminAddr = "httpd@immae.eu";
       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;
       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 = {
       modules = makeModules;
       extraConfig = makeExtraConfig ++ moomin;
       fallbackVhost = {
-        certName    = "eldiron";
+        certName    = "integration";
         hosts       = ["eldiron.immae.eu" ];
         root        = www_root;
         extraConfig = [ "DirectoryIndex index.htm" ];
       };
         hosts       = ["eldiron.immae.eu" ];
         root        = www_root;
         extraConfig = [ "DirectoryIndex index.htm" ];
       };
+      watchPaths = [ config.secrets.fullPaths."apache-ldap" ];
     };
 
     services.websites.env.tools = {
       enable = true;
     };
 
     services.websites.env.tools = {
       enable = true;
+      moduleType = "main";
       adminAddr = "httpd@immae.eu";
       adminAddr = "httpd@immae.eu";
-      httpdName = "Tools";
       ips =
         let ips = config.myEnv.servers.eldiron.ips.main;
       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 ++
         [ ''
       modules = makeModules;
       extraConfig = makeExtraConfig ++
         [ ''
@@ -203,6 +277,7 @@ in
       nosslVhost = {
         enable = true;
         host = "nossl.immae.eu";
       nosslVhost = {
         enable = true;
         host = "nossl.immae.eu";
+        root = ./nossl;
       };
       fallbackVhost = {
         certName    = "eldiron";
       };
       fallbackVhost = {
         certName    = "eldiron";
@@ -210,96 +285,15 @@ in
         root        = www_root;
         extraConfig = [ "DirectoryIndex index.htm" ];
       };
         root        = www_root;
         extraConfig = [ "DirectoryIndex index.htm" ];
       };
+      watchPaths = [ config.secrets.fullPaths."apache-ldap" ];
     };
 
     myServices.websites = {
     };
 
     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;
       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.assets.enable = true;
       tools.cloud.enable = true;
       tools.commento.enable = true;
@@ -316,6 +310,7 @@ in
       tools.tools.enable = true;
       tools.email.enable = true;
       tools.stats.enable = false;
       tools.tools.enable = true;
       tools.email.enable = true;
       tools.stats.enable = false;
+      tools.visio.enable = true;
 
       games.codenames.enable = true;
       games.terraforming-mars.enable = true;
 
       games.codenames.enable = true;
       games.terraforming-mars.enable = true;
similarity index 73%
rename from modules/private/websites/tools/diaspora/default.nix
rename to systems/eldiron/websites/diaspora/default.nix
index 3a115ed1f82e7bc076dc6ae4da3adca695012af5..c5364466ef0f48859be9e0a1e4faf25eb85b9cd0 100644 (file)
@@ -10,6 +10,31 @@ in {
   };
 
   config = lib.mkIf cfg.enable {
   };
 
   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 = {
     users.users.diaspora.extraGroups = [ "keys" ];
 
     secrets.keys = {
@@ -23,6 +48,7 @@ in {
         user = "diaspora";
         group = "diaspora";
         permissions = "0400";
         user = "diaspora";
         group = "diaspora";
         permissions = "0400";
+        keyDependencies = [ pkgs.cacert ];
         text = ''
         configuration:
           environment:
         text = ''
         configuration:
           environment:
@@ -142,7 +168,7 @@ in {
 
     services.diaspora = {
       enable = true;
 
     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";
       dataDir = "/var/lib/diaspora_immae";
       adminEmail = "diaspora@tools.immae.eu";
       configDir = config.secrets.fullPaths."webapps/diaspora";
@@ -156,9 +182,9 @@ in {
     services.websites.env.tools.modules = [
       "headers" "proxy" "proxy_http"
     ];
     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";
     services.websites.env.tools.vhostConfs.diaspora = {
       certName    = "eldiron";
-      addToCerts  = true;
       hosts       = [ "diaspora.immae.eu" ];
       root        = root;
       extraConfig = [ ''
       hosts       = [ "diaspora.immae.eu" ];
       root        = root;
       extraConfig = [ ''
@@ -181,5 +207,18 @@ in {
         </Directory>
       '' ];
     };
         </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/";
+      }
+    ];
   };
 }
   };
 }
similarity index 79%
rename from modules/private/websites/tools/ether/default.nix
rename to systems/eldiron/websites/ether/default.nix
index 0539095e11e7c165b57d39272e25f754685f2381..3993553319c150c56505c40813655abf20f5d0b2 100644 (file)
@@ -1,10 +1,10 @@
-{ lib, pkgs, config,  ... }:
+{ lib, pkgs, config, nixpkgsRaw, etherpad-lite, ... }:
 let
   env = config.myEnv.tools.etherpad-lite;
   cfg = config.myServices.websites.tools.etherpad-lite;
   # Make sure we’re not rebuilding whole libreoffice just because of a
   # dependency
 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 = {
   ecfg = config.services.etherpad-lite;
 in {
   options.myServices.websites.tools.etherpad-lite = {
@@ -12,6 +12,32 @@ in {
   };
 
   config = lib.mkIf cfg.enable {
   };
 
   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";
     secrets.keys = {
       "webapps/tools-etherpad-apikey" = {
         permissions = "0400";
@@ -23,6 +49,7 @@ in {
       };
       "webapps/tools-etherpad" = {
         permissions = "0400";
       };
       "webapps/tools-etherpad" = {
         permissions = "0400";
+        keyDependencies = [ libreoffice ];
         text = ''
           {
             "title": "Etherpad",
         text = ''
           {
             "title": "Etherpad",
@@ -61,7 +88,7 @@ in {
             "requireSession" : false,
             "editOnly" : false,
             "sessionNoPassword" : false,
             "requireSession" : false,
             "editOnly" : false,
             "sessionNoPassword" : false,
-            "minify" : true,
+            "minify" : false,
             "maxAge" : 21600,
             "abiword" : null,
             "soffice" : "${libreoffice}/bin/soffice",
             "maxAge" : 21600,
             "abiword" : null,
             "soffice" : "${libreoffice}/bin/soffice",
@@ -69,7 +96,7 @@ in {
             "allowUnknownFileEnds" : true,
             "requireAuthentication" : false,
             "requireAuthorization" : false,
             "allowUnknownFileEnds" : true,
             "requireAuthentication" : false,
             "requireAuthorization" : false,
-            "trustProxy" : false,
+            "trustProxy" : true,
             "disableIPlogging" : false,
             "automaticReconnectionTimeout" : 0,
             "scrollWhenFocusLineIsOutOfViewport": {
             "disableIPlogging" : false,
             "automaticReconnectionTimeout" : 0,
             "scrollWhenFocusLineIsOutOfViewport": {
@@ -150,7 +177,7 @@ in {
     };
     services.etherpad-lite = {
       enable = true;
     };
     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
         p.ep_align p.ep_bookmark p.ep_colors p.ep_comments_page
         p.ep_cursortrace p.ep_delete_empty_pads p.ep_embedmedia
         p.ep_font_size p.ep_headings2 p.ep_immae_buttons p.ep_ldapauth
@@ -166,6 +193,7 @@ in {
     };
 
     systemd.services.etherpad-lite.serviceConfig.SupplementaryGroups = "keys";
     };
 
     systemd.services.etherpad-lite.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 ];
 
     # Needed so that they get in the closure
     systemd.services.etherpad-lite.path = [ libreoffice pkgs.html-tidy ];
 
@@ -177,9 +205,9 @@ in {
     services.websites.env.tools.modules = [
       "headers" "proxy" "proxy_http" "proxy_wstunnel"
     ];
     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";
     services.websites.env.tools.vhostConfs.etherpad-lite = {
       certName    = "eldiron";
-      addToCerts  = true;
       hosts       = [ "ether.immae.eu" ];
       root        = null;
       extraConfig = [ ''
       hosts       = [ "ether.immae.eu" ];
       root        = null;
       extraConfig = [ ''
@@ -188,12 +216,6 @@ in {
 
         RewriteEngine On
 
 
         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]
         RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
         RewriteCond %{QUERY_STRING} transport=websocket    [NC]
         RewriteRule /(.*)           unix://${ecfg.sockets.node}|ws://ether.immae.eu/$1 [P,NE,QSA,L]
@@ -212,5 +234,18 @@ in {
         </IfModule>
       '' ];
     };
         </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/";
+      }
+    ];
   };
 }
   };
 }
similarity index 58%
rename from modules/private/websites/tools/games/codenames/default.nix
rename to systems/eldiron/websites/games/codenames/default.nix
index 25eb62de6f13072e2abc7be58692aebdf7a0ad82..7f09cc33513a5aa33dd4f2afc94d67bfd546c42c 100644 (file)
@@ -11,6 +11,31 @@ in
 {
   options.myServices.websites.games.codenames.enable = lib.mkEnableOption "Enable Codenames game";
   config = lib.mkIf cfg.enable {
 {
   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" ];
     systemd.services.codenames_api = {
       description = "Api for codenames game";
       wantedBy = [ "multi-user.target" ];
@@ -30,9 +55,10 @@ in
       };
     };
 
       };
     };
 
+    security.acme.certs.games.domain = "games.immae.eu";
+    security.acme.certs.games.extraDomainNames = [ "codenames.games.immae.eu" ];
     services.websites.env.tools.vhostConfs.games_codenames = {
       certName = "games";
     services.websites.env.tools.vhostConfs.games_codenames = {
       certName = "games";
-      certMainHost = "games.immae.eu";
       hosts = [ "codenames.games.immae.eu" ];
       root = frontend;
       extraConfig = [
       hosts = [ "codenames.games.immae.eu" ];
       root = frontend;
       extraConfig = [
diff --git a/systems/eldiron/websites/games/codenames/immae-assets.patch b/systems/eldiron/websites/games/codenames/immae-assets.patch
new file mode 100644 (file)
index 0000000..c53ab97
--- /dev/null
@@ -0,0 +1,15 @@
+diff --git a/src/index.html b/src/index.html
+index 2559a37..84a0d64 100644
+--- a/src/index.html
++++ b/src/index.html
+@@ -6,8 +6,8 @@
+     <meta name="description" content="Online cooperative codenames game. Play with two or more players.">
+     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
+     <meta name="theme-color" content="#ffffff">
+-    <link href="https://fonts.googleapis.com/css?family=Exo+2&display=swap" rel="stylesheet">
+-    <link href="https://unpkg.com/ionicons@4.5.10-0/dist/css/ionicons.min.css" rel="stylesheet">
++    <link href="https://assets.immae.eu/fonts/Exo2_swap/font.css" rel="stylesheet">
++    <link href="https://assets.immae.eu/ionicons/4.5.10-0/dist/css/ionicons.min.css" rel="stylesheet">
+     <link rel="manifest" href="/codenames.manifest">
+       <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png">
+       <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png">
similarity index 99%
rename from modules/private/websites/tools/games/codenames/node-packages.nix
rename to systems/eldiron/websites/games/codenames/node-packages.nix
index 02595c5ece6601245fed70af7f104904fb0f7521..1fb2db3c079cdbbe2c8de21f70ff8d87f5d51dd7 100644 (file)
@@ -6448,6 +6448,7 @@ let
         chmod -R u+w $out
         cd $out
         patch -p1 < ${./codenames.patch}
         chmod -R u+w $out
         cd $out
         patch -p1 < ${./codenames.patch}
+        patch -p1 < ${./immae-assets.patch}
       '';
     dependencies = [
       sources."@babel/code-frame-7.0.0"
       '';
     dependencies = [
       sources."@babel/code-frame-7.0.0"
similarity index 51%
rename from modules/private/websites/tools/games/terraforming-mars/default.nix
rename to systems/eldiron/websites/games/terraforming-mars/default.nix
index 0df5363ae42fba9f2470ebb5561c853c3b290c3a..e90e72fb82bf3c84c830ab2d60958f99182e4da7 100644 (file)
@@ -6,8 +6,32 @@ in
 {
   options.myServices.websites.games.terraforming-mars.enable = lib.mkEnableOption "Enable Terraforming mars game";
   config = lib.mkIf cfg.enable {
 {
   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 = {
     systemd.services.terraforming-mars = {
-      path = [ pkgs.nodejs pkgs.bashInteractive ];
+      path = [ pkgs.nodejs_16 pkgs.bashInteractive ];
       description = "Terraforming mars game";
       wantedBy = [ "multi-user.target" ];
       script = ''
       description = "Terraforming mars game";
       wantedBy = [ "multi-user.target" ];
       script = ''
@@ -21,6 +45,8 @@ in
         chown :wwwrun /run/terraforming-mars/socket.sock
         chmod g+w /run/terraforming-mars/socket.sock
       '';
         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;
       serviceConfig = {
         User = "terraformingmars";
         DynamicUser = true;
@@ -32,9 +58,10 @@ in
       };
     };
 
       };
     };
 
+    security.acme.certs.games.extraDomainNames = [ "terraforming-mars.games.immae.eu" ];
+    security.acme.certs.games.domain = "games.immae.eu";
     services.websites.env.tools.vhostConfs.games_terraforming-mars = {
       certName = "games";
     services.websites.env.tools.vhostConfs.games_terraforming-mars = {
       certName = "games";
-      certMainHost = "games.immae.eu";
       hosts = [ "terraforming-mars.games.immae.eu" ];
       root = null;
       extraConfig = [
       hosts = [ "terraforming-mars.games.immae.eu" ];
       root = null;
       extraConfig = [
diff --git a/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch b/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch
new file mode 100644 (file)
index 0000000..684a7df
--- /dev/null
@@ -0,0 +1,13 @@
+diff --git a/assets/index.html b/assets/index.html
+index 220192834..d77a0fc80 100644
+--- a/assets/index.html
++++ b/assets/index.html
+@@ -2,7 +2,7 @@
+ <html>
+     <head>
+         <link
+-            href="https://fonts.googleapis.com/css?family=Ubuntu&display=swap"
++            href="https://assets.immae.eu/fonts/Ubuntu_swap/font.css"
+             rel="stylesheet"
+         />
+         <link rel="stylesheet" type="text/css" media="all" href="/styles.css" />
similarity index 73%
rename from modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix
rename to systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix
index 502a553007a3abd7cb5f14fc9a05ca10e31a933d..f190221a9207c260b37a9a34ac13827e0373ead5 100644 (file)
@@ -1,4 +1,4 @@
-{ fetchgit, runCommand, callPackage, mylibs, nodePackages, nodejs, git }:
+{ fetchgit, runCommand, callPackage, mylibs, nodePackages, nodejs_16, git }:
 let
   source = fetchgit {
     url = "https://github.com/bafolts/terraforming-mars";
 let
   source = fetchgit {
     url = "https://github.com/bafolts/terraforming-mars";
@@ -14,16 +14,19 @@ let
   '';
   packages = callPackage ./node-packages.nix {
     src = patchedSource;
   '';
   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" {
   };
   terraforming-mars = runCommand "terraforming-mars" {
-    buildInputs = [ nodejs git ];
+    buildInputs = [ nodejs_16 git ];
   } ''
     cp -r ${source} ./source
     chmod -R u+w source
     cd source
   } ''
     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 .
     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/
     npm run build
     mkdir $out
     cp -a build $out/
diff --git a/systems/eldiron/websites/git/cgit_js.html b/systems/eldiron/websites/git/cgit_js.html
new file mode 100644 (file)
index 0000000..4101071
--- /dev/null
@@ -0,0 +1,16 @@
+<script src="https://assets.immae.eu/jquery/3.5.1/jquery.min.js"></script>
+<script type="application/javascript">
+  $(document).ready(function() {
+    const linksObject = {
+      "/github/fretlink": "Fretlink Open-source Github forks",
+      "/github": "Github forks",
+      "/perso/Denise": "Denise",
+      "/perso/Immae": "Immae",
+    }
+    function toRow(href, name) {
+      return `<a href='/cgit${href}'>${name}</a>`;
+    }
+    const links = Object.keys(linksObject).map(function(k) { return toRow(k, linksObject[k]); }).join("");
+    $("table.tabs a.active[href='/cgit/']").after(links);
+  });
+</script>
diff --git a/systems/eldiron/websites/git/default.nix b/systems/eldiron/websites/git/default.nix
new file mode 100644 (file)
index 0000000..46ba34d
--- /dev/null
@@ -0,0 +1,98 @@
+{ lib, pkgs, config, ... }:
+let
+    mantisbt = pkgs.callPackage ./mantisbt.nix {
+      mantisbt_2 = pkgs.webapps-mantisbt_2;
+      mantisbt_2-plugins = pkgs.webapps-mantisbt_2-plugins;
+      env = config.myEnv.tools.mantisbt;
+      inherit config;
+    };
+    gitweb = pkgs.callPackage ./gitweb.nix {
+      gitoliteDir = config.myServices.gitolite.gitoliteDir;
+    };
+
+    cfg = config.myServices.websites.tools.git;
+in {
+  options.myServices.websites.tools.git = {
+    enable = lib.mkEnableOption "enable git's website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    myServices.chatonsProperties.services.mantisbt = {
+      file.datetime = "2022-08-21T10:08:00";
+      service = {
+        name = "MantisBT";
+        description = "Mantis Bug Tracker";
+        website = "https://git.immae.eu/mantisbt";
+        logo = "https://git.immae.eu/mantisbt/images/favicon.ico";
+        status.level = "OK";
+        status.description = "OK";
+        registration."" = ["MEMBER" "CLIENT"];
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+        guide.user = "https://www.immae.eu/docs/forge-logicielle.html";
+      };
+      software = {
+        name = "MantisBT";
+        website = "https://mantisbt.org/";
+        license.url = "https://opensource.org/licenses/gpl-license";
+        license.name = "GNU General Public License";
+        version = mantisbt.webRoot.version;
+        source.url = "https://github.com/mantisbt/mantisbt";
+        modules = mantisbt.webRoot.pluginNames;
+      };
+    };
+    secrets.keys = mantisbt.keys;
+    services.websites.env.tools.modules =
+      gitweb.apache.modules ++
+      mantisbt.apache.modules;
+
+    security.acme.certs.eldiron.extraDomainNames = [ "git.immae.eu" ];
+    services.websites.env.tools.vhostConfs.git = {
+      certName    = "eldiron";
+      hosts       = ["git.immae.eu" ];
+      root        = gitweb.apache.root;
+      extraConfig = [
+        gitweb.apache.vhostConf
+        (mantisbt.apache.vhostConf config.services.phpfpm.pools.mantisbt.socket)
+        ''
+          RewriteEngine on
+          RewriteCond %{REQUEST_URI}       ^/releases
+          RewriteRule /releases(.*)        https://release.immae.eu$1 [P,L]
+          ''
+      ];
+    };
+    services.phpfpm.pools = {
+      mantisbt = {
+        user = config.services.websites.env.tools.user;
+        group = config.services.websites.env.tools.group;
+        settings = mantisbt.phpFpm.pool;
+        phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
+      };
+    };
+
+    myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
+    myServices.monitoring.fromMasterObjects.service = [
+      {
+        service_description = "gitweb website is running on git.immae.eu";
+        host_name = config.hostEnv.fqdn;
+        use = "external-web-service";
+        check_command = ["check_https" "git.immae.eu" "/cgit" "<title>Immae’s git"];
+
+        servicegroups = "webstatus-webapps";
+        _webstatus_name = "Git";
+        _webstatus_url = "https://git.immae.eu/";
+      }
+
+      {
+        service_description = "mantisbt website is running on git.immae.eu";
+        host_name = config.hostEnv.fqdn;
+        use = "external-web-service";
+        check_command = ["check_https" "git.immae.eu" "/mantisbt/" "<title>My View - MantisBT"];
+
+        servicegroups = "webstatus-webapps";
+        _webstatus_name = "Mantisbt";
+        _webstatus_url = "https://git.immae.eu/mantisbt";
+      }
+    ];
+  };
+}
similarity index 95%
rename from modules/private/websites/tools/git/gitweb.nix
rename to systems/eldiron/websites/git/gitweb.nix
index ff34da51f8e577afba64acb8089e897f5b50d619..40f99e061fb4e3f91f05ccdb644235d1f2722bc9 100644 (file)
@@ -41,6 +41,7 @@ rec {
     css=/cgit-css/cgit.css
     logo=/cgit-css/cgit.png
     favicon=/cgit-css/favicon.ico
     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
 
     root-title=Immae’s git
     root-desc=To go back to the old interface: https://git.immae.eu/?old
@@ -114,6 +115,10 @@ rec {
       RewriteEngine On
       RewriteCond %{QUERY_STRING} ^$
       RewriteRule ^/?$ /cgit [L,R=302]
       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]
       '';
   };
 }
       '';
   };
 }
similarity index 89%
rename from modules/private/websites/tools/git/mantisbt.nix
rename to systems/eldiron/websites/git/mantisbt.nix
index 2ef76afe0637a4edd1b5c4ce48cae2fbf615fe64..3bd78e13980f31212655c5ca1e9953bca82025c2 100644 (file)
@@ -1,11 +1,5 @@
 { env, mantisbt_2, mantisbt_2-plugins, config }:
 rec {
 { 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;
   keys."webapps/tools-mantisbt" = {
     user = apache.user;
     group = apache.group;
@@ -84,8 +78,9 @@ rec {
 
       "php_admin_value[upload_max_filesize]" = "5000000";
 
 
       "php_admin_value[upload_max_filesize]" = "5000000";
 
-      "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/mantisbt";
-      "php_admin_value[session.save_path]" = "/var/lib/php/sessions/mantisbt";
+      "php_admin_value[open_basedir]" = "${basedir}:/tmp";
+      "php_admin_value[session.save_handler]" = "redis";
+      "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:MantisBT:'";
     };
   };
 }
     };
   };
 }
diff --git a/systems/eldiron/websites/im/default.nix b/systems/eldiron/websites/im/default.nix
new file mode 100644 (file)
index 0000000..7755a5c
--- /dev/null
@@ -0,0 +1,118 @@
+{ config, lib, pkgs, ... }:
+let
+  cfg = config.myServices.websites.tools.im;
+  converseVersion = "9.1.1";
+  www = pkgs.runCommand "www" {} ''
+    cp -a ${./www} $out
+    substituteInPlace $out/converse.html --replace {{converseVersion}} ${converseVersion}
+  '';
+in
+{
+  options.myServices.websites.tools.im = {
+    enable = lib.mkEnableOption "enable im website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    myServices.chatonsProperties.services.converse = {
+      file.datetime = "2022-08-21T19:20:00";
+      service = {
+        name = "Converse";
+        description = "A free and open-source XMPP chat client in your browser";
+        website = "https://im.immae.fr/converse";
+        logo = "https://conversejs.org/docs/html/_static/favicon.ico";
+        status.level = "OK";
+        status.description = "OK";
+        registration."" = ["NONE" "FREE"];
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+      software = {
+        name = "Converse";
+        website = "https://conversejs.org/";
+        license.name = "Mozilla Public License 2.0";
+        license.url = "https://github.com/conversejs/converse.js/blob/master/LICENSE";
+        version = "9.1.1";
+        source.url = "https://github.com/conversejs/converse.js";
+      };
+    };
+    myServices.chatonsProperties.services.weechat-bridge = {
+      file.datetime = "2022-08-21T19:20:00";
+      service = {
+        name = "Weechat bridge";
+        description = "WeeChat web frontend";
+        website = "https://im.immae.fr/glowing-bear";
+        logo = "https://im.immae.fr/glowing-bear/assets/img/glowing_bear_128x128.png";
+        status.level = "OK";
+        status.description = "OK";
+        registration."" = ["NONE" "FREE"];
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+      software = {
+        name = "Glowing bear";
+        website = "https://www.ejabberd.im/";
+        license.name = "GNU General Public License v3.0";
+        license.url = "https://github.com/processone/ejabberd";
+        version = pkgs.glowing-bear.version;
+        source.url = "https://github.com/glowing-bear/glowing-bear";
+      };
+    };
+    myServices.chatonsProperties.services.xmpp = {
+      file.datetime = "2022-08-21T19:20:00";
+      service = {
+        name = "XMPP";
+        description = "Universal messaging standard";
+        website = "https://im.immae.fr/";
+        logo = "https://xmpp.org/favicon-32x32.png";
+        status.level = "OK";
+        status.description = "OK";
+        registration."" = ["MEMBER" "CLIENT"];
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+      software = {
+        name = "ejabberd";
+        website = "https://www.ejabberd.im/";
+        license.url = "https://github.com/processone/ejabberd/blob/master/COPYING";
+        license.name = "GNU GENERAL PUBLIC LICENSE Version 2";
+        version = pkgs.ejabberd.version;
+        source.url = "https://github.com/processone/ejabberd";
+        modules = "converse";
+      };
+    };
+    security.acme.certs.eldiron.extraDomainNames = [ "im.immae.fr" ];
+    services.websites.env.tools.vhostConfs.im = {
+      certName   = "eldiron";
+      hosts      = ["im.immae.fr"];
+      root       = www;
+      extraConfig = [
+        ''
+          Alias /glowing-bear ${pkgs.glowing-bear}
+          Alias /converse ${www}/converse.html
+          ProxyPreserveHost On
+          <Location "/bosh">
+            ProxyPass http://localhost:5280/bosh
+            ProxyPassReverse http://localhost:5280/bosh
+          </Location>
+          <Location "/ws">
+            ProxyPass ws://localhost:5280/ws
+          </Location>
+          ProxyPass /upload http://localhost:5280/upload
+          ProxyPassReverse /upload http://localhost:5280/upload
+          ProxyPass /admin http://localhost:5280/admin
+          ProxyPassReverse /admin http://localhost:5280/admin
+          ProxyPass /api http://localhost:5280/api
+          ProxyPassReverse /api http://localhost:5280/api
+          <Directory ${pkgs.glowing-bear}>
+            AllowOverride none
+            Require all granted
+          </Directory>
+          <Directory ${www}>
+            Require all granted
+            AllowOverride none
+          </Directory>
+          ''
+      ];
+    };
+  };
+}
similarity index 90%
rename from modules/private/websites/tools/im/www/converse.html
rename to systems/eldiron/websites/im/www/converse.html
index 936dde4eb3e3689e5d80b7b9e3cf10184d294536..4ca451d7c5326885278554f4e426c353d3240f27 100644 (file)
@@ -8,17 +8,19 @@
                 <meta name="description" content="Converse: An XMPP chat client which can be integrated into any website" />
                 <meta name="keywords" content="xmpp chat webchat converse.js Converse" />
 
                 <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>
                 <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>
                 <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,
                 <script>
                         var md = window.markdownit({
                                 html: true,
@@ -50,8 +52,6 @@
                                 whitelisted_plugins: ['markdown'],
                         });
                 </script>
                                 whitelisted_plugins: ['markdown'],
                         });
                 </script>
-        </head>
-        <body>
         </body>
 </html>
 
         </body>
 </html>
 
similarity index 65%
rename from modules/private/websites/immae/matrix/client
rename to systems/eldiron/websites/immae/matrix/client
index 2769de5f2e214d0f2d17c053f6be9f3d5adb0573..89136a078cebe8954d387b2b3cccc72a5bc0d309 100644 (file)
@@ -4,5 +4,8 @@
     },
     "m.identity_server": {
         "base_url": "https://vector.im"
     },
     "m.identity_server": {
         "base_url": "https://vector.im"
+    },
+    "org.matrix.msc3575.proxy": {
+        "url": "https://immae.ems.host"
     }
 }
     }
 }
similarity index 56%
rename from modules/private/websites/immae/production.nix
rename to systems/eldiron/websites/immae/production.nix
index 8b4998f39c42df7de04fed3539e33cce495433cb..e4060ba4852220ee2cee06359a58800ef0c10fc8 100644 (file)
@@ -2,22 +2,26 @@
 let
   cfg = config.myServices.websites.immae.production;
   varDir = "/var/lib/buildbot/outputs/immae/blog";
 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/";
   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 {
 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"; } ];
 
     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";
     services.websites.env.production.vhostConfs.immae_production = {
       certName     = "immae";
-      addToCerts   = true;
-      certMainHost = "www.immae.eu";
       hosts        = [ "www.immae.eu" "immae.eu" ];
       root         = varDir;
       extraConfig  = [
       hosts        = [ "www.immae.eu" "immae.eu" ];
       root         = varDir;
       extraConfig  = [
@@ -44,13 +48,6 @@ in {
           Require all granted
         </Directory>
 
           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
         Alias /.well-known/matrix ${./matrix}
         <Directory ${./matrix}>
           Options Indexes FollowSymLinks MultiViews Includes
@@ -59,14 +56,6 @@ in {
           Header always set Access-Control-Allow-Origin "*"
         </Directory>
 
           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
         Alias /docs ${docsDir}
         <Directory ${docsDir}>
           DirectoryIndex index.htm index.html
@@ -75,63 +64,44 @@ in {
           Require all granted
         </Directory>
 
           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>
 
           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>
         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
           Options Indexes FollowSymLinks MultiViews Includes
-          AllowOverride All
+          AllowOverride None
           Require all granted
         </Directory>
           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";
+      }
+    ];
   };
 }
   };
 }
similarity index 82%
rename from modules/private/websites/immae/release.nix
rename to systems/eldiron/websites/immae/release.nix
index d06af87d858653a355556fad49c8bfd35fbe968a..4882bac2ec0becee68695f882ab5fd44bf914cbb 100644 (file)
@@ -2,16 +2,17 @@
 let
   cfg = config.myServices.websites.immae.release;
   varDir = "/var/lib/ftp/release.immae.eu";
 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 {
 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"; } ];
 
     services.webstats.sites = [ { name = "release.immae.eu"; } ];
 
+    security.acme.certs.immae.extraDomainNames = [ "release.immae.eu" ];
     services.websites.env.production.vhostConfs.immae_release = {
       certName    = "immae";
     services.websites.env.production.vhostConfs.immae_release = {
       certName    = "immae";
-      addToCerts  = true;
       hosts       = [ "release.immae.eu" ];
       root        = varDir;
       extraConfig = [
       hosts       = [ "release.immae.eu" ];
       root        = varDir;
       extraConfig = [
diff --git a/systems/eldiron/websites/kanboard/farm.nix b/systems/eldiron/websites/kanboard/farm.nix
new file mode 100644 (file)
index 0000000..a70d0d6
--- /dev/null
@@ -0,0 +1,183 @@
+{ lib, pkgs, config, ... }:
+let
+  cfg = config.myServices.tools.kanboard.farm;
+  apacheUser = config.services.websites.env.tools.user;
+  apacheGroup = config.services.websites.env.tools.group;
+  toVardir = name: "/var/lib/kanboard_farm/${name}";
+  varDirs = lib.mapAttrsToList (name: v: toVardir name) cfg.instances;
+  toPhpBaseDir = name: [ rootDir (toVardir name) ];
+  phpBaseDir = builtins.concatStringsSep ":" (lib.unique (lib.flatten (lib.mapAttrsToList (name: v: toPhpBaseDir name) cfg.instances)));
+  rootDir = pkgs.kanboard;
+
+  toVhost = name: ''
+    Alias /${name} "${rootDir}"
+    <Location /${name}>
+      SetEnv DATA_DIR "${toVardir name}"
+      SetEnv MAIL_FROM "kanboard@tools.immae.eu"
+    </Location>
+    '';
+  toCustomVhost = name: lib.optionalAttrs (cfg.instances."${name}".customHost != null) {
+    "kanboard_farm_${name}" = {
+      certName = "eldiron";
+      hosts = [cfg.instances."${name}".customHost];
+      root = null;
+      extraConfig = [
+        ''
+        Alias / "${rootDir}"
+        <Location />
+          SetEnv DATA_DIR "${toVardir name}"
+          SetEnv MAIL_FROM "kanboard@tools.immae.eu"
+        </Location>
+        <Directory "${rootDir}">
+          DirectoryIndex index.php
+          AllowOverride All
+          Options FollowSymlinks
+          Require all granted
+
+          <FilesMatch "\.php$">
+            SetHandler "proxy:unix:${config.services.phpfpm.pools.kanboard_farm.socket}|fcgi://localhost"
+          </FilesMatch>
+        </Directory>
+        <DirectoryMatch "${rootDir}/data">
+          Require all denied
+        </DirectoryMatch>
+          ''
+      ];
+    };
+  };
+  customHosts = lib.filter (n: n != null) (map (n: cfg.instances."${n}".customHost) (builtins.attrNames cfg.instances));
+  customVhosts = lib.foldl (o: n: o // n) {} (map toCustomVhost (builtins.attrNames cfg.instances));
+  phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [all.redis]);
+in
+{
+  options.myServices.tools.kanboard.farm = {
+    instances = lib.mkOption {
+      description = "Instances names for the kanboard Farm";
+      default = {};
+      type = lib.types.attrsOf (lib.types.submodule {
+        options = {
+          customHost = lib.mkOption {
+            description = "Custom host to use for the kanboard instance";
+            default = null;
+            type = lib.types.nullOr lib.types.str;
+          };
+        };
+      });
+    };
+    vhosts = lib.mkOption {
+      description = "Instance vhosts configs";
+      readOnly = true;
+      type = lib.types.attrsOf lib.types.str;
+      default = lib.mapAttrs (name: v: toVhost name) cfg.instances;
+    };
+  };
+
+  config = lib.mkIf (builtins.length (builtins.attrNames cfg.instances) > 0) {
+    myServices.dns.zones."immae.eu".subdomains.kanboard =
+      with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
+
+    myServices.chatonsProperties.hostings.kanboard = {
+      file.datetime = "2022-08-21T19:40:00";
+      hosting = {
+        name = "Kanboard";
+        description = "Kanban project management software";
+        website = "https://tools.immae.eu/kanboard";
+        logo = "https://tools.immae.eu/kanboard/assets/img/favicon.png";
+        type = "INSTANCE";
+        status.level = "OK";
+        status.description = "OK";
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+    };
+    myServices.chatonsProperties.services.kanboard = {
+      file.datetime = "2022-08-21T19:40:00";
+      service = {
+        name = "Kanboard";
+        description = "Kanban project management software";
+        website = "https://tools.immae.eu/kanboard";
+        logo = "https://tools.immae.eu/kanboard/assets/img/favicon.png";
+        status.level = "OK";
+        status.description = "OK";
+        registration."" = ["MEMBER" "CLIENT"];
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+      software = {
+        name = "Kanboard";
+        website = "https://kanboard.org/";
+        license.url = "https://github.com/kanboard/kanboard/blob/main/LICENSE";
+        license.name = "MIT License";
+        version = pkgs.kanboard.version;
+        source.url = "https://github.com/kanboard/kanboard";
+      };
+    };
+    system.activationScripts.kanboard_farm_vardirs = {
+      deps = [ "httpd" ];
+      text = ''
+        install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${builtins.concatStringsSep " " varDirs}
+        '';
+    };
+    services.phpfpm.pools.kanboard_farm = {
+      user = apacheUser;
+      group = apacheGroup;
+      settings = let
+        instanceNb = builtins.length (builtins.attrNames cfg.instances);
+      in {
+        "listen.owner" = apacheUser;
+        "listen.group" = apacheGroup;
+        "pm" = "dynamic";
+        "pm.max_children" = builtins.toString (60 * instanceNb);
+        "pm.start_servers" = builtins.toString (2 * instanceNb);
+        "pm.min_spare_servers" = builtins.toString (2 * instanceNb);
+        "pm.max_spare_servers" = builtins.toString (3 * instanceNb);
+        "pm.process_idle_timeout" = "60";
+
+        "php_admin_value[output_buffering]" = "0";
+        "php_admin_value[max_execution_time]" = "1800";
+        "php_admin_value[zend_extension]" = "opcache";
+        "php_value[apcu.enable_cli]" = "1";
+        "php_value[apcu.enabled]" = "1";
+        #already enabled by default?
+        #"php_value[opcache.enable]" = "1";
+        "php_value[opcache.enable_cli]" = "1";
+        "php_value[opcache.interned_strings_buffer]" = "8";
+        "php_value[opcache.max_accelerated_files]" = "10000";
+        "php_value[opcache.memory_consumption]" = "128";
+        "php_value[opcache.save_comments]" = "1";
+        "php_value[opcache.revalidate_freq]" = "1";
+        "php_admin_value[memory_limit]" = "512M";
+
+        "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${phpBaseDir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp";
+        "php_admin_value[session.save_handler]" = "redis";
+        "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:KanboardFarm:'";
+      };
+      inherit phpPackage;
+    };
+    security.acme.certs.eldiron.extraDomainNames = customHosts ++ [ "kanboard.immae.eu" ];
+    services.websites.env.tools.vhostConfs = {
+      kanboard = {
+        certName = "eldiron";
+        hosts = ["kanboard.immae.eu"];
+        root = null;
+        extraConfig = [
+          ''
+          <Directory "${rootDir}">
+            DirectoryIndex index.php
+            AllowOverride All
+            Options FollowSymlinks
+            Require all granted
+
+            <FilesMatch "\.php$">
+              SetHandler "proxy:unix:${config.services.phpfpm.pools.kanboard_farm.socket}|fcgi://localhost"
+            </FilesMatch>
+          </Directory>
+          <DirectoryMatch "${rootDir}/data">
+            Require all denied
+          </DirectoryMatch>
+            ''
+        ] ++ builtins.attrValues cfg.vhosts;
+      };
+    } // customVhosts;
+  };
+}
diff --git a/systems/eldiron/websites/mail/default.nix b/systems/eldiron/websites/mail/default.nix
new file mode 100644 (file)
index 0000000..0a0342b
--- /dev/null
@@ -0,0 +1,141 @@
+{ lib, pkgs, config,  ... }:
+let
+  roundcubemail = pkgs.callPackage ./roundcubemail.nix {
+    roundcubemail = pkgs.webapps-roundcubemail;
+    env = config.myEnv.tools.roundcubemail;
+    inherit config;
+  };
+  rainloop = pkgs.callPackage ./rainloop.nix {
+    rainloop = pkgs.rainloop-community;
+  };
+  cfg = config.myServices.websites.tools.email;
+  pcfg = config.services.phpfpm.pools;
+in
+{
+  options.myServices.websites.tools.email = {
+    enable = lib.mkEnableOption "enable email website";
+  };
+
+  imports = [
+    ./mta-sts.nix
+  ];
+
+  config = lib.mkIf cfg.enable {
+    #myServices.chatonsProperties.services.mail-rainloop = {
+    #  file.datetime = "2022-08-22T00:30:00";
+    #  service = {
+    #    name = "Rainloop";
+    #    description = "Simple, modern & fast web-based email client";
+    #    website = "https://mail.immae.eu/rainloop";
+    #    logo = "https://www.rainloop.net/static/img/logo-16x16.png";
+    #    status.level = "ERROR";
+    #    status.description = "Stopped due to CVE-2022-29360";
+    #    registration."" = ["MEMBER" "CLIENT"];
+    #    registration.load = "OPEN";
+    #    install.type = "PACKAGE";
+    #  };
+    #  software = {
+    #    name = "Rainloop";
+    #    website = "https://www.rainloop.net/";
+    #    license.url = "https://www.rainloop.net/licensing/";
+    #    license.name = "GNU Affero General Public License v3.0";
+    #    version = rainloop.webRoot.version;
+    #    source.url = "https://github.com/RainLoop/rainloop-webmail";
+    #  };
+    #};
+    #myServices.chatonsProperties.services.mail-roundcube = {
+    #  file.datetime = "2022-08-22T00:30:00";
+    #  service = {
+    #    name = "Roundcube";
+    #    description = "The Roundcube Webmail suite";
+    #    website = "https://mail.immae.eu/roundcube";
+    #    logo = "https://mail.immae.eu/roundcube/skins/elastic/images/favicon.ico";
+    #    status.level = "OK";
+    #    status.description = "OK";
+    #    registration."" = ["MEMBER" "CLIENT"];
+    #    registration.load = "OPEN";
+    #    install.type = "PACKAGE";
+    #  };
+    #  software = {
+    #    name = "Roundcube";
+    #    website = "https://roundcube.net/";
+    #    license.url = "https://github.com/roundcube/roundcubemail/blob/master/LICENSE";
+    #    license.name = "GNU General Public License v3.0";
+    #    version = roundcubemail.webRoot.version;
+    #    source.url = "https://github.com/roundcube/roundcubemail";
+    #    modules = map (a: a.pluginName) roundcubemail.webRoot.plugins ++ map (a: a.skinName) roundcubemail.webRoot.skins;
+    #  };
+    #};
+
+    myServices.dns.zones."immae.eu".subdomains.mail =
+      with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
+
+    secrets.keys = roundcubemail.keys;
+
+    services.websites.env.tools.modules =
+      [ "proxy_fcgi" ]
+      ++ rainloop.apache.modules
+      ++ roundcubemail.apache.modules;
+
+    security.acme.certs.mail.extraDomainNames = [ "mail.immae.eu" ];
+    services.websites.env.tools.vhostConfs.mail = {
+      certName   = "mail";
+      hosts      = ["mail.immae.eu"];
+      root       = ./www;
+      extraConfig = [
+        (rainloop.apache.vhostConf pcfg.rainloop.socket)
+        (roundcubemail.apache.vhostConf pcfg.roundcubemail.socket)
+        ''
+          <Directory ${./www}>
+            Require all granted
+            Options -Indexes
+          </Directory>
+        ''
+      ];
+    };
+    systemd.services = {
+      phpfpm-rainloop = {
+        after = lib.mkAfter rainloop.phpFpm.serviceDeps;
+        wants = rainloop.phpFpm.serviceDeps;
+      };
+      phpfpm-roundcubemail = {
+        after = lib.mkAfter roundcubemail.phpFpm.serviceDeps;
+        wants = roundcubemail.phpFpm.serviceDeps;
+      };
+    };
+
+    services.phpfpm.pools.roundcubemail = {
+      user = "wwwrun";
+      group = "wwwrun";
+      settings = roundcubemail.phpFpm.pool;
+      phpOptions = config.services.phpfpm.phpOptions + ''
+        date.timezone = 'CET'
+      '';
+      phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick all.redis ]);
+    };
+    services.phpfpm.pools.rainloop = {
+      user = "wwwrun";
+      group = "wwwrun";
+      settings = rainloop.phpFpm.pool;
+      phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]);
+    };
+    system.activationScripts = {
+      roundcubemail = roundcubemail.activationScript;
+      rainloop = rainloop.activationScript;
+    };
+    myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
+    myServices.monitoring.fromMasterObjects.service = [
+      {
+        service_description = "roundcube website is running on mail.immae.eu";
+        host_name = config.hostEnv.fqdn;
+        use = "external-web-service";
+        check_command = ["check_https" "mail.immae.eu" "/roundcube/" "<title>Roundcube"];
+
+        servicegroups = "webstatus-webapps,webstatus-email";
+        _webstatus_name = "Roundcube";
+        _webstatus_url = "https://mail.immae.eu/roundcube/";
+      }
+    ];
+  };
+
+}
similarity index 61%
rename from modules/private/websites/tools/mail/mta-sts.nix
rename to systems/eldiron/websites/mail/mta-sts.nix
index 77ba2d4ff653404e1209b7fcec09d8af6eaf21d4..24387027a1e64ca8b8522f0c6e6865e1a5352bd2 100644 (file)
@@ -1,42 +1,30 @@
 { lib, pkgs, config,  ... }:
 let
 { 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);
   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" ]
     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:
     ++ [ "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 {
     ) 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";
     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 = [
         ''
       root = root;
       extraConfig = [
         ''
similarity index 87%
rename from modules/private/websites/tools/mail/rainloop.nix
rename to systems/eldiron/websites/mail/rainloop.nix
index 20e43a17b3286770173abb71f7a9f358bb3fe117..f821005bb1390bc5b30655021f78e5b5f923c9e1 100644 (file)
@@ -5,7 +5,6 @@ rec {
     deps = [ "wrappers" ];
     text = ''
       install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}
     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
     '';
   };
       install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
     '';
   };
@@ -21,7 +20,7 @@ rec {
       DirectoryIndex index.php
       AllowOverride All
       Options -FollowSymlinks
       DirectoryIndex index.php
       AllowOverride All
       Options -FollowSymlinks
-      Require all granted
+      Require all denied
 
       <FilesMatch "\.php$">
         SetHandler "proxy:unix:${socket}|fcgi://localhost"
 
       <FilesMatch "\.php$">
         SetHandler "proxy:unix:${socket}|fcgi://localhost"
@@ -48,7 +47,8 @@ rec {
       "php_admin_value[upload_max_filesize]" = "200M";
       "php_admin_value[post_max_size]" = "200M";
       "php_admin_value[open_basedir]" = "${basedir}:/tmp";
       "php_admin_value[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:'";
     };
   };
 }
     };
   };
 }
similarity index 94%
rename from modules/private/websites/tools/mail/roundcubemail.nix
rename to systems/eldiron/websites/mail/roundcubemail.nix
index 2661b5565f1ca62ad003aec9ff87cb02e8975f36..21a10fe6db77a13629efbefa0bbed6f889f744cf 100644 (file)
@@ -6,7 +6,6 @@ rec {
     text = ''
       install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
         ${varDir}/cache ${varDir}/logs
     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" = {
     '';
   };
   keys."webapps/tools-roundcube" = {
@@ -73,6 +72,7 @@ rec {
         $config['temp_dir'] = '${varDir}/cache';
         $config['mime_types'] = '${apacheHttpd}/conf/mime.types';
     '';
         $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 {
   };
   webRoot = (roundcubemail.override { roundcube_config = config.secrets.fullPaths."webapps/tools-roundcube"; }).withPlugins (p: [ p.automatic_addressbook p.carddav p.contextmenu p.contextmenu_folder p.html5_notifier p.ident_switch p.message_highlight p.thunderbird_labels ]);
   apache = rec {
@@ -112,7 +112,8 @@ rec {
       "php_admin_value[upload_max_filesize]" = "200M";
       "php_admin_value[post_max_size]" = "200M";
       "php_admin_value[open_basedir]" = "${basedir}:${apacheHttpd}/conf/mime.types:/tmp";
       "php_admin_value[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:'";
     };
   };
 }
     };
   };
 }
similarity index 60%
rename from modules/private/websites/tools/mastodon/default.nix
rename to systems/eldiron/websites/mastodon/default.nix
index 173a4b841b14e649dd802ad188322950e25dcb7f..603fc9eaf6aee844089a02edc3dc720d3f6ca9ff 100644 (file)
@@ -3,13 +3,38 @@ let
   env = config.myEnv.tools.mastodon;
   root = "${mcfg.workdir}/public/";
   cfg = config.myServices.websites.tools.mastodon;
   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 {
 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";
     secrets.keys."webapps/tools-mastodon" = {
       user = "mastodon";
       group = "mastodon";
@@ -56,7 +81,7 @@ in {
         LDAP_SEARCH_FILTER="${env.ldap.filter}"
       '';
     };
         LDAP_SEARCH_FILTER="${env.ldap.filter}"
       '';
     };
-    services.mastodon = {
+    immaeServices.mastodon = {
       enable = true;
       configFile = config.secrets.fullPaths."webapps/tools-mastodon";
       socketsPrefix = "live_immae";
       enable = true;
       configFile = config.secrets.fullPaths."webapps/tools-mastodon";
       socketsPrefix = "live_immae";
@@ -79,9 +104,9 @@ in {
     services.websites.env.tools.modules = [
       "headers" "proxy" "proxy_wstunnel" "proxy_http"
     ];
     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";
     services.websites.env.tools.vhostConfs.mastodon = {
       certName    = "eldiron";
-      addToCerts  = true;
       hosts       = ["mastodon.immae.eu" ];
       root        = root;
       extraConfig = [ ''
       hosts       = ["mastodon.immae.eu" ];
       root        = root;
       extraConfig = [ ''
@@ -98,19 +123,19 @@ in {
 
         RewriteEngine On
 
 
         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/(.+)$ 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]
         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}
         ProxyPassReverse / unix://${mcfg.sockets.rails}|http://mastodon.immae.eu/
 
         Alias /system ${mcfg.dataDir}
@@ -132,5 +157,18 @@ in {
         ErrorDocument 504 /500.html
       '' ];
     };
         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/";
+      }
+    ];
   };
 }
   };
 }
similarity index 70%
rename from modules/private/websites/tools/mgoblin/default.nix
rename to systems/eldiron/websites/mgoblin/default.nix
index 1e5f5a0b8e501ca15425c85b2f530e076fb85579..f276c62f4f5d56644f08dba84f4ee56ba226100b 100644 (file)
@@ -1,4 +1,4 @@
-{ lib, pkgs, config,  ... }:
+{ lib, pkgs, config, mediagoblin, ... }:
 let
   env = config.myEnv.tools.mediagoblin;
   cfg = config.myServices.websites.tools.mediagoblin;
 let
   env = config.myEnv.tools.mediagoblin;
   cfg = config.myServices.websites.tools.mediagoblin;
@@ -9,6 +9,32 @@ in {
   };
 
   config = lib.mkIf cfg.enable {
   };
 
   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";
     secrets.keys."webapps/tools-mediagoblin" = {
       user = "mediagoblin";
       group = "mediagoblin";
@@ -79,7 +105,7 @@ in {
 
     services.mediagoblin = {
       enable     = true;
 
     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 = {
       configFile = config.secrets.fullPaths."webapps/tools-mediagoblin";
     };
     services.filesWatcher.mediagoblin-web = {
@@ -95,9 +121,9 @@ in {
       "proxy" "proxy_http"
     ];
     users.users.wwwrun.extraGroups = [ "mediagoblin" ];
       "proxy" "proxy_http"
     ];
     users.users.wwwrun.extraGroups = [ "mediagoblin" ];
+    security.acme.certs.eldiron.extraDomainNames = [ "mgoblin.immae.eu" ];
     services.websites.env.tools.vhostConfs.mgoblin = {
       certName    = "eldiron";
     services.websites.env.tools.vhostConfs.mgoblin = {
       certName    = "eldiron";
-      addToCerts  = true;
       hosts       = ["mgoblin.immae.eu" ];
       root        = null;
       extraConfig = [ ''
       hosts       = ["mgoblin.immae.eu" ];
       root        = null;
       extraConfig = [ ''
@@ -130,5 +156,18 @@ in {
         ProxyPassReverse / unix://${mcfg.sockets.paster}|http://mgoblin.immae.eu/
       '' ];
     };
         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/";
+      }
+    ];
   };
 }
   };
 }
similarity index 57%
rename from modules/private/websites/tools/peertube/default.nix
rename to systems/eldiron/websites/peertube/default.nix
index 68c992f64ff7fe65b1566845d98ab0e9b426108c..0ebe4e79b41e655459288e24b3ca6ba128c3beb2 100644 (file)
@@ -2,14 +2,53 @@
 let
   env = config.myEnv.tools.peertube;
   cfg = config.myServices.websites.tools.peertube;
 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 {
 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";
     };
       enable = true;
       configFile = config.secrets.fullPaths."webapps/tools-peertube";
     };
@@ -68,9 +107,9 @@ in {
       paths = [ pcfg.configFile ];
     };
 
       paths = [ pcfg.configFile ];
     };
 
+    security.acme.certs.eldiron.extraDomainNames = [ "peertube.immae.eu" ];
     services.websites.env.tools.vhostConfs.peertube = {
       certName    = "eldiron";
     services.websites.env.tools.vhostConfs.peertube = {
       certName    = "eldiron";
-      addToCerts  = true;
       hosts       = [ "peertube.immae.eu" ];
       root        = null;
       extraConfig = [ ''
       hosts       = [ "peertube.immae.eu" ];
       root        = null;
       extraConfig = [ ''
@@ -90,5 +129,19 @@ in {
           RequestHeader set X-Real-IP %{REMOTE_ADDR}s
       '' ];
     };
           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/";
+      }
+    ];
   };
 }
   };
 }
similarity index 79%
rename from modules/private/websites/tools/performance/default.nix
rename to systems/eldiron/websites/performance/default.nix
index 5715ff08318a9c2b289d1e83c8470b65b7a3dcb8..23f754afec6a04bd444cecff0f9466d01a5fb7d4 100644 (file)
@@ -1,7 +1,7 @@
 { pkgs, lib, config, ... }:
 let
   env = config.myEnv.tools.status_engine;
 { 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
   apacheRoot = "${package}/public";
   cfg = config.myServices.websites.tools.performance;
 in
@@ -11,6 +11,9 @@ in
   };
 
   config = lib.mkIf cfg.enable {
   };
 
   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";
     secrets.keys = {
       status_engine_ui = {
         permissions = "0400";
@@ -36,7 +39,7 @@ in
           use_mysql: 1
           mysql:
               host: 127.0.0.1
           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}
               username: ${env.mysql.user}
               password: ${env.mysql.password}
               database: ${env.mysql.database}
@@ -48,9 +51,9 @@ in
 
     services.websites.env.tools.modules = [ "proxy_fcgi" ];
 
 
     services.websites.env.tools.modules = [ "proxy_fcgi" ];
 
+    security.acme.certs.eldiron.extraDomainNames = [ "performance.immae.eu" ];
     services.websites.env.tools.vhostConfs.performance = {
       certName   = "eldiron";
     services.websites.env.tools.vhostConfs.performance = {
       certName   = "eldiron";
-      addToCerts = true;
       hosts      = [ "performance.immae.eu" ];
       root       = apacheRoot;
       extraConfig = [
       hosts      = [ "performance.immae.eu" ];
       root       = apacheRoot;
       extraConfig = [
@@ -79,9 +82,11 @@ in
         "pm.min_spare_servers" = "1";
         "pm.max_spare_servers" = "10";
 
         "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"}";
       };
         "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 ]);
     };
 
   };
     };
 
   };
similarity index 95%
rename from modules/private/websites/tools/stats/default.nix
rename to systems/eldiron/websites/stats/default.nix
index 71e31a3c4abea964695471c5e2aa9b585b965b82..665010b42beb3241b4826de0c08b509875f93929 100644 (file)
@@ -18,9 +18,9 @@ in
       };
     };
 
       };
     };
 
+    security.acme.certs.eldiron.extraDomainNames = [ "stats.immae.eu" ];
     services.websites.env.tools.vhostConfs.stats = {
       certName = "eldiron";
     services.websites.env.tools.vhostConfs.stats = {
       certName = "eldiron";
-      addToCerts = true;
       hosts = [ "stats.immae.eu" ];
       root = null;
       extraConfig = [
       hosts = [ "stats.immae.eu" ];
       root = null;
       extraConfig = [
diff --git a/systems/eldiron/websites/tools/adminer.nix b/systems/eldiron/websites/tools/adminer.nix
new file mode 100644 (file)
index 0000000..5e865b1
--- /dev/null
@@ -0,0 +1,83 @@
+{ config, webapps-adminer, php82, lib, forcePhpSocket ? null }:
+rec {
+  webRoot = webapps-adminer;
+  phpFpm = rec {
+    user = apache.user;
+    group = apache.group;
+    phpPackage = let
+      #mysqli_pam = php81.extensions.mysqli.overrideAttrs(old: {
+      #  configureFlags = [ "--with-mysqli=${libmysqlclient_pam.dev}/bin/mysql_config" "--with-mysql-sock=/run/mysqld/mysqld.sock" ];
+      #});
+    in
+      php82.withExtensions ({ enabled, all }: [all.mysqli all.redis all.pgsql]);
+    settings = {
+      "listen.owner" = apache.user;
+      "listen.group" = apache.group;
+      "pm" = "ondemand";
+      "pm.max_children" = "5";
+      "pm.process_idle_timeout" = "60";
+      #"php_admin_flag[log_errors]" = "on";
+      # Needed to avoid clashes in browser cookies (same domain)
+      "php_value[session.name]" = "AdminerPHPSESSID";
+      "php_admin_value[open_basedir]" = "${webRoot}:/tmp";
+      "php_admin_value[session.save_handler]" = "redis";
+      "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Adminer:'";
+    };
+  };
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    root = webRoot;
+    vhostConf = socket: ''
+      Alias /adminer ${webRoot}
+      <Directory ${webRoot}>
+        DirectoryIndex index.php
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${if forcePhpSocket != null then forcePhpSocket else socket}|fcgi://localhost"
+        </FilesMatch>
+
+        Use LDAPConnect
+        Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu
+        Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu
+      </Directory>
+      '';
+  };
+  monitoringPlugins = [ "http" ];
+  monitoringObjects.service = [
+    {
+      service_description = "adminer website is running on tools.immae.eu";
+      host_name = config.hostEnv.fqdn;
+      use = "external-web-service";
+      check_command = ["check_https_auth" "tools.immae.eu" "/adminer/" "www.adminerevo.org"];
+
+      servicegroups = "webstatus-webapps";
+      _webstatus_name = "Adminer";
+      _webstatus_url = "https://tools.immae.eu/adminer/";
+    }
+  ];
+
+  chatonsProperties = {
+    published = false;
+    file.datetime = "2023-08-21T15:20:00";
+    service = {
+      name = "Adminer";
+      description = "Database management in a single PHP file";
+      website = "https://tools.immae.eu/adminer/";
+      logo = "https://tools.immae.eu/adminer/?file=favicon.ico";
+      status.level = "OK";
+      status.description = "OK";
+      registration."" = ["MEMBER" "CLIENT"];
+      registration.load = "OPEN";
+      install.type = "PACKAGE";
+    };
+    software = {
+      name = "Adminer";
+      website = "https://docs.adminerevo.org/";
+      license.url = "https://github.com/adminerevo/adminerevo/blob/main/readme.md";
+      license.name = "Apache License 2.0 or GPL 2";
+      version = webRoot.version;
+      source.url = "https://github.com/adminerevo/adminerevo/";
+    };
+  };
+}
similarity index 62%
rename from modules/private/websites/tools/tools/default.nix
rename to systems/eldiron/websites/tools/default.nix
index 90fcbe1ff11cd0f1ca3718af9bb8cd981573de7d..4d9e3c1a36b47ec133f713831fe65c08a06c431c 100644 (file)
@@ -1,13 +1,14 @@
-{ lib, pkgs, config, ... }:
+{ lib, pkgs, config, mypackages-lib, grocy, ... }:
 let
 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;
   ympd = pkgs.callPackage ./ympd.nix {
     env = config.myEnv.tools.ympd;
+    inherit config;
   };
   ttrss = pkgs.callPackage ./ttrss.nix {
   };
   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.ttrss;
     php = pkgs.php72;
     inherit config;
@@ -17,8 +18,8 @@ let
     env = config.myEnv.tools.kanboard;
   };
   wallabag = pkgs.callPackage ./wallabag.nix {
     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]);
       };
     };
         php = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy]);
       };
     };
@@ -26,59 +27,110 @@ let
     inherit config;
   };
   yourls = pkgs.callPackage ./yourls.nix {
     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 {
     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;
     env = config.myEnv.tools.rompr;
+    inherit config;
   };
   shaarli = pkgs.callPackage ./shaarli.nix {
     env = config.myEnv.tools.shaarli;
     inherit config;
   };
   dokuwiki = pkgs.callPackage ./dokuwiki.nix {
   };
   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 {
   };
   ldap = pkgs.callPackage ./ldap.nix {
-    inherit (pkgs.webapps) phpldapadmin;
+    phpldapadmin = pkgs.webapps-phpldapadmin;
     env = config.myEnv.tools.phpldapadmin;
     inherit config;
   };
     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.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 ]);
   };
       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;
   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;
   };
   };
   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 {
 
   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 {
   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
     secrets.keys =
       kanboard.keys
       // ldap.keys
@@ -87,9 +139,20 @@ in {
       // wallabag.keys
       // yourls.keys
       // dmarc-reports.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
     services.websites.env.tools.modules =
       [ "proxy_fcgi" ]
       ++ adminer.apache.modules
@@ -105,10 +168,12 @@ in {
       ++ ldap.apache.modules
       ++ kanboard.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";
     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  = [
       hosts        = [ "tools.immae.dev" ];
       root         = "/var/lib/ftp/immae/devtools";
       extraConfig  = [
@@ -129,9 +194,10 @@ in {
       ];
     };
 
       ];
     };
 
+
+    security.acme.certs.eldiron.extraDomainNames = [ "outils.immae.eu" "tools.immae.eu" ];
     services.websites.env.tools.vhostConfs.tools = {
       certName    = "eldiron";
     services.websites.env.tools.vhostConfs.tools = {
       certName    = "eldiron";
-      addToCerts  = true;
       hosts       = ["tools.immae.eu" ];
       root        = landing;
       extraConfig = [
       hosts       = ["tools.immae.eu" ];
       root        = landing;
       extraConfig = [
@@ -141,6 +207,7 @@ in {
           RedirectMatch 301 ^/jappix(.*)$      https://im.immae.fr/converse
 
           <Directory "${landing}">
           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
             DirectoryIndex index.html
             AllowOverride None
             Require all granted
@@ -160,7 +227,7 @@ in {
         (dokuwiki.apache.vhostConf pcfg.dokuwiki.socket)
         (ldap.apache.vhostConf pcfg.ldap.socket)
         (kanboard.apache.vhostConf pcfg.kanboard.socket)
         (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)
         ''
         (phpbb.apache.vhostConf pcfg.phpbb.socket)
         (dmarc-reports.apache.vhostConf pcfg.dmarc-reports.socket)
         ''
@@ -175,6 +242,20 @@ in {
             ProxyPreserveHost on
           </Location>
 
             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 /BIP39 /var/lib/buildbot/outputs/immae/bip39
           <Directory "/var/lib/buildbot/outputs/immae/bip39">
             DirectoryIndex index.html
@@ -185,6 +266,7 @@ in {
           Alias /webhooks ${config.secrets.fullPaths."webapps/webhooks"}
           <Directory "${config.secrets.fullPaths."webapps/webhooks"}">
             Options -Indexes
           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$">
             Require all granted
             AllowOverride None
             <FilesMatch "\.php$">
@@ -197,7 +279,6 @@ in {
 
     services.websites.env.tools.vhostConfs.outils = {
       certName   = "eldiron";
 
     services.websites.env.tools.vhostConfs.outils = {
       certName   = "eldiron";
-      addToCerts = true;
       hosts      = [ "outils.immae.eu" ];
       root       = null;
       extraConfig = [
       hosts      = [ "outils.immae.eu" ];
       root       = null;
       extraConfig = [
@@ -261,6 +342,18 @@ in {
         after = lib.mkAfter yourls.phpFpm.serviceDeps;
         wants = yourls.phpFpm.serviceDeps;
       };
         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" ];
       ympd = {
         description = "Standalone MPD Web GUI written in C";
         wantedBy = [ "multi-user.target" ];
@@ -303,18 +396,21 @@ in {
           "pm.min_spare_servers" = "1";
           "pm.max_spare_servers" = "10";
 
           "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"
           # 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;
         };
         };
         phpEnv = {
           CONTACT_EMAIL = config.myEnv.tools.contact;
         };
-        phpPackage = pkgs.php72;
+        phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]);
       };
       devtools = {
         user = "wwwrun";
       };
       devtools = {
         user = "wwwrun";
@@ -328,92 +424,92 @@ in {
           "pm.min_spare_servers" = "1";
           "pm.max_spare_servers" = "10";
 
           "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";
         };
           "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;
       };
       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;
       };
       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;
       };
       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;
       };
       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;
       };
       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;
       };
       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;
       };
       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;
       };
       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;
       };
       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;
       };
       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";
       };
       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 = {
       };
     };
 
     system.activationScripts = {
-      adminer = adminer.activationScript;
-      grocy = grocy.activationScript;
+      grocy = grocy'.activationScript;
       ttrss = ttrss.activationScript;
       wallabag = wallabag.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;
       rompr = rompr.activationScript;
       shaarli = shaarli.activationScript;
       dokuwiki = dokuwiki.activationScript;
       phpbb = phpbb.activationScript;
       kanboard = kanboard.activationScript;
-      ldap = ldap.activationScript;
     };
 
     services.websites.env.tools.watchPaths = [
     };
 
     services.websites.env.tools.watchPaths = [
@@ -424,6 +520,28 @@ in {
       paths = [ config.secrets.fullPaths."webapps/tools-wallabag" ];
     };
 
       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
+    ];
   };
 }
 
   };
 }
 
similarity index 86%
rename from modules/private/websites/tools/tools/dmarc_reports.nix
rename to systems/eldiron/websites/tools/dmarc_reports.nix
index 8a77b1333e7cc0231f4e5750ebf92c1d67575ae2..8b3aa99886b9d10da0334254e6796fb010c13224 100644 (file)
@@ -10,7 +10,7 @@ rec {
       $dbname = "${env.mysql.database}";
       $dbuser = "${env.mysql.user}";
       $dbpass = "${env.mysql.password}";
       $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}";
       ?>
     '';
       $anonymous_key = "${env.anonymous_key}";
       ?>
     '';
@@ -49,6 +49,8 @@ rec {
       "pm.max_children" = "60";
       "pm.process_idle_timeout" = "60";
 
       "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";
     };
       # Needed to avoid clashes in browser cookies (same domain)
       "php_admin_value[open_basedir]" = "${basedir}:/tmp";
     };
diff --git a/systems/eldiron/websites/tools/dokuwiki.nix b/systems/eldiron/websites/tools/dokuwiki.nix
new file mode 100644 (file)
index 0000000..813c426
--- /dev/null
@@ -0,0 +1,106 @@
+{ lib, stdenv, dokuwiki, dokuwiki-plugins, config }:
+rec {
+  varDir = "/var/lib/dokuwiki";
+  activationScript = {
+    deps = [ "wrappers" ];
+    text = ''
+      if [ ! -d ${varDir} ]; then
+        install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
+          ${varDir}/animals
+        cp -a ${webRoot}/conf.dist ${varDir}/conf
+        cp -a ${webRoot}/data.dist ${varDir}/data
+        cp -a ${webRoot}/
+        chown -R ${apache.user}:${apache.user} ${varDir}/config ${varDir}/data
+        chmod -R 755 ${varDir}/config ${varDir}/data
+      fi
+    '';
+  };
+  chatonsHostingProperties = {
+    file.datetime = "2022-08-21T22:50:00";
+    hosting = {
+      name = "Dokuwiki";
+      description = "DokuWiki is a simple to use and highly versatile Open Source wiki software";
+      website = "https://tools.immae.eu/dokuwiki/";
+      logo = "https://tools.immae.eu/dokuwiki/lib/tpl/dokuwiki/images/apple-touch-icon.png";
+      type = "INSTANCE";
+      status.level = "OK";
+      status.description = "OK";
+      registration.load = "OPEN";
+      install.type = "PACKAGE";
+    };
+  };
+  chatonsProperties = {
+    file.datetime = "2022-08-21T22:50:00";
+    service = {
+      name = "Dokuwiki";
+      description = "DokuWiki is a simple to use and highly versatile Open Source wiki software";
+      website = "https://tools.immae.eu/dokuwiki/";
+      logo = "https://tools.immae.eu/dokuwiki/lib/tpl/dokuwiki/images/apple-touch-icon.png";
+      status.level = "OK";
+      status.description = "OK";
+      registration."" = ["MEMBER" "CLIENT"];
+      registration.load = "OPEN";
+      install.type = "PACKAGE";
+    };
+    software = {
+      name = "Dokuwiki";
+      website = "https://www.dokuwiki.org/dokuwiki";
+      license.url = "http://www.gnu.org/licenses/gpl-2.0.html";
+      license.name = "GNU General Public License Version 2";
+      version = webRoot.version;
+      source.url = "https://download.dokuwiki.org/";
+      modules = map (a: a.pluginName) webRoot.plugins;
+    };
+  };
+  webRoot = dokuwiki.withPlugins (p: [ p.farmer p.todo ]);
+  apache = rec {
+    user = "wwwrun";
+    group = "wwwrun";
+    modules = [ "proxy_fcgi" ];
+    root = webRoot;
+    vhostConf = socket: ''
+      Alias /dokuwiki "${root}"
+      <Directory "${root}">
+        DirectoryIndex index.php
+        <FilesMatch "\.php$">
+          SetHandler "proxy:unix:${socket}|fcgi://localhost"
+        </FilesMatch>
+
+        AllowOverride All
+        Options +FollowSymlinks
+        Require all granted
+      </Directory>
+      '';
+  };
+  phpFpm = rec {
+    serviceDeps = [ "openldap.service" ];
+    basedir = builtins.concatStringsSep ":" (
+      [ webRoot varDir ] ++ webRoot.plugins);
+    pool = {
+      "listen.owner" = apache.user;
+      "listen.group" = apache.group;
+      "pm" = "ondemand";
+      "pm.max_children" = "60";
+      "pm.process_idle_timeout" = "60";
+
+      # Needed to avoid clashes in browser cookies (same domain)
+      "php_value[session.name]" = "DokuwikiPHPSESSID";
+      "php_admin_value[open_basedir]" = "${basedir}:/tmp";
+      "php_admin_value[session.save_handler]" = "redis";
+      "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Dokuwiki:'";
+    };
+  };
+  monitoringPlugins = [ "http" ];
+  monitoringObjects.service = [
+    {
+      service_description = "dokuwiki website is running on tools.immae.eu";
+      host_name = config.hostEnv.fqdn;
+      use = "external-web-service";
+      check_command = ["check_https" "tools.immae.eu" "/dokuwiki/" "<title>start"];
+
+      servicegroups = "webstatus-webapps";
+      _webstatus_name = "Dokuwiki";
+      _webstatus_url = "https://tools.immae.eu/dokuwiki/";
+    }
+  ];
+}
similarity index 86%
rename from modules/private/websites/tools/tools/grocy.nix
rename to systems/eldiron/websites/tools/grocy.nix
index 3c45261371c6dcd61f07f976eb2b47f8f881832f..96e18a30a877688d568bf666f745d6ac81650fd3 100644 (file)
@@ -5,7 +5,6 @@ rec {
     deps = [ "wrappers" ];
     text = ''
       install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
     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;
     '';
   };
   webRoot = grocy.webRoot;
@@ -41,7 +40,8 @@ rec {
       # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "grocyPHPSESSID";
       "php_admin_value[open_basedir]" = "${basedir}:/tmp";
       # 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:'";
     };
   };
 }
     };
   };
 }
similarity index 56%
rename from modules/private/websites/tools/tools/kanboard.nix
rename to systems/eldiron/websites/tools/kanboard.nix
index 4809a42660e4ffc9a8ceea69b2d573dc92f2e6fb..db39ecdcb087f7047dc9b12667392308f1bc8c2d 100644 (file)
@@ -5,7 +5,6 @@ rec {
     deps = [ "wrappers" ];
     text = ''
       install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
     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
     '';
       install -TDm644 ${webRoot}/dataold/.htaccess ${varDir}/data/.htaccess
       install -TDm644 ${webRoot}/dataold/web.config ${varDir}/data/web.config
     '';
@@ -15,30 +14,28 @@ rec {
     group = apache.group;
     permissions = "0400";
     text = ''
     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";
   apache = rec {
     user = "wwwrun";
     group = "wwwrun";
@@ -46,6 +43,9 @@ rec {
     root = webRoot;
     vhostConf = socket: ''
     Alias /kanboard "${root}"
     root = webRoot;
     vhostConf = socket: ''
     Alias /kanboard "${root}"
+    <Location /kanboard>
+      Include ${config.secrets.fullPaths."webapps/tools-kanboard"}
+    </Location>
     <Directory "${root}">
       DirectoryIndex index.php
       AllowOverride All
     <Directory "${root}">
       DirectoryIndex index.php
       AllowOverride All
@@ -63,7 +63,7 @@ rec {
   };
   phpFpm = rec {
     serviceDeps = [ "postgresql.service" "openldap.service" ];
   };
   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;
     pool = {
       "listen.owner" = apache.user;
       "listen.group" = apache.group;
@@ -74,7 +74,8 @@ rec {
       # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "KanboardPHPSESSID";
       "php_admin_value[open_basedir]" = "${basedir}:/tmp";
       # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "KanboardPHPSESSID";
       "php_admin_value[open_basedir]" = "${basedir}:/tmp";
-      "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
+      "php_admin_value[session.save_handler]" = "redis";
+      "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Kanboard:'";
     };
   };
 }
     };
   };
 }
diff --git a/systems/eldiron/websites/tools/landing.nix b/systems/eldiron/websites/tools/landing.nix
new file mode 100644 (file)
index 0000000..f5d851e
--- /dev/null
@@ -0,0 +1,38 @@
+{ stdenv, yarn2nix-moretea, nodejs_16 }:
+let
+  source = builtins.fetchGit {
+    url = "https://git.immae.eu/github/bastienwirtz/homer.git";
+    ref = "gitolite_local/local_changes";
+    rev = "bb60c5b869931f305f15c5bfa9cdb3f68702f01f";
+    narHash = "sha256-xBIBUJhQ7KPY0d92pW9ErA9OvGafWcxyuGkbHShF4Bs=";
+  };
+  yarnModules = yarn2nix-moretea.mkYarnModules rec {
+    nodejs = nodejs_16;
+    name = "landing";
+    pname = name;
+    version = "v1.0.0";
+    packageJSON = "${source}/package.json";
+    yarnLock = "${source}/yarn.lock";
+    yarnNix = ./landing/yarn-packages.nix;
+  };
+in
+  stdenv.mkDerivation rec {
+    pname = "landing";
+    version = "v1.0.0";
+    src = source;
+
+    buildInputs = [ yarnModules yarn2nix-moretea.yarn ];
+    configurePhase = ''
+      ln -s ${yarnModules}/node_modules .
+    '';
+    buildPhase = ''
+      # See https://stackoverflow.com/questions/74548318/how-to-resolve-error-error0308010cdigital-envelope-routinesunsupported-no
+      export NODE_OPTIONS=--openssl-legacy-provider
+      yarn build
+    '';
+    installPhase = ''
+      cp -a dist $out
+      cp ${./landing}/*.php $out/
+      ln -s service-worker.js $out/worker.js
+    '';
+  }
similarity index 80%
rename from modules/private/websites/tools/tools/landing/ldap_password.php
rename to systems/eldiron/websites/tools/landing/ldap_password.php
index b6079e5449840098cceedc77e55f9732c606175c..efb4f578f8b5dfdfc9124f51974f2d575237f900 100644 (file)
 $message = array();
 $message_css = "";
 
 $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;
 function changePassword($user,$oldPassword,$newPassword,$newPasswordCnf){
   global $message;
   global $message_css;
@@ -46,26 +82,20 @@ function changePassword($user,$oldPassword,$newPassword,$newPasswordCnf){
     return false;
   }
 
     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);
 
   $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[] = "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,
   } else {
     $message_css = "yes";
     mail($mail_address,"Password change notice","Dear $first_name,
similarity index 75%
rename from modules/private/websites/tools/tools/landing/ldap_ssh_keys.php
rename to systems/eldiron/websites/tools/landing/ldap_ssh_keys.php
index 259e28d1ac9e39366b1a672963cbf3f20a433787..85ed973ba55f88a7e540c3bc1dc279070f7f8bb5 100644 (file)
@@ -78,33 +78,14 @@ function checkSshKey($sshKey)
 
 function isUserLogged()
 {
 
 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)
 {
 }
 
 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";
 
 
     $user_dn = "uid=$user,ou=users,dc=immae,dc=eu";
 
@@ -112,7 +93,6 @@ function checkLogin($user, $password)
         return false;
     }
     $_SESSION["user_dn"] = $user_dn;
         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);
 
     $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)");
     $auth_entry = ldap_first_entry($con, $user_search);
@@ -120,48 +100,61 @@ function checkLogin($user, $password)
     return true;
 }
 
     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;
     return $keys;
+  $pg = connectPg();
+  $result = pg_query_params($pg, "SELECT id,key,array_to_json(usage) as usage,comment FROM ldap_users_ssh_keys WHERE realm = 'immae' AND login = $1 ORDER BY id", array($_SESSION["login"]));
+  if (!$result) {
+    die("database access error");
+  }
+  $keys = [];
+  while ($row = pg_fetch_assoc($result)) {
+    $keys[] = array(
+      'id'         => $row["id"],
+      'apps'       => json_decode($row["usage"]),
+      'public_key' => $row["key"],
+      'comment'    => $row["comment"],
+    );
+  }
+
+  pg_close($pg);
+  return $keys;
 }
 
 }
 
-function pushLdapInfos($keys)
+function saveKeys($keys)
 {
 {
-    $con = doConnect();
-    if (!isset($_SESSION["user_dn"]))
-      return false;
-
-    return ldap_mod_replace($con, $_SESSION["user_dn"], array("immaeSshKey" => $keys));
+  if (!isset($_SESSION["login"])) {
+    return false;
+  }
+  $pg = connectPg();
+  $existingIds = pg_fetch_all_columns(pg_query_params($pg, "SELECT id FROM ldap_users_ssh_keys WHERE realm = 'immae' AND login = $1", array($_SESSION["login"])));
+  foreach ($keys as $key) {
+    if (isset($key["id"])) {
+      unset($existingIds[array_search($key["id"],$existingIds)]);
+      pg_query_params($pg, "UPDATE ldap_users_ssh_keys SET key = $2, usage = ARRAY(SELECT * FROM json_array_elements_text($3))::ldap_users_ssh_key_usage[], comment = $4 WHERE id = $5 AND login = $1 AND realm = 'immae'", array($_SESSION["login"], $key["public_key"], json_encode($key["apps"]), $key["comment"], $key["id"]));
+    } else {
+      pg_query_params($pg, "INSERT INTO ldap_users_ssh_keys (login,realm,key,usage,comment) values ($1,'immae',$2,ARRAY(SELECT * FROM json_array_elements_text($3))::ldap_users_ssh_key_usage[],$4)", array($_SESSION["login"], $key["public_key"], json_encode($key["apps"]), $key["comment"]));
+    }
+  }
+  foreach ($existingIds as $removedKeyId) {
+    pg_query_params($pg, "DELETE FROM ldap_users_ssh_keys WHERE login = $1 AND realm = 'immae' AND id = $2", array($_SESSION["login"], $removedKeyId));
+  }
 }
 
 
 }
 
 
@@ -192,12 +185,12 @@ if (isset($_POST['sauvegarder'])) {
         }
 
         if (!isset($editedKeys[$id]['error']) || $editedKeys[$id]['error'] !== true) {
         }
 
         if (!isset($editedKeys[$id]['error']) || $editedKeys[$id]['error'] !== true) {
-            $keysToSave[] = implode('|', $key['apps']) . ' ' . $key['public_key'] . ' ' . $key['comment'];
+          $keysToSave[] = $key;
         }
     }
 
     if (!$errors) {
         }
     }
 
     if (!$errors) {
-        $successSave = pushLdapInfos($keysToSave);
+        $successSave = saveKeys($keysToSave);
     }
 }
 
     }
 }
 
@@ -213,7 +206,7 @@ if (isset($_POST['login'])) {
 }
 
 if (isUserLogged()) :
 }
 
 if (isUserLogged()) :
-    $keys = isset($editedKeys) ? $editedKeys : getLdapInfo();
+    $keys = isset($editedKeys) ? $editedKeys : getKeys();
 ?>
         <p>Connecté en tant que <b><?= $_SESSION['login']; ?></b></p>
 
 ?>
         <p>Connecté en tant que <b><?= $_SESSION['login']; ?></b></p>
 
@@ -246,7 +239,7 @@ if (isUserLogged()) :
                             ?>
                             <td><input type="checkbox" name="keys[<?= $id ?>][apps][]" value="<?= $app ?>"<?= $checked ? ' checked' : '' ?>></td>
                         <?php endforeach; ?>
                             ?>
                             <td><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>
                     </tr>
                     <tr class="sshkeyrow">
                             <td colspan="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name="keys[<?= $id ?>][public_key]" <?php if (isset($sshKey['error']) && $sshKey['error'] === true) :?>style="color: red"<?php endif; ?>><?= $sshKey['public_key'] ?></textarea></td>
@@ -267,6 +260,8 @@ if (isUserLogged()) :
             function deleteLine(element) {
                 element.addEventListener('click', function(e) {
                     e.preventDefault();
             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);
             }
                     e.target.closest('tr').remove();
                 }, false);
             }
@@ -306,7 +301,7 @@ if (isUserLogged()) :
                 </tr>`;
 
                 newLine += `<tr class="sshkeyrow">
                 </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>`;
 
 
                 </tr>`;
 
 
similarity index 74%
rename from modules/private/websites/tools/tools/ldap.nix
rename to systems/eldiron/websites/tools/ldap.nix
index 2ca59f7a19c299808912d10818e03d63061e3254..9509169fa3ea2ca7e677a13b0c3df2f5dc1bd1a4 100644 (file)
@@ -1,11 +1,5 @@
 { lib, php, env, writeText, phpldapadmin, config }:
 rec {
 { 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;
   keys."webapps/tools-ldap" = {
     user = apache.user;
     group = apache.group;
@@ -62,8 +56,22 @@ rec {
 
       # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "LdapPHPSESSID";
 
       # 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/";
+    }
+  ];
 }
 }
similarity index 71%
rename from modules/private/websites/tools/tools/phpbb.nix
rename to systems/eldiron/websites/tools/phpbb.nix
index 77845c33ce67796f517d73f0fee744be2055cb33..c1cbd6fb2ee7c7391f037e2b8093bb9554927224 100644 (file)
@@ -9,9 +9,22 @@ rec {
         cp -a ${phpbb}/vars/* ${varDir}
         chown -R ${apache.user}:${apache.user} ${varDir}
       fi
         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";
   webRoot = phpbb;
   apache = rec {
     user = "wwwrun";
@@ -49,7 +62,8 @@ rec {
           # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "PhpBBPHPSESSID";
       "php_admin_value[open_basedir]" = "${basedir}:/tmp";
           # 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:'";
     };
   };
 }
     };
   };
 }
similarity index 75%
rename from modules/private/websites/tools/tools/rompr.nix
rename to systems/eldiron/websites/tools/rompr.nix
index e80d6b2c10bf470a15c41a18aea1204319bc2259..a7308cea828a8f2441d6d8ce46fdd72fc84362e1 100644 (file)
@@ -1,9 +1,9 @@
-{ lib, env, rompr }:
+{ lib, env, rompr, config }:
 rec {
   varDir = "/var/lib/rompr";
   activationScript = ''
     install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
 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 {
   '';
   webRoot = rompr;
   apache = rec {
@@ -57,7 +57,8 @@ rec {
       # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "RomprPHPSESSID";
       "php_admin_value[open_basedir]" = "${basedir}:/tmp";
       # 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_flag[magic_quotes_gpc]" = "Off";
       "php_flag[track_vars]" = "On";
       "php_flag[register_globals]" = "Off";
@@ -69,4 +70,17 @@ rec {
       "php_admin_value[memory_limit]" = "256M";
     };
   };
       "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/";
+    }
+  ];
 }
 }
similarity index 57%
rename from modules/private/websites/tools/tools/shaarli.nix
rename to systems/eldiron/websites/tools/shaarli.nix
index d128465b8bc33c87872afd73fe3a3c3a5fdee6af..35f1edb0425aa9cbebac3cbf8793374ac98a1cee 100644 (file)
@@ -4,10 +4,9 @@ let
 in rec {
   activationScript = ''
     install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
 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";
   apache = rec {
     user = "wwwrun";
     group = "wwwrun";
@@ -33,6 +32,29 @@ in rec {
       </Directory>
       '';
   };
       </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;
   keys."webapps/tools-shaarli" = {
     user = apache.user;
     group = apache.group;
@@ -58,9 +80,23 @@ in rec {
       # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "ShaarliPHPSESSID";
       "php_admin_value[open_basedir]" = "${basedir}:/tmp";
       # 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";
     };
   };
       "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/";
+    }
+  ];
 }
 }
similarity index 72%
rename from modules/private/websites/tools/tools/ttrss.nix
rename to systems/eldiron/websites/tools/ttrss.nix
index 1dc99ed0446bd9491c1248e866d191b526316d86..639325631d43c16954e5304adb924c553675f311 100644 (file)
@@ -13,13 +13,36 @@ rec {
         ${varDir}/cache/simplepie/ \
         ${varDir}/cache/upload/
       touch ${varDir}/feed-icons/index.html
         ${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";
   keys."webapps/tools-ttrss" = {
     user = apache.user;
     group = apache.group;
     permissions = "0400";
+    keyDependencies = [ php ];
     text = ''
       <?php
 
     text = ''
       <?php
 
@@ -57,6 +80,7 @@ rec {
         define('LOG_DESTINATION', ''');
         define('CONFIG_VERSION', 26);
 
         define('LOG_DESTINATION', ''');
         define('CONFIG_VERSION', 26);
 
+        define('DAEMON_UPDATE_LOGIN_LIMIT', 0);
 
         define('SPHINX_SERVER', 'localhost:9312');
         define('SPHINX_INDEX', 'ttrss, delta');
 
         define('SPHINX_SERVER', 'localhost:9312');
         define('SPHINX_INDEX', 'ttrss, delta');
@@ -123,7 +147,21 @@ rec {
       # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "TtrssPHPSESSID";
       "php_admin_value[open_basedir]" = "${basedir}:/tmp";
       # 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/";
+    }
+  ];
 }
 }
similarity index 76%
rename from modules/private/websites/tools/tools/wallabag.nix
rename to systems/eldiron/websites/tools/wallabag.nix
index 0ebdb0ba3aea5bec0eaab98743397209df6d9530..0a5750d67fe0008b6f6d46231d7d17394e2d9abf 100644 (file)
@@ -64,6 +64,29 @@ rec {
               arguments: ['/run/wrappers/bin/sendmail -bs']
       '';
   };
               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} \
   webappDir = wallabag.override { ldap = true; wallabag_config = config.secrets.fullPaths."webapps/tools-wallabag"; };
   activationScript = ''
     install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
@@ -135,8 +158,23 @@ rec {
 
       # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "WallabagPHPSESSID";
 
       # 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";
     };
   };
       "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/tmp";
       "php_value[max_execution_time]" = "300";
     };
   };
+  monitoringPlugins = [ "http" ];
+  monitoringObjects.service = [
+    {
+      service_description = "wallabag website is running on tools.immae.eu";
+      host_name = config.hostEnv.fqdn;
+      use = "external-web-service";
+      check_command = ["check_https" "tools.immae.eu" "/wallabag/" "<title>Bienvenue sur wallabag"];
+
+      servicegroups = "webstatus-webapps";
+      _webstatus_name = "Wallabag";
+      _webstatus_url = "https://tools.immae.eu/wallabag/";
+    }
+  ];
 }
 }
diff --git a/systems/eldiron/websites/tools/webhooks.nix b/systems/eldiron/websites/tools/webhooks.nix
new file mode 100644 (file)
index 0000000..337c8f8
--- /dev/null
@@ -0,0 +1,25 @@
+{ lib, env, binEnv }:
+{
+  keys = lib.attrsets.mapAttrs' (k: v:
+    lib.nameValuePair "webapps/webhooks/${k}.php" {
+    user = "wwwrun";
+    group = "wwwrun";
+    permissions = "0400";
+    text = builtins.replaceStrings ["{{webhooks-bin-env}}"] [ "${binEnv}" ] v;
+    keyDependencies = [ binEnv ];
+  }) env // lib.attrsets.mapAttrs' (k: v:
+    lib.nameValuePair "webapps/webhooks/${k}/index.php" {
+    user = "wwwrun";
+    group = "wwwrun";
+    permissions = "0400";
+    text = builtins.replaceStrings ["{{webhooks-bin-env}}"] [ "${binEnv}" ] v;
+    keyDependencies = [ binEnv ];
+  }) env // {
+    "webapps/webhooks" = {
+      isDir = true;
+      user = "wwwrun";
+      group = "wwwrun";
+      permissions = "0500";
+    };
+  };
+}
similarity index 70%
rename from modules/private/websites/tools/tools/ympd.nix
rename to systems/eldiron/websites/tools/ympd.nix
index 531b1a90d8b888330d2214a916b5fb8e995bb022..0d8d41dbe2513f19f5fdcdeaae7c169c080cb22c 100644 (file)
@@ -1,4 +1,4 @@
-{ env }:
+{ env, config }:
 let
   ympd = rec {
     config = {
 let
   ympd = rec {
     config = {
@@ -37,4 +37,18 @@ let
     };
   };
 in
     };
   };
 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/";
+      }
+    ];
+  }
similarity index 64%
rename from modules/private/websites/tools/tools/yourls.nix
rename to systems/eldiron/websites/tools/yourls.nix
index 3717520298adf5d10772d9198b910fecd2bbc3cf..9e54b0d0555540ae9c12a9d36483e7992eb1d0a3 100644 (file)
@@ -1,11 +1,5 @@
 { env, yourls, yourls-plugins, config }:
 rec {
 { 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;
   keys."webapps/tools-yourls" = {
     user = apache.user;
     group = apache.group;
@@ -39,6 +33,29 @@ rec {
       define( 'LDAPAUTH_USERCACHE_TYPE', 0);
     '';
   };
       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";
   webRoot = (yourls.override { yourls_config = config.secrets.fullPaths."webapps/tools-yourls"; }).withPlugins (p: [p.ldap]);
   apache = rec {
     user = "wwwrun";
@@ -79,8 +96,23 @@ rec {
 
       # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "YourlsPHPSESSID";
 
       # Needed to avoid clashes in browser cookies (same domain)
       "php_value[session.name]" = "YourlsPHPSESSID";
-      "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/yourls";
-      "php_admin_value[session.save_path]" = "/var/lib/php/sessions/yourls";
+      "php_admin_value[session.save_handler]" = "redis";
+      "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Yourls:'";
+      "php_admin_value[open_basedir]" = "${basedir}:/tmp";
     };
   };
     };
   };
+  monitoringPlugins = [ "http" ];
+  monitoringObjects.service = [
+    {
+      service_description = "yourl website is running on tools.immae.eu";
+      host_name = config.hostEnv.fqdn;
+      use = "external-web-service";
+      check_command = ["check_https" "tools.immae.eu" "/url/admin/" "<title>YOURLS"];
+
+      servicegroups = "webstatus-webapps";
+      _webstatus_name = "YOURLS";
+      _webstatus_url = "https://tools.immae.eu/url/admin/";
+    }
+
+  ];
 }
 }
diff --git a/systems/eldiron/websites/visio/default.nix b/systems/eldiron/websites/visio/default.nix
new file mode 100644 (file)
index 0000000..76d1960
--- /dev/null
@@ -0,0 +1,63 @@
+{ lib, pkgs, config,  ... }:
+let
+  port = config.myEnv.ports.galene_port;
+  cfg = config.myServices.websites.tools.visio;
+in {
+  options.myServices.websites.tools.visio = {
+    enable = lib.mkEnableOption "enable visio website";
+  };
+
+  config = lib.mkIf cfg.enable {
+    myServices.dns.zones."immae.eu".subdomains.visio =
+      with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
+
+    myServices.chatonsProperties.services.galene = {
+      file.datetime = "2022-08-21T22:45:00";
+      service = {
+        name = "Galene";
+        description = "The Galène videoconference server";
+        website = "https://visio.immae.eu/";
+        status.level = "OK";
+        status.description = "OK";
+        registration."" = ["NONE"];
+        registration.load = "OPEN";
+        install.type = "PACKAGE";
+      };
+      software = {
+        name = "Galene";
+        website = "https://galene.org/";
+        license.url = "https://github.com/jech/galene/blob/master/LICENCE";
+        license.name = "MIT License";
+        version = pkgs.galene.version;
+        source.url = "https://github.com/jech/galene";
+      };
+    };
+    services.galene = {
+      enable = true;
+      httpPort = port;
+      insecure = true;
+      # hack to bypass module's limitations
+      dataDir = "/var/lib/galene/data -http localhost:${builtins.toString port}";
+    };
+    systemd.services.galene.serviceConfig.RestrictAddressFamilies = lib.mkForce [ "AF_INET" "AF_INET6" "AF_NETLINK" ];
+    security.acme.certs.eldiron.extraDomainNames = [ "visio.immae.eu" ];
+    services.websites.env.tools.vhostConfs.visio = {
+      certName    = "eldiron";
+      hosts       = ["visio.immae.eu" ];
+      root        = null;
+      extraConfig = [
+        ''
+          ProxyPass        /ws ws://localhost:${builtins.toString port}/ws
+          ProxyPassReverse /ws ws://localhost:${builtins.toString port}/ws
+
+          ProxyPass        / http://localhost:${builtins.toString port}/
+          ProxyPassReverse / http://localhost:${builtins.toString port}/
+
+          ProxyPreserveHost On
+        ''
+      ];
+    };
+
+  };
+}
+
similarity index 78%
rename from modules/private/websites/tools/vpn/default.nix
rename to systems/eldiron/websites/vpn/default.nix
index 9cd499b41e1f08aea4e3cf9b91ae6af716dfda86..ea54691062faedcc5d2226fe01ce2f691553427b 100644 (file)
@@ -3,9 +3,9 @@ let
   cfg = config.myServices.vpn;
 in {
   config = lib.mkIf cfg.enable {
   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";
     services.websites.env.tools.vhostConfs.vpn = {
       certName    = "eldiron";
-      addToCerts  = true;
       hosts       = [ "vpn.immae.eu" ];
       root        = ./www;
     };
       hosts       = [ "vpn.immae.eu" ];
       root        = ./www;
     };
similarity index 90%
rename from modules/webapps/webstats/default.nix
rename to systems/eldiron/webstats/default.nix
index e873af2b0aa0db194bcd75a3743161a6d360a0f8..0057f641bf6075ca4a3a32ee2c9bf7898afb403b 100644 (file)
@@ -37,7 +37,7 @@ in {
   };
 
   config = lib.mkIf (builtins.length cfg.sites > 0) {
   };
 
   config = lib.mkIf (builtins.length cfg.sites > 0) {
-    users.users.root.packages = [
+    environment.systemPackages = [
       pkgs.goaccess
     ];
 
       pkgs.goaccess
     ];
 
@@ -58,10 +58,10 @@ in {
             trap "rm -f $TMPFILE" EXIT
 
             mkdir -p ${cfg.dataDir}/${domain}
             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
               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}";
             ${pkgs.goaccess}/bin/goaccess $TMPFILE --no-progress -o ${cfg.dataDir}/${domain}/index.html -p ${config}
             '';
           in "${d}/bin/stats-${domain}";
similarity index 75%
rename from modules/private/system/monitoring-1.nix
rename to systems/monitoring-1/base.nix
index dea5f45993daf1f31e896172933c7ba214e89bdf..8bfacc1079f0b8034759c863f1da1a38268f1b26 100644 (file)
@@ -1,25 +1,31 @@
-{ config, pkgs, resources, ... }:
+{ config, pkgs, lib, nixpkgs, php, secrets, ... }:
 {
 {
-  deployment = {
-    targetUser = "root";
-    targetHost = config.hostEnv.ips.main.ip4;
-    substituteOnDestination = true;
-  };
   # ssh-keyscan monitoring-1 | nix-shell -p ssh-to-age --run ssh-to-age
   secrets.ageKeys = [ "age1dn4lzhgxusqrpjjnzm7w8ml39ptf326htuzmpqdqs2gg3wq7cqzqxuvx8k" ];
   boot.kernelPackages = pkgs.linuxPackages_latest;
   # 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;
 
   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);
     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.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 ];
   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" = {
 
   secrets.keys = {
     "netdata-stream.conf" = {
@@ -65,5 +71,5 @@
   # database servers. You should change this only after NixOS release
   # notes say you should.
   # https://nixos.org/nixos/manual/release-notes.html
   # database servers. You should change this only after NixOS release
   # notes say you should.
   # https://nixos.org/nixos/manual/release-notes.html
-  system.stateVersion = "20.03"; # Did you read the comment?
+  system.stateVersion = "23.05"; # Did you read the comment?
 }
 }
diff --git a/systems/monitoring-1/flake.lock b/systems/monitoring-1/flake.lock
new file mode 100644 (file)
index 0000000..d4a2c8d
--- /dev/null
@@ -0,0 +1,790 @@
+{
+  "nodes": {
+    "backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_3",
+        "nixpkgs": "nixpkgs_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "chatons": {
+      "inputs": {
+        "environment": "environment"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/chatons",
+        "type": "path"
+      }
+    },
+    "colmena": {
+      "inputs": {
+        "flake-compat": "flake-compat",
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs",
+        "stable": "stable"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "disko": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_2"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_4": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_5": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "flake-compat": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_2"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_2": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_3"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_2": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_3": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "loginctl-linger": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/loginctl-linger",
+        "type": "path"
+      }
+    },
+    "mail-relay": {
+      "inputs": {
+        "environment": "environment_3",
+        "secrets": "secrets"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/mail-relay",
+        "type": "path"
+      }
+    },
+    "monitoring": {
+      "inputs": {
+        "environment": "environment_4",
+        "naemon": "naemon",
+        "nixpkgs-lib": "nixpkgs-lib",
+        "secrets": "secrets_2"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "my-lib": {
+      "inputs": {
+        "colmena": "colmena",
+        "disko": "disko",
+        "flake-parts": "flake-parts",
+        "nixos-anywhere": "nixos-anywhere",
+        "nixpkgs": "nixpkgs_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_2",
+        "nixpkgs": "nixpkgs_8",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "nixos-2305": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere": {
+      "inputs": {
+        "disko": [
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305",
+        "nixos-images": "nixos-images",
+        "nixpkgs": "nixpkgs_3",
+        "treefmt-nix": "treefmt-nix"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-images": {
+      "inputs": {
+        "nixos-2305": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_2": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_3": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_3": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_4": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_5": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_7": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_8": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "php": {
+      "inputs": {
+        "flake-utils": "flake-utils_2",
+        "nixpkgs": "nixpkgs_6",
+        "nixpkgs-4": "nixpkgs-4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "chatons": "chatons",
+        "environment": "environment_2",
+        "files-watcher": "files-watcher",
+        "loginctl-linger": "loginctl-linger",
+        "mail-relay": "mail-relay",
+        "monitoring": "monitoring",
+        "my-lib": "my-lib",
+        "myuids": "myuids",
+        "nixpkgs": "nixpkgs_5",
+        "php": "php",
+        "secrets": "secrets_3",
+        "system": "system"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "stable": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "system": {
+      "inputs": {
+        "backports": "backports",
+        "environment": "environment_5",
+        "mypackages": "mypackages",
+        "myuids": "myuids_2",
+        "secrets-public": "secrets-public"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/systems/monitoring-1/flake.nix b/systems/monitoring-1/flake.nix
new file mode 100644 (file)
index 0000000..e97cb05
--- /dev/null
@@ -0,0 +1,45 @@
+{
+  inputs = {
+    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+
+    my-lib.url = "path:../../flakes/lib";
+
+    monitoring.url = "path:../../flakes/private/monitoring";
+    mail-relay.url = "path:../../flakes/private/mail-relay";
+    chatons.url = "path:../../flakes/private/chatons";
+    environment.url = "path:../../flakes/private/environment";
+    system.url = "path:../../flakes/private/system";
+    php.url = "path:../../flakes/private/php";
+
+    myuids.url = "path:../../flakes/myuids";
+    secrets.url = "path:../../flakes/secrets";
+    files-watcher.url = "path:../../flakes/files-watcher";
+    loginctl-linger.url = "path:../../flakes/loginctl-linger";
+  };
+  outputs = inputs@{ self, my-lib, nixpkgs, ...}:
+    my-lib.lib.mkColmenaFlake {
+      name = "monitoring-1";
+      inherit self nixpkgs;
+      system = "x86_64-linux";
+      targetHost = "95.216.164.150";
+      targetUser = "root";
+      nixosModules = {
+        base = ./base.nix;
+        system = inputs.system.nixosModule;
+        mail-relay = inputs.mail-relay.nixosModule;
+        chatons = inputs.chatons.nixosModule;
+        monitoring = inputs.monitoring.nixosModule;
+        environment = inputs.environment.nixosModule;
+
+        myuids = inputs.myuids.nixosModule;
+        secrets = inputs.secrets.nixosModule;
+        files-watcher = inputs.files-watcher.nixosModule;
+        loginctl-linger = inputs.loginctl-linger.nixosModule;
+      };
+      moduleArgs = {
+        nixpkgs = inputs.nixpkgs;
+        monitoring = inputs.monitoring;
+        php = inputs.php;
+      };
+    };
+}
diff --git a/systems/monitoring-1/monitoring-master.nix b/systems/monitoring-1/monitoring-master.nix
new file mode 100644 (file)
index 0000000..09319b8
--- /dev/null
@@ -0,0 +1,87 @@
+{ config, pkgs, lib, nodes, name, monitoring, ... }:
+let
+  mlib = monitoring.lib;
+  nodesWithMonitoring = lib.filterAttrs (n: v: (v.config.myServices or {}) ? "monitoring") nodes;
+in
+{
+  imports = [
+    ./monitoring/master.nix
+    ./monitoring/phare.nix
+    ./monitoring/ulminfo-fr.nix
+  ];
+  myServices.monitoring.activatedPlugins = lib.flatten (lib.mapAttrsToList (_: n: n.config.myServices.monitoring.fromMasterActivatedPlugins) nodesWithMonitoring);
+  myServices.monitoring.objects = lib.mkMerge (
+    lib.mapAttrsToList (_: n:
+      mlib.toMasterPassiveObject "external-passive-service" 1.5 n.config.myServices.monitoring.objects
+    ) (lib.filterAttrs (n: v: n != name) nodesWithMonitoring)
+    ++
+    lib.mapAttrsToList (_: n: n.config.myServices.monitoring.fromMasterObjects) nodesWithMonitoring
+  );
+  myServices.chatonsProperties.hostings.monitoring = {
+    file.datetime = "2022-08-27T16:00:00";
+    hosting = {
+      name = "Monitoring";
+      description = "Website and server health monitoring";
+      website = "https://status.immae.eu";
+      logo = "https://www.naemon.io/favicon.ico";
+      status.level = "OK";
+      status.description = "OK";
+      registration.load = "OPEN";
+      install.type = "PACKAGE";
+    };
+    software = {
+      name = "naemon";
+      website = "https://www.naemon.io/";
+      license.url = "https://github.com/naemon/naemon-core/blob/master/COPYING";
+      license.name = "GNU General Public License v2.0";
+      version = config.services.naemon.package.version;
+      source.url = "https://github.com/naemon/naemon-core";
+      modules = "livestatus,status-engine";
+    };
+  };
+
+  services.nginx = {
+    virtualHosts."status.immae.eu".locations = {
+      "=/common/immae.cfg" = {
+        alias = pkgs.writeText "immae.cfg" ''
+          # put me for instance in /etc/naemon/module-conf.d/immae.cfg
+          # Make sure that you have include_dir=module-conf.d in
+          # naemon.cfg
+          log_initial_states=1
+          date_format=iso8601
+          admin_email=${config.myEnv.monitoring.email}
+          obsess_over_services=1
+          ocsp_command=notify-master
+        '';
+      };
+      "=/common/resource.cfg" = {
+        alias = pkgs.writeText "resource.cfg" ''
+          # Resource.cfg file
+          # Replace this with path to monitoring plugins
+          $USER1$=@@COMMON_PLUGINS@@
+          # Replace this with a path to scripts from
+          # https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/tree/modules/private/monitoring/plugins
+          $USER2$=@@IMMAE_PLUGINS@@
+          $USER200$=https://status.immae.eu/
+          $USER201$=@@TOKEN@@
+        '';
+      };
+    };
+  };
+
+  secrets.keys = lib.mapAttrs' (k: v: lib.nameValuePair "${k}_access_key" {
+    user = "naemon";
+    group = "naemon";
+    permissions = "0400";
+    text = ''
+      export AWS_ACCESS_KEY_ID="${v.accessKeyId}"
+      export AWS_SECRET_ACCESS_KEY="${v.secretAccessKey}"
+      export BASE_URL="${v.remote "immae-eldiron"}"
+    '';
+  }) config.myEnv.backup.remotes;
+
+  services.naemon.extraConfig = ''
+    broker_module=${pkgs.naemon-livestatus}/lib/naemon-livestatus/livestatus.so ${config.services.naemon.runDir}/live
+    broker_module=${pkgs.status-engine-module}/lib/status-engine/naemon/statusengine-${pkgs.naemon.status_engine_version}.o use_service_perfdata=1 use_process_data=0 use_system_command_data=0 use_external_command_data=0 use_flapping_data=0 use_program_status_data=0 use_notification_data=0 use_contact_status_data=0 use_contact_notification_data=0 use_event_handler_data=0 use_object_data=0
+  '';
+}
diff --git a/systems/monitoring-1/monitoring.nix b/systems/monitoring-1/monitoring.nix
new file mode 100644 (file)
index 0000000..421c71f
--- /dev/null
@@ -0,0 +1,61 @@
+{ config, pkgs, lib, name, monitoring, ... }:
+let
+  hostFQDN = config.hostEnv.fqdn;
+  emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
+in
+{
+  config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "emails" "ovh" "notify-primary" ];
+  config.myServices.monitoring.objects = lib.mkMerge [
+    (monitoring.lib.objectsCommon {
+      inherit hostFQDN;
+      hostName = name;
+      master = true;
+      processWarn = "70"; processAlert = "80";
+      loadWarn = "4.0"; loadAlert = "5.0";
+      load15Warn = "1.0"; load15Alert = "2.0";
+      interface = builtins.head (builtins.attrNames config.networking.interfaces);
+    })
+
+    {
+      service = [
+        (emailCheck "monitoring-1" hostFQDN)
+
+        {
+          service_description = "OVH account has enough sms";
+          host_name = hostFQDN;
+          use = "external-service";
+          check_command = "check_ovh_sms";
+
+          check_interval = 120;
+          notification_interval = "1440";
+        }
+
+        # Dummy service for testing
+        # {
+        #   service_description = "Dummy failing test";
+        #   host_name = "dummy-host";
+        #   use = "local-service";
+        #   check_interval = 0.3;
+        #   max_check_attempts = "1";
+        #   flap_detection_enabled = "0";
+        #   notification_interval = "0.1";
+        #   check_command = "check_critical";
+        # }
+      ];
+
+      host = {
+        # Dummy host for testing
+        # "dummy-host" = {
+        #   alias = "dummy.host";
+        #   check_interval = 0.3;
+        #   max_check_attempts = "1";
+        #   flap_detection_enabled = "0";
+        #   notification_interval = "0.1";
+        #   address = "dummy.host";
+        #   use = "linux-server";
+        #   check_command = "check_ok";
+        # };
+      };
+    }
+  ];
+}
diff --git a/systems/monitoring-1/monitoring/master.nix b/systems/monitoring-1/monitoring/master.nix
new file mode 100644 (file)
index 0000000..c8f52ea
--- /dev/null
@@ -0,0 +1,43 @@
+{ config, ... }:
+{
+  myServices.monitoring.objects = {
+    contact = {
+      immae = {
+        alias = "Immae";
+        email = config.myEnv.monitoring.immae_contact;
+        use = "generic-contact";
+        contactgroups = "admins";
+        host_notification_commands = "notify-host-by-email,notify-host-by-apprise!$USER210$";
+        service_notification_commands = "notify-service-by-email,notify-service-by-apprise!$USER210$";
+      };
+    };
+    command = {
+      check_passive = "$USER1$/check_dummy 3 \"Service result are stale\"";
+    };
+    templates = {
+      service = {
+        external-passive-service = {
+          active_checks_enabled = "0";
+          check_freshness = "1";
+          check_period = "24x7";
+          contact_groups = "admins";
+          event_handler_enabled = "1";
+          flap_detection_enabled = "1";
+          is_volatile = "0";
+          max_check_attempts = "3";
+          notification_interval = "60";
+          notification_options = "w,u,c,r,f,s";
+          notification_period = "24x7";
+          notifications_enabled = "1";
+          passive_checks_enabled = "1";
+          process_perf_data = "1";
+          retain_nonstatus_information = "1";
+          retain_status_information = "1";
+          retry_interval = "2";
+          check_command = "check_passive";
+          _webstatus_namespace = "immae";
+        };
+      };
+    };
+  };
+}
similarity index 53%
rename from modules/private/monitoring/objects_phare.nix
rename to systems/monitoring-1/monitoring/phare.nix
index 082e7e30a09a6d14cf40c915f3a04bdc32c3c319..0ce9ffe08a520cd54cf655a01bbe3772459488d0 100644 (file)
@@ -1,7 +1,10 @@
-{ emailCheck, ... }:
+{ monitoring, config, ... }:
+let
+  emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
+in
 {
 {
-  activatedPlugins = [ "emails" ];
-  host = {
+  config.myServices.monitoring.activatedPlugins = [ "emails" ];
+  config.myServices.monitoring.objects.host = {
     "phare.normalesup.org" = {
       alias = "phare.normalesup.org";
       address = "phare.normalesup.org";
     "phare.normalesup.org" = {
       alias = "phare.normalesup.org";
       address = "phare.normalesup.org";
@@ -11,7 +14,7 @@
       _webstatus_vhost = "status.immae.eu";
     };
   };
       _webstatus_vhost = "status.immae.eu";
     };
   };
-  service = [
+  config.myServices.monitoring.objects.service = [
     (emailCheck "phare" "phare.normalesup.org")
   ];
 }
     (emailCheck "phare" "phare.normalesup.org")
   ];
 }
similarity index 50%
rename from modules/private/monitoring/objects_ulminfo-fr.nix
rename to systems/monitoring-1/monitoring/ulminfo-fr.nix
index bd2804b92b8a348034bd456862c2165c9dfe936a..b0c66571b7fcd7d1a33245d718556975c7e0369b 100644 (file)
@@ -1,7 +1,10 @@
-{ emailCheck, ... }:
+{ monitoring, config, ... }:
+let
+  emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
+in
 {
 {
-  activatedPlugins = [ "emails" ];
-  host = {
+  config.myServices.monitoring.activatedPlugins = [ "emails" ];
+  config.myServices.monitoring.objects.host = {
     "ulminfo.fr" = {
       alias = "ulminfo.fr";
       address = "ulminfo.fr";
     "ulminfo.fr" = {
       alias = "ulminfo.fr";
       address = "ulminfo.fr";
@@ -11,7 +14,7 @@
       _webstatus_vhost = "status.immae.eu";
     };
   };
       _webstatus_vhost = "status.immae.eu";
     };
   };
-  service = [
+  config.myServices.monitoring.objects.service = [
     (emailCheck "ulminfo" "ulminfo.fr")
   ];
 }
     (emailCheck "ulminfo" "ulminfo.fr")
   ];
 }
similarity index 84%
rename from modules/private/monitoring/status.nix
rename to systems/monitoring-1/status.nix
index ab0290c3909fc2eed700287906b5c6decbd4e6e3..8b6615fd877e68549c784885c739d8cfa5ee46f7 100644 (file)
       upstreams."netdata".extraConfig = ''
         keepalive 64;
         '';
       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" = {
       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:/";
         useACMEHost = name;
         forceSSL = true;
         locations."/".proxyPass = "http://unix:/run/naemon-status/socket.sock:/";
       };
     };
     security.acme.certs."${name}" = {
       };
     };
     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;
     };
 
       group = config.services.nginx.group;
     };
 
-    myServices.certificates.enable = true;
     networking.firewall.allowedTCPPorts = [ 80 443 ];
     systemd.services.naemon-status = {
       description = "Naemon status";
     networking.firewall.allowedTCPPorts = [ 80 443 ];
     systemd.services.naemon-status = {
       description = "Naemon status";
similarity index 89%
rename from modules/private/monitoring/status_engine.nix
rename to systems/monitoring-1/status_engine.nix
index 39a753ad0905dd789b8981716868962dd2c3db3d..fc6afc0e4b6d461694885d264e77763be2ce15da 100644 (file)
@@ -1,6 +1,6 @@
 { config, pkgs, lib, name, ... }:
 let
 { 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
 {
   env = config.myEnv.tools.status_engine;
 in
 {
@@ -40,7 +40,7 @@ in
         use_mysql: 1
         mysql:
           host: ${env.mysql.remoteHost}
         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}
           username: ${env.mysql.user}
           password: ${env.mysql.password}
           database: ${env.mysql.database}
@@ -88,7 +88,7 @@ in
       '';
     };
 
       '';
     };
 
-    services.redis = rec {
+    services.redis.servers."" = rec {
       enable = true;
       bind = "127.0.0.1";
     };
       enable = true;
       bind = "127.0.0.1";
     };
@@ -100,6 +100,14 @@ in
       ];
     };
 
       ];
     };
 
+    environment.systemPackages = [
+      pkgs.gearmand
+      (pkgs.writeScriptBin "status-engine-worker" ''
+        #! ${pkgs.stdenv.shell}
+        cd ${package}
+        exec sudo -E -u naemon ./bin/Console.php "$@"
+      '')
+    ];
     systemd.services.status_engine_worker = {
       description = "Status engine worker";
       after = [ "network.target" ];
     systemd.services.status_engine_worker = {
       description = "Status engine worker";
       after = [ "network.target" ];
diff --git a/systems/quatresaisons/flake.lock b/systems/quatresaisons/flake.lock
new file mode 100644 (file)
index 0000000..6f2ccca
--- /dev/null
@@ -0,0 +1,767 @@
+{
+  "nodes": {
+    "backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_3",
+        "nixpkgs": "nixpkgs_7"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "colmena": {
+      "inputs": {
+        "flake-compat": "flake-compat",
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs",
+        "stable": "stable"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "disko": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_2"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "environment_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "environment_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "files-watcher": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/files-watcher",
+        "type": "path"
+      }
+    },
+    "files-watcher_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
+        "path": "../files-watcher",
+        "type": "path"
+      },
+      "original": {
+        "path": "../files-watcher",
+        "type": "path"
+      }
+    },
+    "flake-compat": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_2"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_2": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_3"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_2": {
+      "locked": {
+        "lastModified": 1648297722,
+        "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_3": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "landing-page": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1691524124,
+        "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=",
+        "ref": "main",
+        "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf",
+        "revCount": 573,
+        "type": "git",
+        "url": "https://github.com/bastienwirtz/homer.git"
+      },
+      "original": {
+        "ref": "main",
+        "type": "git",
+        "url": "https://github.com/bastienwirtz/homer.git"
+      }
+    },
+    "monitoring": {
+      "inputs": {
+        "environment": "environment_2",
+        "naemon": "naemon",
+        "nixpkgs-lib": "nixpkgs-lib",
+        "secrets": "secrets"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/monitoring",
+        "type": "path"
+      }
+    },
+    "multi-apache-container": {
+      "inputs": {
+        "files-watcher": "files-watcher_2",
+        "myuids": "myuids"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/multi-apache-container",
+        "type": "path"
+      }
+    },
+    "my-lib": {
+      "inputs": {
+        "colmena": "colmena",
+        "disko": "disko",
+        "flake-parts": "flake-parts",
+        "nixos-anywhere": "nixos-anywhere",
+        "nixpkgs": "nixpkgs_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_2",
+        "nixpkgs": "nixpkgs_8",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../myuids",
+        "type": "path"
+      }
+    },
+    "myuids_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../flakes/myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/myuids",
+        "type": "path"
+      }
+    },
+    "myuids_3": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "naemon": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
+        "path": "../../naemon",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../naemon",
+        "type": "path"
+      }
+    },
+    "nixos-2305": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere": {
+      "inputs": {
+        "disko": [
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305",
+        "nixos-images": "nixos-images",
+        "nixpkgs": "nixpkgs_3",
+        "treefmt-nix": "treefmt-nix"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-images": {
+      "inputs": {
+        "nixos-2305": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-4": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1691269286,
+        "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_2": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_3": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_3": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_4": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_5": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_6": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1596265691,
+        "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
+        "type": "github"
+      }
+    },
+    "nixpkgs_7": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_8": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "php": {
+      "inputs": {
+        "flake-utils": "flake-utils_2",
+        "nixpkgs": "nixpkgs_6",
+        "nixpkgs-4": "nixpkgs-4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
+        "path": "../../flakes/private/php",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/php",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "environment": "environment",
+        "files-watcher": "files-watcher",
+        "landing-page": "landing-page",
+        "monitoring": "monitoring",
+        "multi-apache-container": "multi-apache-container",
+        "my-lib": "my-lib",
+        "myuids": "myuids_2",
+        "nixpkgs": "nixpkgs_5",
+        "php": "php",
+        "secrets": "secrets_2",
+        "system": "system"
+      }
+    },
+    "secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets-public": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "secrets_2": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "stable": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "system": {
+      "inputs": {
+        "backports": "backports",
+        "environment": "environment_3",
+        "mypackages": "mypackages",
+        "myuids": "myuids_3",
+        "secrets-public": "secrets-public"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/systems/quatresaisons/flake.nix b/systems/quatresaisons/flake.nix
new file mode 100644 (file)
index 0000000..8b269f6
--- /dev/null
@@ -0,0 +1,49 @@
+{
+  inputs = {
+    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+
+    my-lib.url = "path:../../flakes/lib";
+
+    monitoring.url = "path:../../flakes/private/monitoring";
+    environment.url = "path:../../flakes/private/environment";
+    php.url = "path:../../flakes/private/php";
+    system.url = "path:../../flakes/private/system";
+
+    myuids.url = "path:../../flakes/myuids";
+    secrets.url = "path:../../flakes/secrets";
+    files-watcher.url = "path:../../flakes/files-watcher";
+    multi-apache-container.url = "path:../../flakes/multi-apache-container";
+
+    landing-page = {
+      url = "https://github.com/bastienwirtz/homer.git";
+      ref = "main";
+      type = "git";
+      flake = false;
+    };
+  };
+  outputs = inputs@{ self, my-lib, nixpkgs, ...}:
+    my-lib.lib.mkColmenaFlake {
+      name = "quatresaisons";
+      inherit self nixpkgs;
+      system = "x86_64-linux";
+      targetHost = "144.76.76.162";
+      targetUser = "root";
+      nixosModules = {
+        base = { secrets, ... }: { imports = [ secrets.nixosModules.users-config-quatresaisons ]; };
+        system = inputs.system.nixosModule;
+        monitoring = inputs.monitoring.nixosModule;
+        environment = inputs.environment.nixosModule;
+
+        myuids = inputs.myuids.nixosModule;
+        secrets = inputs.secrets.nixosModule;
+        files-watcher = inputs.files-watcher.nixosModule;
+        multi-apache-container = inputs.multi-apache-container.nixosModule;
+      };
+      moduleArgs = {
+        monitoring = inputs.monitoring;
+        php = inputs.php;
+        landing-page = inputs.landing-page;
+        pkgs-no-overlay = inputs.nixpkgs.legacyPackages.x86_64-linux;
+      };
+    };
+}
diff --git a/systems/zoldene/Immae.pub b/systems/zoldene/Immae.pub
new file mode 100644 (file)
index 0000000..dd42b04
--- /dev/null
@@ -0,0 +1,322 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBFvwA+gBEADlchQGPyI2M9RNRUsk8wsL9XLc8qAFWTYlVp5p7177ucxTQf6S
+rny9yRCF69UqtE0ugwt+432sAAsDPi7BRA/JE95bIRBiewOiY1jYiivccP5dR6Jr
+58HJ3QOHYPekqZIQhxzCWjdD2nRhhCbbxeWFJsJyaG8idGBiLkgNKxEEmqE5LIat
+tzMpQFwOpL2FoYZ7+e4ZTMc+x+yqpOnGcQD1qwouqx68okSCjrVBWo5S2tK5AzzU
+X8esBLNpgkhpUEZVltiNc4bmj7GZPdy4+mvS33/HQTed8YpatCFVWzcK+/uK0SYE
+P8Hj1mguT9idBhAf+kv7qbTycrFkTBliP3oDNUoARWDmfQdV4nlxqW03QxUY18mL
+KPByduK3hEXAZnD+/8QfVzbNVVP+70/jdSB+ckF88Li2g4bv/9uqjaObKVJB9ocG
+EWslm1h7tvdCLBRgIl8b2+Zl0fComRAMuwUr+LYlWLnfygAi8Uy9hl7UcRWAAj99
+PG4ba0+y8eD8k1J2IE8HpeIzMzRwYTLtvLyJBvrKiQHJb1PGM5cS8iry81wjUPZm
+dO5p5rbC8z99w7UNMaiz6iqAFAaDyLLsBZ5gWD+1ps9XxCA0zf28Z/Tc/Gj4QKAf
+kpMd7lQ+gprsFyRtzcRD4WhsOL2ogKYFHYi4LE0GYduspGdQPlK/YfrKQwARAQAB
+tB9Jc21hZWwgQm91eWEgPGlzbWFlbEBib3V5YS5vcmc+iQJRBBMBCAA7AhsDBQsJ
+CAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvw
+BU4CGQEACgkQyfztbKa3lFR/kA//cHVrb/RRTLQZy514vMkOBKgAk+dj+j0lrgvJ
+yR0JK1KjodduSoccPq7qRFAU+KVa3FsXMn8yY/lWaCXYJoF0DT5iEHsEuzJRc7Cn
+N4aq2h42DD7z8dJCXZvtvJs+vZ7G/rlLl322TjLb2OyIybBEoPOmJl0dVG0wKBFC
+r7EJmOKl3ytUWUpEbuxs1U/pP4GKrPT2CK3QcLF8JHKIPkEO347RorseeHcHhMxs
+Bz5JXojts1NyLJh7lErT42atgEdTGzSmkkGm8OifZVIH2rgmnRsPHnCqrXYsa7dE
+yPsC01Ns3DPYk4C5FtbpfiNvATbnkOicEwb2U55OpYUZLsFCKo7Bl+duJVY0nPRN
+WiLCALPcdJL+a6hbh1hSuqHt5eNGxyrDtRPowXRTS1D4nTCgAh6+wpH47xXWEwXZ
+mEnkXqHLIjsW4CSIz2gc+Bza40+wkWz6NQDEb3ncytDZu9vKK1CYwl7RGW4RFkAO
+j3FWZvZp8ETPLNRVy64BhZzHY3uOxbYreE+T6JfiIZux8X+Bh4cPJHizfhSMLLS5
+kwABzalaTD33XnjKn5wQ/DfGJ+fGbF54fMlGFjne5VTNwY1ju2ieXTgVrUyzfKPF
+96zcvnxo/MWwqcQ8+dXFCZjldP76puo1eVATEBeOCQs8Vj7eL9eN/eo+BfzhS3S8
+CfFFYWeIXQQQEQIAHRYhBNw4R0hwnSYZ/yhnIW0Mr/3bHP6QBQJb8AgDAAoJEG0M
+r/3bHP6Q/TsAnA6vTjmrX4nY3QnevNrKefWaQvf3AJ0TALTqXhTcVYVLxfzRt/Qd
+u5W2/rQvSXNtYWVsIEJvdXlhIChXb3JrKSA8aXNtYWVsLmJvdXlhQGZyZXRsaW5r
+LmNvbT6JAk4EEwEIADgWIQT4KAb9ob9bmhswFOfJ/O1spreUVAUCW/AFCwIbAwUL
+CQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ/O1spreUVKlBD/sE/eDbJtL8UKc6
+CN7zmA038RSjxlcJrMRoBoThCFKOFtBsYLPebnIkzCDiUwQJaIMYe2RNBHKKz0p+
+2Kvzf7q+xq8W1e72aK1DRhsBTL8/LA1kQkvh3GwMS8z3SOcbXLWqKQuQ7ztYReQG
+wsT2/S8reVM96eV67K9vMHKMDF3NyYZewahX0I44YIbQJfLVG5elCkBrfHjGSeIt
+tSAv56BhN8J8ky+9nGx5jwWmxc/4Oquyfe9Lf0NMTCjw1xess7UoHlzSMp57yF3T
+AaqDcqD2Jdgr2meN9Yo4/Yb9dEvHFy34ppXYanX1nrHGev7YaaQWLoKLVZc3f6gR
++D7sEJUJm3IxO041CR7DBwQ1CQkx3sa66mcHxe+wchOoXBZdsqyl5Ds+zqh6eMyO
+UiixDcXDxZuimEY0/+7XjlFjtzhGVNKsjV/Azh+Hx3GZnGHMVpTw73qQFHkWeDrX
+FPUbinjtEVTxw0fS9PkDZB5ysgAWlXs2cqoNDMcbdyJn2xszbV5+vjlmcofsQZTr
+PiX+hB6P5RQP5ogtnotvbkPDSfPfqdUk5HjGFrGX08FoP4rCromHvSL6Un2lP4I2
+mJbbQzBU/bQUGzfz6U6VEbUHtOL+7woGuXuzTYsRZ/O7/fKohyi/+qsmOozQpLFN
+k5xocbF1PgpFphrKYpHaSkf6DS2/F4hdBBARAgAdFiEE3DhHSHCdJhn/KGchbQyv
+/dsc/pAFAlvwCAQACgkQbQyv/dsc/pDXWACeKMbL/Dtifpd466TqQP8isfWedtIA
+n2xbEmlpxG8yk0w4HQ4djwgY4RbutCpJc21hZWwgQm91eWEgPGlzbWFlbC5ib3V5
+YUBub3JtYWxlc3VwLm9yZz6JAk4EEwEIADgWIQT4KAb9ob9bmhswFOfJ/O1spreU
+VAUCW/AEawIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ/O1spreUVMGJ
+EAC5hKt5NCanRxEl13nQUu4+n05tdRl9C3sTczR8EUZ30zhpBV4chKgeJSD0r1VA
+zBSQHMNzroGawaQn38qxFtbcSmkGRDd+0y798x1HFHp+UFiYOdQDQJVsyDuwjq4k
+RF7zV+FBj0ffjn5JBy6R3wLmWCFxz1mPmkImdyyS8GEeifwTftC+SSotqfg1lh0K
+C+DSQGYtPk0jLvxVPRllnjltDOSPUt9xRE785I6E9oyYrCa5Om51e0eEMzwpkl4e
+QschAYILb6SNrVyEMRD5E3lJHD2r6dPvIPFNcLxIQuK/Kdco2jNq7dCL6ukdGI40
+j/oZi7XRrlFCQW321BuipJZ/7t9JWOXOrrEndQv+hOb6PeWkwF1rigjbQq+IipdJ
+DUXGBfiIzlpJM5tLhs7BGfLxYNn09rOpkotXrdBzRO62lYyRdQepKpD33v96bQV2
+0w64U44+CxuicjGDw/6no54LY4J7bM1lLGwqvHSeqgYoc+Zs9WH95TNNSmaAHGSf
+An4LpzW5nOXbq2rsWVbZpvsVHz3VmC9qmpsYl5tT/ninkLta3tN6TrYUFHXcDWz9
+K+HW+/oARzEmN8eg3iMmWtOnV59YEr/x2vvOHndguUL0tUpRjwuTunH9KOGZE0Kb
+uI3ovgLLO2kCSGk4SdXlntu/eLq9FPYqlOpjM9CtLf9JdIhdBBARAgAdFiEE3DhH
+SHCdJhn/KGchbQyv/dsc/pAFAlvwCAQACgkQbQyv/dsc/pCHCQCfdPdGx0FmknAs
+rPvjuUmuCj9Q8xUAn32dsgQYTlgfTdwLSxWGj4mTD2h6tClJc21hZWwgQm91eWEg
+PGJvdXlhQHBoYXJlLm5vcm1hbGVzdXAub3JnPokCTgQTAQgAOBYhBPgoBv2hv1ua
+GzAU58n87Wymt5RUBQJb8ASdAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJ
+EMn87Wymt5RU58QQALMGlOJzcQj/arHezum5H/PiYIpZ1yY+QMCzpSgPdwupwawW
+VN88aQRfU6k9xwmsU+Ghjreja09AuqYi/D2+61TM/Tmqi/9HdU6NRYw0hvaZnwFc
+vudFBII2XrxmU5k9PnSR6Sq4uLUGkXmvhJddV0q+cjtif+vDi5pl9mqbWBQY8d9S
+5Q6ZFZPeEeASUK7Xt/tSq9iXpb1tQsmEJ94Czl5G+gNFJcqj7nlHQ1/c9XeNsvJT
+GZVLGM/cAZNzB6AC8Kz+iWUypFuXifC2PYGpJDJ8klqTmDQikGQtM1HMHda6rnwU
+L7JIfbuwGbMk65CtG2YE8QqB+/GIfkzWySenmIrldn9Vp5EKB0DD529TyOwQWgzz
++HuVP/4QfkNRxNquWxlAPXmcNfV1SV+/Xn1KwSspb7QlAjiXXOL13J2dwYFpV+21
+vsSW5XqJXfWUU8d4YVOdq1kUTwLjWnWyxwtt8j68KSuTOT4JTA8oNXg87r0B4Fzr
+6AoxCM8ePywm5IW55gNAwViTKWBAcNrcwRTP647oNOM5+8D7NZIBpnKffNc/S2S5
+iI1tmaM0yXavmCm0Hb7lkFIsxM2Y2lxwHexPck2ftPXIrjhPYLcFVBdLVx2V2yXe
+cFW2vMGZiasVobFqqp1g8htmAlTkN0cTDY7l96wDuirC6OeCbVomEgxQEd0MiF0E
+EBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/92xz+kHsv
+AJ4+zdfjTdO1FUWb42bWdPQfiFe9nACeMIRp1Iu3tNVJkfS9CGGqhrChpfu0LUlz
+bWFlbCBCb3V5YSA8aXNtYWVsLmJvdXlhLjA2QG5vcm1hbGVzdXAub3JnPokCTgQT
+AQgAOBYhBPgoBv2hv1uaGzAU58n87Wymt5RUBQJb8ASsAhsDBQsJCAcCBhUKCQgL
+AgQWAgMBAh4BAheAAAoJEMn87Wymt5RUxa8P/i7zdQ9i5BfWITbdyCgXNoQYIcE3
+J6lIa15eLUcfDcL707zOrUSbhSkthLjeqZoNRCalqjeDOdgCQC1PNoISdkMGd9PO
+VOwS3G7Pjt4FSjPVHyw9+Su57pwTcLXBhEyBAkv+tx/QrB/UBCFzPUnsl71QH51y
+T8+bNdOiBxssdgn/9IrObn7tu8xDf+d/yGsA493x+mxalai+fhd/t0yzQcdcTrvD
+EKRxAaU8wXe8oSwcW5cRmXIi+N4aEnLRO/so9YDGf4z2FQVSL0ktoZYMqZ1ZvIb0
+MNCNl2NgNXThhrAPk9Rhs+S5nRzazJ+tS+D2S728EPpRHpUE43+vewtCdu5c5NWd
+Lz88o/jxLwcNwQa2iJoFMyqr15lHt+vM7OyD9X650IJwQw24n4tF6TijzH5GhWcN
+SnB7RpLSkftQldpK/zK+tmFH4vVpv+bI3JKAfzRga+5Fu42kB5uHVzXF3qMwYgEO
+sRNL5d4xV4SATce1mb8vFpsQmGOWnZAcCaQYhLKfMl7zR5ukytTjf3hRMRH0GAjh
+06QAoBMJZhWosYehPi1odjTngIf6hFOqA5prz8Cu/AFe/8aftp9UorJOekAj2io0
+CENRv21qrN8R4bNo04aTMD6WrY+mBL8MteR0ooD3ENQEAZ6UUyZwTzUJk2UUl+5M
+ch/HgJ+rQozmRGYeiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AI
+BAAKCRBtDK/92xz+kPsmAJ4wGQ0Hly2eTVzsU8Ht4609Q5kf2wCdHGuu863a0GHv
+uUdEokzQEsumYPG0OElzbWFlbCBCb3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVy
+ZSkgPGlfYm91eWFAeWFob28uZnI+iQJOBBMBCAA4FiEE+CgG/aG/W5obMBTnyfzt
+bKa3lFQFAlvwBMkCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQyfztbKa3
+lFQTlxAAjbuDy3prdEBNMYfi/870MO5eeDOCMtiDJDae4fQjj2NANjeuDGNP659B
+/k9uS7o5nrWB7E6rdG4a1J+Qzj5I775xTP/zVbrNSchcLwSoHMMXBm2IdbIanCX0
+JX+dRg2YX6yX+6ZmL8UaWRVICQ84ZxGtYHZ8o8hMCFOuxFklNjYFEPciO9M9m+rv
+fUEihQgcBF7+x9KVntlxad61Aa9AzUJLULgY3snaZK687tHUq3yYwXpF9s1CuJ81
+SfZxH32dKqy+2cpJqwQ38BZrTUwjBxxIMR5TRC7h/O9aRIBKQZKlpLcmxWPv18i7
+DwWlrJVb2Sd2WUh+TwPNa7VQc3NjlGtu74SfZqmirE0FyuB86fnsQaF8zhJnRsqE
+lagnLoW24PCvc8A9TK95tj+0JO8DIeM49Gg+Br/NBtRB8q5q/ICJOREber6Ke+/I
+p90q5VkZafIgeuO+EkyQ6Dq+58NRqC2qEs209xnKOd6exxT+2tEzx6Hy0PKwaay3
+h8WzUamJOTqRv1WG4GmlCeRUQGx8BtdIAEMdww26cN8rmxh5Foh5CH+V75bcybkv
+yH+FBDoKFYSpEPg0axHM/e13/nujgLNnSTHuMf7ILvpwoNkkIcQwSpH17B5hZdgl
+y0xD7aIS5XU9OoP9mKs1unzUKerWQWY6CxgYOqpssyDTUG+fohuIXQQQEQIAHRYh
+BNw4R0hwnSYZ/yhnIW0Mr/3bHP6QBQJb8AgEAAoJEG0Mr/3bHP6QFPAAn3DbFqHo
+hjznqQvg15QjlGFaPJaaAJ4ps0+VWG9BN7UBQPG+fcCRwqLaVLQ0SXNtYWVsIEJv
+dXlhIChEb24ndCBjb250YWN0IG1lIHRoZXJlKSA8Ym91eWFAa3RoLnNlPokCTgQT
+AQgAOBYhBPgoBv2hv1uaGzAU58n87Wymt5RUBQJb8ATfAhsDBQsJCAcCBhUKCQgL
+AgQWAgMBAh4BAheAAAoJEMn87Wymt5RU2vAP/12b6S0yJdZ1rgNLj+ZohY36PhCm
+30/amkGPQp7HCBylYIRv+y5m4IdiqynzJoap547cFMWNsCyfyU2VKbcy1Uy44FCI
+PCUcBME95jD1JWviINDKqLhglciKlJnWUhupiolqFcr2ro+rJVc/fBMWJoBjM5fJ
+9eq1ge2LxuYKbu9cpSEtopk7ZBeo69khhrFACdZEqfJtW4qp0hEC0pAKLjN8LhpQ
+EEVcq4zejksB+1e1qkuJ6be3/Q2Sj+1ijaJBElJIVJ8qyYs9XSlTlUA1USfy3Yqu
+jOkFrIaycxYgKooFgwYfYXCniuqXWZ2geCm2IE90lanQC2w7ZDN/JGwwVuAFVi4H
+Mrx6x/yEreqy2AUMesB1eGxqQQG9cgssMLoMAN2IDDJ6FS+e0imWTTMZ6r3ou9W8
++pFzSIT8LMnBNwp+RxrW3QzBs8sXDw5mS6WroiZMRlfJdA1sUPsrW0GV4/AFuEaK
+PhCUvIvoh6zxYR0lA/gYqtszCHGzHeNLoczOhytUZM+KQpOtO3TSING/+o59HHuM
+niD6k3mWcyk6MkSgIXquJRGUVGVFeLGlXXf7aWEkIOrXeqjBZpBchZUIxZfkg100
+xxmEgNVGG4vxB/UIGeVqV2S4JscJmCyDGs130nRp7Qp5YGfkaTLKyOdutssrqatP
+m5Zcjl2VGr4Xt4uXiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AI
+BAAKCRBtDK/92xz+kEViAJ9zBTPNNTYIxPxt8BEvb3pUDeZkiQCffsDGKi7kdlTj
+oZ26K7yxdjexaYS0OUlzbWFlbCBCb3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVy
+ZSkgPGJvdXlhQG1lY2gua3RoLnNlPokCTgQTAQgAOBYhBPgoBv2hv1uaGzAU58n8
+7Wymt5RUBQJb8ATwAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEMn87Wym
+t5RUIzgP/0/7+y7UOgj4Yja6Lwa+Lm7ESRZnbVmR1ERSAa9RKKr8BbPT4KhgwN2R
+x8c3CedFupS02sG1G57u+4qQbEeZylaMu6rusf/XyQ+esh06cRXfR7Vb2d14yFQg
+xun9PgPR7jL0RiU2fsgvF6O+u9KwnGRmABZXILDBxzGZBXKBIkmqBM8+rBkXFVWc
+gezZqD106KcuGewciuWM7bfyLj+2yV9GhvX8iRyptgkx9/CNEdOqQzKYEbXVTSkh
+tUW4QUmNnIiTnD/pZ4kr3UsQV6y0GC1kf9G5EeQHbD+kVROFM0/sX6qGn99IeC+j
+96MflMnKuXJeXjlxNFZIYPoolBAC7CvpRfdky5q0KB2xWh+x2jQbn3fPpa6lVZdQ
+De14guXdcEsj1QVUMRL3wFCDwHIsi3gqOpCHdy5GmunFRNqUWmoGU+uHt3Kk031w
+DJdQY4YP+8tFWLPG3vKoPSf5EcG2Mf0hZiWiiIAX8sVw13W+oDlAQ0HKah/uxV77
+gM2ScBiiiOr92JIf3ftq2AjMuzrGhpKME/wG2DdcOqmq7U+tcVbambSc7SVa5nTM
+JXm8ZPOSH0Fax1PULPd3pyLLhfF0rnPiDLcVa6UzG1MaSJiGBurIf3D3OCHRjQQ6
+kVpF9VtXhWeziV8wkyt66HNcuqUs6HDBNkpxPTNacKcZmW8J/FlaiF0EEBECAB0W
+IQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/92xz+kKOiAJ4shO9b
+nZ2Nx9XzBBg4C0nUl05LyQCbBpk7t2NIPMKaNtjsPb+RV5HbiQa0O0lzbWFlbCBC
+b3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVyZSkgPGlzbWFlbC5ib3V5YUBlbnMu
+ZnI+iQJOBBMBCAA4FiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvwBZYCGwMFCwkI
+BwIGFQoJCAsCBBYCAwECHgECF4AACgkQyfztbKa3lFRK1w//cqsweiuXGPepyn0t
+AL/S/scM6r9IwcjD3HrZqmUNSDAqU6PJ0FFialOPuSQIyEvrpY1GL+TiVtnYyAit
+sbotxNxNQFwiBvqchg6xd1ftpjJihuo7RysNdSNAnlOxFlEz9X+EGkRqq8rCTpoS
+GA9+4uFyFKzfv9CDg7YUVX5GVsE3bsPWymfCW1boW0TQyL7xNrDPfzKpVRHFu7hi
+5OghiTbHbifmIolj5Mo0hGuXxz26gFzrufCjgxK9ycW7LnHEnnK0zX8Qfueir8RV
+EisuAXtKILgS5mmOj0ywsrva4Qtf5JW5SKymhgsKCWskfz0lq6S6ceIKaYBr4Syk
+0MLI82M0zDfGlLuRP6yQ3DTiTC4lWfXHdjyd0w4SwcuAQPCWz34gtUEGfMTyrd6O
+le6pYreL1NPzd/NakYsR1H1fsXVJkgpESktoDIkzooLmBV6Pjr+PEt4DvPZYqgKl
+AyD+aZeZ5HlTZCLbN9O38nDttWdAvsGjq82qvNI8A/d2Vvz4L1ND6NT71+wtC2QT
+a95epSBD64l/JtK99SW/HjLjyvV9O+Nu2p8ESTOEaQhyIudnWYU+er+Vwy7YtLvY
+y8L9/Xu9KvlBMjHBXAAV047KwkIQNrNyoTla5yQFSpv57hFYbx5CKTprpsl9Ic4v
+uPjC/GMgkAJ3yTwIgxa47hgUAtKIXQQQEQIAHRYhBNw4R0hwnSYZ/yhnIW0Mr/3b
+HP6QBQJb8AgEAAoJEG0Mr/3bHP6QyCcAnRuTQIMOpwxbyzjj+t0C9GdNJYmGAJ9v
+5c5kvNCFiJAFCbUD4OxJBNA28rQ9SXNtYWVsIEJvdXlhIChEb24ndCBjb250YWN0
+IG1lIHRoZXJlKSA8Ym91eWFAbWF0aC5qdXNzaWV1LmZyPokCTgQTAQgAOBYhBPgo
+Bv2hv1uaGzAU58n87Wymt5RUBQJb8AW0AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4B
+AheAAAoJEMn87Wymt5RUaT8P/2OvKAfgqu0zQX0JhKu/wd9AATVmLa8C48JPQMUn
+5Z9dQyDcFyKKfKbGCz9B5jTOrzHNX0VJfpDujOTiPIk6ci0KqAJ3Fz0gdpxIcEoW
+B2zg0nwDtGHsGMX8togpcbVgKqblp0XSsMAFV2FN5PsAnxkqdXPDmZ5iZSgs9roi
+9nxHPavbcr1cSAjsiRoFxFudzo7Q0Z/KLRlTuTSAX6B+vRAeyRB4NcXThKYZlAi6
+cr+xXTvPFddiQZgVBT+ICZRQY0gwgHpQcj70fNx1w6tTHfThlxInojKGlreOZov9
+A4TVeex/QagVTsjRAQuZ9yLMkx7JxakAxBPZ/OHuv7/K1Qdx90AJ8zQZ6uOXpUNl
+c2MDEBoTI/nbsgMeHI/Mj4ndxCBUMperZ1oCITl+AhaqEZ+LxTKyne41YJedlqjc
+5xnUVigz4ajmZPYmbO6eRDxisx4fMG7hI2HnNWak2xBDVOp1z2aqZY0xsG7o697d
+I9BeR9JxbIusx0Szq6GabwI5beEI1xLlT333Fe3XDtT0NIQQvW9byuYuyfp7H6Xm
+hFj2ut7jVI9xG932sJ8ioRJGCK1UcGYEL0ei4YZRv+mVysEJFjki2nlxspnG4C/V
+Q20jXnLAXOpKLiStkNJ15WsnzeoL4eq0AUOYMMmYKAquXXgpVs+xUDv6XathWA2v
+oZkAiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/9
+2xz+kEBpAJ4x7hASmdnDcyFGTyuRHj6NwsDtNwCfRVfqoiRcGmvDRA8U25cPk5XT
+ZYTRzlXOUwEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQEASABIAAD/2wBD
+AAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcp
+LDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
+MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACMAG4D
+AREAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAABgcEBQACAwEI/8QAQhAAAQIE
+BAIGBgYIBwEAAAAAAQIDAAQFEQYSITFBURMUImFxsQcjMoGRwUJDUmJjchUlNTaC
+odHwFiYzc4OS4bL/xAAZAQADAQEBAAAAAAAAAAAAAAAAAQIDBAX/xAAgEQEBAAID
+AQEBAQEBAAAAAAAAAQIRAyExQRJREyIy/9oADAMBAAIRAxEAPwB2JHaECEjiPGA4
+6GA3kMMgDy8AZAGQAp8XD/Nc5+VP/wAiJT9GeBv3e/5VQ4cEu8M3sAZAGQBFT7Qh
+JSOUBt4DZYww8O0AeQB5cc4AgzNXk5dfRh1Dj1r9Ghab/wAzpE3KQFdiSotTGIph
+4trQFpAFyDwtwjO8mqqYbHeByDQNCD61R0jTGyzcTrQmigyAMsYAyxgCtTNt5hqI
+SUnrKOYgN06yjnCVtnWUc4BtyenmWGVuurSlttJUpR2AGpMGyKbEHpZm3ulapLSW
+GTcIdWm6yOZ1sIj92q0Cf8UVp2Y6b9IOIVtZkkD366xOzkjujFc83mROKZcCjc9M
+kE/1hbV+Yq1VhC3TkUEKvcWNxE6UY3o4xKpueVIuKGRaSoWO5GsXhdXSM59Nhucb
+cbStJFlAEeEa7Q26yj7UPdJ71pv7Qhboedab+0Iexsu2p2ZuD0sJltZom5gkEuaQ
+jldxMPkZuk0gW2E05cetgIvfSJihZY/RcvODKpXr0NntKA4HkCeHdEWrkLBc67fK
+EoF+Khc/CEuMYZn5tYyMFwX0KQRbwtCtkXMbUk4eqBKgpC9eYN4n9xf+Vczh+fYv
+maUoDUHlD/cF47EmlTz0hPtFalsrQsdoGxtx1hs7DpolaTO5JZl7sdHmZPNKbAjx
+Fx7jFY34ys+rcl4/XGL0jbVQmODpgsG2JD/F1UVIVqmRKgcT8YbNcy8qOrqO/ZiL
+6uRLTKAU8WGloF/A3WpgUqjTc8gjOy0Si+2bYQr1C9pAzM469NOuKdUpxxRN766x
+LUXYWw6mYbEw+m9zpeMc8/kdPHh/THp9LaYQAlCR4CMvXRNLASSCbqSOUGha0ekW
+ym2QW8INBRVbCkjUJJ1BbCHCLpcA1SeBiscrEZ4ygLD1XmaFXUNzCypcutSSgnTX
+Q2jbf2OTLH5TvkHGpuVbfTey0hWpvvHRjdxzWdrJiXSraHRi1cZQlVjDhUFGqNgX
+zDaCxAtpjgepRcHFMQvHxaNIzUoG30YF/Cl9JM0sYVW2nNZb6EqI5an5ROXgw9LX
+DEiieniVpBCNLGMuTLUdPHNmzTpdEu2lKUgJHARzW9uqToQy1iBDhpRtaKJ4bFO0
+A+oTygLxKiXxS2WMSqWNFGyzaN8L/wAuXlnY9whWn2qX0SyS2k3bJ5co14/45uXX
+pjYYnOvpcUdcpt/KNazxaVWotys8W1HWwMBX0s0yM8sWyDbTtCK2z0ZNBys0INPO
+thwIsRmEQ0x8XLEzLimhBfazBNvaEJfwtMeU0PYXnCVIOSzicqrm4MK+Fj6XeBmg
+3LuuH2s9o5+V2cRgsz7DashKlHiEi8YadMqwYr9NS4lourSs8FIMVoerxDzTiLg7
+xW4WkWZqkhK9mYm2m1HYKO8IIipyXmFXYeQsDkYiztW+iwxmwheJAyDYrQlV78yY
+34/HNy+jOkUZCqQyEzLbRCbZSNY6OOfXHyW0Y4TXK0lp1ExNt3Uq4+EXU49K3Eja
+ahVS/LTSMmQJhwspuhRc20nUz7dvGIDZmYbWq6ZtKtDteAK1AeW0XElwoG6glRA9
+8JfTkp7MhSOnGoI3MTlLpWNm44YdkhKiYlr3UHLE8zaObO7jswx1dLadROyqkplz
+kSsi6xwiJZb231Z4i081l0zJnnAgIUOg49IL8deWusVlMNdFj/pvsZ0guO0txbg9
+Yi4FuNoz1dKvoPrM1WOtN9Tlm3hm7YNiUjgf75ReEx13U5/rf/MWtPdmzNOMvNhS
+Uq7DgTa45wrZL0NWzsP4ukutYokg3bpFNpzC17gE8PCNuPxy8vq1ammGWg31lQt9
+wxvjLI5rd1IYdMySJdb7pG/RsqV8orsumrs0GHC286+2sbpUyoHygLcQQhpSkHKk
+gnlFMqaOHZdkUI2Zb9k/RETV4+L2ntNijpSEJtk2AhxfwAzbTIdc9UjQn6IgjOg8
+ASlaW1fTQ352J1jhynseljd2X+ixltuYbGZIULcYjTqk6Y9KtMsKUEITpuBBelad
+6SvNT1FI02EOeM/XPqMu+c/RpUR3awo0+OqZZtkWQkCFpNnSfhuiSk3PzFYdZSp6
+XXkaWe5JGngSfjHXwzp53PQfOPFM1Mg7dKoD4x0uQZejxZWzM34OfKFVYIGMr/pw
+AH6seZhxOXoClnCpSQf71gSbmHf2D/CYmrx8XdO/Y6b75YIv4AZ0WcdP3j5xTOl7
+UOtMYkPS3U0U5m1HdQO49x090cvLjJt18Wdup/BfSpglsDhHNvT0ML0ytTWVlCm5
+hKXG1ZshTmze6FO7s8spEalVqeZQ+2uUzIOqFIQRvwsdovxHqdKz6lqz5wHL9pGX
+KbRF3LtpLPE1+ZyIzngLxU7RnlqC7CssZfDDeY3W6OkV4nWO3jx1HmZ5fqlhU05a
+g+k8XFecbRz0aejtIS3M2+2PKFkrBExgi9bB/DHmYIWfpdygs4k+ECThw5rQP4TC
+q8fF1TtaQm/2YS/gAqH+o9+Y+cUyoWxNklaVIzJSi/WVoJ2Psgxjyzrpvw3vtrSZ
+4XzZzkWNDyMcWUehhk7Lpk7Jzhf6wtTLlipIAKx/FBLNaaY49rlpMsWdVzpNtgtO
+/wAItprP+xBNPmUTInFzDnQJUAlpdlFPffv5RGV+M8vfXs9N5gWxYlZypHO8XxY7
+sjDlz1jaaVDFsPsDk2PKO5wTwqKwgmpPH8Q+cWxo09HySG5m/wBseULJeCNjAE1Z
+On0PmYIMi8ZFn0i0NmbeGz+oB+U+cTWmPi6p6gqlAjbLCXPC2xDPJpsnOTa05g1m
+OUfSN9BDt0zk3dF+1XprF9BmGX5Zlhlp3MwpBJUVW1uT7o5+XPVjq4uP1UyFWXIu
+dXfAQ6g+0rYjmIzuP67jWZfnqmXR6tIz8olsrvbTX+sYXCyujDOWLhFNkmLv5la8
+OkNoeulb0HazX2ULLSVZGxcbjwiphazyzkQKMtycfdnHgRlA6FJ5Hj746+HCTtwc
+/JbdHNQ1ZqAyfwx5RpU4+FnUtZ5/T6xXnF7ZaGGBT6t8Wt2h5Qsl4oWK1XrOX8MH
++ZggsLmUN3UlXdDZG5hz9hC3IxFaY+Leln9Tp/LAv4RnpEqahUxIJPqkErcAO5US
+Nfd5wqWE+oWFZNtmTYlEG6bE35m+scXLv9Xbv4pNPK9hhbt1JbVobpUOELDPR54b
+DDTlTo7pBbK0g7jjGu8cmWssVpMY3qEzLpl0srFhYgA3I+EKYRV5MrHeh0KerlVQ
+/UG1NSvtKSrQqHL3w8spjOk443K9iOj1aVqU3PBgpSQuyUfdT2QR3aCOnj6mnLyz
+vZyUD93mf9sRVGPhbz6gZ18X+tV5xWmWxfgdeZDwtqFfKFkvFVYxWUV5JHFr5wQZ
+eoLHo+m21AmbR/1/9hbT+aNqVTHKdTjLqWFGxFwIVVjNRS1fGdOwpTTJqUJufCbB
+hs6A/ePDw3hKkIGqzj9QemZ15RW46orUfE/KBUTqDVxITjZevkvfSMuTj/U6bcef
+5vZryjrM3LocQpK0LFwRqDHJZ/XXL9jSYpjDuvRI8csJSKaWhBu20gHnYQi1GPI6
+tJulBAWoGyu+KhXwmqa9N0esKbKih9lw5rbf2fIx3Y3fccOWPyvqHB861UsKyr7S
+hZaMqkj6KhoR/fdFbZya6QH8DtPPrdM04CtRVaw4xX6R+FrQ6EmilwJeU4Fm/agt
+2cx0gV3DT1WqImEzCUAIy2y34wbFxBLWO6iUlSsgA3JhaR+rVZW/SJVJ1gyss6WE
+EWWtGi1DlfgPCE0k/oEecU4sklVz3wKQ7WcUyq2VYJT8x84DaS4DjRaX7aNP/YAJ
+sK4lVRpoSk8SZN09le/Rq5+HMRjycf67nrbj5Pz1fDWllNzDCXEKStChdKkm4UOY
+jm18rp3/AB4tnXQQtK2qag2S6G+65gKlJWQhzFs84kdkry+8C0dfF/5cvJ6JMO4w
+qeHWnGpZ31CiFKbUnMkm1r24HbaNWFgrlPSS/NKQkvNt3PaJJ0hzSLL8HWHKoupv
+qzPBxNgRlMOyQsbbe0bEdZnqbUQ1LrbyFN+2qx3hyDLLVJWamweyDoNkxC5jpXrW
+V7QG4lRO1r84DR5hpbqUqSrK4ghST3/0gPTmhwOuIeQLH2VjlASUUh1JSRfXUQGn
+UrGUzhR9ptbinZZau00o3FufcfD+cRlhMl48lxNuk12RrcqJiTdC08Qd0+Mc2WNl
+1XVjlMpuK/EU+mlyz02QCVdlNzbW0TMbbpWVkm6S70+/1t0hpokqvmNySd47ccZJ
+pw223bnKTU4mdbadc6Rp0ELSRsddRDSnq6RhwkXAuFAwGJsLYvn8NzqX2CHWFH1j
+K9ljuPA98BWbG9dqTGJ52Vnqcq7a2LqSrQoObVJ74ueMMuqVSlG+u8Q6HNSiIA8J
+SdYA8NucAQVlUrNlxKFKbXbOEi5B52hBKXMC3qknMRuRDCKqX6W/SDPffNxgDrTl
+zNImumkHXGuYQsix7v6QrJfTls8XFYxBO10s9YASptOWw0BPFXjE44TGqz5LlNVT
+mXGc+MWh6ZZKilRSCU8YA7FG45jSAMaJSgDkbQBd0SsPUxbuUZkKHsnnzh70jLHa
+qHHxiVtV6JvDDjt8YA3ygI4wBrlGf3QBsEjLtAbLDlAG6QIQcrdpR5GGTpYWvAGx
+FlECAPLa35QBooBPSW4C8ASZXVRvyhlX/9mJAk4EEwEIADgWIQT4KAb9ob9bmhsw
+FOfJ/O1spreUVAUCW/AHrgIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ
+/O1spreUVJ4nD/9tGS8cg2eUSwd0ExCl0dWsJRdM0mUYh17mXyVNLcvbglIkSdma
+v/Ty3ke533izRN/SkkU8vNthjKAohZmmXlaXrruEyHq2vfXcDg4+C7FJQ+O3PT2B
+S5ft3Ht2GmRpD2lWpeUlJ9BXF2EF5pSnHPOrlTHRUfjBCDU4uuSeKgioSyoc2iWb
+BBaSXyeQAUR+ppM1AYKUlCDxpLbe3nVCOUc+JgJzv+47EqwMyVODwzk7oFO4GMRm
+KTKlctb1ym75oV1tiZi2fL/KA2uAab/RMO0rfxa9HVWnJGvUEDMPlTfs7222zuLB
+55Fzllfx5rQlou+MLBQIV978HRZrDxZesQOOJ4/BwTPgQ42GREf+uf5/SG4Fn3Qh
+NZsvoaePMLN/QQEjM7eqOUzRJRVcdJfRH+LinIFrAqcmbbcp1bvq8LV5lbmlFJLF
+gimvW/shf/6Zu1YsfBhvLWInUCyoOPFa1tASF6qqi1hEOd8tQgNE/H/FSIehmTHT
+74kYPNRm+DzlvrW2JPVl24Nf/SWbOG/IzGBY/pDActTwYqnpXKR7eUt/YcPpmrPi
+kyIKX32U2vTBCE3yvCm0KRzrcSbTJGfVgmlxxqIuOtbeaBtf96m+o5z/xw9ro7Ek
+VZbsx6fPuWuLY/MqeLXl1EuiU6X1sr+skDY8lJeeiRt+Uq5mCZuEgWdM1IhdBBAR
+AgAdFiEE3DhHSHCdJhn/KGchbQyv/dsc/pAFAlvwCAQACgkQbQyv/dsc/pABQACf
+YaUOqzlafrzeGdwHwDleootu0UcAn2adbaKJ79QBtDVPkR77zV801JlXuQINBFvw
+A+gBEACt8AiUTMcyNXwN6kiOLPd+85IPlLwEVyofz8p2QBAxJsqKozlXXpnK7ahC
+RSiHt02EK39WiyZpeY1/2dGmdvyI1vc7ld3814Dveh4nf1GRSpDZ427cxayaclh+
+wRQ8nDWFOQUsMB3He/Z+aO6l/ZNvdVdzRUHda1XvN41nwXUL9FQUn/TLYgHbxa7P
+Yy18ZnNzH/xGSwDgRrqPEAZ8KOpbHEbNyYuYuv6IM8Xmbp8Q6bl2RyBNnrlphksJ
+kLvO6RLHUvvw5uX5bt+u3umoZ+yHUkP13NtQHTyZ8VTCQimkB6OisisOTnV8OjLG
+xtLEF/TjeGFAAoEnc8bQAPvrtONQL19rPkMB0gXYXPBbGw7eWYr3QpuOujUXcz9U
+0JSSEov7cUepdTY8LEYFw8U5WimKY6f/uJUVx/ukNPtuAljJji0cjIGEOX2XGlBV
+Ix/U3vywLBfUFW5hT+75z7UB3yG3Zexo0WSaQxxZ5PHxyPYBK1PvVkH0LvkbxJcr
+rouJJQ66chjRglUbv4lf85/cG1ZLu3Ds0UbuD0gE9sAEwXtfdgDmp/HB7mxwJr1O
+BRbTRv0Okx/lovWXkxt+hX+DXZ1u1qdZUW3zjmge8W7xag3epD21jIjFDODgUfDT
+fgJi2FQq+szpagfPN5j5aIQKHCZf0DLbBD+ZWYQdld5JZs2V5QARAQABiQI2BBgB
+CAAgFiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvwA+gCGwwACgkQyfztbKa3lFTa
+yxAAxQo/9dvOO74J+9XznCYb5iO1B1ksnVegSGVuId45JKXkCkuWvDOkcU8+ma38
+wo3MBoPLpSMCXc/mKQ0p0ntO1tD/Wf4nBBCvseWcsR6RR5Su5jYorm0qZ89IOEPN
+K2W2Z41X6DHyteB1dAyIyexOYoLKD7iWcQzga4/EoUPEwcr8BWWgGLBfRhXsYySz
+F3fQPS7KaemDLGbJfTDZCSqmsZPnlksSvGxEBwUwfCjfY+QHxzWPRFPkuQJJR6YW
+tiZ3z7jBRdRk/R5v2CJZJuGHcPPYQy6j2TYGONojm+ifaq1hz+A0aoy4P9qRW5Nl
+mm6yiqEoJe07DrMLxn3H3ucuOo7DiNWmkkjW8DfhFSd+3pFMSvKGujOJWN27UDEp
+ERWFX50gE15Sq4aPbMPNRejFQ1n75B4jfFQXg6WuwF3kwgHK3Y5T5vTEkbPgce9c
+SyyFWU7EA4DJGnt7/FoaPDTKOWI9WSkmjOSABTBNSaUiMSFA3Wg/T0aS5pETpkv2
+S/GVVX022orAGK8zEY1vr2a24itOAKpQwFRuMjqDCBVgKAsMtlPu8jv3Zm/AMcYM
+sRRnDWJh2TO8bqXXUG/o783fcTE3d1Ff7s4BfmBqpGHigZeehNvu+FshRDYaDrDN
+IS0fTqbsX/JjaCXwU/o2E6G4aE79Ut/IMsCYzItTDh2UmcS5Ag0EW/G8wgEQALBi
+2/A7Ev/92mYi4Gm//IJEKjm2Vc3NcX5LdSyPwdSLlHSRwvzZz7M0VeflcTYqssto
+VPVf4maDtLGbQJn43CLqjvIW/C6jzjfvoZf0gbHpNfKY1ENs5xgE0wd3ZdsqpQC6
+W9Pu+kN31QS9+RUKwiG2bNBIREChL/omqiLhNu3hDbZnB+uSByOk901XVrNmKa8G
+NzXSfJSCt0gP7XU6VpMqjxppA8Y2Vo7jnylbrgVJriTt6jtjDylBBQqmHSOXMT+q
+9kIWDSocKhSFHBMO6LYnAwbMef2kqio5zaKzZAuwis0zjOqKHwW54xL2T7djFav9
+VlgcAYN105iMLUiIl39HLeZnS5pUESOXRUv/qLwiQRvBlWBPIep3+ycM2eK8r5a1
+5EwCgN2nSl3KYjzTOisCmK1nQs+gQ1RMraeBGYEG0uIUvDxfoONTuYkM3dhWq2Xx
+V/OO6yUkfyOlBGUREe1PXAOsP0LtAFJha7kbh7Eg6GGU7gRYh2dG2Ln6Vmx1ldbS
+F3woFYPGNMsQmgEKxwyjKaq0Qhd/sKHrTpPz8PXfGP4dHegExKegS7Yof1VrKBB+
+L8Q8o1Oi8JPCjRp47iga5OYS1Vn3h5a07ajzSAxPsmF0lmF4tYk2MFxSs403ShiE
+BTjN4t6rjmnoQV/b+CuhpmvzxaYr736/jkY7s0I5ABEBAAGJBGwEGAEIACAWIQT4
+KAb9ob9bmhswFOfJ/O1spreUVAUCW/G8wgIbAgJACRDJ/O1spreUVMF0IAQZAQgA
+HRYhBB2wOl45wX3kd77c+/0dTvV/qVkCBQJb8bzCAAoJEP0dTvV/qVkC3tUP/2rR
+VDaSPj9+UYJtHGDfQmYCEqxROm5wGCJbNrUQspLeL8+XrsaUDh1ldNAQtoDqGjRp
+kwjJAS0OZfvCv7pI052NK/KVGaK5Tj2+0lxTAcGbAKoH8E2HWPlERpU9CRLvzvDE
+4GGxw2nw7aobNGbf9d98c9RpZuAul92BOClnpGEU4VzjKUk9IsSjZQVJnggQujxL
+qWWiwfGwVsj2PdgPao/P48cYNl5CACBgY19AAh7WzgJVz/6je/5NLdAAV+E31qSE
+EaZsvTBqrMOtH6iTn1GpJ73FsJ0BYVt9X99bRT0Vi0iWulBuhYfZG4PdCY6fv6uC
+d+6pAC+Y/M9npaLbBHscSlJheTyvfuB7bzYBY+Q87VHSOMuNni7U08FuiILFoF+e
+/ESU/v0Hde44ghiXKSaFO8djxc874KM9UlGWvw9UbmI8Z2uM0kDcrPZ/8tcjXOhp
+PEBib54ab4tKCUCtOmsF9ZiT0hOqYdP9bXW+6OGfCignJ7ABhPpANfx2Sn/28L9l
+PbF1nA5CkHdyo/ku1Z/lNq44yvrB8r0Ljq6s3KS69dUZqqrADeogOdi0/TrghtKU
+DERWGmQagYSzMIvsXoAI56MxXFLriSObmpFLTWq7cr/+Ju3AcaSkrpDSYi3U6vLL
+8NuXPhul1S/+yPwvX6Mk1Zkip9/Wg4SQeiT2R7xj8zMP/RJ8uKbnKpOftY89Kv0Y
+FZ4hE3FeBR3UJvkuPdQYNLQRluzh63Bzc4ClSxB9Ma7fmAEiuFtgEi4HLTMBDOHO
+uVMuWYcgubu9VBlAGLJ++gnKxCAJXEntuB49il8MjMsy+uv/cFCjPG9z/1pmWYrE
+XBNA+vcaOrNTS2IykAbqybcPYbBcN47bm+A4i5yqiahk0q++j4LOW/nf88xXO7xI
+V/4vQgemh7RHgHJOkKfzOPw/Kx3UjV1jA9gEUrusHE4R3Upxh0ZeQW19hUnVlao1
+TxxKEUryrRzckuRfc5ziMWNyJaZsPMkeBEhyY/CizDFPrsSXIAijfu8KFnxCsnaM
+ylFBWOu5FwsKMDXxu0QdwqpL2CM8p+q12z1VruNjpIc8bAc0/YMndjYnxzsqQEMV
+GQIDKWqh/m6v7sqbn65ZQcVAzSAriGcQxCOIoT/TA/J+/4BSk5c8TKlqT8NBT77B
+Z70vMr41mZus1A/ciI8AxgbYwlhuvTehdm74k/c7NSzTxeG3OumTlBR1I18C4AIi
+y4iM3O4H4jvEssWBUzpm3VJG0NvcN/M4YVZHX5yxWQuIFcghzb7sLYddmRvR9B0M
+Xowot//r/sgn43xv54sIvwe9MkCCU6j7ePYUlOUnn+vQ5i7rFN/UPub3V3toI2gg
+DRuKdymWEii1jA9KlmheLTFr
+=r9L+
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/systems/zoldene/base.nix b/systems/zoldene/base.nix
new file mode 100644 (file)
index 0000000..8ca5d52
--- /dev/null
@@ -0,0 +1,122 @@
+{ name, config, lib, pkgs, secrets, ... }:
+let
+  # udev rules to be able to boot from qemu in a rescue
+  udev-qemu-rules =
+    let disks = config.disko.devices.disk;
+    in builtins.concatStringsSep "\n" (lib.imap1 (i: d: ''
+      SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_MODEL}=="QEMU_HARDDISK", ENV{ID_SERIAL_SHORT}=="QM0000${builtins.toString i}", SYMLINK+="${lib.removePrefix "/dev/" disks."${d}".device}"
+      SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="partition", ENV{ID_MODEL}=="QEMU_HARDDISK", ENV{ID_SERIAL_SHORT}=="QM0000${builtins.toString i}", SYMLINK+="${lib.removePrefix "/dev/" disks."${d}".device}-part%E{PARTN}"
+    '') (builtins.attrNames disks));
+in
+{
+  services.openssh = {
+    settings.KbdInteractiveAuthentication = false;
+    hostKeys = [
+      {
+        path = "/persist/zpool/etc/ssh/ssh_host_ed25519_key";
+        type = "ed25519";
+      }
+      {
+        path = "/persist/zpool/etc/ssh/ssh_host_rsa_key";
+        type = "rsa";
+        bits = 4096;
+      }
+    ];
+  };
+
+  system.stateVersion = "23.05";
+
+  # Useful when booting from qemu in rescue
+  console = {
+    earlySetup = true;
+    keyMap = "fr";
+  };
+
+  services.udev.extraRules = udev-qemu-rules;
+  fileSystems."/persist/zfast".neededForBoot = true;
+  boot = {
+    zfs.forceImportAll = true; # needed for the first boot after
+                               # install, because nixos-anywhere
+                               # doesn't export filesystems properly
+                               # after install (only affects fs not
+                               # needed for boot, see fsNeededForBoot
+                               # in nixos/lib/utils.nix
+    kernelParams = [ "boot.shell_on_fail" ];
+    loader.grub.devices = [
+      config.disko.devices.disk.sda.device
+      config.disko.devices.disk.sdb.device
+    ];
+    extraModulePackages = [ ];
+    kernelModules = [ "kvm-intel" ];
+    supportedFilesystems = [ "zfs" ];
+    kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
+    initrd = {
+      postDeviceCommands = lib.mkAfter ''
+        zfs rollback -r zfast/root@blank
+      '';
+      services.udev.rules = udev-qemu-rules;
+      availableKernelModules = [ "e1000e" "ahci" "sd_mod" ];
+      network = {
+        enable = true;
+        postCommands = "echo 'cryptsetup-askpass' >> /root/.profile";
+        flushBeforeStage2 = true;
+        ssh = {
+          enable = true;
+          port = 2222;
+          authorizedKeys = config.users.extraUsers.root.openssh.authorizedKeys.keys;
+          hostKeys = [
+            "/boot/initrdSecrets/ssh_host_rsa_key"
+            "/boot/initrdSecrets/ssh_host_ed25519_key"
+          ];
+        };
+      };
+    };
+  };
+  networking = {
+    hostId = "6251d3d5";
+    firewall.enable = false;
+    firewall.allowedUDPPorts = [ 43484 ];
+    # needed for initrd proper network setup too
+    useDHCP = lib.mkDefault true;
+
+    wireguard.interfaces.wg0 = {
+      generatePrivateKeyFile = true;
+      privateKeyFile = "/persist/zpool/etc/wireguard/wg0";
+      #presharedKeyFile = config.secrets.fullPaths."wireguard/preshared_key";
+      listenPort = 43484;
+
+      ips = [
+        "192.168.1.25/24"
+      ];
+      peers = [
+      ];
+    };
+  };
+
+  powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
+  hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
+  hardware.enableRedistributableFirmware = lib.mkDefault true;
+  system.activationScripts.createDatasets = {
+    deps = [ ];
+    text = ''
+      PATH=${pkgs.zfs}/bin:$PATH
+    '' + builtins.concatStringsSep "\n" (lib.mapAttrsToList (name: c: ''
+      if ! zfs list "${c._parent.name}/${name}" 2>/dev/null >/dev/null; then
+        ${c._create { zpool = c._parent.name; }}
+      fi
+    '') (config.disko.devices.zpool.zfast.datasets // config.disko.devices.zpool.zpool.datasets));
+  };
+
+  secrets.keys."wireguard/preshared_key/eldiron" = {
+    permissions = "0400";
+    user = "root";
+    group = "root";
+    text = let
+      key = builtins.concatStringsSep "_" (builtins.sort builtins.lessThan [ name "eldiron" ]);
+    in
+      "{{ .wireguard.preshared_keys.${key} }}";
+  };
+  secrets.decryptKey = "/persist/zpool/etc/ssh/ssh_host_ed25519_key";
+  # ssh-keyscan zoldene | nix-shell -p ssh-to-age --run ssh-to-age
+  secrets.ageKeys = [ "age1rqr7qdpjm8fy9nf3x07fa824v87n40g0ljrgdysuayuklnvhcynq4c8en8" ];
+}
diff --git a/systems/zoldene/disko.nix b/systems/zoldene/disko.nix
new file mode 100644 (file)
index 0000000..7df5697
--- /dev/null
@@ -0,0 +1,87 @@
+{ cryptKeyFile, ... }: {
+  disko.devices = let
+    zpoolDatasets = {
+      "root"         = { type = "zfs_fs";                                options.mountpoint = "none"; };
+      "root/persist" = { type = "zfs_fs"; mountpoint = "/persist/zpool"; options.mountpoint = "legacy"; };
+    };
+    zfastDatasets = {
+      "root"         = { type = "zfs_fs"; mountpoint = "/";              options.mountpoint = "legacy"; postCreateHook = "zfs snapshot zfast/root@blank"; };
+      "root/nix"     = { type = "zfs_fs"; mountpoint = "/nix";           options.mountpoint = "legacy"; };
+      "root/persist" = { type = "zfs_fs"; mountpoint = "/persist/zfast"; options.mountpoint = "legacy"; };
+      "root/persist/var" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var"; options.mountpoint = "legacy"; };
+      "root/persist/var/lib" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib"; options.mountpoint = "legacy"; };
+    };
+  in {
+    disk = {
+      sda = {
+        type = "disk";
+        device = "/dev/disk/by-id/ata-SAMSUNG_MZ7LM480HCHP-00003_S1YJNYAG700613";
+        content = {
+          type = "table";
+          format = "gpt";
+          partitions = [
+            { start = "2GiB"; end = "-8GiB"; name = "ssdLuksA"; content = { type = "luks"; name = "ssdA"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zfast"; }; }; }
+            { start = "-8GiB"; end = "-2MiB"; name = "swapA"; flags = [ "swap" ]; content = { type = "swap"; }; }
+            { start = "2048s"; end = "4095s"; name = "ssdGrubA"; flags = [ "bios_grub" ]; }
+            { start = "4096s"; end = "2GiB"; name = "ssdBootA"; content = { type = "filesystem"; format = "ext4"; mountpoint = "/boot"; }; }
+          ];
+        };
+      };
+      sdb = {
+        type = "disk";
+        device = "/dev/disk/by-id/ata-SAMSUNG_MZ7LM480HCHP-00003_S1YJNYAG700682";
+        content = {
+          type = "table";
+          format = "gpt";
+          partitions = [
+            { start = "2GiB"; end = "-8GiB"; name = "ssdLuksB"; content = { type = "luks"; name = "ssdB"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zfast"; }; }; }
+            { start = "-8GiB"; end = "-2MiB"; name = "swapB"; flags = [ "swap" ]; content = { type = "swap"; }; }
+            { start = "2048s"; end = "4095s"; name = "ssdGrubB"; flags = [ "bios_grub" ]; }
+            #{ start = "4096s"; end = "2GiB"; name = "ssdBootB"; content = { type = "filesystem"; format = "ext4"; }; } # non monté
+          ];
+        };
+      };
+      sdc = {
+        type = "disk";
+        device = "/dev/disk/by-id/ata-ST4000NM0245-1Z2107_ZC110SY1";
+        content = {
+          type = "table";
+          format = "gpt";
+          partitions = [
+            { start = "2048s"; end = "-34s"; name = "hddLuksA"; content = { type = "luks"; name = "bigA"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zpool"; }; }; }
+          ];
+        };
+      };
+      sdd = {
+        type = "disk";
+        device = "/dev/disk/by-id/ata-ST4000NM0245-1Z2107_ZC110YXX";
+        content = {
+          type = "table";
+          format = "gpt";
+          partitions = [
+            { start = "2048s"; end = "-34s"; name = "hddLuksB"; content = { type = "luks"; name = "bigB"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zpool"; }; }; }
+          ];
+        };
+      };
+    };
+
+    zpool = {
+      zpool = {
+        type = "zpool";
+        mode = "mirror";
+        mountRoot = "/";
+        rootFsOptions = { mountpoint = "none"; atime = "off"; xattr = "sa"; acltype = "posix"; };
+        options = { ashift = "12"; };
+        datasets = zpoolDatasets;
+      };
+      zfast = {
+        type = "zpool";
+        mode = "mirror";
+        mountRoot = "/";
+        rootFsOptions = { mountpoint = "none"; atime = "off"; xattr = "sa"; acltype = "posix"; };
+        options = { ashift = "12"; };
+        datasets = zfastDatasets;
+      };
+    };
+  };
+}
diff --git a/systems/zoldene/flake.lock b/systems/zoldene/flake.lock
new file mode 100644 (file)
index 0000000..0a9ba64
--- /dev/null
@@ -0,0 +1,560 @@
+{
+  "nodes": {
+    "backports": {
+      "inputs": {
+        "flake-utils": "flake-utils_2",
+        "nixpkgs": "nixpkgs_6"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
+        "path": "../../backports",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../backports",
+        "type": "path"
+      }
+    },
+    "colmena": {
+      "inputs": {
+        "flake-compat": "flake-compat",
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs",
+        "stable": "stable"
+      },
+      "locked": {
+        "lastModified": 1687954574,
+        "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
+        "owner": "immae",
+        "repo": "colmena",
+        "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
+        "type": "github"
+      },
+      "original": {
+        "owner": "immae",
+        "ref": "add-lib-get-flake",
+        "repo": "colmena",
+        "type": "github"
+      }
+    },
+    "disko": {
+      "inputs": {
+        "nixpkgs": "nixpkgs_2"
+      },
+      "locked": {
+        "lastModified": 1687968164,
+        "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
+        "owner": "nix-community",
+        "repo": "disko",
+        "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "disko",
+        "type": "github"
+      }
+    },
+    "environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../environment",
+        "type": "path"
+      }
+    },
+    "flake-compat": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1650374568,
+        "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib"
+      },
+      "locked": {
+        "lastModified": 1687762428,
+        "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_2": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_2"
+      },
+      "locked": {
+        "lastModified": 1675295133,
+        "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-utils": {
+      "locked": {
+        "lastModified": 1659877975,
+        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_2": {
+      "locked": {
+        "lastModified": 1667395993,
+        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "impermanence": {
+      "locked": {
+        "lastModified": 1684264534,
+        "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=",
+        "owner": "nix-community",
+        "repo": "impermanence",
+        "rev": "89253fb1518063556edd5e54509c30ac3089d5e6",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "ref": "master",
+        "repo": "impermanence",
+        "type": "github"
+      }
+    },
+    "my-lib": {
+      "inputs": {
+        "colmena": "colmena",
+        "disko": "disko",
+        "flake-parts": "flake-parts",
+        "nixos-anywhere": "nixos-anywhere",
+        "nixpkgs": "nixpkgs_4"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
+        "path": "../../flakes/lib",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/lib",
+        "type": "path"
+      }
+    },
+    "mypackages": {
+      "inputs": {
+        "flake-parts": "flake-parts_2",
+        "nixpkgs": "nixpkgs_7",
+        "webapps-ttrss": "webapps-ttrss"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
+        "path": "../../mypackages",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../mypackages",
+        "type": "path"
+      }
+    },
+    "myuids": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
+        "path": "../../myuids",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../myuids",
+        "type": "path"
+      }
+    },
+    "nixos-2305": {
+      "locked": {
+        "lastModified": 1687938137,
+        "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "release-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixos-anywhere": {
+      "inputs": {
+        "disko": [
+          "my-lib",
+          "disko"
+        ],
+        "flake-parts": [
+          "my-lib",
+          "flake-parts"
+        ],
+        "nixos-2305": "nixos-2305",
+        "nixos-images": "nixos-images",
+        "nixpkgs": "nixpkgs_3",
+        "treefmt-nix": "treefmt-nix"
+      },
+      "locked": {
+        "lastModified": 1689945193,
+        "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "rev": "27161266077a177ac116e2cb72cc70af5f145189",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "nixos-anywhere",
+        "type": "github"
+      }
+    },
+    "nixos-images": {
+      "inputs": {
+        "nixos-2305": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixos-2305"
+        ],
+        "nixos-unstable": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1686819168,
+        "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixos-images",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1683408522,
+        "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1685564631,
+        "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_2": {
+      "locked": {
+        "dir": "lib",
+        "lastModified": 1675183161,
+        "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
+        "type": "github"
+      },
+      "original": {
+        "dir": "lib",
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_2": {
+      "locked": {
+        "lastModified": 1687701825,
+        "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_3": {
+      "locked": {
+        "lastModified": 1687893427,
+        "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "4b14ab2a916508442e685089672681dff46805be",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "ref": "nixos-unstable-small",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_4": {
+      "locked": {
+        "lastModified": 1648725829,
+        "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_5": {
+      "locked": {
+        "lastModified": 1693158576,
+        "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_6": {
+      "locked": {
+        "lastModified": 1687502512,
+        "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_7": {
+      "locked": {
+        "lastModified": 1646497237,
+        "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nixos",
+        "repo": "nixpkgs",
+        "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
+        "type": "github"
+      }
+    },
+    "private-environment": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/environment",
+        "type": "path"
+      }
+    },
+    "private-system": {
+      "inputs": {
+        "backports": "backports",
+        "environment": "environment",
+        "mypackages": "mypackages",
+        "myuids": "myuids",
+        "secrets-public": "secrets-public"
+      },
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
+        "path": "../../flakes/private/system",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/private/system",
+        "type": "path"
+      }
+    },
+    "public-secrets": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../flakes/secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../flakes/secrets",
+        "type": "path"
+      }
+    },
+    "root": {
+      "inputs": {
+        "impermanence": "impermanence",
+        "my-lib": "my-lib",
+        "nixpkgs": "nixpkgs_5",
+        "private-environment": "private-environment",
+        "private-system": "private-system",
+        "public-secrets": "public-secrets"
+      }
+    },
+    "secrets-public": {
+      "locked": {
+        "lastModified": 1,
+        "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
+        "path": "../../secrets",
+        "type": "path"
+      },
+      "original": {
+        "path": "../../secrets",
+        "type": "path"
+      }
+    },
+    "stable": {
+      "locked": {
+        "lastModified": 1669735802,
+        "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "731cc710aeebecbf45a258e977e8b68350549522",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-22.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "my-lib",
+          "nixos-anywhere",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1687940979,
+        "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "0a4f06c27610a99080b69433873885df82003aae",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
+    "webapps-ttrss": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1546759381,
+        "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "revCount": 9256,
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      },
+      "original": {
+        "ref": "master",
+        "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
+        "type": "git",
+        "url": "https://git.tt-rss.org/fox/tt-rss.git"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/systems/zoldene/flake.nix b/systems/zoldene/flake.nix
new file mode 100644 (file)
index 0000000..42466e8
--- /dev/null
@@ -0,0 +1,29 @@
+{
+  inputs = {
+    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+    impermanence.url = "github:nix-community/impermanence/master";
+    my-lib.url = "path:../../flakes/lib";
+    public-secrets.url = "path:../../flakes/secrets";
+    private-environment.url = "path:../../flakes/private/environment";
+    private-system.url = "path:../../flakes/private/system";
+  };
+  outputs = inputs@{ self, nixpkgs, my-lib, ... }:
+    my-lib.lib.mkColmenaFlake {
+      name = "zoldene";
+      inherit self nixpkgs;
+      system = "x86_64-linux";
+      targetHost = "88.198.39.152";
+      targetUser = "root";
+      nixosModules = with inputs; {
+        impermanence = impermanence.nixosModule;
+        base = ./base.nix;
+        disko = ./disko.nix;
+        logging = ./logging.nix;
+
+        secrets = public-secrets.nixosModule;
+
+        environment = private-environment.nixosModule;
+        system = private-system.nixosModule;
+      };
+    };
+}
diff --git a/systems/zoldene/logging.nix b/systems/zoldene/logging.nix
new file mode 100644 (file)
index 0000000..09ee104
--- /dev/null
@@ -0,0 +1,138 @@
+{ config, pkgs, name, ... }:
+# Initialization
+#   CREATE INDEX ON LOGS (tag);
+#   CREATE INDEX ON LOGS (time);
+#   CREATE INDEX ON LOGS (((data->>'PRIORITY')::int));
+#   CREATE INDEX ON LOGS ((data->>'_SYSTEMD_UNIT'));
+#   CREATE INDEX ON LOGS ((data->>'SYSLOG_IDENTIFIER'));
+let
+  fluent-bit-config = {
+    pipeline = {
+      inputs = [
+        {
+          name = "systemd";
+          tag  = "${name}.systemd";
+          DB   = "/var/lib/fluentbit/fluent-bit.db";
+        }
+      ];
+      outputs = [
+        {
+          name = "loki";
+          match = "${name}.systemd";
+          line_format = "json";
+          labels = "job=fluentbit, server=${name}, priority=$PRIORITY, syslog_identifier=$SYSLOG_IDENTIFIER, systemd_unit=$_SYSTEMD_UNIT";
+        }
+        {
+          name = "pgsql";
+          match = "*";
+          host = "/run/postgresql";
+          user = "fluentbit";
+          table = "logs";
+          database = "fluentbit";
+          timestamp_key = "event_timestamp";
+        }
+      ];
+    };
+  };
+  yamlFormat = pkgs.formats.yaml {};
+  psqlVersion = pkgs.postgresql_13.psqlSchema;
+in
+{
+  disko.devices.zpool.zfast.datasets."root/persist/var/lib/loki" =
+    { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/loki"; options.mountpoint = "legacy"; };
+  disko.devices.zpool.zfast.datasets."root/persist/var/lib/fluentbit" =
+    { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/fluentbit"; options.mountpoint = "legacy"; };
+  disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql" =
+    { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql"; options.mountpoint = "legacy"; };
+  disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql/${psqlVersion}" =
+    { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql/${psqlVersion}"; options.mountpoint = "legacy"; };
+  environment.persistence."/persist/zfast".directories = [
+    {
+      directory = "/var/lib/postgresql";
+      user = config.users.users.postgres.name;
+      group = config.users.users.postgres.group;
+      mode = "0755";
+    }
+    {
+      directory = "/var/lib/fluentbit";
+      user = config.users.users.fluentbit.name;
+      group = config.users.users.fluentbit.group;
+      mode = "0755";
+    }
+    {
+      directory = "/var/lib/loki";
+      user = config.users.users.loki.name;
+      group = config.users.users.loki.group;
+      mode = "0755";
+    }
+  ];
+
+  ids.uids.fluentbit = 500;
+  ids.gids.fluentbit = 500;
+  users.users.fluentbit = {
+    name = "fluentbit";
+    home = "/var/lib/fluentbit";
+    uid = config.ids.uids.fluentbit;
+    group = "fluentbit";
+    isSystemUser = true;
+    extraGroups = [ "systemd-journal" ];
+  };
+  users.groups.fluentbit.gid = config.ids.gids.fluentbit;
+
+  services.loki = {
+    enable = true;
+    configuration = {
+      auth_enabled = false;
+      common = {
+        ring.kvstore.store = "inmemory";
+        ring.instance_addr = "127.0.0.1";
+        replication_factor = 1;
+        path_prefix = "/var/lib/loki";
+      };
+      server.log_level = "warn";
+      limits_config = {
+        reject_old_samples = false;
+        ingestion_rate_mb = 100;
+        ingestion_burst_size_mb = 200;
+        per_stream_rate_limit = "100MB";
+        per_stream_rate_limit_burst = "200MB";
+      };
+
+      schema_config.configs = [
+        {
+          from = "2020-10-24";
+          store = "boltdb-shipper";
+          object_store = "filesystem";
+          schema = "v11";
+          index.prefix = "index_";
+          index.period = "24h";
+        }
+      ];
+    };
+  };
+  services.postgresql = {
+    enable = true;
+    package = pkgs.postgresql_13;
+    ensureDatabases = [ "fluentbit" ];
+    ensureUsers = [
+      {
+        name = "fluentbit";
+        ensurePermissions."DATABASE \"fluentbit\"" = "ALL PRIVILEGES";
+      }
+    ];
+  };
+
+  environment.systemPackages = [
+    pkgs.fluent-bit
+  ];
+  systemd.services.fluent-bit = {
+    description = "Fluent-bit daemon";
+    wantedBy = [ "multi-user.target" ];
+    serviceConfig = {
+      ExecStart = "${pkgs.fluent-bit}/bin/fluent-bit -c ${yamlFormat.generate "fluent.yaml" fluent-bit-config}";
+      User = "fluentbit";
+      Group = "fluentbit";
+      SupplementaryGroups = [ "systemd-journal" ];
+    };
+  };
+}