aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsmaël Bouya <ismael.bouya@normalesup.org>2023-10-04 01:35:06 +0200
committerIsmaël Bouya <ismael.bouya@normalesup.org>2023-10-04 02:11:48 +0200
commit1a64deeb894dc95e2645a75771732c6cc53a79ad (patch)
tree1b9df4838f894577a09b9b260151756272efeb53
parentfa25ffd4583cc362075cd5e1b4130f33306103f0 (diff)
downloadNix-1a64deeb894dc95e2645a75771732c6cc53a79ad.tar.gz
Nix-1a64deeb894dc95e2645a75771732c6cc53a79ad.tar.zst
Nix-1a64deeb894dc95e2645a75771732c6cc53a79ad.zip
Squash changes containing private information
There were a lot of changes since the previous commit, but a lot of them contained personnal information about users. All thos changes got stashed into a single commit (history is kept in a different place) and private information was moved in a separate private repository
-rw-r--r--.envrc32
-rw-r--r--.gitconfig9
-rw-r--r--.gitignore3
-rw-r--r--.gitmodules3
-rw-r--r--DOCUMENTATION.md30
-rw-r--r--Makefile130
-rw-r--r--default.nix14
-rw-r--r--deploy/flake.lock9816
-rw-r--r--deploy/flake.nix45
-rw-r--r--environments/default.nix4
-rw-r--r--environments/immae-eu.nix146
-rw-r--r--flake.lock9825
-rw-r--r--flake.nix47
-rw-r--r--flakes/backports/flake.lock13
-rw-r--r--flakes/backports/flake.nix105
-rw-r--r--flakes/copanier/default.nix30
-rw-r--r--flakes/copanier/fix_reduce.patch13
-rw-r--r--flakes/copanier/flake.lock59
-rw-r--r--flakes/copanier/flake.nix28
-rw-r--r--flakes/copanier/poetry.lock995
-rw-r--r--flakes/copanier/pyproject.toml40
-rw-r--r--flakes/diaspora/default.nix74
-rw-r--r--flakes/diaspora/flake.lock75
-rw-r--r--flakes/diaspora/flake.nix214
-rw-r--r--flakes/diaspora/gemset.nix (renamed from pkgs/webapps/diaspora/gemset.nix)0
-rw-r--r--flakes/diaspora/gemset_ldap.nix (renamed from pkgs/webapps/diaspora/gemset_ldap.nix)0
-rw-r--r--flakes/diaspora/ldap.patch (renamed from pkgs/webapps/diaspora/ldap.patch)0
-rw-r--r--flakes/etherpad-lite/default.nix68
-rw-r--r--flakes/etherpad-lite/etherpad_cleanup.sql30
-rw-r--r--flakes/etherpad-lite/flake.lock150
-rw-r--r--flakes/etherpad-lite/flake.nix227
-rw-r--r--flakes/etherpad-lite/libreoffice_patch.diff (renamed from pkgs/webapps/etherpad-lite/libreoffice_patch.diff)0
-rw-r--r--flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_adminpads/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_adminpads/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_align/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_align/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_bookmark/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_bookmark/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_colors/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_colors/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_comments_page/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_comments_page/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_cursortrace/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_cursortrace/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_embedmedia/fix.patch (renamed from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/fix.patch)0
-rw-r--r--flakes/etherpad-lite/modules/ep_embedmedia/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_embedmedia/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_font_family/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_font_family/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_font_size/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_font_size/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_headings2/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_headings2/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_immae_buttons/ep.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/ep.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_immae_buttons/hooks.js (renamed from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/hooks.js)0
-rw-r--r--flakes/etherpad-lite/modules/ep_immae_buttons/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_immae_buttons/package.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/package.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_immae_buttons/static/js/main.js (renamed from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/static/js/main.js)0
-rw-r--r--flakes/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs (renamed from pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs)0
-rw-r--r--flakes/etherpad-lite/modules/ep_ldapauth/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_ldapauth/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_line_height/fix.patch (renamed from pkgs/webapps/etherpad-lite/modules/ep_line_height/fix.patch)0
-rw-r--r--flakes/etherpad-lite/modules/ep_line_height/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_line_height/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_markdown/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_markdown/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_mypads/fix_ldap.patch (renamed from pkgs/webapps/etherpad-lite/modules/ep_mypads/fix_ldap.patch)0
-rw-r--r--flakes/etherpad-lite/modules/ep_mypads/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_mypads/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_page_view/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_page_view/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_previewimages/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_previewimages/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_private_pad/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_private_pad/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_ruler/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_ruler/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_scrollto/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_scrollto/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_subscript_and_superscript/font.patch (renamed from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/font.patch)0
-rw-r--r--flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.json (renamed from pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.json)0
-rw-r--r--flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix)0
-rw-r--r--flakes/etherpad-lite/node-packages.nix (renamed from pkgs/webapps/etherpad-lite/node-packages.nix)0
-rw-r--r--flakes/files-watcher/flake.nix2
-rw-r--r--flakes/flake.lock9669
-rw-r--r--flakes/flake.nix67
-rw-r--r--flakes/grocy/default.nix47
-rw-r--r--flakes/grocy/flake.lock150
-rw-r--r--flakes/grocy/flake.nix35
-rw-r--r--flakes/grocy/php-packages.nix (renamed from pkgs/webapps/grocy/php-packages.nix)0
-rw-r--r--flakes/grocy/yarn-packages.nix (renamed from pkgs/webapps/grocy/yarn-packages.nix)0
-rw-r--r--flakes/grocy/yarn.patch (renamed from pkgs/webapps/grocy/yarn.patch)0
-rw-r--r--flakes/lib/flake.lock272
-rw-r--r--flakes/lib/flake.nix76
-rw-r--r--flakes/loginctl-linger/flake.nix56
-rw-r--r--flakes/mastodon/default.nix94
-rw-r--r--flakes/mastodon/flake.lock75
-rw-r--r--flakes/mastodon/flake.nix331
-rw-r--r--flakes/mastodon/gemset.nix (renamed from pkgs/webapps/mastodon/gemset.nix)0
-rw-r--r--flakes/mastodon/yarn-packages.nix (renamed from pkgs/webapps/mastodon/yarn-packages.nix)0
-rw-r--r--flakes/mediagoblin/bower-packages.nix (renamed from pkgs/webapps/mediagoblin/bower-packages.nix)0
-rw-r--r--flakes/mediagoblin/default.nix213
-rw-r--r--flakes/mediagoblin/flake.lock78
-rw-r--r--flakes/mediagoblin/flake.nix271
-rw-r--r--flakes/mediagoblin/ldap_fix.py (renamed from pkgs/webapps/mediagoblin/ldap_fix.py)0
-rw-r--r--flakes/mediagoblin/plugins/basicsearch/default.nix (renamed from pkgs/webapps/mediagoblin/plugins/basicsearch/default.nix)0
-rw-r--r--flakes/multi-apache-container/flake.lock36
-rw-r--r--flakes/multi-apache-container/flake.nix389
-rw-r--r--flakes/mypackages/flake.lock83
-rw-r--r--flakes/mypackages/flake.nix43
-rw-r--r--flakes/mypackages/lib/default.nix37
-rw-r--r--flakes/mypackages/lib/flake-parts-lib.nix10
-rw-r--r--flakes/mypackages/lib/node-env.nix542
-rw-r--r--flakes/mypackages/lib/private/default.nix20
-rw-r--r--flakes/mypackages/overlays/bitlbee-discord/default.nix12
-rw-r--r--flakes/mypackages/overlays/bitlbee/bitlbee_long_nicks.patch (renamed from overlays/bitlbee/bitlbee_long_nicks.patch)0
-rw-r--r--flakes/mypackages/overlays/bitlbee/default.nix (renamed from overlays/bitlbee/default.nix)0
-rw-r--r--flakes/mypackages/overlays/databases/mysql/default.nix28
-rw-r--r--flakes/mypackages/overlays/databases/postgresql/default.nix (renamed from overlays/databases/postgresql/default.nix)0
-rw-r--r--flakes/mypackages/overlays/default.nix25
-rw-r--r--flakes/mypackages/overlays/gitolite/default.nix (renamed from overlays/gitolite/default.nix)0
-rwxr-xr-xflakes/mypackages/overlays/gitolite/invite (renamed from overlays/gitolite/invite)0
-rw-r--r--flakes/mypackages/overlays/gitweb/default.nix (renamed from overlays/gitweb/default.nix)0
-rw-r--r--flakes/mypackages/overlays/gitweb/theme/git-favicon.png (renamed from overlays/gitweb/theme/git-favicon.png)bin1125 -> 1125 bytes
-rw-r--r--flakes/mypackages/overlays/gitweb/theme/git-logo.png (renamed from overlays/gitweb/theme/git-logo.png)bin2412 -> 2412 bytes
-rw-r--r--flakes/mypackages/overlays/gitweb/theme/gitweb.css (renamed from overlays/gitweb/theme/gitweb.css)0
-rw-r--r--flakes/mypackages/overlays/gitweb/theme/gitweb.js (renamed from overlays/gitweb/theme/gitweb.js)0
-rw-r--r--flakes/mypackages/overlays/goaccess/default.nix (renamed from overlays/goaccess/default.nix)0
-rw-r--r--flakes/mypackages/overlays/kanboard/default.nix19
-rw-r--r--flakes/mypackages/overlays/morph/default.nix27
-rw-r--r--flakes/mypackages/overlays/morph/dry-run.patch (renamed from overlays/morph/dry-run.patch)0
-rw-r--r--flakes/mypackages/overlays/morph/verbose_nix.patch (renamed from overlays/morph/verbose_nix.patch)0
-rw-r--r--flakes/mypackages/overlays/php-packages/mysqli_patch.patch (renamed from overlays/php-packages/mysqli_patch.patch)0
-rw-r--r--flakes/mypackages/overlays/postfix/default.nix (renamed from overlays/postfix/default.nix)0
-rw-r--r--flakes/mypackages/overlays/taskwarrior/TW-1778_patch.diff (renamed from overlays/taskwarrior/TW-1778_patch.diff)0
-rw-r--r--flakes/mypackages/overlays/taskwarrior/default.nix (renamed from overlays/taskwarrior/default.nix)0
-rw-r--r--flakes/mypackages/overlays/ympd/default.nix14
-rw-r--r--flakes/mypackages/overlays/ympd/ympd-password-env.patch (renamed from overlays/ympd/ympd-password-env.patch)0
-rw-r--r--flakes/mypackages/pkgs/bash-libs/default.nix33
-rw-r--r--flakes/mypackages/pkgs/boinctui/default.nix21
-rw-r--r--flakes/mypackages/pkgs/cnagios/default.nix32
-rw-r--r--flakes/mypackages/pkgs/commento/default.nix (renamed from pkgs/commento/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/composer-env/default.nix243
-rw-r--r--flakes/mypackages/pkgs/crypto/cardano-cli/default.nix (renamed from pkgs/crypto/cardano-cli/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/crypto/cardano/default.nix35
-rw-r--r--flakes/mypackages/pkgs/crypto/iota-cli-app/default.nix29
-rw-r--r--flakes/mypackages/pkgs/crypto/iota-cli-app/node-packages.nix (renamed from pkgs/crypto/iota-cli-app/node-packages.nix)0
-rw-r--r--flakes/mypackages/pkgs/crypto/sia/default.nix (renamed from pkgs/crypto/sia/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/default.nix64
-rw-r--r--flakes/mypackages/pkgs/dovecot/plugins/deleted_to_trash/default.nix30
-rw-r--r--flakes/mypackages/pkgs/dovecot/plugins/deleted_to_trash/fix_mbox.patch (renamed from pkgs/dovecot/plugins/deleted_to_trash/fix_mbox.patch)0
-rw-r--r--flakes/mypackages/pkgs/flrn/default.nix22
-rw-r--r--flakes/mypackages/pkgs/fluent-bit/default.nix47
-rw-r--r--flakes/mypackages/pkgs/fluentd/Gemfile3
-rw-r--r--flakes/mypackages/pkgs/fluentd/Gemfile.lock38
-rw-r--r--flakes/mypackages/pkgs/fluentd/default.nix20
-rw-r--r--flakes/mypackages/pkgs/fluentd/gemset.nix126
-rw-r--r--flakes/mypackages/pkgs/gearmand/default.nix16
-rw-r--r--flakes/mypackages/pkgs/genius/default.nix19
-rw-r--r--flakes/mypackages/pkgs/ical2html/default.nix11
-rw-r--r--flakes/mypackages/pkgs/monitoring-plugins/default.nix33
-rw-r--r--flakes/mypackages/pkgs/mtop/default.nix24
-rw-r--r--flakes/mypackages/pkgs/mutt-ics/default.nix15
-rw-r--r--flakes/mypackages/pkgs/muttprint/0.73-4.diff.gz (renamed from pkgs/muttprint/0.73-4.diff.gz)bin16525 -> 16525 bytes
-rw-r--r--flakes/mypackages/pkgs/muttprint/default.nix (renamed from pkgs/muttprint/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/muttprint/regex.patch (renamed from pkgs/muttprint/regex.patch)0
-rw-r--r--flakes/mypackages/pkgs/muttprint/two_edge.patch (renamed from pkgs/muttprint/two_edge.patch)0
-rw-r--r--flakes/mypackages/pkgs/naemon-livestatus/default.nix32
-rw-r--r--flakes/mypackages/pkgs/naemon/default.nix44
-rw-r--r--flakes/mypackages/pkgs/nagios-cli/default.nix12
-rw-r--r--flakes/mypackages/pkgs/nagnu/default.nix21
-rw-r--r--flakes/mypackages/pkgs/nb/default.nix22
-rw-r--r--flakes/mypackages/pkgs/note/default.nix19
-rw-r--r--flakes/mypackages/pkgs/notmuch/notmuch-python/default.nix (renamed from pkgs/notmuch/notmuch-python/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/notmuch/notmuch-vim/default.nix (renamed from pkgs/notmuch/notmuch-vim/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/perl-ical-parser-html/default.nix48
-rw-r--r--flakes/mypackages/pkgs/pgpid/default.nix33
-rw-r--r--flakes/mypackages/pkgs/predixy/default.nix19
-rw-r--r--flakes/mypackages/pkgs/proftpd/default.nix22
-rw-r--r--flakes/mypackages/pkgs/pure-ftpd/default.nix30
-rw-r--r--flakes/mypackages/pkgs/riotkit-do/default.nix60
-rw-r--r--flakes/mypackages/pkgs/rrsync_sudo/default.nix (renamed from pkgs/rrsync_sudo/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/rrsync_sudo/sudo.patch (renamed from pkgs/rrsync_sudo/sudo.patch)0
-rw-r--r--flakes/mypackages/pkgs/shaarli/default.nix24
-rw-r--r--flakes/mypackages/pkgs/shaarli/shaarli_ldap.patch (renamed from overlays/shaarli/shaarli_ldap.patch)0
-rw-r--r--flakes/mypackages/pkgs/signaldctl/default.nix (renamed from pkgs/signaldctl/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/slang_1/default.nix (renamed from pkgs/slang_1/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/status_engine/host_perfdata.patch (renamed from pkgs/status_engine/host_perfdata.patch)0
-rw-r--r--flakes/mypackages/pkgs/status_engine/interface.nix24
-rw-r--r--flakes/mypackages/pkgs/status_engine/interface_composer.lock (renamed from pkgs/status_engine/interface_composer.lock)0
-rw-r--r--flakes/mypackages/pkgs/status_engine/interface_php_packages.nix (renamed from pkgs/status_engine/interface_php_packages.nix)0
-rw-r--r--flakes/mypackages/pkgs/status_engine/module.nix19
-rw-r--r--flakes/mypackages/pkgs/status_engine/worker.nix37
-rw-r--r--flakes/mypackages/pkgs/status_engine/worker_composer.lock2072
-rw-r--r--flakes/mypackages/pkgs/status_engine/worker_php_packages.nix266
-rw-r--r--flakes/mypackages/pkgs/telegram-history-dump/default.nix18
-rw-r--r--flakes/mypackages/pkgs/telegramircd/default.nix22
-rw-r--r--flakes/mypackages/pkgs/telethon_sync/default.nix (renamed from pkgs/telethon_sync/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/terminal-velocity/default.nix37
-rw-r--r--flakes/mypackages/pkgs/terminal-velocity/fix_build.patch (renamed from pkgs/terminal-velocity/fix_build.patch)0
-rw-r--r--flakes/mypackages/pkgs/terminal-velocity/python3_support.patch (renamed from pkgs/terminal-velocity/python3_support.patch)0
-rw-r--r--flakes/mypackages/pkgs/terminal-velocity/sort_found_notes.patch (renamed from pkgs/terminal-velocity/sort_found_notes.patch)0
-rw-r--r--flakes/mypackages/pkgs/tiv/default.nix19
-rw-r--r--flakes/mypackages/pkgs/tiv/tiv_builder.sh (renamed from pkgs/tiv/tiv_builder.sh)0
-rw-r--r--flakes/mypackages/pkgs/twins/default.nix (renamed from pkgs/twins/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/umami/build-geo.patch (renamed from pkgs/umami/build-geo.patch)0
-rw-r--r--flakes/mypackages/pkgs/umami/default.nix (renamed from pkgs/umami/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/unicode/default.nix (renamed from pkgs/unicode/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/upcmd/default.nix13
-rw-r--r--flakes/mypackages/pkgs/webapps/adminer/default.nix14
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/default.nix (renamed from pkgs/webapps/apache-theme/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/.htaccess (renamed from pkgs/webapps/apache-theme/theme/.htaccess)0
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/footer.html (renamed from pkgs/webapps/apache-theme/theme/footer.html)0
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/header.html (renamed from pkgs/webapps/apache-theme/theme/header.html)0
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/archive.png (renamed from pkgs/webapps/apache-theme/theme/icons/archive.png)bin551 -> 551 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/audio.png (renamed from pkgs/webapps/apache-theme/theme/icons/audio.png)bin554 -> 554 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/authors.png (renamed from pkgs/webapps/apache-theme/theme/icons/authors.png)bin492 -> 492 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bin.png (renamed from pkgs/webapps/apache-theme/theme/icons/bin.png)bin551 -> 551 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/blank.png (renamed from pkgs/webapps/apache-theme/theme/icons/blank.png)bin227 -> 227 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bmp.png (renamed from pkgs/webapps/apache-theme/theme/icons/bmp.png)bin663 -> 663 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/c.png (renamed from pkgs/webapps/apache-theme/theme/icons/c.png)bin554 -> 554 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/calc.png (renamed from pkgs/webapps/apache-theme/theme/icons/calc.png)bin506 -> 506 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cd.png (renamed from pkgs/webapps/apache-theme/theme/icons/cd.png)bin757 -> 757 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/copying.png (renamed from pkgs/webapps/apache-theme/theme/icons/copying.png)bin699 -> 699 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cpp.png (renamed from pkgs/webapps/apache-theme/theme/icons/cpp.png)bin599 -> 599 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/css.png (renamed from pkgs/webapps/apache-theme/theme/icons/css.png)bin592 -> 592 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/deb.png (renamed from pkgs/webapps/apache-theme/theme/icons/deb.png)bin671 -> 671 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/default.png (renamed from pkgs/webapps/apache-theme/theme/icons/default.png)bin311 -> 311 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/diff.png (renamed from pkgs/webapps/apache-theme/theme/icons/diff.png)bin586 -> 586 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/doc.png (renamed from pkgs/webapps/apache-theme/theme/icons/doc.png)bin535 -> 535 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/draw.png (renamed from pkgs/webapps/apache-theme/theme/icons/draw.png)bin679 -> 679 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/eps.png (renamed from pkgs/webapps/apache-theme/theme/icons/eps.png)bin619 -> 619 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/exe.png (renamed from pkgs/webapps/apache-theme/theme/icons/exe.png)bin846 -> 846 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-home.png (renamed from pkgs/webapps/apache-theme/theme/icons/folder-home.png)bin618 -> 618 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-open.png (renamed from pkgs/webapps/apache-theme/theme/icons/folder-open.png)bin431 -> 431 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-page.png (renamed from pkgs/webapps/apache-theme/theme/icons/folder-page.png)bin591 -> 591 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png (renamed from pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png)bin494 -> 494 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent.png (renamed from pkgs/webapps/apache-theme/theme/icons/folder-parent.png)bin621 -> 621 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder.png (renamed from pkgs/webapps/apache-theme/theme/icons/folder.png)bin395 -> 395 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gif.png (renamed from pkgs/webapps/apache-theme/theme/icons/gif.png)bin655 -> 655 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gzip.png (renamed from pkgs/webapps/apache-theme/theme/icons/gzip.png)bin551 -> 551 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/h.png (renamed from pkgs/webapps/apache-theme/theme/icons/h.png)bin504 -> 504 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/hpp.png (renamed from pkgs/webapps/apache-theme/theme/icons/hpp.png)bin530 -> 530 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/html.png (renamed from pkgs/webapps/apache-theme/theme/icons/html.png)bin770 -> 770 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ico.png (renamed from pkgs/webapps/apache-theme/theme/icons/ico.png)bin792 -> 792 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/image.png (renamed from pkgs/webapps/apache-theme/theme/icons/image.png)bin671 -> 671 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/install.png (renamed from pkgs/webapps/apache-theme/theme/icons/install.png)bin788 -> 788 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/java.png (renamed from pkgs/webapps/apache-theme/theme/icons/java.png)bin658 -> 658 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/jpg.png (renamed from pkgs/webapps/apache-theme/theme/icons/jpg.png)bin675 -> 675 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/js.png (renamed from pkgs/webapps/apache-theme/theme/icons/js.png)bin540 -> 540 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/json.png (renamed from pkgs/webapps/apache-theme/theme/icons/json.png)bin540 -> 540 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/log.png (renamed from pkgs/webapps/apache-theme/theme/icons/log.png)bin423 -> 423 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/makefile.png (renamed from pkgs/webapps/apache-theme/theme/icons/makefile.png)bin614 -> 614 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/markdown.png (renamed from pkgs/webapps/apache-theme/theme/icons/markdown.png)bin627 -> 627 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/package.png (renamed from pkgs/webapps/apache-theme/theme/icons/package.png)bin614 -> 614 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pdf.png (renamed from pkgs/webapps/apache-theme/theme/icons/pdf.png)bin799 -> 799 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/php.png (renamed from pkgs/webapps/apache-theme/theme/icons/php.png)bin757 -> 757 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/playlist.png (renamed from pkgs/webapps/apache-theme/theme/icons/playlist.png)bin610 -> 610 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/png.png (renamed from pkgs/webapps/apache-theme/theme/icons/png.png)bin679 -> 679 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pres.png (renamed from pkgs/webapps/apache-theme/theme/icons/pres.png)bin629 -> 629 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ps.png (renamed from pkgs/webapps/apache-theme/theme/icons/ps.png)bin817 -> 817 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/psd.png (renamed from pkgs/webapps/apache-theme/theme/icons/psd.png)bin622 -> 622 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/py.png (renamed from pkgs/webapps/apache-theme/theme/icons/py.png)bin743 -> 743 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rar.png (renamed from pkgs/webapps/apache-theme/theme/icons/rar.png)bin621 -> 621 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rb.png (renamed from pkgs/webapps/apache-theme/theme/icons/rb.png)bin781 -> 781 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/readme.png (renamed from pkgs/webapps/apache-theme/theme/icons/readme.png)bin384 -> 384 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rpm.png (renamed from pkgs/webapps/apache-theme/theme/icons/rpm.png)bin660 -> 660 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rss.png (renamed from pkgs/webapps/apache-theme/theme/icons/rss.png)bin660 -> 660 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rtf.png (renamed from pkgs/webapps/apache-theme/theme/icons/rtf.png)bin627 -> 627 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/script.png (renamed from pkgs/webapps/apache-theme/theme/icons/script.png)bin613 -> 613 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/source.png (renamed from pkgs/webapps/apache-theme/theme/icons/source.png)bin586 -> 586 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/sql.png (renamed from pkgs/webapps/apache-theme/theme/icons/sql.png)bin510 -> 510 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tar.png (renamed from pkgs/webapps/apache-theme/theme/icons/tar.png)bin406 -> 406 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tex.png (renamed from pkgs/webapps/apache-theme/theme/icons/tex.png)bin677 -> 677 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/text.png (renamed from pkgs/webapps/apache-theme/theme/icons/text.png)bin463 -> 463 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tiff.png (renamed from pkgs/webapps/apache-theme/theme/icons/tiff.png)bin654 -> 654 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/unknown.png (renamed from pkgs/webapps/apache-theme/theme/icons/unknown.png)bin556 -> 556 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/vcal.png (renamed from pkgs/webapps/apache-theme/theme/icons/vcal.png)bin556 -> 556 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/video.png (renamed from pkgs/webapps/apache-theme/theme/icons/video.png)bin739 -> 739 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/xml.png (renamed from pkgs/webapps/apache-theme/theme/icons/xml.png)bin585 -> 585 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/zip.png (renamed from pkgs/webapps/apache-theme/theme/icons/zip.png)bin617 -> 617 bytes
-rw-r--r--flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css160
-rw-r--r--flakes/mypackages/pkgs/webapps/awl/default.nix (renamed from pkgs/webapps/awl/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/davical/default.nix (renamed from pkgs/webapps/davical/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/default.nix24
-rw-r--r--flakes/mypackages/pkgs/webapps/dokuwiki/default.nix54
-rw-r--r--flakes/mypackages/pkgs/webapps/dokuwiki/plugins/farmer.nix (renamed from pkgs/webapps/dokuwiki/plugins/farmer.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/dokuwiki/plugins/todo.nix (renamed from pkgs/webapps/dokuwiki/plugins/todo.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/infcloud/default.nix (renamed from pkgs/webapps/infcloud/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/infcloud/infcloud_config.js (renamed from pkgs/webapps/infcloud/infcloud_config.js)0
-rw-r--r--flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report.php.diff (renamed from pkgs/webapps/mantisbt_2/bug_report.php.diff)0
-rw-r--r--flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report_page.php.diff (renamed from pkgs/webapps/mantisbt_2/bug_report_page.php.diff)0
-rw-r--r--flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add.php.diff (renamed from pkgs/webapps/mantisbt_2/bugnote_add.php.diff)0
-rw-r--r--flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff (renamed from pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff)0
-rw-r--r--flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix44
-rw-r--r--flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/slack/default.nix (renamed from pkgs/webapps/mantisbt_2/plugins/slack/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff (renamed from pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff)0
-rw-r--r--flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix22
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix21
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix27
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix24
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix27
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix14
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix14
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix22
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix31
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix27
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix27
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix13
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix24
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix21
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix21
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix21
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix16
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix14
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix27
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix14
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix15
-rw-r--r--flakes/mypackages/pkgs/webapps/nextcloud/default.nix84
-rw-r--r--flakes/mypackages/pkgs/webapps/phpbb/default.nix (renamed from pkgs/webapps/phpbb/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/phpbb/extensions/adduser.nix (renamed from pkgs/webapps/phpbb/extensions/adduser.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/phpbb/extensions/autosubscribe.nix (renamed from pkgs/webapps/phpbb/extensions/autosubscribe.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/phpbb/extensions/mailinglist.nix (renamed from pkgs/webapps/phpbb/extensions/mailinglist.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/phpbb/extensions/markdown.nix (renamed from pkgs/webapps/phpbb/extensions/markdown.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/phpbb/extensions/mchat.nix (renamed from pkgs/webapps/phpbb/extensions/mchat.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/phpbb/extensions/monitoranswers.nix (renamed from pkgs/webapps/phpbb/extensions/monitoranswers.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/phpbb/langs/fr.nix (renamed from pkgs/webapps/phpbb/langs/fr.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/phpldapadmin/default.nix (renamed from pkgs/webapps/phpldapadmin/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-align-button.patch (renamed from pkgs/webapps/phpldapadmin/ldap-align-button.patch)0
-rw-r--r--flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-fix-password.patch (renamed from pkgs/webapps/phpldapadmin/ldap-fix-password.patch)0
-rw-r--r--flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch (renamed from pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch)0
-rw-r--r--flakes/mypackages/pkgs/webapps/rompr/default.nix17
-rw-r--r--flakes/mypackages/pkgs/webapps/roundcubemail/add_all.patch (renamed from pkgs/webapps/roundcubemail/add_all.patch)0
-rw-r--r--flakes/mypackages/pkgs/webapps/roundcubemail/default.nix (renamed from pkgs/webapps/roundcubemail/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix (renamed from pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/roundcubemail/plugins/carddav/default.nix (renamed from pkgs/webapps/roundcubemail/plugins/carddav/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix (renamed from pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix (renamed from pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix (renamed from pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix (renamed from pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix (renamed from pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix (renamed from pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/spip/default.nix (renamed from pkgs/webapps/spip/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/spip/spip_ldap_patch.patch (renamed from pkgs/webapps/spip/spip_ldap_patch.patch)0
-rw-r--r--flakes/mypackages/pkgs/webapps/spip/spip_mes_options.php (renamed from pkgs/webapps/spip/spip_mes_options.php)0
-rw-r--r--flakes/mypackages/pkgs/webapps/ttrss/default.nix37
-rw-r--r--flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix18
-rw-r--r--flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch (renamed from pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch)0
-rw-r--r--flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix17
-rw-r--r--flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix18
-rw-r--r--flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch (renamed from pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch)0
-rw-r--r--flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix17
-rw-r--r--flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix17
-rw-r--r--flakes/mypackages/pkgs/webapps/wallabag/default.nix (renamed from pkgs/webapps/wallabag/default.nix)0
-rw-r--r--flakes/mypackages/pkgs/webapps/wallabag/ldap.patch (renamed from pkgs/webapps/wallabag/ldap.patch)0
-rw-r--r--flakes/mypackages/pkgs/webapps/yourls/default.nix37
-rw-r--r--flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix17
-rw-r--r--flakes/myuids/flake.nix14
-rw-r--r--flakes/naemon/flake.nix191
-rw-r--r--flakes/naemon/naemon.cfg (renamed from modules/naemon/naemon.cfg)0
-rw-r--r--flakes/openarc/flake.lock17
-rw-r--r--flakes/openarc/flake.nix6
-rw-r--r--flakes/opendmarc/flake.lock17
-rw-r--r--flakes/opendmarc/flake.nix8
-rw-r--r--flakes/openfoodnetwork/default.nix39
-rw-r--r--flakes/openfoodnetwork/gemset.nix2896
-rw-r--r--flakes/paste/flake.nix2
-rw-r--r--flakes/paste/paste/paste.py29
-rw-r--r--flakes/peertube/flake.lock17
-rw-r--r--flakes/peertube/flake.nix10
-rw-r--r--flakes/private/buildbot/buildslist/bower.nix (renamed from pkgs/python-packages/buildbot/plugins/buildslist/bower.nix)0
-rw-r--r--flakes/private/buildbot/buildslist/default.nix64
-rw-r--r--flakes/private/buildbot/buildslist/yarn-packages.nix (renamed from pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix)0
-rw-r--r--flakes/private/buildbot/common/build_helpers.py293
-rw-r--r--flakes/private/buildbot/common/libvirt.py (renamed from modules/private/buildbot/common/libvirt.py)0
-rw-r--r--flakes/private/buildbot/common/master.cfg93
-rw-r--r--flakes/private/buildbot/flake.lock61
-rw-r--r--flakes/private/buildbot/flake.nix74
-rw-r--r--flakes/private/buildbot/test_project/__init__.py121
-rw-r--r--flakes/private/chatons/flake.lock23
-rw-r--r--flakes/private/chatons/flake.nix142
-rw-r--r--flakes/private/environment-dummy/flake.nix18
-rw-r--r--flakes/private/environment-dummy/ldap.conf13
-rw-r--r--flakes/private/environment-dummy/vars.yml1
-rw-r--r--flakes/private/environment/flake.nix1135
-rwxr-xr-xflakes/private/mail-relay/filter-rewrite-from.py (renamed from modules/private/mail/filter-rewrite-from.py)0
-rw-r--r--flakes/private/mail-relay/flake.lock36
-rw-r--r--flakes/private/mail-relay/flake.nix58
-rw-r--r--flakes/private/milters/flake.lock186
-rw-r--r--flakes/private/milters/flake.nix106
-rwxr-xr-xflakes/private/milters/verify_from.py (renamed from modules/private/mail/verify_from.py)0
-rw-r--r--flakes/private/monitoring/flake.lock67
-rw-r--r--flakes/private/monitoring/flake.nix267
-rw-r--r--flakes/private/monitoring/myplugins.nix400
-rw-r--r--flakes/private/monitoring/nagios-cli.cfg (renamed from modules/private/monitoring/nagios-cli.cfg)0
-rw-r--r--flakes/private/monitoring/objects_common.nix227
-rwxr-xr-xflakes/private/monitoring/plugins/check_backup_age (renamed from modules/private/monitoring/plugins/check_backup_age)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_bandwidth122
-rwxr-xr-xflakes/private/monitoring/plugins/check_command (renamed from modules/private/monitoring/plugins/check_command)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_emails (renamed from modules/private/monitoring/plugins/check_emails)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_eriomem (renamed from modules/private/monitoring/plugins/check_eriomem)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_ftp_database (renamed from modules/private/monitoring/plugins/check_ftp_database)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_git (renamed from modules/private/monitoring/plugins/check_git)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_imap_connection (renamed from modules/private/monitoring/plugins/check_imap_connection)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_last_file_date (renamed from modules/private/monitoring/plugins/check_last_file_date)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_mem.sh31
-rwxr-xr-xflakes/private/monitoring/plugins/check_mysql_replication (renamed from modules/private/monitoring/plugins/check_mysql_replication)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_openldap_replication (renamed from modules/private/monitoring/plugins/check_openldap_replication)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_ovh_sms (renamed from modules/private/monitoring/plugins/check_ovh_sms)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_postgres_database_count (renamed from modules/private/monitoring/plugins/check_postgres_database_count)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_postgres_replication (renamed from modules/private/monitoring/plugins/check_postgres_replication)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_redis_replication (renamed from modules/private/monitoring/plugins/check_redis_replication)0
-rwxr-xr-xflakes/private/monitoring/plugins/check_zfs_snapshot (renamed from modules/private/monitoring/plugins/check_zfs_snapshot)0
-rwxr-xr-xflakes/private/monitoring/plugins/notify_by_apprise31
-rwxr-xr-xflakes/private/monitoring/plugins/notify_by_email (renamed from modules/private/monitoring/plugins/notify_by_email)0
-rwxr-xr-xflakes/private/monitoring/plugins/notify_by_slack (renamed from modules/private/monitoring/plugins/notify_by_slack)0
-rwxr-xr-xflakes/private/monitoring/plugins/send_nrdp.sh (renamed from modules/private/monitoring/plugins/send_nrdp.sh)0
-rwxr-xr-xflakes/private/monitoring/send_mails (renamed from modules/private/monitoring/send_mails)0
-rw-r--r--flakes/private/monitoring/to_objects.nix77
-rw-r--r--flakes/private/openarc/flake.lock72
-rw-r--r--flakes/private/openarc/flake.nix96
-rw-r--r--flakes/private/opendmarc/flake.lock85
-rw-r--r--flakes/private/opendmarc/flake.nix125
-rw-r--r--flakes/private/openldap/flake.nix6
-rw-r--r--flakes/private/openldap/immae.ldif83
-rw-r--r--flakes/private/openldap/immae.schema179
-rw-r--r--flakes/private/paste/flake.lock51
-rw-r--r--flakes/private/paste/flake.nix36
-rw-r--r--flakes/private/peertube/flake.lock89
-rw-r--r--flakes/private/peertube/flake.nix16
-rw-r--r--flakes/private/php/flake.lock62
-rw-r--r--flakes/private/php/flake.nix40
-rw-r--r--flakes/private/ssh/flake.lock36
-rw-r--r--flakes/private/ssh/flake.nix107
-rwxr-xr-xflakes/private/ssh/ldap_authorized_keys.sh62
-rw-r--r--flakes/private/system/flake.lock185
-rw-r--r--flakes/private/system/flake.nix168
-rw-r--r--flakes/private/system/public_keys/Immae.pub (renamed from nixops/public_keys/Immae.pub)0
-rw-r--r--flakes/rsync_backup/flake.nix4
-rw-r--r--flakes/secrets/flake.nix60
-rw-r--r--flakes/surfer/default.nix12
-rw-r--r--flakes/surfer/flake.lock149
-rw-r--r--flakes/surfer/flake.nix36
-rw-r--r--flakes/surfer/node-packages.nix (renamed from pkgs/webapps/surfer/node-packages.nix)0
-rw-r--r--flakes/taskwarrior-web/Gemfile.lock (renamed from pkgs/webapps/taskwarrior-web/Gemfile.lock)0
-rw-r--r--flakes/taskwarrior-web/default.nix25
-rw-r--r--flakes/taskwarrior-web/fixes.patch113
-rw-r--r--flakes/taskwarrior-web/flake.lock62
-rw-r--r--flakes/taskwarrior-web/flake.nix33
-rw-r--r--flakes/taskwarrior-web/gemset.nix (renamed from pkgs/webapps/taskwarrior-web/gemset.nix)0
-rw-r--r--flakes/taskwarrior-web/thin.patch (renamed from pkgs/webapps/taskwarrior-web/thin.patch)0
-rw-r--r--lib/default.nix16
-rw-r--r--lib/flake-compat-patched.nix190
-rw-r--r--lib/flake-compat.nix8
-rw-r--r--lib/node-env.nix542
-rw-r--r--lib/private/default.nix20
-rw-r--r--modules/default.nix29
-rw-r--r--modules/duply_backup/default.nix124
-rw-r--r--modules/naemon/default.nix183
-rw-r--r--modules/private/buildbot/common/build_helpers.py277
-rw-r--r--modules/private/buildbot/common/master.cfg69
-rw-r--r--modules/private/buildbot/default.nix244
-rw-r--r--modules/private/buildbot/projects/caldance/__init__.py198
-rw-r--r--modules/private/buildbot/projects/cryptoportfolio/__init__.py169
-rw-r--r--modules/private/buildbot/projects/denise/__init__.py186
-rw-r--r--modules/private/buildbot/projects/immaeEu/__init__.py314
-rwxr-xr-xmodules/private/buildbot/projects/immaeEu/scripts/lacells_download163
-rw-r--r--modules/private/buildbot/projects/test/__init__.py197
-rw-r--r--modules/private/certificates.nix199
-rw-r--r--modules/private/databases/default.nix57
-rw-r--r--modules/private/databases/mariadb.nix182
-rw-r--r--modules/private/databases/mariadb_replication.nix251
-rw-r--r--modules/private/databases/openldap/default.nix147
-rw-r--r--modules/private/databases/openldap/eldiron_schemas.nix21
-rw-r--r--modules/private/databases/openldap/immae.schema179
-rw-r--r--modules/private/databases/openldap_replication.nix166
-rw-r--r--modules/private/databases/postgresql.nix228
-rw-r--r--modules/private/databases/postgresql_replication.nix182
-rw-r--r--modules/private/databases/redis.nix133
-rw-r--r--modules/private/databases/redis_replication.nix171
-rw-r--r--modules/private/databases/utils.nix30
-rw-r--r--modules/private/default.nix136
-rw-r--r--modules/private/dns.nix197
-rw-r--r--modules/private/ejabberd/default.nix92
-rw-r--r--modules/private/environment.nix1492
-rw-r--r--modules/private/ftp.nix248
-rwxr-xr-xmodules/private/ftp_sync.sh47
-rw-r--r--modules/private/gemini/default.nix26
-rw-r--r--modules/private/gitolite/default.nix77
-rwxr-xr-xmodules/private/gitolite/gitolite_ldap_groups.sh15
-rw-r--r--modules/private/gitolite/ldap_gitolite.sh33
-rw-r--r--modules/private/irc.nix54
-rw-r--r--modules/private/loginctl-linger.nix47
-rw-r--r--modules/private/mail/default.nix42
-rw-r--r--modules/private/mail/dovecot.nix292
-rw-r--r--modules/private/mail/milters.nix88
-rw-r--r--modules/private/mail/opensmtpd.nix57
-rw-r--r--modules/private/mail/postfix.nix471
-rw-r--r--modules/private/mail/relay.nix235
-rw-r--r--modules/private/mail/rspamd.nix87
-rw-r--r--modules/private/mail/sympa.nix213
-rw-r--r--modules/private/monitoring/default.nix249
-rw-r--r--modules/private/monitoring/myplugins.nix389
-rw-r--r--modules/private/monitoring/objects_backup-2.nix111
-rw-r--r--modules/private/monitoring/objects_common.nix253
-rw-r--r--modules/private/monitoring/objects_dilion.nix32
-rw-r--r--modules/private/monitoring/objects_eban.nix70
-rw-r--r--modules/private/monitoring/objects_eldiron.nix38
-rw-r--r--modules/private/monitoring/objects_master.nix39
-rw-r--r--modules/private/monitoring/objects_monitoring-1.nix714
-rw-r--r--modules/private/monitoring/objects_phare.nix17
-rw-r--r--modules/private/monitoring/objects_quatresaisons.nix38
-rw-r--r--modules/private/monitoring/objects_tiboqorl-fr.nix174
-rw-r--r--modules/private/monitoring/objects_ulminfo-fr.nix17
-rwxr-xr-xmodules/private/monitoring/plugins/check_bandwidth123
-rwxr-xr-xmodules/private/monitoring/plugins/check_mem.sh29
-rwxr-xr-xmodules/private/monitoring/plugins/notify_eban_url6
-rw-r--r--modules/private/monitoring/status.nix93
-rw-r--r--modules/private/monitoring/status_engine.nix115
-rw-r--r--modules/private/monitoring/to_objects.nix77
-rw-r--r--modules/private/pub/default.nix56
-rw-r--r--modules/private/pub/ldap_pub.sh56
-rw-r--r--modules/private/pub/restrict64
-rw-r--r--modules/private/ssh/default.nix91
-rwxr-xr-xmodules/private/ssh/ldap_authorized_keys.sh52
-rw-r--r--modules/private/system.nix98
-rw-r--r--modules/private/system/backup-2.nix137
-rw-r--r--modules/private/system/dilion.nix242
-rw-r--r--modules/private/system/dilion/vms.nix185
-rw-r--r--modules/private/system/dilion/vms/base_configuration.nix21
-rw-r--r--modules/private/system/dilion/vms/base_image.nix94
-rw-r--r--modules/private/system/dilion/vms/buildbot_configuration.nix67
-rw-r--r--modules/private/system/eldiron.nix228
-rw-r--r--modules/private/system/monitoring-1.nix69
-rw-r--r--modules/private/system/quatresaisons.nix436
-rw-r--r--modules/private/system/quatresaisons/databases.nix147
-rw-r--r--modules/private/system/quatresaisons/landing.yml32
-rw-r--r--modules/private/system/quatresaisons/landing_4c.yml24
-rw-r--r--modules/private/system/quatresaisons/nextcloud.nix141
-rw-r--r--modules/private/tasks/default.nix355
-rw-r--r--modules/private/tasks/www/index.php168
-rw-r--r--modules/private/vpn/default.nix65
-rw-r--r--modules/private/websites/bakeer/cloud.nix23
-rw-r--r--modules/private/websites/capitaines/discourse_static/discourse.pngbin2440 -> 0 bytes
-rw-r--r--modules/private/websites/capitaines/discourse_static/index.html28
-rw-r--r--modules/private/websites/capitaines/landing_pages.nix57
-rw-r--r--modules/private/websites/capitaines/mastodon_static/index.html29
-rw-r--r--modules/private/websites/capitaines/mastodon_static/oops.pngbin120305 -> 0 bytes
-rw-r--r--modules/private/websites/chloe/app/default.nix22
-rw-r--r--modules/private/websites/chloe/config/chmod.php4
-rw-r--r--modules/private/websites/chloe/config/connect.php15
-rw-r--r--modules/private/websites/chloe/config/ldap.php9
-rw-r--r--modules/private/websites/chloe/integration.nix104
-rw-r--r--modules/private/websites/chloe/production.nix112
-rw-r--r--modules/private/websites/cip-ca/sympa.nix28
-rw-r--r--modules/private/websites/commons/adminer.nix4
-rw-r--r--modules/private/websites/connexionswing/app/default.nix29
-rw-r--r--modules/private/websites/connexionswing/app/php-packages.nix597
-rw-r--r--modules/private/websites/connexionswing/integration.nix141
-rw-r--r--modules/private/websites/connexionswing/production.nix110
-rw-r--r--modules/private/websites/default.nix324
-rw-r--r--modules/private/websites/denise/aventuriers.nix26
-rw-r--r--modules/private/websites/denise/bingo.nix100
-rw-r--r--modules/private/websites/denise/denisejerome.nix31
-rw-r--r--modules/private/websites/denise/evariste.nix104
-rw-r--r--modules/private/websites/denise/oms.nix100
-rw-r--r--modules/private/websites/denise/production.nix25
-rw-r--r--modules/private/websites/emilia/atelierfringant.nix65
-rw-r--r--modules/private/websites/emilia/moodle.nix65
-rw-r--r--modules/private/websites/emilia/moodle/pause.html48
-rw-r--r--modules/private/websites/florian/app.nix142
-rw-r--r--modules/private/websites/florian/app/default.nix27
-rw-r--r--modules/private/websites/florian/app/php-packages.nix389
-rw-r--r--modules/private/websites/florian/integration.nix34
-rw-r--r--modules/private/websites/florian/production.nix34
-rw-r--r--modules/private/websites/immae/chatons/immae-eu.properties46
-rw-r--r--modules/private/websites/immae/chatons/service-etherpad.properties164
-rw-r--r--modules/private/websites/immae/matrix/client8
-rw-r--r--modules/private/websites/immae/production.nix137
-rw-r--r--modules/private/websites/immae/release.nix39
-rw-r--r--modules/private/websites/immae/temp.nix64
-rw-r--r--modules/private/websites/isabelle/aten_app/default.nix61
-rw-r--r--modules/private/websites/isabelle/aten_app/php-packages.nix740
-rw-r--r--modules/private/websites/isabelle/aten_app/yarn-packages.nix7871
-rw-r--r--modules/private/websites/isabelle/aten_integration.nix91
-rw-r--r--modules/private/websites/isabelle/aten_production.nix90
-rw-r--r--modules/private/websites/isabelle/config/chmod.php4
-rw-r--r--modules/private/websites/isabelle/config/connect.php15
-rw-r--r--modules/private/websites/isabelle/config/ldap.php9
-rw-r--r--modules/private/websites/isabelle/iridologie.nix113
-rw-r--r--modules/private/websites/isabelle/iridologie_app/default.nix19
-rw-r--r--modules/private/websites/jerome/naturaloutil.nix97
-rw-r--r--modules/private/websites/leila/production.nix114
-rw-r--r--modules/private/websites/ludivine/app/default.nix37
-rw-r--r--modules/private/websites/ludivine/app/php-packages.nix868
-rw-r--r--modules/private/websites/ludivine/integration.nix145
-rw-r--r--modules/private/websites/ludivine/production.nix116
-rw-r--r--modules/private/websites/nassime/production.nix35
-rw-r--r--modules/private/websites/nath/villon.nix42
-rw-r--r--modules/private/websites/papa/maison_bbc.nix28
-rw-r--r--modules/private/websites/papa/maison_bbc_static/data.json4101
-rw-r--r--modules/private/websites/papa/maison_bbc_static/favicon.icobin318 -> 0 bytes
-rw-r--r--modules/private/websites/papa/maison_bbc_static/index.html164
-rw-r--r--modules/private/websites/papa/maison_bbc_static/lamaison.pngbin259991 -> 0 bytes
-rw-r--r--modules/private/websites/papa/surveillance.nix50
-rw-r--r--modules/private/websites/patrick_fodella/altermondia.nix73
-rw-r--r--modules/private/websites/patrick_fodella/ecolyeu.nix72
-rw-r--r--modules/private/websites/piedsjaloux/app/default.nix29
-rw-r--r--modules/private/websites/piedsjaloux/app/php-packages.nix1009
-rw-r--r--modules/private/websites/piedsjaloux/integration.nix135
-rw-r--r--modules/private/websites/piedsjaloux/production.nix106
-rw-r--r--modules/private/websites/ressourcerie_banon/cloud.nix20
-rw-r--r--modules/private/websites/ressourcerie_banon/cryptpad.nix49
-rw-r--r--modules/private/websites/ressourcerie_banon/production.nix70
-rw-r--r--modules/private/websites/richie/production.nix106
-rw-r--r--modules/private/websites/syden/peertube.nix132
-rw-r--r--modules/private/websites/telio_tortay/production.nix81
-rw-r--r--modules/private/websites/tools/assets/default.nix39
-rw-r--r--modules/private/websites/tools/cloud/default.nix184
-rw-r--r--modules/private/websites/tools/cloud/farm.nix123
-rw-r--r--modules/private/websites/tools/commento/default.nix59
-rw-r--r--modules/private/websites/tools/cryptpad/default.nix50
-rw-r--r--modules/private/websites/tools/cryptpad/farm.nix180
-rw-r--r--modules/private/websites/tools/dav/davical.nix133
-rw-r--r--modules/private/websites/tools/dav/default.nix55
-rw-r--r--modules/private/websites/tools/db/default.nix21
-rw-r--r--modules/private/websites/tools/diaspora/default.nix185
-rw-r--r--modules/private/websites/tools/ether/default.nix216
-rw-r--r--modules/private/websites/tools/games/codenames/default.nix50
-rw-r--r--modules/private/websites/tools/games/codenames/node-packages.nix7621
-rw-r--r--modules/private/websites/tools/games/terraforming-mars/default.nix48
-rw-r--r--modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix36
-rw-r--r--modules/private/websites/tools/git/default.nix49
-rw-r--r--modules/private/websites/tools/git/gitweb.nix119
-rw-r--r--modules/private/websites/tools/git/mantisbt.nix91
-rw-r--r--modules/private/websites/tools/im/default.nix42
-rw-r--r--modules/private/websites/tools/im/www/converse.html57
-rw-r--r--modules/private/websites/tools/mail/default.nix79
-rw-r--r--modules/private/websites/tools/mail/mta-sts.nix54
-rw-r--r--modules/private/websites/tools/mail/rainloop.nix54
-rw-r--r--modules/private/websites/tools/mail/roundcubemail.nix118
-rw-r--r--modules/private/websites/tools/mastodon/default.nix136
-rw-r--r--modules/private/websites/tools/mgoblin/default.nix134
-rw-r--r--modules/private/websites/tools/peertube/default.nix94
-rw-r--r--modules/private/websites/tools/performance/default.nix88
-rw-r--r--modules/private/websites/tools/stats/default.nix51
-rw-r--r--modules/private/websites/tools/tools/adminer.nix46
-rw-r--r--modules/private/websites/tools/tools/csp_reports.nix11
-rw-r--r--modules/private/websites/tools/tools/default.nix429
-rw-r--r--modules/private/websites/tools/tools/dmarc_reports.nix59
-rw-r--r--modules/private/websites/tools/tools/dokuwiki.nix56
-rw-r--r--modules/private/websites/tools/tools/grocy.nix48
-rw-r--r--modules/private/websites/tools/tools/kanboard.nix80
-rw-r--r--modules/private/websites/tools/tools/landing.nix29
-rw-r--r--modules/private/websites/tools/tools/landing/ldap_password.php140
-rw-r--r--modules/private/websites/tools/tools/landing/ldap_ssh_keys.php348
-rw-r--r--modules/private/websites/tools/tools/landing/report_csp_violation.php22
-rw-r--r--modules/private/websites/tools/tools/ldap.nix69
-rw-r--r--modules/private/websites/tools/tools/phpbb.nix55
-rw-r--r--modules/private/websites/tools/tools/rompr.nix72
-rw-r--r--modules/private/websites/tools/tools/shaarli.nix66
-rw-r--r--modules/private/websites/tools/tools/ttrss.nix129
-rw-r--r--modules/private/websites/tools/tools/wallabag.nix142
-rw-r--r--modules/private/websites/tools/tools/webhooks.nix17
-rw-r--r--modules/private/websites/tools/tools/ympd.nix40
-rw-r--r--modules/private/websites/tools/tools/yourls.nix86
-rw-r--r--modules/private/websites/tools/vpn/default.nix13
-rw-r--r--modules/webapps/diaspora.nix173
-rw-r--r--modules/webapps/etherpad-lite.nix162
-rw-r--r--modules/webapps/mastodon.nix265
-rw-r--r--modules/webapps/mediagoblin.nix231
-rw-r--r--modules/webapps/webstats/default.nix80
-rw-r--r--modules/websites/default.nix281
-rw-r--r--modules/websites/httpd-service-builder.nix735
-rw-r--r--modules/websites/httpd-service-builder.patch150
-rw-r--r--modules/websites/php-application.nix224
-rw-r--r--modules/zrepl.nix45
-rw-r--r--nix/README.md2
-rw-r--r--nix/sources.json209
-rw-r--r--nix/sources.nix135
-rw-r--r--nixops/.gitignore1
-rw-r--r--nixops/.sops.yaml19
-rw-r--r--nixops/Makefile102
-rw-r--r--nixops/default.nix8
-rwxr-xr-xnixops/scripts/with_env22
m---------nixops/secrets0
-rw-r--r--overlays/bitlbee-discord/default.nix12
-rw-r--r--overlays/bonfire/default.nix36
-rw-r--r--overlays/bugwarrior/default.nix5
-rw-r--r--overlays/bugwarrior/mantisbt.patch379
-rw-r--r--overlays/bundix/default.nix7
-rw-r--r--overlays/databases/mysql/default.nix24
-rw-r--r--overlays/default.nix48
-rw-r--r--overlays/doing/default.nix10
-rw-r--r--overlays/dwm/default.nix7
-rw-r--r--overlays/dwm/dwm_config.h98
-rw-r--r--overlays/elinks/default.nix14
-rw-r--r--overlays/elinks/elinks.json15
-rw-r--r--overlays/kanboard/default.nix18
-rw-r--r--overlays/khal/default.nix8
-rw-r--r--overlays/ledger/default.nix20
-rw-r--r--overlays/lesspipe/default.nix5
-rw-r--r--overlays/morph/default.nix5
-rw-r--r--overlays/neomutt/default.nix7
-rw-r--r--overlays/neomutt/tx.patch44
-rw-r--r--overlays/nix-direnv/default.nix7
-rw-r--r--overlays/nixops/default.nix20
-rw-r--r--overlays/nixops/fix_glibc.patch15
-rw-r--r--overlays/nixops/hetzner_cloud.patch480
-rw-r--r--overlays/pass/default.nix5
-rw-r--r--overlays/pass/pass-fix-pass-init.patch42
-rw-r--r--overlays/pelican/default.nix7
-rw-r--r--overlays/php-packages/default.nix6
-rw-r--r--overlays/procps-ng/default.nix5
-rw-r--r--overlays/python-packages/buildbot.nix8
-rw-r--r--overlays/python-packages/default.nix29
-rw-r--r--overlays/sc-im/default.nix9
-rw-r--r--overlays/shaarli/default.nix15
-rw-r--r--overlays/slrn/default.nix5
-rw-r--r--overlays/vcsh/default.nix7
-rw-r--r--overlays/weechat/default.nix12
-rw-r--r--overlays/ympd/default.nix5
-rw-r--r--overlays/ympd/ympd.json15
-rw-r--r--pkgs/boinctui/default.nix20
-rw-r--r--pkgs/cnagios/cnagios.json15
-rw-r--r--pkgs/cnagios/default.nix22
-rw-r--r--pkgs/composer-env/default.nix280
-rw-r--r--pkgs/crypto/cardano/daedalus.json15
-rw-r--r--pkgs/crypto/cardano/default.nix29
-rw-r--r--pkgs/crypto/iota-cli-app/default.nix20
-rw-r--r--pkgs/crypto/iota-cli-app/iota-cli-app.json15
-rw-r--r--pkgs/default.nix64
-rw-r--r--pkgs/dovecot/plugins/deleted_to_trash/default.nix21
-rw-r--r--pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json15
-rw-r--r--pkgs/flrn/default.nix13
-rw-r--r--pkgs/flrn/flrn.json15
-rw-r--r--pkgs/gearmand/default.nix16
-rw-r--r--pkgs/genius/default.nix19
-rw-r--r--pkgs/monitoring-plugins/default.nix33
-rw-r--r--pkgs/mtop/default.nix24
-rw-r--r--pkgs/mutt-ics/default.nix5
-rw-r--r--pkgs/mutt-ics/mutt-ics.json15
-rw-r--r--pkgs/naemon-livestatus/default.nix23
-rw-r--r--pkgs/naemon-livestatus/naemon-livestatus.json15
-rw-r--r--pkgs/naemon/default.nix35
-rw-r--r--pkgs/naemon/naemon.json15
-rw-r--r--pkgs/nagios-cli/default.nix2
-rw-r--r--pkgs/nagios-cli/nagios-cli.json15
-rw-r--r--pkgs/nagnu/default.nix12
-rw-r--r--pkgs/nagnu/nagnu.json15
-rw-r--r--pkgs/nb/default.nix20
-rw-r--r--pkgs/note/default.nix19
-rw-r--r--pkgs/pgloader/default.nix40
-rw-r--r--pkgs/predixy/default.nix10
-rw-r--r--pkgs/predixy/predixy.json15
-rw-r--r--pkgs/proftpd/default.nix23
-rw-r--r--pkgs/pure-ftpd/default.nix30
-rw-r--r--pkgs/python-packages/blivet/default.nix118
-rw-r--r--pkgs/python-packages/blivet/fix_path.patch21
-rw-r--r--pkgs/python-packages/blivet/poetry.lock96
-rw-r--r--pkgs/python-packages/blivet/pyproject.toml20
-rw-r--r--pkgs/python-packages/buildbot/plugins/buildslist/default.nix65
-rw-r--r--pkgs/python-packages/buildbot/plugins/default.nix6
-rw-r--r--pkgs/python-packages/default.nix7
-rw-r--r--pkgs/python-packages/pymilter.nix11
-rw-r--r--pkgs/python-packages/wokkel.nix11
-rw-r--r--pkgs/status_engine/interface.nix21
-rw-r--r--pkgs/status_engine/module.json15
-rw-r--r--pkgs/status_engine/module.nix10
-rw-r--r--pkgs/status_engine/worker.json15
-rw-r--r--pkgs/status_engine/worker.nix24
-rw-r--r--pkgs/status_engine/worker_composer.lock1457
-rw-r--r--pkgs/status_engine/worker_php_packages.nix217
-rw-r--r--pkgs/telegram-history-dump/default.nix9
-rw-r--r--pkgs/telegram-history-dump/telegram-history-dump.json15
-rw-r--r--pkgs/telegramircd/default.nix16
-rw-r--r--pkgs/telegramircd/telegramircd.json15
-rw-r--r--pkgs/terminal-velocity/default.nix37
-rw-r--r--pkgs/tiv/default.nix19
-rw-r--r--pkgs/webapps/adminer/default.nix14
-rw-r--r--pkgs/webapps/apache-theme/theme/style.css160
-rw-r--r--pkgs/webapps/default.nix27
-rw-r--r--pkgs/webapps/diaspora/default.nix69
-rw-r--r--pkgs/webapps/diaspora/diaspora.json15
-rw-r--r--pkgs/webapps/dokuwiki/default.nix45
-rw-r--r--pkgs/webapps/dokuwiki/dokuwiki.json15
-rw-r--r--pkgs/webapps/etherpad-lite/default.nix63
-rw-r--r--pkgs/webapps/etherpad-lite/etherpad-lite.json15
-rw-r--r--pkgs/webapps/grocy/default.nix45
-rw-r--r--pkgs/webapps/grocy/grocy.json15
-rw-r--r--pkgs/webapps/mantisbt_2/default.nix43
-rw-r--r--pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix21
-rw-r--r--pkgs/webapps/mastodon/default.nix92
-rw-r--r--pkgs/webapps/mastodon/mastodon.json15
-rw-r--r--pkgs/webapps/mediagoblin/default.nix210
-rw-r--r--pkgs/webapps/mediagoblin/tempita.json15
-rw-r--r--pkgs/webapps/nextcloud/apps/apporder.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/audioplayer.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/bookmarks.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/calendar.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/carnet.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/circles.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/contacts.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/cookbook.nix14
-rw-r--r--pkgs/webapps/nextcloud/apps/deck.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/extract.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/files_markdown.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/files_readmemd.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/flowupload.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/gpxedit.nix16
-rw-r--r--pkgs/webapps/nextcloud/apps/gpxpod.nix16
-rw-r--r--pkgs/webapps/nextcloud/apps/impersonate.nix9
-rw-r--r--pkgs/webapps/nextcloud/apps/keeweb.nix17
-rw-r--r--pkgs/webapps/nextcloud/apps/maps.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/metadata.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/music.nix9
-rw-r--r--pkgs/webapps/nextcloud/apps/notes.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/ocsms.nix12
-rw-r--r--pkgs/webapps/nextcloud/apps/passman.nix10
-rw-r--r--pkgs/webapps/nextcloud/apps/polls.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/social.nix9
-rw-r--r--pkgs/webapps/nextcloud/apps/spreed.nix8
-rw-r--r--pkgs/webapps/nextcloud/apps/tasks.nix8
-rw-r--r--pkgs/webapps/nextcloud/default.nix69
-rw-r--r--pkgs/webapps/rompr/default.nix8
-rw-r--r--pkgs/webapps/rompr/rompr.json15
-rw-r--r--pkgs/webapps/surfer/default.nix12
-rw-r--r--pkgs/webapps/taskwarrior-web/default.nix22
-rw-r--r--pkgs/webapps/taskwarrior-web/fixes.patch56
-rw-r--r--pkgs/webapps/taskwarrior-web/taskwarrior-web.json15
-rw-r--r--pkgs/webapps/ttrss/default.nix37
-rw-r--r--pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json15
-rw-r--r--pkgs/webapps/ttrss/plugins/af_feedmod/default.nix9
-rw-r--r--pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json15
-rw-r--r--pkgs/webapps/ttrss/plugins/auth_ldap/default.nix8
-rw-r--r--pkgs/webapps/ttrss/plugins/feediron/default.nix9
-rw-r--r--pkgs/webapps/ttrss/plugins/feediron/feediron.json15
-rw-r--r--pkgs/webapps/ttrss/plugins/ff_instagram/default.nix8
-rw-r--r--pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json15
-rw-r--r--pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix8
-rw-r--r--pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json15
-rw-r--r--pkgs/webapps/yourls/default.nix28
-rw-r--r--pkgs/webapps/yourls/plugins/ldap/default.nix8
-rw-r--r--pkgs/webapps/yourls/plugins/ldap/ldap.json15
-rw-r--r--pkgs/webapps/yourls/yourls.json15
-rwxr-xr-xscripts/fetch_version173
-rwxr-xr-xscripts/make-nur2
-rwxr-xr-xscripts/refresh_flakes71
-rwxr-xr-xscripts/setup (renamed from nixops/scripts/setup)0
-rwxr-xr-xscripts/update_flake18
-rwxr-xr-xscripts/with_env27
-rw-r--r--shell.nix18
-rw-r--r--systems/backup-2/base.nix164
-rw-r--r--systems/backup-2/databases/mariadb_replication.nix271
-rw-r--r--systems/backup-2/databases/openldap_replication.nix165
-rw-r--r--systems/backup-2/databases/postgresql_replication.nix203
-rw-r--r--systems/backup-2/databases/redis_replication.nix171
-rw-r--r--systems/backup-2/databases/utils.nix30
-rw-r--r--systems/backup-2/flake.lock1159
-rw-r--r--systems/backup-2/flake.nix51
-rw-r--r--systems/backup-2/mail/relay.nix196
-rw-r--r--systems/backup-2/monitoring.nix117
-rw-r--r--systems/dilion/base.nix309
-rw-r--r--systems/dilion/flake.lock695
-rw-r--r--systems/dilion/flake.nix43
-rw-r--r--systems/dilion/monitoring.nix43
-rw-r--r--systems/dilion/ssh_ldap_regular.sh (renamed from modules/private/ssh/ldap_regular.sh)0
-rw-r--r--systems/dilion/vms.nix200
-rw-r--r--systems/dilion/vms/base_configuration.nix27
-rw-r--r--systems/dilion/vms/base_image.nix98
-rw-r--r--systems/dilion/vms/buildbot_configuration.nix73
-rw-r--r--systems/eldiron/base.nix371
-rw-r--r--systems/eldiron/buildbot/default.nix310
-rw-r--r--systems/eldiron/coturn.nix73
-rw-r--r--systems/eldiron/databases/default.nix56
-rw-r--r--systems/eldiron/databases/mariadb.nix188
-rw-r--r--systems/eldiron/databases/openldap/default.nix304
-rw-r--r--systems/eldiron/databases/postgresql.nix236
-rw-r--r--systems/eldiron/databases/redis.nix138
-rw-r--r--systems/eldiron/dns.nix290
-rw-r--r--systems/eldiron/duply_backup.nix151
-rw-r--r--systems/eldiron/ejabberd/default.nix141
-rw-r--r--systems/eldiron/ejabberd/ejabberd.yml (renamed from modules/private/ejabberd/ejabberd.yml)0
-rwxr-xr-xsystems/eldiron/ejabberd/warn_xmpp_email.py112
-rw-r--r--systems/eldiron/flake.lock2758
-rw-r--r--systems/eldiron/flake.nix90
-rw-r--r--systems/eldiron/ftp.nix339
-rwxr-xr-xsystems/eldiron/ftp_sync.sh47
-rw-r--r--systems/eldiron/gemini/default.nix50
-rw-r--r--systems/eldiron/gemini/public/index.gmi (renamed from modules/private/gemini/public/index.gmi)0
-rw-r--r--systems/eldiron/gitolite/default.nix127
-rwxr-xr-xsystems/eldiron/gitolite/gitolite_ldap_groups.sh15
-rw-r--r--systems/eldiron/gitolite/ldap_gitolite.sh28
-rw-r--r--systems/eldiron/irc.nix80
-rw-r--r--systems/eldiron/mail/default.nix44
-rw-r--r--systems/eldiron/mail/dovecot.nix348
-rw-r--r--systems/eldiron/mail/postfix.nix497
-rw-r--r--systems/eldiron/mail/rspamd.nix88
-rwxr-xr-xsystems/eldiron/mail/scan_reported_mails (renamed from modules/private/mail/scan_reported_mails)0
-rwxr-xr-xsystems/eldiron/mail/sieve_bin/imapsieve_copy (renamed from modules/private/mail/sieve_bin/imapsieve_copy)0
-rw-r--r--systems/eldiron/mail/sieve_scripts/backup.sieve (renamed from modules/private/mail/sieve_scripts/backup.sieve)0
-rw-r--r--systems/eldiron/mail/sieve_scripts/report_ham.sieve (renamed from modules/private/mail/sieve_scripts/report_ham.sieve)0
-rw-r--r--systems/eldiron/mail/sieve_scripts/report_spam.sieve (renamed from modules/private/mail/sieve_scripts/report_spam.sieve)0
-rw-r--r--systems/eldiron/mail/sympa.nix232
-rw-r--r--systems/eldiron/monitoring.nix51
-rw-r--r--systems/eldiron/mpd.nix (renamed from modules/private/mpd.nix)0
-rw-r--r--systems/eldiron/pub/default.nix100
-rw-r--r--systems/eldiron/pub/ldap_pub.sh38
-rw-r--r--systems/eldiron/pub/restrict71
-rw-r--r--systems/eldiron/pub/tmux.restrict.conf (renamed from modules/private/pub/tmux.restrict.conf)0
-rw-r--r--systems/eldiron/tasks/default.nix384
-rw-r--r--systems/eldiron/tasks/www/index.php168
-rw-r--r--systems/eldiron/vpn/default.nix92
-rwxr-xr-xsystems/eldiron/vpn/tinc/host-down (renamed from modules/private/vpn/tinc/host-down)0
-rwxr-xr-xsystems/eldiron/vpn/tinc/host-up (renamed from modules/private/vpn/tinc/host-up)0
-rwxr-xr-xsystems/eldiron/vpn/tinc/tinc-down (renamed from modules/private/vpn/tinc/tinc-down)0
-rwxr-xr-xsystems/eldiron/vpn/tinc/tinc-up (renamed from modules/private/vpn/tinc/tinc-up)0
-rw-r--r--systems/eldiron/vpn/tinc/tinc.conf (renamed from modules/private/vpn/tinc/tinc.conf)0
-rw-r--r--systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html (renamed from modules/private/websites/_www/googleb6d69446ff4ca3e5.html)0
-rw-r--r--systems/eldiron/websites/_www/index.htm (renamed from modules/private/websites/_www/index.htm)0
-rw-r--r--systems/eldiron/websites/_www/maintenance_immae.html (renamed from modules/private/websites/_www/maintenance_immae.html)0
-rw-r--r--systems/eldiron/websites/_www/nossl.html (renamed from modules/private/websites/_www/nossl.html)0
-rw-r--r--systems/eldiron/websites/assets/default.nix98
-rw-r--r--systems/eldiron/websites/assets/static/favicon.png (renamed from modules/private/websites/tools/assets/static/favicon.png)bin1734 -> 1734 bytes
-rw-r--r--systems/eldiron/websites/assets/static/logger.png (renamed from modules/private/websites/tools/assets/static/logger.png)bin3340 -> 3340 bytes
-rw-r--r--systems/eldiron/websites/assets/static/logger.txt (renamed from modules/private/websites/tools/assets/static/logger.txt)0
-rw-r--r--systems/eldiron/websites/assets/static/logo.jpg (renamed from modules/private/websites/tools/assets/static/logo.jpg)bin6931 -> 6931 bytes
-rw-r--r--systems/eldiron/websites/assets/static/logo.txt (renamed from modules/private/websites/tools/assets/static/logo.txt)0
-rw-r--r--systems/eldiron/websites/assets/static/logo_big.jpg (renamed from modules/private/websites/tools/assets/static/logo_big.jpg)bin16390 -> 16390 bytes
-rw-r--r--systems/eldiron/websites/assets/static/logo_big.txt (renamed from modules/private/websites/tools/assets/static/logo_big.txt)0
-rw-r--r--systems/eldiron/websites/assets/static/logo_center.jpg (renamed from modules/private/websites/tools/assets/static/logo_center.jpg)bin29509 -> 29509 bytes
-rw-r--r--systems/eldiron/websites/assets/static/logo_center.txt (renamed from modules/private/websites/tools/assets/static/logo_center.txt)0
-rw-r--r--systems/eldiron/websites/assets/static/monitoring.png (renamed from modules/private/websites/tools/assets/static/monitoring.png)bin57395 -> 57395 bytes
-rw-r--r--systems/eldiron/websites/assets/static/monitoring.txt (renamed from modules/private/websites/tools/assets/static/monitoring.txt)0
-rw-r--r--systems/eldiron/websites/assets/static/photos/ct.jpg (renamed from modules/private/websites/tools/assets/static/photos/ct.jpg)bin55914 -> 55914 bytes
-rw-r--r--systems/eldiron/websites/assets/static/photos/fretlink.jpg (renamed from modules/private/websites/tools/assets/static/photos/fretlink.jpg)bin1520106 -> 1520106 bytes
-rw-r--r--systems/eldiron/websites/assets/static/photos/raton.jpg (renamed from modules/private/websites/tools/assets/static/photos/raton.jpg)bin17614 -> 17614 bytes
-rw-r--r--systems/eldiron/websites/cloud/add-htaccess.php70
-rw-r--r--systems/eldiron/websites/cloud/default.nix151
-rw-r--r--systems/eldiron/websites/cloud/farm.nix221
-rw-r--r--systems/eldiron/websites/commento/default.nix84
-rw-r--r--systems/eldiron/websites/cryptpad/default.nix89
-rw-r--r--systems/eldiron/websites/cryptpad/farm.nix186
-rw-r--r--systems/eldiron/websites/dav/davical.nix128
-rw-r--r--systems/eldiron/websites/dav/default.nix140
-rw-r--r--systems/eldiron/websites/dav/www/index.html (renamed from modules/private/websites/tools/dav/www/index.html)0
-rw-r--r--systems/eldiron/websites/db/default.nix32
-rw-r--r--systems/eldiron/websites/default.nix319
-rw-r--r--systems/eldiron/websites/diaspora/default.nix224
-rw-r--r--systems/eldiron/websites/ether/default.nix251
-rw-r--r--systems/eldiron/websites/games/codenames/codenames.patch (renamed from modules/private/websites/tools/games/codenames/codenames.patch)0
-rw-r--r--systems/eldiron/websites/games/codenames/default.nix76
-rw-r--r--systems/eldiron/websites/games/codenames/deps.nix (renamed from modules/private/websites/tools/games/codenames/deps.nix)0
-rw-r--r--systems/eldiron/websites/games/codenames/elm-srcs.nix (renamed from modules/private/websites/tools/games/codenames/elm-srcs.nix)0
-rw-r--r--systems/eldiron/websites/games/codenames/frontend.nix (renamed from modules/private/websites/tools/games/codenames/frontend.nix)0
-rw-r--r--systems/eldiron/websites/games/codenames/greenapid.nix (renamed from modules/private/websites/tools/games/codenames/greenapid.nix)0
-rw-r--r--systems/eldiron/websites/games/codenames/greenapid.patch (renamed from modules/private/websites/tools/games/codenames/greenapid.patch)0
-rw-r--r--systems/eldiron/websites/games/codenames/immae-assets.patch15
-rw-r--r--systems/eldiron/websites/games/codenames/node-packages.nix7622
-rw-r--r--systems/eldiron/websites/games/codenames/registry.dat (renamed from modules/private/websites/tools/games/codenames/registry.dat)bin105421 -> 105421 bytes
-rw-r--r--systems/eldiron/websites/games/codenames/shell.nix (renamed from modules/private/websites/tools/games/codenames/shell.nix)0
-rw-r--r--systems/eldiron/websites/games/codenames/wordlists/french.txt (renamed from modules/private/websites/tools/games/codenames/wordlists/french.txt)0
-rw-r--r--systems/eldiron/websites/games/terraforming-mars/default.nix75
-rw-r--r--systems/eldiron/websites/games/terraforming-mars/immae-assets.patch13
-rw-r--r--systems/eldiron/websites/games/terraforming-mars/node-packages.nix (renamed from modules/private/websites/tools/games/terraforming-mars/node-packages.nix)0
-rw-r--r--systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix39
-rw-r--r--systems/eldiron/websites/git/cgit_js.html16
-rw-r--r--systems/eldiron/websites/git/default.nix98
-rw-r--r--systems/eldiron/websites/git/gitweb.nix124
-rw-r--r--systems/eldiron/websites/git/mantisbt.nix86
-rw-r--r--systems/eldiron/websites/im/default.nix118
-rw-r--r--systems/eldiron/websites/im/www/converse.html57
-rw-r--r--systems/eldiron/websites/im/www/index.html (renamed from modules/private/websites/tools/im/www/index.html)0
-rw-r--r--systems/eldiron/websites/immae/matrix/client11
-rw-r--r--systems/eldiron/websites/immae/matrix/server (renamed from modules/private/websites/immae/matrix/server)0
-rw-r--r--systems/eldiron/websites/immae/production.nix107
-rw-r--r--systems/eldiron/websites/immae/release.nix40
-rw-r--r--systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt (renamed from modules/private/websites/immae/eurl/certificates/2021-certificate.crt)0
-rw-r--r--systems/eldiron/websites/kanboard/farm.nix183
-rw-r--r--systems/eldiron/websites/mail/default.nix141
-rw-r--r--systems/eldiron/websites/mail/mta-sts.nix42
-rw-r--r--systems/eldiron/websites/mail/rainloop.nix54
-rw-r--r--systems/eldiron/websites/mail/roundcubemail.nix119
-rw-r--r--systems/eldiron/websites/mail/www/index.html (renamed from modules/private/websites/tools/mail/www/index.html)0
-rw-r--r--systems/eldiron/websites/mastodon/default.nix174
-rw-r--r--systems/eldiron/websites/mgoblin/default.nix173
-rw-r--r--systems/eldiron/websites/moomin.txt (renamed from modules/private/websites/moomin.txt)0
-rw-r--r--systems/eldiron/websites/nossl/index.html (renamed from modules/websites/nosslVhost/index.html)0
-rw-r--r--systems/eldiron/websites/peertube/default.nix147
-rw-r--r--systems/eldiron/websites/performance/default.nix93
-rw-r--r--systems/eldiron/websites/stats/default.nix51
-rw-r--r--systems/eldiron/websites/tools/adminer.nix83
-rw-r--r--systems/eldiron/websites/tools/default.nix547
-rw-r--r--systems/eldiron/websites/tools/dmarc_reports.nix61
-rw-r--r--systems/eldiron/websites/tools/dmarc_reports/api.php (renamed from modules/private/websites/tools/tools/dmarc_reports/api.php)0
-rw-r--r--systems/eldiron/websites/tools/dmarc_reports/app.js (renamed from modules/private/websites/tools/tools/dmarc_reports/app.js)0
-rw-r--r--systems/eldiron/websites/tools/dmarc_reports/default.css (renamed from modules/private/websites/tools/tools/dmarc_reports/default.css)0
-rw-r--r--systems/eldiron/websites/tools/dmarc_reports/index.html (renamed from modules/private/websites/tools/tools/dmarc_reports/index.html)0
-rw-r--r--systems/eldiron/websites/tools/dokuwiki.nix106
-rw-r--r--systems/eldiron/websites/tools/grocy.nix48
-rw-r--r--systems/eldiron/websites/tools/kanboard.nix81
-rw-r--r--systems/eldiron/websites/tools/landing.nix38
-rw-r--r--systems/eldiron/websites/tools/landing/ldap_password.php170
-rw-r--r--systems/eldiron/websites/tools/landing/ldap_ssh_keys.php343
-rw-r--r--systems/eldiron/websites/tools/landing/myip.php (renamed from modules/private/websites/tools/tools/landing/myip.php)0
-rw-r--r--systems/eldiron/websites/tools/landing/node-packages.nix (renamed from modules/private/websites/tools/tools/landing/node-packages.nix)0
-rw-r--r--systems/eldiron/websites/tools/landing/yarn-packages.nix (renamed from modules/private/websites/tools/tools/landing/yarn-packages.nix)0
-rw-r--r--systems/eldiron/websites/tools/ldap.nix77
-rw-r--r--systems/eldiron/websites/tools/phpbb.nix69
-rw-r--r--systems/eldiron/websites/tools/rompr.nix86
-rw-r--r--systems/eldiron/websites/tools/shaarli.nix102
-rw-r--r--systems/eldiron/websites/tools/ttrss.nix167
-rw-r--r--systems/eldiron/websites/tools/wallabag.nix180
-rw-r--r--systems/eldiron/websites/tools/webhooks.nix25
-rw-r--r--systems/eldiron/websites/tools/ympd.nix54
-rw-r--r--systems/eldiron/websites/tools/yourls.nix118
-rw-r--r--systems/eldiron/websites/visio/default.nix63
-rw-r--r--systems/eldiron/websites/vpn/default.nix13
-rw-r--r--systems/eldiron/websites/vpn/www/index.html (renamed from modules/private/websites/tools/vpn/www/index.html)0
-rw-r--r--systems/eldiron/websites/vpn/www/style.css (renamed from modules/private/websites/tools/vpn/www/style.css)0
-rw-r--r--systems/eldiron/webstats/default.nix80
-rw-r--r--systems/eldiron/webstats/goaccess.conf (renamed from modules/webapps/webstats/goaccess.conf)0
-rw-r--r--systems/monitoring-1/base.nix75
-rw-r--r--systems/monitoring-1/flake.lock790
-rw-r--r--systems/monitoring-1/flake.nix45
-rw-r--r--systems/monitoring-1/monitoring-master.nix87
-rw-r--r--systems/monitoring-1/monitoring.nix61
-rw-r--r--systems/monitoring-1/monitoring/master.nix43
-rw-r--r--systems/monitoring-1/monitoring/phare.nix20
-rw-r--r--systems/monitoring-1/monitoring/ulminfo-fr.nix20
-rw-r--r--systems/monitoring-1/status.nix84
-rwxr-xr-xsystems/monitoring-1/status/app.py (renamed from modules/private/monitoring/status/app.py)0
-rw-r--r--systems/monitoring-1/status_engine.nix123
-rw-r--r--systems/quatresaisons/flake.lock767
-rw-r--r--systems/quatresaisons/flake.nix49
-rw-r--r--systems/zoldene/Immae.pub322
-rw-r--r--systems/zoldene/base.nix122
-rw-r--r--systems/zoldene/disko.nix87
-rw-r--r--systems/zoldene/flake.lock560
-rw-r--r--systems/zoldene/flake.nix29
-rw-r--r--systems/zoldene/logging.nix138
1066 files changed, 77813 insertions, 56299 deletions
diff --git a/.envrc b/.envrc
index 438d807..4718a18 100644
--- a/.envrc
+++ b/.envrc
@@ -1,13 +1,25 @@
1# vim: filetype=bash 1# vim: filetype=bash
2export NIX_PATH=nixpkgs=$(cat $(expand_path nix/sources.json) | jq -r '."nixpkgs-nixops".url') 2export DIRENV_FLAKE_DONT_ADD_SOURCES_ROOT=y
3NIX_PATH=$NIX_PATH:nixpkgs-nix=$(cat $(expand_path nix/sources.json) | jq -r '."nixpkgs-nix".url') 3nix_direnv_watch_file() {
4 nix_watches+=("$@")
5 filtered=()
6 for i in "$@"; do
7 case "$i" in
8 */flake.lock)
9 ;;
10 *)
11 filtered+=("$i")
12 esac
13 done
14 watch_file "${filtered[@]}"
15}
4 16
5export NIXOPS_ENV_LOADED=1 17if nix eval './deploy#sops-vars-file' 2>/dev/null >/dev/null; then
18 export DEVSHELL_NO_MOTD=1
19 cd deploy
20 use flake . --no-warn-dirty
21 cd ..
22 unset DEVSHELL_NO_MOTD
23fi
6 24
7PATH_add $(expand_path scripts) 25use flake . --no-warn-dirty
8PATH_add $(expand_path nixops/scripts)
9
10use nix
11watch_file $(expand_path nix/sources.json)
12
13clean_nix_shell
diff --git a/.gitconfig b/.gitconfig
deleted file mode 100644
index 7aa8870..0000000
--- a/.gitconfig
+++ /dev/null
@@ -1,9 +0,0 @@
1; git config --local include.path '../.gitconfig'
2[push]
3 recurseSubmodules = on-demand
4; Find a way to include this file automatically?
5; git -C nixops/secrets config --local diff.gpgdiffer.textconv "gpg --quiet -d"
6[diff "gpgdiffer"]
7 textconv = "gpg --quiet -d"
8[diff "sopsdiffer"]
9 textconv = "sops -d"
diff --git a/.gitignore b/.gitignore
index ff9c9cf..0c17e7a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
1/result* 1/result*
2/versions_log 2/versions_log
3.direnv/ 3.direnv/
4/nixops/.gcroots 4/deploy/.gcroots
5/deploy/history
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index c2d9b18..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
1[submodule "nixops/secrets"]
2 path = nixops/secrets
3 url = gitolite@git.immae.eu:perso/Immae/Config/Nix/Nixops/Secrets
diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md
index 6c68680..fcd0b15 100644
--- a/DOCUMENTATION.md
+++ b/DOCUMENTATION.md
@@ -1,7 +1,7 @@
1Get Started 1Get Started
2=========== 2===========
3 3
4- You may run ./nixops/scripts/setup to setup the directory and variables 4- You may run ./scripts/setup to setup the directory and variables
5 The script won’t do anything without asking first, you may stop at any 5 The script won’t do anything without asking first, you may stop at any
6 step. 6 step.
7 7
@@ -43,8 +43,7 @@ The directory is divided in several sections:
43 of hosts. They tend to be less used now. But sometimes they need to 43 of hosts. They tend to be less used now. But sometimes they need to
44 have an identity (mostly to be able to send e-mails) The subsection 44 have an identity (mostly to be able to send e-mails) The subsection
45 "roles" (ou=roles,ou=hosts,dc=immae,dc=eu) was from a Puppet age and 45 "roles" (ou=roles,ou=hosts,dc=immae,dc=eu) was from a Puppet age and
46 is deprecated. Only one host remains handled by Puppet (caldance) and 46 is deprecated.
47 should be replaced with an internal VM.
48- The "groups" section (ou=groups,dc=immae,dc=eu) contains the generic 47- The "groups" section (ou=groups,dc=immae,dc=eu) contains the generic
49 groups of users not associated to a service. 48 groups of users not associated to a service.
50- The "group_users" and "users" sections contain the users (usually with 49- The "group_users" and "users" sections contain the users (usually with
@@ -58,7 +57,7 @@ How does nixpkgs resolve
58To build nixops machines 57To build nixops machines
59------------------------ 58------------------------
60 59
61The `NIX_PATH` environment variable is built in nixops/Makefile and 60The `NIX_PATH` environment variable is built in deploy/Makefile and
62contains three paths: nixpkgs, nixpkgsNext, nixpkgsPrevious. Only the 61contains three paths: nixpkgs, nixpkgsNext, nixpkgsPrevious. Only the
63first one is actually used most of the time. Derivations that need 62first one is actually used most of the time. Derivations that need
64pinned nixpkgs should declare it in `nix/sources.json` (it’s the case 63pinned nixpkgs should declare it in `nix/sources.json` (it’s the case
@@ -236,13 +235,18 @@ Nextcloud
236--------- 235---------
237 236
238- Do not skip major versions! 237- Do not skip major versions!
238- Check php supported version (lib/versioncheck.php file)
239- Update all the apps: check on https://apps.nextcloud.com/ and build with
240 ```
241 nix-build -E "with import <nixpkgs> {};webapps.nextcloud.withApps (a: builtins.attrValues webapps.nextcloud.allApps)"
242 ```
239- Put nextcloud in maintenance mode : 243- Put nextcloud in maintenance mode :
240 ``` 244 ```
241 nextcloud-occ maintenance:mode --on 245 nextcloud-occ maintenance:mode --on
242 ``` 246 ```
243- Do a backup : 247- Do a backup :
244 ``` 248 ```
245 sudo -u postgres pg_dump -n owncloud webapps > nextcloud.sql 249 sudo -u postgres pg_dump owncloud > nextcloud.sql
246 ``` 250 ```
247- Upgrade 251- Upgrade
248- Run the upgrade task : 252- Run the upgrade task :
@@ -256,6 +260,22 @@ Nextcloud
256- Issues : 260- Issues :
257 https://docs.nextcloud.com/server/16/admin_manual/maintenance/manual_upgrade.html 261 https://docs.nextcloud.com/server/16/admin_manual/maintenance/manual_upgrade.html
258 262
263- Farm :
264 Once a new instance thename is created, create the database:
265 ```
266 CREATE USER nextcloud_thename WITH PASSWORD 'somepassword';
267 CREATE DATABASE nextcloud_thename WITH OWNER nextcloud_thename;
268 ```
269 Then add this to the config.php:
270 ```
271 'appstoreenabled' => false,
272 ```
273 Then run:
274 ```
275 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
276 ```
277 Finally, edit the config.php to add the correct trusted domain
278
259Flakes 279Flakes
260------ 280------
261 281
diff --git a/Makefile b/Makefile
index 50fa09f..6282df2 100644
--- a/Makefile
+++ b/Makefile
@@ -1,16 +1,128 @@
1subrecipes = setup nix-info edit_env edit_vars
2subrecipes += ssh-eldiron ssh-backup-2 ssh-monitoring-1 ssh-4c
3subrecipes += debug build dry-run upload deploy next-boot deploy-reboot
4subrecipes += list-generations delete-generations cleanup
5${subrecipes}:
6 @$(MAKE) --no-print-directory -C nixops/ $@
7.PHONY: ${subrecipes}
8
9nur: 1nur:
10 ./scripts/make-nur 2 ./scripts/make-nur
11 curl -o /dev/null -XPOST "https://nur-update.herokuapp.com/update?repo=immae" 3 curl -o /dev/null -XPOST "https://nur-update.herokuapp.com/update?repo=immae"
12 4
13shellcheck: 5shellcheck:
14 shellcheck scripts/* nixops/scripts/* modules/private/gitolite/gitolite_ldap_groups.sh modules/private/ssh/ldap_authorized_keys.sh modules/private/pub/restrict 6 shellcheck scripts/* deploy/scripts/* modules/private/gitolite/gitolite_ldap_groups.sh modules/private/ssh/ldap_authorized_keys.sh modules/private/pub/restrict
15 7
16.PHONY: nur shellcheck 8.PHONY: nur shellcheck
9
10###### Initial setup
11setup:
12 ./scripts/setup
13.PHONY: setup
14
15###### Morph regular tasks
16PROFILE=./deploy/history
17TARGET ?=
18COMMON_COLEMNA_ARGS = -f ./deploy/flake.nix -v
19#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/
20MORPH_ARGS ?=
21ifdef TARGET
22 # multiple targets: --on="{machine1,machine2}" (works with * glob too)
23 override MORPH_ARGS +=--on=$(TARGET)
24endif
25SSH_ARGS ?=
26
27nodes= dilion eldiron backup-2 monitoring-1 quatresaisons zoldene
28
29refresh_flakes:
30 @if [ -n "$(TARGET)" ]; then \
31 ./scripts/refresh_flakes --no-new-inputs ./systems/$(TARGET)/flake.nix; \
32 nix --no-warn-dirty flake lock --update-input n-$(TARGET) ./flakes; \
33 nix --no-warn-dirty flake lock --update-input main-flake ./deploy; \
34 else \
35 ./scripts/refresh_flakes --no-new-inputs; \
36 fi
37 (cd deploy ; nix flake lock --update-input secrets-local || true)
38
39.PHONY: refresh_flakes
40
41.PHONY: build $(addprefix build-,$(nodes))
42build-dilion build-eldiron build-backup-2 build-monitoring-1 build-quatresaisons build-zoldene:
43 $(MAKE) build TARGET=$(@:build-%=%)
44build: refresh_flakes
45 colmena build $(COMMON_COLEMNA_ARGS) $(MORPH_ARGS)
46
47.PHONY: deploy $(addprefix deploy-,$(nodes))
48deploy-dilion deploy-eldiron deploy-backup-2 deploy-monitoring-1 deploy-quatresaisons deploy-zoldene:
49 $(MAKE) deploy TARGET=$(@:deploy-%=%)
50deploy: refresh_flakes
51 ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) switch --keep-result $(MORPH_ARGS)
52 $(MAKE) keep-roots
53
54.PHONY: ssh $(addprefix ssh-,$(nodes))
55ssh-4c: ssh-quatresaisons
56ssh-dilion ssh-eldiron ssh-backup-2 ssh-monitoring-1 ssh-quatresaisons ssh-zoldene:
57 $(MAKE) ssh TARGET=$(@:ssh-%=%)
58ssh:
59 ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@$(TARGET) $(SSH_ARGS)'
60
61.PHONY: ssh-decrypt $(addsuffix -decrypt,$(addprefix ssh-,$(nodes)))
62ssh-zoldene-decrypt:
63 $(MAKE) ssh-decrypt TARGET=$(@:ssh-%-decrypt=%)
64ssh-decrypt:
65 ./scripts/with_env bash -c 'ssh -p 2222 -i $$SSH_IDENTITY_FILE root@$(TARGET) $(SSH_ARGS)'
66
67.PHONY: debug $(addprefix debug-,$(nodes))
68debug-dilion debug-eldiron debug-backup-2 debug-monitoring-1 debug-quatresaisons debug-zoldene:
69 $(MAKE) debug TARGET=$(@:debug-%=%)
70debug: refresh_flakes
71 colmena build $(COMMON_COLEMNA_ARGS) --show-trace $(MORPH_ARGS)
72
73.PHONY: upload $(addprefix upload-,$(nodes))
74upload-dilion upload-eldiron upload-backup-2 upload-monitoring-1 upload-quatresaisons upload-zoldene:
75 $(MAKE) upload TARGET=$(@:upload-%=%)
76upload: refresh_flakes
77 ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) push $(MORPH_ARGS)
78
79.PHONY: test-deploy $(addprefix test-deploy-,$(nodes))
80test-deploy-dilion test-deploy-eldiron test-deploy-backup-2 test-deploy-monitoring-1 test-deploy-quatresaisons test-deploy-zoldene:
81 $(MAKE) test-deploy TARGET=$(@:test-deploy-%=%)
82test-deploy: refresh_flakes
83 ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) test $(MORPH_ARGS)
84
85.PHONY: next-boot $(addprefix next-boot-,$(nodes))
86next-boot-dilion next-boot-eldiron next-boot-backup-2 next-boot-monitoring-1 next-boot-quatresaisons next-boot-zoldene:
87 $(MAKE) next-boot TARGET=$(@:next-boot-%=%)
88next-boot: refresh_flakes
89 ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) boot $(MORPH_ARGS)
90
91.PHONY: deploy-reboot $(addprefix deploy-reboot-,$(nodes))
92deploy-reboot-dilion deploy-reboot-eldiron deploy-reboot-backup-2 deploy-reboot-monitoring-1 deploy-reboot-quatresaisons deploy-reboot-zoldene:
93 $(MAKE) deploy-reboot TARGET=$(@:deploy-reboot-%=%)
94deploy-reboot: refresh_flakes
95 ./scripts/with_env colmena apply $(COMMON_COLEMNA_ARGS) boot --reboot $(MORPH_ARGS)
96 # Run it a second time because first time uploads the secrets
97 # before rebooting
98 $(MAKE) deploy
99
100keep-roots:
101 mkdir -p $(PROFILE)
102 for i in deploy/.gcroots/node-*; do nix-env -p $(PROFILE)/$$(basename $$i | sed -e "s/node-//") --set "$$i"; done
103
104systems := $(shell find $(PROFILE) -type l -not -name "*link" -printf "%f ")
105###### Cleanup generations and garbage collection
106GEN ?= "+3"
107
108list-generations:
109 @$(foreach system, $(systems), echo $(system);\
110 nix-env -p $(PROFILE)/$(system) --list-generations;\
111 $(MAKE) ssh-$(system) SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --list-generations";\
112 )
113.PHONY: list-generations
114
115delete-generations:
116 $(MAKE) keep-roots
117 @$(foreach system, $(systems), echo $(system); \
118 nix-env -p $(PROFILE)/$(system) --delete-generations $(GEN);\
119 $(MAKE) ssh-$(system) SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)";\
120 )
121.PHONY: delete-generations
122
123cleanup: delete-generations
124 nix-store --gc
125 @$(foreach system, $(systems), echo $(system); \
126 $(MAKE) ssh-$(system) SSH_ARGS="nix-store --gc";\
127 )
128.PHONY: cleanup
diff --git a/default.nix b/default.nix
index 1f43cdd..d0bc618 100644
--- a/default.nix
+++ b/default.nix
@@ -1,11 +1,9 @@
1{ sources ? import ./nix/sources.nix, pkgs ? import sources.nixpkgs {} }: 1{}:
2let 2let
3 mypkgs = pkgs.callPackage ./pkgs {}; 3 mypackages = builtins.getFlake "path:${builtins.toString ./flakes/mypackages}";
4in 4in
5{ 5{
6 lib = pkgs.callPackage ./lib {}; 6 lib = mypackages.mylibs;
7 modules = import ./modules; 7 overlays = mypackages.overlays;
8 overlays = import ./overlays; 8 pkgs = mypackages.packages."${builtins.currentSystem}";
9 pkgs = mypkgs; 9} // mypackages.packages."${builtins.currentSystem}"
10 environments = pkgs.callPackage ./environments {};
11} // mypkgs
diff --git a/deploy/flake.lock b/deploy/flake.lock
new file mode 100644
index 0000000..afa2ec5
--- /dev/null
+++ b/deploy/flake.lock
@@ -0,0 +1,9816 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_6",
6 "nixpkgs": "nixpkgs_11"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "backports_2": {
20 "inputs": {
21 "flake-utils": "flake-utils_8",
22 "nixpkgs": "nixpkgs_18"
23 },
24 "locked": {
25 "lastModified": 1,
26 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
27 "path": "../../backports",
28 "type": "path"
29 },
30 "original": {
31 "path": "../../backports",
32 "type": "path"
33 }
34 },
35 "backports_3": {
36 "inputs": {
37 "flake-utils": "flake-utils_20",
38 "nixpkgs": "nixpkgs_34"
39 },
40 "locked": {
41 "lastModified": 1,
42 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
43 "path": "../../backports",
44 "type": "path"
45 },
46 "original": {
47 "path": "../../backports",
48 "type": "path"
49 }
50 },
51 "backports_4": {
52 "inputs": {
53 "flake-utils": "flake-utils_34",
54 "nixpkgs": "nixpkgs_57"
55 },
56 "locked": {
57 "lastModified": 1,
58 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
59 "path": "../../backports",
60 "type": "path"
61 },
62 "original": {
63 "path": "../../backports",
64 "type": "path"
65 }
66 },
67 "backports_5": {
68 "inputs": {
69 "flake-utils": "flake-utils_37",
70 "nixpkgs": "nixpkgs_65"
71 },
72 "locked": {
73 "lastModified": 1,
74 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
75 "path": "../../backports",
76 "type": "path"
77 },
78 "original": {
79 "path": "../../backports",
80 "type": "path"
81 }
82 },
83 "backports_6": {
84 "inputs": {
85 "flake-utils": "flake-utils_39",
86 "nixpkgs": "nixpkgs_72"
87 },
88 "locked": {
89 "lastModified": 1,
90 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
91 "path": "../../backports",
92 "type": "path"
93 },
94 "original": {
95 "path": "../../backports",
96 "type": "path"
97 }
98 },
99 "backports_7": {
100 "inputs": {
101 "flake-utils": "flake-utils_61",
102 "nixpkgs": "nixpkgs_101"
103 },
104 "locked": {
105 "lastModified": 1,
106 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
107 "path": "../../backports",
108 "type": "path"
109 },
110 "original": {
111 "path": "../../backports",
112 "type": "path"
113 }
114 },
115 "buildslist": {
116 "flake": false,
117 "locked": {
118 "lastModified": 1585697026,
119 "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
120 "ref": "master",
121 "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
122 "revCount": 4,
123 "type": "git",
124 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
125 },
126 "original": {
127 "type": "git",
128 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
129 }
130 },
131 "buildslist_2": {
132 "flake": false,
133 "locked": {
134 "lastModified": 1585697026,
135 "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
136 "ref": "master",
137 "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
138 "revCount": 4,
139 "type": "git",
140 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
141 },
142 "original": {
143 "type": "git",
144 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
145 }
146 },
147 "chatons": {
148 "inputs": {
149 "environment": "environment"
150 },
151 "locked": {
152 "lastModified": 1,
153 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
154 "path": "../../flakes/private/chatons",
155 "type": "path"
156 },
157 "original": {
158 "path": "../../flakes/private/chatons",
159 "type": "path"
160 }
161 },
162 "chatons_2": {
163 "inputs": {
164 "environment": "environment_18"
165 },
166 "locked": {
167 "lastModified": 1,
168 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
169 "path": "../../flakes/private/chatons",
170 "type": "path"
171 },
172 "original": {
173 "path": "../../flakes/private/chatons",
174 "type": "path"
175 }
176 },
177 "colmena": {
178 "inputs": {
179 "flake-compat": "flake-compat",
180 "flake-utils": "flake-utils_3",
181 "nixpkgs": "nixpkgs_4",
182 "stable": "stable"
183 },
184 "locked": {
185 "lastModified": 1687954574,
186 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
187 "owner": "immae",
188 "repo": "colmena",
189 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
190 "type": "github"
191 },
192 "original": {
193 "owner": "immae",
194 "ref": "add-lib-get-flake",
195 "repo": "colmena",
196 "type": "github"
197 }
198 },
199 "colmena_2": {
200 "inputs": {
201 "flake-compat": "flake-compat_2",
202 "flake-utils": "flake-utils_7",
203 "nixpkgs": "nixpkgs_13",
204 "stable": "stable_2"
205 },
206 "locked": {
207 "lastModified": 1687954574,
208 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
209 "owner": "immae",
210 "repo": "colmena",
211 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
212 "type": "github"
213 },
214 "original": {
215 "owner": "immae",
216 "ref": "add-lib-get-flake",
217 "repo": "colmena",
218 "type": "github"
219 }
220 },
221 "colmena_3": {
222 "inputs": {
223 "flake-compat": "flake-compat_3",
224 "flake-utils": "flake-utils_10",
225 "nixpkgs": "nixpkgs_20",
226 "stable": "stable_3"
227 },
228 "locked": {
229 "lastModified": 1687954574,
230 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
231 "owner": "immae",
232 "repo": "colmena",
233 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
234 "type": "github"
235 },
236 "original": {
237 "owner": "immae",
238 "ref": "add-lib-get-flake",
239 "repo": "colmena",
240 "type": "github"
241 }
242 },
243 "colmena_4": {
244 "inputs": {
245 "flake-compat": "flake-compat_4",
246 "flake-utils": "flake-utils_32",
247 "nixpkgs": "nixpkgs_51",
248 "stable": "stable_4"
249 },
250 "locked": {
251 "lastModified": 1687954574,
252 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
253 "owner": "immae",
254 "repo": "colmena",
255 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
256 "type": "github"
257 },
258 "original": {
259 "owner": "immae",
260 "ref": "add-lib-get-flake",
261 "repo": "colmena",
262 "type": "github"
263 }
264 },
265 "colmena_5": {
266 "inputs": {
267 "flake-compat": "flake-compat_5",
268 "flake-utils": "flake-utils_35",
269 "nixpkgs": "nixpkgs_59",
270 "stable": "stable_5"
271 },
272 "locked": {
273 "lastModified": 1687954574,
274 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
275 "owner": "immae",
276 "repo": "colmena",
277 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
278 "type": "github"
279 },
280 "original": {
281 "owner": "immae",
282 "ref": "add-lib-get-flake",
283 "repo": "colmena",
284 "type": "github"
285 }
286 },
287 "colmena_6": {
288 "inputs": {
289 "flake-compat": "flake-compat_6",
290 "flake-utils": "flake-utils_38",
291 "nixpkgs": "nixpkgs_67",
292 "stable": "stable_6"
293 },
294 "locked": {
295 "lastModified": 1687954574,
296 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
297 "owner": "immae",
298 "repo": "colmena",
299 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
300 "type": "github"
301 },
302 "original": {
303 "owner": "immae",
304 "ref": "add-lib-get-flake",
305 "repo": "colmena",
306 "type": "github"
307 }
308 },
309 "colmena_7": {
310 "inputs": {
311 "flake-compat": "flake-compat_7",
312 "flake-utils": "flake-utils_45",
313 "nixpkgs": "nixpkgs_81",
314 "stable": "stable_7"
315 },
316 "locked": {
317 "lastModified": 1687954574,
318 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
319 "owner": "immae",
320 "repo": "colmena",
321 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
322 "type": "github"
323 },
324 "original": {
325 "owner": "immae",
326 "ref": "add-lib-get-flake",
327 "repo": "colmena",
328 "type": "github"
329 }
330 },
331 "copanier": {
332 "flake": false,
333 "locked": {
334 "lastModified": 1633895178,
335 "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
336 "owner": "spiral-project",
337 "repo": "copanier",
338 "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
339 "type": "github"
340 },
341 "original": {
342 "owner": "spiral-project",
343 "repo": "copanier",
344 "type": "github"
345 }
346 },
347 "copanier_2": {
348 "flake": false,
349 "locked": {
350 "lastModified": 1633895178,
351 "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
352 "owner": "spiral-project",
353 "repo": "copanier",
354 "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
355 "type": "github"
356 },
357 "original": {
358 "owner": "spiral-project",
359 "repo": "copanier",
360 "type": "github"
361 }
362 },
363 "devshell": {
364 "inputs": {
365 "nixpkgs": "nixpkgs",
366 "systems": "systems"
367 },
368 "locked": {
369 "lastModified": 1688380630,
370 "narHash": "sha256-8ilApWVb1mAi4439zS3iFeIT0ODlbrifm/fegWwgHjA=",
371 "owner": "numtide",
372 "repo": "devshell",
373 "rev": "f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205",
374 "type": "github"
375 },
376 "original": {
377 "owner": "numtide",
378 "repo": "devshell",
379 "type": "github"
380 }
381 },
382 "diaspora": {
383 "flake": false,
384 "locked": {
385 "lastModified": 1551139311,
386 "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
387 "owner": "diaspora",
388 "repo": "diaspora",
389 "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
390 "type": "github"
391 },
392 "original": {
393 "owner": "diaspora",
394 "ref": "v0.7.10.0",
395 "repo": "diaspora",
396 "type": "github"
397 }
398 },
399 "diaspora_2": {
400 "flake": false,
401 "locked": {
402 "lastModified": 1551139311,
403 "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
404 "owner": "diaspora",
405 "repo": "diaspora",
406 "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
407 "type": "github"
408 },
409 "original": {
410 "owner": "diaspora",
411 "ref": "v0.7.10.0",
412 "repo": "diaspora",
413 "type": "github"
414 }
415 },
416 "disko": {
417 "inputs": {
418 "nixpkgs": "nixpkgs_5"
419 },
420 "locked": {
421 "lastModified": 1687968164,
422 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
423 "owner": "nix-community",
424 "repo": "disko",
425 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
426 "type": "github"
427 },
428 "original": {
429 "owner": "nix-community",
430 "repo": "disko",
431 "type": "github"
432 }
433 },
434 "disko_2": {
435 "inputs": {
436 "nixpkgs": "nixpkgs_14"
437 },
438 "locked": {
439 "lastModified": 1687968164,
440 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
441 "owner": "nix-community",
442 "repo": "disko",
443 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
444 "type": "github"
445 },
446 "original": {
447 "owner": "nix-community",
448 "repo": "disko",
449 "type": "github"
450 }
451 },
452 "disko_3": {
453 "inputs": {
454 "nixpkgs": "nixpkgs_21"
455 },
456 "locked": {
457 "lastModified": 1687968164,
458 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
459 "owner": "nix-community",
460 "repo": "disko",
461 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
462 "type": "github"
463 },
464 "original": {
465 "owner": "nix-community",
466 "repo": "disko",
467 "type": "github"
468 }
469 },
470 "disko_4": {
471 "inputs": {
472 "nixpkgs": "nixpkgs_52"
473 },
474 "locked": {
475 "lastModified": 1687968164,
476 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
477 "owner": "nix-community",
478 "repo": "disko",
479 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
480 "type": "github"
481 },
482 "original": {
483 "owner": "nix-community",
484 "repo": "disko",
485 "type": "github"
486 }
487 },
488 "disko_5": {
489 "inputs": {
490 "nixpkgs": "nixpkgs_60"
491 },
492 "locked": {
493 "lastModified": 1687968164,
494 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
495 "owner": "nix-community",
496 "repo": "disko",
497 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
498 "type": "github"
499 },
500 "original": {
501 "owner": "nix-community",
502 "repo": "disko",
503 "type": "github"
504 }
505 },
506 "disko_6": {
507 "inputs": {
508 "nixpkgs": "nixpkgs_68"
509 },
510 "locked": {
511 "lastModified": 1687968164,
512 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
513 "owner": "nix-community",
514 "repo": "disko",
515 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
516 "type": "github"
517 },
518 "original": {
519 "owner": "nix-community",
520 "repo": "disko",
521 "type": "github"
522 }
523 },
524 "disko_7": {
525 "inputs": {
526 "nixpkgs": "nixpkgs_82"
527 },
528 "locked": {
529 "lastModified": 1687968164,
530 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
531 "owner": "nix-community",
532 "repo": "disko",
533 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
534 "type": "github"
535 },
536 "original": {
537 "owner": "nix-community",
538 "repo": "disko",
539 "type": "github"
540 }
541 },
542 "dns-nix": {
543 "inputs": {
544 "flake-utils": "flake-utils_9",
545 "nixpkgs": [
546 "main-flake",
547 "n-eldiron",
548 "nixpkgs"
549 ]
550 },
551 "locked": {
552 "lastModified": 1635273082,
553 "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=",
554 "owner": "kirelagin",
555 "repo": "dns.nix",
556 "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a",
557 "type": "github"
558 },
559 "original": {
560 "owner": "kirelagin",
561 "repo": "dns.nix",
562 "type": "github"
563 }
564 },
565 "environment": {
566 "locked": {
567 "lastModified": 1,
568 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
569 "path": "../environment",
570 "type": "path"
571 },
572 "original": {
573 "path": "../environment",
574 "type": "path"
575 }
576 },
577 "environment_10": {
578 "locked": {
579 "lastModified": 1,
580 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
581 "path": "../environment",
582 "type": "path"
583 },
584 "original": {
585 "path": "../environment",
586 "type": "path"
587 }
588 },
589 "environment_11": {
590 "locked": {
591 "lastModified": 1,
592 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
593 "path": "../environment",
594 "type": "path"
595 },
596 "original": {
597 "path": "../environment",
598 "type": "path"
599 }
600 },
601 "environment_12": {
602 "locked": {
603 "lastModified": 1,
604 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
605 "path": "../environment",
606 "type": "path"
607 },
608 "original": {
609 "path": "../environment",
610 "type": "path"
611 }
612 },
613 "environment_13": {
614 "locked": {
615 "lastModified": 1,
616 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
617 "path": "../environment",
618 "type": "path"
619 },
620 "original": {
621 "path": "../environment",
622 "type": "path"
623 }
624 },
625 "environment_14": {
626 "locked": {
627 "lastModified": 1,
628 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
629 "path": "../environment",
630 "type": "path"
631 },
632 "original": {
633 "path": "../environment",
634 "type": "path"
635 }
636 },
637 "environment_15": {
638 "locked": {
639 "lastModified": 1,
640 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
641 "path": "../environment",
642 "type": "path"
643 },
644 "original": {
645 "path": "../environment",
646 "type": "path"
647 }
648 },
649 "environment_16": {
650 "locked": {
651 "lastModified": 1,
652 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
653 "path": "../environment",
654 "type": "path"
655 },
656 "original": {
657 "path": "../environment",
658 "type": "path"
659 }
660 },
661 "environment_17": {
662 "locked": {
663 "lastModified": 1,
664 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
665 "path": "../environment",
666 "type": "path"
667 },
668 "original": {
669 "path": "../environment",
670 "type": "path"
671 }
672 },
673 "environment_18": {
674 "locked": {
675 "lastModified": 1,
676 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
677 "path": "../environment",
678 "type": "path"
679 },
680 "original": {
681 "path": "../environment",
682 "type": "path"
683 }
684 },
685 "environment_19": {
686 "locked": {
687 "lastModified": 1,
688 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
689 "path": "../../flakes/private/environment",
690 "type": "path"
691 },
692 "original": {
693 "path": "../../flakes/private/environment",
694 "type": "path"
695 }
696 },
697 "environment_2": {
698 "locked": {
699 "lastModified": 1,
700 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
701 "path": "../../flakes/private/environment",
702 "type": "path"
703 },
704 "original": {
705 "path": "../../flakes/private/environment",
706 "type": "path"
707 }
708 },
709 "environment_20": {
710 "locked": {
711 "lastModified": 1,
712 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
713 "path": "../environment",
714 "type": "path"
715 },
716 "original": {
717 "path": "../environment",
718 "type": "path"
719 }
720 },
721 "environment_21": {
722 "locked": {
723 "lastModified": 1,
724 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
725 "path": "../environment",
726 "type": "path"
727 },
728 "original": {
729 "path": "../environment",
730 "type": "path"
731 }
732 },
733 "environment_22": {
734 "locked": {
735 "lastModified": 1,
736 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
737 "path": "../environment",
738 "type": "path"
739 },
740 "original": {
741 "path": "../environment",
742 "type": "path"
743 }
744 },
745 "environment_23": {
746 "locked": {
747 "lastModified": 1,
748 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
749 "path": "../../flakes/private/environment",
750 "type": "path"
751 },
752 "original": {
753 "path": "../../flakes/private/environment",
754 "type": "path"
755 }
756 },
757 "environment_24": {
758 "locked": {
759 "lastModified": 1,
760 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
761 "path": "../environment",
762 "type": "path"
763 },
764 "original": {
765 "path": "../environment",
766 "type": "path"
767 }
768 },
769 "environment_25": {
770 "locked": {
771 "lastModified": 1,
772 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
773 "path": "../environment",
774 "type": "path"
775 },
776 "original": {
777 "path": "../environment",
778 "type": "path"
779 }
780 },
781 "environment_26": {
782 "locked": {
783 "lastModified": 1,
784 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
785 "path": "../environment",
786 "type": "path"
787 },
788 "original": {
789 "path": "../environment",
790 "type": "path"
791 }
792 },
793 "environment_27": {
794 "locked": {
795 "lastModified": 1,
796 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
797 "path": "../environment",
798 "type": "path"
799 },
800 "original": {
801 "path": "../environment",
802 "type": "path"
803 }
804 },
805 "environment_28": {
806 "locked": {
807 "lastModified": 1,
808 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
809 "path": "../environment",
810 "type": "path"
811 },
812 "original": {
813 "path": "../environment",
814 "type": "path"
815 }
816 },
817 "environment_29": {
818 "locked": {
819 "lastModified": 1,
820 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
821 "path": "../environment",
822 "type": "path"
823 },
824 "original": {
825 "path": "../environment",
826 "type": "path"
827 }
828 },
829 "environment_3": {
830 "locked": {
831 "lastModified": 1,
832 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
833 "path": "../environment",
834 "type": "path"
835 },
836 "original": {
837 "path": "../environment",
838 "type": "path"
839 }
840 },
841 "environment_30": {
842 "locked": {
843 "lastModified": 1,
844 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
845 "path": "../environment",
846 "type": "path"
847 },
848 "original": {
849 "path": "../environment",
850 "type": "path"
851 }
852 },
853 "environment_31": {
854 "locked": {
855 "lastModified": 1,
856 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
857 "path": "../environment",
858 "type": "path"
859 },
860 "original": {
861 "path": "../environment",
862 "type": "path"
863 }
864 },
865 "environment_32": {
866 "locked": {
867 "lastModified": 1,
868 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
869 "path": "../environment",
870 "type": "path"
871 },
872 "original": {
873 "path": "../environment",
874 "type": "path"
875 }
876 },
877 "environment_33": {
878 "locked": {
879 "lastModified": 1,
880 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
881 "path": "../environment",
882 "type": "path"
883 },
884 "original": {
885 "path": "../environment",
886 "type": "path"
887 }
888 },
889 "environment_4": {
890 "locked": {
891 "lastModified": 1,
892 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
893 "path": "../environment",
894 "type": "path"
895 },
896 "original": {
897 "path": "../environment",
898 "type": "path"
899 }
900 },
901 "environment_5": {
902 "locked": {
903 "lastModified": 1,
904 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
905 "path": "../environment",
906 "type": "path"
907 },
908 "original": {
909 "path": "../environment",
910 "type": "path"
911 }
912 },
913 "environment_6": {
914 "locked": {
915 "lastModified": 1,
916 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
917 "path": "../environment",
918 "type": "path"
919 },
920 "original": {
921 "path": "../environment",
922 "type": "path"
923 }
924 },
925 "environment_7": {
926 "locked": {
927 "lastModified": 1,
928 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
929 "path": "../environment",
930 "type": "path"
931 },
932 "original": {
933 "path": "../environment",
934 "type": "path"
935 }
936 },
937 "environment_8": {
938 "locked": {
939 "lastModified": 1,
940 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
941 "path": "../../flakes/private/environment",
942 "type": "path"
943 },
944 "original": {
945 "path": "../../flakes/private/environment",
946 "type": "path"
947 }
948 },
949 "environment_9": {
950 "locked": {
951 "lastModified": 1,
952 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
953 "path": "../environment",
954 "type": "path"
955 },
956 "original": {
957 "path": "../environment",
958 "type": "path"
959 }
960 },
961 "etherpad-lite": {
962 "flake": false,
963 "locked": {
964 "lastModified": 1587951095,
965 "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
966 "owner": "ether",
967 "repo": "etherpad-lite",
968 "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
969 "type": "github"
970 },
971 "original": {
972 "owner": "ether",
973 "ref": "1.8.3",
974 "repo": "etherpad-lite",
975 "type": "github"
976 }
977 },
978 "etherpad-lite_2": {
979 "flake": false,
980 "locked": {
981 "lastModified": 1587951095,
982 "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
983 "owner": "ether",
984 "repo": "etherpad-lite",
985 "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
986 "type": "github"
987 },
988 "original": {
989 "owner": "ether",
990 "ref": "1.8.3",
991 "repo": "etherpad-lite",
992 "type": "github"
993 }
994 },
995 "files-watcher": {
996 "locked": {
997 "lastModified": 1,
998 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
999 "path": "../../files-watcher",
1000 "type": "path"
1001 },
1002 "original": {
1003 "path": "../../files-watcher",
1004 "type": "path"
1005 }
1006 },
1007 "files-watcher_10": {
1008 "locked": {
1009 "lastModified": 1,
1010 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1011 "path": "../../flakes/files-watcher",
1012 "type": "path"
1013 },
1014 "original": {
1015 "path": "../../flakes/files-watcher",
1016 "type": "path"
1017 }
1018 },
1019 "files-watcher_11": {
1020 "locked": {
1021 "lastModified": 1,
1022 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1023 "path": "../files-watcher",
1024 "type": "path"
1025 },
1026 "original": {
1027 "path": "../files-watcher",
1028 "type": "path"
1029 }
1030 },
1031 "files-watcher_12": {
1032 "locked": {
1033 "lastModified": 1,
1034 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1035 "path": "../files-watcher",
1036 "type": "path"
1037 },
1038 "original": {
1039 "path": "../files-watcher",
1040 "type": "path"
1041 }
1042 },
1043 "files-watcher_13": {
1044 "locked": {
1045 "lastModified": 1,
1046 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1047 "path": "../../files-watcher",
1048 "type": "path"
1049 },
1050 "original": {
1051 "path": "../../files-watcher",
1052 "type": "path"
1053 }
1054 },
1055 "files-watcher_14": {
1056 "locked": {
1057 "lastModified": 1,
1058 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1059 "path": "../../files-watcher",
1060 "type": "path"
1061 },
1062 "original": {
1063 "path": "../../files-watcher",
1064 "type": "path"
1065 }
1066 },
1067 "files-watcher_15": {
1068 "locked": {
1069 "lastModified": 1,
1070 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1071 "path": "../../files-watcher",
1072 "type": "path"
1073 },
1074 "original": {
1075 "path": "../../files-watcher",
1076 "type": "path"
1077 }
1078 },
1079 "files-watcher_2": {
1080 "locked": {
1081 "lastModified": 1,
1082 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1083 "path": "../../files-watcher",
1084 "type": "path"
1085 },
1086 "original": {
1087 "path": "../../files-watcher",
1088 "type": "path"
1089 }
1090 },
1091 "files-watcher_3": {
1092 "locked": {
1093 "lastModified": 1,
1094 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1095 "path": "../../files-watcher",
1096 "type": "path"
1097 },
1098 "original": {
1099 "path": "../../files-watcher",
1100 "type": "path"
1101 }
1102 },
1103 "files-watcher_4": {
1104 "locked": {
1105 "lastModified": 1,
1106 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1107 "path": "../../flakes/files-watcher",
1108 "type": "path"
1109 },
1110 "original": {
1111 "path": "../../flakes/files-watcher",
1112 "type": "path"
1113 }
1114 },
1115 "files-watcher_5": {
1116 "locked": {
1117 "lastModified": 1,
1118 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1119 "path": "../../files-watcher",
1120 "type": "path"
1121 },
1122 "original": {
1123 "path": "../../files-watcher",
1124 "type": "path"
1125 }
1126 },
1127 "files-watcher_6": {
1128 "locked": {
1129 "lastModified": 1,
1130 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1131 "path": "../../files-watcher",
1132 "type": "path"
1133 },
1134 "original": {
1135 "path": "../../files-watcher",
1136 "type": "path"
1137 }
1138 },
1139 "files-watcher_7": {
1140 "locked": {
1141 "lastModified": 1,
1142 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1143 "path": "../../files-watcher",
1144 "type": "path"
1145 },
1146 "original": {
1147 "path": "../../files-watcher",
1148 "type": "path"
1149 }
1150 },
1151 "files-watcher_8": {
1152 "locked": {
1153 "lastModified": 1,
1154 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1155 "path": "../files-watcher",
1156 "type": "path"
1157 },
1158 "original": {
1159 "path": "../files-watcher",
1160 "type": "path"
1161 }
1162 },
1163 "files-watcher_9": {
1164 "locked": {
1165 "lastModified": 1,
1166 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1167 "path": "../../flakes/files-watcher",
1168 "type": "path"
1169 },
1170 "original": {
1171 "path": "../../flakes/files-watcher",
1172 "type": "path"
1173 }
1174 },
1175 "flake-compat": {
1176 "flake": false,
1177 "locked": {
1178 "lastModified": 1650374568,
1179 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1180 "owner": "edolstra",
1181 "repo": "flake-compat",
1182 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1183 "type": "github"
1184 },
1185 "original": {
1186 "owner": "edolstra",
1187 "repo": "flake-compat",
1188 "type": "github"
1189 }
1190 },
1191 "flake-compat_2": {
1192 "flake": false,
1193 "locked": {
1194 "lastModified": 1650374568,
1195 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1196 "owner": "edolstra",
1197 "repo": "flake-compat",
1198 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1199 "type": "github"
1200 },
1201 "original": {
1202 "owner": "edolstra",
1203 "repo": "flake-compat",
1204 "type": "github"
1205 }
1206 },
1207 "flake-compat_3": {
1208 "flake": false,
1209 "locked": {
1210 "lastModified": 1650374568,
1211 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1212 "owner": "edolstra",
1213 "repo": "flake-compat",
1214 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1215 "type": "github"
1216 },
1217 "original": {
1218 "owner": "edolstra",
1219 "repo": "flake-compat",
1220 "type": "github"
1221 }
1222 },
1223 "flake-compat_4": {
1224 "flake": false,
1225 "locked": {
1226 "lastModified": 1650374568,
1227 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1228 "owner": "edolstra",
1229 "repo": "flake-compat",
1230 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1231 "type": "github"
1232 },
1233 "original": {
1234 "owner": "edolstra",
1235 "repo": "flake-compat",
1236 "type": "github"
1237 }
1238 },
1239 "flake-compat_5": {
1240 "flake": false,
1241 "locked": {
1242 "lastModified": 1650374568,
1243 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1244 "owner": "edolstra",
1245 "repo": "flake-compat",
1246 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1247 "type": "github"
1248 },
1249 "original": {
1250 "owner": "edolstra",
1251 "repo": "flake-compat",
1252 "type": "github"
1253 }
1254 },
1255 "flake-compat_6": {
1256 "flake": false,
1257 "locked": {
1258 "lastModified": 1650374568,
1259 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1260 "owner": "edolstra",
1261 "repo": "flake-compat",
1262 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1263 "type": "github"
1264 },
1265 "original": {
1266 "owner": "edolstra",
1267 "repo": "flake-compat",
1268 "type": "github"
1269 }
1270 },
1271 "flake-compat_7": {
1272 "flake": false,
1273 "locked": {
1274 "lastModified": 1650374568,
1275 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1276 "owner": "edolstra",
1277 "repo": "flake-compat",
1278 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1279 "type": "github"
1280 },
1281 "original": {
1282 "owner": "edolstra",
1283 "repo": "flake-compat",
1284 "type": "github"
1285 }
1286 },
1287 "flake-parts": {
1288 "inputs": {
1289 "nixpkgs-lib": "nixpkgs-lib_2"
1290 },
1291 "locked": {
1292 "lastModified": 1687762428,
1293 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1294 "owner": "hercules-ci",
1295 "repo": "flake-parts",
1296 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1297 "type": "github"
1298 },
1299 "original": {
1300 "owner": "hercules-ci",
1301 "repo": "flake-parts",
1302 "type": "github"
1303 }
1304 },
1305 "flake-parts_10": {
1306 "inputs": {
1307 "nixpkgs-lib": "nixpkgs-lib_13"
1308 },
1309 "locked": {
1310 "lastModified": 1675295133,
1311 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1312 "owner": "hercules-ci",
1313 "repo": "flake-parts",
1314 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1315 "type": "github"
1316 },
1317 "original": {
1318 "owner": "hercules-ci",
1319 "repo": "flake-parts",
1320 "type": "github"
1321 }
1322 },
1323 "flake-parts_11": {
1324 "inputs": {
1325 "nixpkgs-lib": "nixpkgs-lib_15"
1326 },
1327 "locked": {
1328 "lastModified": 1687762428,
1329 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1330 "owner": "hercules-ci",
1331 "repo": "flake-parts",
1332 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1333 "type": "github"
1334 },
1335 "original": {
1336 "owner": "hercules-ci",
1337 "repo": "flake-parts",
1338 "type": "github"
1339 }
1340 },
1341 "flake-parts_12": {
1342 "inputs": {
1343 "nixpkgs-lib": "nixpkgs-lib_16"
1344 },
1345 "locked": {
1346 "lastModified": 1675295133,
1347 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1348 "owner": "hercules-ci",
1349 "repo": "flake-parts",
1350 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1351 "type": "github"
1352 },
1353 "original": {
1354 "owner": "hercules-ci",
1355 "repo": "flake-parts",
1356 "type": "github"
1357 }
1358 },
1359 "flake-parts_13": {
1360 "inputs": {
1361 "nixpkgs-lib": "nixpkgs-lib_18"
1362 },
1363 "locked": {
1364 "lastModified": 1687762428,
1365 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1366 "owner": "hercules-ci",
1367 "repo": "flake-parts",
1368 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1369 "type": "github"
1370 },
1371 "original": {
1372 "owner": "hercules-ci",
1373 "repo": "flake-parts",
1374 "type": "github"
1375 }
1376 },
1377 "flake-parts_14": {
1378 "inputs": {
1379 "nixpkgs-lib": "nixpkgs-lib_19"
1380 },
1381 "locked": {
1382 "lastModified": 1675295133,
1383 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1384 "owner": "hercules-ci",
1385 "repo": "flake-parts",
1386 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1387 "type": "github"
1388 },
1389 "original": {
1390 "owner": "hercules-ci",
1391 "repo": "flake-parts",
1392 "type": "github"
1393 }
1394 },
1395 "flake-parts_15": {
1396 "inputs": {
1397 "nixpkgs-lib": "nixpkgs-lib_20"
1398 },
1399 "locked": {
1400 "lastModified": 1687762428,
1401 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1402 "owner": "hercules-ci",
1403 "repo": "flake-parts",
1404 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1405 "type": "github"
1406 },
1407 "original": {
1408 "owner": "hercules-ci",
1409 "repo": "flake-parts",
1410 "type": "github"
1411 }
1412 },
1413 "flake-parts_16": {
1414 "inputs": {
1415 "nixpkgs-lib": "nixpkgs-lib_21"
1416 },
1417 "locked": {
1418 "lastModified": 1675295133,
1419 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1420 "owner": "hercules-ci",
1421 "repo": "flake-parts",
1422 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1423 "type": "github"
1424 },
1425 "original": {
1426 "owner": "hercules-ci",
1427 "repo": "flake-parts",
1428 "type": "github"
1429 }
1430 },
1431 "flake-parts_17": {
1432 "inputs": {
1433 "nixpkgs-lib": "nixpkgs-lib_22"
1434 },
1435 "locked": {
1436 "lastModified": 1675295133,
1437 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1438 "owner": "hercules-ci",
1439 "repo": "flake-parts",
1440 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1441 "type": "github"
1442 },
1443 "original": {
1444 "owner": "hercules-ci",
1445 "repo": "flake-parts",
1446 "type": "github"
1447 }
1448 },
1449 "flake-parts_18": {
1450 "inputs": {
1451 "nixpkgs-lib": "nixpkgs-lib_23"
1452 },
1453 "locked": {
1454 "lastModified": 1675295133,
1455 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1456 "owner": "hercules-ci",
1457 "repo": "flake-parts",
1458 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1459 "type": "github"
1460 },
1461 "original": {
1462 "owner": "hercules-ci",
1463 "repo": "flake-parts",
1464 "type": "github"
1465 }
1466 },
1467 "flake-parts_19": {
1468 "inputs": {
1469 "nixpkgs-lib": "nixpkgs-lib_24"
1470 },
1471 "locked": {
1472 "lastModified": 1687762428,
1473 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1474 "owner": "hercules-ci",
1475 "repo": "flake-parts",
1476 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1477 "type": "github"
1478 },
1479 "original": {
1480 "owner": "hercules-ci",
1481 "repo": "flake-parts",
1482 "type": "github"
1483 }
1484 },
1485 "flake-parts_2": {
1486 "inputs": {
1487 "nixpkgs-lib": "nixpkgs-lib_3"
1488 },
1489 "locked": {
1490 "lastModified": 1675295133,
1491 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1492 "owner": "hercules-ci",
1493 "repo": "flake-parts",
1494 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1495 "type": "github"
1496 },
1497 "original": {
1498 "owner": "hercules-ci",
1499 "repo": "flake-parts",
1500 "type": "github"
1501 }
1502 },
1503 "flake-parts_20": {
1504 "inputs": {
1505 "nixpkgs-lib": "nixpkgs-lib_25"
1506 },
1507 "locked": {
1508 "lastModified": 1675295133,
1509 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1510 "owner": "hercules-ci",
1511 "repo": "flake-parts",
1512 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1513 "type": "github"
1514 },
1515 "original": {
1516 "owner": "hercules-ci",
1517 "repo": "flake-parts",
1518 "type": "github"
1519 }
1520 },
1521 "flake-parts_21": {
1522 "inputs": {
1523 "nixpkgs-lib": "nixpkgs-lib_27"
1524 },
1525 "locked": {
1526 "lastModified": 1675295133,
1527 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1528 "owner": "hercules-ci",
1529 "repo": "flake-parts",
1530 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1531 "type": "github"
1532 },
1533 "original": {
1534 "owner": "hercules-ci",
1535 "repo": "flake-parts",
1536 "type": "github"
1537 }
1538 },
1539 "flake-parts_22": {
1540 "inputs": {
1541 "nixpkgs-lib": "nixpkgs-lib_28"
1542 },
1543 "locked": {
1544 "lastModified": 1675295133,
1545 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1546 "owner": "hercules-ci",
1547 "repo": "flake-parts",
1548 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1549 "type": "github"
1550 },
1551 "original": {
1552 "owner": "hercules-ci",
1553 "repo": "flake-parts",
1554 "type": "github"
1555 }
1556 },
1557 "flake-parts_3": {
1558 "inputs": {
1559 "nixpkgs-lib": "nixpkgs-lib_5"
1560 },
1561 "locked": {
1562 "lastModified": 1687762428,
1563 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1564 "owner": "hercules-ci",
1565 "repo": "flake-parts",
1566 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1567 "type": "github"
1568 },
1569 "original": {
1570 "owner": "hercules-ci",
1571 "repo": "flake-parts",
1572 "type": "github"
1573 }
1574 },
1575 "flake-parts_4": {
1576 "inputs": {
1577 "nixpkgs-lib": "nixpkgs-lib_6"
1578 },
1579 "locked": {
1580 "lastModified": 1675295133,
1581 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1582 "owner": "hercules-ci",
1583 "repo": "flake-parts",
1584 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1585 "type": "github"
1586 },
1587 "original": {
1588 "owner": "hercules-ci",
1589 "repo": "flake-parts",
1590 "type": "github"
1591 }
1592 },
1593 "flake-parts_5": {
1594 "inputs": {
1595 "nixpkgs-lib": "nixpkgs-lib_7"
1596 },
1597 "locked": {
1598 "lastModified": 1687762428,
1599 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1600 "owner": "hercules-ci",
1601 "repo": "flake-parts",
1602 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1603 "type": "github"
1604 },
1605 "original": {
1606 "owner": "hercules-ci",
1607 "repo": "flake-parts",
1608 "type": "github"
1609 }
1610 },
1611 "flake-parts_6": {
1612 "inputs": {
1613 "nixpkgs-lib": "nixpkgs-lib_9"
1614 },
1615 "locked": {
1616 "lastModified": 1675295133,
1617 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1618 "owner": "hercules-ci",
1619 "repo": "flake-parts",
1620 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1621 "type": "github"
1622 },
1623 "original": {
1624 "owner": "hercules-ci",
1625 "repo": "flake-parts",
1626 "type": "github"
1627 }
1628 },
1629 "flake-parts_7": {
1630 "inputs": {
1631 "nixpkgs-lib": "nixpkgs-lib_10"
1632 },
1633 "locked": {
1634 "lastModified": 1675295133,
1635 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1636 "owner": "hercules-ci",
1637 "repo": "flake-parts",
1638 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1639 "type": "github"
1640 },
1641 "original": {
1642 "owner": "hercules-ci",
1643 "repo": "flake-parts",
1644 "type": "github"
1645 }
1646 },
1647 "flake-parts_8": {
1648 "inputs": {
1649 "nixpkgs-lib": "nixpkgs-lib_11"
1650 },
1651 "locked": {
1652 "lastModified": 1675295133,
1653 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1654 "owner": "hercules-ci",
1655 "repo": "flake-parts",
1656 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1657 "type": "github"
1658 },
1659 "original": {
1660 "owner": "hercules-ci",
1661 "repo": "flake-parts",
1662 "type": "github"
1663 }
1664 },
1665 "flake-parts_9": {
1666 "inputs": {
1667 "nixpkgs-lib": "nixpkgs-lib_12"
1668 },
1669 "locked": {
1670 "lastModified": 1675295133,
1671 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1672 "owner": "hercules-ci",
1673 "repo": "flake-parts",
1674 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1675 "type": "github"
1676 },
1677 "original": {
1678 "owner": "hercules-ci",
1679 "repo": "flake-parts",
1680 "type": "github"
1681 }
1682 },
1683 "flake-utils": {
1684 "locked": {
1685 "lastModified": 1609246779,
1686 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1687 "owner": "numtide",
1688 "repo": "flake-utils",
1689 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1690 "type": "github"
1691 },
1692 "original": {
1693 "owner": "numtide",
1694 "repo": "flake-utils",
1695 "type": "github"
1696 }
1697 },
1698 "flake-utils_10": {
1699 "locked": {
1700 "lastModified": 1659877975,
1701 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
1702 "owner": "numtide",
1703 "repo": "flake-utils",
1704 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
1705 "type": "github"
1706 },
1707 "original": {
1708 "owner": "numtide",
1709 "repo": "flake-utils",
1710 "type": "github"
1711 }
1712 },
1713 "flake-utils_11": {
1714 "locked": {
1715 "lastModified": 1648297722,
1716 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1717 "owner": "numtide",
1718 "repo": "flake-utils",
1719 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1720 "type": "github"
1721 },
1722 "original": {
1723 "owner": "numtide",
1724 "repo": "flake-utils",
1725 "type": "github"
1726 }
1727 },
1728 "flake-utils_12": {
1729 "locked": {
1730 "lastModified": 1609246779,
1731 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1732 "owner": "numtide",
1733 "repo": "flake-utils",
1734 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1735 "type": "github"
1736 },
1737 "original": {
1738 "owner": "numtide",
1739 "repo": "flake-utils",
1740 "type": "github"
1741 }
1742 },
1743 "flake-utils_13": {
1744 "locked": {
1745 "lastModified": 1609246779,
1746 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1747 "owner": "numtide",
1748 "repo": "flake-utils",
1749 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1750 "type": "github"
1751 },
1752 "original": {
1753 "owner": "numtide",
1754 "repo": "flake-utils",
1755 "type": "github"
1756 }
1757 },
1758 "flake-utils_14": {
1759 "locked": {
1760 "lastModified": 1609246779,
1761 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1762 "owner": "numtide",
1763 "repo": "flake-utils",
1764 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1765 "type": "github"
1766 },
1767 "original": {
1768 "owner": "numtide",
1769 "repo": "flake-utils",
1770 "type": "github"
1771 }
1772 },
1773 "flake-utils_15": {
1774 "locked": {
1775 "lastModified": 1609246779,
1776 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1777 "owner": "numtide",
1778 "repo": "flake-utils",
1779 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1780 "type": "github"
1781 },
1782 "original": {
1783 "owner": "numtide",
1784 "repo": "flake-utils",
1785 "type": "github"
1786 }
1787 },
1788 "flake-utils_16": {
1789 "locked": {
1790 "lastModified": 1631561581,
1791 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
1792 "owner": "numtide",
1793 "repo": "flake-utils",
1794 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
1795 "type": "github"
1796 },
1797 "original": {
1798 "owner": "numtide",
1799 "repo": "flake-utils",
1800 "type": "github"
1801 }
1802 },
1803 "flake-utils_17": {
1804 "locked": {
1805 "lastModified": 1610051610,
1806 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
1807 "owner": "numtide",
1808 "repo": "flake-utils",
1809 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
1810 "type": "github"
1811 },
1812 "original": {
1813 "owner": "numtide",
1814 "repo": "flake-utils",
1815 "type": "github"
1816 }
1817 },
1818 "flake-utils_18": {
1819 "locked": {
1820 "lastModified": 1610051610,
1821 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
1822 "owner": "numtide",
1823 "repo": "flake-utils",
1824 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
1825 "type": "github"
1826 },
1827 "original": {
1828 "owner": "numtide",
1829 "repo": "flake-utils",
1830 "type": "github"
1831 }
1832 },
1833 "flake-utils_19": {
1834 "locked": {
1835 "lastModified": 1648297722,
1836 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1837 "owner": "numtide",
1838 "repo": "flake-utils",
1839 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1840 "type": "github"
1841 },
1842 "original": {
1843 "owner": "numtide",
1844 "repo": "flake-utils",
1845 "type": "github"
1846 }
1847 },
1848 "flake-utils_2": {
1849 "locked": {
1850 "lastModified": 1609246779,
1851 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1852 "owner": "numtide",
1853 "repo": "flake-utils",
1854 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1855 "type": "github"
1856 },
1857 "original": {
1858 "owner": "numtide",
1859 "repo": "flake-utils",
1860 "type": "github"
1861 }
1862 },
1863 "flake-utils_20": {
1864 "locked": {
1865 "lastModified": 1667395993,
1866 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
1867 "owner": "numtide",
1868 "repo": "flake-utils",
1869 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
1870 "type": "github"
1871 },
1872 "original": {
1873 "owner": "numtide",
1874 "repo": "flake-utils",
1875 "type": "github"
1876 }
1877 },
1878 "flake-utils_21": {
1879 "locked": {
1880 "lastModified": 1631561581,
1881 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
1882 "owner": "numtide",
1883 "repo": "flake-utils",
1884 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
1885 "type": "github"
1886 },
1887 "original": {
1888 "owner": "numtide",
1889 "repo": "flake-utils",
1890 "type": "github"
1891 }
1892 },
1893 "flake-utils_22": {
1894 "locked": {
1895 "lastModified": 1648297722,
1896 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1897 "owner": "numtide",
1898 "repo": "flake-utils",
1899 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1900 "type": "github"
1901 },
1902 "original": {
1903 "owner": "numtide",
1904 "repo": "flake-utils",
1905 "type": "github"
1906 }
1907 },
1908 "flake-utils_23": {
1909 "locked": {
1910 "lastModified": 1648297722,
1911 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1912 "owner": "numtide",
1913 "repo": "flake-utils",
1914 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1915 "type": "github"
1916 },
1917 "original": {
1918 "owner": "numtide",
1919 "repo": "flake-utils",
1920 "type": "github"
1921 }
1922 },
1923 "flake-utils_24": {
1924 "locked": {
1925 "lastModified": 1648297722,
1926 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1927 "owner": "numtide",
1928 "repo": "flake-utils",
1929 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1930 "type": "github"
1931 },
1932 "original": {
1933 "owner": "numtide",
1934 "repo": "flake-utils",
1935 "type": "github"
1936 }
1937 },
1938 "flake-utils_25": {
1939 "locked": {
1940 "lastModified": 1648297722,
1941 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1942 "owner": "numtide",
1943 "repo": "flake-utils",
1944 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1945 "type": "github"
1946 },
1947 "original": {
1948 "owner": "numtide",
1949 "repo": "flake-utils",
1950 "type": "github"
1951 }
1952 },
1953 "flake-utils_26": {
1954 "locked": {
1955 "lastModified": 1649676176,
1956 "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
1957 "owner": "numtide",
1958 "repo": "flake-utils",
1959 "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
1960 "type": "github"
1961 },
1962 "original": {
1963 "owner": "numtide",
1964 "repo": "flake-utils",
1965 "type": "github"
1966 }
1967 },
1968 "flake-utils_27": {
1969 "locked": {
1970 "lastModified": 1609246779,
1971 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1972 "owner": "numtide",
1973 "repo": "flake-utils",
1974 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1975 "type": "github"
1976 },
1977 "original": {
1978 "owner": "numtide",
1979 "repo": "flake-utils",
1980 "type": "github"
1981 }
1982 },
1983 "flake-utils_28": {
1984 "locked": {
1985 "lastModified": 1609246779,
1986 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1987 "owner": "numtide",
1988 "repo": "flake-utils",
1989 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1990 "type": "github"
1991 },
1992 "original": {
1993 "owner": "numtide",
1994 "repo": "flake-utils",
1995 "type": "github"
1996 }
1997 },
1998 "flake-utils_29": {
1999 "locked": {
2000 "lastModified": 1610051610,
2001 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
2002 "owner": "numtide",
2003 "repo": "flake-utils",
2004 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
2005 "type": "github"
2006 },
2007 "original": {
2008 "owner": "numtide",
2009 "repo": "flake-utils",
2010 "type": "github"
2011 }
2012 },
2013 "flake-utils_3": {
2014 "locked": {
2015 "lastModified": 1659877975,
2016 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2017 "owner": "numtide",
2018 "repo": "flake-utils",
2019 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2020 "type": "github"
2021 },
2022 "original": {
2023 "owner": "numtide",
2024 "repo": "flake-utils",
2025 "type": "github"
2026 }
2027 },
2028 "flake-utils_30": {
2029 "locked": {
2030 "lastModified": 1648297722,
2031 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2032 "owner": "numtide",
2033 "repo": "flake-utils",
2034 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2035 "type": "github"
2036 },
2037 "original": {
2038 "owner": "numtide",
2039 "repo": "flake-utils",
2040 "type": "github"
2041 }
2042 },
2043 "flake-utils_31": {
2044 "locked": {
2045 "lastModified": 1648297722,
2046 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2047 "owner": "numtide",
2048 "repo": "flake-utils",
2049 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2050 "type": "github"
2051 },
2052 "original": {
2053 "owner": "numtide",
2054 "repo": "flake-utils",
2055 "type": "github"
2056 }
2057 },
2058 "flake-utils_32": {
2059 "locked": {
2060 "lastModified": 1659877975,
2061 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2062 "owner": "numtide",
2063 "repo": "flake-utils",
2064 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2065 "type": "github"
2066 },
2067 "original": {
2068 "owner": "numtide",
2069 "repo": "flake-utils",
2070 "type": "github"
2071 }
2072 },
2073 "flake-utils_33": {
2074 "locked": {
2075 "lastModified": 1648297722,
2076 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2077 "owner": "numtide",
2078 "repo": "flake-utils",
2079 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2080 "type": "github"
2081 },
2082 "original": {
2083 "owner": "numtide",
2084 "repo": "flake-utils",
2085 "type": "github"
2086 }
2087 },
2088 "flake-utils_34": {
2089 "locked": {
2090 "lastModified": 1667395993,
2091 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2092 "owner": "numtide",
2093 "repo": "flake-utils",
2094 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2095 "type": "github"
2096 },
2097 "original": {
2098 "owner": "numtide",
2099 "repo": "flake-utils",
2100 "type": "github"
2101 }
2102 },
2103 "flake-utils_35": {
2104 "locked": {
2105 "lastModified": 1659877975,
2106 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2107 "owner": "numtide",
2108 "repo": "flake-utils",
2109 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2110 "type": "github"
2111 },
2112 "original": {
2113 "owner": "numtide",
2114 "repo": "flake-utils",
2115 "type": "github"
2116 }
2117 },
2118 "flake-utils_36": {
2119 "locked": {
2120 "lastModified": 1648297722,
2121 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2122 "owner": "numtide",
2123 "repo": "flake-utils",
2124 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2125 "type": "github"
2126 },
2127 "original": {
2128 "owner": "numtide",
2129 "repo": "flake-utils",
2130 "type": "github"
2131 }
2132 },
2133 "flake-utils_37": {
2134 "locked": {
2135 "lastModified": 1667395993,
2136 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2137 "owner": "numtide",
2138 "repo": "flake-utils",
2139 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2140 "type": "github"
2141 },
2142 "original": {
2143 "owner": "numtide",
2144 "repo": "flake-utils",
2145 "type": "github"
2146 }
2147 },
2148 "flake-utils_38": {
2149 "locked": {
2150 "lastModified": 1659877975,
2151 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2152 "owner": "numtide",
2153 "repo": "flake-utils",
2154 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2155 "type": "github"
2156 },
2157 "original": {
2158 "owner": "numtide",
2159 "repo": "flake-utils",
2160 "type": "github"
2161 }
2162 },
2163 "flake-utils_39": {
2164 "locked": {
2165 "lastModified": 1667395993,
2166 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2167 "owner": "numtide",
2168 "repo": "flake-utils",
2169 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2170 "type": "github"
2171 },
2172 "original": {
2173 "owner": "numtide",
2174 "repo": "flake-utils",
2175 "type": "github"
2176 }
2177 },
2178 "flake-utils_4": {
2179 "locked": {
2180 "lastModified": 1609246779,
2181 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2182 "owner": "numtide",
2183 "repo": "flake-utils",
2184 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2185 "type": "github"
2186 },
2187 "original": {
2188 "owner": "numtide",
2189 "repo": "flake-utils",
2190 "type": "github"
2191 }
2192 },
2193 "flake-utils_40": {
2194 "locked": {
2195 "lastModified": 1667395993,
2196 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2197 "owner": "numtide",
2198 "repo": "flake-utils",
2199 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2200 "type": "github"
2201 },
2202 "original": {
2203 "owner": "numtide",
2204 "repo": "flake-utils",
2205 "type": "github"
2206 }
2207 },
2208 "flake-utils_41": {
2209 "locked": {
2210 "lastModified": 1631561581,
2211 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
2212 "owner": "numtide",
2213 "repo": "flake-utils",
2214 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
2215 "type": "github"
2216 },
2217 "original": {
2218 "owner": "numtide",
2219 "repo": "flake-utils",
2220 "type": "github"
2221 }
2222 },
2223 "flake-utils_42": {
2224 "locked": {
2225 "lastModified": 1648297722,
2226 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2227 "owner": "numtide",
2228 "repo": "flake-utils",
2229 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2230 "type": "github"
2231 },
2232 "original": {
2233 "owner": "numtide",
2234 "repo": "flake-utils",
2235 "type": "github"
2236 }
2237 },
2238 "flake-utils_43": {
2239 "locked": {
2240 "lastModified": 1648297722,
2241 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2242 "owner": "numtide",
2243 "repo": "flake-utils",
2244 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2245 "type": "github"
2246 },
2247 "original": {
2248 "owner": "numtide",
2249 "repo": "flake-utils",
2250 "type": "github"
2251 }
2252 },
2253 "flake-utils_44": {
2254 "locked": {
2255 "lastModified": 1648297722,
2256 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2257 "owner": "numtide",
2258 "repo": "flake-utils",
2259 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2260 "type": "github"
2261 },
2262 "original": {
2263 "owner": "numtide",
2264 "repo": "flake-utils",
2265 "type": "github"
2266 }
2267 },
2268 "flake-utils_45": {
2269 "locked": {
2270 "lastModified": 1659877975,
2271 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2272 "owner": "numtide",
2273 "repo": "flake-utils",
2274 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2275 "type": "github"
2276 },
2277 "original": {
2278 "owner": "numtide",
2279 "repo": "flake-utils",
2280 "type": "github"
2281 }
2282 },
2283 "flake-utils_46": {
2284 "locked": {
2285 "lastModified": 1648297722,
2286 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2287 "owner": "numtide",
2288 "repo": "flake-utils",
2289 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2290 "type": "github"
2291 },
2292 "original": {
2293 "owner": "numtide",
2294 "repo": "flake-utils",
2295 "type": "github"
2296 }
2297 },
2298 "flake-utils_47": {
2299 "locked": {
2300 "lastModified": 1649676176,
2301 "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
2302 "owner": "numtide",
2303 "repo": "flake-utils",
2304 "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
2305 "type": "github"
2306 },
2307 "original": {
2308 "owner": "numtide",
2309 "repo": "flake-utils",
2310 "type": "github"
2311 }
2312 },
2313 "flake-utils_48": {
2314 "locked": {
2315 "lastModified": 1609246779,
2316 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2317 "owner": "numtide",
2318 "repo": "flake-utils",
2319 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2320 "type": "github"
2321 },
2322 "original": {
2323 "owner": "numtide",
2324 "repo": "flake-utils",
2325 "type": "github"
2326 }
2327 },
2328 "flake-utils_49": {
2329 "locked": {
2330 "lastModified": 1609246779,
2331 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2332 "owner": "numtide",
2333 "repo": "flake-utils",
2334 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2335 "type": "github"
2336 },
2337 "original": {
2338 "owner": "numtide",
2339 "repo": "flake-utils",
2340 "type": "github"
2341 }
2342 },
2343 "flake-utils_5": {
2344 "locked": {
2345 "lastModified": 1609246779,
2346 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2347 "owner": "numtide",
2348 "repo": "flake-utils",
2349 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2350 "type": "github"
2351 },
2352 "original": {
2353 "owner": "numtide",
2354 "repo": "flake-utils",
2355 "type": "github"
2356 }
2357 },
2358 "flake-utils_50": {
2359 "locked": {
2360 "lastModified": 1631561581,
2361 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
2362 "owner": "numtide",
2363 "repo": "flake-utils",
2364 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
2365 "type": "github"
2366 },
2367 "original": {
2368 "owner": "numtide",
2369 "repo": "flake-utils",
2370 "type": "github"
2371 }
2372 },
2373 "flake-utils_51": {
2374 "locked": {
2375 "lastModified": 1610051610,
2376 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
2377 "owner": "numtide",
2378 "repo": "flake-utils",
2379 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
2380 "type": "github"
2381 },
2382 "original": {
2383 "owner": "numtide",
2384 "repo": "flake-utils",
2385 "type": "github"
2386 }
2387 },
2388 "flake-utils_52": {
2389 "locked": {
2390 "lastModified": 1648297722,
2391 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2392 "owner": "numtide",
2393 "repo": "flake-utils",
2394 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2395 "type": "github"
2396 },
2397 "original": {
2398 "owner": "numtide",
2399 "repo": "flake-utils",
2400 "type": "github"
2401 }
2402 },
2403 "flake-utils_53": {
2404 "locked": {
2405 "lastModified": 1609246779,
2406 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2407 "owner": "numtide",
2408 "repo": "flake-utils",
2409 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2410 "type": "github"
2411 },
2412 "original": {
2413 "owner": "numtide",
2414 "repo": "flake-utils",
2415 "type": "github"
2416 }
2417 },
2418 "flake-utils_54": {
2419 "locked": {
2420 "lastModified": 1609246779,
2421 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2422 "owner": "numtide",
2423 "repo": "flake-utils",
2424 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2425 "type": "github"
2426 },
2427 "original": {
2428 "owner": "numtide",
2429 "repo": "flake-utils",
2430 "type": "github"
2431 }
2432 },
2433 "flake-utils_55": {
2434 "locked": {
2435 "lastModified": 1609246779,
2436 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2437 "owner": "numtide",
2438 "repo": "flake-utils",
2439 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2440 "type": "github"
2441 },
2442 "original": {
2443 "owner": "numtide",
2444 "repo": "flake-utils",
2445 "type": "github"
2446 }
2447 },
2448 "flake-utils_56": {
2449 "locked": {
2450 "lastModified": 1609246779,
2451 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2452 "owner": "numtide",
2453 "repo": "flake-utils",
2454 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2455 "type": "github"
2456 },
2457 "original": {
2458 "owner": "numtide",
2459 "repo": "flake-utils",
2460 "type": "github"
2461 }
2462 },
2463 "flake-utils_57": {
2464 "locked": {
2465 "lastModified": 1631561581,
2466 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
2467 "owner": "numtide",
2468 "repo": "flake-utils",
2469 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
2470 "type": "github"
2471 },
2472 "original": {
2473 "owner": "numtide",
2474 "repo": "flake-utils",
2475 "type": "github"
2476 }
2477 },
2478 "flake-utils_58": {
2479 "locked": {
2480 "lastModified": 1610051610,
2481 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
2482 "owner": "numtide",
2483 "repo": "flake-utils",
2484 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
2485 "type": "github"
2486 },
2487 "original": {
2488 "owner": "numtide",
2489 "repo": "flake-utils",
2490 "type": "github"
2491 }
2492 },
2493 "flake-utils_59": {
2494 "locked": {
2495 "lastModified": 1610051610,
2496 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
2497 "owner": "numtide",
2498 "repo": "flake-utils",
2499 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
2500 "type": "github"
2501 },
2502 "original": {
2503 "owner": "numtide",
2504 "repo": "flake-utils",
2505 "type": "github"
2506 }
2507 },
2508 "flake-utils_6": {
2509 "locked": {
2510 "lastModified": 1667395993,
2511 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2512 "owner": "numtide",
2513 "repo": "flake-utils",
2514 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2515 "type": "github"
2516 },
2517 "original": {
2518 "owner": "numtide",
2519 "repo": "flake-utils",
2520 "type": "github"
2521 }
2522 },
2523 "flake-utils_60": {
2524 "locked": {
2525 "lastModified": 1648297722,
2526 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2527 "owner": "numtide",
2528 "repo": "flake-utils",
2529 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2530 "type": "github"
2531 },
2532 "original": {
2533 "owner": "numtide",
2534 "repo": "flake-utils",
2535 "type": "github"
2536 }
2537 },
2538 "flake-utils_61": {
2539 "locked": {
2540 "lastModified": 1667395993,
2541 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2542 "owner": "numtide",
2543 "repo": "flake-utils",
2544 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2545 "type": "github"
2546 },
2547 "original": {
2548 "owner": "numtide",
2549 "repo": "flake-utils",
2550 "type": "github"
2551 }
2552 },
2553 "flake-utils_62": {
2554 "locked": {
2555 "lastModified": 1648297722,
2556 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2557 "owner": "numtide",
2558 "repo": "flake-utils",
2559 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2560 "type": "github"
2561 },
2562 "original": {
2563 "owner": "numtide",
2564 "repo": "flake-utils",
2565 "type": "github"
2566 }
2567 },
2568 "flake-utils_63": {
2569 "locked": {
2570 "lastModified": 1648297722,
2571 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2572 "owner": "numtide",
2573 "repo": "flake-utils",
2574 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2575 "type": "github"
2576 },
2577 "original": {
2578 "owner": "numtide",
2579 "repo": "flake-utils",
2580 "type": "github"
2581 }
2582 },
2583 "flake-utils_7": {
2584 "locked": {
2585 "lastModified": 1659877975,
2586 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2587 "owner": "numtide",
2588 "repo": "flake-utils",
2589 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2590 "type": "github"
2591 },
2592 "original": {
2593 "owner": "numtide",
2594 "repo": "flake-utils",
2595 "type": "github"
2596 }
2597 },
2598 "flake-utils_8": {
2599 "locked": {
2600 "lastModified": 1667395993,
2601 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2602 "owner": "numtide",
2603 "repo": "flake-utils",
2604 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2605 "type": "github"
2606 },
2607 "original": {
2608 "owner": "numtide",
2609 "repo": "flake-utils",
2610 "type": "github"
2611 }
2612 },
2613 "flake-utils_9": {
2614 "locked": {
2615 "lastModified": 1614513358,
2616 "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=",
2617 "owner": "numtide",
2618 "repo": "flake-utils",
2619 "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3",
2620 "type": "github"
2621 },
2622 "original": {
2623 "owner": "numtide",
2624 "repo": "flake-utils",
2625 "type": "github"
2626 }
2627 },
2628 "grocy": {
2629 "flake": false,
2630 "locked": {
2631 "lastModified": 1585166193,
2632 "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
2633 "owner": "grocy",
2634 "repo": "grocy",
2635 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2636 "type": "github"
2637 },
2638 "original": {
2639 "owner": "grocy",
2640 "repo": "grocy",
2641 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2642 "type": "github"
2643 }
2644 },
2645 "grocy_2": {
2646 "flake": false,
2647 "locked": {
2648 "lastModified": 1585166193,
2649 "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
2650 "owner": "grocy",
2651 "repo": "grocy",
2652 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2653 "type": "github"
2654 },
2655 "original": {
2656 "owner": "grocy",
2657 "repo": "grocy",
2658 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2659 "type": "github"
2660 }
2661 },
2662 "impermanence": {
2663 "locked": {
2664 "lastModified": 1684264534,
2665 "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=",
2666 "owner": "nix-community",
2667 "repo": "impermanence",
2668 "rev": "89253fb1518063556edd5e54509c30ac3089d5e6",
2669 "type": "github"
2670 },
2671 "original": {
2672 "owner": "nix-community",
2673 "ref": "master",
2674 "repo": "impermanence",
2675 "type": "github"
2676 }
2677 },
2678 "landing-page": {
2679 "flake": false,
2680 "locked": {
2681 "lastModified": 1691524124,
2682 "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=",
2683 "ref": "main",
2684 "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf",
2685 "revCount": 573,
2686 "type": "git",
2687 "url": "https://github.com/bastienwirtz/homer.git"
2688 },
2689 "original": {
2690 "ref": "main",
2691 "type": "git",
2692 "url": "https://github.com/bastienwirtz/homer.git"
2693 }
2694 },
2695 "loginctl-linger": {
2696 "locked": {
2697 "lastModified": 1,
2698 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
2699 "path": "../../flakes/loginctl-linger",
2700 "type": "path"
2701 },
2702 "original": {
2703 "path": "../../flakes/loginctl-linger",
2704 "type": "path"
2705 }
2706 },
2707 "loginctl-linger_2": {
2708 "locked": {
2709 "lastModified": 1,
2710 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
2711 "path": "../../flakes/loginctl-linger",
2712 "type": "path"
2713 },
2714 "original": {
2715 "path": "../../flakes/loginctl-linger",
2716 "type": "path"
2717 }
2718 },
2719 "loginctl-linger_3": {
2720 "locked": {
2721 "lastModified": 1,
2722 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
2723 "path": "../../flakes/loginctl-linger",
2724 "type": "path"
2725 },
2726 "original": {
2727 "path": "../../flakes/loginctl-linger",
2728 "type": "path"
2729 }
2730 },
2731 "mail-relay": {
2732 "inputs": {
2733 "environment": "environment_3",
2734 "secrets": "secrets"
2735 },
2736 "locked": {
2737 "lastModified": 1,
2738 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
2739 "path": "../../flakes/private/mail-relay",
2740 "type": "path"
2741 },
2742 "original": {
2743 "path": "../../flakes/private/mail-relay",
2744 "type": "path"
2745 }
2746 },
2747 "mail-relay_2": {
2748 "inputs": {
2749 "environment": "environment_20",
2750 "secrets": "secrets_15"
2751 },
2752 "locked": {
2753 "lastModified": 1,
2754 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
2755 "path": "../../flakes/private/mail-relay",
2756 "type": "path"
2757 },
2758 "original": {
2759 "path": "../../flakes/private/mail-relay",
2760 "type": "path"
2761 }
2762 },
2763 "main-flake": {
2764 "inputs": {
2765 "n-backup-2": "n-backup-2",
2766 "n-dilion": "n-dilion",
2767 "n-eldiron": "n-eldiron",
2768 "n-monitoring-1": "n-monitoring-1",
2769 "n-quatresaisons": "n-quatresaisons",
2770 "n-zoldene": "n-zoldene",
2771 "s-backports": "s-backports",
2772 "s-copanier": "s-copanier",
2773 "s-diaspora": "s-diaspora",
2774 "s-etherpad-lite": "s-etherpad-lite",
2775 "s-fiche": "s-fiche",
2776 "s-files-watcher": "s-files-watcher",
2777 "s-grocy": "s-grocy",
2778 "s-lib": "s-lib",
2779 "s-loginctl-linger": "s-loginctl-linger",
2780 "s-mastodon": "s-mastodon",
2781 "s-mediagoblin": "s-mediagoblin",
2782 "s-multi-apache-container": "s-multi-apache-container",
2783 "s-mypackages": "s-mypackages",
2784 "s-myuids": "s-myuids",
2785 "s-naemon": "s-naemon",
2786 "s-openarc": "s-openarc",
2787 "s-opendmarc": "s-opendmarc",
2788 "s-paste": "s-paste",
2789 "s-peertube": "s-peertube",
2790 "s-private-buildbot": "s-private-buildbot",
2791 "s-private-chatons": "s-private-chatons",
2792 "s-private-environment": "s-private-environment",
2793 "s-private-mail-relay": "s-private-mail-relay",
2794 "s-private-milters": "s-private-milters",
2795 "s-private-monitoring": "s-private-monitoring",
2796 "s-private-openarc": "s-private-openarc",
2797 "s-private-opendmarc": "s-private-opendmarc",
2798 "s-private-openldap": "s-private-openldap",
2799 "s-private-paste": "s-private-paste",
2800 "s-private-peertube": "s-private-peertube",
2801 "s-private-php": "s-private-php",
2802 "s-private-ssh": "s-private-ssh",
2803 "s-private-system": "s-private-system",
2804 "s-rsync_backup": "s-rsync_backup",
2805 "s-secrets": "s-secrets",
2806 "s-surfer": "s-surfer",
2807 "s-taskwarrior-web": "s-taskwarrior-web",
2808 "secrets": [
2809 "secrets"
2810 ]
2811 },
2812 "locked": {
2813 "lastModified": 1,
2814 "narHash": "sha256-LBw8FCxHXW6b1WFvsEnmLmNpZjow6+N4Q+3zAfcudIU=",
2815 "path": "../flakes",
2816 "type": "path"
2817 },
2818 "original": {
2819 "path": "../flakes",
2820 "type": "path"
2821 }
2822 },
2823 "mastodon": {
2824 "flake": false,
2825 "locked": {
2826 "lastModified": 1582790581,
2827 "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
2828 "owner": "tootsuite",
2829 "repo": "mastodon",
2830 "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
2831 "type": "github"
2832 },
2833 "original": {
2834 "owner": "tootsuite",
2835 "ref": "v2.9.4",
2836 "repo": "mastodon",
2837 "type": "github"
2838 }
2839 },
2840 "mastodon_2": {
2841 "flake": false,
2842 "locked": {
2843 "lastModified": 1582790581,
2844 "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
2845 "owner": "tootsuite",
2846 "repo": "mastodon",
2847 "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
2848 "type": "github"
2849 },
2850 "original": {
2851 "owner": "tootsuite",
2852 "ref": "v2.9.4",
2853 "repo": "mastodon",
2854 "type": "github"
2855 }
2856 },
2857 "mediagoblin": {
2858 "flake": false,
2859 "locked": {
2860 "lastModified": 1531090939,
2861 "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
2862 "ref": "stable",
2863 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2864 "revCount": 4805,
2865 "submodules": true,
2866 "type": "git",
2867 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2868 },
2869 "original": {
2870 "ref": "stable",
2871 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2872 "submodules": true,
2873 "type": "git",
2874 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2875 }
2876 },
2877 "mediagoblin_2": {
2878 "flake": false,
2879 "locked": {
2880 "lastModified": 1531090939,
2881 "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
2882 "ref": "stable",
2883 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2884 "revCount": 4805,
2885 "submodules": true,
2886 "type": "git",
2887 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2888 },
2889 "original": {
2890 "ref": "stable",
2891 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2892 "submodules": true,
2893 "type": "git",
2894 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2895 }
2896 },
2897 "milters": {
2898 "inputs": {
2899 "environment": "environment_4",
2900 "files-watcher": "files-watcher",
2901 "openarc": "openarc",
2902 "opendmarc": "opendmarc",
2903 "secrets": "secrets_2"
2904 },
2905 "locked": {
2906 "lastModified": 1,
2907 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
2908 "path": "../../flakes/private/milters",
2909 "type": "path"
2910 },
2911 "original": {
2912 "path": "../../flakes/private/milters",
2913 "type": "path"
2914 }
2915 },
2916 "monitoring": {
2917 "inputs": {
2918 "environment": "environment_5",
2919 "naemon": "naemon",
2920 "nixpkgs-lib": "nixpkgs-lib",
2921 "secrets": "secrets_3"
2922 },
2923 "locked": {
2924 "lastModified": 1,
2925 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2926 "path": "../../flakes/private/monitoring",
2927 "type": "path"
2928 },
2929 "original": {
2930 "path": "../../flakes/private/monitoring",
2931 "type": "path"
2932 }
2933 },
2934 "monitoring_2": {
2935 "inputs": {
2936 "environment": "environment_9",
2937 "naemon": "naemon_2",
2938 "nixpkgs-lib": "nixpkgs-lib_4",
2939 "secrets": "secrets_7"
2940 },
2941 "locked": {
2942 "lastModified": 1,
2943 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2944 "path": "../../flakes/private/monitoring",
2945 "type": "path"
2946 },
2947 "original": {
2948 "path": "../../flakes/private/monitoring",
2949 "type": "path"
2950 }
2951 },
2952 "monitoring_3": {
2953 "inputs": {
2954 "environment": "environment_21",
2955 "naemon": "naemon_4",
2956 "nixpkgs-lib": "nixpkgs-lib_14",
2957 "secrets": "secrets_16"
2958 },
2959 "locked": {
2960 "lastModified": 1,
2961 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2962 "path": "../../flakes/private/monitoring",
2963 "type": "path"
2964 },
2965 "original": {
2966 "path": "../../flakes/private/monitoring",
2967 "type": "path"
2968 }
2969 },
2970 "monitoring_4": {
2971 "inputs": {
2972 "environment": "environment_24",
2973 "naemon": "naemon_5",
2974 "nixpkgs-lib": "nixpkgs-lib_17",
2975 "secrets": "secrets_18"
2976 },
2977 "locked": {
2978 "lastModified": 1,
2979 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2980 "path": "../../flakes/private/monitoring",
2981 "type": "path"
2982 },
2983 "original": {
2984 "path": "../../flakes/private/monitoring",
2985 "type": "path"
2986 }
2987 },
2988 "multi-apache-container": {
2989 "inputs": {
2990 "files-watcher": "files-watcher_11",
2991 "myuids": "myuids_25"
2992 },
2993 "locked": {
2994 "lastModified": 1,
2995 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
2996 "path": "../../flakes/multi-apache-container",
2997 "type": "path"
2998 },
2999 "original": {
3000 "path": "../../flakes/multi-apache-container",
3001 "type": "path"
3002 }
3003 },
3004 "my-lib": {
3005 "inputs": {
3006 "colmena": "colmena",
3007 "disko": "disko",
3008 "flake-parts": "flake-parts",
3009 "nixos-anywhere": "nixos-anywhere",
3010 "nixpkgs": "nixpkgs_7"
3011 },
3012 "locked": {
3013 "lastModified": 1,
3014 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3015 "path": "../../flakes/lib",
3016 "type": "path"
3017 },
3018 "original": {
3019 "path": "../../flakes/lib",
3020 "type": "path"
3021 }
3022 },
3023 "my-lib_2": {
3024 "inputs": {
3025 "colmena": "colmena_2",
3026 "disko": "disko_2",
3027 "flake-parts": "flake-parts_3",
3028 "nixos-anywhere": "nixos-anywhere_2",
3029 "nixpkgs": "nixpkgs_16"
3030 },
3031 "locked": {
3032 "lastModified": 1,
3033 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3034 "path": "../../flakes/lib",
3035 "type": "path"
3036 },
3037 "original": {
3038 "path": "../../flakes/lib",
3039 "type": "path"
3040 }
3041 },
3042 "my-lib_3": {
3043 "inputs": {
3044 "colmena": "colmena_3",
3045 "disko": "disko_3",
3046 "flake-parts": "flake-parts_5",
3047 "nixos-anywhere": "nixos-anywhere_3",
3048 "nixpkgs": "nixpkgs_23"
3049 },
3050 "locked": {
3051 "lastModified": 1,
3052 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3053 "path": "../../flakes/lib",
3054 "type": "path"
3055 },
3056 "original": {
3057 "path": "../../flakes/lib",
3058 "type": "path"
3059 }
3060 },
3061 "my-lib_4": {
3062 "inputs": {
3063 "colmena": "colmena_4",
3064 "disko": "disko_4",
3065 "flake-parts": "flake-parts_11",
3066 "nixos-anywhere": "nixos-anywhere_4",
3067 "nixpkgs": "nixpkgs_54"
3068 },
3069 "locked": {
3070 "lastModified": 1,
3071 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3072 "path": "../../flakes/lib",
3073 "type": "path"
3074 },
3075 "original": {
3076 "path": "../../flakes/lib",
3077 "type": "path"
3078 }
3079 },
3080 "my-lib_5": {
3081 "inputs": {
3082 "colmena": "colmena_5",
3083 "disko": "disko_5",
3084 "flake-parts": "flake-parts_13",
3085 "nixos-anywhere": "nixos-anywhere_5",
3086 "nixpkgs": "nixpkgs_62"
3087 },
3088 "locked": {
3089 "lastModified": 1,
3090 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3091 "path": "../../flakes/lib",
3092 "type": "path"
3093 },
3094 "original": {
3095 "path": "../../flakes/lib",
3096 "type": "path"
3097 }
3098 },
3099 "my-lib_6": {
3100 "inputs": {
3101 "colmena": "colmena_6",
3102 "disko": "disko_6",
3103 "flake-parts": "flake-parts_15",
3104 "nixos-anywhere": "nixos-anywhere_6",
3105 "nixpkgs": "nixpkgs_70"
3106 },
3107 "locked": {
3108 "lastModified": 1,
3109 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3110 "path": "../../flakes/lib",
3111 "type": "path"
3112 },
3113 "original": {
3114 "path": "../../flakes/lib",
3115 "type": "path"
3116 }
3117 },
3118 "mypackages": {
3119 "inputs": {
3120 "flake-parts": "flake-parts_2",
3121 "nixpkgs": "nixpkgs_12",
3122 "webapps-ttrss": "webapps-ttrss"
3123 },
3124 "locked": {
3125 "lastModified": 1,
3126 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3127 "path": "../../mypackages",
3128 "type": "path"
3129 },
3130 "original": {
3131 "path": "../../mypackages",
3132 "type": "path"
3133 }
3134 },
3135 "mypackages_10": {
3136 "inputs": {
3137 "flake-parts": "flake-parts_17",
3138 "nixpkgs": "nixpkgs_77",
3139 "webapps-ttrss": "webapps-ttrss_11"
3140 },
3141 "locked": {
3142 "lastModified": 1,
3143 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3144 "path": "../mypackages",
3145 "type": "path"
3146 },
3147 "original": {
3148 "path": "../mypackages",
3149 "type": "path"
3150 }
3151 },
3152 "mypackages_11": {
3153 "inputs": {
3154 "flake-parts": "flake-parts_18",
3155 "nixpkgs": "nixpkgs_79",
3156 "webapps-ttrss": "webapps-ttrss_12"
3157 },
3158 "locked": {
3159 "lastModified": 1,
3160 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3161 "path": "../mypackages",
3162 "type": "path"
3163 },
3164 "original": {
3165 "path": "../mypackages",
3166 "type": "path"
3167 }
3168 },
3169 "mypackages_12": {
3170 "inputs": {
3171 "flake-parts": "flake-parts_21",
3172 "nixpkgs": "nixpkgs_102",
3173 "webapps-ttrss": "webapps-ttrss_14"
3174 },
3175 "locked": {
3176 "lastModified": 1,
3177 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3178 "path": "../../mypackages",
3179 "type": "path"
3180 },
3181 "original": {
3182 "path": "../../mypackages",
3183 "type": "path"
3184 }
3185 },
3186 "mypackages_13": {
3187 "inputs": {
3188 "flake-parts": "flake-parts_22",
3189 "nixpkgs": "nixpkgs_103",
3190 "webapps-ttrss": "webapps-ttrss_15"
3191 },
3192 "locked": {
3193 "lastModified": 1,
3194 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3195 "path": "../mypackages",
3196 "type": "path"
3197 },
3198 "original": {
3199 "path": "../mypackages",
3200 "type": "path"
3201 }
3202 },
3203 "mypackages_2": {
3204 "inputs": {
3205 "flake-parts": "flake-parts_4",
3206 "nixpkgs": "nixpkgs_19",
3207 "webapps-ttrss": "webapps-ttrss_2"
3208 },
3209 "locked": {
3210 "lastModified": 1,
3211 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3212 "path": "../../mypackages",
3213 "type": "path"
3214 },
3215 "original": {
3216 "path": "../../mypackages",
3217 "type": "path"
3218 }
3219 },
3220 "mypackages_3": {
3221 "inputs": {
3222 "flake-parts": "flake-parts_6",
3223 "nixpkgs": "nixpkgs_35",
3224 "webapps-ttrss": "webapps-ttrss_3"
3225 },
3226 "locked": {
3227 "lastModified": 1,
3228 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3229 "path": "../../mypackages",
3230 "type": "path"
3231 },
3232 "original": {
3233 "path": "../../mypackages",
3234 "type": "path"
3235 }
3236 },
3237 "mypackages_4": {
3238 "inputs": {
3239 "flake-parts": "flake-parts_7",
3240 "nixpkgs": "nixpkgs_38",
3241 "webapps-ttrss": "webapps-ttrss_4"
3242 },
3243 "locked": {
3244 "lastModified": 1,
3245 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3246 "path": "../mypackages",
3247 "type": "path"
3248 },
3249 "original": {
3250 "path": "../mypackages",
3251 "type": "path"
3252 }
3253 },
3254 "mypackages_5": {
3255 "inputs": {
3256 "flake-parts": "flake-parts_8",
3257 "nixpkgs": "nixpkgs_40",
3258 "webapps-ttrss": "webapps-ttrss_5"
3259 },
3260 "locked": {
3261 "lastModified": 1,
3262 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3263 "path": "../mypackages",
3264 "type": "path"
3265 },
3266 "original": {
3267 "path": "../mypackages",
3268 "type": "path"
3269 }
3270 },
3271 "mypackages_6": {
3272 "inputs": {
3273 "flake-parts": "flake-parts_10",
3274 "nixpkgs": "nixpkgs_48",
3275 "webapps-ttrss": "webapps-ttrss_7"
3276 },
3277 "locked": {
3278 "lastModified": 1,
3279 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3280 "path": "../mypackages",
3281 "type": "path"
3282 },
3283 "original": {
3284 "path": "../mypackages",
3285 "type": "path"
3286 }
3287 },
3288 "mypackages_7": {
3289 "inputs": {
3290 "flake-parts": "flake-parts_12",
3291 "nixpkgs": "nixpkgs_58",
3292 "webapps-ttrss": "webapps-ttrss_8"
3293 },
3294 "locked": {
3295 "lastModified": 1,
3296 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3297 "path": "../../mypackages",
3298 "type": "path"
3299 },
3300 "original": {
3301 "path": "../../mypackages",
3302 "type": "path"
3303 }
3304 },
3305 "mypackages_8": {
3306 "inputs": {
3307 "flake-parts": "flake-parts_14",
3308 "nixpkgs": "nixpkgs_66",
3309 "webapps-ttrss": "webapps-ttrss_9"
3310 },
3311 "locked": {
3312 "lastModified": 1,
3313 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3314 "path": "../../mypackages",
3315 "type": "path"
3316 },
3317 "original": {
3318 "path": "../../mypackages",
3319 "type": "path"
3320 }
3321 },
3322 "mypackages_9": {
3323 "inputs": {
3324 "flake-parts": "flake-parts_16",
3325 "nixpkgs": "nixpkgs_73",
3326 "webapps-ttrss": "webapps-ttrss_10"
3327 },
3328 "locked": {
3329 "lastModified": 1,
3330 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3331 "path": "../../mypackages",
3332 "type": "path"
3333 },
3334 "original": {
3335 "path": "../../mypackages",
3336 "type": "path"
3337 }
3338 },
3339 "myuids": {
3340 "locked": {
3341 "lastModified": 1,
3342 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3343 "path": "../myuids",
3344 "type": "path"
3345 },
3346 "original": {
3347 "path": "../myuids",
3348 "type": "path"
3349 }
3350 },
3351 "myuids_10": {
3352 "locked": {
3353 "lastModified": 1,
3354 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3355 "path": "../myuids",
3356 "type": "path"
3357 },
3358 "original": {
3359 "path": "../myuids",
3360 "type": "path"
3361 }
3362 },
3363 "myuids_11": {
3364 "locked": {
3365 "lastModified": 1,
3366 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3367 "path": "../myuids",
3368 "type": "path"
3369 },
3370 "original": {
3371 "path": "../myuids",
3372 "type": "path"
3373 }
3374 },
3375 "myuids_12": {
3376 "locked": {
3377 "lastModified": 1,
3378 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3379 "path": "../myuids",
3380 "type": "path"
3381 },
3382 "original": {
3383 "path": "../myuids",
3384 "type": "path"
3385 }
3386 },
3387 "myuids_13": {
3388 "locked": {
3389 "lastModified": 1,
3390 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3391 "path": "../myuids",
3392 "type": "path"
3393 },
3394 "original": {
3395 "path": "../myuids",
3396 "type": "path"
3397 }
3398 },
3399 "myuids_14": {
3400 "locked": {
3401 "lastModified": 1,
3402 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3403 "path": "../myuids",
3404 "type": "path"
3405 },
3406 "original": {
3407 "path": "../myuids",
3408 "type": "path"
3409 }
3410 },
3411 "myuids_15": {
3412 "locked": {
3413 "lastModified": 1,
3414 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3415 "path": "../../myuids",
3416 "type": "path"
3417 },
3418 "original": {
3419 "path": "../../myuids",
3420 "type": "path"
3421 }
3422 },
3423 "myuids_16": {
3424 "locked": {
3425 "lastModified": 1,
3426 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3427 "path": "../myuids",
3428 "type": "path"
3429 },
3430 "original": {
3431 "path": "../myuids",
3432 "type": "path"
3433 }
3434 },
3435 "myuids_17": {
3436 "locked": {
3437 "lastModified": 1,
3438 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3439 "path": "../myuids",
3440 "type": "path"
3441 },
3442 "original": {
3443 "path": "../myuids",
3444 "type": "path"
3445 }
3446 },
3447 "myuids_18": {
3448 "locked": {
3449 "lastModified": 1,
3450 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3451 "path": "../myuids",
3452 "type": "path"
3453 },
3454 "original": {
3455 "path": "../myuids",
3456 "type": "path"
3457 }
3458 },
3459 "myuids_19": {
3460 "locked": {
3461 "lastModified": 1,
3462 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3463 "path": "../myuids",
3464 "type": "path"
3465 },
3466 "original": {
3467 "path": "../myuids",
3468 "type": "path"
3469 }
3470 },
3471 "myuids_2": {
3472 "locked": {
3473 "lastModified": 1,
3474 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3475 "path": "../myuids",
3476 "type": "path"
3477 },
3478 "original": {
3479 "path": "../myuids",
3480 "type": "path"
3481 }
3482 },
3483 "myuids_20": {
3484 "locked": {
3485 "lastModified": 1,
3486 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3487 "path": "../myuids",
3488 "type": "path"
3489 },
3490 "original": {
3491 "path": "../myuids",
3492 "type": "path"
3493 }
3494 },
3495 "myuids_21": {
3496 "locked": {
3497 "lastModified": 1,
3498 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3499 "path": "../myuids",
3500 "type": "path"
3501 },
3502 "original": {
3503 "path": "../myuids",
3504 "type": "path"
3505 }
3506 },
3507 "myuids_22": {
3508 "locked": {
3509 "lastModified": 1,
3510 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3511 "path": "../myuids",
3512 "type": "path"
3513 },
3514 "original": {
3515 "path": "../myuids",
3516 "type": "path"
3517 }
3518 },
3519 "myuids_23": {
3520 "locked": {
3521 "lastModified": 1,
3522 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3523 "path": "../../flakes/myuids",
3524 "type": "path"
3525 },
3526 "original": {
3527 "path": "../../flakes/myuids",
3528 "type": "path"
3529 }
3530 },
3531 "myuids_24": {
3532 "locked": {
3533 "lastModified": 1,
3534 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3535 "path": "../../myuids",
3536 "type": "path"
3537 },
3538 "original": {
3539 "path": "../../myuids",
3540 "type": "path"
3541 }
3542 },
3543 "myuids_25": {
3544 "locked": {
3545 "lastModified": 1,
3546 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3547 "path": "../myuids",
3548 "type": "path"
3549 },
3550 "original": {
3551 "path": "../myuids",
3552 "type": "path"
3553 }
3554 },
3555 "myuids_26": {
3556 "locked": {
3557 "lastModified": 1,
3558 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3559 "path": "../../flakes/myuids",
3560 "type": "path"
3561 },
3562 "original": {
3563 "path": "../../flakes/myuids",
3564 "type": "path"
3565 }
3566 },
3567 "myuids_27": {
3568 "locked": {
3569 "lastModified": 1,
3570 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3571 "path": "../../myuids",
3572 "type": "path"
3573 },
3574 "original": {
3575 "path": "../../myuids",
3576 "type": "path"
3577 }
3578 },
3579 "myuids_28": {
3580 "locked": {
3581 "lastModified": 1,
3582 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3583 "path": "../../myuids",
3584 "type": "path"
3585 },
3586 "original": {
3587 "path": "../../myuids",
3588 "type": "path"
3589 }
3590 },
3591 "myuids_29": {
3592 "locked": {
3593 "lastModified": 1,
3594 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3595 "path": "../myuids",
3596 "type": "path"
3597 },
3598 "original": {
3599 "path": "../myuids",
3600 "type": "path"
3601 }
3602 },
3603 "myuids_3": {
3604 "locked": {
3605 "lastModified": 1,
3606 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3607 "path": "../../flakes/myuids",
3608 "type": "path"
3609 },
3610 "original": {
3611 "path": "../../flakes/myuids",
3612 "type": "path"
3613 }
3614 },
3615 "myuids_30": {
3616 "locked": {
3617 "lastModified": 1,
3618 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3619 "path": "../myuids",
3620 "type": "path"
3621 },
3622 "original": {
3623 "path": "../myuids",
3624 "type": "path"
3625 }
3626 },
3627 "myuids_31": {
3628 "locked": {
3629 "lastModified": 1,
3630 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3631 "path": "../myuids",
3632 "type": "path"
3633 },
3634 "original": {
3635 "path": "../myuids",
3636 "type": "path"
3637 }
3638 },
3639 "myuids_32": {
3640 "locked": {
3641 "lastModified": 1,
3642 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3643 "path": "../myuids",
3644 "type": "path"
3645 },
3646 "original": {
3647 "path": "../myuids",
3648 "type": "path"
3649 }
3650 },
3651 "myuids_33": {
3652 "locked": {
3653 "lastModified": 1,
3654 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3655 "path": "../myuids",
3656 "type": "path"
3657 },
3658 "original": {
3659 "path": "../myuids",
3660 "type": "path"
3661 }
3662 },
3663 "myuids_34": {
3664 "locked": {
3665 "lastModified": 1,
3666 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3667 "path": "../myuids",
3668 "type": "path"
3669 },
3670 "original": {
3671 "path": "../myuids",
3672 "type": "path"
3673 }
3674 },
3675 "myuids_35": {
3676 "locked": {
3677 "lastModified": 1,
3678 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3679 "path": "../myuids",
3680 "type": "path"
3681 },
3682 "original": {
3683 "path": "../myuids",
3684 "type": "path"
3685 }
3686 },
3687 "myuids_36": {
3688 "locked": {
3689 "lastModified": 1,
3690 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3691 "path": "../myuids",
3692 "type": "path"
3693 },
3694 "original": {
3695 "path": "../myuids",
3696 "type": "path"
3697 }
3698 },
3699 "myuids_37": {
3700 "locked": {
3701 "lastModified": 1,
3702 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3703 "path": "../myuids",
3704 "type": "path"
3705 },
3706 "original": {
3707 "path": "../myuids",
3708 "type": "path"
3709 }
3710 },
3711 "myuids_38": {
3712 "locked": {
3713 "lastModified": 1,
3714 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3715 "path": "../myuids",
3716 "type": "path"
3717 },
3718 "original": {
3719 "path": "../myuids",
3720 "type": "path"
3721 }
3722 },
3723 "myuids_39": {
3724 "locked": {
3725 "lastModified": 1,
3726 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3727 "path": "../myuids",
3728 "type": "path"
3729 },
3730 "original": {
3731 "path": "../myuids",
3732 "type": "path"
3733 }
3734 },
3735 "myuids_4": {
3736 "locked": {
3737 "lastModified": 1,
3738 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3739 "path": "../myuids",
3740 "type": "path"
3741 },
3742 "original": {
3743 "path": "../myuids",
3744 "type": "path"
3745 }
3746 },
3747 "myuids_40": {
3748 "locked": {
3749 "lastModified": 1,
3750 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3751 "path": "../myuids",
3752 "type": "path"
3753 },
3754 "original": {
3755 "path": "../myuids",
3756 "type": "path"
3757 }
3758 },
3759 "myuids_41": {
3760 "locked": {
3761 "lastModified": 1,
3762 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3763 "path": "../myuids",
3764 "type": "path"
3765 },
3766 "original": {
3767 "path": "../myuids",
3768 "type": "path"
3769 }
3770 },
3771 "myuids_42": {
3772 "locked": {
3773 "lastModified": 1,
3774 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3775 "path": "../../myuids",
3776 "type": "path"
3777 },
3778 "original": {
3779 "path": "../../myuids",
3780 "type": "path"
3781 }
3782 },
3783 "myuids_5": {
3784 "locked": {
3785 "lastModified": 1,
3786 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3787 "path": "../myuids",
3788 "type": "path"
3789 },
3790 "original": {
3791 "path": "../myuids",
3792 "type": "path"
3793 }
3794 },
3795 "myuids_6": {
3796 "locked": {
3797 "lastModified": 1,
3798 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3799 "path": "../../myuids",
3800 "type": "path"
3801 },
3802 "original": {
3803 "path": "../../myuids",
3804 "type": "path"
3805 }
3806 },
3807 "myuids_7": {
3808 "locked": {
3809 "lastModified": 1,
3810 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3811 "path": "../../flakes/myuids",
3812 "type": "path"
3813 },
3814 "original": {
3815 "path": "../../flakes/myuids",
3816 "type": "path"
3817 }
3818 },
3819 "myuids_8": {
3820 "locked": {
3821 "lastModified": 1,
3822 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3823 "path": "../../myuids",
3824 "type": "path"
3825 },
3826 "original": {
3827 "path": "../../myuids",
3828 "type": "path"
3829 }
3830 },
3831 "myuids_9": {
3832 "locked": {
3833 "lastModified": 1,
3834 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3835 "path": "../myuids",
3836 "type": "path"
3837 },
3838 "original": {
3839 "path": "../myuids",
3840 "type": "path"
3841 }
3842 },
3843 "n-backup-2": {
3844 "inputs": {
3845 "chatons": "chatons",
3846 "environment": "environment_2",
3847 "loginctl-linger": "loginctl-linger",
3848 "mail-relay": "mail-relay",
3849 "milters": "milters",
3850 "monitoring": "monitoring",
3851 "my-lib": "my-lib",
3852 "myuids": "myuids_3",
3853 "nixpkgs": "nixpkgs_8",
3854 "openarc": "openarc_3",
3855 "opendmarc": "opendmarc_2",
3856 "openldap": "openldap",
3857 "rsync_backup": "rsync_backup",
3858 "secrets": "secrets_6",
3859 "system": "system"
3860 },
3861 "locked": {
3862 "lastModified": 1,
3863 "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=",
3864 "path": "../systems/backup-2",
3865 "type": "path"
3866 },
3867 "original": {
3868 "path": "../systems/backup-2",
3869 "type": "path"
3870 }
3871 },
3872 "n-dilion": {
3873 "inputs": {
3874 "environment": "environment_8",
3875 "files-watcher": "files-watcher_4",
3876 "loginctl-linger": "loginctl-linger_2",
3877 "monitoring": "monitoring_2",
3878 "my-lib": "my-lib_2",
3879 "myuids": "myuids_7",
3880 "nixpkgs": "nixpkgs_17",
3881 "secrets": "secrets_8",
3882 "ssh": "ssh",
3883 "system": "system_2"
3884 },
3885 "locked": {
3886 "lastModified": 1,
3887 "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=",
3888 "path": "../systems/dilion",
3889 "type": "path"
3890 },
3891 "original": {
3892 "path": "../systems/dilion",
3893 "type": "path"
3894 }
3895 },
3896 "n-eldiron": {
3897 "inputs": {
3898 "dns-nix": "dns-nix",
3899 "my-lib": "my-lib_3",
3900 "nixpkgs": "nixpkgs_24",
3901 "private-buildbot": "private-buildbot",
3902 "private-chatons": "private-chatons",
3903 "private-environment": "private-environment",
3904 "private-milters": "private-milters",
3905 "private-monitoring": "private-monitoring",
3906 "private-openarc": "private-openarc",
3907 "private-opendmarc": "private-opendmarc",
3908 "private-openldap": "private-openldap",
3909 "private-paste": "private-paste",
3910 "private-peertube": "private-peertube",
3911 "private-php": "private-php",
3912 "private-ssh": "private-ssh",
3913 "private-system": "private-system",
3914 "public-copanier": "public-copanier",
3915 "public-diaspora": "public-diaspora",
3916 "public-etherpad-lite": "public-etherpad-lite",
3917 "public-fiche": "public-fiche",
3918 "public-files-watcher": "public-files-watcher",
3919 "public-grocy": "public-grocy",
3920 "public-loginctl-linger": "public-loginctl-linger",
3921 "public-mastodon": "public-mastodon",
3922 "public-mediagoblin": "public-mediagoblin",
3923 "public-multi-apache-container": "public-multi-apache-container",
3924 "public-mypackages": "public-mypackages",
3925 "public-myuids": "public-myuids",
3926 "public-openarc": "public-openarc",
3927 "public-opendmarc": "public-opendmarc",
3928 "public-peertube": "public-peertube",
3929 "public-secrets": "public-secrets",
3930 "public-surfer": "public-surfer",
3931 "public-taskwarrior-web": "public-taskwarrior-web"
3932 },
3933 "locked": {
3934 "lastModified": 1,
3935 "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=",
3936 "path": "../systems/eldiron",
3937 "type": "path"
3938 },
3939 "original": {
3940 "path": "../systems/eldiron",
3941 "type": "path"
3942 }
3943 },
3944 "n-monitoring-1": {
3945 "inputs": {
3946 "chatons": "chatons_2",
3947 "environment": "environment_19",
3948 "files-watcher": "files-watcher_9",
3949 "loginctl-linger": "loginctl-linger_3",
3950 "mail-relay": "mail-relay_2",
3951 "monitoring": "monitoring_3",
3952 "my-lib": "my-lib_4",
3953 "myuids": "myuids_23",
3954 "nixpkgs": "nixpkgs_55",
3955 "php": "php",
3956 "secrets": "secrets_17",
3957 "system": "system_3"
3958 },
3959 "locked": {
3960 "lastModified": 1,
3961 "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=",
3962 "path": "../systems/monitoring-1",
3963 "type": "path"
3964 },
3965 "original": {
3966 "path": "../systems/monitoring-1",
3967 "type": "path"
3968 }
3969 },
3970 "n-quatresaisons": {
3971 "inputs": {
3972 "environment": "environment_23",
3973 "files-watcher": "files-watcher_10",
3974 "landing-page": "landing-page",
3975 "monitoring": "monitoring_4",
3976 "multi-apache-container": "multi-apache-container",
3977 "my-lib": "my-lib_5",
3978 "myuids": "myuids_26",
3979 "nixpkgs": "nixpkgs_63",
3980 "php": "php_2",
3981 "secrets": "secrets_19",
3982 "system": "system_4"
3983 },
3984 "locked": {
3985 "lastModified": 1,
3986 "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=",
3987 "path": "../systems/quatresaisons",
3988 "type": "path"
3989 },
3990 "original": {
3991 "path": "../systems/quatresaisons",
3992 "type": "path"
3993 }
3994 },
3995 "n-zoldene": {
3996 "inputs": {
3997 "impermanence": "impermanence",
3998 "my-lib": "my-lib_6",
3999 "nixpkgs": "nixpkgs_71",
4000 "private-environment": "private-environment_2",
4001 "private-system": "private-system_2",
4002 "public-secrets": "public-secrets_2"
4003 },
4004 "locked": {
4005 "lastModified": 1,
4006 "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=",
4007 "path": "../systems/zoldene",
4008 "type": "path"
4009 },
4010 "original": {
4011 "path": "../systems/zoldene",
4012 "type": "path"
4013 }
4014 },
4015 "naemon": {
4016 "locked": {
4017 "lastModified": 1,
4018 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4019 "path": "../../naemon",
4020 "type": "path"
4021 },
4022 "original": {
4023 "path": "../../naemon",
4024 "type": "path"
4025 }
4026 },
4027 "naemon_2": {
4028 "locked": {
4029 "lastModified": 1,
4030 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4031 "path": "../../naemon",
4032 "type": "path"
4033 },
4034 "original": {
4035 "path": "../../naemon",
4036 "type": "path"
4037 }
4038 },
4039 "naemon_3": {
4040 "locked": {
4041 "lastModified": 1,
4042 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4043 "path": "../../naemon",
4044 "type": "path"
4045 },
4046 "original": {
4047 "path": "../../naemon",
4048 "type": "path"
4049 }
4050 },
4051 "naemon_4": {
4052 "locked": {
4053 "lastModified": 1,
4054 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4055 "path": "../../naemon",
4056 "type": "path"
4057 },
4058 "original": {
4059 "path": "../../naemon",
4060 "type": "path"
4061 }
4062 },
4063 "naemon_5": {
4064 "locked": {
4065 "lastModified": 1,
4066 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4067 "path": "../../naemon",
4068 "type": "path"
4069 },
4070 "original": {
4071 "path": "../../naemon",
4072 "type": "path"
4073 }
4074 },
4075 "naemon_6": {
4076 "locked": {
4077 "lastModified": 1,
4078 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4079 "path": "../../naemon",
4080 "type": "path"
4081 },
4082 "original": {
4083 "path": "../../naemon",
4084 "type": "path"
4085 }
4086 },
4087 "nixos-2305": {
4088 "locked": {
4089 "lastModified": 1687938137,
4090 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4091 "owner": "NixOS",
4092 "repo": "nixpkgs",
4093 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4094 "type": "github"
4095 },
4096 "original": {
4097 "owner": "NixOS",
4098 "ref": "release-23.05",
4099 "repo": "nixpkgs",
4100 "type": "github"
4101 }
4102 },
4103 "nixos-2305_2": {
4104 "locked": {
4105 "lastModified": 1687938137,
4106 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4107 "owner": "NixOS",
4108 "repo": "nixpkgs",
4109 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4110 "type": "github"
4111 },
4112 "original": {
4113 "owner": "NixOS",
4114 "ref": "release-23.05",
4115 "repo": "nixpkgs",
4116 "type": "github"
4117 }
4118 },
4119 "nixos-2305_3": {
4120 "locked": {
4121 "lastModified": 1687938137,
4122 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4123 "owner": "NixOS",
4124 "repo": "nixpkgs",
4125 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4126 "type": "github"
4127 },
4128 "original": {
4129 "owner": "NixOS",
4130 "ref": "release-23.05",
4131 "repo": "nixpkgs",
4132 "type": "github"
4133 }
4134 },
4135 "nixos-2305_4": {
4136 "locked": {
4137 "lastModified": 1687938137,
4138 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4139 "owner": "NixOS",
4140 "repo": "nixpkgs",
4141 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4142 "type": "github"
4143 },
4144 "original": {
4145 "owner": "NixOS",
4146 "ref": "release-23.05",
4147 "repo": "nixpkgs",
4148 "type": "github"
4149 }
4150 },
4151 "nixos-2305_5": {
4152 "locked": {
4153 "lastModified": 1687938137,
4154 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4155 "owner": "NixOS",
4156 "repo": "nixpkgs",
4157 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4158 "type": "github"
4159 },
4160 "original": {
4161 "owner": "NixOS",
4162 "ref": "release-23.05",
4163 "repo": "nixpkgs",
4164 "type": "github"
4165 }
4166 },
4167 "nixos-2305_6": {
4168 "locked": {
4169 "lastModified": 1687938137,
4170 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4171 "owner": "NixOS",
4172 "repo": "nixpkgs",
4173 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4174 "type": "github"
4175 },
4176 "original": {
4177 "owner": "NixOS",
4178 "ref": "release-23.05",
4179 "repo": "nixpkgs",
4180 "type": "github"
4181 }
4182 },
4183 "nixos-2305_7": {
4184 "locked": {
4185 "lastModified": 1687938137,
4186 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4187 "owner": "NixOS",
4188 "repo": "nixpkgs",
4189 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4190 "type": "github"
4191 },
4192 "original": {
4193 "owner": "NixOS",
4194 "ref": "release-23.05",
4195 "repo": "nixpkgs",
4196 "type": "github"
4197 }
4198 },
4199 "nixos-anywhere": {
4200 "inputs": {
4201 "disko": [
4202 "main-flake",
4203 "n-backup-2",
4204 "my-lib",
4205 "disko"
4206 ],
4207 "flake-parts": [
4208 "main-flake",
4209 "n-backup-2",
4210 "my-lib",
4211 "flake-parts"
4212 ],
4213 "nixos-2305": "nixos-2305",
4214 "nixos-images": "nixos-images",
4215 "nixpkgs": "nixpkgs_6",
4216 "treefmt-nix": "treefmt-nix"
4217 },
4218 "locked": {
4219 "lastModified": 1689945193,
4220 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4221 "owner": "numtide",
4222 "repo": "nixos-anywhere",
4223 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4224 "type": "github"
4225 },
4226 "original": {
4227 "owner": "numtide",
4228 "repo": "nixos-anywhere",
4229 "type": "github"
4230 }
4231 },
4232 "nixos-anywhere_2": {
4233 "inputs": {
4234 "disko": [
4235 "main-flake",
4236 "n-dilion",
4237 "my-lib",
4238 "disko"
4239 ],
4240 "flake-parts": [
4241 "main-flake",
4242 "n-dilion",
4243 "my-lib",
4244 "flake-parts"
4245 ],
4246 "nixos-2305": "nixos-2305_2",
4247 "nixos-images": "nixos-images_2",
4248 "nixpkgs": "nixpkgs_15",
4249 "treefmt-nix": "treefmt-nix_2"
4250 },
4251 "locked": {
4252 "lastModified": 1689945193,
4253 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4254 "owner": "numtide",
4255 "repo": "nixos-anywhere",
4256 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4257 "type": "github"
4258 },
4259 "original": {
4260 "owner": "numtide",
4261 "repo": "nixos-anywhere",
4262 "type": "github"
4263 }
4264 },
4265 "nixos-anywhere_3": {
4266 "inputs": {
4267 "disko": [
4268 "main-flake",
4269 "n-eldiron",
4270 "my-lib",
4271 "disko"
4272 ],
4273 "flake-parts": [
4274 "main-flake",
4275 "n-eldiron",
4276 "my-lib",
4277 "flake-parts"
4278 ],
4279 "nixos-2305": "nixos-2305_3",
4280 "nixos-images": "nixos-images_3",
4281 "nixpkgs": "nixpkgs_22",
4282 "treefmt-nix": "treefmt-nix_3"
4283 },
4284 "locked": {
4285 "lastModified": 1689945193,
4286 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4287 "owner": "numtide",
4288 "repo": "nixos-anywhere",
4289 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4290 "type": "github"
4291 },
4292 "original": {
4293 "owner": "numtide",
4294 "repo": "nixos-anywhere",
4295 "type": "github"
4296 }
4297 },
4298 "nixos-anywhere_4": {
4299 "inputs": {
4300 "disko": [
4301 "main-flake",
4302 "n-monitoring-1",
4303 "my-lib",
4304 "disko"
4305 ],
4306 "flake-parts": [
4307 "main-flake",
4308 "n-monitoring-1",
4309 "my-lib",
4310 "flake-parts"
4311 ],
4312 "nixos-2305": "nixos-2305_4",
4313 "nixos-images": "nixos-images_4",
4314 "nixpkgs": "nixpkgs_53",
4315 "treefmt-nix": "treefmt-nix_4"
4316 },
4317 "locked": {
4318 "lastModified": 1689945193,
4319 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4320 "owner": "numtide",
4321 "repo": "nixos-anywhere",
4322 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4323 "type": "github"
4324 },
4325 "original": {
4326 "owner": "numtide",
4327 "repo": "nixos-anywhere",
4328 "type": "github"
4329 }
4330 },
4331 "nixos-anywhere_5": {
4332 "inputs": {
4333 "disko": [
4334 "main-flake",
4335 "n-quatresaisons",
4336 "my-lib",
4337 "disko"
4338 ],
4339 "flake-parts": [
4340 "main-flake",
4341 "n-quatresaisons",
4342 "my-lib",
4343 "flake-parts"
4344 ],
4345 "nixos-2305": "nixos-2305_5",
4346 "nixos-images": "nixos-images_5",
4347 "nixpkgs": "nixpkgs_61",
4348 "treefmt-nix": "treefmt-nix_5"
4349 },
4350 "locked": {
4351 "lastModified": 1689945193,
4352 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4353 "owner": "numtide",
4354 "repo": "nixos-anywhere",
4355 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4356 "type": "github"
4357 },
4358 "original": {
4359 "owner": "numtide",
4360 "repo": "nixos-anywhere",
4361 "type": "github"
4362 }
4363 },
4364 "nixos-anywhere_6": {
4365 "inputs": {
4366 "disko": [
4367 "main-flake",
4368 "n-zoldene",
4369 "my-lib",
4370 "disko"
4371 ],
4372 "flake-parts": [
4373 "main-flake",
4374 "n-zoldene",
4375 "my-lib",
4376 "flake-parts"
4377 ],
4378 "nixos-2305": "nixos-2305_6",
4379 "nixos-images": "nixos-images_6",
4380 "nixpkgs": "nixpkgs_69",
4381 "treefmt-nix": "treefmt-nix_6"
4382 },
4383 "locked": {
4384 "lastModified": 1689945193,
4385 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4386 "owner": "numtide",
4387 "repo": "nixos-anywhere",
4388 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4389 "type": "github"
4390 },
4391 "original": {
4392 "owner": "numtide",
4393 "repo": "nixos-anywhere",
4394 "type": "github"
4395 }
4396 },
4397 "nixos-anywhere_7": {
4398 "inputs": {
4399 "disko": [
4400 "main-flake",
4401 "s-lib",
4402 "disko"
4403 ],
4404 "flake-parts": [
4405 "main-flake",
4406 "s-lib",
4407 "flake-parts"
4408 ],
4409 "nixos-2305": "nixos-2305_7",
4410 "nixos-images": "nixos-images_7",
4411 "nixpkgs": "nixpkgs_83",
4412 "treefmt-nix": "treefmt-nix_7"
4413 },
4414 "locked": {
4415 "lastModified": 1689945193,
4416 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4417 "owner": "numtide",
4418 "repo": "nixos-anywhere",
4419 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4420 "type": "github"
4421 },
4422 "original": {
4423 "owner": "numtide",
4424 "repo": "nixos-anywhere",
4425 "type": "github"
4426 }
4427 },
4428 "nixos-images": {
4429 "inputs": {
4430 "nixos-2305": [
4431 "main-flake",
4432 "n-backup-2",
4433 "my-lib",
4434 "nixos-anywhere",
4435 "nixos-2305"
4436 ],
4437 "nixos-unstable": [
4438 "main-flake",
4439 "n-backup-2",
4440 "my-lib",
4441 "nixos-anywhere",
4442 "nixpkgs"
4443 ]
4444 },
4445 "locked": {
4446 "lastModified": 1686819168,
4447 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4448 "owner": "nix-community",
4449 "repo": "nixos-images",
4450 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4451 "type": "github"
4452 },
4453 "original": {
4454 "owner": "nix-community",
4455 "repo": "nixos-images",
4456 "type": "github"
4457 }
4458 },
4459 "nixos-images_2": {
4460 "inputs": {
4461 "nixos-2305": [
4462 "main-flake",
4463 "n-dilion",
4464 "my-lib",
4465 "nixos-anywhere",
4466 "nixos-2305"
4467 ],
4468 "nixos-unstable": [
4469 "main-flake",
4470 "n-dilion",
4471 "my-lib",
4472 "nixos-anywhere",
4473 "nixpkgs"
4474 ]
4475 },
4476 "locked": {
4477 "lastModified": 1686819168,
4478 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4479 "owner": "nix-community",
4480 "repo": "nixos-images",
4481 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4482 "type": "github"
4483 },
4484 "original": {
4485 "owner": "nix-community",
4486 "repo": "nixos-images",
4487 "type": "github"
4488 }
4489 },
4490 "nixos-images_3": {
4491 "inputs": {
4492 "nixos-2305": [
4493 "main-flake",
4494 "n-eldiron",
4495 "my-lib",
4496 "nixos-anywhere",
4497 "nixos-2305"
4498 ],
4499 "nixos-unstable": [
4500 "main-flake",
4501 "n-eldiron",
4502 "my-lib",
4503 "nixos-anywhere",
4504 "nixpkgs"
4505 ]
4506 },
4507 "locked": {
4508 "lastModified": 1686819168,
4509 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4510 "owner": "nix-community",
4511 "repo": "nixos-images",
4512 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4513 "type": "github"
4514 },
4515 "original": {
4516 "owner": "nix-community",
4517 "repo": "nixos-images",
4518 "type": "github"
4519 }
4520 },
4521 "nixos-images_4": {
4522 "inputs": {
4523 "nixos-2305": [
4524 "main-flake",
4525 "n-monitoring-1",
4526 "my-lib",
4527 "nixos-anywhere",
4528 "nixos-2305"
4529 ],
4530 "nixos-unstable": [
4531 "main-flake",
4532 "n-monitoring-1",
4533 "my-lib",
4534 "nixos-anywhere",
4535 "nixpkgs"
4536 ]
4537 },
4538 "locked": {
4539 "lastModified": 1686819168,
4540 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4541 "owner": "nix-community",
4542 "repo": "nixos-images",
4543 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4544 "type": "github"
4545 },
4546 "original": {
4547 "owner": "nix-community",
4548 "repo": "nixos-images",
4549 "type": "github"
4550 }
4551 },
4552 "nixos-images_5": {
4553 "inputs": {
4554 "nixos-2305": [
4555 "main-flake",
4556 "n-quatresaisons",
4557 "my-lib",
4558 "nixos-anywhere",
4559 "nixos-2305"
4560 ],
4561 "nixos-unstable": [
4562 "main-flake",
4563 "n-quatresaisons",
4564 "my-lib",
4565 "nixos-anywhere",
4566 "nixpkgs"
4567 ]
4568 },
4569 "locked": {
4570 "lastModified": 1686819168,
4571 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4572 "owner": "nix-community",
4573 "repo": "nixos-images",
4574 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4575 "type": "github"
4576 },
4577 "original": {
4578 "owner": "nix-community",
4579 "repo": "nixos-images",
4580 "type": "github"
4581 }
4582 },
4583 "nixos-images_6": {
4584 "inputs": {
4585 "nixos-2305": [
4586 "main-flake",
4587 "n-zoldene",
4588 "my-lib",
4589 "nixos-anywhere",
4590 "nixos-2305"
4591 ],
4592 "nixos-unstable": [
4593 "main-flake",
4594 "n-zoldene",
4595 "my-lib",
4596 "nixos-anywhere",
4597 "nixpkgs"
4598 ]
4599 },
4600 "locked": {
4601 "lastModified": 1686819168,
4602 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4603 "owner": "nix-community",
4604 "repo": "nixos-images",
4605 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4606 "type": "github"
4607 },
4608 "original": {
4609 "owner": "nix-community",
4610 "repo": "nixos-images",
4611 "type": "github"
4612 }
4613 },
4614 "nixos-images_7": {
4615 "inputs": {
4616 "nixos-2305": [
4617 "main-flake",
4618 "s-lib",
4619 "nixos-anywhere",
4620 "nixos-2305"
4621 ],
4622 "nixos-unstable": [
4623 "main-flake",
4624 "s-lib",
4625 "nixos-anywhere",
4626 "nixpkgs"
4627 ]
4628 },
4629 "locked": {
4630 "lastModified": 1686819168,
4631 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4632 "owner": "nix-community",
4633 "repo": "nixos-images",
4634 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4635 "type": "github"
4636 },
4637 "original": {
4638 "owner": "nix-community",
4639 "repo": "nixos-images",
4640 "type": "github"
4641 }
4642 },
4643 "nixpkgs": {
4644 "locked": {
4645 "lastModified": 1677383253,
4646 "narHash": "sha256-UfpzWfSxkfXHnb4boXZNaKsAcUrZT9Hw+tao1oZxd08=",
4647 "owner": "NixOS",
4648 "repo": "nixpkgs",
4649 "rev": "9952d6bc395f5841262b006fbace8dd7e143b634",
4650 "type": "github"
4651 },
4652 "original": {
4653 "owner": "NixOS",
4654 "ref": "nixpkgs-unstable",
4655 "repo": "nixpkgs",
4656 "type": "github"
4657 }
4658 },
4659 "nixpkgs-4": {
4660 "flake": false,
4661 "locked": {
4662 "lastModified": 1646497237,
4663 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4664 "owner": "NixOS",
4665 "repo": "nixpkgs",
4666 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4667 "type": "github"
4668 },
4669 "original": {
4670 "owner": "NixOS",
4671 "repo": "nixpkgs",
4672 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4673 "type": "github"
4674 }
4675 },
4676 "nixpkgs-4_2": {
4677 "flake": false,
4678 "locked": {
4679 "lastModified": 1646497237,
4680 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4681 "owner": "NixOS",
4682 "repo": "nixpkgs",
4683 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4684 "type": "github"
4685 },
4686 "original": {
4687 "owner": "NixOS",
4688 "repo": "nixpkgs",
4689 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4690 "type": "github"
4691 }
4692 },
4693 "nixpkgs-4_3": {
4694 "flake": false,
4695 "locked": {
4696 "lastModified": 1646497237,
4697 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4698 "owner": "NixOS",
4699 "repo": "nixpkgs",
4700 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4701 "type": "github"
4702 },
4703 "original": {
4704 "owner": "NixOS",
4705 "repo": "nixpkgs",
4706 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4707 "type": "github"
4708 }
4709 },
4710 "nixpkgs-4_4": {
4711 "flake": false,
4712 "locked": {
4713 "lastModified": 1646497237,
4714 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4715 "owner": "NixOS",
4716 "repo": "nixpkgs",
4717 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4718 "type": "github"
4719 },
4720 "original": {
4721 "owner": "NixOS",
4722 "repo": "nixpkgs",
4723 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4724 "type": "github"
4725 }
4726 },
4727 "nixpkgs-lib": {
4728 "locked": {
4729 "dir": "lib",
4730 "lastModified": 1691269286,
4731 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
4732 "owner": "NixOS",
4733 "repo": "nixpkgs",
4734 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
4735 "type": "github"
4736 },
4737 "original": {
4738 "dir": "lib",
4739 "owner": "NixOS",
4740 "repo": "nixpkgs",
4741 "type": "github"
4742 }
4743 },
4744 "nixpkgs-lib_10": {
4745 "locked": {
4746 "dir": "lib",
4747 "lastModified": 1675183161,
4748 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4749 "owner": "NixOS",
4750 "repo": "nixpkgs",
4751 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4752 "type": "github"
4753 },
4754 "original": {
4755 "dir": "lib",
4756 "owner": "NixOS",
4757 "ref": "nixos-unstable",
4758 "repo": "nixpkgs",
4759 "type": "github"
4760 }
4761 },
4762 "nixpkgs-lib_11": {
4763 "locked": {
4764 "dir": "lib",
4765 "lastModified": 1675183161,
4766 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4767 "owner": "NixOS",
4768 "repo": "nixpkgs",
4769 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4770 "type": "github"
4771 },
4772 "original": {
4773 "dir": "lib",
4774 "owner": "NixOS",
4775 "ref": "nixos-unstable",
4776 "repo": "nixpkgs",
4777 "type": "github"
4778 }
4779 },
4780 "nixpkgs-lib_12": {
4781 "locked": {
4782 "dir": "lib",
4783 "lastModified": 1675183161,
4784 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4785 "owner": "NixOS",
4786 "repo": "nixpkgs",
4787 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4788 "type": "github"
4789 },
4790 "original": {
4791 "dir": "lib",
4792 "owner": "NixOS",
4793 "ref": "nixos-unstable",
4794 "repo": "nixpkgs",
4795 "type": "github"
4796 }
4797 },
4798 "nixpkgs-lib_13": {
4799 "locked": {
4800 "dir": "lib",
4801 "lastModified": 1675183161,
4802 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4803 "owner": "NixOS",
4804 "repo": "nixpkgs",
4805 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4806 "type": "github"
4807 },
4808 "original": {
4809 "dir": "lib",
4810 "owner": "NixOS",
4811 "ref": "nixos-unstable",
4812 "repo": "nixpkgs",
4813 "type": "github"
4814 }
4815 },
4816 "nixpkgs-lib_14": {
4817 "locked": {
4818 "dir": "lib",
4819 "lastModified": 1691269286,
4820 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
4821 "owner": "NixOS",
4822 "repo": "nixpkgs",
4823 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
4824 "type": "github"
4825 },
4826 "original": {
4827 "dir": "lib",
4828 "owner": "NixOS",
4829 "repo": "nixpkgs",
4830 "type": "github"
4831 }
4832 },
4833 "nixpkgs-lib_15": {
4834 "locked": {
4835 "dir": "lib",
4836 "lastModified": 1685564631,
4837 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4838 "owner": "NixOS",
4839 "repo": "nixpkgs",
4840 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4841 "type": "github"
4842 },
4843 "original": {
4844 "dir": "lib",
4845 "owner": "NixOS",
4846 "ref": "nixos-unstable",
4847 "repo": "nixpkgs",
4848 "type": "github"
4849 }
4850 },
4851 "nixpkgs-lib_16": {
4852 "locked": {
4853 "dir": "lib",
4854 "lastModified": 1675183161,
4855 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4856 "owner": "NixOS",
4857 "repo": "nixpkgs",
4858 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4859 "type": "github"
4860 },
4861 "original": {
4862 "dir": "lib",
4863 "owner": "NixOS",
4864 "ref": "nixos-unstable",
4865 "repo": "nixpkgs",
4866 "type": "github"
4867 }
4868 },
4869 "nixpkgs-lib_17": {
4870 "locked": {
4871 "dir": "lib",
4872 "lastModified": 1691269286,
4873 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
4874 "owner": "NixOS",
4875 "repo": "nixpkgs",
4876 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
4877 "type": "github"
4878 },
4879 "original": {
4880 "dir": "lib",
4881 "owner": "NixOS",
4882 "repo": "nixpkgs",
4883 "type": "github"
4884 }
4885 },
4886 "nixpkgs-lib_18": {
4887 "locked": {
4888 "dir": "lib",
4889 "lastModified": 1685564631,
4890 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4891 "owner": "NixOS",
4892 "repo": "nixpkgs",
4893 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4894 "type": "github"
4895 },
4896 "original": {
4897 "dir": "lib",
4898 "owner": "NixOS",
4899 "ref": "nixos-unstable",
4900 "repo": "nixpkgs",
4901 "type": "github"
4902 }
4903 },
4904 "nixpkgs-lib_19": {
4905 "locked": {
4906 "dir": "lib",
4907 "lastModified": 1675183161,
4908 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4909 "owner": "NixOS",
4910 "repo": "nixpkgs",
4911 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4912 "type": "github"
4913 },
4914 "original": {
4915 "dir": "lib",
4916 "owner": "NixOS",
4917 "ref": "nixos-unstable",
4918 "repo": "nixpkgs",
4919 "type": "github"
4920 }
4921 },
4922 "nixpkgs-lib_2": {
4923 "locked": {
4924 "dir": "lib",
4925 "lastModified": 1685564631,
4926 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4927 "owner": "NixOS",
4928 "repo": "nixpkgs",
4929 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4930 "type": "github"
4931 },
4932 "original": {
4933 "dir": "lib",
4934 "owner": "NixOS",
4935 "ref": "nixos-unstable",
4936 "repo": "nixpkgs",
4937 "type": "github"
4938 }
4939 },
4940 "nixpkgs-lib_20": {
4941 "locked": {
4942 "dir": "lib",
4943 "lastModified": 1685564631,
4944 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4945 "owner": "NixOS",
4946 "repo": "nixpkgs",
4947 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4948 "type": "github"
4949 },
4950 "original": {
4951 "dir": "lib",
4952 "owner": "NixOS",
4953 "ref": "nixos-unstable",
4954 "repo": "nixpkgs",
4955 "type": "github"
4956 }
4957 },
4958 "nixpkgs-lib_21": {
4959 "locked": {
4960 "dir": "lib",
4961 "lastModified": 1675183161,
4962 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4963 "owner": "NixOS",
4964 "repo": "nixpkgs",
4965 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4966 "type": "github"
4967 },
4968 "original": {
4969 "dir": "lib",
4970 "owner": "NixOS",
4971 "ref": "nixos-unstable",
4972 "repo": "nixpkgs",
4973 "type": "github"
4974 }
4975 },
4976 "nixpkgs-lib_22": {
4977 "locked": {
4978 "dir": "lib",
4979 "lastModified": 1675183161,
4980 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4981 "owner": "NixOS",
4982 "repo": "nixpkgs",
4983 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4984 "type": "github"
4985 },
4986 "original": {
4987 "dir": "lib",
4988 "owner": "NixOS",
4989 "ref": "nixos-unstable",
4990 "repo": "nixpkgs",
4991 "type": "github"
4992 }
4993 },
4994 "nixpkgs-lib_23": {
4995 "locked": {
4996 "dir": "lib",
4997 "lastModified": 1675183161,
4998 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4999 "owner": "NixOS",
5000 "repo": "nixpkgs",
5001 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5002 "type": "github"
5003 },
5004 "original": {
5005 "dir": "lib",
5006 "owner": "NixOS",
5007 "ref": "nixos-unstable",
5008 "repo": "nixpkgs",
5009 "type": "github"
5010 }
5011 },
5012 "nixpkgs-lib_24": {
5013 "locked": {
5014 "dir": "lib",
5015 "lastModified": 1685564631,
5016 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
5017 "owner": "NixOS",
5018 "repo": "nixpkgs",
5019 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
5020 "type": "github"
5021 },
5022 "original": {
5023 "dir": "lib",
5024 "owner": "NixOS",
5025 "ref": "nixos-unstable",
5026 "repo": "nixpkgs",
5027 "type": "github"
5028 }
5029 },
5030 "nixpkgs-lib_25": {
5031 "locked": {
5032 "dir": "lib",
5033 "lastModified": 1675183161,
5034 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5035 "owner": "NixOS",
5036 "repo": "nixpkgs",
5037 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5038 "type": "github"
5039 },
5040 "original": {
5041 "dir": "lib",
5042 "owner": "NixOS",
5043 "ref": "nixos-unstable",
5044 "repo": "nixpkgs",
5045 "type": "github"
5046 }
5047 },
5048 "nixpkgs-lib_26": {
5049 "locked": {
5050 "dir": "lib",
5051 "lastModified": 1691269286,
5052 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
5053 "owner": "NixOS",
5054 "repo": "nixpkgs",
5055 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
5056 "type": "github"
5057 },
5058 "original": {
5059 "dir": "lib",
5060 "owner": "NixOS",
5061 "repo": "nixpkgs",
5062 "type": "github"
5063 }
5064 },
5065 "nixpkgs-lib_27": {
5066 "locked": {
5067 "dir": "lib",
5068 "lastModified": 1675183161,
5069 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5070 "owner": "NixOS",
5071 "repo": "nixpkgs",
5072 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5073 "type": "github"
5074 },
5075 "original": {
5076 "dir": "lib",
5077 "owner": "NixOS",
5078 "ref": "nixos-unstable",
5079 "repo": "nixpkgs",
5080 "type": "github"
5081 }
5082 },
5083 "nixpkgs-lib_28": {
5084 "locked": {
5085 "dir": "lib",
5086 "lastModified": 1675183161,
5087 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5088 "owner": "NixOS",
5089 "repo": "nixpkgs",
5090 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5091 "type": "github"
5092 },
5093 "original": {
5094 "dir": "lib",
5095 "owner": "NixOS",
5096 "ref": "nixos-unstable",
5097 "repo": "nixpkgs",
5098 "type": "github"
5099 }
5100 },
5101 "nixpkgs-lib_3": {
5102 "locked": {
5103 "dir": "lib",
5104 "lastModified": 1675183161,
5105 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5106 "owner": "NixOS",
5107 "repo": "nixpkgs",
5108 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5109 "type": "github"
5110 },
5111 "original": {
5112 "dir": "lib",
5113 "owner": "NixOS",
5114 "ref": "nixos-unstable",
5115 "repo": "nixpkgs",
5116 "type": "github"
5117 }
5118 },
5119 "nixpkgs-lib_4": {
5120 "locked": {
5121 "dir": "lib",
5122 "lastModified": 1691269286,
5123 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
5124 "owner": "NixOS",
5125 "repo": "nixpkgs",
5126 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
5127 "type": "github"
5128 },
5129 "original": {
5130 "dir": "lib",
5131 "owner": "NixOS",
5132 "repo": "nixpkgs",
5133 "type": "github"
5134 }
5135 },
5136 "nixpkgs-lib_5": {
5137 "locked": {
5138 "dir": "lib",
5139 "lastModified": 1685564631,
5140 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
5141 "owner": "NixOS",
5142 "repo": "nixpkgs",
5143 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
5144 "type": "github"
5145 },
5146 "original": {
5147 "dir": "lib",
5148 "owner": "NixOS",
5149 "ref": "nixos-unstable",
5150 "repo": "nixpkgs",
5151 "type": "github"
5152 }
5153 },
5154 "nixpkgs-lib_6": {
5155 "locked": {
5156 "dir": "lib",
5157 "lastModified": 1675183161,
5158 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5159 "owner": "NixOS",
5160 "repo": "nixpkgs",
5161 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5162 "type": "github"
5163 },
5164 "original": {
5165 "dir": "lib",
5166 "owner": "NixOS",
5167 "ref": "nixos-unstable",
5168 "repo": "nixpkgs",
5169 "type": "github"
5170 }
5171 },
5172 "nixpkgs-lib_7": {
5173 "locked": {
5174 "dir": "lib",
5175 "lastModified": 1685564631,
5176 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
5177 "owner": "NixOS",
5178 "repo": "nixpkgs",
5179 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
5180 "type": "github"
5181 },
5182 "original": {
5183 "dir": "lib",
5184 "owner": "NixOS",
5185 "ref": "nixos-unstable",
5186 "repo": "nixpkgs",
5187 "type": "github"
5188 }
5189 },
5190 "nixpkgs-lib_8": {
5191 "locked": {
5192 "dir": "lib",
5193 "lastModified": 1691269286,
5194 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
5195 "owner": "NixOS",
5196 "repo": "nixpkgs",
5197 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
5198 "type": "github"
5199 },
5200 "original": {
5201 "dir": "lib",
5202 "owner": "NixOS",
5203 "repo": "nixpkgs",
5204 "type": "github"
5205 }
5206 },
5207 "nixpkgs-lib_9": {
5208 "locked": {
5209 "dir": "lib",
5210 "lastModified": 1675183161,
5211 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5212 "owner": "NixOS",
5213 "repo": "nixpkgs",
5214 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5215 "type": "github"
5216 },
5217 "original": {
5218 "dir": "lib",
5219 "owner": "NixOS",
5220 "ref": "nixos-unstable",
5221 "repo": "nixpkgs",
5222 "type": "github"
5223 }
5224 },
5225 "nixpkgs_10": {
5226 "locked": {
5227 "lastModified": 1597943282,
5228 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5229 "owner": "NixOS",
5230 "repo": "nixpkgs",
5231 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5232 "type": "github"
5233 },
5234 "original": {
5235 "owner": "NixOS",
5236 "repo": "nixpkgs",
5237 "type": "github"
5238 }
5239 },
5240 "nixpkgs_100": {
5241 "flake": false,
5242 "locked": {
5243 "lastModified": 1596265691,
5244 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5245 "owner": "NixOS",
5246 "repo": "nixpkgs",
5247 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5248 "type": "github"
5249 },
5250 "original": {
5251 "owner": "NixOS",
5252 "repo": "nixpkgs",
5253 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5254 "type": "github"
5255 }
5256 },
5257 "nixpkgs_101": {
5258 "locked": {
5259 "lastModified": 1687502512,
5260 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5261 "owner": "NixOS",
5262 "repo": "nixpkgs",
5263 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5264 "type": "github"
5265 },
5266 "original": {
5267 "owner": "NixOS",
5268 "ref": "nixos-unstable",
5269 "repo": "nixpkgs",
5270 "type": "github"
5271 }
5272 },
5273 "nixpkgs_102": {
5274 "locked": {
5275 "lastModified": 1646497237,
5276 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5277 "owner": "nixos",
5278 "repo": "nixpkgs",
5279 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5280 "type": "github"
5281 },
5282 "original": {
5283 "owner": "nixos",
5284 "repo": "nixpkgs",
5285 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5286 "type": "github"
5287 }
5288 },
5289 "nixpkgs_103": {
5290 "locked": {
5291 "lastModified": 1646497237,
5292 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5293 "owner": "nixos",
5294 "repo": "nixpkgs",
5295 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5296 "type": "github"
5297 },
5298 "original": {
5299 "owner": "nixos",
5300 "repo": "nixpkgs",
5301 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5302 "type": "github"
5303 }
5304 },
5305 "nixpkgs_104": {
5306 "flake": false,
5307 "locked": {
5308 "lastModified": 1596265691,
5309 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5310 "owner": "NixOS",
5311 "repo": "nixpkgs",
5312 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5313 "type": "github"
5314 },
5315 "original": {
5316 "owner": "NixOS",
5317 "repo": "nixpkgs",
5318 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5319 "type": "github"
5320 }
5321 },
5322 "nixpkgs_105": {
5323 "flake": false,
5324 "locked": {
5325 "lastModified": 1596265691,
5326 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5327 "owner": "NixOS",
5328 "repo": "nixpkgs",
5329 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5330 "type": "github"
5331 },
5332 "original": {
5333 "owner": "NixOS",
5334 "repo": "nixpkgs",
5335 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5336 "type": "github"
5337 }
5338 },
5339 "nixpkgs_106": {
5340 "locked": {
5341 "dir": "lib",
5342 "lastModified": 1691472822,
5343 "narHash": "sha256-XVfYZ2oB3lNPVq6sHCY9WkdQ8lHoIDzzbpg8bB6oBxA=",
5344 "owner": "NixOS",
5345 "repo": "nixpkgs",
5346 "rev": "41c7605718399dcfa53dd7083793b6ae3bc969ff",
5347 "type": "github"
5348 },
5349 "original": {
5350 "dir": "lib",
5351 "owner": "NixOS",
5352 "ref": "nixos-unstable",
5353 "repo": "nixpkgs",
5354 "type": "github"
5355 }
5356 },
5357 "nixpkgs_107": {
5358 "locked": {
5359 "lastModified": 1646497237,
5360 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5361 "owner": "nixos",
5362 "repo": "nixpkgs",
5363 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5364 "type": "github"
5365 },
5366 "original": {
5367 "owner": "nixos",
5368 "repo": "nixpkgs",
5369 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5370 "type": "github"
5371 }
5372 },
5373 "nixpkgs_11": {
5374 "locked": {
5375 "lastModified": 1687502512,
5376 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5377 "owner": "NixOS",
5378 "repo": "nixpkgs",
5379 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5380 "type": "github"
5381 },
5382 "original": {
5383 "owner": "NixOS",
5384 "ref": "nixos-unstable",
5385 "repo": "nixpkgs",
5386 "type": "github"
5387 }
5388 },
5389 "nixpkgs_12": {
5390 "locked": {
5391 "lastModified": 1646497237,
5392 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5393 "owner": "nixos",
5394 "repo": "nixpkgs",
5395 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5396 "type": "github"
5397 },
5398 "original": {
5399 "owner": "nixos",
5400 "repo": "nixpkgs",
5401 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5402 "type": "github"
5403 }
5404 },
5405 "nixpkgs_13": {
5406 "locked": {
5407 "lastModified": 1683408522,
5408 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
5409 "owner": "NixOS",
5410 "repo": "nixpkgs",
5411 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
5412 "type": "github"
5413 },
5414 "original": {
5415 "owner": "NixOS",
5416 "ref": "nixos-unstable",
5417 "repo": "nixpkgs",
5418 "type": "github"
5419 }
5420 },
5421 "nixpkgs_14": {
5422 "locked": {
5423 "lastModified": 1687701825,
5424 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
5425 "owner": "NixOS",
5426 "repo": "nixpkgs",
5427 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
5428 "type": "github"
5429 },
5430 "original": {
5431 "owner": "NixOS",
5432 "ref": "nixpkgs-unstable",
5433 "repo": "nixpkgs",
5434 "type": "github"
5435 }
5436 },
5437 "nixpkgs_15": {
5438 "locked": {
5439 "lastModified": 1687893427,
5440 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
5441 "owner": "nixos",
5442 "repo": "nixpkgs",
5443 "rev": "4b14ab2a916508442e685089672681dff46805be",
5444 "type": "github"
5445 },
5446 "original": {
5447 "owner": "nixos",
5448 "ref": "nixos-unstable-small",
5449 "repo": "nixpkgs",
5450 "type": "github"
5451 }
5452 },
5453 "nixpkgs_16": {
5454 "locked": {
5455 "lastModified": 1648725829,
5456 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
5457 "owner": "NixOS",
5458 "repo": "nixpkgs",
5459 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
5460 "type": "github"
5461 },
5462 "original": {
5463 "owner": "NixOS",
5464 "repo": "nixpkgs",
5465 "type": "github"
5466 }
5467 },
5468 "nixpkgs_17": {
5469 "locked": {
5470 "lastModified": 1693158576,
5471 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
5472 "owner": "nixos",
5473 "repo": "nixpkgs",
5474 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
5475 "type": "github"
5476 },
5477 "original": {
5478 "owner": "nixos",
5479 "ref": "nixos-unstable",
5480 "repo": "nixpkgs",
5481 "type": "github"
5482 }
5483 },
5484 "nixpkgs_18": {
5485 "locked": {
5486 "lastModified": 1687502512,
5487 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5488 "owner": "NixOS",
5489 "repo": "nixpkgs",
5490 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5491 "type": "github"
5492 },
5493 "original": {
5494 "owner": "NixOS",
5495 "ref": "nixos-unstable",
5496 "repo": "nixpkgs",
5497 "type": "github"
5498 }
5499 },
5500 "nixpkgs_19": {
5501 "locked": {
5502 "lastModified": 1646497237,
5503 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5504 "owner": "nixos",
5505 "repo": "nixpkgs",
5506 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5507 "type": "github"
5508 },
5509 "original": {
5510 "owner": "nixos",
5511 "repo": "nixpkgs",
5512 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5513 "type": "github"
5514 }
5515 },
5516 "nixpkgs_2": {
5517 "locked": {
5518 "lastModified": 1597943282,
5519 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5520 "owner": "NixOS",
5521 "repo": "nixpkgs",
5522 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5523 "type": "github"
5524 },
5525 "original": {
5526 "owner": "NixOS",
5527 "repo": "nixpkgs",
5528 "type": "github"
5529 }
5530 },
5531 "nixpkgs_20": {
5532 "locked": {
5533 "lastModified": 1683408522,
5534 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
5535 "owner": "NixOS",
5536 "repo": "nixpkgs",
5537 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
5538 "type": "github"
5539 },
5540 "original": {
5541 "owner": "NixOS",
5542 "ref": "nixos-unstable",
5543 "repo": "nixpkgs",
5544 "type": "github"
5545 }
5546 },
5547 "nixpkgs_21": {
5548 "locked": {
5549 "lastModified": 1687701825,
5550 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
5551 "owner": "NixOS",
5552 "repo": "nixpkgs",
5553 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
5554 "type": "github"
5555 },
5556 "original": {
5557 "owner": "NixOS",
5558 "ref": "nixpkgs-unstable",
5559 "repo": "nixpkgs",
5560 "type": "github"
5561 }
5562 },
5563 "nixpkgs_22": {
5564 "locked": {
5565 "lastModified": 1687893427,
5566 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
5567 "owner": "nixos",
5568 "repo": "nixpkgs",
5569 "rev": "4b14ab2a916508442e685089672681dff46805be",
5570 "type": "github"
5571 },
5572 "original": {
5573 "owner": "nixos",
5574 "ref": "nixos-unstable-small",
5575 "repo": "nixpkgs",
5576 "type": "github"
5577 }
5578 },
5579 "nixpkgs_23": {
5580 "locked": {
5581 "lastModified": 1648725829,
5582 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
5583 "owner": "NixOS",
5584 "repo": "nixpkgs",
5585 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
5586 "type": "github"
5587 },
5588 "original": {
5589 "owner": "NixOS",
5590 "repo": "nixpkgs",
5591 "type": "github"
5592 }
5593 },
5594 "nixpkgs_24": {
5595 "locked": {
5596 "lastModified": 1693158576,
5597 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
5598 "owner": "nixos",
5599 "repo": "nixpkgs",
5600 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
5601 "type": "github"
5602 },
5603 "original": {
5604 "owner": "nixos",
5605 "ref": "nixos-unstable",
5606 "repo": "nixpkgs",
5607 "type": "github"
5608 }
5609 },
5610 "nixpkgs_25": {
5611 "flake": false,
5612 "locked": {
5613 "lastModified": 1596265691,
5614 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5615 "owner": "NixOS",
5616 "repo": "nixpkgs",
5617 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5618 "type": "github"
5619 },
5620 "original": {
5621 "owner": "NixOS",
5622 "repo": "nixpkgs",
5623 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5624 "type": "github"
5625 }
5626 },
5627 "nixpkgs_26": {
5628 "locked": {
5629 "lastModified": 1597943282,
5630 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5631 "owner": "NixOS",
5632 "repo": "nixpkgs",
5633 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5634 "type": "github"
5635 },
5636 "original": {
5637 "owner": "NixOS",
5638 "repo": "nixpkgs",
5639 "type": "github"
5640 }
5641 },
5642 "nixpkgs_27": {
5643 "locked": {
5644 "lastModified": 1597943282,
5645 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5646 "owner": "NixOS",
5647 "repo": "nixpkgs",
5648 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5649 "type": "github"
5650 },
5651 "original": {
5652 "owner": "NixOS",
5653 "repo": "nixpkgs",
5654 "type": "github"
5655 }
5656 },
5657 "nixpkgs_28": {
5658 "locked": {
5659 "lastModified": 1597943282,
5660 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5661 "owner": "NixOS",
5662 "repo": "nixpkgs",
5663 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5664 "type": "github"
5665 },
5666 "original": {
5667 "owner": "NixOS",
5668 "repo": "nixpkgs",
5669 "type": "github"
5670 }
5671 },
5672 "nixpkgs_29": {
5673 "locked": {
5674 "lastModified": 1597943282,
5675 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5676 "owner": "NixOS",
5677 "repo": "nixpkgs",
5678 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5679 "type": "github"
5680 },
5681 "original": {
5682 "owner": "NixOS",
5683 "repo": "nixpkgs",
5684 "type": "github"
5685 }
5686 },
5687 "nixpkgs_3": {
5688 "locked": {
5689 "lastModified": 1597943282,
5690 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5691 "owner": "NixOS",
5692 "repo": "nixpkgs",
5693 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5694 "type": "github"
5695 },
5696 "original": {
5697 "owner": "NixOS",
5698 "repo": "nixpkgs",
5699 "type": "github"
5700 }
5701 },
5702 "nixpkgs_30": {
5703 "locked": {
5704 "lastModified": 1631570365,
5705 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
5706 "owner": "NixOS",
5707 "repo": "nixpkgs",
5708 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
5709 "type": "github"
5710 },
5711 "original": {
5712 "owner": "NixOS",
5713 "repo": "nixpkgs",
5714 "type": "github"
5715 }
5716 },
5717 "nixpkgs_31": {
5718 "locked": {
5719 "lastModified": 1611097871,
5720 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
5721 "owner": "NixOS",
5722 "repo": "nixpkgs",
5723 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
5724 "type": "github"
5725 },
5726 "original": {
5727 "owner": "NixOS",
5728 "repo": "nixpkgs",
5729 "type": "github"
5730 }
5731 },
5732 "nixpkgs_32": {
5733 "locked": {
5734 "lastModified": 1611097871,
5735 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
5736 "owner": "NixOS",
5737 "repo": "nixpkgs",
5738 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
5739 "type": "github"
5740 },
5741 "original": {
5742 "owner": "NixOS",
5743 "repo": "nixpkgs",
5744 "type": "github"
5745 }
5746 },
5747 "nixpkgs_33": {
5748 "flake": false,
5749 "locked": {
5750 "lastModified": 1596265691,
5751 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5752 "owner": "NixOS",
5753 "repo": "nixpkgs",
5754 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5755 "type": "github"
5756 },
5757 "original": {
5758 "owner": "NixOS",
5759 "repo": "nixpkgs",
5760 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5761 "type": "github"
5762 }
5763 },
5764 "nixpkgs_34": {
5765 "locked": {
5766 "lastModified": 1687502512,
5767 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5768 "owner": "NixOS",
5769 "repo": "nixpkgs",
5770 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5771 "type": "github"
5772 },
5773 "original": {
5774 "owner": "NixOS",
5775 "ref": "nixos-unstable",
5776 "repo": "nixpkgs",
5777 "type": "github"
5778 }
5779 },
5780 "nixpkgs_35": {
5781 "locked": {
5782 "lastModified": 1646497237,
5783 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5784 "owner": "nixos",
5785 "repo": "nixpkgs",
5786 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5787 "type": "github"
5788 },
5789 "original": {
5790 "owner": "nixos",
5791 "repo": "nixpkgs",
5792 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5793 "type": "github"
5794 }
5795 },
5796 "nixpkgs_36": {
5797 "locked": {
5798 "lastModified": 1633901457,
5799 "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
5800 "owner": "NixOS",
5801 "repo": "nixpkgs",
5802 "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
5803 "type": "github"
5804 },
5805 "original": {
5806 "owner": "NixOS",
5807 "repo": "nixpkgs",
5808 "type": "github"
5809 }
5810 },
5811 "nixpkgs_37": {
5812 "flake": false,
5813 "locked": {
5814 "lastModified": 1596265691,
5815 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5816 "owner": "NixOS",
5817 "repo": "nixpkgs",
5818 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5819 "type": "github"
5820 },
5821 "original": {
5822 "owner": "NixOS",
5823 "repo": "nixpkgs",
5824 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5825 "type": "github"
5826 }
5827 },
5828 "nixpkgs_38": {
5829 "locked": {
5830 "lastModified": 1646497237,
5831 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5832 "owner": "nixos",
5833 "repo": "nixpkgs",
5834 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5835 "type": "github"
5836 },
5837 "original": {
5838 "owner": "nixos",
5839 "repo": "nixpkgs",
5840 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5841 "type": "github"
5842 }
5843 },
5844 "nixpkgs_39": {
5845 "flake": false,
5846 "locked": {
5847 "lastModified": 1596265691,
5848 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5849 "owner": "NixOS",
5850 "repo": "nixpkgs",
5851 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5852 "type": "github"
5853 },
5854 "original": {
5855 "owner": "NixOS",
5856 "repo": "nixpkgs",
5857 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5858 "type": "github"
5859 }
5860 },
5861 "nixpkgs_4": {
5862 "locked": {
5863 "lastModified": 1683408522,
5864 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
5865 "owner": "NixOS",
5866 "repo": "nixpkgs",
5867 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
5868 "type": "github"
5869 },
5870 "original": {
5871 "owner": "NixOS",
5872 "ref": "nixos-unstable",
5873 "repo": "nixpkgs",
5874 "type": "github"
5875 }
5876 },
5877 "nixpkgs_40": {
5878 "locked": {
5879 "lastModified": 1646497237,
5880 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5881 "owner": "nixos",
5882 "repo": "nixpkgs",
5883 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5884 "type": "github"
5885 },
5886 "original": {
5887 "owner": "nixos",
5888 "repo": "nixpkgs",
5889 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5890 "type": "github"
5891 }
5892 },
5893 "nixpkgs_41": {
5894 "flake": false,
5895 "locked": {
5896 "lastModified": 1596265691,
5897 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5898 "owner": "NixOS",
5899 "repo": "nixpkgs",
5900 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5901 "type": "github"
5902 },
5903 "original": {
5904 "owner": "NixOS",
5905 "repo": "nixpkgs",
5906 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5907 "type": "github"
5908 }
5909 },
5910 "nixpkgs_42": {
5911 "flake": false,
5912 "locked": {
5913 "lastModified": 1596265691,
5914 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5915 "owner": "NixOS",
5916 "repo": "nixpkgs",
5917 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5918 "type": "github"
5919 },
5920 "original": {
5921 "owner": "NixOS",
5922 "repo": "nixpkgs",
5923 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5924 "type": "github"
5925 }
5926 },
5927 "nixpkgs_43": {
5928 "flake": false,
5929 "locked": {
5930 "lastModified": 1596265691,
5931 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5932 "owner": "NixOS",
5933 "repo": "nixpkgs",
5934 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5935 "type": "github"
5936 },
5937 "original": {
5938 "owner": "NixOS",
5939 "repo": "nixpkgs",
5940 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5941 "type": "github"
5942 }
5943 },
5944 "nixpkgs_44": {
5945 "locked": {
5946 "lastModified": 1646497237,
5947 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5948 "owner": "nixos",
5949 "repo": "nixpkgs",
5950 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5951 "type": "github"
5952 },
5953 "original": {
5954 "owner": "nixos",
5955 "repo": "nixpkgs",
5956 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5957 "type": "github"
5958 }
5959 },
5960 "nixpkgs_45": {
5961 "locked": {
5962 "lastModified": 1597943282,
5963 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5964 "owner": "NixOS",
5965 "repo": "nixpkgs",
5966 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5967 "type": "github"
5968 },
5969 "original": {
5970 "owner": "NixOS",
5971 "repo": "nixpkgs",
5972 "type": "github"
5973 }
5974 },
5975 "nixpkgs_46": {
5976 "locked": {
5977 "lastModified": 1597943282,
5978 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5979 "owner": "NixOS",
5980 "repo": "nixpkgs",
5981 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5982 "type": "github"
5983 },
5984 "original": {
5985 "owner": "NixOS",
5986 "repo": "nixpkgs",
5987 "type": "github"
5988 }
5989 },
5990 "nixpkgs_47": {
5991 "locked": {
5992 "lastModified": 1611097871,
5993 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
5994 "owner": "NixOS",
5995 "repo": "nixpkgs",
5996 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
5997 "type": "github"
5998 },
5999 "original": {
6000 "owner": "NixOS",
6001 "repo": "nixpkgs",
6002 "type": "github"
6003 }
6004 },
6005 "nixpkgs_48": {
6006 "locked": {
6007 "lastModified": 1646497237,
6008 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6009 "owner": "nixos",
6010 "repo": "nixpkgs",
6011 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6012 "type": "github"
6013 },
6014 "original": {
6015 "owner": "nixos",
6016 "repo": "nixpkgs",
6017 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6018 "type": "github"
6019 }
6020 },
6021 "nixpkgs_49": {
6022 "flake": false,
6023 "locked": {
6024 "lastModified": 1596265691,
6025 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6026 "owner": "NixOS",
6027 "repo": "nixpkgs",
6028 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6029 "type": "github"
6030 },
6031 "original": {
6032 "owner": "NixOS",
6033 "repo": "nixpkgs",
6034 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6035 "type": "github"
6036 }
6037 },
6038 "nixpkgs_5": {
6039 "locked": {
6040 "lastModified": 1687701825,
6041 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6042 "owner": "NixOS",
6043 "repo": "nixpkgs",
6044 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6045 "type": "github"
6046 },
6047 "original": {
6048 "owner": "NixOS",
6049 "ref": "nixpkgs-unstable",
6050 "repo": "nixpkgs",
6051 "type": "github"
6052 }
6053 },
6054 "nixpkgs_50": {
6055 "flake": false,
6056 "locked": {
6057 "lastModified": 1596265691,
6058 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6059 "owner": "NixOS",
6060 "repo": "nixpkgs",
6061 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6062 "type": "github"
6063 },
6064 "original": {
6065 "owner": "NixOS",
6066 "repo": "nixpkgs",
6067 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6068 "type": "github"
6069 }
6070 },
6071 "nixpkgs_51": {
6072 "locked": {
6073 "lastModified": 1683408522,
6074 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
6075 "owner": "NixOS",
6076 "repo": "nixpkgs",
6077 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
6078 "type": "github"
6079 },
6080 "original": {
6081 "owner": "NixOS",
6082 "ref": "nixos-unstable",
6083 "repo": "nixpkgs",
6084 "type": "github"
6085 }
6086 },
6087 "nixpkgs_52": {
6088 "locked": {
6089 "lastModified": 1687701825,
6090 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6091 "owner": "NixOS",
6092 "repo": "nixpkgs",
6093 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6094 "type": "github"
6095 },
6096 "original": {
6097 "owner": "NixOS",
6098 "ref": "nixpkgs-unstable",
6099 "repo": "nixpkgs",
6100 "type": "github"
6101 }
6102 },
6103 "nixpkgs_53": {
6104 "locked": {
6105 "lastModified": 1687893427,
6106 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6107 "owner": "nixos",
6108 "repo": "nixpkgs",
6109 "rev": "4b14ab2a916508442e685089672681dff46805be",
6110 "type": "github"
6111 },
6112 "original": {
6113 "owner": "nixos",
6114 "ref": "nixos-unstable-small",
6115 "repo": "nixpkgs",
6116 "type": "github"
6117 }
6118 },
6119 "nixpkgs_54": {
6120 "locked": {
6121 "lastModified": 1648725829,
6122 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6123 "owner": "NixOS",
6124 "repo": "nixpkgs",
6125 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6126 "type": "github"
6127 },
6128 "original": {
6129 "owner": "NixOS",
6130 "repo": "nixpkgs",
6131 "type": "github"
6132 }
6133 },
6134 "nixpkgs_55": {
6135 "locked": {
6136 "lastModified": 1693158576,
6137 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
6138 "owner": "nixos",
6139 "repo": "nixpkgs",
6140 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
6141 "type": "github"
6142 },
6143 "original": {
6144 "owner": "nixos",
6145 "ref": "nixos-unstable",
6146 "repo": "nixpkgs",
6147 "type": "github"
6148 }
6149 },
6150 "nixpkgs_56": {
6151 "flake": false,
6152 "locked": {
6153 "lastModified": 1596265691,
6154 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6155 "owner": "NixOS",
6156 "repo": "nixpkgs",
6157 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6158 "type": "github"
6159 },
6160 "original": {
6161 "owner": "NixOS",
6162 "repo": "nixpkgs",
6163 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6164 "type": "github"
6165 }
6166 },
6167 "nixpkgs_57": {
6168 "locked": {
6169 "lastModified": 1687502512,
6170 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
6171 "owner": "NixOS",
6172 "repo": "nixpkgs",
6173 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6174 "type": "github"
6175 },
6176 "original": {
6177 "owner": "NixOS",
6178 "ref": "nixos-unstable",
6179 "repo": "nixpkgs",
6180 "type": "github"
6181 }
6182 },
6183 "nixpkgs_58": {
6184 "locked": {
6185 "lastModified": 1646497237,
6186 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6187 "owner": "nixos",
6188 "repo": "nixpkgs",
6189 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6190 "type": "github"
6191 },
6192 "original": {
6193 "owner": "nixos",
6194 "repo": "nixpkgs",
6195 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6196 "type": "github"
6197 }
6198 },
6199 "nixpkgs_59": {
6200 "locked": {
6201 "lastModified": 1683408522,
6202 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
6203 "owner": "NixOS",
6204 "repo": "nixpkgs",
6205 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
6206 "type": "github"
6207 },
6208 "original": {
6209 "owner": "NixOS",
6210 "ref": "nixos-unstable",
6211 "repo": "nixpkgs",
6212 "type": "github"
6213 }
6214 },
6215 "nixpkgs_6": {
6216 "locked": {
6217 "lastModified": 1687893427,
6218 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6219 "owner": "nixos",
6220 "repo": "nixpkgs",
6221 "rev": "4b14ab2a916508442e685089672681dff46805be",
6222 "type": "github"
6223 },
6224 "original": {
6225 "owner": "nixos",
6226 "ref": "nixos-unstable-small",
6227 "repo": "nixpkgs",
6228 "type": "github"
6229 }
6230 },
6231 "nixpkgs_60": {
6232 "locked": {
6233 "lastModified": 1687701825,
6234 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6235 "owner": "NixOS",
6236 "repo": "nixpkgs",
6237 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6238 "type": "github"
6239 },
6240 "original": {
6241 "owner": "NixOS",
6242 "ref": "nixpkgs-unstable",
6243 "repo": "nixpkgs",
6244 "type": "github"
6245 }
6246 },
6247 "nixpkgs_61": {
6248 "locked": {
6249 "lastModified": 1687893427,
6250 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6251 "owner": "nixos",
6252 "repo": "nixpkgs",
6253 "rev": "4b14ab2a916508442e685089672681dff46805be",
6254 "type": "github"
6255 },
6256 "original": {
6257 "owner": "nixos",
6258 "ref": "nixos-unstable-small",
6259 "repo": "nixpkgs",
6260 "type": "github"
6261 }
6262 },
6263 "nixpkgs_62": {
6264 "locked": {
6265 "lastModified": 1648725829,
6266 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6267 "owner": "NixOS",
6268 "repo": "nixpkgs",
6269 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6270 "type": "github"
6271 },
6272 "original": {
6273 "owner": "NixOS",
6274 "repo": "nixpkgs",
6275 "type": "github"
6276 }
6277 },
6278 "nixpkgs_63": {
6279 "locked": {
6280 "lastModified": 1693158576,
6281 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
6282 "owner": "nixos",
6283 "repo": "nixpkgs",
6284 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
6285 "type": "github"
6286 },
6287 "original": {
6288 "owner": "nixos",
6289 "ref": "nixos-unstable",
6290 "repo": "nixpkgs",
6291 "type": "github"
6292 }
6293 },
6294 "nixpkgs_64": {
6295 "flake": false,
6296 "locked": {
6297 "lastModified": 1596265691,
6298 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6299 "owner": "NixOS",
6300 "repo": "nixpkgs",
6301 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6302 "type": "github"
6303 },
6304 "original": {
6305 "owner": "NixOS",
6306 "repo": "nixpkgs",
6307 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6308 "type": "github"
6309 }
6310 },
6311 "nixpkgs_65": {
6312 "locked": {
6313 "lastModified": 1687502512,
6314 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
6315 "owner": "NixOS",
6316 "repo": "nixpkgs",
6317 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6318 "type": "github"
6319 },
6320 "original": {
6321 "owner": "NixOS",
6322 "ref": "nixos-unstable",
6323 "repo": "nixpkgs",
6324 "type": "github"
6325 }
6326 },
6327 "nixpkgs_66": {
6328 "locked": {
6329 "lastModified": 1646497237,
6330 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6331 "owner": "nixos",
6332 "repo": "nixpkgs",
6333 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6334 "type": "github"
6335 },
6336 "original": {
6337 "owner": "nixos",
6338 "repo": "nixpkgs",
6339 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6340 "type": "github"
6341 }
6342 },
6343 "nixpkgs_67": {
6344 "locked": {
6345 "lastModified": 1683408522,
6346 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
6347 "owner": "NixOS",
6348 "repo": "nixpkgs",
6349 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
6350 "type": "github"
6351 },
6352 "original": {
6353 "owner": "NixOS",
6354 "ref": "nixos-unstable",
6355 "repo": "nixpkgs",
6356 "type": "github"
6357 }
6358 },
6359 "nixpkgs_68": {
6360 "locked": {
6361 "lastModified": 1687701825,
6362 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6363 "owner": "NixOS",
6364 "repo": "nixpkgs",
6365 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6366 "type": "github"
6367 },
6368 "original": {
6369 "owner": "NixOS",
6370 "ref": "nixpkgs-unstable",
6371 "repo": "nixpkgs",
6372 "type": "github"
6373 }
6374 },
6375 "nixpkgs_69": {
6376 "locked": {
6377 "lastModified": 1687893427,
6378 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6379 "owner": "nixos",
6380 "repo": "nixpkgs",
6381 "rev": "4b14ab2a916508442e685089672681dff46805be",
6382 "type": "github"
6383 },
6384 "original": {
6385 "owner": "nixos",
6386 "ref": "nixos-unstable-small",
6387 "repo": "nixpkgs",
6388 "type": "github"
6389 }
6390 },
6391 "nixpkgs_7": {
6392 "locked": {
6393 "lastModified": 1648725829,
6394 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6395 "owner": "NixOS",
6396 "repo": "nixpkgs",
6397 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6398 "type": "github"
6399 },
6400 "original": {
6401 "owner": "NixOS",
6402 "repo": "nixpkgs",
6403 "type": "github"
6404 }
6405 },
6406 "nixpkgs_70": {
6407 "locked": {
6408 "lastModified": 1648725829,
6409 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6410 "owner": "NixOS",
6411 "repo": "nixpkgs",
6412 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6413 "type": "github"
6414 },
6415 "original": {
6416 "owner": "NixOS",
6417 "repo": "nixpkgs",
6418 "type": "github"
6419 }
6420 },
6421 "nixpkgs_71": {
6422 "locked": {
6423 "lastModified": 1693158576,
6424 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
6425 "owner": "nixos",
6426 "repo": "nixpkgs",
6427 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
6428 "type": "github"
6429 },
6430 "original": {
6431 "owner": "NixOS",
6432 "ref": "nixos-unstable",
6433 "repo": "nixpkgs",
6434 "type": "github"
6435 }
6436 },
6437 "nixpkgs_72": {
6438 "locked": {
6439 "lastModified": 1687502512,
6440 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
6441 "owner": "NixOS",
6442 "repo": "nixpkgs",
6443 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6444 "type": "github"
6445 },
6446 "original": {
6447 "owner": "NixOS",
6448 "ref": "nixos-unstable",
6449 "repo": "nixpkgs",
6450 "type": "github"
6451 }
6452 },
6453 "nixpkgs_73": {
6454 "locked": {
6455 "lastModified": 1646497237,
6456 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6457 "owner": "nixos",
6458 "repo": "nixpkgs",
6459 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6460 "type": "github"
6461 },
6462 "original": {
6463 "owner": "nixos",
6464 "repo": "nixpkgs",
6465 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6466 "type": "github"
6467 }
6468 },
6469 "nixpkgs_74": {
6470 "locked": {
6471 "lastModified": 1687502512,
6472 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
6473 "owner": "NixOS",
6474 "repo": "nixpkgs",
6475 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6476 "type": "github"
6477 },
6478 "original": {
6479 "owner": "NixOS",
6480 "ref": "nixos-unstable",
6481 "repo": "nixpkgs",
6482 "type": "github"
6483 }
6484 },
6485 "nixpkgs_75": {
6486 "locked": {
6487 "lastModified": 1633901457,
6488 "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
6489 "owner": "NixOS",
6490 "repo": "nixpkgs",
6491 "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
6492 "type": "github"
6493 },
6494 "original": {
6495 "owner": "NixOS",
6496 "repo": "nixpkgs",
6497 "type": "github"
6498 }
6499 },
6500 "nixpkgs_76": {
6501 "flake": false,
6502 "locked": {
6503 "lastModified": 1596265691,
6504 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6505 "owner": "NixOS",
6506 "repo": "nixpkgs",
6507 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6508 "type": "github"
6509 },
6510 "original": {
6511 "owner": "NixOS",
6512 "repo": "nixpkgs",
6513 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6514 "type": "github"
6515 }
6516 },
6517 "nixpkgs_77": {
6518 "locked": {
6519 "lastModified": 1646497237,
6520 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6521 "owner": "nixos",
6522 "repo": "nixpkgs",
6523 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6524 "type": "github"
6525 },
6526 "original": {
6527 "owner": "nixos",
6528 "repo": "nixpkgs",
6529 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6530 "type": "github"
6531 }
6532 },
6533 "nixpkgs_78": {
6534 "flake": false,
6535 "locked": {
6536 "lastModified": 1596265691,
6537 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6538 "owner": "NixOS",
6539 "repo": "nixpkgs",
6540 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6541 "type": "github"
6542 },
6543 "original": {
6544 "owner": "NixOS",
6545 "repo": "nixpkgs",
6546 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6547 "type": "github"
6548 }
6549 },
6550 "nixpkgs_79": {
6551 "locked": {
6552 "lastModified": 1646497237,
6553 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6554 "owner": "nixos",
6555 "repo": "nixpkgs",
6556 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6557 "type": "github"
6558 },
6559 "original": {
6560 "owner": "nixos",
6561 "repo": "nixpkgs",
6562 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6563 "type": "github"
6564 }
6565 },
6566 "nixpkgs_8": {
6567 "locked": {
6568 "lastModified": 1693158576,
6569 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
6570 "owner": "nixos",
6571 "repo": "nixpkgs",
6572 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
6573 "type": "github"
6574 },
6575 "original": {
6576 "owner": "nixos",
6577 "ref": "nixos-unstable",
6578 "repo": "nixpkgs",
6579 "type": "github"
6580 }
6581 },
6582 "nixpkgs_80": {
6583 "flake": false,
6584 "locked": {
6585 "lastModified": 1596265691,
6586 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6587 "owner": "NixOS",
6588 "repo": "nixpkgs",
6589 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6590 "type": "github"
6591 },
6592 "original": {
6593 "owner": "NixOS",
6594 "repo": "nixpkgs",
6595 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6596 "type": "github"
6597 }
6598 },
6599 "nixpkgs_81": {
6600 "locked": {
6601 "lastModified": 1683408522,
6602 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
6603 "owner": "NixOS",
6604 "repo": "nixpkgs",
6605 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
6606 "type": "github"
6607 },
6608 "original": {
6609 "owner": "NixOS",
6610 "ref": "nixos-unstable",
6611 "repo": "nixpkgs",
6612 "type": "github"
6613 }
6614 },
6615 "nixpkgs_82": {
6616 "locked": {
6617 "lastModified": 1687701825,
6618 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6619 "owner": "NixOS",
6620 "repo": "nixpkgs",
6621 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6622 "type": "github"
6623 },
6624 "original": {
6625 "owner": "NixOS",
6626 "ref": "nixpkgs-unstable",
6627 "repo": "nixpkgs",
6628 "type": "github"
6629 }
6630 },
6631 "nixpkgs_83": {
6632 "locked": {
6633 "lastModified": 1687893427,
6634 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6635 "owner": "nixos",
6636 "repo": "nixpkgs",
6637 "rev": "4b14ab2a916508442e685089672681dff46805be",
6638 "type": "github"
6639 },
6640 "original": {
6641 "owner": "nixos",
6642 "ref": "nixos-unstable-small",
6643 "repo": "nixpkgs",
6644 "type": "github"
6645 }
6646 },
6647 "nixpkgs_84": {
6648 "locked": {
6649 "lastModified": 1648725829,
6650 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6651 "owner": "NixOS",
6652 "repo": "nixpkgs",
6653 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6654 "type": "github"
6655 },
6656 "original": {
6657 "owner": "NixOS",
6658 "repo": "nixpkgs",
6659 "type": "github"
6660 }
6661 },
6662 "nixpkgs_85": {
6663 "flake": false,
6664 "locked": {
6665 "lastModified": 1596265691,
6666 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6667 "owner": "NixOS",
6668 "repo": "nixpkgs",
6669 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6670 "type": "github"
6671 },
6672 "original": {
6673 "owner": "NixOS",
6674 "repo": "nixpkgs",
6675 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6676 "type": "github"
6677 }
6678 },
6679 "nixpkgs_86": {
6680 "flake": false,
6681 "locked": {
6682 "lastModified": 1596265691,
6683 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6684 "owner": "NixOS",
6685 "repo": "nixpkgs",
6686 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6687 "type": "github"
6688 },
6689 "original": {
6690 "owner": "NixOS",
6691 "repo": "nixpkgs",
6692 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6693 "type": "github"
6694 }
6695 },
6696 "nixpkgs_87": {
6697 "locked": {
6698 "lastModified": 1646497237,
6699 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6700 "owner": "nixos",
6701 "repo": "nixpkgs",
6702 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6703 "type": "github"
6704 },
6705 "original": {
6706 "owner": "nixos",
6707 "repo": "nixpkgs",
6708 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6709 "type": "github"
6710 }
6711 },
6712 "nixpkgs_88": {
6713 "locked": {
6714 "lastModified": 1597943282,
6715 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6716 "owner": "NixOS",
6717 "repo": "nixpkgs",
6718 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6719 "type": "github"
6720 },
6721 "original": {
6722 "owner": "NixOS",
6723 "repo": "nixpkgs",
6724 "type": "github"
6725 }
6726 },
6727 "nixpkgs_89": {
6728 "locked": {
6729 "lastModified": 1597943282,
6730 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6731 "owner": "NixOS",
6732 "repo": "nixpkgs",
6733 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6734 "type": "github"
6735 },
6736 "original": {
6737 "owner": "NixOS",
6738 "repo": "nixpkgs",
6739 "type": "github"
6740 }
6741 },
6742 "nixpkgs_9": {
6743 "locked": {
6744 "lastModified": 1597943282,
6745 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6746 "owner": "NixOS",
6747 "repo": "nixpkgs",
6748 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6749 "type": "github"
6750 },
6751 "original": {
6752 "owner": "NixOS",
6753 "repo": "nixpkgs",
6754 "type": "github"
6755 }
6756 },
6757 "nixpkgs_90": {
6758 "locked": {
6759 "lastModified": 1631570365,
6760 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
6761 "owner": "NixOS",
6762 "repo": "nixpkgs",
6763 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
6764 "type": "github"
6765 },
6766 "original": {
6767 "owner": "NixOS",
6768 "repo": "nixpkgs",
6769 "type": "github"
6770 }
6771 },
6772 "nixpkgs_91": {
6773 "locked": {
6774 "lastModified": 1611097871,
6775 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
6776 "owner": "NixOS",
6777 "repo": "nixpkgs",
6778 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
6779 "type": "github"
6780 },
6781 "original": {
6782 "owner": "NixOS",
6783 "repo": "nixpkgs",
6784 "type": "github"
6785 }
6786 },
6787 "nixpkgs_92": {
6788 "flake": false,
6789 "locked": {
6790 "lastModified": 1596265691,
6791 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6792 "owner": "NixOS",
6793 "repo": "nixpkgs",
6794 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6795 "type": "github"
6796 },
6797 "original": {
6798 "owner": "NixOS",
6799 "repo": "nixpkgs",
6800 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6801 "type": "github"
6802 }
6803 },
6804 "nixpkgs_93": {
6805 "locked": {
6806 "lastModified": 1597943282,
6807 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6808 "owner": "NixOS",
6809 "repo": "nixpkgs",
6810 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6811 "type": "github"
6812 },
6813 "original": {
6814 "owner": "NixOS",
6815 "repo": "nixpkgs",
6816 "type": "github"
6817 }
6818 },
6819 "nixpkgs_94": {
6820 "locked": {
6821 "lastModified": 1597943282,
6822 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6823 "owner": "NixOS",
6824 "repo": "nixpkgs",
6825 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6826 "type": "github"
6827 },
6828 "original": {
6829 "owner": "NixOS",
6830 "repo": "nixpkgs",
6831 "type": "github"
6832 }
6833 },
6834 "nixpkgs_95": {
6835 "locked": {
6836 "lastModified": 1597943282,
6837 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6838 "owner": "NixOS",
6839 "repo": "nixpkgs",
6840 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6841 "type": "github"
6842 },
6843 "original": {
6844 "owner": "NixOS",
6845 "repo": "nixpkgs",
6846 "type": "github"
6847 }
6848 },
6849 "nixpkgs_96": {
6850 "locked": {
6851 "lastModified": 1597943282,
6852 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6853 "owner": "NixOS",
6854 "repo": "nixpkgs",
6855 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6856 "type": "github"
6857 },
6858 "original": {
6859 "owner": "NixOS",
6860 "repo": "nixpkgs",
6861 "type": "github"
6862 }
6863 },
6864 "nixpkgs_97": {
6865 "locked": {
6866 "lastModified": 1631570365,
6867 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
6868 "owner": "NixOS",
6869 "repo": "nixpkgs",
6870 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
6871 "type": "github"
6872 },
6873 "original": {
6874 "owner": "NixOS",
6875 "repo": "nixpkgs",
6876 "type": "github"
6877 }
6878 },
6879 "nixpkgs_98": {
6880 "locked": {
6881 "lastModified": 1611097871,
6882 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
6883 "owner": "NixOS",
6884 "repo": "nixpkgs",
6885 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
6886 "type": "github"
6887 },
6888 "original": {
6889 "owner": "NixOS",
6890 "repo": "nixpkgs",
6891 "type": "github"
6892 }
6893 },
6894 "nixpkgs_99": {
6895 "locked": {
6896 "lastModified": 1611097871,
6897 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
6898 "owner": "NixOS",
6899 "repo": "nixpkgs",
6900 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
6901 "type": "github"
6902 },
6903 "original": {
6904 "owner": "NixOS",
6905 "repo": "nixpkgs",
6906 "type": "github"
6907 }
6908 },
6909 "openarc": {
6910 "inputs": {
6911 "flake-utils": "flake-utils",
6912 "myuids": "myuids",
6913 "nixpkgs": "nixpkgs_2",
6914 "openarc": "openarc_2"
6915 },
6916 "locked": {
6917 "lastModified": 1,
6918 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
6919 "path": "../../openarc",
6920 "type": "path"
6921 },
6922 "original": {
6923 "path": "../../openarc",
6924 "type": "path"
6925 }
6926 },
6927 "openarc_10": {
6928 "flake": false,
6929 "locked": {
6930 "lastModified": 1537545083,
6931 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6932 "owner": "trusteddomainproject",
6933 "repo": "OpenARC",
6934 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6935 "type": "github"
6936 },
6937 "original": {
6938 "owner": "trusteddomainproject",
6939 "repo": "OpenARC",
6940 "type": "github"
6941 }
6942 },
6943 "openarc_11": {
6944 "flake": false,
6945 "locked": {
6946 "lastModified": 1537545083,
6947 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6948 "owner": "trusteddomainproject",
6949 "repo": "OpenARC",
6950 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6951 "type": "github"
6952 },
6953 "original": {
6954 "owner": "trusteddomainproject",
6955 "repo": "OpenARC",
6956 "type": "github"
6957 }
6958 },
6959 "openarc_12": {
6960 "inputs": {
6961 "flake-utils": "flake-utils_53",
6962 "myuids": "myuids_36",
6963 "nixpkgs": "nixpkgs_93",
6964 "openarc": "openarc_13"
6965 },
6966 "locked": {
6967 "lastModified": 1,
6968 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
6969 "path": "../../openarc",
6970 "type": "path"
6971 },
6972 "original": {
6973 "path": "../../openarc",
6974 "type": "path"
6975 }
6976 },
6977 "openarc_13": {
6978 "flake": false,
6979 "locked": {
6980 "lastModified": 1537545083,
6981 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6982 "owner": "trusteddomainproject",
6983 "repo": "OpenARC",
6984 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6985 "type": "github"
6986 },
6987 "original": {
6988 "owner": "trusteddomainproject",
6989 "repo": "OpenARC",
6990 "type": "github"
6991 }
6992 },
6993 "openarc_14": {
6994 "inputs": {
6995 "flake-utils": "flake-utils_55",
6996 "myuids": "myuids_38",
6997 "nixpkgs": "nixpkgs_95",
6998 "openarc": "openarc_15"
6999 },
7000 "locked": {
7001 "lastModified": 1,
7002 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
7003 "path": "../../openarc",
7004 "type": "path"
7005 },
7006 "original": {
7007 "path": "../../openarc",
7008 "type": "path"
7009 }
7010 },
7011 "openarc_15": {
7012 "flake": false,
7013 "locked": {
7014 "lastModified": 1537545083,
7015 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
7016 "owner": "trusteddomainproject",
7017 "repo": "OpenARC",
7018 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
7019 "type": "github"
7020 },
7021 "original": {
7022 "owner": "trusteddomainproject",
7023 "repo": "OpenARC",
7024 "type": "github"
7025 }
7026 },
7027 "openarc_2": {
7028 "flake": false,
7029 "locked": {
7030 "lastModified": 1537545083,
7031 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
7032 "owner": "trusteddomainproject",
7033 "repo": "OpenARC",
7034 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
7035 "type": "github"
7036 },
7037 "original": {
7038 "owner": "trusteddomainproject",
7039 "repo": "OpenARC",
7040 "type": "github"
7041 }
7042 },
7043 "openarc_3": {
7044 "inputs": {
7045 "files-watcher": "files-watcher_2",
7046 "openarc": "openarc_4",
7047 "secrets": "secrets_4"
7048 },
7049 "locked": {
7050 "lastModified": 1,
7051 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
7052 "path": "../../flakes/private/openarc",
7053 "type": "path"
7054 },
7055 "original": {
7056 "path": "../../flakes/private/openarc",
7057 "type": "path"
7058 }
7059 },
7060 "openarc_4": {
7061 "inputs": {
7062 "flake-utils": "flake-utils_4",
7063 "myuids": "myuids_4",
7064 "nixpkgs": "nixpkgs_9",
7065 "openarc": "openarc_5"
7066 },
7067 "locked": {
7068 "lastModified": 1,
7069 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
7070 "path": "../../openarc",
7071 "type": "path"
7072 },
7073 "original": {
7074 "path": "../../openarc",
7075 "type": "path"
7076 }
7077 },
7078 "openarc_5": {
7079 "flake": false,
7080 "locked": {
7081 "lastModified": 1537545083,
7082 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
7083 "owner": "trusteddomainproject",
7084 "repo": "OpenARC",
7085 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
7086 "type": "github"
7087 },
7088 "original": {
7089 "owner": "trusteddomainproject",
7090 "repo": "OpenARC",
7091 "type": "github"
7092 }
7093 },
7094 "openarc_6": {
7095 "inputs": {
7096 "flake-utils": "flake-utils_12",
7097 "myuids": "myuids_9",
7098 "nixpkgs": "nixpkgs_26",
7099 "openarc": "openarc_7"
7100 },
7101 "locked": {
7102 "lastModified": 1,
7103 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
7104 "path": "../../openarc",
7105 "type": "path"
7106 },
7107 "original": {
7108 "path": "../../openarc",
7109 "type": "path"
7110 }
7111 },
7112 "openarc_7": {
7113 "flake": false,
7114 "locked": {
7115 "lastModified": 1537545083,
7116 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
7117 "owner": "trusteddomainproject",
7118 "repo": "OpenARC",
7119 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
7120 "type": "github"
7121 },
7122 "original": {
7123 "owner": "trusteddomainproject",
7124 "repo": "OpenARC",
7125 "type": "github"
7126 }
7127 },
7128 "openarc_8": {
7129 "inputs": {
7130 "flake-utils": "flake-utils_14",
7131 "myuids": "myuids_11",
7132 "nixpkgs": "nixpkgs_28",
7133 "openarc": "openarc_9"
7134 },
7135 "locked": {
7136 "lastModified": 1,
7137 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
7138 "path": "../../openarc",
7139 "type": "path"
7140 },
7141 "original": {
7142 "path": "../../openarc",
7143 "type": "path"
7144 }
7145 },
7146 "openarc_9": {
7147 "flake": false,
7148 "locked": {
7149 "lastModified": 1537545083,
7150 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
7151 "owner": "trusteddomainproject",
7152 "repo": "OpenARC",
7153 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
7154 "type": "github"
7155 },
7156 "original": {
7157 "owner": "trusteddomainproject",
7158 "repo": "OpenARC",
7159 "type": "github"
7160 }
7161 },
7162 "opendmarc": {
7163 "inputs": {
7164 "flake-utils": "flake-utils_2",
7165 "myuids": "myuids_2",
7166 "nixpkgs": "nixpkgs_3"
7167 },
7168 "locked": {
7169 "lastModified": 1,
7170 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7171 "path": "../../opendmarc",
7172 "type": "path"
7173 },
7174 "original": {
7175 "path": "../../opendmarc",
7176 "type": "path"
7177 }
7178 },
7179 "opendmarc_2": {
7180 "inputs": {
7181 "environment": "environment_6",
7182 "files-watcher": "files-watcher_3",
7183 "opendmarc": "opendmarc_3",
7184 "secrets": "secrets_5"
7185 },
7186 "locked": {
7187 "lastModified": 1,
7188 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
7189 "path": "../../flakes/private/opendmarc",
7190 "type": "path"
7191 },
7192 "original": {
7193 "path": "../../flakes/private/opendmarc",
7194 "type": "path"
7195 }
7196 },
7197 "opendmarc_3": {
7198 "inputs": {
7199 "flake-utils": "flake-utils_5",
7200 "myuids": "myuids_5",
7201 "nixpkgs": "nixpkgs_10"
7202 },
7203 "locked": {
7204 "lastModified": 1,
7205 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7206 "path": "../../opendmarc",
7207 "type": "path"
7208 },
7209 "original": {
7210 "path": "../../opendmarc",
7211 "type": "path"
7212 }
7213 },
7214 "opendmarc_4": {
7215 "inputs": {
7216 "flake-utils": "flake-utils_13",
7217 "myuids": "myuids_10",
7218 "nixpkgs": "nixpkgs_27"
7219 },
7220 "locked": {
7221 "lastModified": 1,
7222 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7223 "path": "../../opendmarc",
7224 "type": "path"
7225 },
7226 "original": {
7227 "path": "../../opendmarc",
7228 "type": "path"
7229 }
7230 },
7231 "opendmarc_5": {
7232 "inputs": {
7233 "flake-utils": "flake-utils_15",
7234 "myuids": "myuids_12",
7235 "nixpkgs": "nixpkgs_29"
7236 },
7237 "locked": {
7238 "lastModified": 1,
7239 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7240 "path": "../../opendmarc",
7241 "type": "path"
7242 },
7243 "original": {
7244 "path": "../../opendmarc",
7245 "type": "path"
7246 }
7247 },
7248 "opendmarc_6": {
7249 "inputs": {
7250 "flake-utils": "flake-utils_54",
7251 "myuids": "myuids_37",
7252 "nixpkgs": "nixpkgs_94"
7253 },
7254 "locked": {
7255 "lastModified": 1,
7256 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7257 "path": "../../opendmarc",
7258 "type": "path"
7259 },
7260 "original": {
7261 "path": "../../opendmarc",
7262 "type": "path"
7263 }
7264 },
7265 "opendmarc_7": {
7266 "inputs": {
7267 "flake-utils": "flake-utils_56",
7268 "myuids": "myuids_39",
7269 "nixpkgs": "nixpkgs_96"
7270 },
7271 "locked": {
7272 "lastModified": 1,
7273 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7274 "path": "../../opendmarc",
7275 "type": "path"
7276 },
7277 "original": {
7278 "path": "../../opendmarc",
7279 "type": "path"
7280 }
7281 },
7282 "openldap": {
7283 "locked": {
7284 "lastModified": 1,
7285 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
7286 "path": "../../flakes/private/openldap",
7287 "type": "path"
7288 },
7289 "original": {
7290 "path": "../../flakes/private/openldap",
7291 "type": "path"
7292 }
7293 },
7294 "paste": {
7295 "inputs": {
7296 "flake-utils": "flake-utils_16",
7297 "nixpkgs": "nixpkgs_30"
7298 },
7299 "locked": {
7300 "lastModified": 1,
7301 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
7302 "path": "../../paste",
7303 "type": "path"
7304 },
7305 "original": {
7306 "path": "../../paste",
7307 "type": "path"
7308 }
7309 },
7310 "paste_2": {
7311 "inputs": {
7312 "flake-utils": "flake-utils_57",
7313 "nixpkgs": "nixpkgs_97"
7314 },
7315 "locked": {
7316 "lastModified": 1,
7317 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
7318 "path": "../../paste",
7319 "type": "path"
7320 },
7321 "original": {
7322 "path": "../../paste",
7323 "type": "path"
7324 }
7325 },
7326 "peertube": {
7327 "flake": false,
7328 "locked": {
7329 "lastModified": 1611184594,
7330 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
7331 "ref": "gitolite_local/open_instance",
7332 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
7333 "revCount": 6316,
7334 "type": "git",
7335 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
7336 },
7337 "original": {
7338 "owner": "Chocobozzz",
7339 "ref": "v3.0.1",
7340 "repo": "PeerTube",
7341 "type": "github"
7342 }
7343 },
7344 "peertube_2": {
7345 "flake": false,
7346 "locked": {
7347 "lastModified": 1610436329,
7348 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7349 "owner": "Chocobozzz",
7350 "repo": "PeerTube",
7351 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7352 "type": "github"
7353 },
7354 "original": {
7355 "owner": "Chocobozzz",
7356 "ref": "v3.0.1",
7357 "repo": "PeerTube",
7358 "type": "github"
7359 }
7360 },
7361 "peertube_3": {
7362 "flake": false,
7363 "locked": {
7364 "lastModified": 1610436329,
7365 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7366 "owner": "Chocobozzz",
7367 "repo": "PeerTube",
7368 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7369 "type": "github"
7370 },
7371 "original": {
7372 "owner": "Chocobozzz",
7373 "ref": "v3.0.1",
7374 "repo": "PeerTube",
7375 "type": "github"
7376 }
7377 },
7378 "peertube_4": {
7379 "flake": false,
7380 "locked": {
7381 "lastModified": 1610436329,
7382 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7383 "owner": "Chocobozzz",
7384 "repo": "PeerTube",
7385 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7386 "type": "github"
7387 },
7388 "original": {
7389 "owner": "Chocobozzz",
7390 "ref": "v3.0.1",
7391 "repo": "PeerTube",
7392 "type": "github"
7393 }
7394 },
7395 "peertube_5": {
7396 "flake": false,
7397 "locked": {
7398 "lastModified": 1611184594,
7399 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
7400 "ref": "gitolite_local/open_instance",
7401 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
7402 "revCount": 6316,
7403 "type": "git",
7404 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
7405 },
7406 "original": {
7407 "owner": "Chocobozzz",
7408 "ref": "v3.0.1",
7409 "repo": "PeerTube",
7410 "type": "github"
7411 }
7412 },
7413 "peertube_6": {
7414 "flake": false,
7415 "locked": {
7416 "lastModified": 1610436329,
7417 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7418 "owner": "Chocobozzz",
7419 "repo": "PeerTube",
7420 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7421 "type": "github"
7422 },
7423 "original": {
7424 "owner": "Chocobozzz",
7425 "ref": "v3.0.1",
7426 "repo": "PeerTube",
7427 "type": "github"
7428 }
7429 },
7430 "peertube_open_instance": {
7431 "inputs": {
7432 "flake-utils": "flake-utils_17",
7433 "myuids": "myuids_13",
7434 "nixpkgs": "nixpkgs_31",
7435 "peertube": "peertube"
7436 },
7437 "locked": {
7438 "lastModified": 1,
7439 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7440 "path": "./../../peertube",
7441 "type": "path"
7442 },
7443 "original": {
7444 "path": "./../../peertube",
7445 "type": "path"
7446 }
7447 },
7448 "peertube_open_instance_2": {
7449 "inputs": {
7450 "flake-utils": "flake-utils_58",
7451 "myuids": "myuids_40",
7452 "nixpkgs": "nixpkgs_98",
7453 "peertube": "peertube_5"
7454 },
7455 "locked": {
7456 "lastModified": 1,
7457 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7458 "path": "./../../peertube",
7459 "type": "path"
7460 },
7461 "original": {
7462 "path": "./../../peertube",
7463 "type": "path"
7464 }
7465 },
7466 "peertube_origin": {
7467 "inputs": {
7468 "flake-utils": "flake-utils_18",
7469 "myuids": "myuids_14",
7470 "nixpkgs": "nixpkgs_32",
7471 "peertube": "peertube_2"
7472 },
7473 "locked": {
7474 "lastModified": 1,
7475 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7476 "path": "./../../peertube",
7477 "type": "path"
7478 },
7479 "original": {
7480 "path": "./../../peertube",
7481 "type": "path"
7482 }
7483 },
7484 "peertube_origin_2": {
7485 "inputs": {
7486 "flake-utils": "flake-utils_59",
7487 "myuids": "myuids_41",
7488 "nixpkgs": "nixpkgs_99",
7489 "peertube": "peertube_6"
7490 },
7491 "locked": {
7492 "lastModified": 1,
7493 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7494 "path": "./../../peertube",
7495 "type": "path"
7496 },
7497 "original": {
7498 "path": "./../../peertube",
7499 "type": "path"
7500 }
7501 },
7502 "php": {
7503 "inputs": {
7504 "flake-utils": "flake-utils_33",
7505 "nixpkgs": "nixpkgs_56",
7506 "nixpkgs-4": "nixpkgs-4_2"
7507 },
7508 "locked": {
7509 "lastModified": 1,
7510 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
7511 "path": "../../flakes/private/php",
7512 "type": "path"
7513 },
7514 "original": {
7515 "path": "../../flakes/private/php",
7516 "type": "path"
7517 }
7518 },
7519 "php_2": {
7520 "inputs": {
7521 "flake-utils": "flake-utils_36",
7522 "nixpkgs": "nixpkgs_64",
7523 "nixpkgs-4": "nixpkgs-4_3"
7524 },
7525 "locked": {
7526 "lastModified": 1,
7527 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
7528 "path": "../../flakes/private/php",
7529 "type": "path"
7530 },
7531 "original": {
7532 "path": "../../flakes/private/php",
7533 "type": "path"
7534 }
7535 },
7536 "private-buildbot": {
7537 "inputs": {
7538 "buildslist": "buildslist",
7539 "flake-utils": "flake-utils_11",
7540 "nixpkgs": "nixpkgs_25"
7541 },
7542 "locked": {
7543 "lastModified": 1,
7544 "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
7545 "path": "../../flakes/private/buildbot",
7546 "type": "path"
7547 },
7548 "original": {
7549 "path": "../../flakes/private/buildbot",
7550 "type": "path"
7551 }
7552 },
7553 "private-chatons": {
7554 "inputs": {
7555 "environment": "environment_12"
7556 },
7557 "locked": {
7558 "lastModified": 1,
7559 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
7560 "path": "../../flakes/private/chatons",
7561 "type": "path"
7562 },
7563 "original": {
7564 "path": "../../flakes/private/chatons",
7565 "type": "path"
7566 }
7567 },
7568 "private-environment": {
7569 "locked": {
7570 "lastModified": 1,
7571 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7572 "path": "../../flakes/private/environment",
7573 "type": "path"
7574 },
7575 "original": {
7576 "path": "../../flakes/private/environment",
7577 "type": "path"
7578 }
7579 },
7580 "private-environment_2": {
7581 "locked": {
7582 "lastModified": 1,
7583 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7584 "path": "../../flakes/private/environment",
7585 "type": "path"
7586 },
7587 "original": {
7588 "path": "../../flakes/private/environment",
7589 "type": "path"
7590 }
7591 },
7592 "private-milters": {
7593 "inputs": {
7594 "environment": "environment_13",
7595 "files-watcher": "files-watcher_5",
7596 "openarc": "openarc_6",
7597 "opendmarc": "opendmarc_4",
7598 "secrets": "secrets_10"
7599 },
7600 "locked": {
7601 "lastModified": 1,
7602 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
7603 "path": "../../flakes/private/milters",
7604 "type": "path"
7605 },
7606 "original": {
7607 "path": "../../flakes/private/milters",
7608 "type": "path"
7609 }
7610 },
7611 "private-monitoring": {
7612 "inputs": {
7613 "environment": "environment_14",
7614 "naemon": "naemon_3",
7615 "nixpkgs-lib": "nixpkgs-lib_8",
7616 "secrets": "secrets_11"
7617 },
7618 "locked": {
7619 "lastModified": 1,
7620 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
7621 "path": "../../flakes/private/monitoring",
7622 "type": "path"
7623 },
7624 "original": {
7625 "path": "../../flakes/private/monitoring",
7626 "type": "path"
7627 }
7628 },
7629 "private-openarc": {
7630 "inputs": {
7631 "files-watcher": "files-watcher_6",
7632 "openarc": "openarc_8",
7633 "secrets": "secrets_12"
7634 },
7635 "locked": {
7636 "lastModified": 1,
7637 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
7638 "path": "../../flakes/private/openarc",
7639 "type": "path"
7640 },
7641 "original": {
7642 "path": "../../flakes/private/openarc",
7643 "type": "path"
7644 }
7645 },
7646 "private-opendmarc": {
7647 "inputs": {
7648 "environment": "environment_15",
7649 "files-watcher": "files-watcher_7",
7650 "opendmarc": "opendmarc_5",
7651 "secrets": "secrets_13"
7652 },
7653 "locked": {
7654 "lastModified": 1,
7655 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
7656 "path": "../../flakes/private/opendmarc",
7657 "type": "path"
7658 },
7659 "original": {
7660 "path": "../../flakes/private/opendmarc",
7661 "type": "path"
7662 }
7663 },
7664 "private-openldap": {
7665 "locked": {
7666 "lastModified": 1,
7667 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
7668 "path": "../../flakes/private/openldap",
7669 "type": "path"
7670 },
7671 "original": {
7672 "path": "../../flakes/private/openldap",
7673 "type": "path"
7674 }
7675 },
7676 "private-paste": {
7677 "inputs": {
7678 "paste": "paste"
7679 },
7680 "locked": {
7681 "lastModified": 1,
7682 "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
7683 "path": "../../flakes/private/paste",
7684 "type": "path"
7685 },
7686 "original": {
7687 "path": "../../flakes/private/paste",
7688 "type": "path"
7689 }
7690 },
7691 "private-peertube": {
7692 "inputs": {
7693 "peertube_open_instance": "peertube_open_instance",
7694 "peertube_origin": "peertube_origin"
7695 },
7696 "locked": {
7697 "lastModified": 1,
7698 "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
7699 "path": "../../flakes/private/peertube",
7700 "type": "path"
7701 },
7702 "original": {
7703 "path": "../../flakes/private/peertube",
7704 "type": "path"
7705 }
7706 },
7707 "private-php": {
7708 "inputs": {
7709 "flake-utils": "flake-utils_19",
7710 "nixpkgs": "nixpkgs_33",
7711 "nixpkgs-4": "nixpkgs-4"
7712 },
7713 "locked": {
7714 "lastModified": 1,
7715 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
7716 "path": "../../flakes/private/php",
7717 "type": "path"
7718 },
7719 "original": {
7720 "path": "../../flakes/private/php",
7721 "type": "path"
7722 }
7723 },
7724 "private-ssh": {
7725 "inputs": {
7726 "environment": "environment_16",
7727 "secrets": "secrets_14"
7728 },
7729 "locked": {
7730 "lastModified": 1,
7731 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
7732 "path": "../../flakes/private/ssh",
7733 "type": "path"
7734 },
7735 "original": {
7736 "path": "../../flakes/private/ssh",
7737 "type": "path"
7738 }
7739 },
7740 "private-system": {
7741 "inputs": {
7742 "backports": "backports_3",
7743 "environment": "environment_17",
7744 "mypackages": "mypackages_3",
7745 "myuids": "myuids_15",
7746 "secrets-public": "secrets-public_3"
7747 },
7748 "locked": {
7749 "lastModified": 1,
7750 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
7751 "path": "../../flakes/private/system",
7752 "type": "path"
7753 },
7754 "original": {
7755 "path": "../../flakes/private/system",
7756 "type": "path"
7757 }
7758 },
7759 "private-system_2": {
7760 "inputs": {
7761 "backports": "backports_6",
7762 "environment": "environment_26",
7763 "mypackages": "mypackages_9",
7764 "myuids": "myuids_28",
7765 "secrets-public": "secrets-public_6"
7766 },
7767 "locked": {
7768 "lastModified": 1,
7769 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
7770 "path": "../../flakes/private/system",
7771 "type": "path"
7772 },
7773 "original": {
7774 "path": "../../flakes/private/system",
7775 "type": "path"
7776 }
7777 },
7778 "public-copanier": {
7779 "inputs": {
7780 "copanier": "copanier",
7781 "flake-utils": "flake-utils_21",
7782 "nixpkgs": "nixpkgs_36"
7783 },
7784 "locked": {
7785 "lastModified": 1,
7786 "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
7787 "path": "../../flakes/copanier",
7788 "type": "path"
7789 },
7790 "original": {
7791 "path": "../../flakes/copanier",
7792 "type": "path"
7793 }
7794 },
7795 "public-diaspora": {
7796 "inputs": {
7797 "diaspora": "diaspora",
7798 "flake-utils": "flake-utils_22",
7799 "myuids": "myuids_16",
7800 "nixpkgs": "nixpkgs_37"
7801 },
7802 "locked": {
7803 "lastModified": 1,
7804 "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
7805 "path": "../../flakes/diaspora",
7806 "type": "path"
7807 },
7808 "original": {
7809 "path": "../../flakes/diaspora",
7810 "type": "path"
7811 }
7812 },
7813 "public-etherpad-lite": {
7814 "inputs": {
7815 "etherpad-lite": "etherpad-lite",
7816 "flake-utils": "flake-utils_23",
7817 "mypackages": "mypackages_4",
7818 "nixpkgs": "nixpkgs_39"
7819 },
7820 "locked": {
7821 "lastModified": 1,
7822 "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
7823 "path": "../../flakes/etherpad-lite",
7824 "type": "path"
7825 },
7826 "original": {
7827 "path": "../../flakes/etherpad-lite",
7828 "type": "path"
7829 }
7830 },
7831 "public-fiche": {
7832 "locked": {
7833 "lastModified": 1,
7834 "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
7835 "path": "../../flakes/fiche",
7836 "type": "path"
7837 },
7838 "original": {
7839 "path": "../../flakes/fiche",
7840 "type": "path"
7841 }
7842 },
7843 "public-files-watcher": {
7844 "locked": {
7845 "lastModified": 1,
7846 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
7847 "path": "../../flakes/files-watcher",
7848 "type": "path"
7849 },
7850 "original": {
7851 "path": "../../flakes/files-watcher",
7852 "type": "path"
7853 }
7854 },
7855 "public-grocy": {
7856 "inputs": {
7857 "flake-utils": "flake-utils_24",
7858 "grocy": "grocy",
7859 "mypackages": "mypackages_5",
7860 "nixpkgs": "nixpkgs_41"
7861 },
7862 "locked": {
7863 "lastModified": 1,
7864 "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
7865 "path": "../../flakes/grocy",
7866 "type": "path"
7867 },
7868 "original": {
7869 "path": "../../flakes/grocy",
7870 "type": "path"
7871 }
7872 },
7873 "public-loginctl-linger": {
7874 "locked": {
7875 "lastModified": 1,
7876 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
7877 "path": "../../flakes/loginctl-linger",
7878 "type": "path"
7879 },
7880 "original": {
7881 "path": "../../flakes/loginctl-linger",
7882 "type": "path"
7883 }
7884 },
7885 "public-mastodon": {
7886 "inputs": {
7887 "flake-utils": "flake-utils_25",
7888 "mastodon": "mastodon",
7889 "myuids": "myuids_17",
7890 "nixpkgs": "nixpkgs_42"
7891 },
7892 "locked": {
7893 "lastModified": 1,
7894 "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
7895 "path": "../../flakes/mastodon",
7896 "type": "path"
7897 },
7898 "original": {
7899 "path": "../../flakes/mastodon",
7900 "type": "path"
7901 }
7902 },
7903 "public-mediagoblin": {
7904 "inputs": {
7905 "flake-utils": "flake-utils_26",
7906 "mediagoblin": "mediagoblin",
7907 "myuids": "myuids_18",
7908 "nixpkgs": "nixpkgs_43"
7909 },
7910 "locked": {
7911 "lastModified": 1,
7912 "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
7913 "path": "../../flakes/mediagoblin",
7914 "type": "path"
7915 },
7916 "original": {
7917 "path": "../../flakes/mediagoblin",
7918 "type": "path"
7919 }
7920 },
7921 "public-multi-apache-container": {
7922 "inputs": {
7923 "files-watcher": "files-watcher_8",
7924 "myuids": "myuids_19"
7925 },
7926 "locked": {
7927 "lastModified": 1,
7928 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
7929 "path": "../../flakes/multi-apache-container",
7930 "type": "path"
7931 },
7932 "original": {
7933 "path": "../../flakes/multi-apache-container",
7934 "type": "path"
7935 }
7936 },
7937 "public-mypackages": {
7938 "inputs": {
7939 "flake-parts": "flake-parts_9",
7940 "nixpkgs": "nixpkgs_44",
7941 "webapps-ttrss": "webapps-ttrss_6"
7942 },
7943 "locked": {
7944 "lastModified": 1,
7945 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
7946 "path": "../../flakes/mypackages",
7947 "type": "path"
7948 },
7949 "original": {
7950 "path": "../../flakes/mypackages",
7951 "type": "path"
7952 }
7953 },
7954 "public-myuids": {
7955 "locked": {
7956 "lastModified": 1,
7957 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
7958 "path": "../../flakes/myuids",
7959 "type": "path"
7960 },
7961 "original": {
7962 "path": "../../flakes/myuids",
7963 "type": "path"
7964 }
7965 },
7966 "public-openarc": {
7967 "inputs": {
7968 "flake-utils": "flake-utils_27",
7969 "myuids": "myuids_20",
7970 "nixpkgs": "nixpkgs_45",
7971 "openarc": "openarc_10"
7972 },
7973 "locked": {
7974 "lastModified": 1,
7975 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
7976 "path": "../../flakes/openarc",
7977 "type": "path"
7978 },
7979 "original": {
7980 "path": "../../flakes/openarc",
7981 "type": "path"
7982 }
7983 },
7984 "public-opendmarc": {
7985 "inputs": {
7986 "flake-utils": "flake-utils_28",
7987 "myuids": "myuids_21",
7988 "nixpkgs": "nixpkgs_46"
7989 },
7990 "locked": {
7991 "lastModified": 1,
7992 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7993 "path": "../../flakes/opendmarc",
7994 "type": "path"
7995 },
7996 "original": {
7997 "path": "../../flakes/opendmarc",
7998 "type": "path"
7999 }
8000 },
8001 "public-peertube": {
8002 "inputs": {
8003 "flake-utils": "flake-utils_29",
8004 "myuids": "myuids_22",
8005 "nixpkgs": "nixpkgs_47",
8006 "peertube": "peertube_3"
8007 },
8008 "locked": {
8009 "lastModified": 1,
8010 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
8011 "path": "../../flakes/peertube",
8012 "type": "path"
8013 },
8014 "original": {
8015 "path": "../../flakes/peertube",
8016 "type": "path"
8017 }
8018 },
8019 "public-secrets": {
8020 "locked": {
8021 "lastModified": 1,
8022 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8023 "path": "../../flakes/secrets",
8024 "type": "path"
8025 },
8026 "original": {
8027 "path": "../../flakes/secrets",
8028 "type": "path"
8029 }
8030 },
8031 "public-secrets_2": {
8032 "locked": {
8033 "lastModified": 1,
8034 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8035 "path": "../../flakes/secrets",
8036 "type": "path"
8037 },
8038 "original": {
8039 "path": "../../flakes/secrets",
8040 "type": "path"
8041 }
8042 },
8043 "public-surfer": {
8044 "inputs": {
8045 "flake-utils": "flake-utils_30",
8046 "mypackages": "mypackages_6",
8047 "nixpkgs": "nixpkgs_49",
8048 "surfer": "surfer"
8049 },
8050 "locked": {
8051 "lastModified": 1,
8052 "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
8053 "path": "../../flakes/surfer",
8054 "type": "path"
8055 },
8056 "original": {
8057 "path": "../../flakes/surfer",
8058 "type": "path"
8059 }
8060 },
8061 "public-taskwarrior-web": {
8062 "inputs": {
8063 "flake-utils": "flake-utils_31",
8064 "nixpkgs": "nixpkgs_50",
8065 "taskwarrior-web": "taskwarrior-web"
8066 },
8067 "locked": {
8068 "lastModified": 1,
8069 "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
8070 "path": "../../flakes/taskwarrior-web",
8071 "type": "path"
8072 },
8073 "original": {
8074 "path": "../../flakes/taskwarrior-web",
8075 "type": "path"
8076 }
8077 },
8078 "root": {
8079 "inputs": {
8080 "devshell": "devshell",
8081 "main-flake": "main-flake",
8082 "nixpkgs": "nixpkgs_106",
8083 "secrets": "secrets_26"
8084 }
8085 },
8086 "rsync_backup": {
8087 "locked": {
8088 "lastModified": 1,
8089 "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
8090 "path": "../../flakes/rsync_backup",
8091 "type": "path"
8092 },
8093 "original": {
8094 "path": "../../flakes/rsync_backup",
8095 "type": "path"
8096 }
8097 },
8098 "s-backports": {
8099 "inputs": {
8100 "flake-utils": "flake-utils_40",
8101 "nixpkgs": "nixpkgs_74"
8102 },
8103 "locked": {
8104 "lastModified": 1,
8105 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
8106 "path": "./backports",
8107 "type": "path"
8108 },
8109 "original": {
8110 "path": "./backports",
8111 "type": "path"
8112 }
8113 },
8114 "s-copanier": {
8115 "inputs": {
8116 "copanier": "copanier_2",
8117 "flake-utils": "flake-utils_41",
8118 "nixpkgs": "nixpkgs_75"
8119 },
8120 "locked": {
8121 "lastModified": 1,
8122 "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
8123 "path": "./copanier",
8124 "type": "path"
8125 },
8126 "original": {
8127 "path": "./copanier",
8128 "type": "path"
8129 }
8130 },
8131 "s-diaspora": {
8132 "inputs": {
8133 "diaspora": "diaspora_2",
8134 "flake-utils": "flake-utils_42",
8135 "myuids": "myuids_29",
8136 "nixpkgs": "nixpkgs_76"
8137 },
8138 "locked": {
8139 "lastModified": 1,
8140 "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
8141 "path": "./diaspora",
8142 "type": "path"
8143 },
8144 "original": {
8145 "path": "./diaspora",
8146 "type": "path"
8147 }
8148 },
8149 "s-etherpad-lite": {
8150 "inputs": {
8151 "etherpad-lite": "etherpad-lite_2",
8152 "flake-utils": "flake-utils_43",
8153 "mypackages": "mypackages_10",
8154 "nixpkgs": "nixpkgs_78"
8155 },
8156 "locked": {
8157 "lastModified": 1,
8158 "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
8159 "path": "./etherpad-lite",
8160 "type": "path"
8161 },
8162 "original": {
8163 "path": "./etherpad-lite",
8164 "type": "path"
8165 }
8166 },
8167 "s-fiche": {
8168 "locked": {
8169 "lastModified": 1,
8170 "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
8171 "path": "./fiche",
8172 "type": "path"
8173 },
8174 "original": {
8175 "path": "./fiche",
8176 "type": "path"
8177 }
8178 },
8179 "s-files-watcher": {
8180 "locked": {
8181 "lastModified": 1,
8182 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
8183 "path": "./files-watcher",
8184 "type": "path"
8185 },
8186 "original": {
8187 "path": "./files-watcher",
8188 "type": "path"
8189 }
8190 },
8191 "s-grocy": {
8192 "inputs": {
8193 "flake-utils": "flake-utils_44",
8194 "grocy": "grocy_2",
8195 "mypackages": "mypackages_11",
8196 "nixpkgs": "nixpkgs_80"
8197 },
8198 "locked": {
8199 "lastModified": 1,
8200 "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
8201 "path": "./grocy",
8202 "type": "path"
8203 },
8204 "original": {
8205 "path": "./grocy",
8206 "type": "path"
8207 }
8208 },
8209 "s-lib": {
8210 "inputs": {
8211 "colmena": "colmena_7",
8212 "disko": "disko_7",
8213 "flake-parts": "flake-parts_19",
8214 "nixos-anywhere": "nixos-anywhere_7",
8215 "nixpkgs": "nixpkgs_84"
8216 },
8217 "locked": {
8218 "lastModified": 1,
8219 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
8220 "path": "./lib",
8221 "type": "path"
8222 },
8223 "original": {
8224 "path": "./lib",
8225 "type": "path"
8226 }
8227 },
8228 "s-loginctl-linger": {
8229 "locked": {
8230 "lastModified": 1,
8231 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
8232 "path": "./loginctl-linger",
8233 "type": "path"
8234 },
8235 "original": {
8236 "path": "./loginctl-linger",
8237 "type": "path"
8238 }
8239 },
8240 "s-mastodon": {
8241 "inputs": {
8242 "flake-utils": "flake-utils_46",
8243 "mastodon": "mastodon_2",
8244 "myuids": "myuids_30",
8245 "nixpkgs": "nixpkgs_85"
8246 },
8247 "locked": {
8248 "lastModified": 1,
8249 "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
8250 "path": "./mastodon",
8251 "type": "path"
8252 },
8253 "original": {
8254 "path": "./mastodon",
8255 "type": "path"
8256 }
8257 },
8258 "s-mediagoblin": {
8259 "inputs": {
8260 "flake-utils": "flake-utils_47",
8261 "mediagoblin": "mediagoblin_2",
8262 "myuids": "myuids_31",
8263 "nixpkgs": "nixpkgs_86"
8264 },
8265 "locked": {
8266 "lastModified": 1,
8267 "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
8268 "path": "./mediagoblin",
8269 "type": "path"
8270 },
8271 "original": {
8272 "path": "./mediagoblin",
8273 "type": "path"
8274 }
8275 },
8276 "s-multi-apache-container": {
8277 "inputs": {
8278 "files-watcher": "files-watcher_12",
8279 "myuids": "myuids_32"
8280 },
8281 "locked": {
8282 "lastModified": 1,
8283 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
8284 "path": "./multi-apache-container",
8285 "type": "path"
8286 },
8287 "original": {
8288 "path": "./multi-apache-container",
8289 "type": "path"
8290 }
8291 },
8292 "s-mypackages": {
8293 "inputs": {
8294 "flake-parts": "flake-parts_20",
8295 "nixpkgs": "nixpkgs_87",
8296 "webapps-ttrss": "webapps-ttrss_13"
8297 },
8298 "locked": {
8299 "lastModified": 1,
8300 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
8301 "path": "./mypackages",
8302 "type": "path"
8303 },
8304 "original": {
8305 "path": "./mypackages",
8306 "type": "path"
8307 }
8308 },
8309 "s-myuids": {
8310 "locked": {
8311 "lastModified": 1,
8312 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
8313 "path": "./myuids",
8314 "type": "path"
8315 },
8316 "original": {
8317 "path": "./myuids",
8318 "type": "path"
8319 }
8320 },
8321 "s-naemon": {
8322 "locked": {
8323 "lastModified": 1,
8324 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
8325 "path": "./naemon",
8326 "type": "path"
8327 },
8328 "original": {
8329 "path": "./naemon",
8330 "type": "path"
8331 }
8332 },
8333 "s-openarc": {
8334 "inputs": {
8335 "flake-utils": "flake-utils_48",
8336 "myuids": "myuids_33",
8337 "nixpkgs": "nixpkgs_88",
8338 "openarc": "openarc_11"
8339 },
8340 "locked": {
8341 "lastModified": 1,
8342 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
8343 "path": "./openarc",
8344 "type": "path"
8345 },
8346 "original": {
8347 "path": "./openarc",
8348 "type": "path"
8349 }
8350 },
8351 "s-opendmarc": {
8352 "inputs": {
8353 "flake-utils": "flake-utils_49",
8354 "myuids": "myuids_34",
8355 "nixpkgs": "nixpkgs_89"
8356 },
8357 "locked": {
8358 "lastModified": 1,
8359 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
8360 "path": "./opendmarc",
8361 "type": "path"
8362 },
8363 "original": {
8364 "path": "./opendmarc",
8365 "type": "path"
8366 }
8367 },
8368 "s-paste": {
8369 "inputs": {
8370 "flake-utils": "flake-utils_50",
8371 "nixpkgs": "nixpkgs_90"
8372 },
8373 "locked": {
8374 "lastModified": 1,
8375 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
8376 "path": "./paste",
8377 "type": "path"
8378 },
8379 "original": {
8380 "path": "./paste",
8381 "type": "path"
8382 }
8383 },
8384 "s-peertube": {
8385 "inputs": {
8386 "flake-utils": "flake-utils_51",
8387 "myuids": "myuids_35",
8388 "nixpkgs": "nixpkgs_91",
8389 "peertube": "peertube_4"
8390 },
8391 "locked": {
8392 "lastModified": 1,
8393 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
8394 "path": "./peertube",
8395 "type": "path"
8396 },
8397 "original": {
8398 "path": "./peertube",
8399 "type": "path"
8400 }
8401 },
8402 "s-private-buildbot": {
8403 "inputs": {
8404 "buildslist": "buildslist_2",
8405 "flake-utils": "flake-utils_52",
8406 "nixpkgs": "nixpkgs_92"
8407 },
8408 "locked": {
8409 "lastModified": 1,
8410 "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
8411 "path": "./private/buildbot",
8412 "type": "path"
8413 },
8414 "original": {
8415 "path": "./private/buildbot",
8416 "type": "path"
8417 }
8418 },
8419 "s-private-chatons": {
8420 "inputs": {
8421 "environment": "environment_27"
8422 },
8423 "locked": {
8424 "lastModified": 1,
8425 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
8426 "path": "./private/chatons",
8427 "type": "path"
8428 },
8429 "original": {
8430 "path": "./private/chatons",
8431 "type": "path"
8432 }
8433 },
8434 "s-private-environment": {
8435 "locked": {
8436 "lastModified": 1,
8437 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
8438 "path": "./private/environment",
8439 "type": "path"
8440 },
8441 "original": {
8442 "path": "./private/environment",
8443 "type": "path"
8444 }
8445 },
8446 "s-private-mail-relay": {
8447 "inputs": {
8448 "environment": "environment_28",
8449 "secrets": "secrets_20"
8450 },
8451 "locked": {
8452 "lastModified": 1,
8453 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
8454 "path": "./private/mail-relay",
8455 "type": "path"
8456 },
8457 "original": {
8458 "path": "./private/mail-relay",
8459 "type": "path"
8460 }
8461 },
8462 "s-private-milters": {
8463 "inputs": {
8464 "environment": "environment_29",
8465 "files-watcher": "files-watcher_13",
8466 "openarc": "openarc_12",
8467 "opendmarc": "opendmarc_6",
8468 "secrets": "secrets_21"
8469 },
8470 "locked": {
8471 "lastModified": 1,
8472 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
8473 "path": "./private/milters",
8474 "type": "path"
8475 },
8476 "original": {
8477 "path": "./private/milters",
8478 "type": "path"
8479 }
8480 },
8481 "s-private-monitoring": {
8482 "inputs": {
8483 "environment": "environment_30",
8484 "naemon": "naemon_6",
8485 "nixpkgs-lib": "nixpkgs-lib_26",
8486 "secrets": "secrets_22"
8487 },
8488 "locked": {
8489 "lastModified": 1,
8490 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
8491 "path": "./private/monitoring",
8492 "type": "path"
8493 },
8494 "original": {
8495 "path": "./private/monitoring",
8496 "type": "path"
8497 }
8498 },
8499 "s-private-openarc": {
8500 "inputs": {
8501 "files-watcher": "files-watcher_14",
8502 "openarc": "openarc_14",
8503 "secrets": "secrets_23"
8504 },
8505 "locked": {
8506 "lastModified": 1,
8507 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
8508 "path": "./private/openarc",
8509 "type": "path"
8510 },
8511 "original": {
8512 "path": "./private/openarc",
8513 "type": "path"
8514 }
8515 },
8516 "s-private-opendmarc": {
8517 "inputs": {
8518 "environment": "environment_31",
8519 "files-watcher": "files-watcher_15",
8520 "opendmarc": "opendmarc_7",
8521 "secrets": "secrets_24"
8522 },
8523 "locked": {
8524 "lastModified": 1,
8525 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
8526 "path": "./private/opendmarc",
8527 "type": "path"
8528 },
8529 "original": {
8530 "path": "./private/opendmarc",
8531 "type": "path"
8532 }
8533 },
8534 "s-private-openldap": {
8535 "locked": {
8536 "lastModified": 1,
8537 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
8538 "path": "./private/openldap",
8539 "type": "path"
8540 },
8541 "original": {
8542 "path": "./private/openldap",
8543 "type": "path"
8544 }
8545 },
8546 "s-private-paste": {
8547 "inputs": {
8548 "paste": "paste_2"
8549 },
8550 "locked": {
8551 "lastModified": 1,
8552 "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
8553 "path": "./private/paste",
8554 "type": "path"
8555 },
8556 "original": {
8557 "path": "./private/paste",
8558 "type": "path"
8559 }
8560 },
8561 "s-private-peertube": {
8562 "inputs": {
8563 "peertube_open_instance": "peertube_open_instance_2",
8564 "peertube_origin": "peertube_origin_2"
8565 },
8566 "locked": {
8567 "lastModified": 1,
8568 "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
8569 "path": "./private/peertube",
8570 "type": "path"
8571 },
8572 "original": {
8573 "path": "./private/peertube",
8574 "type": "path"
8575 }
8576 },
8577 "s-private-php": {
8578 "inputs": {
8579 "flake-utils": "flake-utils_60",
8580 "nixpkgs": "nixpkgs_100",
8581 "nixpkgs-4": "nixpkgs-4_4"
8582 },
8583 "locked": {
8584 "lastModified": 1,
8585 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
8586 "path": "./private/php",
8587 "type": "path"
8588 },
8589 "original": {
8590 "path": "./private/php",
8591 "type": "path"
8592 }
8593 },
8594 "s-private-ssh": {
8595 "inputs": {
8596 "environment": "environment_32",
8597 "secrets": "secrets_25"
8598 },
8599 "locked": {
8600 "lastModified": 1,
8601 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
8602 "path": "./private/ssh",
8603 "type": "path"
8604 },
8605 "original": {
8606 "path": "./private/ssh",
8607 "type": "path"
8608 }
8609 },
8610 "s-private-system": {
8611 "inputs": {
8612 "backports": "backports_7",
8613 "environment": "environment_33",
8614 "mypackages": "mypackages_12",
8615 "myuids": "myuids_42",
8616 "secrets-public": "secrets-public_7"
8617 },
8618 "locked": {
8619 "lastModified": 1,
8620 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
8621 "path": "./private/system",
8622 "type": "path"
8623 },
8624 "original": {
8625 "path": "./private/system",
8626 "type": "path"
8627 }
8628 },
8629 "s-rsync_backup": {
8630 "locked": {
8631 "lastModified": 1,
8632 "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
8633 "path": "./rsync_backup",
8634 "type": "path"
8635 },
8636 "original": {
8637 "path": "./rsync_backup",
8638 "type": "path"
8639 }
8640 },
8641 "s-secrets": {
8642 "locked": {
8643 "lastModified": 1,
8644 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8645 "path": "./secrets",
8646 "type": "path"
8647 },
8648 "original": {
8649 "path": "./secrets",
8650 "type": "path"
8651 }
8652 },
8653 "s-surfer": {
8654 "inputs": {
8655 "flake-utils": "flake-utils_62",
8656 "mypackages": "mypackages_13",
8657 "nixpkgs": "nixpkgs_104",
8658 "surfer": "surfer_2"
8659 },
8660 "locked": {
8661 "lastModified": 1,
8662 "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
8663 "path": "./surfer",
8664 "type": "path"
8665 },
8666 "original": {
8667 "path": "./surfer",
8668 "type": "path"
8669 }
8670 },
8671 "s-taskwarrior-web": {
8672 "inputs": {
8673 "flake-utils": "flake-utils_63",
8674 "nixpkgs": "nixpkgs_105",
8675 "taskwarrior-web": "taskwarrior-web_2"
8676 },
8677 "locked": {
8678 "lastModified": 1,
8679 "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
8680 "path": "./taskwarrior-web",
8681 "type": "path"
8682 },
8683 "original": {
8684 "path": "./taskwarrior-web",
8685 "type": "path"
8686 }
8687 },
8688 "secrets": {
8689 "locked": {
8690 "lastModified": 1,
8691 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8692 "path": "../../secrets",
8693 "type": "path"
8694 },
8695 "original": {
8696 "path": "../../secrets",
8697 "type": "path"
8698 }
8699 },
8700 "secrets-public": {
8701 "locked": {
8702 "lastModified": 1,
8703 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8704 "path": "../../secrets",
8705 "type": "path"
8706 },
8707 "original": {
8708 "path": "../../secrets",
8709 "type": "path"
8710 }
8711 },
8712 "secrets-public_2": {
8713 "locked": {
8714 "lastModified": 1,
8715 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8716 "path": "../../secrets",
8717 "type": "path"
8718 },
8719 "original": {
8720 "path": "../../secrets",
8721 "type": "path"
8722 }
8723 },
8724 "secrets-public_3": {
8725 "locked": {
8726 "lastModified": 1,
8727 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8728 "path": "../../secrets",
8729 "type": "path"
8730 },
8731 "original": {
8732 "path": "../../secrets",
8733 "type": "path"
8734 }
8735 },
8736 "secrets-public_4": {
8737 "locked": {
8738 "lastModified": 1,
8739 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8740 "path": "../../secrets",
8741 "type": "path"
8742 },
8743 "original": {
8744 "path": "../../secrets",
8745 "type": "path"
8746 }
8747 },
8748 "secrets-public_5": {
8749 "locked": {
8750 "lastModified": 1,
8751 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8752 "path": "../../secrets",
8753 "type": "path"
8754 },
8755 "original": {
8756 "path": "../../secrets",
8757 "type": "path"
8758 }
8759 },
8760 "secrets-public_6": {
8761 "locked": {
8762 "lastModified": 1,
8763 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8764 "path": "../../secrets",
8765 "type": "path"
8766 },
8767 "original": {
8768 "path": "../../secrets",
8769 "type": "path"
8770 }
8771 },
8772 "secrets-public_7": {
8773 "locked": {
8774 "lastModified": 1,
8775 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8776 "path": "../../secrets",
8777 "type": "path"
8778 },
8779 "original": {
8780 "path": "../../secrets",
8781 "type": "path"
8782 }
8783 },
8784 "secrets_10": {
8785 "locked": {
8786 "lastModified": 1,
8787 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8788 "path": "../../secrets",
8789 "type": "path"
8790 },
8791 "original": {
8792 "path": "../../secrets",
8793 "type": "path"
8794 }
8795 },
8796 "secrets_11": {
8797 "locked": {
8798 "lastModified": 1,
8799 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8800 "path": "../../secrets",
8801 "type": "path"
8802 },
8803 "original": {
8804 "path": "../../secrets",
8805 "type": "path"
8806 }
8807 },
8808 "secrets_12": {
8809 "locked": {
8810 "lastModified": 1,
8811 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8812 "path": "../../secrets",
8813 "type": "path"
8814 },
8815 "original": {
8816 "path": "../../secrets",
8817 "type": "path"
8818 }
8819 },
8820 "secrets_13": {
8821 "locked": {
8822 "lastModified": 1,
8823 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8824 "path": "../../secrets",
8825 "type": "path"
8826 },
8827 "original": {
8828 "path": "../../secrets",
8829 "type": "path"
8830 }
8831 },
8832 "secrets_14": {
8833 "locked": {
8834 "lastModified": 1,
8835 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8836 "path": "../../secrets",
8837 "type": "path"
8838 },
8839 "original": {
8840 "path": "../../secrets",
8841 "type": "path"
8842 }
8843 },
8844 "secrets_15": {
8845 "locked": {
8846 "lastModified": 1,
8847 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8848 "path": "../../secrets",
8849 "type": "path"
8850 },
8851 "original": {
8852 "path": "../../secrets",
8853 "type": "path"
8854 }
8855 },
8856 "secrets_16": {
8857 "locked": {
8858 "lastModified": 1,
8859 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8860 "path": "../../secrets",
8861 "type": "path"
8862 },
8863 "original": {
8864 "path": "../../secrets",
8865 "type": "path"
8866 }
8867 },
8868 "secrets_17": {
8869 "locked": {
8870 "lastModified": 1,
8871 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8872 "path": "../../flakes/secrets",
8873 "type": "path"
8874 },
8875 "original": {
8876 "path": "../../flakes/secrets",
8877 "type": "path"
8878 }
8879 },
8880 "secrets_18": {
8881 "locked": {
8882 "lastModified": 1,
8883 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8884 "path": "../../secrets",
8885 "type": "path"
8886 },
8887 "original": {
8888 "path": "../../secrets",
8889 "type": "path"
8890 }
8891 },
8892 "secrets_19": {
8893 "locked": {
8894 "lastModified": 1,
8895 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8896 "path": "../../flakes/secrets",
8897 "type": "path"
8898 },
8899 "original": {
8900 "path": "../../flakes/secrets",
8901 "type": "path"
8902 }
8903 },
8904 "secrets_2": {
8905 "locked": {
8906 "lastModified": 1,
8907 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8908 "path": "../../secrets",
8909 "type": "path"
8910 },
8911 "original": {
8912 "path": "../../secrets",
8913 "type": "path"
8914 }
8915 },
8916 "secrets_20": {
8917 "locked": {
8918 "lastModified": 1,
8919 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8920 "path": "../../secrets",
8921 "type": "path"
8922 },
8923 "original": {
8924 "path": "../../secrets",
8925 "type": "path"
8926 }
8927 },
8928 "secrets_21": {
8929 "locked": {
8930 "lastModified": 1,
8931 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8932 "path": "../../secrets",
8933 "type": "path"
8934 },
8935 "original": {
8936 "path": "../../secrets",
8937 "type": "path"
8938 }
8939 },
8940 "secrets_22": {
8941 "locked": {
8942 "lastModified": 1,
8943 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8944 "path": "../../secrets",
8945 "type": "path"
8946 },
8947 "original": {
8948 "path": "../../secrets",
8949 "type": "path"
8950 }
8951 },
8952 "secrets_23": {
8953 "locked": {
8954 "lastModified": 1,
8955 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8956 "path": "../../secrets",
8957 "type": "path"
8958 },
8959 "original": {
8960 "path": "../../secrets",
8961 "type": "path"
8962 }
8963 },
8964 "secrets_24": {
8965 "locked": {
8966 "lastModified": 1,
8967 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8968 "path": "../../secrets",
8969 "type": "path"
8970 },
8971 "original": {
8972 "path": "../../secrets",
8973 "type": "path"
8974 }
8975 },
8976 "secrets_25": {
8977 "locked": {
8978 "lastModified": 1,
8979 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8980 "path": "../../secrets",
8981 "type": "path"
8982 },
8983 "original": {
8984 "path": "../../secrets",
8985 "type": "path"
8986 }
8987 },
8988 "secrets_26": {
8989 "inputs": {
8990 "nixpkgs": "nixpkgs_107"
8991 },
8992 "locked": {
8993 "lastModified": 1696144631,
8994 "narHash": "sha256-zV7tbNrrrUpPkaATkc6OsQC8n75QybaBKsaD7d5kQGA=",
8995 "ref": "master",
8996 "rev": "ae51ac0227647e30348256067934b8c9eb7e3f06",
8997 "revCount": 688,
8998 "type": "git",
8999 "url": "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets"
9000 },
9001 "original": {
9002 "ref": "master",
9003 "type": "git",
9004 "url": "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets"
9005 }
9006 },
9007 "secrets_3": {
9008 "locked": {
9009 "lastModified": 1,
9010 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9011 "path": "../../secrets",
9012 "type": "path"
9013 },
9014 "original": {
9015 "path": "../../secrets",
9016 "type": "path"
9017 }
9018 },
9019 "secrets_4": {
9020 "locked": {
9021 "lastModified": 1,
9022 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9023 "path": "../../secrets",
9024 "type": "path"
9025 },
9026 "original": {
9027 "path": "../../secrets",
9028 "type": "path"
9029 }
9030 },
9031 "secrets_5": {
9032 "locked": {
9033 "lastModified": 1,
9034 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9035 "path": "../../secrets",
9036 "type": "path"
9037 },
9038 "original": {
9039 "path": "../../secrets",
9040 "type": "path"
9041 }
9042 },
9043 "secrets_6": {
9044 "locked": {
9045 "lastModified": 1,
9046 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9047 "path": "../../flakes/secrets",
9048 "type": "path"
9049 },
9050 "original": {
9051 "path": "../../flakes/secrets",
9052 "type": "path"
9053 }
9054 },
9055 "secrets_7": {
9056 "locked": {
9057 "lastModified": 1,
9058 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9059 "path": "../../secrets",
9060 "type": "path"
9061 },
9062 "original": {
9063 "path": "../../secrets",
9064 "type": "path"
9065 }
9066 },
9067 "secrets_8": {
9068 "locked": {
9069 "lastModified": 1,
9070 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9071 "path": "../../flakes/secrets",
9072 "type": "path"
9073 },
9074 "original": {
9075 "path": "../../flakes/secrets",
9076 "type": "path"
9077 }
9078 },
9079 "secrets_9": {
9080 "locked": {
9081 "lastModified": 1,
9082 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9083 "path": "../../secrets",
9084 "type": "path"
9085 },
9086 "original": {
9087 "path": "../../secrets",
9088 "type": "path"
9089 }
9090 },
9091 "ssh": {
9092 "inputs": {
9093 "environment": "environment_10",
9094 "secrets": "secrets_9"
9095 },
9096 "locked": {
9097 "lastModified": 1,
9098 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
9099 "path": "../../flakes/private/ssh",
9100 "type": "path"
9101 },
9102 "original": {
9103 "path": "../../flakes/private/ssh",
9104 "type": "path"
9105 }
9106 },
9107 "stable": {
9108 "locked": {
9109 "lastModified": 1669735802,
9110 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9111 "owner": "NixOS",
9112 "repo": "nixpkgs",
9113 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9114 "type": "github"
9115 },
9116 "original": {
9117 "owner": "NixOS",
9118 "ref": "nixos-22.11",
9119 "repo": "nixpkgs",
9120 "type": "github"
9121 }
9122 },
9123 "stable_2": {
9124 "locked": {
9125 "lastModified": 1669735802,
9126 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9127 "owner": "NixOS",
9128 "repo": "nixpkgs",
9129 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9130 "type": "github"
9131 },
9132 "original": {
9133 "owner": "NixOS",
9134 "ref": "nixos-22.11",
9135 "repo": "nixpkgs",
9136 "type": "github"
9137 }
9138 },
9139 "stable_3": {
9140 "locked": {
9141 "lastModified": 1669735802,
9142 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9143 "owner": "NixOS",
9144 "repo": "nixpkgs",
9145 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9146 "type": "github"
9147 },
9148 "original": {
9149 "owner": "NixOS",
9150 "ref": "nixos-22.11",
9151 "repo": "nixpkgs",
9152 "type": "github"
9153 }
9154 },
9155 "stable_4": {
9156 "locked": {
9157 "lastModified": 1669735802,
9158 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9159 "owner": "NixOS",
9160 "repo": "nixpkgs",
9161 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9162 "type": "github"
9163 },
9164 "original": {
9165 "owner": "NixOS",
9166 "ref": "nixos-22.11",
9167 "repo": "nixpkgs",
9168 "type": "github"
9169 }
9170 },
9171 "stable_5": {
9172 "locked": {
9173 "lastModified": 1669735802,
9174 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9175 "owner": "NixOS",
9176 "repo": "nixpkgs",
9177 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9178 "type": "github"
9179 },
9180 "original": {
9181 "owner": "NixOS",
9182 "ref": "nixos-22.11",
9183 "repo": "nixpkgs",
9184 "type": "github"
9185 }
9186 },
9187 "stable_6": {
9188 "locked": {
9189 "lastModified": 1669735802,
9190 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9191 "owner": "NixOS",
9192 "repo": "nixpkgs",
9193 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9194 "type": "github"
9195 },
9196 "original": {
9197 "owner": "NixOS",
9198 "ref": "nixos-22.11",
9199 "repo": "nixpkgs",
9200 "type": "github"
9201 }
9202 },
9203 "stable_7": {
9204 "locked": {
9205 "lastModified": 1669735802,
9206 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9207 "owner": "NixOS",
9208 "repo": "nixpkgs",
9209 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9210 "type": "github"
9211 },
9212 "original": {
9213 "owner": "NixOS",
9214 "ref": "nixos-22.11",
9215 "repo": "nixpkgs",
9216 "type": "github"
9217 }
9218 },
9219 "surfer": {
9220 "flake": false,
9221 "locked": {
9222 "lastModified": 1588637864,
9223 "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
9224 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9225 "revCount": 318,
9226 "type": "git",
9227 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9228 },
9229 "original": {
9230 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9231 "type": "git",
9232 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9233 }
9234 },
9235 "surfer_2": {
9236 "flake": false,
9237 "locked": {
9238 "lastModified": 1588637864,
9239 "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
9240 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9241 "revCount": 318,
9242 "type": "git",
9243 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9244 },
9245 "original": {
9246 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9247 "type": "git",
9248 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9249 }
9250 },
9251 "system": {
9252 "inputs": {
9253 "backports": "backports",
9254 "environment": "environment_7",
9255 "mypackages": "mypackages",
9256 "myuids": "myuids_6",
9257 "secrets-public": "secrets-public"
9258 },
9259 "locked": {
9260 "lastModified": 1,
9261 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9262 "path": "../../flakes/private/system",
9263 "type": "path"
9264 },
9265 "original": {
9266 "path": "../../flakes/private/system",
9267 "type": "path"
9268 }
9269 },
9270 "system_2": {
9271 "inputs": {
9272 "backports": "backports_2",
9273 "environment": "environment_11",
9274 "mypackages": "mypackages_2",
9275 "myuids": "myuids_8",
9276 "secrets-public": "secrets-public_2"
9277 },
9278 "locked": {
9279 "lastModified": 1,
9280 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9281 "path": "../../flakes/private/system",
9282 "type": "path"
9283 },
9284 "original": {
9285 "path": "../../flakes/private/system",
9286 "type": "path"
9287 }
9288 },
9289 "system_3": {
9290 "inputs": {
9291 "backports": "backports_4",
9292 "environment": "environment_22",
9293 "mypackages": "mypackages_7",
9294 "myuids": "myuids_24",
9295 "secrets-public": "secrets-public_4"
9296 },
9297 "locked": {
9298 "lastModified": 1,
9299 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9300 "path": "../../flakes/private/system",
9301 "type": "path"
9302 },
9303 "original": {
9304 "path": "../../flakes/private/system",
9305 "type": "path"
9306 }
9307 },
9308 "system_4": {
9309 "inputs": {
9310 "backports": "backports_5",
9311 "environment": "environment_25",
9312 "mypackages": "mypackages_8",
9313 "myuids": "myuids_27",
9314 "secrets-public": "secrets-public_5"
9315 },
9316 "locked": {
9317 "lastModified": 1,
9318 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9319 "path": "../../flakes/private/system",
9320 "type": "path"
9321 },
9322 "original": {
9323 "path": "../../flakes/private/system",
9324 "type": "path"
9325 }
9326 },
9327 "systems": {
9328 "locked": {
9329 "lastModified": 1681028828,
9330 "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
9331 "owner": "nix-systems",
9332 "repo": "default",
9333 "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
9334 "type": "github"
9335 },
9336 "original": {
9337 "owner": "nix-systems",
9338 "repo": "default",
9339 "type": "github"
9340 }
9341 },
9342 "taskwarrior-web": {
9343 "flake": false,
9344 "locked": {
9345 "lastModified": 1546434241,
9346 "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
9347 "owner": "theunraveler",
9348 "repo": "taskwarrior-web",
9349 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9350 "type": "github"
9351 },
9352 "original": {
9353 "owner": "theunraveler",
9354 "repo": "taskwarrior-web",
9355 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9356 "type": "github"
9357 }
9358 },
9359 "taskwarrior-web_2": {
9360 "flake": false,
9361 "locked": {
9362 "lastModified": 1546434241,
9363 "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
9364 "owner": "theunraveler",
9365 "repo": "taskwarrior-web",
9366 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9367 "type": "github"
9368 },
9369 "original": {
9370 "owner": "theunraveler",
9371 "repo": "taskwarrior-web",
9372 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9373 "type": "github"
9374 }
9375 },
9376 "treefmt-nix": {
9377 "inputs": {
9378 "nixpkgs": [
9379 "main-flake",
9380 "n-backup-2",
9381 "my-lib",
9382 "nixos-anywhere",
9383 "nixpkgs"
9384 ]
9385 },
9386 "locked": {
9387 "lastModified": 1687940979,
9388 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9389 "owner": "numtide",
9390 "repo": "treefmt-nix",
9391 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9392 "type": "github"
9393 },
9394 "original": {
9395 "owner": "numtide",
9396 "repo": "treefmt-nix",
9397 "type": "github"
9398 }
9399 },
9400 "treefmt-nix_2": {
9401 "inputs": {
9402 "nixpkgs": [
9403 "main-flake",
9404 "n-dilion",
9405 "my-lib",
9406 "nixos-anywhere",
9407 "nixpkgs"
9408 ]
9409 },
9410 "locked": {
9411 "lastModified": 1687940979,
9412 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9413 "owner": "numtide",
9414 "repo": "treefmt-nix",
9415 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9416 "type": "github"
9417 },
9418 "original": {
9419 "owner": "numtide",
9420 "repo": "treefmt-nix",
9421 "type": "github"
9422 }
9423 },
9424 "treefmt-nix_3": {
9425 "inputs": {
9426 "nixpkgs": [
9427 "main-flake",
9428 "n-eldiron",
9429 "my-lib",
9430 "nixos-anywhere",
9431 "nixpkgs"
9432 ]
9433 },
9434 "locked": {
9435 "lastModified": 1687940979,
9436 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9437 "owner": "numtide",
9438 "repo": "treefmt-nix",
9439 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9440 "type": "github"
9441 },
9442 "original": {
9443 "owner": "numtide",
9444 "repo": "treefmt-nix",
9445 "type": "github"
9446 }
9447 },
9448 "treefmt-nix_4": {
9449 "inputs": {
9450 "nixpkgs": [
9451 "main-flake",
9452 "n-monitoring-1",
9453 "my-lib",
9454 "nixos-anywhere",
9455 "nixpkgs"
9456 ]
9457 },
9458 "locked": {
9459 "lastModified": 1687940979,
9460 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9461 "owner": "numtide",
9462 "repo": "treefmt-nix",
9463 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9464 "type": "github"
9465 },
9466 "original": {
9467 "owner": "numtide",
9468 "repo": "treefmt-nix",
9469 "type": "github"
9470 }
9471 },
9472 "treefmt-nix_5": {
9473 "inputs": {
9474 "nixpkgs": [
9475 "main-flake",
9476 "n-quatresaisons",
9477 "my-lib",
9478 "nixos-anywhere",
9479 "nixpkgs"
9480 ]
9481 },
9482 "locked": {
9483 "lastModified": 1687940979,
9484 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9485 "owner": "numtide",
9486 "repo": "treefmt-nix",
9487 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9488 "type": "github"
9489 },
9490 "original": {
9491 "owner": "numtide",
9492 "repo": "treefmt-nix",
9493 "type": "github"
9494 }
9495 },
9496 "treefmt-nix_6": {
9497 "inputs": {
9498 "nixpkgs": [
9499 "main-flake",
9500 "n-zoldene",
9501 "my-lib",
9502 "nixos-anywhere",
9503 "nixpkgs"
9504 ]
9505 },
9506 "locked": {
9507 "lastModified": 1687940979,
9508 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9509 "owner": "numtide",
9510 "repo": "treefmt-nix",
9511 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9512 "type": "github"
9513 },
9514 "original": {
9515 "owner": "numtide",
9516 "repo": "treefmt-nix",
9517 "type": "github"
9518 }
9519 },
9520 "treefmt-nix_7": {
9521 "inputs": {
9522 "nixpkgs": [
9523 "main-flake",
9524 "s-lib",
9525 "nixos-anywhere",
9526 "nixpkgs"
9527 ]
9528 },
9529 "locked": {
9530 "lastModified": 1687940979,
9531 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9532 "owner": "numtide",
9533 "repo": "treefmt-nix",
9534 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9535 "type": "github"
9536 },
9537 "original": {
9538 "owner": "numtide",
9539 "repo": "treefmt-nix",
9540 "type": "github"
9541 }
9542 },
9543 "webapps-ttrss": {
9544 "flake": false,
9545 "locked": {
9546 "lastModified": 1546759381,
9547 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9548 "ref": "master",
9549 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9550 "revCount": 9256,
9551 "type": "git",
9552 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9553 },
9554 "original": {
9555 "ref": "master",
9556 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9557 "type": "git",
9558 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9559 }
9560 },
9561 "webapps-ttrss_10": {
9562 "flake": false,
9563 "locked": {
9564 "lastModified": 1546759381,
9565 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9566 "ref": "master",
9567 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9568 "revCount": 9256,
9569 "type": "git",
9570 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9571 },
9572 "original": {
9573 "ref": "master",
9574 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9575 "type": "git",
9576 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9577 }
9578 },
9579 "webapps-ttrss_11": {
9580 "flake": false,
9581 "locked": {
9582 "lastModified": 1546759381,
9583 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9584 "ref": "master",
9585 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9586 "revCount": 9256,
9587 "type": "git",
9588 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9589 },
9590 "original": {
9591 "ref": "master",
9592 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9593 "type": "git",
9594 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9595 }
9596 },
9597 "webapps-ttrss_12": {
9598 "flake": false,
9599 "locked": {
9600 "lastModified": 1546759381,
9601 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9602 "ref": "master",
9603 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9604 "revCount": 9256,
9605 "type": "git",
9606 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9607 },
9608 "original": {
9609 "ref": "master",
9610 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9611 "type": "git",
9612 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9613 }
9614 },
9615 "webapps-ttrss_13": {
9616 "flake": false,
9617 "locked": {
9618 "lastModified": 1546759381,
9619 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9620 "ref": "master",
9621 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9622 "revCount": 9256,
9623 "type": "git",
9624 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9625 },
9626 "original": {
9627 "ref": "master",
9628 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9629 "type": "git",
9630 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9631 }
9632 },
9633 "webapps-ttrss_14": {
9634 "flake": false,
9635 "locked": {
9636 "lastModified": 1546759381,
9637 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9638 "ref": "master",
9639 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9640 "revCount": 9256,
9641 "type": "git",
9642 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9643 },
9644 "original": {
9645 "ref": "master",
9646 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9647 "type": "git",
9648 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9649 }
9650 },
9651 "webapps-ttrss_15": {
9652 "flake": false,
9653 "locked": {
9654 "lastModified": 1546759381,
9655 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9656 "ref": "master",
9657 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9658 "revCount": 9256,
9659 "type": "git",
9660 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9661 },
9662 "original": {
9663 "ref": "master",
9664 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9665 "type": "git",
9666 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9667 }
9668 },
9669 "webapps-ttrss_2": {
9670 "flake": false,
9671 "locked": {
9672 "lastModified": 1546759381,
9673 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9674 "ref": "master",
9675 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9676 "revCount": 9256,
9677 "type": "git",
9678 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9679 },
9680 "original": {
9681 "ref": "master",
9682 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9683 "type": "git",
9684 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9685 }
9686 },
9687 "webapps-ttrss_3": {
9688 "flake": false,
9689 "locked": {
9690 "lastModified": 1546759381,
9691 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9692 "ref": "master",
9693 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9694 "revCount": 9256,
9695 "type": "git",
9696 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9697 },
9698 "original": {
9699 "ref": "master",
9700 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9701 "type": "git",
9702 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9703 }
9704 },
9705 "webapps-ttrss_4": {
9706 "flake": false,
9707 "locked": {
9708 "lastModified": 1546759381,
9709 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9710 "ref": "master",
9711 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9712 "revCount": 9256,
9713 "type": "git",
9714 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9715 },
9716 "original": {
9717 "ref": "master",
9718 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9719 "type": "git",
9720 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9721 }
9722 },
9723 "webapps-ttrss_5": {
9724 "flake": false,
9725 "locked": {
9726 "lastModified": 1546759381,
9727 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9728 "ref": "master",
9729 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9730 "revCount": 9256,
9731 "type": "git",
9732 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9733 },
9734 "original": {
9735 "ref": "master",
9736 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9737 "type": "git",
9738 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9739 }
9740 },
9741 "webapps-ttrss_6": {
9742 "flake": false,
9743 "locked": {
9744 "lastModified": 1546759381,
9745 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9746 "ref": "master",
9747 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9748 "revCount": 9256,
9749 "type": "git",
9750 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9751 },
9752 "original": {
9753 "ref": "master",
9754 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9755 "type": "git",
9756 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9757 }
9758 },
9759 "webapps-ttrss_7": {
9760 "flake": false,
9761 "locked": {
9762 "lastModified": 1546759381,
9763 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9764 "ref": "master",
9765 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9766 "revCount": 9256,
9767 "type": "git",
9768 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9769 },
9770 "original": {
9771 "ref": "master",
9772 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9773 "type": "git",
9774 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9775 }
9776 },
9777 "webapps-ttrss_8": {
9778 "flake": false,
9779 "locked": {
9780 "lastModified": 1546759381,
9781 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9782 "ref": "master",
9783 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9784 "revCount": 9256,
9785 "type": "git",
9786 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9787 },
9788 "original": {
9789 "ref": "master",
9790 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9791 "type": "git",
9792 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9793 }
9794 },
9795 "webapps-ttrss_9": {
9796 "flake": false,
9797 "locked": {
9798 "lastModified": 1546759381,
9799 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9800 "ref": "master",
9801 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9802 "revCount": 9256,
9803 "type": "git",
9804 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9805 },
9806 "original": {
9807 "ref": "master",
9808 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9809 "type": "git",
9810 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9811 }
9812 }
9813 },
9814 "root": "root",
9815 "version": 7
9816}
diff --git a/deploy/flake.nix b/deploy/flake.nix
new file mode 100644
index 0000000..f613b19
--- /dev/null
+++ b/deploy/flake.nix
@@ -0,0 +1,45 @@
1{
2 inputs = {
3 devshell.url = "github:numtide/devshell";
4 nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable?dir=lib";
5 # Uncomment temporarily below value and replace with local path to
6 # your secrets, and replace "follows" key below to use it.
7 #secrets-local.url = "path:/home/immae/projets/mes_sites/nixops-secrets";
8 secrets = {
9 type = "git";
10 url = "git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets";
11 ref = "master";
12 };
13 main-flake.url = "path:../flakes";
14 main-flake.inputs.secrets.follows = "secrets";
15 };
16 outputs = inputs@{ self, nixpkgs, main-flake, devshell, ... }: {
17 sops-vars-file = (inputs.secrets-local or inputs.secrets).vars-file;
18 # FIXME: next line Can be removed in nix 2.16.*
19 devShell.x86_64-linux = self.devShells.x86_64-linux.default;
20 devShells.x86_64-linux.default = devshell.legacyPackages.x86_64-linux.mkShell {
21 env = [
22 { name = "NIX_BUILD_TOP"; value = ""; }
23 { name = "SOPS_VARS_FILE"; value = builtins.toString self.sops-vars-file; }
24 ];
25 };
26 colmena =
27 let
28 nodeFlakes = main-flake.subflakes.nodes;
29 hosts = builtins.attrNames nodeFlakes;
30 toHostNixpkgs = name: nodeFlakes.${name}.colmena.meta.nixpkgs;
31 toHostSpecialArgs = name: nodeFlakes.${name}.colmena.meta.specialArgs;
32 toHostColmena = name: nodeFlakes.${name}.colmena.${name};
33
34 in nixpkgs.lib.genAttrs hosts toHostColmena
35 // {
36 meta = {
37 # nixpkgs is required for colmena, but only lib is actually used
38 nixpkgs.lib = nixpkgs.lib;
39 specialArgs.secrets = main-flake.subflakes.secrets;
40 nodeNixpkgs = nixpkgs.lib.genAttrs hosts toHostNixpkgs;
41 nodeSpecialArgs = nixpkgs.lib.genAttrs hosts toHostSpecialArgs;
42 };
43 };
44 };
45}
diff --git a/environments/default.nix b/environments/default.nix
deleted file mode 100644
index 5f17eb9..0000000
--- a/environments/default.nix
+++ /dev/null
@@ -1,4 +0,0 @@
1{ callPackage }:
2{
3 immae-eu = callPackage ./immae-eu.nix {};
4}
diff --git a/environments/immae-eu.nix b/environments/immae-eu.nix
deleted file mode 100644
index 4def84b..0000000
--- a/environments/immae-eu.nix
+++ /dev/null
@@ -1,146 +0,0 @@
1{ pkgs }: with pkgs;
2let
3 # https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh
4 # https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks
5 vlock' = vlock.overrideAttrs(old: {
6 configureFlags = old.configureFlags ++ [ "--enable-root-password=no" ];
7 });
8 paths = [
9 # archives
10 lzo unzip bzip2 xz
11 # unrar is unfree
12
13 # backups
14 duply
15
16 # calendar/contacts
17 abook khard khal cadaver vdirsyncerStable pal
18
19 # computing
20 boinctui
21
22 # cryptocurrencies
23 monero
24 cointop
25 # failing xmr-stak
26 solc
27 iota-cli-app
28
29 # debugging
30 rr valgrind netcat-gnu strace shellcheck
31
32 # documentations
33 unicodeDoc
34
35 # e-mails
36 muttprint mutt-ics
37 notmuch-python2 notmuch-python3 notmuch-vim
38 neomutt mairix
39 bogofilter fetchmail
40 sieve-connect
41
42 # git
43 vcsh gitRepo stgit tig ripgrep mr
44
45 # graphical tools
46 nextcloud-client firefox
47 dwm dmenu st xorg.xauth tigervnc
48
49 # images
50 feh imagemagick tiv graphicsmagick qrcode
51
52 # internet browsing
53 w3m lynx links elinks browsh woob urlview urlscan googler urlwatch
54
55 # less
56 python3Packages.pygments lesspipe highlight sourceHighlight
57
58 # monitoring
59 cnagios mtop pg_activity nagios-cli mtr
60 iftop htop iotop iperf bonfire
61 goaccess tcpdump tshark tcpflow
62 mitmproxy
63 # nagnu
64
65 # messaging/forums/news
66 flrn slrn
67 signal-cli signaldctl
68 telegram-cli telegram-history-dump telegramircd
69 weechat profanity
70 newsboat irssi
71
72 # nix
73 yarn2nix-moretea.yarn2nix nixUnstable
74 nixops nix-prefetch-scripts nix-generate-from-cpan
75 bundix nodePackages.bower2nix nix-diff
76 nodePackages.node2nix niv
77 # (nixos {}).nixos-generate-config
78 # (nixos {}).nixos-install
79 # (nixos {}).nixos-enter
80 # (nixos {}).manual.manpages
81
82 # note taking
83 note terminal-velocity jrnl doing nb
84
85 # office
86 sc-im ranger
87 genius bc
88 ledger
89 tmux
90 rtorrent
91 ldapvi
92 fzf
93 buku
94 vimPlugins.vim-plug
95 (vim_configurable.override { python = python3; })
96 mailcap
97 webapps.surfer
98
99 # password management
100 (pass.withExtensions (exts: [ exts.pass-otp ])) apg pwgen
101
102 # pdf
103 pdftk poppler_utils
104
105 # programming
106 pelican emacs26-nox ctags
107 wdiff patch gnumake
108
109 # security
110 keybase gnupg
111
112 # todolist/time management
113 taskwarrior vit timewarrior taskopen
114 bugwarrior
115
116 # video/music
117 youtube-dl ncmpc ncmpcpp ffmpeg
118
119 # s6 tools (part of skawarePackages)
120 skalibs execline s6 s6-dns s6-linux-utils s6-networking
121 s6-portable-utils
122
123 # system tools
124 telnet bind.dnsutils httpie ngrep nmap p0f socat lsof psmisc
125 wget patchelf rename tmux (lib.meta.hiPrio nettools)
126 vlock' mosh manpages openssl openssl.doc openssl.man
127 sshfs ncdu procps-ng
128
129 # other tools
130 pgloader s3cmd lftp jq cpulimit libxslt gandi-cli bubblewrap
131
132 # Terraform + AWS
133 terraform_0_12 awscli
134 ansible python3Packages.boto
135 openvpn
136
137 zsh-completions
138 ];
139in
140buildEnv {
141 name = "immae-eu-packages";
142 inherit paths;
143 pathsToLink = [ "/bin" "/etc" "/include" "/lib" "/libexec" "/share"];
144 extraOutputsToInstall = [ "bin" "man" "doc" "info" ];
145 passthru = { packages = paths; };
146}
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..b109986
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,9825 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_6",
6 "nixpkgs": "nixpkgs_11"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "backports_2": {
20 "inputs": {
21 "flake-utils": "flake-utils_8",
22 "nixpkgs": "nixpkgs_18"
23 },
24 "locked": {
25 "lastModified": 1,
26 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
27 "path": "../../backports",
28 "type": "path"
29 },
30 "original": {
31 "path": "../../backports",
32 "type": "path"
33 }
34 },
35 "backports_3": {
36 "inputs": {
37 "flake-utils": "flake-utils_20",
38 "nixpkgs": "nixpkgs_34"
39 },
40 "locked": {
41 "lastModified": 1,
42 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
43 "path": "../../backports",
44 "type": "path"
45 },
46 "original": {
47 "path": "../../backports",
48 "type": "path"
49 }
50 },
51 "backports_4": {
52 "inputs": {
53 "flake-utils": "flake-utils_34",
54 "nixpkgs": "nixpkgs_57"
55 },
56 "locked": {
57 "lastModified": 1,
58 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
59 "path": "../../backports",
60 "type": "path"
61 },
62 "original": {
63 "path": "../../backports",
64 "type": "path"
65 }
66 },
67 "backports_5": {
68 "inputs": {
69 "flake-utils": "flake-utils_37",
70 "nixpkgs": "nixpkgs_65"
71 },
72 "locked": {
73 "lastModified": 1,
74 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
75 "path": "../../backports",
76 "type": "path"
77 },
78 "original": {
79 "path": "../../backports",
80 "type": "path"
81 }
82 },
83 "backports_6": {
84 "inputs": {
85 "flake-utils": "flake-utils_39",
86 "nixpkgs": "nixpkgs_72"
87 },
88 "locked": {
89 "lastModified": 1,
90 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
91 "path": "../../backports",
92 "type": "path"
93 },
94 "original": {
95 "path": "../../backports",
96 "type": "path"
97 }
98 },
99 "backports_7": {
100 "inputs": {
101 "flake-utils": "flake-utils_61",
102 "nixpkgs": "nixpkgs_101"
103 },
104 "locked": {
105 "lastModified": 1,
106 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
107 "path": "../../backports",
108 "type": "path"
109 },
110 "original": {
111 "path": "../../backports",
112 "type": "path"
113 }
114 },
115 "buildslist": {
116 "flake": false,
117 "locked": {
118 "lastModified": 1585697026,
119 "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
120 "ref": "master",
121 "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
122 "revCount": 4,
123 "type": "git",
124 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
125 },
126 "original": {
127 "type": "git",
128 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
129 }
130 },
131 "buildslist_2": {
132 "flake": false,
133 "locked": {
134 "lastModified": 1585697026,
135 "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
136 "ref": "master",
137 "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
138 "revCount": 4,
139 "type": "git",
140 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
141 },
142 "original": {
143 "type": "git",
144 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
145 }
146 },
147 "chatons": {
148 "inputs": {
149 "environment": "environment"
150 },
151 "locked": {
152 "lastModified": 1,
153 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
154 "path": "../../flakes/private/chatons",
155 "type": "path"
156 },
157 "original": {
158 "path": "../../flakes/private/chatons",
159 "type": "path"
160 }
161 },
162 "chatons_2": {
163 "inputs": {
164 "environment": "environment_18"
165 },
166 "locked": {
167 "lastModified": 1,
168 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
169 "path": "../../flakes/private/chatons",
170 "type": "path"
171 },
172 "original": {
173 "path": "../../flakes/private/chatons",
174 "type": "path"
175 }
176 },
177 "colmena": {
178 "inputs": {
179 "flake-compat": "flake-compat",
180 "flake-utils": "flake-utils_3",
181 "nixpkgs": "nixpkgs_4",
182 "stable": "stable"
183 },
184 "locked": {
185 "lastModified": 1687954574,
186 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
187 "owner": "immae",
188 "repo": "colmena",
189 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
190 "type": "github"
191 },
192 "original": {
193 "owner": "immae",
194 "ref": "add-lib-get-flake",
195 "repo": "colmena",
196 "type": "github"
197 }
198 },
199 "colmena_2": {
200 "inputs": {
201 "flake-compat": "flake-compat_2",
202 "flake-utils": "flake-utils_7",
203 "nixpkgs": "nixpkgs_13",
204 "stable": "stable_2"
205 },
206 "locked": {
207 "lastModified": 1687954574,
208 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
209 "owner": "immae",
210 "repo": "colmena",
211 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
212 "type": "github"
213 },
214 "original": {
215 "owner": "immae",
216 "ref": "add-lib-get-flake",
217 "repo": "colmena",
218 "type": "github"
219 }
220 },
221 "colmena_3": {
222 "inputs": {
223 "flake-compat": "flake-compat_3",
224 "flake-utils": "flake-utils_10",
225 "nixpkgs": "nixpkgs_20",
226 "stable": "stable_3"
227 },
228 "locked": {
229 "lastModified": 1687954574,
230 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
231 "owner": "immae",
232 "repo": "colmena",
233 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
234 "type": "github"
235 },
236 "original": {
237 "owner": "immae",
238 "ref": "add-lib-get-flake",
239 "repo": "colmena",
240 "type": "github"
241 }
242 },
243 "colmena_4": {
244 "inputs": {
245 "flake-compat": "flake-compat_4",
246 "flake-utils": "flake-utils_32",
247 "nixpkgs": "nixpkgs_51",
248 "stable": "stable_4"
249 },
250 "locked": {
251 "lastModified": 1687954574,
252 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
253 "owner": "immae",
254 "repo": "colmena",
255 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
256 "type": "github"
257 },
258 "original": {
259 "owner": "immae",
260 "ref": "add-lib-get-flake",
261 "repo": "colmena",
262 "type": "github"
263 }
264 },
265 "colmena_5": {
266 "inputs": {
267 "flake-compat": "flake-compat_5",
268 "flake-utils": "flake-utils_35",
269 "nixpkgs": "nixpkgs_59",
270 "stable": "stable_5"
271 },
272 "locked": {
273 "lastModified": 1687954574,
274 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
275 "owner": "immae",
276 "repo": "colmena",
277 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
278 "type": "github"
279 },
280 "original": {
281 "owner": "immae",
282 "ref": "add-lib-get-flake",
283 "repo": "colmena",
284 "type": "github"
285 }
286 },
287 "colmena_6": {
288 "inputs": {
289 "flake-compat": "flake-compat_6",
290 "flake-utils": "flake-utils_38",
291 "nixpkgs": "nixpkgs_67",
292 "stable": "stable_6"
293 },
294 "locked": {
295 "lastModified": 1687954574,
296 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
297 "owner": "immae",
298 "repo": "colmena",
299 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
300 "type": "github"
301 },
302 "original": {
303 "owner": "immae",
304 "ref": "add-lib-get-flake",
305 "repo": "colmena",
306 "type": "github"
307 }
308 },
309 "colmena_7": {
310 "inputs": {
311 "flake-compat": "flake-compat_7",
312 "flake-utils": "flake-utils_45",
313 "nixpkgs": "nixpkgs_81",
314 "stable": "stable_7"
315 },
316 "locked": {
317 "lastModified": 1687954574,
318 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
319 "owner": "immae",
320 "repo": "colmena",
321 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
322 "type": "github"
323 },
324 "original": {
325 "owner": "immae",
326 "ref": "add-lib-get-flake",
327 "repo": "colmena",
328 "type": "github"
329 }
330 },
331 "copanier": {
332 "flake": false,
333 "locked": {
334 "lastModified": 1633895178,
335 "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
336 "owner": "spiral-project",
337 "repo": "copanier",
338 "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
339 "type": "github"
340 },
341 "original": {
342 "owner": "spiral-project",
343 "repo": "copanier",
344 "type": "github"
345 }
346 },
347 "copanier_2": {
348 "flake": false,
349 "locked": {
350 "lastModified": 1633895178,
351 "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
352 "owner": "spiral-project",
353 "repo": "copanier",
354 "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
355 "type": "github"
356 },
357 "original": {
358 "owner": "spiral-project",
359 "repo": "copanier",
360 "type": "github"
361 }
362 },
363 "devshell": {
364 "inputs": {
365 "nixpkgs": "nixpkgs",
366 "systems": "systems"
367 },
368 "locked": {
369 "lastModified": 1688380630,
370 "narHash": "sha256-8ilApWVb1mAi4439zS3iFeIT0ODlbrifm/fegWwgHjA=",
371 "owner": "numtide",
372 "repo": "devshell",
373 "rev": "f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205",
374 "type": "github"
375 },
376 "original": {
377 "owner": "numtide",
378 "repo": "devshell",
379 "type": "github"
380 }
381 },
382 "diaspora": {
383 "flake": false,
384 "locked": {
385 "lastModified": 1551139311,
386 "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
387 "owner": "diaspora",
388 "repo": "diaspora",
389 "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
390 "type": "github"
391 },
392 "original": {
393 "owner": "diaspora",
394 "ref": "v0.7.10.0",
395 "repo": "diaspora",
396 "type": "github"
397 }
398 },
399 "diaspora_2": {
400 "flake": false,
401 "locked": {
402 "lastModified": 1551139311,
403 "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
404 "owner": "diaspora",
405 "repo": "diaspora",
406 "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
407 "type": "github"
408 },
409 "original": {
410 "owner": "diaspora",
411 "ref": "v0.7.10.0",
412 "repo": "diaspora",
413 "type": "github"
414 }
415 },
416 "disko": {
417 "inputs": {
418 "nixpkgs": "nixpkgs_5"
419 },
420 "locked": {
421 "lastModified": 1687968164,
422 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
423 "owner": "nix-community",
424 "repo": "disko",
425 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
426 "type": "github"
427 },
428 "original": {
429 "owner": "nix-community",
430 "repo": "disko",
431 "type": "github"
432 }
433 },
434 "disko_2": {
435 "inputs": {
436 "nixpkgs": "nixpkgs_14"
437 },
438 "locked": {
439 "lastModified": 1687968164,
440 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
441 "owner": "nix-community",
442 "repo": "disko",
443 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
444 "type": "github"
445 },
446 "original": {
447 "owner": "nix-community",
448 "repo": "disko",
449 "type": "github"
450 }
451 },
452 "disko_3": {
453 "inputs": {
454 "nixpkgs": "nixpkgs_21"
455 },
456 "locked": {
457 "lastModified": 1687968164,
458 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
459 "owner": "nix-community",
460 "repo": "disko",
461 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
462 "type": "github"
463 },
464 "original": {
465 "owner": "nix-community",
466 "repo": "disko",
467 "type": "github"
468 }
469 },
470 "disko_4": {
471 "inputs": {
472 "nixpkgs": "nixpkgs_52"
473 },
474 "locked": {
475 "lastModified": 1687968164,
476 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
477 "owner": "nix-community",
478 "repo": "disko",
479 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
480 "type": "github"
481 },
482 "original": {
483 "owner": "nix-community",
484 "repo": "disko",
485 "type": "github"
486 }
487 },
488 "disko_5": {
489 "inputs": {
490 "nixpkgs": "nixpkgs_60"
491 },
492 "locked": {
493 "lastModified": 1687968164,
494 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
495 "owner": "nix-community",
496 "repo": "disko",
497 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
498 "type": "github"
499 },
500 "original": {
501 "owner": "nix-community",
502 "repo": "disko",
503 "type": "github"
504 }
505 },
506 "disko_6": {
507 "inputs": {
508 "nixpkgs": "nixpkgs_68"
509 },
510 "locked": {
511 "lastModified": 1687968164,
512 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
513 "owner": "nix-community",
514 "repo": "disko",
515 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
516 "type": "github"
517 },
518 "original": {
519 "owner": "nix-community",
520 "repo": "disko",
521 "type": "github"
522 }
523 },
524 "disko_7": {
525 "inputs": {
526 "nixpkgs": "nixpkgs_82"
527 },
528 "locked": {
529 "lastModified": 1687968164,
530 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
531 "owner": "nix-community",
532 "repo": "disko",
533 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
534 "type": "github"
535 },
536 "original": {
537 "owner": "nix-community",
538 "repo": "disko",
539 "type": "github"
540 }
541 },
542 "dns-nix": {
543 "inputs": {
544 "flake-utils": "flake-utils_9",
545 "nixpkgs": [
546 "flakes",
547 "n-eldiron",
548 "nixpkgs"
549 ]
550 },
551 "locked": {
552 "lastModified": 1635273082,
553 "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=",
554 "owner": "kirelagin",
555 "repo": "dns.nix",
556 "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a",
557 "type": "github"
558 },
559 "original": {
560 "owner": "kirelagin",
561 "repo": "dns.nix",
562 "type": "github"
563 }
564 },
565 "environment": {
566 "locked": {
567 "lastModified": 1,
568 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
569 "path": "../environment",
570 "type": "path"
571 },
572 "original": {
573 "path": "../environment",
574 "type": "path"
575 }
576 },
577 "environment_10": {
578 "locked": {
579 "lastModified": 1,
580 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
581 "path": "../environment",
582 "type": "path"
583 },
584 "original": {
585 "path": "../environment",
586 "type": "path"
587 }
588 },
589 "environment_11": {
590 "locked": {
591 "lastModified": 1,
592 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
593 "path": "../environment",
594 "type": "path"
595 },
596 "original": {
597 "path": "../environment",
598 "type": "path"
599 }
600 },
601 "environment_12": {
602 "locked": {
603 "lastModified": 1,
604 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
605 "path": "../environment",
606 "type": "path"
607 },
608 "original": {
609 "path": "../environment",
610 "type": "path"
611 }
612 },
613 "environment_13": {
614 "locked": {
615 "lastModified": 1,
616 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
617 "path": "../environment",
618 "type": "path"
619 },
620 "original": {
621 "path": "../environment",
622 "type": "path"
623 }
624 },
625 "environment_14": {
626 "locked": {
627 "lastModified": 1,
628 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
629 "path": "../environment",
630 "type": "path"
631 },
632 "original": {
633 "path": "../environment",
634 "type": "path"
635 }
636 },
637 "environment_15": {
638 "locked": {
639 "lastModified": 1,
640 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
641 "path": "../environment",
642 "type": "path"
643 },
644 "original": {
645 "path": "../environment",
646 "type": "path"
647 }
648 },
649 "environment_16": {
650 "locked": {
651 "lastModified": 1,
652 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
653 "path": "../environment",
654 "type": "path"
655 },
656 "original": {
657 "path": "../environment",
658 "type": "path"
659 }
660 },
661 "environment_17": {
662 "locked": {
663 "lastModified": 1,
664 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
665 "path": "../environment",
666 "type": "path"
667 },
668 "original": {
669 "path": "../environment",
670 "type": "path"
671 }
672 },
673 "environment_18": {
674 "locked": {
675 "lastModified": 1,
676 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
677 "path": "../environment",
678 "type": "path"
679 },
680 "original": {
681 "path": "../environment",
682 "type": "path"
683 }
684 },
685 "environment_19": {
686 "locked": {
687 "lastModified": 1,
688 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
689 "path": "../../flakes/private/environment",
690 "type": "path"
691 },
692 "original": {
693 "path": "../../flakes/private/environment",
694 "type": "path"
695 }
696 },
697 "environment_2": {
698 "locked": {
699 "lastModified": 1,
700 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
701 "path": "../../flakes/private/environment",
702 "type": "path"
703 },
704 "original": {
705 "path": "../../flakes/private/environment",
706 "type": "path"
707 }
708 },
709 "environment_20": {
710 "locked": {
711 "lastModified": 1,
712 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
713 "path": "../environment",
714 "type": "path"
715 },
716 "original": {
717 "path": "../environment",
718 "type": "path"
719 }
720 },
721 "environment_21": {
722 "locked": {
723 "lastModified": 1,
724 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
725 "path": "../environment",
726 "type": "path"
727 },
728 "original": {
729 "path": "../environment",
730 "type": "path"
731 }
732 },
733 "environment_22": {
734 "locked": {
735 "lastModified": 1,
736 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
737 "path": "../environment",
738 "type": "path"
739 },
740 "original": {
741 "path": "../environment",
742 "type": "path"
743 }
744 },
745 "environment_23": {
746 "locked": {
747 "lastModified": 1,
748 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
749 "path": "../../flakes/private/environment",
750 "type": "path"
751 },
752 "original": {
753 "path": "../../flakes/private/environment",
754 "type": "path"
755 }
756 },
757 "environment_24": {
758 "locked": {
759 "lastModified": 1,
760 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
761 "path": "../environment",
762 "type": "path"
763 },
764 "original": {
765 "path": "../environment",
766 "type": "path"
767 }
768 },
769 "environment_25": {
770 "locked": {
771 "lastModified": 1,
772 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
773 "path": "../environment",
774 "type": "path"
775 },
776 "original": {
777 "path": "../environment",
778 "type": "path"
779 }
780 },
781 "environment_26": {
782 "locked": {
783 "lastModified": 1,
784 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
785 "path": "../environment",
786 "type": "path"
787 },
788 "original": {
789 "path": "../environment",
790 "type": "path"
791 }
792 },
793 "environment_27": {
794 "locked": {
795 "lastModified": 1,
796 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
797 "path": "../environment",
798 "type": "path"
799 },
800 "original": {
801 "path": "../environment",
802 "type": "path"
803 }
804 },
805 "environment_28": {
806 "locked": {
807 "lastModified": 1,
808 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
809 "path": "../environment",
810 "type": "path"
811 },
812 "original": {
813 "path": "../environment",
814 "type": "path"
815 }
816 },
817 "environment_29": {
818 "locked": {
819 "lastModified": 1,
820 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
821 "path": "../environment",
822 "type": "path"
823 },
824 "original": {
825 "path": "../environment",
826 "type": "path"
827 }
828 },
829 "environment_3": {
830 "locked": {
831 "lastModified": 1,
832 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
833 "path": "../environment",
834 "type": "path"
835 },
836 "original": {
837 "path": "../environment",
838 "type": "path"
839 }
840 },
841 "environment_30": {
842 "locked": {
843 "lastModified": 1,
844 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
845 "path": "../environment",
846 "type": "path"
847 },
848 "original": {
849 "path": "../environment",
850 "type": "path"
851 }
852 },
853 "environment_31": {
854 "locked": {
855 "lastModified": 1,
856 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
857 "path": "../environment",
858 "type": "path"
859 },
860 "original": {
861 "path": "../environment",
862 "type": "path"
863 }
864 },
865 "environment_32": {
866 "locked": {
867 "lastModified": 1,
868 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
869 "path": "../environment",
870 "type": "path"
871 },
872 "original": {
873 "path": "../environment",
874 "type": "path"
875 }
876 },
877 "environment_33": {
878 "locked": {
879 "lastModified": 1,
880 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
881 "path": "../environment",
882 "type": "path"
883 },
884 "original": {
885 "path": "../environment",
886 "type": "path"
887 }
888 },
889 "environment_4": {
890 "locked": {
891 "lastModified": 1,
892 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
893 "path": "../environment",
894 "type": "path"
895 },
896 "original": {
897 "path": "../environment",
898 "type": "path"
899 }
900 },
901 "environment_5": {
902 "locked": {
903 "lastModified": 1,
904 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
905 "path": "../environment",
906 "type": "path"
907 },
908 "original": {
909 "path": "../environment",
910 "type": "path"
911 }
912 },
913 "environment_6": {
914 "locked": {
915 "lastModified": 1,
916 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
917 "path": "../environment",
918 "type": "path"
919 },
920 "original": {
921 "path": "../environment",
922 "type": "path"
923 }
924 },
925 "environment_7": {
926 "locked": {
927 "lastModified": 1,
928 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
929 "path": "../environment",
930 "type": "path"
931 },
932 "original": {
933 "path": "../environment",
934 "type": "path"
935 }
936 },
937 "environment_8": {
938 "locked": {
939 "lastModified": 1,
940 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
941 "path": "../../flakes/private/environment",
942 "type": "path"
943 },
944 "original": {
945 "path": "../../flakes/private/environment",
946 "type": "path"
947 }
948 },
949 "environment_9": {
950 "locked": {
951 "lastModified": 1,
952 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
953 "path": "../environment",
954 "type": "path"
955 },
956 "original": {
957 "path": "../environment",
958 "type": "path"
959 }
960 },
961 "etherpad-lite": {
962 "flake": false,
963 "locked": {
964 "lastModified": 1587951095,
965 "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
966 "owner": "ether",
967 "repo": "etherpad-lite",
968 "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
969 "type": "github"
970 },
971 "original": {
972 "owner": "ether",
973 "ref": "1.8.3",
974 "repo": "etherpad-lite",
975 "type": "github"
976 }
977 },
978 "etherpad-lite_2": {
979 "flake": false,
980 "locked": {
981 "lastModified": 1587951095,
982 "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
983 "owner": "ether",
984 "repo": "etherpad-lite",
985 "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
986 "type": "github"
987 },
988 "original": {
989 "owner": "ether",
990 "ref": "1.8.3",
991 "repo": "etherpad-lite",
992 "type": "github"
993 }
994 },
995 "files-watcher": {
996 "locked": {
997 "lastModified": 1,
998 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
999 "path": "../../files-watcher",
1000 "type": "path"
1001 },
1002 "original": {
1003 "path": "../../files-watcher",
1004 "type": "path"
1005 }
1006 },
1007 "files-watcher_10": {
1008 "locked": {
1009 "lastModified": 1,
1010 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1011 "path": "../../flakes/files-watcher",
1012 "type": "path"
1013 },
1014 "original": {
1015 "path": "../../flakes/files-watcher",
1016 "type": "path"
1017 }
1018 },
1019 "files-watcher_11": {
1020 "locked": {
1021 "lastModified": 1,
1022 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1023 "path": "../files-watcher",
1024 "type": "path"
1025 },
1026 "original": {
1027 "path": "../files-watcher",
1028 "type": "path"
1029 }
1030 },
1031 "files-watcher_12": {
1032 "locked": {
1033 "lastModified": 1,
1034 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1035 "path": "../files-watcher",
1036 "type": "path"
1037 },
1038 "original": {
1039 "path": "../files-watcher",
1040 "type": "path"
1041 }
1042 },
1043 "files-watcher_13": {
1044 "locked": {
1045 "lastModified": 1,
1046 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1047 "path": "../../files-watcher",
1048 "type": "path"
1049 },
1050 "original": {
1051 "path": "../../files-watcher",
1052 "type": "path"
1053 }
1054 },
1055 "files-watcher_14": {
1056 "locked": {
1057 "lastModified": 1,
1058 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1059 "path": "../../files-watcher",
1060 "type": "path"
1061 },
1062 "original": {
1063 "path": "../../files-watcher",
1064 "type": "path"
1065 }
1066 },
1067 "files-watcher_15": {
1068 "locked": {
1069 "lastModified": 1,
1070 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1071 "path": "../../files-watcher",
1072 "type": "path"
1073 },
1074 "original": {
1075 "path": "../../files-watcher",
1076 "type": "path"
1077 }
1078 },
1079 "files-watcher_2": {
1080 "locked": {
1081 "lastModified": 1,
1082 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1083 "path": "../../files-watcher",
1084 "type": "path"
1085 },
1086 "original": {
1087 "path": "../../files-watcher",
1088 "type": "path"
1089 }
1090 },
1091 "files-watcher_3": {
1092 "locked": {
1093 "lastModified": 1,
1094 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1095 "path": "../../files-watcher",
1096 "type": "path"
1097 },
1098 "original": {
1099 "path": "../../files-watcher",
1100 "type": "path"
1101 }
1102 },
1103 "files-watcher_4": {
1104 "locked": {
1105 "lastModified": 1,
1106 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1107 "path": "../../flakes/files-watcher",
1108 "type": "path"
1109 },
1110 "original": {
1111 "path": "../../flakes/files-watcher",
1112 "type": "path"
1113 }
1114 },
1115 "files-watcher_5": {
1116 "locked": {
1117 "lastModified": 1,
1118 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1119 "path": "../../files-watcher",
1120 "type": "path"
1121 },
1122 "original": {
1123 "path": "../../files-watcher",
1124 "type": "path"
1125 }
1126 },
1127 "files-watcher_6": {
1128 "locked": {
1129 "lastModified": 1,
1130 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1131 "path": "../../files-watcher",
1132 "type": "path"
1133 },
1134 "original": {
1135 "path": "../../files-watcher",
1136 "type": "path"
1137 }
1138 },
1139 "files-watcher_7": {
1140 "locked": {
1141 "lastModified": 1,
1142 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1143 "path": "../../files-watcher",
1144 "type": "path"
1145 },
1146 "original": {
1147 "path": "../../files-watcher",
1148 "type": "path"
1149 }
1150 },
1151 "files-watcher_8": {
1152 "locked": {
1153 "lastModified": 1,
1154 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1155 "path": "../files-watcher",
1156 "type": "path"
1157 },
1158 "original": {
1159 "path": "../files-watcher",
1160 "type": "path"
1161 }
1162 },
1163 "files-watcher_9": {
1164 "locked": {
1165 "lastModified": 1,
1166 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1167 "path": "../../flakes/files-watcher",
1168 "type": "path"
1169 },
1170 "original": {
1171 "path": "../../flakes/files-watcher",
1172 "type": "path"
1173 }
1174 },
1175 "flake-compat": {
1176 "flake": false,
1177 "locked": {
1178 "lastModified": 1650374568,
1179 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1180 "owner": "edolstra",
1181 "repo": "flake-compat",
1182 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1183 "type": "github"
1184 },
1185 "original": {
1186 "owner": "edolstra",
1187 "repo": "flake-compat",
1188 "type": "github"
1189 }
1190 },
1191 "flake-compat_2": {
1192 "flake": false,
1193 "locked": {
1194 "lastModified": 1650374568,
1195 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1196 "owner": "edolstra",
1197 "repo": "flake-compat",
1198 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1199 "type": "github"
1200 },
1201 "original": {
1202 "owner": "edolstra",
1203 "repo": "flake-compat",
1204 "type": "github"
1205 }
1206 },
1207 "flake-compat_3": {
1208 "flake": false,
1209 "locked": {
1210 "lastModified": 1650374568,
1211 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1212 "owner": "edolstra",
1213 "repo": "flake-compat",
1214 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1215 "type": "github"
1216 },
1217 "original": {
1218 "owner": "edolstra",
1219 "repo": "flake-compat",
1220 "type": "github"
1221 }
1222 },
1223 "flake-compat_4": {
1224 "flake": false,
1225 "locked": {
1226 "lastModified": 1650374568,
1227 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1228 "owner": "edolstra",
1229 "repo": "flake-compat",
1230 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1231 "type": "github"
1232 },
1233 "original": {
1234 "owner": "edolstra",
1235 "repo": "flake-compat",
1236 "type": "github"
1237 }
1238 },
1239 "flake-compat_5": {
1240 "flake": false,
1241 "locked": {
1242 "lastModified": 1650374568,
1243 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1244 "owner": "edolstra",
1245 "repo": "flake-compat",
1246 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1247 "type": "github"
1248 },
1249 "original": {
1250 "owner": "edolstra",
1251 "repo": "flake-compat",
1252 "type": "github"
1253 }
1254 },
1255 "flake-compat_6": {
1256 "flake": false,
1257 "locked": {
1258 "lastModified": 1650374568,
1259 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1260 "owner": "edolstra",
1261 "repo": "flake-compat",
1262 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1263 "type": "github"
1264 },
1265 "original": {
1266 "owner": "edolstra",
1267 "repo": "flake-compat",
1268 "type": "github"
1269 }
1270 },
1271 "flake-compat_7": {
1272 "flake": false,
1273 "locked": {
1274 "lastModified": 1650374568,
1275 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1276 "owner": "edolstra",
1277 "repo": "flake-compat",
1278 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1279 "type": "github"
1280 },
1281 "original": {
1282 "owner": "edolstra",
1283 "repo": "flake-compat",
1284 "type": "github"
1285 }
1286 },
1287 "flake-parts": {
1288 "inputs": {
1289 "nixpkgs-lib": "nixpkgs-lib"
1290 },
1291 "locked": {
1292 "lastModified": 1675295133,
1293 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1294 "owner": "hercules-ci",
1295 "repo": "flake-parts",
1296 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1297 "type": "github"
1298 },
1299 "original": {
1300 "owner": "hercules-ci",
1301 "repo": "flake-parts",
1302 "type": "github"
1303 }
1304 },
1305 "flake-parts_10": {
1306 "inputs": {
1307 "nixpkgs-lib": "nixpkgs-lib_13"
1308 },
1309 "locked": {
1310 "lastModified": 1675295133,
1311 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1312 "owner": "hercules-ci",
1313 "repo": "flake-parts",
1314 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1315 "type": "github"
1316 },
1317 "original": {
1318 "owner": "hercules-ci",
1319 "repo": "flake-parts",
1320 "type": "github"
1321 }
1322 },
1323 "flake-parts_11": {
1324 "inputs": {
1325 "nixpkgs-lib": "nixpkgs-lib_14"
1326 },
1327 "locked": {
1328 "lastModified": 1675295133,
1329 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1330 "owner": "hercules-ci",
1331 "repo": "flake-parts",
1332 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1333 "type": "github"
1334 },
1335 "original": {
1336 "owner": "hercules-ci",
1337 "repo": "flake-parts",
1338 "type": "github"
1339 }
1340 },
1341 "flake-parts_12": {
1342 "inputs": {
1343 "nixpkgs-lib": "nixpkgs-lib_16"
1344 },
1345 "locked": {
1346 "lastModified": 1687762428,
1347 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1348 "owner": "hercules-ci",
1349 "repo": "flake-parts",
1350 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1351 "type": "github"
1352 },
1353 "original": {
1354 "owner": "hercules-ci",
1355 "repo": "flake-parts",
1356 "type": "github"
1357 }
1358 },
1359 "flake-parts_13": {
1360 "inputs": {
1361 "nixpkgs-lib": "nixpkgs-lib_17"
1362 },
1363 "locked": {
1364 "lastModified": 1675295133,
1365 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1366 "owner": "hercules-ci",
1367 "repo": "flake-parts",
1368 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1369 "type": "github"
1370 },
1371 "original": {
1372 "owner": "hercules-ci",
1373 "repo": "flake-parts",
1374 "type": "github"
1375 }
1376 },
1377 "flake-parts_14": {
1378 "inputs": {
1379 "nixpkgs-lib": "nixpkgs-lib_19"
1380 },
1381 "locked": {
1382 "lastModified": 1687762428,
1383 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1384 "owner": "hercules-ci",
1385 "repo": "flake-parts",
1386 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1387 "type": "github"
1388 },
1389 "original": {
1390 "owner": "hercules-ci",
1391 "repo": "flake-parts",
1392 "type": "github"
1393 }
1394 },
1395 "flake-parts_15": {
1396 "inputs": {
1397 "nixpkgs-lib": "nixpkgs-lib_20"
1398 },
1399 "locked": {
1400 "lastModified": 1675295133,
1401 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1402 "owner": "hercules-ci",
1403 "repo": "flake-parts",
1404 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1405 "type": "github"
1406 },
1407 "original": {
1408 "owner": "hercules-ci",
1409 "repo": "flake-parts",
1410 "type": "github"
1411 }
1412 },
1413 "flake-parts_16": {
1414 "inputs": {
1415 "nixpkgs-lib": "nixpkgs-lib_21"
1416 },
1417 "locked": {
1418 "lastModified": 1687762428,
1419 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1420 "owner": "hercules-ci",
1421 "repo": "flake-parts",
1422 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1423 "type": "github"
1424 },
1425 "original": {
1426 "owner": "hercules-ci",
1427 "repo": "flake-parts",
1428 "type": "github"
1429 }
1430 },
1431 "flake-parts_17": {
1432 "inputs": {
1433 "nixpkgs-lib": "nixpkgs-lib_22"
1434 },
1435 "locked": {
1436 "lastModified": 1675295133,
1437 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1438 "owner": "hercules-ci",
1439 "repo": "flake-parts",
1440 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1441 "type": "github"
1442 },
1443 "original": {
1444 "owner": "hercules-ci",
1445 "repo": "flake-parts",
1446 "type": "github"
1447 }
1448 },
1449 "flake-parts_18": {
1450 "inputs": {
1451 "nixpkgs-lib": "nixpkgs-lib_23"
1452 },
1453 "locked": {
1454 "lastModified": 1675295133,
1455 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1456 "owner": "hercules-ci",
1457 "repo": "flake-parts",
1458 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1459 "type": "github"
1460 },
1461 "original": {
1462 "owner": "hercules-ci",
1463 "repo": "flake-parts",
1464 "type": "github"
1465 }
1466 },
1467 "flake-parts_19": {
1468 "inputs": {
1469 "nixpkgs-lib": "nixpkgs-lib_24"
1470 },
1471 "locked": {
1472 "lastModified": 1675295133,
1473 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1474 "owner": "hercules-ci",
1475 "repo": "flake-parts",
1476 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1477 "type": "github"
1478 },
1479 "original": {
1480 "owner": "hercules-ci",
1481 "repo": "flake-parts",
1482 "type": "github"
1483 }
1484 },
1485 "flake-parts_2": {
1486 "inputs": {
1487 "nixpkgs-lib": "nixpkgs-lib_3"
1488 },
1489 "locked": {
1490 "lastModified": 1687762428,
1491 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1492 "owner": "hercules-ci",
1493 "repo": "flake-parts",
1494 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1495 "type": "github"
1496 },
1497 "original": {
1498 "owner": "hercules-ci",
1499 "repo": "flake-parts",
1500 "type": "github"
1501 }
1502 },
1503 "flake-parts_20": {
1504 "inputs": {
1505 "nixpkgs-lib": "nixpkgs-lib_25"
1506 },
1507 "locked": {
1508 "lastModified": 1687762428,
1509 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1510 "owner": "hercules-ci",
1511 "repo": "flake-parts",
1512 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1513 "type": "github"
1514 },
1515 "original": {
1516 "owner": "hercules-ci",
1517 "repo": "flake-parts",
1518 "type": "github"
1519 }
1520 },
1521 "flake-parts_21": {
1522 "inputs": {
1523 "nixpkgs-lib": "nixpkgs-lib_26"
1524 },
1525 "locked": {
1526 "lastModified": 1675295133,
1527 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1528 "owner": "hercules-ci",
1529 "repo": "flake-parts",
1530 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1531 "type": "github"
1532 },
1533 "original": {
1534 "owner": "hercules-ci",
1535 "repo": "flake-parts",
1536 "type": "github"
1537 }
1538 },
1539 "flake-parts_22": {
1540 "inputs": {
1541 "nixpkgs-lib": "nixpkgs-lib_28"
1542 },
1543 "locked": {
1544 "lastModified": 1675295133,
1545 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1546 "owner": "hercules-ci",
1547 "repo": "flake-parts",
1548 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1549 "type": "github"
1550 },
1551 "original": {
1552 "owner": "hercules-ci",
1553 "repo": "flake-parts",
1554 "type": "github"
1555 }
1556 },
1557 "flake-parts_23": {
1558 "inputs": {
1559 "nixpkgs-lib": "nixpkgs-lib_29"
1560 },
1561 "locked": {
1562 "lastModified": 1675295133,
1563 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1564 "owner": "hercules-ci",
1565 "repo": "flake-parts",
1566 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1567 "type": "github"
1568 },
1569 "original": {
1570 "owner": "hercules-ci",
1571 "repo": "flake-parts",
1572 "type": "github"
1573 }
1574 },
1575 "flake-parts_3": {
1576 "inputs": {
1577 "nixpkgs-lib": "nixpkgs-lib_4"
1578 },
1579 "locked": {
1580 "lastModified": 1675295133,
1581 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1582 "owner": "hercules-ci",
1583 "repo": "flake-parts",
1584 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1585 "type": "github"
1586 },
1587 "original": {
1588 "owner": "hercules-ci",
1589 "repo": "flake-parts",
1590 "type": "github"
1591 }
1592 },
1593 "flake-parts_4": {
1594 "inputs": {
1595 "nixpkgs-lib": "nixpkgs-lib_6"
1596 },
1597 "locked": {
1598 "lastModified": 1687762428,
1599 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1600 "owner": "hercules-ci",
1601 "repo": "flake-parts",
1602 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1603 "type": "github"
1604 },
1605 "original": {
1606 "owner": "hercules-ci",
1607 "repo": "flake-parts",
1608 "type": "github"
1609 }
1610 },
1611 "flake-parts_5": {
1612 "inputs": {
1613 "nixpkgs-lib": "nixpkgs-lib_7"
1614 },
1615 "locked": {
1616 "lastModified": 1675295133,
1617 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1618 "owner": "hercules-ci",
1619 "repo": "flake-parts",
1620 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1621 "type": "github"
1622 },
1623 "original": {
1624 "owner": "hercules-ci",
1625 "repo": "flake-parts",
1626 "type": "github"
1627 }
1628 },
1629 "flake-parts_6": {
1630 "inputs": {
1631 "nixpkgs-lib": "nixpkgs-lib_8"
1632 },
1633 "locked": {
1634 "lastModified": 1687762428,
1635 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1636 "owner": "hercules-ci",
1637 "repo": "flake-parts",
1638 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1639 "type": "github"
1640 },
1641 "original": {
1642 "owner": "hercules-ci",
1643 "repo": "flake-parts",
1644 "type": "github"
1645 }
1646 },
1647 "flake-parts_7": {
1648 "inputs": {
1649 "nixpkgs-lib": "nixpkgs-lib_10"
1650 },
1651 "locked": {
1652 "lastModified": 1675295133,
1653 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1654 "owner": "hercules-ci",
1655 "repo": "flake-parts",
1656 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1657 "type": "github"
1658 },
1659 "original": {
1660 "owner": "hercules-ci",
1661 "repo": "flake-parts",
1662 "type": "github"
1663 }
1664 },
1665 "flake-parts_8": {
1666 "inputs": {
1667 "nixpkgs-lib": "nixpkgs-lib_11"
1668 },
1669 "locked": {
1670 "lastModified": 1675295133,
1671 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1672 "owner": "hercules-ci",
1673 "repo": "flake-parts",
1674 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1675 "type": "github"
1676 },
1677 "original": {
1678 "owner": "hercules-ci",
1679 "repo": "flake-parts",
1680 "type": "github"
1681 }
1682 },
1683 "flake-parts_9": {
1684 "inputs": {
1685 "nixpkgs-lib": "nixpkgs-lib_12"
1686 },
1687 "locked": {
1688 "lastModified": 1675295133,
1689 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1690 "owner": "hercules-ci",
1691 "repo": "flake-parts",
1692 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1693 "type": "github"
1694 },
1695 "original": {
1696 "owner": "hercules-ci",
1697 "repo": "flake-parts",
1698 "type": "github"
1699 }
1700 },
1701 "flake-utils": {
1702 "locked": {
1703 "lastModified": 1609246779,
1704 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1705 "owner": "numtide",
1706 "repo": "flake-utils",
1707 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1708 "type": "github"
1709 },
1710 "original": {
1711 "owner": "numtide",
1712 "repo": "flake-utils",
1713 "type": "github"
1714 }
1715 },
1716 "flake-utils_10": {
1717 "locked": {
1718 "lastModified": 1659877975,
1719 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
1720 "owner": "numtide",
1721 "repo": "flake-utils",
1722 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
1723 "type": "github"
1724 },
1725 "original": {
1726 "owner": "numtide",
1727 "repo": "flake-utils",
1728 "type": "github"
1729 }
1730 },
1731 "flake-utils_11": {
1732 "locked": {
1733 "lastModified": 1648297722,
1734 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1735 "owner": "numtide",
1736 "repo": "flake-utils",
1737 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1738 "type": "github"
1739 },
1740 "original": {
1741 "owner": "numtide",
1742 "repo": "flake-utils",
1743 "type": "github"
1744 }
1745 },
1746 "flake-utils_12": {
1747 "locked": {
1748 "lastModified": 1609246779,
1749 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1750 "owner": "numtide",
1751 "repo": "flake-utils",
1752 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1753 "type": "github"
1754 },
1755 "original": {
1756 "owner": "numtide",
1757 "repo": "flake-utils",
1758 "type": "github"
1759 }
1760 },
1761 "flake-utils_13": {
1762 "locked": {
1763 "lastModified": 1609246779,
1764 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1765 "owner": "numtide",
1766 "repo": "flake-utils",
1767 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1768 "type": "github"
1769 },
1770 "original": {
1771 "owner": "numtide",
1772 "repo": "flake-utils",
1773 "type": "github"
1774 }
1775 },
1776 "flake-utils_14": {
1777 "locked": {
1778 "lastModified": 1609246779,
1779 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1780 "owner": "numtide",
1781 "repo": "flake-utils",
1782 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1783 "type": "github"
1784 },
1785 "original": {
1786 "owner": "numtide",
1787 "repo": "flake-utils",
1788 "type": "github"
1789 }
1790 },
1791 "flake-utils_15": {
1792 "locked": {
1793 "lastModified": 1609246779,
1794 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1795 "owner": "numtide",
1796 "repo": "flake-utils",
1797 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1798 "type": "github"
1799 },
1800 "original": {
1801 "owner": "numtide",
1802 "repo": "flake-utils",
1803 "type": "github"
1804 }
1805 },
1806 "flake-utils_16": {
1807 "locked": {
1808 "lastModified": 1631561581,
1809 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
1810 "owner": "numtide",
1811 "repo": "flake-utils",
1812 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
1813 "type": "github"
1814 },
1815 "original": {
1816 "owner": "numtide",
1817 "repo": "flake-utils",
1818 "type": "github"
1819 }
1820 },
1821 "flake-utils_17": {
1822 "locked": {
1823 "lastModified": 1610051610,
1824 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
1825 "owner": "numtide",
1826 "repo": "flake-utils",
1827 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
1828 "type": "github"
1829 },
1830 "original": {
1831 "owner": "numtide",
1832 "repo": "flake-utils",
1833 "type": "github"
1834 }
1835 },
1836 "flake-utils_18": {
1837 "locked": {
1838 "lastModified": 1610051610,
1839 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
1840 "owner": "numtide",
1841 "repo": "flake-utils",
1842 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
1843 "type": "github"
1844 },
1845 "original": {
1846 "owner": "numtide",
1847 "repo": "flake-utils",
1848 "type": "github"
1849 }
1850 },
1851 "flake-utils_19": {
1852 "locked": {
1853 "lastModified": 1648297722,
1854 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1855 "owner": "numtide",
1856 "repo": "flake-utils",
1857 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1858 "type": "github"
1859 },
1860 "original": {
1861 "owner": "numtide",
1862 "repo": "flake-utils",
1863 "type": "github"
1864 }
1865 },
1866 "flake-utils_2": {
1867 "locked": {
1868 "lastModified": 1609246779,
1869 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1870 "owner": "numtide",
1871 "repo": "flake-utils",
1872 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1873 "type": "github"
1874 },
1875 "original": {
1876 "owner": "numtide",
1877 "repo": "flake-utils",
1878 "type": "github"
1879 }
1880 },
1881 "flake-utils_20": {
1882 "locked": {
1883 "lastModified": 1667395993,
1884 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
1885 "owner": "numtide",
1886 "repo": "flake-utils",
1887 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
1888 "type": "github"
1889 },
1890 "original": {
1891 "owner": "numtide",
1892 "repo": "flake-utils",
1893 "type": "github"
1894 }
1895 },
1896 "flake-utils_21": {
1897 "locked": {
1898 "lastModified": 1631561581,
1899 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
1900 "owner": "numtide",
1901 "repo": "flake-utils",
1902 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
1903 "type": "github"
1904 },
1905 "original": {
1906 "owner": "numtide",
1907 "repo": "flake-utils",
1908 "type": "github"
1909 }
1910 },
1911 "flake-utils_22": {
1912 "locked": {
1913 "lastModified": 1648297722,
1914 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1915 "owner": "numtide",
1916 "repo": "flake-utils",
1917 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1918 "type": "github"
1919 },
1920 "original": {
1921 "owner": "numtide",
1922 "repo": "flake-utils",
1923 "type": "github"
1924 }
1925 },
1926 "flake-utils_23": {
1927 "locked": {
1928 "lastModified": 1648297722,
1929 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1930 "owner": "numtide",
1931 "repo": "flake-utils",
1932 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1933 "type": "github"
1934 },
1935 "original": {
1936 "owner": "numtide",
1937 "repo": "flake-utils",
1938 "type": "github"
1939 }
1940 },
1941 "flake-utils_24": {
1942 "locked": {
1943 "lastModified": 1648297722,
1944 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1945 "owner": "numtide",
1946 "repo": "flake-utils",
1947 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1948 "type": "github"
1949 },
1950 "original": {
1951 "owner": "numtide",
1952 "repo": "flake-utils",
1953 "type": "github"
1954 }
1955 },
1956 "flake-utils_25": {
1957 "locked": {
1958 "lastModified": 1648297722,
1959 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1960 "owner": "numtide",
1961 "repo": "flake-utils",
1962 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1963 "type": "github"
1964 },
1965 "original": {
1966 "owner": "numtide",
1967 "repo": "flake-utils",
1968 "type": "github"
1969 }
1970 },
1971 "flake-utils_26": {
1972 "locked": {
1973 "lastModified": 1649676176,
1974 "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
1975 "owner": "numtide",
1976 "repo": "flake-utils",
1977 "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
1978 "type": "github"
1979 },
1980 "original": {
1981 "owner": "numtide",
1982 "repo": "flake-utils",
1983 "type": "github"
1984 }
1985 },
1986 "flake-utils_27": {
1987 "locked": {
1988 "lastModified": 1609246779,
1989 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1990 "owner": "numtide",
1991 "repo": "flake-utils",
1992 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1993 "type": "github"
1994 },
1995 "original": {
1996 "owner": "numtide",
1997 "repo": "flake-utils",
1998 "type": "github"
1999 }
2000 },
2001 "flake-utils_28": {
2002 "locked": {
2003 "lastModified": 1609246779,
2004 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2005 "owner": "numtide",
2006 "repo": "flake-utils",
2007 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2008 "type": "github"
2009 },
2010 "original": {
2011 "owner": "numtide",
2012 "repo": "flake-utils",
2013 "type": "github"
2014 }
2015 },
2016 "flake-utils_29": {
2017 "locked": {
2018 "lastModified": 1610051610,
2019 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
2020 "owner": "numtide",
2021 "repo": "flake-utils",
2022 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
2023 "type": "github"
2024 },
2025 "original": {
2026 "owner": "numtide",
2027 "repo": "flake-utils",
2028 "type": "github"
2029 }
2030 },
2031 "flake-utils_3": {
2032 "locked": {
2033 "lastModified": 1659877975,
2034 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2035 "owner": "numtide",
2036 "repo": "flake-utils",
2037 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2038 "type": "github"
2039 },
2040 "original": {
2041 "owner": "numtide",
2042 "repo": "flake-utils",
2043 "type": "github"
2044 }
2045 },
2046 "flake-utils_30": {
2047 "locked": {
2048 "lastModified": 1648297722,
2049 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2050 "owner": "numtide",
2051 "repo": "flake-utils",
2052 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2053 "type": "github"
2054 },
2055 "original": {
2056 "owner": "numtide",
2057 "repo": "flake-utils",
2058 "type": "github"
2059 }
2060 },
2061 "flake-utils_31": {
2062 "locked": {
2063 "lastModified": 1648297722,
2064 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2065 "owner": "numtide",
2066 "repo": "flake-utils",
2067 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2068 "type": "github"
2069 },
2070 "original": {
2071 "owner": "numtide",
2072 "repo": "flake-utils",
2073 "type": "github"
2074 }
2075 },
2076 "flake-utils_32": {
2077 "locked": {
2078 "lastModified": 1659877975,
2079 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2080 "owner": "numtide",
2081 "repo": "flake-utils",
2082 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2083 "type": "github"
2084 },
2085 "original": {
2086 "owner": "numtide",
2087 "repo": "flake-utils",
2088 "type": "github"
2089 }
2090 },
2091 "flake-utils_33": {
2092 "locked": {
2093 "lastModified": 1648297722,
2094 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2095 "owner": "numtide",
2096 "repo": "flake-utils",
2097 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2098 "type": "github"
2099 },
2100 "original": {
2101 "owner": "numtide",
2102 "repo": "flake-utils",
2103 "type": "github"
2104 }
2105 },
2106 "flake-utils_34": {
2107 "locked": {
2108 "lastModified": 1667395993,
2109 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2110 "owner": "numtide",
2111 "repo": "flake-utils",
2112 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2113 "type": "github"
2114 },
2115 "original": {
2116 "owner": "numtide",
2117 "repo": "flake-utils",
2118 "type": "github"
2119 }
2120 },
2121 "flake-utils_35": {
2122 "locked": {
2123 "lastModified": 1659877975,
2124 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2125 "owner": "numtide",
2126 "repo": "flake-utils",
2127 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2128 "type": "github"
2129 },
2130 "original": {
2131 "owner": "numtide",
2132 "repo": "flake-utils",
2133 "type": "github"
2134 }
2135 },
2136 "flake-utils_36": {
2137 "locked": {
2138 "lastModified": 1648297722,
2139 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2140 "owner": "numtide",
2141 "repo": "flake-utils",
2142 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2143 "type": "github"
2144 },
2145 "original": {
2146 "owner": "numtide",
2147 "repo": "flake-utils",
2148 "type": "github"
2149 }
2150 },
2151 "flake-utils_37": {
2152 "locked": {
2153 "lastModified": 1667395993,
2154 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2155 "owner": "numtide",
2156 "repo": "flake-utils",
2157 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2158 "type": "github"
2159 },
2160 "original": {
2161 "owner": "numtide",
2162 "repo": "flake-utils",
2163 "type": "github"
2164 }
2165 },
2166 "flake-utils_38": {
2167 "locked": {
2168 "lastModified": 1659877975,
2169 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2170 "owner": "numtide",
2171 "repo": "flake-utils",
2172 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2173 "type": "github"
2174 },
2175 "original": {
2176 "owner": "numtide",
2177 "repo": "flake-utils",
2178 "type": "github"
2179 }
2180 },
2181 "flake-utils_39": {
2182 "locked": {
2183 "lastModified": 1667395993,
2184 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2185 "owner": "numtide",
2186 "repo": "flake-utils",
2187 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2188 "type": "github"
2189 },
2190 "original": {
2191 "owner": "numtide",
2192 "repo": "flake-utils",
2193 "type": "github"
2194 }
2195 },
2196 "flake-utils_4": {
2197 "locked": {
2198 "lastModified": 1609246779,
2199 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2200 "owner": "numtide",
2201 "repo": "flake-utils",
2202 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2203 "type": "github"
2204 },
2205 "original": {
2206 "owner": "numtide",
2207 "repo": "flake-utils",
2208 "type": "github"
2209 }
2210 },
2211 "flake-utils_40": {
2212 "locked": {
2213 "lastModified": 1667395993,
2214 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2215 "owner": "numtide",
2216 "repo": "flake-utils",
2217 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2218 "type": "github"
2219 },
2220 "original": {
2221 "owner": "numtide",
2222 "repo": "flake-utils",
2223 "type": "github"
2224 }
2225 },
2226 "flake-utils_41": {
2227 "locked": {
2228 "lastModified": 1631561581,
2229 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
2230 "owner": "numtide",
2231 "repo": "flake-utils",
2232 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
2233 "type": "github"
2234 },
2235 "original": {
2236 "owner": "numtide",
2237 "repo": "flake-utils",
2238 "type": "github"
2239 }
2240 },
2241 "flake-utils_42": {
2242 "locked": {
2243 "lastModified": 1648297722,
2244 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2245 "owner": "numtide",
2246 "repo": "flake-utils",
2247 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2248 "type": "github"
2249 },
2250 "original": {
2251 "owner": "numtide",
2252 "repo": "flake-utils",
2253 "type": "github"
2254 }
2255 },
2256 "flake-utils_43": {
2257 "locked": {
2258 "lastModified": 1648297722,
2259 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2260 "owner": "numtide",
2261 "repo": "flake-utils",
2262 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2263 "type": "github"
2264 },
2265 "original": {
2266 "owner": "numtide",
2267 "repo": "flake-utils",
2268 "type": "github"
2269 }
2270 },
2271 "flake-utils_44": {
2272 "locked": {
2273 "lastModified": 1648297722,
2274 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2275 "owner": "numtide",
2276 "repo": "flake-utils",
2277 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2278 "type": "github"
2279 },
2280 "original": {
2281 "owner": "numtide",
2282 "repo": "flake-utils",
2283 "type": "github"
2284 }
2285 },
2286 "flake-utils_45": {
2287 "locked": {
2288 "lastModified": 1659877975,
2289 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2290 "owner": "numtide",
2291 "repo": "flake-utils",
2292 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2293 "type": "github"
2294 },
2295 "original": {
2296 "owner": "numtide",
2297 "repo": "flake-utils",
2298 "type": "github"
2299 }
2300 },
2301 "flake-utils_46": {
2302 "locked": {
2303 "lastModified": 1648297722,
2304 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2305 "owner": "numtide",
2306 "repo": "flake-utils",
2307 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2308 "type": "github"
2309 },
2310 "original": {
2311 "owner": "numtide",
2312 "repo": "flake-utils",
2313 "type": "github"
2314 }
2315 },
2316 "flake-utils_47": {
2317 "locked": {
2318 "lastModified": 1649676176,
2319 "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
2320 "owner": "numtide",
2321 "repo": "flake-utils",
2322 "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
2323 "type": "github"
2324 },
2325 "original": {
2326 "owner": "numtide",
2327 "repo": "flake-utils",
2328 "type": "github"
2329 }
2330 },
2331 "flake-utils_48": {
2332 "locked": {
2333 "lastModified": 1609246779,
2334 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2335 "owner": "numtide",
2336 "repo": "flake-utils",
2337 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2338 "type": "github"
2339 },
2340 "original": {
2341 "owner": "numtide",
2342 "repo": "flake-utils",
2343 "type": "github"
2344 }
2345 },
2346 "flake-utils_49": {
2347 "locked": {
2348 "lastModified": 1609246779,
2349 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2350 "owner": "numtide",
2351 "repo": "flake-utils",
2352 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2353 "type": "github"
2354 },
2355 "original": {
2356 "owner": "numtide",
2357 "repo": "flake-utils",
2358 "type": "github"
2359 }
2360 },
2361 "flake-utils_5": {
2362 "locked": {
2363 "lastModified": 1609246779,
2364 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2365 "owner": "numtide",
2366 "repo": "flake-utils",
2367 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2368 "type": "github"
2369 },
2370 "original": {
2371 "owner": "numtide",
2372 "repo": "flake-utils",
2373 "type": "github"
2374 }
2375 },
2376 "flake-utils_50": {
2377 "locked": {
2378 "lastModified": 1631561581,
2379 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
2380 "owner": "numtide",
2381 "repo": "flake-utils",
2382 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
2383 "type": "github"
2384 },
2385 "original": {
2386 "owner": "numtide",
2387 "repo": "flake-utils",
2388 "type": "github"
2389 }
2390 },
2391 "flake-utils_51": {
2392 "locked": {
2393 "lastModified": 1610051610,
2394 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
2395 "owner": "numtide",
2396 "repo": "flake-utils",
2397 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
2398 "type": "github"
2399 },
2400 "original": {
2401 "owner": "numtide",
2402 "repo": "flake-utils",
2403 "type": "github"
2404 }
2405 },
2406 "flake-utils_52": {
2407 "locked": {
2408 "lastModified": 1648297722,
2409 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2410 "owner": "numtide",
2411 "repo": "flake-utils",
2412 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2413 "type": "github"
2414 },
2415 "original": {
2416 "owner": "numtide",
2417 "repo": "flake-utils",
2418 "type": "github"
2419 }
2420 },
2421 "flake-utils_53": {
2422 "locked": {
2423 "lastModified": 1609246779,
2424 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2425 "owner": "numtide",
2426 "repo": "flake-utils",
2427 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2428 "type": "github"
2429 },
2430 "original": {
2431 "owner": "numtide",
2432 "repo": "flake-utils",
2433 "type": "github"
2434 }
2435 },
2436 "flake-utils_54": {
2437 "locked": {
2438 "lastModified": 1609246779,
2439 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2440 "owner": "numtide",
2441 "repo": "flake-utils",
2442 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2443 "type": "github"
2444 },
2445 "original": {
2446 "owner": "numtide",
2447 "repo": "flake-utils",
2448 "type": "github"
2449 }
2450 },
2451 "flake-utils_55": {
2452 "locked": {
2453 "lastModified": 1609246779,
2454 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2455 "owner": "numtide",
2456 "repo": "flake-utils",
2457 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2458 "type": "github"
2459 },
2460 "original": {
2461 "owner": "numtide",
2462 "repo": "flake-utils",
2463 "type": "github"
2464 }
2465 },
2466 "flake-utils_56": {
2467 "locked": {
2468 "lastModified": 1609246779,
2469 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2470 "owner": "numtide",
2471 "repo": "flake-utils",
2472 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2473 "type": "github"
2474 },
2475 "original": {
2476 "owner": "numtide",
2477 "repo": "flake-utils",
2478 "type": "github"
2479 }
2480 },
2481 "flake-utils_57": {
2482 "locked": {
2483 "lastModified": 1631561581,
2484 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
2485 "owner": "numtide",
2486 "repo": "flake-utils",
2487 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
2488 "type": "github"
2489 },
2490 "original": {
2491 "owner": "numtide",
2492 "repo": "flake-utils",
2493 "type": "github"
2494 }
2495 },
2496 "flake-utils_58": {
2497 "locked": {
2498 "lastModified": 1610051610,
2499 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
2500 "owner": "numtide",
2501 "repo": "flake-utils",
2502 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
2503 "type": "github"
2504 },
2505 "original": {
2506 "owner": "numtide",
2507 "repo": "flake-utils",
2508 "type": "github"
2509 }
2510 },
2511 "flake-utils_59": {
2512 "locked": {
2513 "lastModified": 1610051610,
2514 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
2515 "owner": "numtide",
2516 "repo": "flake-utils",
2517 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
2518 "type": "github"
2519 },
2520 "original": {
2521 "owner": "numtide",
2522 "repo": "flake-utils",
2523 "type": "github"
2524 }
2525 },
2526 "flake-utils_6": {
2527 "locked": {
2528 "lastModified": 1667395993,
2529 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2530 "owner": "numtide",
2531 "repo": "flake-utils",
2532 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2533 "type": "github"
2534 },
2535 "original": {
2536 "owner": "numtide",
2537 "repo": "flake-utils",
2538 "type": "github"
2539 }
2540 },
2541 "flake-utils_60": {
2542 "locked": {
2543 "lastModified": 1648297722,
2544 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2545 "owner": "numtide",
2546 "repo": "flake-utils",
2547 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2548 "type": "github"
2549 },
2550 "original": {
2551 "owner": "numtide",
2552 "repo": "flake-utils",
2553 "type": "github"
2554 }
2555 },
2556 "flake-utils_61": {
2557 "locked": {
2558 "lastModified": 1667395993,
2559 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2560 "owner": "numtide",
2561 "repo": "flake-utils",
2562 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2563 "type": "github"
2564 },
2565 "original": {
2566 "owner": "numtide",
2567 "repo": "flake-utils",
2568 "type": "github"
2569 }
2570 },
2571 "flake-utils_62": {
2572 "locked": {
2573 "lastModified": 1648297722,
2574 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2575 "owner": "numtide",
2576 "repo": "flake-utils",
2577 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2578 "type": "github"
2579 },
2580 "original": {
2581 "owner": "numtide",
2582 "repo": "flake-utils",
2583 "type": "github"
2584 }
2585 },
2586 "flake-utils_63": {
2587 "locked": {
2588 "lastModified": 1648297722,
2589 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2590 "owner": "numtide",
2591 "repo": "flake-utils",
2592 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2593 "type": "github"
2594 },
2595 "original": {
2596 "owner": "numtide",
2597 "repo": "flake-utils",
2598 "type": "github"
2599 }
2600 },
2601 "flake-utils_7": {
2602 "locked": {
2603 "lastModified": 1659877975,
2604 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2605 "owner": "numtide",
2606 "repo": "flake-utils",
2607 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2608 "type": "github"
2609 },
2610 "original": {
2611 "owner": "numtide",
2612 "repo": "flake-utils",
2613 "type": "github"
2614 }
2615 },
2616 "flake-utils_8": {
2617 "locked": {
2618 "lastModified": 1667395993,
2619 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2620 "owner": "numtide",
2621 "repo": "flake-utils",
2622 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2623 "type": "github"
2624 },
2625 "original": {
2626 "owner": "numtide",
2627 "repo": "flake-utils",
2628 "type": "github"
2629 }
2630 },
2631 "flake-utils_9": {
2632 "locked": {
2633 "lastModified": 1614513358,
2634 "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=",
2635 "owner": "numtide",
2636 "repo": "flake-utils",
2637 "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3",
2638 "type": "github"
2639 },
2640 "original": {
2641 "owner": "numtide",
2642 "repo": "flake-utils",
2643 "type": "github"
2644 }
2645 },
2646 "flakes": {
2647 "inputs": {
2648 "n-backup-2": "n-backup-2",
2649 "n-dilion": "n-dilion",
2650 "n-eldiron": "n-eldiron",
2651 "n-monitoring-1": "n-monitoring-1",
2652 "n-quatresaisons": "n-quatresaisons",
2653 "n-zoldene": "n-zoldene",
2654 "s-backports": "s-backports",
2655 "s-copanier": "s-copanier",
2656 "s-diaspora": "s-diaspora",
2657 "s-etherpad-lite": "s-etherpad-lite",
2658 "s-fiche": "s-fiche",
2659 "s-files-watcher": "s-files-watcher",
2660 "s-grocy": "s-grocy",
2661 "s-lib": "s-lib",
2662 "s-loginctl-linger": "s-loginctl-linger",
2663 "s-mastodon": "s-mastodon",
2664 "s-mediagoblin": "s-mediagoblin",
2665 "s-multi-apache-container": "s-multi-apache-container",
2666 "s-mypackages": "s-mypackages",
2667 "s-myuids": "s-myuids",
2668 "s-naemon": "s-naemon",
2669 "s-openarc": "s-openarc",
2670 "s-opendmarc": "s-opendmarc",
2671 "s-paste": "s-paste",
2672 "s-peertube": "s-peertube",
2673 "s-private-buildbot": "s-private-buildbot",
2674 "s-private-chatons": "s-private-chatons",
2675 "s-private-environment": "s-private-environment",
2676 "s-private-mail-relay": "s-private-mail-relay",
2677 "s-private-milters": "s-private-milters",
2678 "s-private-monitoring": "s-private-monitoring",
2679 "s-private-openarc": "s-private-openarc",
2680 "s-private-opendmarc": "s-private-opendmarc",
2681 "s-private-openldap": "s-private-openldap",
2682 "s-private-paste": "s-private-paste",
2683 "s-private-peertube": "s-private-peertube",
2684 "s-private-php": "s-private-php",
2685 "s-private-ssh": "s-private-ssh",
2686 "s-private-system": "s-private-system",
2687 "s-rsync_backup": "s-rsync_backup",
2688 "s-secrets": "s-secrets",
2689 "s-surfer": "s-surfer",
2690 "s-taskwarrior-web": "s-taskwarrior-web",
2691 "secrets": "secrets_26"
2692 },
2693 "locked": {
2694 "lastModified": 1,
2695 "narHash": "sha256-LBw8FCxHXW6b1WFvsEnmLmNpZjow6+N4Q+3zAfcudIU=",
2696 "path": "./flakes",
2697 "type": "path"
2698 },
2699 "original": {
2700 "path": "./flakes",
2701 "type": "path"
2702 }
2703 },
2704 "grocy": {
2705 "flake": false,
2706 "locked": {
2707 "lastModified": 1585166193,
2708 "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
2709 "owner": "grocy",
2710 "repo": "grocy",
2711 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2712 "type": "github"
2713 },
2714 "original": {
2715 "owner": "grocy",
2716 "repo": "grocy",
2717 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2718 "type": "github"
2719 }
2720 },
2721 "grocy_2": {
2722 "flake": false,
2723 "locked": {
2724 "lastModified": 1585166193,
2725 "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
2726 "owner": "grocy",
2727 "repo": "grocy",
2728 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2729 "type": "github"
2730 },
2731 "original": {
2732 "owner": "grocy",
2733 "repo": "grocy",
2734 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2735 "type": "github"
2736 }
2737 },
2738 "impermanence": {
2739 "locked": {
2740 "lastModified": 1684264534,
2741 "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=",
2742 "owner": "nix-community",
2743 "repo": "impermanence",
2744 "rev": "89253fb1518063556edd5e54509c30ac3089d5e6",
2745 "type": "github"
2746 },
2747 "original": {
2748 "owner": "nix-community",
2749 "ref": "master",
2750 "repo": "impermanence",
2751 "type": "github"
2752 }
2753 },
2754 "landing-page": {
2755 "flake": false,
2756 "locked": {
2757 "lastModified": 1691524124,
2758 "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=",
2759 "ref": "main",
2760 "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf",
2761 "revCount": 573,
2762 "type": "git",
2763 "url": "https://github.com/bastienwirtz/homer.git"
2764 },
2765 "original": {
2766 "ref": "main",
2767 "type": "git",
2768 "url": "https://github.com/bastienwirtz/homer.git"
2769 }
2770 },
2771 "loginctl-linger": {
2772 "locked": {
2773 "lastModified": 1,
2774 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
2775 "path": "../../flakes/loginctl-linger",
2776 "type": "path"
2777 },
2778 "original": {
2779 "path": "../../flakes/loginctl-linger",
2780 "type": "path"
2781 }
2782 },
2783 "loginctl-linger_2": {
2784 "locked": {
2785 "lastModified": 1,
2786 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
2787 "path": "../../flakes/loginctl-linger",
2788 "type": "path"
2789 },
2790 "original": {
2791 "path": "../../flakes/loginctl-linger",
2792 "type": "path"
2793 }
2794 },
2795 "loginctl-linger_3": {
2796 "locked": {
2797 "lastModified": 1,
2798 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
2799 "path": "../../flakes/loginctl-linger",
2800 "type": "path"
2801 },
2802 "original": {
2803 "path": "../../flakes/loginctl-linger",
2804 "type": "path"
2805 }
2806 },
2807 "mail-relay": {
2808 "inputs": {
2809 "environment": "environment_3",
2810 "secrets": "secrets"
2811 },
2812 "locked": {
2813 "lastModified": 1,
2814 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
2815 "path": "../../flakes/private/mail-relay",
2816 "type": "path"
2817 },
2818 "original": {
2819 "path": "../../flakes/private/mail-relay",
2820 "type": "path"
2821 }
2822 },
2823 "mail-relay_2": {
2824 "inputs": {
2825 "environment": "environment_20",
2826 "secrets": "secrets_15"
2827 },
2828 "locked": {
2829 "lastModified": 1,
2830 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
2831 "path": "../../flakes/private/mail-relay",
2832 "type": "path"
2833 },
2834 "original": {
2835 "path": "../../flakes/private/mail-relay",
2836 "type": "path"
2837 }
2838 },
2839 "mastodon": {
2840 "flake": false,
2841 "locked": {
2842 "lastModified": 1582790581,
2843 "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
2844 "owner": "tootsuite",
2845 "repo": "mastodon",
2846 "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
2847 "type": "github"
2848 },
2849 "original": {
2850 "owner": "tootsuite",
2851 "ref": "v2.9.4",
2852 "repo": "mastodon",
2853 "type": "github"
2854 }
2855 },
2856 "mastodon_2": {
2857 "flake": false,
2858 "locked": {
2859 "lastModified": 1582790581,
2860 "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
2861 "owner": "tootsuite",
2862 "repo": "mastodon",
2863 "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
2864 "type": "github"
2865 },
2866 "original": {
2867 "owner": "tootsuite",
2868 "ref": "v2.9.4",
2869 "repo": "mastodon",
2870 "type": "github"
2871 }
2872 },
2873 "mediagoblin": {
2874 "flake": false,
2875 "locked": {
2876 "lastModified": 1531090939,
2877 "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
2878 "ref": "stable",
2879 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2880 "revCount": 4805,
2881 "submodules": true,
2882 "type": "git",
2883 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2884 },
2885 "original": {
2886 "ref": "stable",
2887 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2888 "submodules": true,
2889 "type": "git",
2890 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2891 }
2892 },
2893 "mediagoblin_2": {
2894 "flake": false,
2895 "locked": {
2896 "lastModified": 1531090939,
2897 "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
2898 "ref": "stable",
2899 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2900 "revCount": 4805,
2901 "submodules": true,
2902 "type": "git",
2903 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2904 },
2905 "original": {
2906 "ref": "stable",
2907 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2908 "submodules": true,
2909 "type": "git",
2910 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2911 }
2912 },
2913 "milters": {
2914 "inputs": {
2915 "environment": "environment_4",
2916 "files-watcher": "files-watcher",
2917 "openarc": "openarc",
2918 "opendmarc": "opendmarc",
2919 "secrets": "secrets_2"
2920 },
2921 "locked": {
2922 "lastModified": 1,
2923 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
2924 "path": "../../flakes/private/milters",
2925 "type": "path"
2926 },
2927 "original": {
2928 "path": "../../flakes/private/milters",
2929 "type": "path"
2930 }
2931 },
2932 "monitoring": {
2933 "inputs": {
2934 "environment": "environment_5",
2935 "naemon": "naemon",
2936 "nixpkgs-lib": "nixpkgs-lib_2",
2937 "secrets": "secrets_3"
2938 },
2939 "locked": {
2940 "lastModified": 1,
2941 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2942 "path": "../../flakes/private/monitoring",
2943 "type": "path"
2944 },
2945 "original": {
2946 "path": "../../flakes/private/monitoring",
2947 "type": "path"
2948 }
2949 },
2950 "monitoring_2": {
2951 "inputs": {
2952 "environment": "environment_9",
2953 "naemon": "naemon_2",
2954 "nixpkgs-lib": "nixpkgs-lib_5",
2955 "secrets": "secrets_7"
2956 },
2957 "locked": {
2958 "lastModified": 1,
2959 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2960 "path": "../../flakes/private/monitoring",
2961 "type": "path"
2962 },
2963 "original": {
2964 "path": "../../flakes/private/monitoring",
2965 "type": "path"
2966 }
2967 },
2968 "monitoring_3": {
2969 "inputs": {
2970 "environment": "environment_21",
2971 "naemon": "naemon_4",
2972 "nixpkgs-lib": "nixpkgs-lib_15",
2973 "secrets": "secrets_16"
2974 },
2975 "locked": {
2976 "lastModified": 1,
2977 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2978 "path": "../../flakes/private/monitoring",
2979 "type": "path"
2980 },
2981 "original": {
2982 "path": "../../flakes/private/monitoring",
2983 "type": "path"
2984 }
2985 },
2986 "monitoring_4": {
2987 "inputs": {
2988 "environment": "environment_24",
2989 "naemon": "naemon_5",
2990 "nixpkgs-lib": "nixpkgs-lib_18",
2991 "secrets": "secrets_18"
2992 },
2993 "locked": {
2994 "lastModified": 1,
2995 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2996 "path": "../../flakes/private/monitoring",
2997 "type": "path"
2998 },
2999 "original": {
3000 "path": "../../flakes/private/monitoring",
3001 "type": "path"
3002 }
3003 },
3004 "multi-apache-container": {
3005 "inputs": {
3006 "files-watcher": "files-watcher_11",
3007 "myuids": "myuids_25"
3008 },
3009 "locked": {
3010 "lastModified": 1,
3011 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
3012 "path": "../../flakes/multi-apache-container",
3013 "type": "path"
3014 },
3015 "original": {
3016 "path": "../../flakes/multi-apache-container",
3017 "type": "path"
3018 }
3019 },
3020 "my-lib": {
3021 "inputs": {
3022 "colmena": "colmena",
3023 "disko": "disko",
3024 "flake-parts": "flake-parts_2",
3025 "nixos-anywhere": "nixos-anywhere",
3026 "nixpkgs": "nixpkgs_7"
3027 },
3028 "locked": {
3029 "lastModified": 1,
3030 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3031 "path": "../../flakes/lib",
3032 "type": "path"
3033 },
3034 "original": {
3035 "path": "../../flakes/lib",
3036 "type": "path"
3037 }
3038 },
3039 "my-lib_2": {
3040 "inputs": {
3041 "colmena": "colmena_2",
3042 "disko": "disko_2",
3043 "flake-parts": "flake-parts_4",
3044 "nixos-anywhere": "nixos-anywhere_2",
3045 "nixpkgs": "nixpkgs_16"
3046 },
3047 "locked": {
3048 "lastModified": 1,
3049 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3050 "path": "../../flakes/lib",
3051 "type": "path"
3052 },
3053 "original": {
3054 "path": "../../flakes/lib",
3055 "type": "path"
3056 }
3057 },
3058 "my-lib_3": {
3059 "inputs": {
3060 "colmena": "colmena_3",
3061 "disko": "disko_3",
3062 "flake-parts": "flake-parts_6",
3063 "nixos-anywhere": "nixos-anywhere_3",
3064 "nixpkgs": "nixpkgs_23"
3065 },
3066 "locked": {
3067 "lastModified": 1,
3068 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3069 "path": "../../flakes/lib",
3070 "type": "path"
3071 },
3072 "original": {
3073 "path": "../../flakes/lib",
3074 "type": "path"
3075 }
3076 },
3077 "my-lib_4": {
3078 "inputs": {
3079 "colmena": "colmena_4",
3080 "disko": "disko_4",
3081 "flake-parts": "flake-parts_12",
3082 "nixos-anywhere": "nixos-anywhere_4",
3083 "nixpkgs": "nixpkgs_54"
3084 },
3085 "locked": {
3086 "lastModified": 1,
3087 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3088 "path": "../../flakes/lib",
3089 "type": "path"
3090 },
3091 "original": {
3092 "path": "../../flakes/lib",
3093 "type": "path"
3094 }
3095 },
3096 "my-lib_5": {
3097 "inputs": {
3098 "colmena": "colmena_5",
3099 "disko": "disko_5",
3100 "flake-parts": "flake-parts_14",
3101 "nixos-anywhere": "nixos-anywhere_5",
3102 "nixpkgs": "nixpkgs_62"
3103 },
3104 "locked": {
3105 "lastModified": 1,
3106 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3107 "path": "../../flakes/lib",
3108 "type": "path"
3109 },
3110 "original": {
3111 "path": "../../flakes/lib",
3112 "type": "path"
3113 }
3114 },
3115 "my-lib_6": {
3116 "inputs": {
3117 "colmena": "colmena_6",
3118 "disko": "disko_6",
3119 "flake-parts": "flake-parts_16",
3120 "nixos-anywhere": "nixos-anywhere_6",
3121 "nixpkgs": "nixpkgs_70"
3122 },
3123 "locked": {
3124 "lastModified": 1,
3125 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3126 "path": "../../flakes/lib",
3127 "type": "path"
3128 },
3129 "original": {
3130 "path": "../../flakes/lib",
3131 "type": "path"
3132 }
3133 },
3134 "mypackages": {
3135 "inputs": {
3136 "flake-parts": "flake-parts_3",
3137 "nixpkgs": "nixpkgs_12",
3138 "webapps-ttrss": "webapps-ttrss"
3139 },
3140 "locked": {
3141 "lastModified": 1,
3142 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3143 "path": "../../mypackages",
3144 "type": "path"
3145 },
3146 "original": {
3147 "path": "../../mypackages",
3148 "type": "path"
3149 }
3150 },
3151 "mypackages_10": {
3152 "inputs": {
3153 "flake-parts": "flake-parts_18",
3154 "nixpkgs": "nixpkgs_77",
3155 "webapps-ttrss": "webapps-ttrss_11"
3156 },
3157 "locked": {
3158 "lastModified": 1,
3159 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3160 "path": "../mypackages",
3161 "type": "path"
3162 },
3163 "original": {
3164 "path": "../mypackages",
3165 "type": "path"
3166 }
3167 },
3168 "mypackages_11": {
3169 "inputs": {
3170 "flake-parts": "flake-parts_19",
3171 "nixpkgs": "nixpkgs_79",
3172 "webapps-ttrss": "webapps-ttrss_12"
3173 },
3174 "locked": {
3175 "lastModified": 1,
3176 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3177 "path": "../mypackages",
3178 "type": "path"
3179 },
3180 "original": {
3181 "path": "../mypackages",
3182 "type": "path"
3183 }
3184 },
3185 "mypackages_12": {
3186 "inputs": {
3187 "flake-parts": "flake-parts_22",
3188 "nixpkgs": "nixpkgs_102",
3189 "webapps-ttrss": "webapps-ttrss_14"
3190 },
3191 "locked": {
3192 "lastModified": 1,
3193 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3194 "path": "../../mypackages",
3195 "type": "path"
3196 },
3197 "original": {
3198 "path": "../../mypackages",
3199 "type": "path"
3200 }
3201 },
3202 "mypackages_13": {
3203 "inputs": {
3204 "flake-parts": "flake-parts_23",
3205 "nixpkgs": "nixpkgs_103",
3206 "webapps-ttrss": "webapps-ttrss_15"
3207 },
3208 "locked": {
3209 "lastModified": 1,
3210 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3211 "path": "../mypackages",
3212 "type": "path"
3213 },
3214 "original": {
3215 "path": "../mypackages",
3216 "type": "path"
3217 }
3218 },
3219 "mypackages_2": {
3220 "inputs": {
3221 "flake-parts": "flake-parts_5",
3222 "nixpkgs": "nixpkgs_19",
3223 "webapps-ttrss": "webapps-ttrss_2"
3224 },
3225 "locked": {
3226 "lastModified": 1,
3227 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3228 "path": "../../mypackages",
3229 "type": "path"
3230 },
3231 "original": {
3232 "path": "../../mypackages",
3233 "type": "path"
3234 }
3235 },
3236 "mypackages_3": {
3237 "inputs": {
3238 "flake-parts": "flake-parts_7",
3239 "nixpkgs": "nixpkgs_35",
3240 "webapps-ttrss": "webapps-ttrss_3"
3241 },
3242 "locked": {
3243 "lastModified": 1,
3244 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3245 "path": "../../mypackages",
3246 "type": "path"
3247 },
3248 "original": {
3249 "path": "../../mypackages",
3250 "type": "path"
3251 }
3252 },
3253 "mypackages_4": {
3254 "inputs": {
3255 "flake-parts": "flake-parts_8",
3256 "nixpkgs": "nixpkgs_38",
3257 "webapps-ttrss": "webapps-ttrss_4"
3258 },
3259 "locked": {
3260 "lastModified": 1,
3261 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3262 "path": "../mypackages",
3263 "type": "path"
3264 },
3265 "original": {
3266 "path": "../mypackages",
3267 "type": "path"
3268 }
3269 },
3270 "mypackages_5": {
3271 "inputs": {
3272 "flake-parts": "flake-parts_9",
3273 "nixpkgs": "nixpkgs_40",
3274 "webapps-ttrss": "webapps-ttrss_5"
3275 },
3276 "locked": {
3277 "lastModified": 1,
3278 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3279 "path": "../mypackages",
3280 "type": "path"
3281 },
3282 "original": {
3283 "path": "../mypackages",
3284 "type": "path"
3285 }
3286 },
3287 "mypackages_6": {
3288 "inputs": {
3289 "flake-parts": "flake-parts_11",
3290 "nixpkgs": "nixpkgs_48",
3291 "webapps-ttrss": "webapps-ttrss_7"
3292 },
3293 "locked": {
3294 "lastModified": 1,
3295 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3296 "path": "../mypackages",
3297 "type": "path"
3298 },
3299 "original": {
3300 "path": "../mypackages",
3301 "type": "path"
3302 }
3303 },
3304 "mypackages_7": {
3305 "inputs": {
3306 "flake-parts": "flake-parts_13",
3307 "nixpkgs": "nixpkgs_58",
3308 "webapps-ttrss": "webapps-ttrss_8"
3309 },
3310 "locked": {
3311 "lastModified": 1,
3312 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3313 "path": "../../mypackages",
3314 "type": "path"
3315 },
3316 "original": {
3317 "path": "../../mypackages",
3318 "type": "path"
3319 }
3320 },
3321 "mypackages_8": {
3322 "inputs": {
3323 "flake-parts": "flake-parts_15",
3324 "nixpkgs": "nixpkgs_66",
3325 "webapps-ttrss": "webapps-ttrss_9"
3326 },
3327 "locked": {
3328 "lastModified": 1,
3329 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3330 "path": "../../mypackages",
3331 "type": "path"
3332 },
3333 "original": {
3334 "path": "../../mypackages",
3335 "type": "path"
3336 }
3337 },
3338 "mypackages_9": {
3339 "inputs": {
3340 "flake-parts": "flake-parts_17",
3341 "nixpkgs": "nixpkgs_73",
3342 "webapps-ttrss": "webapps-ttrss_10"
3343 },
3344 "locked": {
3345 "lastModified": 1,
3346 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3347 "path": "../../mypackages",
3348 "type": "path"
3349 },
3350 "original": {
3351 "path": "../../mypackages",
3352 "type": "path"
3353 }
3354 },
3355 "myuids": {
3356 "locked": {
3357 "lastModified": 1,
3358 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3359 "path": "../myuids",
3360 "type": "path"
3361 },
3362 "original": {
3363 "path": "../myuids",
3364 "type": "path"
3365 }
3366 },
3367 "myuids_10": {
3368 "locked": {
3369 "lastModified": 1,
3370 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3371 "path": "../myuids",
3372 "type": "path"
3373 },
3374 "original": {
3375 "path": "../myuids",
3376 "type": "path"
3377 }
3378 },
3379 "myuids_11": {
3380 "locked": {
3381 "lastModified": 1,
3382 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3383 "path": "../myuids",
3384 "type": "path"
3385 },
3386 "original": {
3387 "path": "../myuids",
3388 "type": "path"
3389 }
3390 },
3391 "myuids_12": {
3392 "locked": {
3393 "lastModified": 1,
3394 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3395 "path": "../myuids",
3396 "type": "path"
3397 },
3398 "original": {
3399 "path": "../myuids",
3400 "type": "path"
3401 }
3402 },
3403 "myuids_13": {
3404 "locked": {
3405 "lastModified": 1,
3406 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3407 "path": "../myuids",
3408 "type": "path"
3409 },
3410 "original": {
3411 "path": "../myuids",
3412 "type": "path"
3413 }
3414 },
3415 "myuids_14": {
3416 "locked": {
3417 "lastModified": 1,
3418 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3419 "path": "../myuids",
3420 "type": "path"
3421 },
3422 "original": {
3423 "path": "../myuids",
3424 "type": "path"
3425 }
3426 },
3427 "myuids_15": {
3428 "locked": {
3429 "lastModified": 1,
3430 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3431 "path": "../../myuids",
3432 "type": "path"
3433 },
3434 "original": {
3435 "path": "../../myuids",
3436 "type": "path"
3437 }
3438 },
3439 "myuids_16": {
3440 "locked": {
3441 "lastModified": 1,
3442 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3443 "path": "../myuids",
3444 "type": "path"
3445 },
3446 "original": {
3447 "path": "../myuids",
3448 "type": "path"
3449 }
3450 },
3451 "myuids_17": {
3452 "locked": {
3453 "lastModified": 1,
3454 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3455 "path": "../myuids",
3456 "type": "path"
3457 },
3458 "original": {
3459 "path": "../myuids",
3460 "type": "path"
3461 }
3462 },
3463 "myuids_18": {
3464 "locked": {
3465 "lastModified": 1,
3466 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3467 "path": "../myuids",
3468 "type": "path"
3469 },
3470 "original": {
3471 "path": "../myuids",
3472 "type": "path"
3473 }
3474 },
3475 "myuids_19": {
3476 "locked": {
3477 "lastModified": 1,
3478 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3479 "path": "../myuids",
3480 "type": "path"
3481 },
3482 "original": {
3483 "path": "../myuids",
3484 "type": "path"
3485 }
3486 },
3487 "myuids_2": {
3488 "locked": {
3489 "lastModified": 1,
3490 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3491 "path": "../myuids",
3492 "type": "path"
3493 },
3494 "original": {
3495 "path": "../myuids",
3496 "type": "path"
3497 }
3498 },
3499 "myuids_20": {
3500 "locked": {
3501 "lastModified": 1,
3502 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3503 "path": "../myuids",
3504 "type": "path"
3505 },
3506 "original": {
3507 "path": "../myuids",
3508 "type": "path"
3509 }
3510 },
3511 "myuids_21": {
3512 "locked": {
3513 "lastModified": 1,
3514 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3515 "path": "../myuids",
3516 "type": "path"
3517 },
3518 "original": {
3519 "path": "../myuids",
3520 "type": "path"
3521 }
3522 },
3523 "myuids_22": {
3524 "locked": {
3525 "lastModified": 1,
3526 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3527 "path": "../myuids",
3528 "type": "path"
3529 },
3530 "original": {
3531 "path": "../myuids",
3532 "type": "path"
3533 }
3534 },
3535 "myuids_23": {
3536 "locked": {
3537 "lastModified": 1,
3538 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3539 "path": "../../flakes/myuids",
3540 "type": "path"
3541 },
3542 "original": {
3543 "path": "../../flakes/myuids",
3544 "type": "path"
3545 }
3546 },
3547 "myuids_24": {
3548 "locked": {
3549 "lastModified": 1,
3550 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3551 "path": "../../myuids",
3552 "type": "path"
3553 },
3554 "original": {
3555 "path": "../../myuids",
3556 "type": "path"
3557 }
3558 },
3559 "myuids_25": {
3560 "locked": {
3561 "lastModified": 1,
3562 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3563 "path": "../myuids",
3564 "type": "path"
3565 },
3566 "original": {
3567 "path": "../myuids",
3568 "type": "path"
3569 }
3570 },
3571 "myuids_26": {
3572 "locked": {
3573 "lastModified": 1,
3574 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3575 "path": "../../flakes/myuids",
3576 "type": "path"
3577 },
3578 "original": {
3579 "path": "../../flakes/myuids",
3580 "type": "path"
3581 }
3582 },
3583 "myuids_27": {
3584 "locked": {
3585 "lastModified": 1,
3586 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3587 "path": "../../myuids",
3588 "type": "path"
3589 },
3590 "original": {
3591 "path": "../../myuids",
3592 "type": "path"
3593 }
3594 },
3595 "myuids_28": {
3596 "locked": {
3597 "lastModified": 1,
3598 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3599 "path": "../../myuids",
3600 "type": "path"
3601 },
3602 "original": {
3603 "path": "../../myuids",
3604 "type": "path"
3605 }
3606 },
3607 "myuids_29": {
3608 "locked": {
3609 "lastModified": 1,
3610 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3611 "path": "../myuids",
3612 "type": "path"
3613 },
3614 "original": {
3615 "path": "../myuids",
3616 "type": "path"
3617 }
3618 },
3619 "myuids_3": {
3620 "locked": {
3621 "lastModified": 1,
3622 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3623 "path": "../../flakes/myuids",
3624 "type": "path"
3625 },
3626 "original": {
3627 "path": "../../flakes/myuids",
3628 "type": "path"
3629 }
3630 },
3631 "myuids_30": {
3632 "locked": {
3633 "lastModified": 1,
3634 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3635 "path": "../myuids",
3636 "type": "path"
3637 },
3638 "original": {
3639 "path": "../myuids",
3640 "type": "path"
3641 }
3642 },
3643 "myuids_31": {
3644 "locked": {
3645 "lastModified": 1,
3646 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3647 "path": "../myuids",
3648 "type": "path"
3649 },
3650 "original": {
3651 "path": "../myuids",
3652 "type": "path"
3653 }
3654 },
3655 "myuids_32": {
3656 "locked": {
3657 "lastModified": 1,
3658 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3659 "path": "../myuids",
3660 "type": "path"
3661 },
3662 "original": {
3663 "path": "../myuids",
3664 "type": "path"
3665 }
3666 },
3667 "myuids_33": {
3668 "locked": {
3669 "lastModified": 1,
3670 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3671 "path": "../myuids",
3672 "type": "path"
3673 },
3674 "original": {
3675 "path": "../myuids",
3676 "type": "path"
3677 }
3678 },
3679 "myuids_34": {
3680 "locked": {
3681 "lastModified": 1,
3682 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3683 "path": "../myuids",
3684 "type": "path"
3685 },
3686 "original": {
3687 "path": "../myuids",
3688 "type": "path"
3689 }
3690 },
3691 "myuids_35": {
3692 "locked": {
3693 "lastModified": 1,
3694 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3695 "path": "../myuids",
3696 "type": "path"
3697 },
3698 "original": {
3699 "path": "../myuids",
3700 "type": "path"
3701 }
3702 },
3703 "myuids_36": {
3704 "locked": {
3705 "lastModified": 1,
3706 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3707 "path": "../myuids",
3708 "type": "path"
3709 },
3710 "original": {
3711 "path": "../myuids",
3712 "type": "path"
3713 }
3714 },
3715 "myuids_37": {
3716 "locked": {
3717 "lastModified": 1,
3718 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3719 "path": "../myuids",
3720 "type": "path"
3721 },
3722 "original": {
3723 "path": "../myuids",
3724 "type": "path"
3725 }
3726 },
3727 "myuids_38": {
3728 "locked": {
3729 "lastModified": 1,
3730 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3731 "path": "../myuids",
3732 "type": "path"
3733 },
3734 "original": {
3735 "path": "../myuids",
3736 "type": "path"
3737 }
3738 },
3739 "myuids_39": {
3740 "locked": {
3741 "lastModified": 1,
3742 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3743 "path": "../myuids",
3744 "type": "path"
3745 },
3746 "original": {
3747 "path": "../myuids",
3748 "type": "path"
3749 }
3750 },
3751 "myuids_4": {
3752 "locked": {
3753 "lastModified": 1,
3754 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3755 "path": "../myuids",
3756 "type": "path"
3757 },
3758 "original": {
3759 "path": "../myuids",
3760 "type": "path"
3761 }
3762 },
3763 "myuids_40": {
3764 "locked": {
3765 "lastModified": 1,
3766 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3767 "path": "../myuids",
3768 "type": "path"
3769 },
3770 "original": {
3771 "path": "../myuids",
3772 "type": "path"
3773 }
3774 },
3775 "myuids_41": {
3776 "locked": {
3777 "lastModified": 1,
3778 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3779 "path": "../myuids",
3780 "type": "path"
3781 },
3782 "original": {
3783 "path": "../myuids",
3784 "type": "path"
3785 }
3786 },
3787 "myuids_42": {
3788 "locked": {
3789 "lastModified": 1,
3790 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3791 "path": "../../myuids",
3792 "type": "path"
3793 },
3794 "original": {
3795 "path": "../../myuids",
3796 "type": "path"
3797 }
3798 },
3799 "myuids_5": {
3800 "locked": {
3801 "lastModified": 1,
3802 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3803 "path": "../myuids",
3804 "type": "path"
3805 },
3806 "original": {
3807 "path": "../myuids",
3808 "type": "path"
3809 }
3810 },
3811 "myuids_6": {
3812 "locked": {
3813 "lastModified": 1,
3814 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3815 "path": "../../myuids",
3816 "type": "path"
3817 },
3818 "original": {
3819 "path": "../../myuids",
3820 "type": "path"
3821 }
3822 },
3823 "myuids_7": {
3824 "locked": {
3825 "lastModified": 1,
3826 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3827 "path": "../../flakes/myuids",
3828 "type": "path"
3829 },
3830 "original": {
3831 "path": "../../flakes/myuids",
3832 "type": "path"
3833 }
3834 },
3835 "myuids_8": {
3836 "locked": {
3837 "lastModified": 1,
3838 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3839 "path": "../../myuids",
3840 "type": "path"
3841 },
3842 "original": {
3843 "path": "../../myuids",
3844 "type": "path"
3845 }
3846 },
3847 "myuids_9": {
3848 "locked": {
3849 "lastModified": 1,
3850 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3851 "path": "../myuids",
3852 "type": "path"
3853 },
3854 "original": {
3855 "path": "../myuids",
3856 "type": "path"
3857 }
3858 },
3859 "n-backup-2": {
3860 "inputs": {
3861 "chatons": "chatons",
3862 "environment": "environment_2",
3863 "loginctl-linger": "loginctl-linger",
3864 "mail-relay": "mail-relay",
3865 "milters": "milters",
3866 "monitoring": "monitoring",
3867 "my-lib": "my-lib",
3868 "myuids": "myuids_3",
3869 "nixpkgs": "nixpkgs_8",
3870 "openarc": "openarc_3",
3871 "opendmarc": "opendmarc_2",
3872 "openldap": "openldap",
3873 "rsync_backup": "rsync_backup",
3874 "secrets": "secrets_6",
3875 "system": "system"
3876 },
3877 "locked": {
3878 "lastModified": 1,
3879 "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=",
3880 "path": "../systems/backup-2",
3881 "type": "path"
3882 },
3883 "original": {
3884 "path": "../systems/backup-2",
3885 "type": "path"
3886 }
3887 },
3888 "n-dilion": {
3889 "inputs": {
3890 "environment": "environment_8",
3891 "files-watcher": "files-watcher_4",
3892 "loginctl-linger": "loginctl-linger_2",
3893 "monitoring": "monitoring_2",
3894 "my-lib": "my-lib_2",
3895 "myuids": "myuids_7",
3896 "nixpkgs": "nixpkgs_17",
3897 "secrets": "secrets_8",
3898 "ssh": "ssh",
3899 "system": "system_2"
3900 },
3901 "locked": {
3902 "lastModified": 1,
3903 "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=",
3904 "path": "../systems/dilion",
3905 "type": "path"
3906 },
3907 "original": {
3908 "path": "../systems/dilion",
3909 "type": "path"
3910 }
3911 },
3912 "n-eldiron": {
3913 "inputs": {
3914 "dns-nix": "dns-nix",
3915 "my-lib": "my-lib_3",
3916 "nixpkgs": "nixpkgs_24",
3917 "private-buildbot": "private-buildbot",
3918 "private-chatons": "private-chatons",
3919 "private-environment": "private-environment",
3920 "private-milters": "private-milters",
3921 "private-monitoring": "private-monitoring",
3922 "private-openarc": "private-openarc",
3923 "private-opendmarc": "private-opendmarc",
3924 "private-openldap": "private-openldap",
3925 "private-paste": "private-paste",
3926 "private-peertube": "private-peertube",
3927 "private-php": "private-php",
3928 "private-ssh": "private-ssh",
3929 "private-system": "private-system",
3930 "public-copanier": "public-copanier",
3931 "public-diaspora": "public-diaspora",
3932 "public-etherpad-lite": "public-etherpad-lite",
3933 "public-fiche": "public-fiche",
3934 "public-files-watcher": "public-files-watcher",
3935 "public-grocy": "public-grocy",
3936 "public-loginctl-linger": "public-loginctl-linger",
3937 "public-mastodon": "public-mastodon",
3938 "public-mediagoblin": "public-mediagoblin",
3939 "public-multi-apache-container": "public-multi-apache-container",
3940 "public-mypackages": "public-mypackages",
3941 "public-myuids": "public-myuids",
3942 "public-openarc": "public-openarc",
3943 "public-opendmarc": "public-opendmarc",
3944 "public-peertube": "public-peertube",
3945 "public-secrets": "public-secrets",
3946 "public-surfer": "public-surfer",
3947 "public-taskwarrior-web": "public-taskwarrior-web"
3948 },
3949 "locked": {
3950 "lastModified": 1,
3951 "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=",
3952 "path": "../systems/eldiron",
3953 "type": "path"
3954 },
3955 "original": {
3956 "path": "../systems/eldiron",
3957 "type": "path"
3958 }
3959 },
3960 "n-monitoring-1": {
3961 "inputs": {
3962 "chatons": "chatons_2",
3963 "environment": "environment_19",
3964 "files-watcher": "files-watcher_9",
3965 "loginctl-linger": "loginctl-linger_3",
3966 "mail-relay": "mail-relay_2",
3967 "monitoring": "monitoring_3",
3968 "my-lib": "my-lib_4",
3969 "myuids": "myuids_23",
3970 "nixpkgs": "nixpkgs_55",
3971 "php": "php",
3972 "secrets": "secrets_17",
3973 "system": "system_3"
3974 },
3975 "locked": {
3976 "lastModified": 1,
3977 "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=",
3978 "path": "../systems/monitoring-1",
3979 "type": "path"
3980 },
3981 "original": {
3982 "path": "../systems/monitoring-1",
3983 "type": "path"
3984 }
3985 },
3986 "n-quatresaisons": {
3987 "inputs": {
3988 "environment": "environment_23",
3989 "files-watcher": "files-watcher_10",
3990 "landing-page": "landing-page",
3991 "monitoring": "monitoring_4",
3992 "multi-apache-container": "multi-apache-container",
3993 "my-lib": "my-lib_5",
3994 "myuids": "myuids_26",
3995 "nixpkgs": "nixpkgs_63",
3996 "php": "php_2",
3997 "secrets": "secrets_19",
3998 "system": "system_4"
3999 },
4000 "locked": {
4001 "lastModified": 1,
4002 "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=",
4003 "path": "../systems/quatresaisons",
4004 "type": "path"
4005 },
4006 "original": {
4007 "path": "../systems/quatresaisons",
4008 "type": "path"
4009 }
4010 },
4011 "n-zoldene": {
4012 "inputs": {
4013 "impermanence": "impermanence",
4014 "my-lib": "my-lib_6",
4015 "nixpkgs": "nixpkgs_71",
4016 "private-environment": "private-environment_2",
4017 "private-system": "private-system_2",
4018 "public-secrets": "public-secrets_2"
4019 },
4020 "locked": {
4021 "lastModified": 1,
4022 "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=",
4023 "path": "../systems/zoldene",
4024 "type": "path"
4025 },
4026 "original": {
4027 "path": "../systems/zoldene",
4028 "type": "path"
4029 }
4030 },
4031 "naemon": {
4032 "locked": {
4033 "lastModified": 1,
4034 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4035 "path": "../../naemon",
4036 "type": "path"
4037 },
4038 "original": {
4039 "path": "../../naemon",
4040 "type": "path"
4041 }
4042 },
4043 "naemon_2": {
4044 "locked": {
4045 "lastModified": 1,
4046 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4047 "path": "../../naemon",
4048 "type": "path"
4049 },
4050 "original": {
4051 "path": "../../naemon",
4052 "type": "path"
4053 }
4054 },
4055 "naemon_3": {
4056 "locked": {
4057 "lastModified": 1,
4058 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4059 "path": "../../naemon",
4060 "type": "path"
4061 },
4062 "original": {
4063 "path": "../../naemon",
4064 "type": "path"
4065 }
4066 },
4067 "naemon_4": {
4068 "locked": {
4069 "lastModified": 1,
4070 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4071 "path": "../../naemon",
4072 "type": "path"
4073 },
4074 "original": {
4075 "path": "../../naemon",
4076 "type": "path"
4077 }
4078 },
4079 "naemon_5": {
4080 "locked": {
4081 "lastModified": 1,
4082 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4083 "path": "../../naemon",
4084 "type": "path"
4085 },
4086 "original": {
4087 "path": "../../naemon",
4088 "type": "path"
4089 }
4090 },
4091 "naemon_6": {
4092 "locked": {
4093 "lastModified": 1,
4094 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
4095 "path": "../../naemon",
4096 "type": "path"
4097 },
4098 "original": {
4099 "path": "../../naemon",
4100 "type": "path"
4101 }
4102 },
4103 "nixos-2305": {
4104 "locked": {
4105 "lastModified": 1687938137,
4106 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4107 "owner": "NixOS",
4108 "repo": "nixpkgs",
4109 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4110 "type": "github"
4111 },
4112 "original": {
4113 "owner": "NixOS",
4114 "ref": "release-23.05",
4115 "repo": "nixpkgs",
4116 "type": "github"
4117 }
4118 },
4119 "nixos-2305_2": {
4120 "locked": {
4121 "lastModified": 1687938137,
4122 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4123 "owner": "NixOS",
4124 "repo": "nixpkgs",
4125 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4126 "type": "github"
4127 },
4128 "original": {
4129 "owner": "NixOS",
4130 "ref": "release-23.05",
4131 "repo": "nixpkgs",
4132 "type": "github"
4133 }
4134 },
4135 "nixos-2305_3": {
4136 "locked": {
4137 "lastModified": 1687938137,
4138 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4139 "owner": "NixOS",
4140 "repo": "nixpkgs",
4141 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4142 "type": "github"
4143 },
4144 "original": {
4145 "owner": "NixOS",
4146 "ref": "release-23.05",
4147 "repo": "nixpkgs",
4148 "type": "github"
4149 }
4150 },
4151 "nixos-2305_4": {
4152 "locked": {
4153 "lastModified": 1687938137,
4154 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4155 "owner": "NixOS",
4156 "repo": "nixpkgs",
4157 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4158 "type": "github"
4159 },
4160 "original": {
4161 "owner": "NixOS",
4162 "ref": "release-23.05",
4163 "repo": "nixpkgs",
4164 "type": "github"
4165 }
4166 },
4167 "nixos-2305_5": {
4168 "locked": {
4169 "lastModified": 1687938137,
4170 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4171 "owner": "NixOS",
4172 "repo": "nixpkgs",
4173 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4174 "type": "github"
4175 },
4176 "original": {
4177 "owner": "NixOS",
4178 "ref": "release-23.05",
4179 "repo": "nixpkgs",
4180 "type": "github"
4181 }
4182 },
4183 "nixos-2305_6": {
4184 "locked": {
4185 "lastModified": 1687938137,
4186 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4187 "owner": "NixOS",
4188 "repo": "nixpkgs",
4189 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4190 "type": "github"
4191 },
4192 "original": {
4193 "owner": "NixOS",
4194 "ref": "release-23.05",
4195 "repo": "nixpkgs",
4196 "type": "github"
4197 }
4198 },
4199 "nixos-2305_7": {
4200 "locked": {
4201 "lastModified": 1687938137,
4202 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4203 "owner": "NixOS",
4204 "repo": "nixpkgs",
4205 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4206 "type": "github"
4207 },
4208 "original": {
4209 "owner": "NixOS",
4210 "ref": "release-23.05",
4211 "repo": "nixpkgs",
4212 "type": "github"
4213 }
4214 },
4215 "nixos-anywhere": {
4216 "inputs": {
4217 "disko": [
4218 "flakes",
4219 "n-backup-2",
4220 "my-lib",
4221 "disko"
4222 ],
4223 "flake-parts": [
4224 "flakes",
4225 "n-backup-2",
4226 "my-lib",
4227 "flake-parts"
4228 ],
4229 "nixos-2305": "nixos-2305",
4230 "nixos-images": "nixos-images",
4231 "nixpkgs": "nixpkgs_6",
4232 "treefmt-nix": "treefmt-nix"
4233 },
4234 "locked": {
4235 "lastModified": 1689945193,
4236 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4237 "owner": "numtide",
4238 "repo": "nixos-anywhere",
4239 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4240 "type": "github"
4241 },
4242 "original": {
4243 "owner": "numtide",
4244 "repo": "nixos-anywhere",
4245 "type": "github"
4246 }
4247 },
4248 "nixos-anywhere_2": {
4249 "inputs": {
4250 "disko": [
4251 "flakes",
4252 "n-dilion",
4253 "my-lib",
4254 "disko"
4255 ],
4256 "flake-parts": [
4257 "flakes",
4258 "n-dilion",
4259 "my-lib",
4260 "flake-parts"
4261 ],
4262 "nixos-2305": "nixos-2305_2",
4263 "nixos-images": "nixos-images_2",
4264 "nixpkgs": "nixpkgs_15",
4265 "treefmt-nix": "treefmt-nix_2"
4266 },
4267 "locked": {
4268 "lastModified": 1689945193,
4269 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4270 "owner": "numtide",
4271 "repo": "nixos-anywhere",
4272 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4273 "type": "github"
4274 },
4275 "original": {
4276 "owner": "numtide",
4277 "repo": "nixos-anywhere",
4278 "type": "github"
4279 }
4280 },
4281 "nixos-anywhere_3": {
4282 "inputs": {
4283 "disko": [
4284 "flakes",
4285 "n-eldiron",
4286 "my-lib",
4287 "disko"
4288 ],
4289 "flake-parts": [
4290 "flakes",
4291 "n-eldiron",
4292 "my-lib",
4293 "flake-parts"
4294 ],
4295 "nixos-2305": "nixos-2305_3",
4296 "nixos-images": "nixos-images_3",
4297 "nixpkgs": "nixpkgs_22",
4298 "treefmt-nix": "treefmt-nix_3"
4299 },
4300 "locked": {
4301 "lastModified": 1689945193,
4302 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4303 "owner": "numtide",
4304 "repo": "nixos-anywhere",
4305 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4306 "type": "github"
4307 },
4308 "original": {
4309 "owner": "numtide",
4310 "repo": "nixos-anywhere",
4311 "type": "github"
4312 }
4313 },
4314 "nixos-anywhere_4": {
4315 "inputs": {
4316 "disko": [
4317 "flakes",
4318 "n-monitoring-1",
4319 "my-lib",
4320 "disko"
4321 ],
4322 "flake-parts": [
4323 "flakes",
4324 "n-monitoring-1",
4325 "my-lib",
4326 "flake-parts"
4327 ],
4328 "nixos-2305": "nixos-2305_4",
4329 "nixos-images": "nixos-images_4",
4330 "nixpkgs": "nixpkgs_53",
4331 "treefmt-nix": "treefmt-nix_4"
4332 },
4333 "locked": {
4334 "lastModified": 1689945193,
4335 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4336 "owner": "numtide",
4337 "repo": "nixos-anywhere",
4338 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4339 "type": "github"
4340 },
4341 "original": {
4342 "owner": "numtide",
4343 "repo": "nixos-anywhere",
4344 "type": "github"
4345 }
4346 },
4347 "nixos-anywhere_5": {
4348 "inputs": {
4349 "disko": [
4350 "flakes",
4351 "n-quatresaisons",
4352 "my-lib",
4353 "disko"
4354 ],
4355 "flake-parts": [
4356 "flakes",
4357 "n-quatresaisons",
4358 "my-lib",
4359 "flake-parts"
4360 ],
4361 "nixos-2305": "nixos-2305_5",
4362 "nixos-images": "nixos-images_5",
4363 "nixpkgs": "nixpkgs_61",
4364 "treefmt-nix": "treefmt-nix_5"
4365 },
4366 "locked": {
4367 "lastModified": 1689945193,
4368 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4369 "owner": "numtide",
4370 "repo": "nixos-anywhere",
4371 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4372 "type": "github"
4373 },
4374 "original": {
4375 "owner": "numtide",
4376 "repo": "nixos-anywhere",
4377 "type": "github"
4378 }
4379 },
4380 "nixos-anywhere_6": {
4381 "inputs": {
4382 "disko": [
4383 "flakes",
4384 "n-zoldene",
4385 "my-lib",
4386 "disko"
4387 ],
4388 "flake-parts": [
4389 "flakes",
4390 "n-zoldene",
4391 "my-lib",
4392 "flake-parts"
4393 ],
4394 "nixos-2305": "nixos-2305_6",
4395 "nixos-images": "nixos-images_6",
4396 "nixpkgs": "nixpkgs_69",
4397 "treefmt-nix": "treefmt-nix_6"
4398 },
4399 "locked": {
4400 "lastModified": 1689945193,
4401 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4402 "owner": "numtide",
4403 "repo": "nixos-anywhere",
4404 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4405 "type": "github"
4406 },
4407 "original": {
4408 "owner": "numtide",
4409 "repo": "nixos-anywhere",
4410 "type": "github"
4411 }
4412 },
4413 "nixos-anywhere_7": {
4414 "inputs": {
4415 "disko": [
4416 "flakes",
4417 "s-lib",
4418 "disko"
4419 ],
4420 "flake-parts": [
4421 "flakes",
4422 "s-lib",
4423 "flake-parts"
4424 ],
4425 "nixos-2305": "nixos-2305_7",
4426 "nixos-images": "nixos-images_7",
4427 "nixpkgs": "nixpkgs_83",
4428 "treefmt-nix": "treefmt-nix_7"
4429 },
4430 "locked": {
4431 "lastModified": 1689945193,
4432 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4433 "owner": "numtide",
4434 "repo": "nixos-anywhere",
4435 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4436 "type": "github"
4437 },
4438 "original": {
4439 "owner": "numtide",
4440 "repo": "nixos-anywhere",
4441 "type": "github"
4442 }
4443 },
4444 "nixos-images": {
4445 "inputs": {
4446 "nixos-2305": [
4447 "flakes",
4448 "n-backup-2",
4449 "my-lib",
4450 "nixos-anywhere",
4451 "nixos-2305"
4452 ],
4453 "nixos-unstable": [
4454 "flakes",
4455 "n-backup-2",
4456 "my-lib",
4457 "nixos-anywhere",
4458 "nixpkgs"
4459 ]
4460 },
4461 "locked": {
4462 "lastModified": 1686819168,
4463 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4464 "owner": "nix-community",
4465 "repo": "nixos-images",
4466 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4467 "type": "github"
4468 },
4469 "original": {
4470 "owner": "nix-community",
4471 "repo": "nixos-images",
4472 "type": "github"
4473 }
4474 },
4475 "nixos-images_2": {
4476 "inputs": {
4477 "nixos-2305": [
4478 "flakes",
4479 "n-dilion",
4480 "my-lib",
4481 "nixos-anywhere",
4482 "nixos-2305"
4483 ],
4484 "nixos-unstable": [
4485 "flakes",
4486 "n-dilion",
4487 "my-lib",
4488 "nixos-anywhere",
4489 "nixpkgs"
4490 ]
4491 },
4492 "locked": {
4493 "lastModified": 1686819168,
4494 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4495 "owner": "nix-community",
4496 "repo": "nixos-images",
4497 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4498 "type": "github"
4499 },
4500 "original": {
4501 "owner": "nix-community",
4502 "repo": "nixos-images",
4503 "type": "github"
4504 }
4505 },
4506 "nixos-images_3": {
4507 "inputs": {
4508 "nixos-2305": [
4509 "flakes",
4510 "n-eldiron",
4511 "my-lib",
4512 "nixos-anywhere",
4513 "nixos-2305"
4514 ],
4515 "nixos-unstable": [
4516 "flakes",
4517 "n-eldiron",
4518 "my-lib",
4519 "nixos-anywhere",
4520 "nixpkgs"
4521 ]
4522 },
4523 "locked": {
4524 "lastModified": 1686819168,
4525 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4526 "owner": "nix-community",
4527 "repo": "nixos-images",
4528 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4529 "type": "github"
4530 },
4531 "original": {
4532 "owner": "nix-community",
4533 "repo": "nixos-images",
4534 "type": "github"
4535 }
4536 },
4537 "nixos-images_4": {
4538 "inputs": {
4539 "nixos-2305": [
4540 "flakes",
4541 "n-monitoring-1",
4542 "my-lib",
4543 "nixos-anywhere",
4544 "nixos-2305"
4545 ],
4546 "nixos-unstable": [
4547 "flakes",
4548 "n-monitoring-1",
4549 "my-lib",
4550 "nixos-anywhere",
4551 "nixpkgs"
4552 ]
4553 },
4554 "locked": {
4555 "lastModified": 1686819168,
4556 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4557 "owner": "nix-community",
4558 "repo": "nixos-images",
4559 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4560 "type": "github"
4561 },
4562 "original": {
4563 "owner": "nix-community",
4564 "repo": "nixos-images",
4565 "type": "github"
4566 }
4567 },
4568 "nixos-images_5": {
4569 "inputs": {
4570 "nixos-2305": [
4571 "flakes",
4572 "n-quatresaisons",
4573 "my-lib",
4574 "nixos-anywhere",
4575 "nixos-2305"
4576 ],
4577 "nixos-unstable": [
4578 "flakes",
4579 "n-quatresaisons",
4580 "my-lib",
4581 "nixos-anywhere",
4582 "nixpkgs"
4583 ]
4584 },
4585 "locked": {
4586 "lastModified": 1686819168,
4587 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4588 "owner": "nix-community",
4589 "repo": "nixos-images",
4590 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4591 "type": "github"
4592 },
4593 "original": {
4594 "owner": "nix-community",
4595 "repo": "nixos-images",
4596 "type": "github"
4597 }
4598 },
4599 "nixos-images_6": {
4600 "inputs": {
4601 "nixos-2305": [
4602 "flakes",
4603 "n-zoldene",
4604 "my-lib",
4605 "nixos-anywhere",
4606 "nixos-2305"
4607 ],
4608 "nixos-unstable": [
4609 "flakes",
4610 "n-zoldene",
4611 "my-lib",
4612 "nixos-anywhere",
4613 "nixpkgs"
4614 ]
4615 },
4616 "locked": {
4617 "lastModified": 1686819168,
4618 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4619 "owner": "nix-community",
4620 "repo": "nixos-images",
4621 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4622 "type": "github"
4623 },
4624 "original": {
4625 "owner": "nix-community",
4626 "repo": "nixos-images",
4627 "type": "github"
4628 }
4629 },
4630 "nixos-images_7": {
4631 "inputs": {
4632 "nixos-2305": [
4633 "flakes",
4634 "s-lib",
4635 "nixos-anywhere",
4636 "nixos-2305"
4637 ],
4638 "nixos-unstable": [
4639 "flakes",
4640 "s-lib",
4641 "nixos-anywhere",
4642 "nixpkgs"
4643 ]
4644 },
4645 "locked": {
4646 "lastModified": 1686819168,
4647 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4648 "owner": "nix-community",
4649 "repo": "nixos-images",
4650 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4651 "type": "github"
4652 },
4653 "original": {
4654 "owner": "nix-community",
4655 "repo": "nixos-images",
4656 "type": "github"
4657 }
4658 },
4659 "nixpkgs": {
4660 "locked": {
4661 "lastModified": 1677383253,
4662 "narHash": "sha256-UfpzWfSxkfXHnb4boXZNaKsAcUrZT9Hw+tao1oZxd08=",
4663 "owner": "NixOS",
4664 "repo": "nixpkgs",
4665 "rev": "9952d6bc395f5841262b006fbace8dd7e143b634",
4666 "type": "github"
4667 },
4668 "original": {
4669 "owner": "NixOS",
4670 "ref": "nixpkgs-unstable",
4671 "repo": "nixpkgs",
4672 "type": "github"
4673 }
4674 },
4675 "nixpkgs-4": {
4676 "flake": false,
4677 "locked": {
4678 "lastModified": 1646497237,
4679 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4680 "owner": "NixOS",
4681 "repo": "nixpkgs",
4682 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4683 "type": "github"
4684 },
4685 "original": {
4686 "owner": "NixOS",
4687 "repo": "nixpkgs",
4688 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4689 "type": "github"
4690 }
4691 },
4692 "nixpkgs-4_2": {
4693 "flake": false,
4694 "locked": {
4695 "lastModified": 1646497237,
4696 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4697 "owner": "NixOS",
4698 "repo": "nixpkgs",
4699 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4700 "type": "github"
4701 },
4702 "original": {
4703 "owner": "NixOS",
4704 "repo": "nixpkgs",
4705 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4706 "type": "github"
4707 }
4708 },
4709 "nixpkgs-4_3": {
4710 "flake": false,
4711 "locked": {
4712 "lastModified": 1646497237,
4713 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4714 "owner": "NixOS",
4715 "repo": "nixpkgs",
4716 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4717 "type": "github"
4718 },
4719 "original": {
4720 "owner": "NixOS",
4721 "repo": "nixpkgs",
4722 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4723 "type": "github"
4724 }
4725 },
4726 "nixpkgs-4_4": {
4727 "flake": false,
4728 "locked": {
4729 "lastModified": 1646497237,
4730 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4731 "owner": "NixOS",
4732 "repo": "nixpkgs",
4733 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4734 "type": "github"
4735 },
4736 "original": {
4737 "owner": "NixOS",
4738 "repo": "nixpkgs",
4739 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4740 "type": "github"
4741 }
4742 },
4743 "nixpkgs-lib": {
4744 "locked": {
4745 "dir": "lib",
4746 "lastModified": 1675183161,
4747 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4748 "owner": "NixOS",
4749 "repo": "nixpkgs",
4750 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4751 "type": "github"
4752 },
4753 "original": {
4754 "dir": "lib",
4755 "owner": "NixOS",
4756 "ref": "nixos-unstable",
4757 "repo": "nixpkgs",
4758 "type": "github"
4759 }
4760 },
4761 "nixpkgs-lib_10": {
4762 "locked": {
4763 "dir": "lib",
4764 "lastModified": 1675183161,
4765 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4766 "owner": "NixOS",
4767 "repo": "nixpkgs",
4768 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4769 "type": "github"
4770 },
4771 "original": {
4772 "dir": "lib",
4773 "owner": "NixOS",
4774 "ref": "nixos-unstable",
4775 "repo": "nixpkgs",
4776 "type": "github"
4777 }
4778 },
4779 "nixpkgs-lib_11": {
4780 "locked": {
4781 "dir": "lib",
4782 "lastModified": 1675183161,
4783 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4784 "owner": "NixOS",
4785 "repo": "nixpkgs",
4786 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4787 "type": "github"
4788 },
4789 "original": {
4790 "dir": "lib",
4791 "owner": "NixOS",
4792 "ref": "nixos-unstable",
4793 "repo": "nixpkgs",
4794 "type": "github"
4795 }
4796 },
4797 "nixpkgs-lib_12": {
4798 "locked": {
4799 "dir": "lib",
4800 "lastModified": 1675183161,
4801 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4802 "owner": "NixOS",
4803 "repo": "nixpkgs",
4804 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4805 "type": "github"
4806 },
4807 "original": {
4808 "dir": "lib",
4809 "owner": "NixOS",
4810 "ref": "nixos-unstable",
4811 "repo": "nixpkgs",
4812 "type": "github"
4813 }
4814 },
4815 "nixpkgs-lib_13": {
4816 "locked": {
4817 "dir": "lib",
4818 "lastModified": 1675183161,
4819 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4820 "owner": "NixOS",
4821 "repo": "nixpkgs",
4822 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4823 "type": "github"
4824 },
4825 "original": {
4826 "dir": "lib",
4827 "owner": "NixOS",
4828 "ref": "nixos-unstable",
4829 "repo": "nixpkgs",
4830 "type": "github"
4831 }
4832 },
4833 "nixpkgs-lib_14": {
4834 "locked": {
4835 "dir": "lib",
4836 "lastModified": 1675183161,
4837 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4838 "owner": "NixOS",
4839 "repo": "nixpkgs",
4840 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4841 "type": "github"
4842 },
4843 "original": {
4844 "dir": "lib",
4845 "owner": "NixOS",
4846 "ref": "nixos-unstable",
4847 "repo": "nixpkgs",
4848 "type": "github"
4849 }
4850 },
4851 "nixpkgs-lib_15": {
4852 "locked": {
4853 "dir": "lib",
4854 "lastModified": 1691269286,
4855 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
4856 "owner": "NixOS",
4857 "repo": "nixpkgs",
4858 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
4859 "type": "github"
4860 },
4861 "original": {
4862 "dir": "lib",
4863 "owner": "NixOS",
4864 "repo": "nixpkgs",
4865 "type": "github"
4866 }
4867 },
4868 "nixpkgs-lib_16": {
4869 "locked": {
4870 "dir": "lib",
4871 "lastModified": 1685564631,
4872 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4873 "owner": "NixOS",
4874 "repo": "nixpkgs",
4875 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4876 "type": "github"
4877 },
4878 "original": {
4879 "dir": "lib",
4880 "owner": "NixOS",
4881 "ref": "nixos-unstable",
4882 "repo": "nixpkgs",
4883 "type": "github"
4884 }
4885 },
4886 "nixpkgs-lib_17": {
4887 "locked": {
4888 "dir": "lib",
4889 "lastModified": 1675183161,
4890 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4891 "owner": "NixOS",
4892 "repo": "nixpkgs",
4893 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4894 "type": "github"
4895 },
4896 "original": {
4897 "dir": "lib",
4898 "owner": "NixOS",
4899 "ref": "nixos-unstable",
4900 "repo": "nixpkgs",
4901 "type": "github"
4902 }
4903 },
4904 "nixpkgs-lib_18": {
4905 "locked": {
4906 "dir": "lib",
4907 "lastModified": 1691269286,
4908 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
4909 "owner": "NixOS",
4910 "repo": "nixpkgs",
4911 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
4912 "type": "github"
4913 },
4914 "original": {
4915 "dir": "lib",
4916 "owner": "NixOS",
4917 "repo": "nixpkgs",
4918 "type": "github"
4919 }
4920 },
4921 "nixpkgs-lib_19": {
4922 "locked": {
4923 "dir": "lib",
4924 "lastModified": 1685564631,
4925 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4926 "owner": "NixOS",
4927 "repo": "nixpkgs",
4928 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4929 "type": "github"
4930 },
4931 "original": {
4932 "dir": "lib",
4933 "owner": "NixOS",
4934 "ref": "nixos-unstable",
4935 "repo": "nixpkgs",
4936 "type": "github"
4937 }
4938 },
4939 "nixpkgs-lib_2": {
4940 "locked": {
4941 "dir": "lib",
4942 "lastModified": 1691269286,
4943 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
4944 "owner": "NixOS",
4945 "repo": "nixpkgs",
4946 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
4947 "type": "github"
4948 },
4949 "original": {
4950 "dir": "lib",
4951 "owner": "NixOS",
4952 "repo": "nixpkgs",
4953 "type": "github"
4954 }
4955 },
4956 "nixpkgs-lib_20": {
4957 "locked": {
4958 "dir": "lib",
4959 "lastModified": 1675183161,
4960 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4961 "owner": "NixOS",
4962 "repo": "nixpkgs",
4963 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4964 "type": "github"
4965 },
4966 "original": {
4967 "dir": "lib",
4968 "owner": "NixOS",
4969 "ref": "nixos-unstable",
4970 "repo": "nixpkgs",
4971 "type": "github"
4972 }
4973 },
4974 "nixpkgs-lib_21": {
4975 "locked": {
4976 "dir": "lib",
4977 "lastModified": 1685564631,
4978 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4979 "owner": "NixOS",
4980 "repo": "nixpkgs",
4981 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4982 "type": "github"
4983 },
4984 "original": {
4985 "dir": "lib",
4986 "owner": "NixOS",
4987 "ref": "nixos-unstable",
4988 "repo": "nixpkgs",
4989 "type": "github"
4990 }
4991 },
4992 "nixpkgs-lib_22": {
4993 "locked": {
4994 "dir": "lib",
4995 "lastModified": 1675183161,
4996 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4997 "owner": "NixOS",
4998 "repo": "nixpkgs",
4999 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5000 "type": "github"
5001 },
5002 "original": {
5003 "dir": "lib",
5004 "owner": "NixOS",
5005 "ref": "nixos-unstable",
5006 "repo": "nixpkgs",
5007 "type": "github"
5008 }
5009 },
5010 "nixpkgs-lib_23": {
5011 "locked": {
5012 "dir": "lib",
5013 "lastModified": 1675183161,
5014 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5015 "owner": "NixOS",
5016 "repo": "nixpkgs",
5017 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5018 "type": "github"
5019 },
5020 "original": {
5021 "dir": "lib",
5022 "owner": "NixOS",
5023 "ref": "nixos-unstable",
5024 "repo": "nixpkgs",
5025 "type": "github"
5026 }
5027 },
5028 "nixpkgs-lib_24": {
5029 "locked": {
5030 "dir": "lib",
5031 "lastModified": 1675183161,
5032 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5033 "owner": "NixOS",
5034 "repo": "nixpkgs",
5035 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5036 "type": "github"
5037 },
5038 "original": {
5039 "dir": "lib",
5040 "owner": "NixOS",
5041 "ref": "nixos-unstable",
5042 "repo": "nixpkgs",
5043 "type": "github"
5044 }
5045 },
5046 "nixpkgs-lib_25": {
5047 "locked": {
5048 "dir": "lib",
5049 "lastModified": 1685564631,
5050 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
5051 "owner": "NixOS",
5052 "repo": "nixpkgs",
5053 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
5054 "type": "github"
5055 },
5056 "original": {
5057 "dir": "lib",
5058 "owner": "NixOS",
5059 "ref": "nixos-unstable",
5060 "repo": "nixpkgs",
5061 "type": "github"
5062 }
5063 },
5064 "nixpkgs-lib_26": {
5065 "locked": {
5066 "dir": "lib",
5067 "lastModified": 1675183161,
5068 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5069 "owner": "NixOS",
5070 "repo": "nixpkgs",
5071 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5072 "type": "github"
5073 },
5074 "original": {
5075 "dir": "lib",
5076 "owner": "NixOS",
5077 "ref": "nixos-unstable",
5078 "repo": "nixpkgs",
5079 "type": "github"
5080 }
5081 },
5082 "nixpkgs-lib_27": {
5083 "locked": {
5084 "dir": "lib",
5085 "lastModified": 1691269286,
5086 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
5087 "owner": "NixOS",
5088 "repo": "nixpkgs",
5089 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
5090 "type": "github"
5091 },
5092 "original": {
5093 "dir": "lib",
5094 "owner": "NixOS",
5095 "repo": "nixpkgs",
5096 "type": "github"
5097 }
5098 },
5099 "nixpkgs-lib_28": {
5100 "locked": {
5101 "dir": "lib",
5102 "lastModified": 1675183161,
5103 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5104 "owner": "NixOS",
5105 "repo": "nixpkgs",
5106 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5107 "type": "github"
5108 },
5109 "original": {
5110 "dir": "lib",
5111 "owner": "NixOS",
5112 "ref": "nixos-unstable",
5113 "repo": "nixpkgs",
5114 "type": "github"
5115 }
5116 },
5117 "nixpkgs-lib_29": {
5118 "locked": {
5119 "dir": "lib",
5120 "lastModified": 1675183161,
5121 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5122 "owner": "NixOS",
5123 "repo": "nixpkgs",
5124 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5125 "type": "github"
5126 },
5127 "original": {
5128 "dir": "lib",
5129 "owner": "NixOS",
5130 "ref": "nixos-unstable",
5131 "repo": "nixpkgs",
5132 "type": "github"
5133 }
5134 },
5135 "nixpkgs-lib_3": {
5136 "locked": {
5137 "dir": "lib",
5138 "lastModified": 1685564631,
5139 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
5140 "owner": "NixOS",
5141 "repo": "nixpkgs",
5142 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
5143 "type": "github"
5144 },
5145 "original": {
5146 "dir": "lib",
5147 "owner": "NixOS",
5148 "ref": "nixos-unstable",
5149 "repo": "nixpkgs",
5150 "type": "github"
5151 }
5152 },
5153 "nixpkgs-lib_4": {
5154 "locked": {
5155 "dir": "lib",
5156 "lastModified": 1675183161,
5157 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5158 "owner": "NixOS",
5159 "repo": "nixpkgs",
5160 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5161 "type": "github"
5162 },
5163 "original": {
5164 "dir": "lib",
5165 "owner": "NixOS",
5166 "ref": "nixos-unstable",
5167 "repo": "nixpkgs",
5168 "type": "github"
5169 }
5170 },
5171 "nixpkgs-lib_5": {
5172 "locked": {
5173 "dir": "lib",
5174 "lastModified": 1691269286,
5175 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
5176 "owner": "NixOS",
5177 "repo": "nixpkgs",
5178 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
5179 "type": "github"
5180 },
5181 "original": {
5182 "dir": "lib",
5183 "owner": "NixOS",
5184 "repo": "nixpkgs",
5185 "type": "github"
5186 }
5187 },
5188 "nixpkgs-lib_6": {
5189 "locked": {
5190 "dir": "lib",
5191 "lastModified": 1685564631,
5192 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
5193 "owner": "NixOS",
5194 "repo": "nixpkgs",
5195 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
5196 "type": "github"
5197 },
5198 "original": {
5199 "dir": "lib",
5200 "owner": "NixOS",
5201 "ref": "nixos-unstable",
5202 "repo": "nixpkgs",
5203 "type": "github"
5204 }
5205 },
5206 "nixpkgs-lib_7": {
5207 "locked": {
5208 "dir": "lib",
5209 "lastModified": 1675183161,
5210 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5211 "owner": "NixOS",
5212 "repo": "nixpkgs",
5213 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5214 "type": "github"
5215 },
5216 "original": {
5217 "dir": "lib",
5218 "owner": "NixOS",
5219 "ref": "nixos-unstable",
5220 "repo": "nixpkgs",
5221 "type": "github"
5222 }
5223 },
5224 "nixpkgs-lib_8": {
5225 "locked": {
5226 "dir": "lib",
5227 "lastModified": 1685564631,
5228 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
5229 "owner": "NixOS",
5230 "repo": "nixpkgs",
5231 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
5232 "type": "github"
5233 },
5234 "original": {
5235 "dir": "lib",
5236 "owner": "NixOS",
5237 "ref": "nixos-unstable",
5238 "repo": "nixpkgs",
5239 "type": "github"
5240 }
5241 },
5242 "nixpkgs-lib_9": {
5243 "locked": {
5244 "dir": "lib",
5245 "lastModified": 1691269286,
5246 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
5247 "owner": "NixOS",
5248 "repo": "nixpkgs",
5249 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
5250 "type": "github"
5251 },
5252 "original": {
5253 "dir": "lib",
5254 "owner": "NixOS",
5255 "repo": "nixpkgs",
5256 "type": "github"
5257 }
5258 },
5259 "nixpkgs_10": {
5260 "locked": {
5261 "lastModified": 1597943282,
5262 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5263 "owner": "NixOS",
5264 "repo": "nixpkgs",
5265 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5266 "type": "github"
5267 },
5268 "original": {
5269 "owner": "NixOS",
5270 "repo": "nixpkgs",
5271 "type": "github"
5272 }
5273 },
5274 "nixpkgs_100": {
5275 "flake": false,
5276 "locked": {
5277 "lastModified": 1596265691,
5278 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5279 "owner": "NixOS",
5280 "repo": "nixpkgs",
5281 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5282 "type": "github"
5283 },
5284 "original": {
5285 "owner": "NixOS",
5286 "repo": "nixpkgs",
5287 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5288 "type": "github"
5289 }
5290 },
5291 "nixpkgs_101": {
5292 "locked": {
5293 "lastModified": 1687502512,
5294 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5295 "owner": "NixOS",
5296 "repo": "nixpkgs",
5297 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5298 "type": "github"
5299 },
5300 "original": {
5301 "owner": "NixOS",
5302 "ref": "nixos-unstable",
5303 "repo": "nixpkgs",
5304 "type": "github"
5305 }
5306 },
5307 "nixpkgs_102": {
5308 "locked": {
5309 "lastModified": 1646497237,
5310 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5311 "owner": "nixos",
5312 "repo": "nixpkgs",
5313 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5314 "type": "github"
5315 },
5316 "original": {
5317 "owner": "nixos",
5318 "repo": "nixpkgs",
5319 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5320 "type": "github"
5321 }
5322 },
5323 "nixpkgs_103": {
5324 "locked": {
5325 "lastModified": 1646497237,
5326 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5327 "owner": "nixos",
5328 "repo": "nixpkgs",
5329 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5330 "type": "github"
5331 },
5332 "original": {
5333 "owner": "nixos",
5334 "repo": "nixpkgs",
5335 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5336 "type": "github"
5337 }
5338 },
5339 "nixpkgs_104": {
5340 "flake": false,
5341 "locked": {
5342 "lastModified": 1596265691,
5343 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5344 "owner": "NixOS",
5345 "repo": "nixpkgs",
5346 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5347 "type": "github"
5348 },
5349 "original": {
5350 "owner": "NixOS",
5351 "repo": "nixpkgs",
5352 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5353 "type": "github"
5354 }
5355 },
5356 "nixpkgs_105": {
5357 "flake": false,
5358 "locked": {
5359 "lastModified": 1596265691,
5360 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5361 "owner": "NixOS",
5362 "repo": "nixpkgs",
5363 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5364 "type": "github"
5365 },
5366 "original": {
5367 "owner": "NixOS",
5368 "repo": "nixpkgs",
5369 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5370 "type": "github"
5371 }
5372 },
5373 "nixpkgs_106": {
5374 "locked": {
5375 "lastModified": 1692447944,
5376 "narHash": "sha256-fkJGNjEmTPvqBs215EQU4r9ivecV5Qge5cF/QDLVn3U=",
5377 "owner": "nixos",
5378 "repo": "nixpkgs",
5379 "rev": "d680ded26da5cf104dd2735a51e88d2d8f487b4d",
5380 "type": "github"
5381 },
5382 "original": {
5383 "owner": "nixos",
5384 "ref": "nixos-unstable",
5385 "repo": "nixpkgs",
5386 "type": "github"
5387 }
5388 },
5389 "nixpkgs_11": {
5390 "locked": {
5391 "lastModified": 1687502512,
5392 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5393 "owner": "NixOS",
5394 "repo": "nixpkgs",
5395 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5396 "type": "github"
5397 },
5398 "original": {
5399 "owner": "NixOS",
5400 "ref": "nixos-unstable",
5401 "repo": "nixpkgs",
5402 "type": "github"
5403 }
5404 },
5405 "nixpkgs_12": {
5406 "locked": {
5407 "lastModified": 1646497237,
5408 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5409 "owner": "nixos",
5410 "repo": "nixpkgs",
5411 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5412 "type": "github"
5413 },
5414 "original": {
5415 "owner": "nixos",
5416 "repo": "nixpkgs",
5417 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5418 "type": "github"
5419 }
5420 },
5421 "nixpkgs_13": {
5422 "locked": {
5423 "lastModified": 1683408522,
5424 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
5425 "owner": "NixOS",
5426 "repo": "nixpkgs",
5427 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
5428 "type": "github"
5429 },
5430 "original": {
5431 "owner": "NixOS",
5432 "ref": "nixos-unstable",
5433 "repo": "nixpkgs",
5434 "type": "github"
5435 }
5436 },
5437 "nixpkgs_14": {
5438 "locked": {
5439 "lastModified": 1687701825,
5440 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
5441 "owner": "NixOS",
5442 "repo": "nixpkgs",
5443 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
5444 "type": "github"
5445 },
5446 "original": {
5447 "owner": "NixOS",
5448 "ref": "nixpkgs-unstable",
5449 "repo": "nixpkgs",
5450 "type": "github"
5451 }
5452 },
5453 "nixpkgs_15": {
5454 "locked": {
5455 "lastModified": 1687893427,
5456 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
5457 "owner": "nixos",
5458 "repo": "nixpkgs",
5459 "rev": "4b14ab2a916508442e685089672681dff46805be",
5460 "type": "github"
5461 },
5462 "original": {
5463 "owner": "nixos",
5464 "ref": "nixos-unstable-small",
5465 "repo": "nixpkgs",
5466 "type": "github"
5467 }
5468 },
5469 "nixpkgs_16": {
5470 "locked": {
5471 "lastModified": 1648725829,
5472 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
5473 "owner": "NixOS",
5474 "repo": "nixpkgs",
5475 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
5476 "type": "github"
5477 },
5478 "original": {
5479 "owner": "NixOS",
5480 "repo": "nixpkgs",
5481 "type": "github"
5482 }
5483 },
5484 "nixpkgs_17": {
5485 "locked": {
5486 "lastModified": 1693158576,
5487 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
5488 "owner": "nixos",
5489 "repo": "nixpkgs",
5490 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
5491 "type": "github"
5492 },
5493 "original": {
5494 "owner": "nixos",
5495 "ref": "nixos-unstable",
5496 "repo": "nixpkgs",
5497 "type": "github"
5498 }
5499 },
5500 "nixpkgs_18": {
5501 "locked": {
5502 "lastModified": 1687502512,
5503 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5504 "owner": "NixOS",
5505 "repo": "nixpkgs",
5506 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5507 "type": "github"
5508 },
5509 "original": {
5510 "owner": "NixOS",
5511 "ref": "nixos-unstable",
5512 "repo": "nixpkgs",
5513 "type": "github"
5514 }
5515 },
5516 "nixpkgs_19": {
5517 "locked": {
5518 "lastModified": 1646497237,
5519 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5520 "owner": "nixos",
5521 "repo": "nixpkgs",
5522 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5523 "type": "github"
5524 },
5525 "original": {
5526 "owner": "nixos",
5527 "repo": "nixpkgs",
5528 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5529 "type": "github"
5530 }
5531 },
5532 "nixpkgs_2": {
5533 "locked": {
5534 "lastModified": 1597943282,
5535 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5536 "owner": "NixOS",
5537 "repo": "nixpkgs",
5538 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5539 "type": "github"
5540 },
5541 "original": {
5542 "owner": "NixOS",
5543 "repo": "nixpkgs",
5544 "type": "github"
5545 }
5546 },
5547 "nixpkgs_20": {
5548 "locked": {
5549 "lastModified": 1683408522,
5550 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
5551 "owner": "NixOS",
5552 "repo": "nixpkgs",
5553 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
5554 "type": "github"
5555 },
5556 "original": {
5557 "owner": "NixOS",
5558 "ref": "nixos-unstable",
5559 "repo": "nixpkgs",
5560 "type": "github"
5561 }
5562 },
5563 "nixpkgs_21": {
5564 "locked": {
5565 "lastModified": 1687701825,
5566 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
5567 "owner": "NixOS",
5568 "repo": "nixpkgs",
5569 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
5570 "type": "github"
5571 },
5572 "original": {
5573 "owner": "NixOS",
5574 "ref": "nixpkgs-unstable",
5575 "repo": "nixpkgs",
5576 "type": "github"
5577 }
5578 },
5579 "nixpkgs_22": {
5580 "locked": {
5581 "lastModified": 1687893427,
5582 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
5583 "owner": "nixos",
5584 "repo": "nixpkgs",
5585 "rev": "4b14ab2a916508442e685089672681dff46805be",
5586 "type": "github"
5587 },
5588 "original": {
5589 "owner": "nixos",
5590 "ref": "nixos-unstable-small",
5591 "repo": "nixpkgs",
5592 "type": "github"
5593 }
5594 },
5595 "nixpkgs_23": {
5596 "locked": {
5597 "lastModified": 1648725829,
5598 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
5599 "owner": "NixOS",
5600 "repo": "nixpkgs",
5601 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
5602 "type": "github"
5603 },
5604 "original": {
5605 "owner": "NixOS",
5606 "repo": "nixpkgs",
5607 "type": "github"
5608 }
5609 },
5610 "nixpkgs_24": {
5611 "locked": {
5612 "lastModified": 1693158576,
5613 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
5614 "owner": "nixos",
5615 "repo": "nixpkgs",
5616 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
5617 "type": "github"
5618 },
5619 "original": {
5620 "owner": "nixos",
5621 "ref": "nixos-unstable",
5622 "repo": "nixpkgs",
5623 "type": "github"
5624 }
5625 },
5626 "nixpkgs_25": {
5627 "flake": false,
5628 "locked": {
5629 "lastModified": 1596265691,
5630 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5631 "owner": "NixOS",
5632 "repo": "nixpkgs",
5633 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5634 "type": "github"
5635 },
5636 "original": {
5637 "owner": "NixOS",
5638 "repo": "nixpkgs",
5639 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5640 "type": "github"
5641 }
5642 },
5643 "nixpkgs_26": {
5644 "locked": {
5645 "lastModified": 1597943282,
5646 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5647 "owner": "NixOS",
5648 "repo": "nixpkgs",
5649 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5650 "type": "github"
5651 },
5652 "original": {
5653 "owner": "NixOS",
5654 "repo": "nixpkgs",
5655 "type": "github"
5656 }
5657 },
5658 "nixpkgs_27": {
5659 "locked": {
5660 "lastModified": 1597943282,
5661 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5662 "owner": "NixOS",
5663 "repo": "nixpkgs",
5664 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5665 "type": "github"
5666 },
5667 "original": {
5668 "owner": "NixOS",
5669 "repo": "nixpkgs",
5670 "type": "github"
5671 }
5672 },
5673 "nixpkgs_28": {
5674 "locked": {
5675 "lastModified": 1597943282,
5676 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5677 "owner": "NixOS",
5678 "repo": "nixpkgs",
5679 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5680 "type": "github"
5681 },
5682 "original": {
5683 "owner": "NixOS",
5684 "repo": "nixpkgs",
5685 "type": "github"
5686 }
5687 },
5688 "nixpkgs_29": {
5689 "locked": {
5690 "lastModified": 1597943282,
5691 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5692 "owner": "NixOS",
5693 "repo": "nixpkgs",
5694 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5695 "type": "github"
5696 },
5697 "original": {
5698 "owner": "NixOS",
5699 "repo": "nixpkgs",
5700 "type": "github"
5701 }
5702 },
5703 "nixpkgs_3": {
5704 "locked": {
5705 "lastModified": 1597943282,
5706 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5707 "owner": "NixOS",
5708 "repo": "nixpkgs",
5709 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5710 "type": "github"
5711 },
5712 "original": {
5713 "owner": "NixOS",
5714 "repo": "nixpkgs",
5715 "type": "github"
5716 }
5717 },
5718 "nixpkgs_30": {
5719 "locked": {
5720 "lastModified": 1631570365,
5721 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
5722 "owner": "NixOS",
5723 "repo": "nixpkgs",
5724 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
5725 "type": "github"
5726 },
5727 "original": {
5728 "owner": "NixOS",
5729 "repo": "nixpkgs",
5730 "type": "github"
5731 }
5732 },
5733 "nixpkgs_31": {
5734 "locked": {
5735 "lastModified": 1611097871,
5736 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
5737 "owner": "NixOS",
5738 "repo": "nixpkgs",
5739 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
5740 "type": "github"
5741 },
5742 "original": {
5743 "owner": "NixOS",
5744 "repo": "nixpkgs",
5745 "type": "github"
5746 }
5747 },
5748 "nixpkgs_32": {
5749 "locked": {
5750 "lastModified": 1611097871,
5751 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
5752 "owner": "NixOS",
5753 "repo": "nixpkgs",
5754 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
5755 "type": "github"
5756 },
5757 "original": {
5758 "owner": "NixOS",
5759 "repo": "nixpkgs",
5760 "type": "github"
5761 }
5762 },
5763 "nixpkgs_33": {
5764 "flake": false,
5765 "locked": {
5766 "lastModified": 1596265691,
5767 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5768 "owner": "NixOS",
5769 "repo": "nixpkgs",
5770 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5771 "type": "github"
5772 },
5773 "original": {
5774 "owner": "NixOS",
5775 "repo": "nixpkgs",
5776 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5777 "type": "github"
5778 }
5779 },
5780 "nixpkgs_34": {
5781 "locked": {
5782 "lastModified": 1687502512,
5783 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5784 "owner": "NixOS",
5785 "repo": "nixpkgs",
5786 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5787 "type": "github"
5788 },
5789 "original": {
5790 "owner": "NixOS",
5791 "ref": "nixos-unstable",
5792 "repo": "nixpkgs",
5793 "type": "github"
5794 }
5795 },
5796 "nixpkgs_35": {
5797 "locked": {
5798 "lastModified": 1646497237,
5799 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5800 "owner": "nixos",
5801 "repo": "nixpkgs",
5802 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5803 "type": "github"
5804 },
5805 "original": {
5806 "owner": "nixos",
5807 "repo": "nixpkgs",
5808 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5809 "type": "github"
5810 }
5811 },
5812 "nixpkgs_36": {
5813 "locked": {
5814 "lastModified": 1633901457,
5815 "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
5816 "owner": "NixOS",
5817 "repo": "nixpkgs",
5818 "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
5819 "type": "github"
5820 },
5821 "original": {
5822 "owner": "NixOS",
5823 "repo": "nixpkgs",
5824 "type": "github"
5825 }
5826 },
5827 "nixpkgs_37": {
5828 "flake": false,
5829 "locked": {
5830 "lastModified": 1596265691,
5831 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5832 "owner": "NixOS",
5833 "repo": "nixpkgs",
5834 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5835 "type": "github"
5836 },
5837 "original": {
5838 "owner": "NixOS",
5839 "repo": "nixpkgs",
5840 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5841 "type": "github"
5842 }
5843 },
5844 "nixpkgs_38": {
5845 "locked": {
5846 "lastModified": 1646497237,
5847 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5848 "owner": "nixos",
5849 "repo": "nixpkgs",
5850 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5851 "type": "github"
5852 },
5853 "original": {
5854 "owner": "nixos",
5855 "repo": "nixpkgs",
5856 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5857 "type": "github"
5858 }
5859 },
5860 "nixpkgs_39": {
5861 "flake": false,
5862 "locked": {
5863 "lastModified": 1596265691,
5864 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5865 "owner": "NixOS",
5866 "repo": "nixpkgs",
5867 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5868 "type": "github"
5869 },
5870 "original": {
5871 "owner": "NixOS",
5872 "repo": "nixpkgs",
5873 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5874 "type": "github"
5875 }
5876 },
5877 "nixpkgs_4": {
5878 "locked": {
5879 "lastModified": 1683408522,
5880 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
5881 "owner": "NixOS",
5882 "repo": "nixpkgs",
5883 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
5884 "type": "github"
5885 },
5886 "original": {
5887 "owner": "NixOS",
5888 "ref": "nixos-unstable",
5889 "repo": "nixpkgs",
5890 "type": "github"
5891 }
5892 },
5893 "nixpkgs_40": {
5894 "locked": {
5895 "lastModified": 1646497237,
5896 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5897 "owner": "nixos",
5898 "repo": "nixpkgs",
5899 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5900 "type": "github"
5901 },
5902 "original": {
5903 "owner": "nixos",
5904 "repo": "nixpkgs",
5905 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5906 "type": "github"
5907 }
5908 },
5909 "nixpkgs_41": {
5910 "flake": false,
5911 "locked": {
5912 "lastModified": 1596265691,
5913 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5914 "owner": "NixOS",
5915 "repo": "nixpkgs",
5916 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5917 "type": "github"
5918 },
5919 "original": {
5920 "owner": "NixOS",
5921 "repo": "nixpkgs",
5922 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5923 "type": "github"
5924 }
5925 },
5926 "nixpkgs_42": {
5927 "flake": false,
5928 "locked": {
5929 "lastModified": 1596265691,
5930 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5931 "owner": "NixOS",
5932 "repo": "nixpkgs",
5933 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5934 "type": "github"
5935 },
5936 "original": {
5937 "owner": "NixOS",
5938 "repo": "nixpkgs",
5939 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5940 "type": "github"
5941 }
5942 },
5943 "nixpkgs_43": {
5944 "flake": false,
5945 "locked": {
5946 "lastModified": 1596265691,
5947 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5948 "owner": "NixOS",
5949 "repo": "nixpkgs",
5950 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5951 "type": "github"
5952 },
5953 "original": {
5954 "owner": "NixOS",
5955 "repo": "nixpkgs",
5956 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5957 "type": "github"
5958 }
5959 },
5960 "nixpkgs_44": {
5961 "locked": {
5962 "lastModified": 1646497237,
5963 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5964 "owner": "nixos",
5965 "repo": "nixpkgs",
5966 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5967 "type": "github"
5968 },
5969 "original": {
5970 "owner": "nixos",
5971 "repo": "nixpkgs",
5972 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5973 "type": "github"
5974 }
5975 },
5976 "nixpkgs_45": {
5977 "locked": {
5978 "lastModified": 1597943282,
5979 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5980 "owner": "NixOS",
5981 "repo": "nixpkgs",
5982 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5983 "type": "github"
5984 },
5985 "original": {
5986 "owner": "NixOS",
5987 "repo": "nixpkgs",
5988 "type": "github"
5989 }
5990 },
5991 "nixpkgs_46": {
5992 "locked": {
5993 "lastModified": 1597943282,
5994 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5995 "owner": "NixOS",
5996 "repo": "nixpkgs",
5997 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5998 "type": "github"
5999 },
6000 "original": {
6001 "owner": "NixOS",
6002 "repo": "nixpkgs",
6003 "type": "github"
6004 }
6005 },
6006 "nixpkgs_47": {
6007 "locked": {
6008 "lastModified": 1611097871,
6009 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
6010 "owner": "NixOS",
6011 "repo": "nixpkgs",
6012 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
6013 "type": "github"
6014 },
6015 "original": {
6016 "owner": "NixOS",
6017 "repo": "nixpkgs",
6018 "type": "github"
6019 }
6020 },
6021 "nixpkgs_48": {
6022 "locked": {
6023 "lastModified": 1646497237,
6024 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6025 "owner": "nixos",
6026 "repo": "nixpkgs",
6027 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6028 "type": "github"
6029 },
6030 "original": {
6031 "owner": "nixos",
6032 "repo": "nixpkgs",
6033 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6034 "type": "github"
6035 }
6036 },
6037 "nixpkgs_49": {
6038 "flake": false,
6039 "locked": {
6040 "lastModified": 1596265691,
6041 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6042 "owner": "NixOS",
6043 "repo": "nixpkgs",
6044 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6045 "type": "github"
6046 },
6047 "original": {
6048 "owner": "NixOS",
6049 "repo": "nixpkgs",
6050 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6051 "type": "github"
6052 }
6053 },
6054 "nixpkgs_5": {
6055 "locked": {
6056 "lastModified": 1687701825,
6057 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6058 "owner": "NixOS",
6059 "repo": "nixpkgs",
6060 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6061 "type": "github"
6062 },
6063 "original": {
6064 "owner": "NixOS",
6065 "ref": "nixpkgs-unstable",
6066 "repo": "nixpkgs",
6067 "type": "github"
6068 }
6069 },
6070 "nixpkgs_50": {
6071 "flake": false,
6072 "locked": {
6073 "lastModified": 1596265691,
6074 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6075 "owner": "NixOS",
6076 "repo": "nixpkgs",
6077 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6078 "type": "github"
6079 },
6080 "original": {
6081 "owner": "NixOS",
6082 "repo": "nixpkgs",
6083 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6084 "type": "github"
6085 }
6086 },
6087 "nixpkgs_51": {
6088 "locked": {
6089 "lastModified": 1683408522,
6090 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
6091 "owner": "NixOS",
6092 "repo": "nixpkgs",
6093 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
6094 "type": "github"
6095 },
6096 "original": {
6097 "owner": "NixOS",
6098 "ref": "nixos-unstable",
6099 "repo": "nixpkgs",
6100 "type": "github"
6101 }
6102 },
6103 "nixpkgs_52": {
6104 "locked": {
6105 "lastModified": 1687701825,
6106 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6107 "owner": "NixOS",
6108 "repo": "nixpkgs",
6109 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6110 "type": "github"
6111 },
6112 "original": {
6113 "owner": "NixOS",
6114 "ref": "nixpkgs-unstable",
6115 "repo": "nixpkgs",
6116 "type": "github"
6117 }
6118 },
6119 "nixpkgs_53": {
6120 "locked": {
6121 "lastModified": 1687893427,
6122 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6123 "owner": "nixos",
6124 "repo": "nixpkgs",
6125 "rev": "4b14ab2a916508442e685089672681dff46805be",
6126 "type": "github"
6127 },
6128 "original": {
6129 "owner": "nixos",
6130 "ref": "nixos-unstable-small",
6131 "repo": "nixpkgs",
6132 "type": "github"
6133 }
6134 },
6135 "nixpkgs_54": {
6136 "locked": {
6137 "lastModified": 1648725829,
6138 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6139 "owner": "NixOS",
6140 "repo": "nixpkgs",
6141 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6142 "type": "github"
6143 },
6144 "original": {
6145 "owner": "NixOS",
6146 "repo": "nixpkgs",
6147 "type": "github"
6148 }
6149 },
6150 "nixpkgs_55": {
6151 "locked": {
6152 "lastModified": 1693158576,
6153 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
6154 "owner": "nixos",
6155 "repo": "nixpkgs",
6156 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
6157 "type": "github"
6158 },
6159 "original": {
6160 "owner": "nixos",
6161 "ref": "nixos-unstable",
6162 "repo": "nixpkgs",
6163 "type": "github"
6164 }
6165 },
6166 "nixpkgs_56": {
6167 "flake": false,
6168 "locked": {
6169 "lastModified": 1596265691,
6170 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6171 "owner": "NixOS",
6172 "repo": "nixpkgs",
6173 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6174 "type": "github"
6175 },
6176 "original": {
6177 "owner": "NixOS",
6178 "repo": "nixpkgs",
6179 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6180 "type": "github"
6181 }
6182 },
6183 "nixpkgs_57": {
6184 "locked": {
6185 "lastModified": 1687502512,
6186 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
6187 "owner": "NixOS",
6188 "repo": "nixpkgs",
6189 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6190 "type": "github"
6191 },
6192 "original": {
6193 "owner": "NixOS",
6194 "ref": "nixos-unstable",
6195 "repo": "nixpkgs",
6196 "type": "github"
6197 }
6198 },
6199 "nixpkgs_58": {
6200 "locked": {
6201 "lastModified": 1646497237,
6202 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6203 "owner": "nixos",
6204 "repo": "nixpkgs",
6205 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6206 "type": "github"
6207 },
6208 "original": {
6209 "owner": "nixos",
6210 "repo": "nixpkgs",
6211 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6212 "type": "github"
6213 }
6214 },
6215 "nixpkgs_59": {
6216 "locked": {
6217 "lastModified": 1683408522,
6218 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
6219 "owner": "NixOS",
6220 "repo": "nixpkgs",
6221 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
6222 "type": "github"
6223 },
6224 "original": {
6225 "owner": "NixOS",
6226 "ref": "nixos-unstable",
6227 "repo": "nixpkgs",
6228 "type": "github"
6229 }
6230 },
6231 "nixpkgs_6": {
6232 "locked": {
6233 "lastModified": 1687893427,
6234 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6235 "owner": "nixos",
6236 "repo": "nixpkgs",
6237 "rev": "4b14ab2a916508442e685089672681dff46805be",
6238 "type": "github"
6239 },
6240 "original": {
6241 "owner": "nixos",
6242 "ref": "nixos-unstable-small",
6243 "repo": "nixpkgs",
6244 "type": "github"
6245 }
6246 },
6247 "nixpkgs_60": {
6248 "locked": {
6249 "lastModified": 1687701825,
6250 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6251 "owner": "NixOS",
6252 "repo": "nixpkgs",
6253 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6254 "type": "github"
6255 },
6256 "original": {
6257 "owner": "NixOS",
6258 "ref": "nixpkgs-unstable",
6259 "repo": "nixpkgs",
6260 "type": "github"
6261 }
6262 },
6263 "nixpkgs_61": {
6264 "locked": {
6265 "lastModified": 1687893427,
6266 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6267 "owner": "nixos",
6268 "repo": "nixpkgs",
6269 "rev": "4b14ab2a916508442e685089672681dff46805be",
6270 "type": "github"
6271 },
6272 "original": {
6273 "owner": "nixos",
6274 "ref": "nixos-unstable-small",
6275 "repo": "nixpkgs",
6276 "type": "github"
6277 }
6278 },
6279 "nixpkgs_62": {
6280 "locked": {
6281 "lastModified": 1648725829,
6282 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6283 "owner": "NixOS",
6284 "repo": "nixpkgs",
6285 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6286 "type": "github"
6287 },
6288 "original": {
6289 "owner": "NixOS",
6290 "repo": "nixpkgs",
6291 "type": "github"
6292 }
6293 },
6294 "nixpkgs_63": {
6295 "locked": {
6296 "lastModified": 1693158576,
6297 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
6298 "owner": "nixos",
6299 "repo": "nixpkgs",
6300 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
6301 "type": "github"
6302 },
6303 "original": {
6304 "owner": "nixos",
6305 "ref": "nixos-unstable",
6306 "repo": "nixpkgs",
6307 "type": "github"
6308 }
6309 },
6310 "nixpkgs_64": {
6311 "flake": false,
6312 "locked": {
6313 "lastModified": 1596265691,
6314 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6315 "owner": "NixOS",
6316 "repo": "nixpkgs",
6317 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6318 "type": "github"
6319 },
6320 "original": {
6321 "owner": "NixOS",
6322 "repo": "nixpkgs",
6323 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6324 "type": "github"
6325 }
6326 },
6327 "nixpkgs_65": {
6328 "locked": {
6329 "lastModified": 1687502512,
6330 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
6331 "owner": "NixOS",
6332 "repo": "nixpkgs",
6333 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6334 "type": "github"
6335 },
6336 "original": {
6337 "owner": "NixOS",
6338 "ref": "nixos-unstable",
6339 "repo": "nixpkgs",
6340 "type": "github"
6341 }
6342 },
6343 "nixpkgs_66": {
6344 "locked": {
6345 "lastModified": 1646497237,
6346 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6347 "owner": "nixos",
6348 "repo": "nixpkgs",
6349 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6350 "type": "github"
6351 },
6352 "original": {
6353 "owner": "nixos",
6354 "repo": "nixpkgs",
6355 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6356 "type": "github"
6357 }
6358 },
6359 "nixpkgs_67": {
6360 "locked": {
6361 "lastModified": 1683408522,
6362 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
6363 "owner": "NixOS",
6364 "repo": "nixpkgs",
6365 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
6366 "type": "github"
6367 },
6368 "original": {
6369 "owner": "NixOS",
6370 "ref": "nixos-unstable",
6371 "repo": "nixpkgs",
6372 "type": "github"
6373 }
6374 },
6375 "nixpkgs_68": {
6376 "locked": {
6377 "lastModified": 1687701825,
6378 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6379 "owner": "NixOS",
6380 "repo": "nixpkgs",
6381 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6382 "type": "github"
6383 },
6384 "original": {
6385 "owner": "NixOS",
6386 "ref": "nixpkgs-unstable",
6387 "repo": "nixpkgs",
6388 "type": "github"
6389 }
6390 },
6391 "nixpkgs_69": {
6392 "locked": {
6393 "lastModified": 1687893427,
6394 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6395 "owner": "nixos",
6396 "repo": "nixpkgs",
6397 "rev": "4b14ab2a916508442e685089672681dff46805be",
6398 "type": "github"
6399 },
6400 "original": {
6401 "owner": "nixos",
6402 "ref": "nixos-unstable-small",
6403 "repo": "nixpkgs",
6404 "type": "github"
6405 }
6406 },
6407 "nixpkgs_7": {
6408 "locked": {
6409 "lastModified": 1648725829,
6410 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6411 "owner": "NixOS",
6412 "repo": "nixpkgs",
6413 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6414 "type": "github"
6415 },
6416 "original": {
6417 "owner": "NixOS",
6418 "repo": "nixpkgs",
6419 "type": "github"
6420 }
6421 },
6422 "nixpkgs_70": {
6423 "locked": {
6424 "lastModified": 1648725829,
6425 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6426 "owner": "NixOS",
6427 "repo": "nixpkgs",
6428 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6429 "type": "github"
6430 },
6431 "original": {
6432 "owner": "NixOS",
6433 "repo": "nixpkgs",
6434 "type": "github"
6435 }
6436 },
6437 "nixpkgs_71": {
6438 "locked": {
6439 "lastModified": 1693158576,
6440 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
6441 "owner": "nixos",
6442 "repo": "nixpkgs",
6443 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
6444 "type": "github"
6445 },
6446 "original": {
6447 "owner": "NixOS",
6448 "ref": "nixos-unstable",
6449 "repo": "nixpkgs",
6450 "type": "github"
6451 }
6452 },
6453 "nixpkgs_72": {
6454 "locked": {
6455 "lastModified": 1687502512,
6456 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
6457 "owner": "NixOS",
6458 "repo": "nixpkgs",
6459 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6460 "type": "github"
6461 },
6462 "original": {
6463 "owner": "NixOS",
6464 "ref": "nixos-unstable",
6465 "repo": "nixpkgs",
6466 "type": "github"
6467 }
6468 },
6469 "nixpkgs_73": {
6470 "locked": {
6471 "lastModified": 1646497237,
6472 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6473 "owner": "nixos",
6474 "repo": "nixpkgs",
6475 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6476 "type": "github"
6477 },
6478 "original": {
6479 "owner": "nixos",
6480 "repo": "nixpkgs",
6481 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6482 "type": "github"
6483 }
6484 },
6485 "nixpkgs_74": {
6486 "locked": {
6487 "lastModified": 1687502512,
6488 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
6489 "owner": "NixOS",
6490 "repo": "nixpkgs",
6491 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6492 "type": "github"
6493 },
6494 "original": {
6495 "owner": "NixOS",
6496 "ref": "nixos-unstable",
6497 "repo": "nixpkgs",
6498 "type": "github"
6499 }
6500 },
6501 "nixpkgs_75": {
6502 "locked": {
6503 "lastModified": 1633901457,
6504 "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
6505 "owner": "NixOS",
6506 "repo": "nixpkgs",
6507 "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
6508 "type": "github"
6509 },
6510 "original": {
6511 "owner": "NixOS",
6512 "repo": "nixpkgs",
6513 "type": "github"
6514 }
6515 },
6516 "nixpkgs_76": {
6517 "flake": false,
6518 "locked": {
6519 "lastModified": 1596265691,
6520 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6521 "owner": "NixOS",
6522 "repo": "nixpkgs",
6523 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6524 "type": "github"
6525 },
6526 "original": {
6527 "owner": "NixOS",
6528 "repo": "nixpkgs",
6529 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6530 "type": "github"
6531 }
6532 },
6533 "nixpkgs_77": {
6534 "locked": {
6535 "lastModified": 1646497237,
6536 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6537 "owner": "nixos",
6538 "repo": "nixpkgs",
6539 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6540 "type": "github"
6541 },
6542 "original": {
6543 "owner": "nixos",
6544 "repo": "nixpkgs",
6545 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6546 "type": "github"
6547 }
6548 },
6549 "nixpkgs_78": {
6550 "flake": false,
6551 "locked": {
6552 "lastModified": 1596265691,
6553 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6554 "owner": "NixOS",
6555 "repo": "nixpkgs",
6556 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6557 "type": "github"
6558 },
6559 "original": {
6560 "owner": "NixOS",
6561 "repo": "nixpkgs",
6562 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6563 "type": "github"
6564 }
6565 },
6566 "nixpkgs_79": {
6567 "locked": {
6568 "lastModified": 1646497237,
6569 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6570 "owner": "nixos",
6571 "repo": "nixpkgs",
6572 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6573 "type": "github"
6574 },
6575 "original": {
6576 "owner": "nixos",
6577 "repo": "nixpkgs",
6578 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6579 "type": "github"
6580 }
6581 },
6582 "nixpkgs_8": {
6583 "locked": {
6584 "lastModified": 1693158576,
6585 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
6586 "owner": "nixos",
6587 "repo": "nixpkgs",
6588 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
6589 "type": "github"
6590 },
6591 "original": {
6592 "owner": "nixos",
6593 "ref": "nixos-unstable",
6594 "repo": "nixpkgs",
6595 "type": "github"
6596 }
6597 },
6598 "nixpkgs_80": {
6599 "flake": false,
6600 "locked": {
6601 "lastModified": 1596265691,
6602 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6603 "owner": "NixOS",
6604 "repo": "nixpkgs",
6605 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6606 "type": "github"
6607 },
6608 "original": {
6609 "owner": "NixOS",
6610 "repo": "nixpkgs",
6611 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6612 "type": "github"
6613 }
6614 },
6615 "nixpkgs_81": {
6616 "locked": {
6617 "lastModified": 1683408522,
6618 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
6619 "owner": "NixOS",
6620 "repo": "nixpkgs",
6621 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
6622 "type": "github"
6623 },
6624 "original": {
6625 "owner": "NixOS",
6626 "ref": "nixos-unstable",
6627 "repo": "nixpkgs",
6628 "type": "github"
6629 }
6630 },
6631 "nixpkgs_82": {
6632 "locked": {
6633 "lastModified": 1687701825,
6634 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6635 "owner": "NixOS",
6636 "repo": "nixpkgs",
6637 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6638 "type": "github"
6639 },
6640 "original": {
6641 "owner": "NixOS",
6642 "ref": "nixpkgs-unstable",
6643 "repo": "nixpkgs",
6644 "type": "github"
6645 }
6646 },
6647 "nixpkgs_83": {
6648 "locked": {
6649 "lastModified": 1687893427,
6650 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6651 "owner": "nixos",
6652 "repo": "nixpkgs",
6653 "rev": "4b14ab2a916508442e685089672681dff46805be",
6654 "type": "github"
6655 },
6656 "original": {
6657 "owner": "nixos",
6658 "ref": "nixos-unstable-small",
6659 "repo": "nixpkgs",
6660 "type": "github"
6661 }
6662 },
6663 "nixpkgs_84": {
6664 "locked": {
6665 "lastModified": 1648725829,
6666 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6667 "owner": "NixOS",
6668 "repo": "nixpkgs",
6669 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6670 "type": "github"
6671 },
6672 "original": {
6673 "owner": "NixOS",
6674 "repo": "nixpkgs",
6675 "type": "github"
6676 }
6677 },
6678 "nixpkgs_85": {
6679 "flake": false,
6680 "locked": {
6681 "lastModified": 1596265691,
6682 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6683 "owner": "NixOS",
6684 "repo": "nixpkgs",
6685 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6686 "type": "github"
6687 },
6688 "original": {
6689 "owner": "NixOS",
6690 "repo": "nixpkgs",
6691 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6692 "type": "github"
6693 }
6694 },
6695 "nixpkgs_86": {
6696 "flake": false,
6697 "locked": {
6698 "lastModified": 1596265691,
6699 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6700 "owner": "NixOS",
6701 "repo": "nixpkgs",
6702 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6703 "type": "github"
6704 },
6705 "original": {
6706 "owner": "NixOS",
6707 "repo": "nixpkgs",
6708 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6709 "type": "github"
6710 }
6711 },
6712 "nixpkgs_87": {
6713 "locked": {
6714 "lastModified": 1646497237,
6715 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6716 "owner": "nixos",
6717 "repo": "nixpkgs",
6718 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6719 "type": "github"
6720 },
6721 "original": {
6722 "owner": "nixos",
6723 "repo": "nixpkgs",
6724 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6725 "type": "github"
6726 }
6727 },
6728 "nixpkgs_88": {
6729 "locked": {
6730 "lastModified": 1597943282,
6731 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6732 "owner": "NixOS",
6733 "repo": "nixpkgs",
6734 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6735 "type": "github"
6736 },
6737 "original": {
6738 "owner": "NixOS",
6739 "repo": "nixpkgs",
6740 "type": "github"
6741 }
6742 },
6743 "nixpkgs_89": {
6744 "locked": {
6745 "lastModified": 1597943282,
6746 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6747 "owner": "NixOS",
6748 "repo": "nixpkgs",
6749 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6750 "type": "github"
6751 },
6752 "original": {
6753 "owner": "NixOS",
6754 "repo": "nixpkgs",
6755 "type": "github"
6756 }
6757 },
6758 "nixpkgs_9": {
6759 "locked": {
6760 "lastModified": 1597943282,
6761 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6762 "owner": "NixOS",
6763 "repo": "nixpkgs",
6764 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6765 "type": "github"
6766 },
6767 "original": {
6768 "owner": "NixOS",
6769 "repo": "nixpkgs",
6770 "type": "github"
6771 }
6772 },
6773 "nixpkgs_90": {
6774 "locked": {
6775 "lastModified": 1631570365,
6776 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
6777 "owner": "NixOS",
6778 "repo": "nixpkgs",
6779 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
6780 "type": "github"
6781 },
6782 "original": {
6783 "owner": "NixOS",
6784 "repo": "nixpkgs",
6785 "type": "github"
6786 }
6787 },
6788 "nixpkgs_91": {
6789 "locked": {
6790 "lastModified": 1611097871,
6791 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
6792 "owner": "NixOS",
6793 "repo": "nixpkgs",
6794 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
6795 "type": "github"
6796 },
6797 "original": {
6798 "owner": "NixOS",
6799 "repo": "nixpkgs",
6800 "type": "github"
6801 }
6802 },
6803 "nixpkgs_92": {
6804 "flake": false,
6805 "locked": {
6806 "lastModified": 1596265691,
6807 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6808 "owner": "NixOS",
6809 "repo": "nixpkgs",
6810 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6811 "type": "github"
6812 },
6813 "original": {
6814 "owner": "NixOS",
6815 "repo": "nixpkgs",
6816 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6817 "type": "github"
6818 }
6819 },
6820 "nixpkgs_93": {
6821 "locked": {
6822 "lastModified": 1597943282,
6823 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6824 "owner": "NixOS",
6825 "repo": "nixpkgs",
6826 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6827 "type": "github"
6828 },
6829 "original": {
6830 "owner": "NixOS",
6831 "repo": "nixpkgs",
6832 "type": "github"
6833 }
6834 },
6835 "nixpkgs_94": {
6836 "locked": {
6837 "lastModified": 1597943282,
6838 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6839 "owner": "NixOS",
6840 "repo": "nixpkgs",
6841 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6842 "type": "github"
6843 },
6844 "original": {
6845 "owner": "NixOS",
6846 "repo": "nixpkgs",
6847 "type": "github"
6848 }
6849 },
6850 "nixpkgs_95": {
6851 "locked": {
6852 "lastModified": 1597943282,
6853 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6854 "owner": "NixOS",
6855 "repo": "nixpkgs",
6856 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6857 "type": "github"
6858 },
6859 "original": {
6860 "owner": "NixOS",
6861 "repo": "nixpkgs",
6862 "type": "github"
6863 }
6864 },
6865 "nixpkgs_96": {
6866 "locked": {
6867 "lastModified": 1597943282,
6868 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6869 "owner": "NixOS",
6870 "repo": "nixpkgs",
6871 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6872 "type": "github"
6873 },
6874 "original": {
6875 "owner": "NixOS",
6876 "repo": "nixpkgs",
6877 "type": "github"
6878 }
6879 },
6880 "nixpkgs_97": {
6881 "locked": {
6882 "lastModified": 1631570365,
6883 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
6884 "owner": "NixOS",
6885 "repo": "nixpkgs",
6886 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
6887 "type": "github"
6888 },
6889 "original": {
6890 "owner": "NixOS",
6891 "repo": "nixpkgs",
6892 "type": "github"
6893 }
6894 },
6895 "nixpkgs_98": {
6896 "locked": {
6897 "lastModified": 1611097871,
6898 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
6899 "owner": "NixOS",
6900 "repo": "nixpkgs",
6901 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
6902 "type": "github"
6903 },
6904 "original": {
6905 "owner": "NixOS",
6906 "repo": "nixpkgs",
6907 "type": "github"
6908 }
6909 },
6910 "nixpkgs_99": {
6911 "locked": {
6912 "lastModified": 1611097871,
6913 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
6914 "owner": "NixOS",
6915 "repo": "nixpkgs",
6916 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
6917 "type": "github"
6918 },
6919 "original": {
6920 "owner": "NixOS",
6921 "repo": "nixpkgs",
6922 "type": "github"
6923 }
6924 },
6925 "openarc": {
6926 "inputs": {
6927 "flake-utils": "flake-utils",
6928 "myuids": "myuids",
6929 "nixpkgs": "nixpkgs_2",
6930 "openarc": "openarc_2"
6931 },
6932 "locked": {
6933 "lastModified": 1,
6934 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
6935 "path": "../../openarc",
6936 "type": "path"
6937 },
6938 "original": {
6939 "path": "../../openarc",
6940 "type": "path"
6941 }
6942 },
6943 "openarc_10": {
6944 "flake": false,
6945 "locked": {
6946 "lastModified": 1537545083,
6947 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6948 "owner": "trusteddomainproject",
6949 "repo": "OpenARC",
6950 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6951 "type": "github"
6952 },
6953 "original": {
6954 "owner": "trusteddomainproject",
6955 "repo": "OpenARC",
6956 "type": "github"
6957 }
6958 },
6959 "openarc_11": {
6960 "flake": false,
6961 "locked": {
6962 "lastModified": 1537545083,
6963 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6964 "owner": "trusteddomainproject",
6965 "repo": "OpenARC",
6966 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6967 "type": "github"
6968 },
6969 "original": {
6970 "owner": "trusteddomainproject",
6971 "repo": "OpenARC",
6972 "type": "github"
6973 }
6974 },
6975 "openarc_12": {
6976 "inputs": {
6977 "flake-utils": "flake-utils_53",
6978 "myuids": "myuids_36",
6979 "nixpkgs": "nixpkgs_93",
6980 "openarc": "openarc_13"
6981 },
6982 "locked": {
6983 "lastModified": 1,
6984 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
6985 "path": "../../openarc",
6986 "type": "path"
6987 },
6988 "original": {
6989 "path": "../../openarc",
6990 "type": "path"
6991 }
6992 },
6993 "openarc_13": {
6994 "flake": false,
6995 "locked": {
6996 "lastModified": 1537545083,
6997 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6998 "owner": "trusteddomainproject",
6999 "repo": "OpenARC",
7000 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
7001 "type": "github"
7002 },
7003 "original": {
7004 "owner": "trusteddomainproject",
7005 "repo": "OpenARC",
7006 "type": "github"
7007 }
7008 },
7009 "openarc_14": {
7010 "inputs": {
7011 "flake-utils": "flake-utils_55",
7012 "myuids": "myuids_38",
7013 "nixpkgs": "nixpkgs_95",
7014 "openarc": "openarc_15"
7015 },
7016 "locked": {
7017 "lastModified": 1,
7018 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
7019 "path": "../../openarc",
7020 "type": "path"
7021 },
7022 "original": {
7023 "path": "../../openarc",
7024 "type": "path"
7025 }
7026 },
7027 "openarc_15": {
7028 "flake": false,
7029 "locked": {
7030 "lastModified": 1537545083,
7031 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
7032 "owner": "trusteddomainproject",
7033 "repo": "OpenARC",
7034 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
7035 "type": "github"
7036 },
7037 "original": {
7038 "owner": "trusteddomainproject",
7039 "repo": "OpenARC",
7040 "type": "github"
7041 }
7042 },
7043 "openarc_2": {
7044 "flake": false,
7045 "locked": {
7046 "lastModified": 1537545083,
7047 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
7048 "owner": "trusteddomainproject",
7049 "repo": "OpenARC",
7050 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
7051 "type": "github"
7052 },
7053 "original": {
7054 "owner": "trusteddomainproject",
7055 "repo": "OpenARC",
7056 "type": "github"
7057 }
7058 },
7059 "openarc_3": {
7060 "inputs": {
7061 "files-watcher": "files-watcher_2",
7062 "openarc": "openarc_4",
7063 "secrets": "secrets_4"
7064 },
7065 "locked": {
7066 "lastModified": 1,
7067 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
7068 "path": "../../flakes/private/openarc",
7069 "type": "path"
7070 },
7071 "original": {
7072 "path": "../../flakes/private/openarc",
7073 "type": "path"
7074 }
7075 },
7076 "openarc_4": {
7077 "inputs": {
7078 "flake-utils": "flake-utils_4",
7079 "myuids": "myuids_4",
7080 "nixpkgs": "nixpkgs_9",
7081 "openarc": "openarc_5"
7082 },
7083 "locked": {
7084 "lastModified": 1,
7085 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
7086 "path": "../../openarc",
7087 "type": "path"
7088 },
7089 "original": {
7090 "path": "../../openarc",
7091 "type": "path"
7092 }
7093 },
7094 "openarc_5": {
7095 "flake": false,
7096 "locked": {
7097 "lastModified": 1537545083,
7098 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
7099 "owner": "trusteddomainproject",
7100 "repo": "OpenARC",
7101 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
7102 "type": "github"
7103 },
7104 "original": {
7105 "owner": "trusteddomainproject",
7106 "repo": "OpenARC",
7107 "type": "github"
7108 }
7109 },
7110 "openarc_6": {
7111 "inputs": {
7112 "flake-utils": "flake-utils_12",
7113 "myuids": "myuids_9",
7114 "nixpkgs": "nixpkgs_26",
7115 "openarc": "openarc_7"
7116 },
7117 "locked": {
7118 "lastModified": 1,
7119 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
7120 "path": "../../openarc",
7121 "type": "path"
7122 },
7123 "original": {
7124 "path": "../../openarc",
7125 "type": "path"
7126 }
7127 },
7128 "openarc_7": {
7129 "flake": false,
7130 "locked": {
7131 "lastModified": 1537545083,
7132 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
7133 "owner": "trusteddomainproject",
7134 "repo": "OpenARC",
7135 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
7136 "type": "github"
7137 },
7138 "original": {
7139 "owner": "trusteddomainproject",
7140 "repo": "OpenARC",
7141 "type": "github"
7142 }
7143 },
7144 "openarc_8": {
7145 "inputs": {
7146 "flake-utils": "flake-utils_14",
7147 "myuids": "myuids_11",
7148 "nixpkgs": "nixpkgs_28",
7149 "openarc": "openarc_9"
7150 },
7151 "locked": {
7152 "lastModified": 1,
7153 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
7154 "path": "../../openarc",
7155 "type": "path"
7156 },
7157 "original": {
7158 "path": "../../openarc",
7159 "type": "path"
7160 }
7161 },
7162 "openarc_9": {
7163 "flake": false,
7164 "locked": {
7165 "lastModified": 1537545083,
7166 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
7167 "owner": "trusteddomainproject",
7168 "repo": "OpenARC",
7169 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
7170 "type": "github"
7171 },
7172 "original": {
7173 "owner": "trusteddomainproject",
7174 "repo": "OpenARC",
7175 "type": "github"
7176 }
7177 },
7178 "opendmarc": {
7179 "inputs": {
7180 "flake-utils": "flake-utils_2",
7181 "myuids": "myuids_2",
7182 "nixpkgs": "nixpkgs_3"
7183 },
7184 "locked": {
7185 "lastModified": 1,
7186 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7187 "path": "../../opendmarc",
7188 "type": "path"
7189 },
7190 "original": {
7191 "path": "../../opendmarc",
7192 "type": "path"
7193 }
7194 },
7195 "opendmarc_2": {
7196 "inputs": {
7197 "environment": "environment_6",
7198 "files-watcher": "files-watcher_3",
7199 "opendmarc": "opendmarc_3",
7200 "secrets": "secrets_5"
7201 },
7202 "locked": {
7203 "lastModified": 1,
7204 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
7205 "path": "../../flakes/private/opendmarc",
7206 "type": "path"
7207 },
7208 "original": {
7209 "path": "../../flakes/private/opendmarc",
7210 "type": "path"
7211 }
7212 },
7213 "opendmarc_3": {
7214 "inputs": {
7215 "flake-utils": "flake-utils_5",
7216 "myuids": "myuids_5",
7217 "nixpkgs": "nixpkgs_10"
7218 },
7219 "locked": {
7220 "lastModified": 1,
7221 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7222 "path": "../../opendmarc",
7223 "type": "path"
7224 },
7225 "original": {
7226 "path": "../../opendmarc",
7227 "type": "path"
7228 }
7229 },
7230 "opendmarc_4": {
7231 "inputs": {
7232 "flake-utils": "flake-utils_13",
7233 "myuids": "myuids_10",
7234 "nixpkgs": "nixpkgs_27"
7235 },
7236 "locked": {
7237 "lastModified": 1,
7238 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7239 "path": "../../opendmarc",
7240 "type": "path"
7241 },
7242 "original": {
7243 "path": "../../opendmarc",
7244 "type": "path"
7245 }
7246 },
7247 "opendmarc_5": {
7248 "inputs": {
7249 "flake-utils": "flake-utils_15",
7250 "myuids": "myuids_12",
7251 "nixpkgs": "nixpkgs_29"
7252 },
7253 "locked": {
7254 "lastModified": 1,
7255 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7256 "path": "../../opendmarc",
7257 "type": "path"
7258 },
7259 "original": {
7260 "path": "../../opendmarc",
7261 "type": "path"
7262 }
7263 },
7264 "opendmarc_6": {
7265 "inputs": {
7266 "flake-utils": "flake-utils_54",
7267 "myuids": "myuids_37",
7268 "nixpkgs": "nixpkgs_94"
7269 },
7270 "locked": {
7271 "lastModified": 1,
7272 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7273 "path": "../../opendmarc",
7274 "type": "path"
7275 },
7276 "original": {
7277 "path": "../../opendmarc",
7278 "type": "path"
7279 }
7280 },
7281 "opendmarc_7": {
7282 "inputs": {
7283 "flake-utils": "flake-utils_56",
7284 "myuids": "myuids_39",
7285 "nixpkgs": "nixpkgs_96"
7286 },
7287 "locked": {
7288 "lastModified": 1,
7289 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7290 "path": "../../opendmarc",
7291 "type": "path"
7292 },
7293 "original": {
7294 "path": "../../opendmarc",
7295 "type": "path"
7296 }
7297 },
7298 "openldap": {
7299 "locked": {
7300 "lastModified": 1,
7301 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
7302 "path": "../../flakes/private/openldap",
7303 "type": "path"
7304 },
7305 "original": {
7306 "path": "../../flakes/private/openldap",
7307 "type": "path"
7308 }
7309 },
7310 "paste": {
7311 "inputs": {
7312 "flake-utils": "flake-utils_16",
7313 "nixpkgs": "nixpkgs_30"
7314 },
7315 "locked": {
7316 "lastModified": 1,
7317 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
7318 "path": "../../paste",
7319 "type": "path"
7320 },
7321 "original": {
7322 "path": "../../paste",
7323 "type": "path"
7324 }
7325 },
7326 "paste_2": {
7327 "inputs": {
7328 "flake-utils": "flake-utils_57",
7329 "nixpkgs": "nixpkgs_97"
7330 },
7331 "locked": {
7332 "lastModified": 1,
7333 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
7334 "path": "../../paste",
7335 "type": "path"
7336 },
7337 "original": {
7338 "path": "../../paste",
7339 "type": "path"
7340 }
7341 },
7342 "peertube": {
7343 "flake": false,
7344 "locked": {
7345 "lastModified": 1611184594,
7346 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
7347 "ref": "gitolite_local/open_instance",
7348 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
7349 "revCount": 6316,
7350 "type": "git",
7351 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
7352 },
7353 "original": {
7354 "owner": "Chocobozzz",
7355 "ref": "v3.0.1",
7356 "repo": "PeerTube",
7357 "type": "github"
7358 }
7359 },
7360 "peertube_2": {
7361 "flake": false,
7362 "locked": {
7363 "lastModified": 1610436329,
7364 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7365 "owner": "Chocobozzz",
7366 "repo": "PeerTube",
7367 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7368 "type": "github"
7369 },
7370 "original": {
7371 "owner": "Chocobozzz",
7372 "ref": "v3.0.1",
7373 "repo": "PeerTube",
7374 "type": "github"
7375 }
7376 },
7377 "peertube_3": {
7378 "flake": false,
7379 "locked": {
7380 "lastModified": 1610436329,
7381 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7382 "owner": "Chocobozzz",
7383 "repo": "PeerTube",
7384 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7385 "type": "github"
7386 },
7387 "original": {
7388 "owner": "Chocobozzz",
7389 "ref": "v3.0.1",
7390 "repo": "PeerTube",
7391 "type": "github"
7392 }
7393 },
7394 "peertube_4": {
7395 "flake": false,
7396 "locked": {
7397 "lastModified": 1610436329,
7398 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7399 "owner": "Chocobozzz",
7400 "repo": "PeerTube",
7401 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7402 "type": "github"
7403 },
7404 "original": {
7405 "owner": "Chocobozzz",
7406 "ref": "v3.0.1",
7407 "repo": "PeerTube",
7408 "type": "github"
7409 }
7410 },
7411 "peertube_5": {
7412 "flake": false,
7413 "locked": {
7414 "lastModified": 1611184594,
7415 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
7416 "ref": "gitolite_local/open_instance",
7417 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
7418 "revCount": 6316,
7419 "type": "git",
7420 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
7421 },
7422 "original": {
7423 "owner": "Chocobozzz",
7424 "ref": "v3.0.1",
7425 "repo": "PeerTube",
7426 "type": "github"
7427 }
7428 },
7429 "peertube_6": {
7430 "flake": false,
7431 "locked": {
7432 "lastModified": 1610436329,
7433 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7434 "owner": "Chocobozzz",
7435 "repo": "PeerTube",
7436 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7437 "type": "github"
7438 },
7439 "original": {
7440 "owner": "Chocobozzz",
7441 "ref": "v3.0.1",
7442 "repo": "PeerTube",
7443 "type": "github"
7444 }
7445 },
7446 "peertube_open_instance": {
7447 "inputs": {
7448 "flake-utils": "flake-utils_17",
7449 "myuids": "myuids_13",
7450 "nixpkgs": "nixpkgs_31",
7451 "peertube": "peertube"
7452 },
7453 "locked": {
7454 "lastModified": 1,
7455 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7456 "path": "./../../peertube",
7457 "type": "path"
7458 },
7459 "original": {
7460 "path": "./../../peertube",
7461 "type": "path"
7462 }
7463 },
7464 "peertube_open_instance_2": {
7465 "inputs": {
7466 "flake-utils": "flake-utils_58",
7467 "myuids": "myuids_40",
7468 "nixpkgs": "nixpkgs_98",
7469 "peertube": "peertube_5"
7470 },
7471 "locked": {
7472 "lastModified": 1,
7473 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7474 "path": "./../../peertube",
7475 "type": "path"
7476 },
7477 "original": {
7478 "path": "./../../peertube",
7479 "type": "path"
7480 }
7481 },
7482 "peertube_origin": {
7483 "inputs": {
7484 "flake-utils": "flake-utils_18",
7485 "myuids": "myuids_14",
7486 "nixpkgs": "nixpkgs_32",
7487 "peertube": "peertube_2"
7488 },
7489 "locked": {
7490 "lastModified": 1,
7491 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7492 "path": "./../../peertube",
7493 "type": "path"
7494 },
7495 "original": {
7496 "path": "./../../peertube",
7497 "type": "path"
7498 }
7499 },
7500 "peertube_origin_2": {
7501 "inputs": {
7502 "flake-utils": "flake-utils_59",
7503 "myuids": "myuids_41",
7504 "nixpkgs": "nixpkgs_99",
7505 "peertube": "peertube_6"
7506 },
7507 "locked": {
7508 "lastModified": 1,
7509 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7510 "path": "./../../peertube",
7511 "type": "path"
7512 },
7513 "original": {
7514 "path": "./../../peertube",
7515 "type": "path"
7516 }
7517 },
7518 "php": {
7519 "inputs": {
7520 "flake-utils": "flake-utils_33",
7521 "nixpkgs": "nixpkgs_56",
7522 "nixpkgs-4": "nixpkgs-4_2"
7523 },
7524 "locked": {
7525 "lastModified": 1,
7526 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
7527 "path": "../../flakes/private/php",
7528 "type": "path"
7529 },
7530 "original": {
7531 "path": "../../flakes/private/php",
7532 "type": "path"
7533 }
7534 },
7535 "php_2": {
7536 "inputs": {
7537 "flake-utils": "flake-utils_36",
7538 "nixpkgs": "nixpkgs_64",
7539 "nixpkgs-4": "nixpkgs-4_3"
7540 },
7541 "locked": {
7542 "lastModified": 1,
7543 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
7544 "path": "../../flakes/private/php",
7545 "type": "path"
7546 },
7547 "original": {
7548 "path": "../../flakes/private/php",
7549 "type": "path"
7550 }
7551 },
7552 "private-buildbot": {
7553 "inputs": {
7554 "buildslist": "buildslist",
7555 "flake-utils": "flake-utils_11",
7556 "nixpkgs": "nixpkgs_25"
7557 },
7558 "locked": {
7559 "lastModified": 1,
7560 "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
7561 "path": "../../flakes/private/buildbot",
7562 "type": "path"
7563 },
7564 "original": {
7565 "path": "../../flakes/private/buildbot",
7566 "type": "path"
7567 }
7568 },
7569 "private-chatons": {
7570 "inputs": {
7571 "environment": "environment_12"
7572 },
7573 "locked": {
7574 "lastModified": 1,
7575 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
7576 "path": "../../flakes/private/chatons",
7577 "type": "path"
7578 },
7579 "original": {
7580 "path": "../../flakes/private/chatons",
7581 "type": "path"
7582 }
7583 },
7584 "private-environment": {
7585 "locked": {
7586 "lastModified": 1,
7587 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7588 "path": "../../flakes/private/environment",
7589 "type": "path"
7590 },
7591 "original": {
7592 "path": "../../flakes/private/environment",
7593 "type": "path"
7594 }
7595 },
7596 "private-environment_2": {
7597 "locked": {
7598 "lastModified": 1,
7599 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7600 "path": "../../flakes/private/environment",
7601 "type": "path"
7602 },
7603 "original": {
7604 "path": "../../flakes/private/environment",
7605 "type": "path"
7606 }
7607 },
7608 "private-milters": {
7609 "inputs": {
7610 "environment": "environment_13",
7611 "files-watcher": "files-watcher_5",
7612 "openarc": "openarc_6",
7613 "opendmarc": "opendmarc_4",
7614 "secrets": "secrets_10"
7615 },
7616 "locked": {
7617 "lastModified": 1,
7618 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
7619 "path": "../../flakes/private/milters",
7620 "type": "path"
7621 },
7622 "original": {
7623 "path": "../../flakes/private/milters",
7624 "type": "path"
7625 }
7626 },
7627 "private-monitoring": {
7628 "inputs": {
7629 "environment": "environment_14",
7630 "naemon": "naemon_3",
7631 "nixpkgs-lib": "nixpkgs-lib_9",
7632 "secrets": "secrets_11"
7633 },
7634 "locked": {
7635 "lastModified": 1,
7636 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
7637 "path": "../../flakes/private/monitoring",
7638 "type": "path"
7639 },
7640 "original": {
7641 "path": "../../flakes/private/monitoring",
7642 "type": "path"
7643 }
7644 },
7645 "private-openarc": {
7646 "inputs": {
7647 "files-watcher": "files-watcher_6",
7648 "openarc": "openarc_8",
7649 "secrets": "secrets_12"
7650 },
7651 "locked": {
7652 "lastModified": 1,
7653 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
7654 "path": "../../flakes/private/openarc",
7655 "type": "path"
7656 },
7657 "original": {
7658 "path": "../../flakes/private/openarc",
7659 "type": "path"
7660 }
7661 },
7662 "private-opendmarc": {
7663 "inputs": {
7664 "environment": "environment_15",
7665 "files-watcher": "files-watcher_7",
7666 "opendmarc": "opendmarc_5",
7667 "secrets": "secrets_13"
7668 },
7669 "locked": {
7670 "lastModified": 1,
7671 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
7672 "path": "../../flakes/private/opendmarc",
7673 "type": "path"
7674 },
7675 "original": {
7676 "path": "../../flakes/private/opendmarc",
7677 "type": "path"
7678 }
7679 },
7680 "private-openldap": {
7681 "locked": {
7682 "lastModified": 1,
7683 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
7684 "path": "../../flakes/private/openldap",
7685 "type": "path"
7686 },
7687 "original": {
7688 "path": "../../flakes/private/openldap",
7689 "type": "path"
7690 }
7691 },
7692 "private-paste": {
7693 "inputs": {
7694 "paste": "paste"
7695 },
7696 "locked": {
7697 "lastModified": 1,
7698 "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
7699 "path": "../../flakes/private/paste",
7700 "type": "path"
7701 },
7702 "original": {
7703 "path": "../../flakes/private/paste",
7704 "type": "path"
7705 }
7706 },
7707 "private-peertube": {
7708 "inputs": {
7709 "peertube_open_instance": "peertube_open_instance",
7710 "peertube_origin": "peertube_origin"
7711 },
7712 "locked": {
7713 "lastModified": 1,
7714 "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
7715 "path": "../../flakes/private/peertube",
7716 "type": "path"
7717 },
7718 "original": {
7719 "path": "../../flakes/private/peertube",
7720 "type": "path"
7721 }
7722 },
7723 "private-php": {
7724 "inputs": {
7725 "flake-utils": "flake-utils_19",
7726 "nixpkgs": "nixpkgs_33",
7727 "nixpkgs-4": "nixpkgs-4"
7728 },
7729 "locked": {
7730 "lastModified": 1,
7731 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
7732 "path": "../../flakes/private/php",
7733 "type": "path"
7734 },
7735 "original": {
7736 "path": "../../flakes/private/php",
7737 "type": "path"
7738 }
7739 },
7740 "private-ssh": {
7741 "inputs": {
7742 "environment": "environment_16",
7743 "secrets": "secrets_14"
7744 },
7745 "locked": {
7746 "lastModified": 1,
7747 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
7748 "path": "../../flakes/private/ssh",
7749 "type": "path"
7750 },
7751 "original": {
7752 "path": "../../flakes/private/ssh",
7753 "type": "path"
7754 }
7755 },
7756 "private-system": {
7757 "inputs": {
7758 "backports": "backports_3",
7759 "environment": "environment_17",
7760 "mypackages": "mypackages_3",
7761 "myuids": "myuids_15",
7762 "secrets-public": "secrets-public_3"
7763 },
7764 "locked": {
7765 "lastModified": 1,
7766 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
7767 "path": "../../flakes/private/system",
7768 "type": "path"
7769 },
7770 "original": {
7771 "path": "../../flakes/private/system",
7772 "type": "path"
7773 }
7774 },
7775 "private-system_2": {
7776 "inputs": {
7777 "backports": "backports_6",
7778 "environment": "environment_26",
7779 "mypackages": "mypackages_9",
7780 "myuids": "myuids_28",
7781 "secrets-public": "secrets-public_6"
7782 },
7783 "locked": {
7784 "lastModified": 1,
7785 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
7786 "path": "../../flakes/private/system",
7787 "type": "path"
7788 },
7789 "original": {
7790 "path": "../../flakes/private/system",
7791 "type": "path"
7792 }
7793 },
7794 "public-copanier": {
7795 "inputs": {
7796 "copanier": "copanier",
7797 "flake-utils": "flake-utils_21",
7798 "nixpkgs": "nixpkgs_36"
7799 },
7800 "locked": {
7801 "lastModified": 1,
7802 "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
7803 "path": "../../flakes/copanier",
7804 "type": "path"
7805 },
7806 "original": {
7807 "path": "../../flakes/copanier",
7808 "type": "path"
7809 }
7810 },
7811 "public-diaspora": {
7812 "inputs": {
7813 "diaspora": "diaspora",
7814 "flake-utils": "flake-utils_22",
7815 "myuids": "myuids_16",
7816 "nixpkgs": "nixpkgs_37"
7817 },
7818 "locked": {
7819 "lastModified": 1,
7820 "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
7821 "path": "../../flakes/diaspora",
7822 "type": "path"
7823 },
7824 "original": {
7825 "path": "../../flakes/diaspora",
7826 "type": "path"
7827 }
7828 },
7829 "public-etherpad-lite": {
7830 "inputs": {
7831 "etherpad-lite": "etherpad-lite",
7832 "flake-utils": "flake-utils_23",
7833 "mypackages": "mypackages_4",
7834 "nixpkgs": "nixpkgs_39"
7835 },
7836 "locked": {
7837 "lastModified": 1,
7838 "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
7839 "path": "../../flakes/etherpad-lite",
7840 "type": "path"
7841 },
7842 "original": {
7843 "path": "../../flakes/etherpad-lite",
7844 "type": "path"
7845 }
7846 },
7847 "public-fiche": {
7848 "locked": {
7849 "lastModified": 1,
7850 "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
7851 "path": "../../flakes/fiche",
7852 "type": "path"
7853 },
7854 "original": {
7855 "path": "../../flakes/fiche",
7856 "type": "path"
7857 }
7858 },
7859 "public-files-watcher": {
7860 "locked": {
7861 "lastModified": 1,
7862 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
7863 "path": "../../flakes/files-watcher",
7864 "type": "path"
7865 },
7866 "original": {
7867 "path": "../../flakes/files-watcher",
7868 "type": "path"
7869 }
7870 },
7871 "public-grocy": {
7872 "inputs": {
7873 "flake-utils": "flake-utils_24",
7874 "grocy": "grocy",
7875 "mypackages": "mypackages_5",
7876 "nixpkgs": "nixpkgs_41"
7877 },
7878 "locked": {
7879 "lastModified": 1,
7880 "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
7881 "path": "../../flakes/grocy",
7882 "type": "path"
7883 },
7884 "original": {
7885 "path": "../../flakes/grocy",
7886 "type": "path"
7887 }
7888 },
7889 "public-loginctl-linger": {
7890 "locked": {
7891 "lastModified": 1,
7892 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
7893 "path": "../../flakes/loginctl-linger",
7894 "type": "path"
7895 },
7896 "original": {
7897 "path": "../../flakes/loginctl-linger",
7898 "type": "path"
7899 }
7900 },
7901 "public-mastodon": {
7902 "inputs": {
7903 "flake-utils": "flake-utils_25",
7904 "mastodon": "mastodon",
7905 "myuids": "myuids_17",
7906 "nixpkgs": "nixpkgs_42"
7907 },
7908 "locked": {
7909 "lastModified": 1,
7910 "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
7911 "path": "../../flakes/mastodon",
7912 "type": "path"
7913 },
7914 "original": {
7915 "path": "../../flakes/mastodon",
7916 "type": "path"
7917 }
7918 },
7919 "public-mediagoblin": {
7920 "inputs": {
7921 "flake-utils": "flake-utils_26",
7922 "mediagoblin": "mediagoblin",
7923 "myuids": "myuids_18",
7924 "nixpkgs": "nixpkgs_43"
7925 },
7926 "locked": {
7927 "lastModified": 1,
7928 "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
7929 "path": "../../flakes/mediagoblin",
7930 "type": "path"
7931 },
7932 "original": {
7933 "path": "../../flakes/mediagoblin",
7934 "type": "path"
7935 }
7936 },
7937 "public-multi-apache-container": {
7938 "inputs": {
7939 "files-watcher": "files-watcher_8",
7940 "myuids": "myuids_19"
7941 },
7942 "locked": {
7943 "lastModified": 1,
7944 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
7945 "path": "../../flakes/multi-apache-container",
7946 "type": "path"
7947 },
7948 "original": {
7949 "path": "../../flakes/multi-apache-container",
7950 "type": "path"
7951 }
7952 },
7953 "public-mypackages": {
7954 "inputs": {
7955 "flake-parts": "flake-parts_10",
7956 "nixpkgs": "nixpkgs_44",
7957 "webapps-ttrss": "webapps-ttrss_6"
7958 },
7959 "locked": {
7960 "lastModified": 1,
7961 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
7962 "path": "../../flakes/mypackages",
7963 "type": "path"
7964 },
7965 "original": {
7966 "path": "../../flakes/mypackages",
7967 "type": "path"
7968 }
7969 },
7970 "public-myuids": {
7971 "locked": {
7972 "lastModified": 1,
7973 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
7974 "path": "../../flakes/myuids",
7975 "type": "path"
7976 },
7977 "original": {
7978 "path": "../../flakes/myuids",
7979 "type": "path"
7980 }
7981 },
7982 "public-openarc": {
7983 "inputs": {
7984 "flake-utils": "flake-utils_27",
7985 "myuids": "myuids_20",
7986 "nixpkgs": "nixpkgs_45",
7987 "openarc": "openarc_10"
7988 },
7989 "locked": {
7990 "lastModified": 1,
7991 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
7992 "path": "../../flakes/openarc",
7993 "type": "path"
7994 },
7995 "original": {
7996 "path": "../../flakes/openarc",
7997 "type": "path"
7998 }
7999 },
8000 "public-opendmarc": {
8001 "inputs": {
8002 "flake-utils": "flake-utils_28",
8003 "myuids": "myuids_21",
8004 "nixpkgs": "nixpkgs_46"
8005 },
8006 "locked": {
8007 "lastModified": 1,
8008 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
8009 "path": "../../flakes/opendmarc",
8010 "type": "path"
8011 },
8012 "original": {
8013 "path": "../../flakes/opendmarc",
8014 "type": "path"
8015 }
8016 },
8017 "public-peertube": {
8018 "inputs": {
8019 "flake-utils": "flake-utils_29",
8020 "myuids": "myuids_22",
8021 "nixpkgs": "nixpkgs_47",
8022 "peertube": "peertube_3"
8023 },
8024 "locked": {
8025 "lastModified": 1,
8026 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
8027 "path": "../../flakes/peertube",
8028 "type": "path"
8029 },
8030 "original": {
8031 "path": "../../flakes/peertube",
8032 "type": "path"
8033 }
8034 },
8035 "public-secrets": {
8036 "locked": {
8037 "lastModified": 1,
8038 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8039 "path": "../../flakes/secrets",
8040 "type": "path"
8041 },
8042 "original": {
8043 "path": "../../flakes/secrets",
8044 "type": "path"
8045 }
8046 },
8047 "public-secrets_2": {
8048 "locked": {
8049 "lastModified": 1,
8050 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8051 "path": "../../flakes/secrets",
8052 "type": "path"
8053 },
8054 "original": {
8055 "path": "../../flakes/secrets",
8056 "type": "path"
8057 }
8058 },
8059 "public-surfer": {
8060 "inputs": {
8061 "flake-utils": "flake-utils_30",
8062 "mypackages": "mypackages_6",
8063 "nixpkgs": "nixpkgs_49",
8064 "surfer": "surfer"
8065 },
8066 "locked": {
8067 "lastModified": 1,
8068 "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
8069 "path": "../../flakes/surfer",
8070 "type": "path"
8071 },
8072 "original": {
8073 "path": "../../flakes/surfer",
8074 "type": "path"
8075 }
8076 },
8077 "public-taskwarrior-web": {
8078 "inputs": {
8079 "flake-utils": "flake-utils_31",
8080 "nixpkgs": "nixpkgs_50",
8081 "taskwarrior-web": "taskwarrior-web"
8082 },
8083 "locked": {
8084 "lastModified": 1,
8085 "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
8086 "path": "../../flakes/taskwarrior-web",
8087 "type": "path"
8088 },
8089 "original": {
8090 "path": "../../flakes/taskwarrior-web",
8091 "type": "path"
8092 }
8093 },
8094 "root": {
8095 "inputs": {
8096 "devshell": "devshell",
8097 "flake-parts": "flake-parts",
8098 "flakes": "flakes",
8099 "nixpkgs": "nixpkgs_106"
8100 }
8101 },
8102 "rsync_backup": {
8103 "locked": {
8104 "lastModified": 1,
8105 "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
8106 "path": "../../flakes/rsync_backup",
8107 "type": "path"
8108 },
8109 "original": {
8110 "path": "../../flakes/rsync_backup",
8111 "type": "path"
8112 }
8113 },
8114 "s-backports": {
8115 "inputs": {
8116 "flake-utils": "flake-utils_40",
8117 "nixpkgs": "nixpkgs_74"
8118 },
8119 "locked": {
8120 "lastModified": 1,
8121 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
8122 "path": "./backports",
8123 "type": "path"
8124 },
8125 "original": {
8126 "path": "./backports",
8127 "type": "path"
8128 }
8129 },
8130 "s-copanier": {
8131 "inputs": {
8132 "copanier": "copanier_2",
8133 "flake-utils": "flake-utils_41",
8134 "nixpkgs": "nixpkgs_75"
8135 },
8136 "locked": {
8137 "lastModified": 1,
8138 "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
8139 "path": "./copanier",
8140 "type": "path"
8141 },
8142 "original": {
8143 "path": "./copanier",
8144 "type": "path"
8145 }
8146 },
8147 "s-diaspora": {
8148 "inputs": {
8149 "diaspora": "diaspora_2",
8150 "flake-utils": "flake-utils_42",
8151 "myuids": "myuids_29",
8152 "nixpkgs": "nixpkgs_76"
8153 },
8154 "locked": {
8155 "lastModified": 1,
8156 "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
8157 "path": "./diaspora",
8158 "type": "path"
8159 },
8160 "original": {
8161 "path": "./diaspora",
8162 "type": "path"
8163 }
8164 },
8165 "s-etherpad-lite": {
8166 "inputs": {
8167 "etherpad-lite": "etherpad-lite_2",
8168 "flake-utils": "flake-utils_43",
8169 "mypackages": "mypackages_10",
8170 "nixpkgs": "nixpkgs_78"
8171 },
8172 "locked": {
8173 "lastModified": 1,
8174 "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
8175 "path": "./etherpad-lite",
8176 "type": "path"
8177 },
8178 "original": {
8179 "path": "./etherpad-lite",
8180 "type": "path"
8181 }
8182 },
8183 "s-fiche": {
8184 "locked": {
8185 "lastModified": 1,
8186 "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
8187 "path": "./fiche",
8188 "type": "path"
8189 },
8190 "original": {
8191 "path": "./fiche",
8192 "type": "path"
8193 }
8194 },
8195 "s-files-watcher": {
8196 "locked": {
8197 "lastModified": 1,
8198 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
8199 "path": "./files-watcher",
8200 "type": "path"
8201 },
8202 "original": {
8203 "path": "./files-watcher",
8204 "type": "path"
8205 }
8206 },
8207 "s-grocy": {
8208 "inputs": {
8209 "flake-utils": "flake-utils_44",
8210 "grocy": "grocy_2",
8211 "mypackages": "mypackages_11",
8212 "nixpkgs": "nixpkgs_80"
8213 },
8214 "locked": {
8215 "lastModified": 1,
8216 "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
8217 "path": "./grocy",
8218 "type": "path"
8219 },
8220 "original": {
8221 "path": "./grocy",
8222 "type": "path"
8223 }
8224 },
8225 "s-lib": {
8226 "inputs": {
8227 "colmena": "colmena_7",
8228 "disko": "disko_7",
8229 "flake-parts": "flake-parts_20",
8230 "nixos-anywhere": "nixos-anywhere_7",
8231 "nixpkgs": "nixpkgs_84"
8232 },
8233 "locked": {
8234 "lastModified": 1,
8235 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
8236 "path": "./lib",
8237 "type": "path"
8238 },
8239 "original": {
8240 "path": "./lib",
8241 "type": "path"
8242 }
8243 },
8244 "s-loginctl-linger": {
8245 "locked": {
8246 "lastModified": 1,
8247 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
8248 "path": "./loginctl-linger",
8249 "type": "path"
8250 },
8251 "original": {
8252 "path": "./loginctl-linger",
8253 "type": "path"
8254 }
8255 },
8256 "s-mastodon": {
8257 "inputs": {
8258 "flake-utils": "flake-utils_46",
8259 "mastodon": "mastodon_2",
8260 "myuids": "myuids_30",
8261 "nixpkgs": "nixpkgs_85"
8262 },
8263 "locked": {
8264 "lastModified": 1,
8265 "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
8266 "path": "./mastodon",
8267 "type": "path"
8268 },
8269 "original": {
8270 "path": "./mastodon",
8271 "type": "path"
8272 }
8273 },
8274 "s-mediagoblin": {
8275 "inputs": {
8276 "flake-utils": "flake-utils_47",
8277 "mediagoblin": "mediagoblin_2",
8278 "myuids": "myuids_31",
8279 "nixpkgs": "nixpkgs_86"
8280 },
8281 "locked": {
8282 "lastModified": 1,
8283 "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
8284 "path": "./mediagoblin",
8285 "type": "path"
8286 },
8287 "original": {
8288 "path": "./mediagoblin",
8289 "type": "path"
8290 }
8291 },
8292 "s-multi-apache-container": {
8293 "inputs": {
8294 "files-watcher": "files-watcher_12",
8295 "myuids": "myuids_32"
8296 },
8297 "locked": {
8298 "lastModified": 1,
8299 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
8300 "path": "./multi-apache-container",
8301 "type": "path"
8302 },
8303 "original": {
8304 "path": "./multi-apache-container",
8305 "type": "path"
8306 }
8307 },
8308 "s-mypackages": {
8309 "inputs": {
8310 "flake-parts": "flake-parts_21",
8311 "nixpkgs": "nixpkgs_87",
8312 "webapps-ttrss": "webapps-ttrss_13"
8313 },
8314 "locked": {
8315 "lastModified": 1,
8316 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
8317 "path": "./mypackages",
8318 "type": "path"
8319 },
8320 "original": {
8321 "path": "./mypackages",
8322 "type": "path"
8323 }
8324 },
8325 "s-myuids": {
8326 "locked": {
8327 "lastModified": 1,
8328 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
8329 "path": "./myuids",
8330 "type": "path"
8331 },
8332 "original": {
8333 "path": "./myuids",
8334 "type": "path"
8335 }
8336 },
8337 "s-naemon": {
8338 "locked": {
8339 "lastModified": 1,
8340 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
8341 "path": "./naemon",
8342 "type": "path"
8343 },
8344 "original": {
8345 "path": "./naemon",
8346 "type": "path"
8347 }
8348 },
8349 "s-openarc": {
8350 "inputs": {
8351 "flake-utils": "flake-utils_48",
8352 "myuids": "myuids_33",
8353 "nixpkgs": "nixpkgs_88",
8354 "openarc": "openarc_11"
8355 },
8356 "locked": {
8357 "lastModified": 1,
8358 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
8359 "path": "./openarc",
8360 "type": "path"
8361 },
8362 "original": {
8363 "path": "./openarc",
8364 "type": "path"
8365 }
8366 },
8367 "s-opendmarc": {
8368 "inputs": {
8369 "flake-utils": "flake-utils_49",
8370 "myuids": "myuids_34",
8371 "nixpkgs": "nixpkgs_89"
8372 },
8373 "locked": {
8374 "lastModified": 1,
8375 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
8376 "path": "./opendmarc",
8377 "type": "path"
8378 },
8379 "original": {
8380 "path": "./opendmarc",
8381 "type": "path"
8382 }
8383 },
8384 "s-paste": {
8385 "inputs": {
8386 "flake-utils": "flake-utils_50",
8387 "nixpkgs": "nixpkgs_90"
8388 },
8389 "locked": {
8390 "lastModified": 1,
8391 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
8392 "path": "./paste",
8393 "type": "path"
8394 },
8395 "original": {
8396 "path": "./paste",
8397 "type": "path"
8398 }
8399 },
8400 "s-peertube": {
8401 "inputs": {
8402 "flake-utils": "flake-utils_51",
8403 "myuids": "myuids_35",
8404 "nixpkgs": "nixpkgs_91",
8405 "peertube": "peertube_4"
8406 },
8407 "locked": {
8408 "lastModified": 1,
8409 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
8410 "path": "./peertube",
8411 "type": "path"
8412 },
8413 "original": {
8414 "path": "./peertube",
8415 "type": "path"
8416 }
8417 },
8418 "s-private-buildbot": {
8419 "inputs": {
8420 "buildslist": "buildslist_2",
8421 "flake-utils": "flake-utils_52",
8422 "nixpkgs": "nixpkgs_92"
8423 },
8424 "locked": {
8425 "lastModified": 1,
8426 "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
8427 "path": "./private/buildbot",
8428 "type": "path"
8429 },
8430 "original": {
8431 "path": "./private/buildbot",
8432 "type": "path"
8433 }
8434 },
8435 "s-private-chatons": {
8436 "inputs": {
8437 "environment": "environment_27"
8438 },
8439 "locked": {
8440 "lastModified": 1,
8441 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
8442 "path": "./private/chatons",
8443 "type": "path"
8444 },
8445 "original": {
8446 "path": "./private/chatons",
8447 "type": "path"
8448 }
8449 },
8450 "s-private-environment": {
8451 "locked": {
8452 "lastModified": 1,
8453 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
8454 "path": "./private/environment",
8455 "type": "path"
8456 },
8457 "original": {
8458 "path": "./private/environment",
8459 "type": "path"
8460 }
8461 },
8462 "s-private-mail-relay": {
8463 "inputs": {
8464 "environment": "environment_28",
8465 "secrets": "secrets_20"
8466 },
8467 "locked": {
8468 "lastModified": 1,
8469 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
8470 "path": "./private/mail-relay",
8471 "type": "path"
8472 },
8473 "original": {
8474 "path": "./private/mail-relay",
8475 "type": "path"
8476 }
8477 },
8478 "s-private-milters": {
8479 "inputs": {
8480 "environment": "environment_29",
8481 "files-watcher": "files-watcher_13",
8482 "openarc": "openarc_12",
8483 "opendmarc": "opendmarc_6",
8484 "secrets": "secrets_21"
8485 },
8486 "locked": {
8487 "lastModified": 1,
8488 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
8489 "path": "./private/milters",
8490 "type": "path"
8491 },
8492 "original": {
8493 "path": "./private/milters",
8494 "type": "path"
8495 }
8496 },
8497 "s-private-monitoring": {
8498 "inputs": {
8499 "environment": "environment_30",
8500 "naemon": "naemon_6",
8501 "nixpkgs-lib": "nixpkgs-lib_27",
8502 "secrets": "secrets_22"
8503 },
8504 "locked": {
8505 "lastModified": 1,
8506 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
8507 "path": "./private/monitoring",
8508 "type": "path"
8509 },
8510 "original": {
8511 "path": "./private/monitoring",
8512 "type": "path"
8513 }
8514 },
8515 "s-private-openarc": {
8516 "inputs": {
8517 "files-watcher": "files-watcher_14",
8518 "openarc": "openarc_14",
8519 "secrets": "secrets_23"
8520 },
8521 "locked": {
8522 "lastModified": 1,
8523 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
8524 "path": "./private/openarc",
8525 "type": "path"
8526 },
8527 "original": {
8528 "path": "./private/openarc",
8529 "type": "path"
8530 }
8531 },
8532 "s-private-opendmarc": {
8533 "inputs": {
8534 "environment": "environment_31",
8535 "files-watcher": "files-watcher_15",
8536 "opendmarc": "opendmarc_7",
8537 "secrets": "secrets_24"
8538 },
8539 "locked": {
8540 "lastModified": 1,
8541 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
8542 "path": "./private/opendmarc",
8543 "type": "path"
8544 },
8545 "original": {
8546 "path": "./private/opendmarc",
8547 "type": "path"
8548 }
8549 },
8550 "s-private-openldap": {
8551 "locked": {
8552 "lastModified": 1,
8553 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
8554 "path": "./private/openldap",
8555 "type": "path"
8556 },
8557 "original": {
8558 "path": "./private/openldap",
8559 "type": "path"
8560 }
8561 },
8562 "s-private-paste": {
8563 "inputs": {
8564 "paste": "paste_2"
8565 },
8566 "locked": {
8567 "lastModified": 1,
8568 "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
8569 "path": "./private/paste",
8570 "type": "path"
8571 },
8572 "original": {
8573 "path": "./private/paste",
8574 "type": "path"
8575 }
8576 },
8577 "s-private-peertube": {
8578 "inputs": {
8579 "peertube_open_instance": "peertube_open_instance_2",
8580 "peertube_origin": "peertube_origin_2"
8581 },
8582 "locked": {
8583 "lastModified": 1,
8584 "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
8585 "path": "./private/peertube",
8586 "type": "path"
8587 },
8588 "original": {
8589 "path": "./private/peertube",
8590 "type": "path"
8591 }
8592 },
8593 "s-private-php": {
8594 "inputs": {
8595 "flake-utils": "flake-utils_60",
8596 "nixpkgs": "nixpkgs_100",
8597 "nixpkgs-4": "nixpkgs-4_4"
8598 },
8599 "locked": {
8600 "lastModified": 1,
8601 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
8602 "path": "./private/php",
8603 "type": "path"
8604 },
8605 "original": {
8606 "path": "./private/php",
8607 "type": "path"
8608 }
8609 },
8610 "s-private-ssh": {
8611 "inputs": {
8612 "environment": "environment_32",
8613 "secrets": "secrets_25"
8614 },
8615 "locked": {
8616 "lastModified": 1,
8617 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
8618 "path": "./private/ssh",
8619 "type": "path"
8620 },
8621 "original": {
8622 "path": "./private/ssh",
8623 "type": "path"
8624 }
8625 },
8626 "s-private-system": {
8627 "inputs": {
8628 "backports": "backports_7",
8629 "environment": "environment_33",
8630 "mypackages": "mypackages_12",
8631 "myuids": "myuids_42",
8632 "secrets-public": "secrets-public_7"
8633 },
8634 "locked": {
8635 "lastModified": 1,
8636 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
8637 "path": "./private/system",
8638 "type": "path"
8639 },
8640 "original": {
8641 "path": "./private/system",
8642 "type": "path"
8643 }
8644 },
8645 "s-rsync_backup": {
8646 "locked": {
8647 "lastModified": 1,
8648 "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
8649 "path": "./rsync_backup",
8650 "type": "path"
8651 },
8652 "original": {
8653 "path": "./rsync_backup",
8654 "type": "path"
8655 }
8656 },
8657 "s-secrets": {
8658 "locked": {
8659 "lastModified": 1,
8660 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8661 "path": "./secrets",
8662 "type": "path"
8663 },
8664 "original": {
8665 "path": "./secrets",
8666 "type": "path"
8667 }
8668 },
8669 "s-surfer": {
8670 "inputs": {
8671 "flake-utils": "flake-utils_62",
8672 "mypackages": "mypackages_13",
8673 "nixpkgs": "nixpkgs_104",
8674 "surfer": "surfer_2"
8675 },
8676 "locked": {
8677 "lastModified": 1,
8678 "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
8679 "path": "./surfer",
8680 "type": "path"
8681 },
8682 "original": {
8683 "path": "./surfer",
8684 "type": "path"
8685 }
8686 },
8687 "s-taskwarrior-web": {
8688 "inputs": {
8689 "flake-utils": "flake-utils_63",
8690 "nixpkgs": "nixpkgs_105",
8691 "taskwarrior-web": "taskwarrior-web_2"
8692 },
8693 "locked": {
8694 "lastModified": 1,
8695 "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
8696 "path": "./taskwarrior-web",
8697 "type": "path"
8698 },
8699 "original": {
8700 "path": "./taskwarrior-web",
8701 "type": "path"
8702 }
8703 },
8704 "secrets": {
8705 "locked": {
8706 "lastModified": 1,
8707 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8708 "path": "../../secrets",
8709 "type": "path"
8710 },
8711 "original": {
8712 "path": "../../secrets",
8713 "type": "path"
8714 }
8715 },
8716 "secrets-public": {
8717 "locked": {
8718 "lastModified": 1,
8719 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8720 "path": "../../secrets",
8721 "type": "path"
8722 },
8723 "original": {
8724 "path": "../../secrets",
8725 "type": "path"
8726 }
8727 },
8728 "secrets-public_2": {
8729 "locked": {
8730 "lastModified": 1,
8731 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8732 "path": "../../secrets",
8733 "type": "path"
8734 },
8735 "original": {
8736 "path": "../../secrets",
8737 "type": "path"
8738 }
8739 },
8740 "secrets-public_3": {
8741 "locked": {
8742 "lastModified": 1,
8743 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8744 "path": "../../secrets",
8745 "type": "path"
8746 },
8747 "original": {
8748 "path": "../../secrets",
8749 "type": "path"
8750 }
8751 },
8752 "secrets-public_4": {
8753 "locked": {
8754 "lastModified": 1,
8755 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8756 "path": "../../secrets",
8757 "type": "path"
8758 },
8759 "original": {
8760 "path": "../../secrets",
8761 "type": "path"
8762 }
8763 },
8764 "secrets-public_5": {
8765 "locked": {
8766 "lastModified": 1,
8767 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8768 "path": "../../secrets",
8769 "type": "path"
8770 },
8771 "original": {
8772 "path": "../../secrets",
8773 "type": "path"
8774 }
8775 },
8776 "secrets-public_6": {
8777 "locked": {
8778 "lastModified": 1,
8779 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8780 "path": "../../secrets",
8781 "type": "path"
8782 },
8783 "original": {
8784 "path": "../../secrets",
8785 "type": "path"
8786 }
8787 },
8788 "secrets-public_7": {
8789 "locked": {
8790 "lastModified": 1,
8791 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8792 "path": "../../secrets",
8793 "type": "path"
8794 },
8795 "original": {
8796 "path": "../../secrets",
8797 "type": "path"
8798 }
8799 },
8800 "secrets_10": {
8801 "locked": {
8802 "lastModified": 1,
8803 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8804 "path": "../../secrets",
8805 "type": "path"
8806 },
8807 "original": {
8808 "path": "../../secrets",
8809 "type": "path"
8810 }
8811 },
8812 "secrets_11": {
8813 "locked": {
8814 "lastModified": 1,
8815 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8816 "path": "../../secrets",
8817 "type": "path"
8818 },
8819 "original": {
8820 "path": "../../secrets",
8821 "type": "path"
8822 }
8823 },
8824 "secrets_12": {
8825 "locked": {
8826 "lastModified": 1,
8827 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8828 "path": "../../secrets",
8829 "type": "path"
8830 },
8831 "original": {
8832 "path": "../../secrets",
8833 "type": "path"
8834 }
8835 },
8836 "secrets_13": {
8837 "locked": {
8838 "lastModified": 1,
8839 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8840 "path": "../../secrets",
8841 "type": "path"
8842 },
8843 "original": {
8844 "path": "../../secrets",
8845 "type": "path"
8846 }
8847 },
8848 "secrets_14": {
8849 "locked": {
8850 "lastModified": 1,
8851 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8852 "path": "../../secrets",
8853 "type": "path"
8854 },
8855 "original": {
8856 "path": "../../secrets",
8857 "type": "path"
8858 }
8859 },
8860 "secrets_15": {
8861 "locked": {
8862 "lastModified": 1,
8863 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8864 "path": "../../secrets",
8865 "type": "path"
8866 },
8867 "original": {
8868 "path": "../../secrets",
8869 "type": "path"
8870 }
8871 },
8872 "secrets_16": {
8873 "locked": {
8874 "lastModified": 1,
8875 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8876 "path": "../../secrets",
8877 "type": "path"
8878 },
8879 "original": {
8880 "path": "../../secrets",
8881 "type": "path"
8882 }
8883 },
8884 "secrets_17": {
8885 "locked": {
8886 "lastModified": 1,
8887 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8888 "path": "../../flakes/secrets",
8889 "type": "path"
8890 },
8891 "original": {
8892 "path": "../../flakes/secrets",
8893 "type": "path"
8894 }
8895 },
8896 "secrets_18": {
8897 "locked": {
8898 "lastModified": 1,
8899 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8900 "path": "../../secrets",
8901 "type": "path"
8902 },
8903 "original": {
8904 "path": "../../secrets",
8905 "type": "path"
8906 }
8907 },
8908 "secrets_19": {
8909 "locked": {
8910 "lastModified": 1,
8911 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8912 "path": "../../flakes/secrets",
8913 "type": "path"
8914 },
8915 "original": {
8916 "path": "../../flakes/secrets",
8917 "type": "path"
8918 }
8919 },
8920 "secrets_2": {
8921 "locked": {
8922 "lastModified": 1,
8923 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8924 "path": "../../secrets",
8925 "type": "path"
8926 },
8927 "original": {
8928 "path": "../../secrets",
8929 "type": "path"
8930 }
8931 },
8932 "secrets_20": {
8933 "locked": {
8934 "lastModified": 1,
8935 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8936 "path": "../../secrets",
8937 "type": "path"
8938 },
8939 "original": {
8940 "path": "../../secrets",
8941 "type": "path"
8942 }
8943 },
8944 "secrets_21": {
8945 "locked": {
8946 "lastModified": 1,
8947 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8948 "path": "../../secrets",
8949 "type": "path"
8950 },
8951 "original": {
8952 "path": "../../secrets",
8953 "type": "path"
8954 }
8955 },
8956 "secrets_22": {
8957 "locked": {
8958 "lastModified": 1,
8959 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8960 "path": "../../secrets",
8961 "type": "path"
8962 },
8963 "original": {
8964 "path": "../../secrets",
8965 "type": "path"
8966 }
8967 },
8968 "secrets_23": {
8969 "locked": {
8970 "lastModified": 1,
8971 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8972 "path": "../../secrets",
8973 "type": "path"
8974 },
8975 "original": {
8976 "path": "../../secrets",
8977 "type": "path"
8978 }
8979 },
8980 "secrets_24": {
8981 "locked": {
8982 "lastModified": 1,
8983 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8984 "path": "../../secrets",
8985 "type": "path"
8986 },
8987 "original": {
8988 "path": "../../secrets",
8989 "type": "path"
8990 }
8991 },
8992 "secrets_25": {
8993 "locked": {
8994 "lastModified": 1,
8995 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8996 "path": "../../secrets",
8997 "type": "path"
8998 },
8999 "original": {
9000 "path": "../../secrets",
9001 "type": "path"
9002 }
9003 },
9004 "secrets_26": {
9005 "locked": {
9006 "lastModified": 1,
9007 "narHash": "sha256-yvhc2jxW1AQVmtrKPoYPr5DgpXKt/ua+ATuxvE3iY6c=",
9008 "path": "./private/environment-dummy",
9009 "type": "path"
9010 },
9011 "original": {
9012 "path": "./private/environment-dummy",
9013 "type": "path"
9014 }
9015 },
9016 "secrets_3": {
9017 "locked": {
9018 "lastModified": 1,
9019 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9020 "path": "../../secrets",
9021 "type": "path"
9022 },
9023 "original": {
9024 "path": "../../secrets",
9025 "type": "path"
9026 }
9027 },
9028 "secrets_4": {
9029 "locked": {
9030 "lastModified": 1,
9031 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9032 "path": "../../secrets",
9033 "type": "path"
9034 },
9035 "original": {
9036 "path": "../../secrets",
9037 "type": "path"
9038 }
9039 },
9040 "secrets_5": {
9041 "locked": {
9042 "lastModified": 1,
9043 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9044 "path": "../../secrets",
9045 "type": "path"
9046 },
9047 "original": {
9048 "path": "../../secrets",
9049 "type": "path"
9050 }
9051 },
9052 "secrets_6": {
9053 "locked": {
9054 "lastModified": 1,
9055 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9056 "path": "../../flakes/secrets",
9057 "type": "path"
9058 },
9059 "original": {
9060 "path": "../../flakes/secrets",
9061 "type": "path"
9062 }
9063 },
9064 "secrets_7": {
9065 "locked": {
9066 "lastModified": 1,
9067 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9068 "path": "../../secrets",
9069 "type": "path"
9070 },
9071 "original": {
9072 "path": "../../secrets",
9073 "type": "path"
9074 }
9075 },
9076 "secrets_8": {
9077 "locked": {
9078 "lastModified": 1,
9079 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9080 "path": "../../flakes/secrets",
9081 "type": "path"
9082 },
9083 "original": {
9084 "path": "../../flakes/secrets",
9085 "type": "path"
9086 }
9087 },
9088 "secrets_9": {
9089 "locked": {
9090 "lastModified": 1,
9091 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
9092 "path": "../../secrets",
9093 "type": "path"
9094 },
9095 "original": {
9096 "path": "../../secrets",
9097 "type": "path"
9098 }
9099 },
9100 "ssh": {
9101 "inputs": {
9102 "environment": "environment_10",
9103 "secrets": "secrets_9"
9104 },
9105 "locked": {
9106 "lastModified": 1,
9107 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
9108 "path": "../../flakes/private/ssh",
9109 "type": "path"
9110 },
9111 "original": {
9112 "path": "../../flakes/private/ssh",
9113 "type": "path"
9114 }
9115 },
9116 "stable": {
9117 "locked": {
9118 "lastModified": 1669735802,
9119 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9120 "owner": "NixOS",
9121 "repo": "nixpkgs",
9122 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9123 "type": "github"
9124 },
9125 "original": {
9126 "owner": "NixOS",
9127 "ref": "nixos-22.11",
9128 "repo": "nixpkgs",
9129 "type": "github"
9130 }
9131 },
9132 "stable_2": {
9133 "locked": {
9134 "lastModified": 1669735802,
9135 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9136 "owner": "NixOS",
9137 "repo": "nixpkgs",
9138 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9139 "type": "github"
9140 },
9141 "original": {
9142 "owner": "NixOS",
9143 "ref": "nixos-22.11",
9144 "repo": "nixpkgs",
9145 "type": "github"
9146 }
9147 },
9148 "stable_3": {
9149 "locked": {
9150 "lastModified": 1669735802,
9151 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9152 "owner": "NixOS",
9153 "repo": "nixpkgs",
9154 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9155 "type": "github"
9156 },
9157 "original": {
9158 "owner": "NixOS",
9159 "ref": "nixos-22.11",
9160 "repo": "nixpkgs",
9161 "type": "github"
9162 }
9163 },
9164 "stable_4": {
9165 "locked": {
9166 "lastModified": 1669735802,
9167 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9168 "owner": "NixOS",
9169 "repo": "nixpkgs",
9170 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9171 "type": "github"
9172 },
9173 "original": {
9174 "owner": "NixOS",
9175 "ref": "nixos-22.11",
9176 "repo": "nixpkgs",
9177 "type": "github"
9178 }
9179 },
9180 "stable_5": {
9181 "locked": {
9182 "lastModified": 1669735802,
9183 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9184 "owner": "NixOS",
9185 "repo": "nixpkgs",
9186 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9187 "type": "github"
9188 },
9189 "original": {
9190 "owner": "NixOS",
9191 "ref": "nixos-22.11",
9192 "repo": "nixpkgs",
9193 "type": "github"
9194 }
9195 },
9196 "stable_6": {
9197 "locked": {
9198 "lastModified": 1669735802,
9199 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9200 "owner": "NixOS",
9201 "repo": "nixpkgs",
9202 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9203 "type": "github"
9204 },
9205 "original": {
9206 "owner": "NixOS",
9207 "ref": "nixos-22.11",
9208 "repo": "nixpkgs",
9209 "type": "github"
9210 }
9211 },
9212 "stable_7": {
9213 "locked": {
9214 "lastModified": 1669735802,
9215 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9216 "owner": "NixOS",
9217 "repo": "nixpkgs",
9218 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9219 "type": "github"
9220 },
9221 "original": {
9222 "owner": "NixOS",
9223 "ref": "nixos-22.11",
9224 "repo": "nixpkgs",
9225 "type": "github"
9226 }
9227 },
9228 "surfer": {
9229 "flake": false,
9230 "locked": {
9231 "lastModified": 1588637864,
9232 "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
9233 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9234 "revCount": 318,
9235 "type": "git",
9236 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9237 },
9238 "original": {
9239 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9240 "type": "git",
9241 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9242 }
9243 },
9244 "surfer_2": {
9245 "flake": false,
9246 "locked": {
9247 "lastModified": 1588637864,
9248 "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
9249 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9250 "revCount": 318,
9251 "type": "git",
9252 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9253 },
9254 "original": {
9255 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9256 "type": "git",
9257 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9258 }
9259 },
9260 "system": {
9261 "inputs": {
9262 "backports": "backports",
9263 "environment": "environment_7",
9264 "mypackages": "mypackages",
9265 "myuids": "myuids_6",
9266 "secrets-public": "secrets-public"
9267 },
9268 "locked": {
9269 "lastModified": 1,
9270 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9271 "path": "../../flakes/private/system",
9272 "type": "path"
9273 },
9274 "original": {
9275 "path": "../../flakes/private/system",
9276 "type": "path"
9277 }
9278 },
9279 "system_2": {
9280 "inputs": {
9281 "backports": "backports_2",
9282 "environment": "environment_11",
9283 "mypackages": "mypackages_2",
9284 "myuids": "myuids_8",
9285 "secrets-public": "secrets-public_2"
9286 },
9287 "locked": {
9288 "lastModified": 1,
9289 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9290 "path": "../../flakes/private/system",
9291 "type": "path"
9292 },
9293 "original": {
9294 "path": "../../flakes/private/system",
9295 "type": "path"
9296 }
9297 },
9298 "system_3": {
9299 "inputs": {
9300 "backports": "backports_4",
9301 "environment": "environment_22",
9302 "mypackages": "mypackages_7",
9303 "myuids": "myuids_24",
9304 "secrets-public": "secrets-public_4"
9305 },
9306 "locked": {
9307 "lastModified": 1,
9308 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9309 "path": "../../flakes/private/system",
9310 "type": "path"
9311 },
9312 "original": {
9313 "path": "../../flakes/private/system",
9314 "type": "path"
9315 }
9316 },
9317 "system_4": {
9318 "inputs": {
9319 "backports": "backports_5",
9320 "environment": "environment_25",
9321 "mypackages": "mypackages_8",
9322 "myuids": "myuids_27",
9323 "secrets-public": "secrets-public_5"
9324 },
9325 "locked": {
9326 "lastModified": 1,
9327 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9328 "path": "../../flakes/private/system",
9329 "type": "path"
9330 },
9331 "original": {
9332 "path": "../../flakes/private/system",
9333 "type": "path"
9334 }
9335 },
9336 "systems": {
9337 "locked": {
9338 "lastModified": 1681028828,
9339 "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
9340 "owner": "nix-systems",
9341 "repo": "default",
9342 "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
9343 "type": "github"
9344 },
9345 "original": {
9346 "owner": "nix-systems",
9347 "repo": "default",
9348 "type": "github"
9349 }
9350 },
9351 "taskwarrior-web": {
9352 "flake": false,
9353 "locked": {
9354 "lastModified": 1546434241,
9355 "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
9356 "owner": "theunraveler",
9357 "repo": "taskwarrior-web",
9358 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9359 "type": "github"
9360 },
9361 "original": {
9362 "owner": "theunraveler",
9363 "repo": "taskwarrior-web",
9364 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9365 "type": "github"
9366 }
9367 },
9368 "taskwarrior-web_2": {
9369 "flake": false,
9370 "locked": {
9371 "lastModified": 1546434241,
9372 "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
9373 "owner": "theunraveler",
9374 "repo": "taskwarrior-web",
9375 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9376 "type": "github"
9377 },
9378 "original": {
9379 "owner": "theunraveler",
9380 "repo": "taskwarrior-web",
9381 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9382 "type": "github"
9383 }
9384 },
9385 "treefmt-nix": {
9386 "inputs": {
9387 "nixpkgs": [
9388 "flakes",
9389 "n-backup-2",
9390 "my-lib",
9391 "nixos-anywhere",
9392 "nixpkgs"
9393 ]
9394 },
9395 "locked": {
9396 "lastModified": 1687940979,
9397 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9398 "owner": "numtide",
9399 "repo": "treefmt-nix",
9400 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9401 "type": "github"
9402 },
9403 "original": {
9404 "owner": "numtide",
9405 "repo": "treefmt-nix",
9406 "type": "github"
9407 }
9408 },
9409 "treefmt-nix_2": {
9410 "inputs": {
9411 "nixpkgs": [
9412 "flakes",
9413 "n-dilion",
9414 "my-lib",
9415 "nixos-anywhere",
9416 "nixpkgs"
9417 ]
9418 },
9419 "locked": {
9420 "lastModified": 1687940979,
9421 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9422 "owner": "numtide",
9423 "repo": "treefmt-nix",
9424 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9425 "type": "github"
9426 },
9427 "original": {
9428 "owner": "numtide",
9429 "repo": "treefmt-nix",
9430 "type": "github"
9431 }
9432 },
9433 "treefmt-nix_3": {
9434 "inputs": {
9435 "nixpkgs": [
9436 "flakes",
9437 "n-eldiron",
9438 "my-lib",
9439 "nixos-anywhere",
9440 "nixpkgs"
9441 ]
9442 },
9443 "locked": {
9444 "lastModified": 1687940979,
9445 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9446 "owner": "numtide",
9447 "repo": "treefmt-nix",
9448 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9449 "type": "github"
9450 },
9451 "original": {
9452 "owner": "numtide",
9453 "repo": "treefmt-nix",
9454 "type": "github"
9455 }
9456 },
9457 "treefmt-nix_4": {
9458 "inputs": {
9459 "nixpkgs": [
9460 "flakes",
9461 "n-monitoring-1",
9462 "my-lib",
9463 "nixos-anywhere",
9464 "nixpkgs"
9465 ]
9466 },
9467 "locked": {
9468 "lastModified": 1687940979,
9469 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9470 "owner": "numtide",
9471 "repo": "treefmt-nix",
9472 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9473 "type": "github"
9474 },
9475 "original": {
9476 "owner": "numtide",
9477 "repo": "treefmt-nix",
9478 "type": "github"
9479 }
9480 },
9481 "treefmt-nix_5": {
9482 "inputs": {
9483 "nixpkgs": [
9484 "flakes",
9485 "n-quatresaisons",
9486 "my-lib",
9487 "nixos-anywhere",
9488 "nixpkgs"
9489 ]
9490 },
9491 "locked": {
9492 "lastModified": 1687940979,
9493 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9494 "owner": "numtide",
9495 "repo": "treefmt-nix",
9496 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9497 "type": "github"
9498 },
9499 "original": {
9500 "owner": "numtide",
9501 "repo": "treefmt-nix",
9502 "type": "github"
9503 }
9504 },
9505 "treefmt-nix_6": {
9506 "inputs": {
9507 "nixpkgs": [
9508 "flakes",
9509 "n-zoldene",
9510 "my-lib",
9511 "nixos-anywhere",
9512 "nixpkgs"
9513 ]
9514 },
9515 "locked": {
9516 "lastModified": 1687940979,
9517 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9518 "owner": "numtide",
9519 "repo": "treefmt-nix",
9520 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9521 "type": "github"
9522 },
9523 "original": {
9524 "owner": "numtide",
9525 "repo": "treefmt-nix",
9526 "type": "github"
9527 }
9528 },
9529 "treefmt-nix_7": {
9530 "inputs": {
9531 "nixpkgs": [
9532 "flakes",
9533 "s-lib",
9534 "nixos-anywhere",
9535 "nixpkgs"
9536 ]
9537 },
9538 "locked": {
9539 "lastModified": 1687940979,
9540 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9541 "owner": "numtide",
9542 "repo": "treefmt-nix",
9543 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9544 "type": "github"
9545 },
9546 "original": {
9547 "owner": "numtide",
9548 "repo": "treefmt-nix",
9549 "type": "github"
9550 }
9551 },
9552 "webapps-ttrss": {
9553 "flake": false,
9554 "locked": {
9555 "lastModified": 1546759381,
9556 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9557 "ref": "master",
9558 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9559 "revCount": 9256,
9560 "type": "git",
9561 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9562 },
9563 "original": {
9564 "ref": "master",
9565 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9566 "type": "git",
9567 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9568 }
9569 },
9570 "webapps-ttrss_10": {
9571 "flake": false,
9572 "locked": {
9573 "lastModified": 1546759381,
9574 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9575 "ref": "master",
9576 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9577 "revCount": 9256,
9578 "type": "git",
9579 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9580 },
9581 "original": {
9582 "ref": "master",
9583 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9584 "type": "git",
9585 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9586 }
9587 },
9588 "webapps-ttrss_11": {
9589 "flake": false,
9590 "locked": {
9591 "lastModified": 1546759381,
9592 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9593 "ref": "master",
9594 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9595 "revCount": 9256,
9596 "type": "git",
9597 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9598 },
9599 "original": {
9600 "ref": "master",
9601 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9602 "type": "git",
9603 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9604 }
9605 },
9606 "webapps-ttrss_12": {
9607 "flake": false,
9608 "locked": {
9609 "lastModified": 1546759381,
9610 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9611 "ref": "master",
9612 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9613 "revCount": 9256,
9614 "type": "git",
9615 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9616 },
9617 "original": {
9618 "ref": "master",
9619 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9620 "type": "git",
9621 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9622 }
9623 },
9624 "webapps-ttrss_13": {
9625 "flake": false,
9626 "locked": {
9627 "lastModified": 1546759381,
9628 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9629 "ref": "master",
9630 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9631 "revCount": 9256,
9632 "type": "git",
9633 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9634 },
9635 "original": {
9636 "ref": "master",
9637 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9638 "type": "git",
9639 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9640 }
9641 },
9642 "webapps-ttrss_14": {
9643 "flake": false,
9644 "locked": {
9645 "lastModified": 1546759381,
9646 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9647 "ref": "master",
9648 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9649 "revCount": 9256,
9650 "type": "git",
9651 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9652 },
9653 "original": {
9654 "ref": "master",
9655 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9656 "type": "git",
9657 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9658 }
9659 },
9660 "webapps-ttrss_15": {
9661 "flake": false,
9662 "locked": {
9663 "lastModified": 1546759381,
9664 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9665 "ref": "master",
9666 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9667 "revCount": 9256,
9668 "type": "git",
9669 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9670 },
9671 "original": {
9672 "ref": "master",
9673 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9674 "type": "git",
9675 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9676 }
9677 },
9678 "webapps-ttrss_2": {
9679 "flake": false,
9680 "locked": {
9681 "lastModified": 1546759381,
9682 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9683 "ref": "master",
9684 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9685 "revCount": 9256,
9686 "type": "git",
9687 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9688 },
9689 "original": {
9690 "ref": "master",
9691 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9692 "type": "git",
9693 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9694 }
9695 },
9696 "webapps-ttrss_3": {
9697 "flake": false,
9698 "locked": {
9699 "lastModified": 1546759381,
9700 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9701 "ref": "master",
9702 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9703 "revCount": 9256,
9704 "type": "git",
9705 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9706 },
9707 "original": {
9708 "ref": "master",
9709 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9710 "type": "git",
9711 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9712 }
9713 },
9714 "webapps-ttrss_4": {
9715 "flake": false,
9716 "locked": {
9717 "lastModified": 1546759381,
9718 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9719 "ref": "master",
9720 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9721 "revCount": 9256,
9722 "type": "git",
9723 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9724 },
9725 "original": {
9726 "ref": "master",
9727 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9728 "type": "git",
9729 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9730 }
9731 },
9732 "webapps-ttrss_5": {
9733 "flake": false,
9734 "locked": {
9735 "lastModified": 1546759381,
9736 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9737 "ref": "master",
9738 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9739 "revCount": 9256,
9740 "type": "git",
9741 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9742 },
9743 "original": {
9744 "ref": "master",
9745 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9746 "type": "git",
9747 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9748 }
9749 },
9750 "webapps-ttrss_6": {
9751 "flake": false,
9752 "locked": {
9753 "lastModified": 1546759381,
9754 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9755 "ref": "master",
9756 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9757 "revCount": 9256,
9758 "type": "git",
9759 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9760 },
9761 "original": {
9762 "ref": "master",
9763 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9764 "type": "git",
9765 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9766 }
9767 },
9768 "webapps-ttrss_7": {
9769 "flake": false,
9770 "locked": {
9771 "lastModified": 1546759381,
9772 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9773 "ref": "master",
9774 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9775 "revCount": 9256,
9776 "type": "git",
9777 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9778 },
9779 "original": {
9780 "ref": "master",
9781 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9782 "type": "git",
9783 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9784 }
9785 },
9786 "webapps-ttrss_8": {
9787 "flake": false,
9788 "locked": {
9789 "lastModified": 1546759381,
9790 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9791 "ref": "master",
9792 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9793 "revCount": 9256,
9794 "type": "git",
9795 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9796 },
9797 "original": {
9798 "ref": "master",
9799 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9800 "type": "git",
9801 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9802 }
9803 },
9804 "webapps-ttrss_9": {
9805 "flake": false,
9806 "locked": {
9807 "lastModified": 1546759381,
9808 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9809 "ref": "master",
9810 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9811 "revCount": 9256,
9812 "type": "git",
9813 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9814 },
9815 "original": {
9816 "ref": "master",
9817 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9818 "type": "git",
9819 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9820 }
9821 }
9822 },
9823 "root": "root",
9824 "version": 7
9825}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..e3ed4c9
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,47 @@
1{
2 description = "immae-eu infrastructure";
3 inputs = {
4 flake-parts.url = "github:hercules-ci/flake-parts";
5 devshell.url = "github:numtide/devshell";
6 # nixpkgs for local tools
7 nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
8
9 flakes.url = "path:./flakes";
10 };
11 outputs = inputs@{ self, flake-parts, flakes, ... }:
12 let
13 inherit (flakes.subflakes) public private;
14 inherit (public) mypackages;
15 in
16 flake-parts.lib.mkFlake { inherit inputs; } ({ withSystem, ... }: {
17 imports = [
18 inputs.devshell.flakeModule
19 (mypackages.mylibs.flakePartsAddPerSystem { name = "lib"; type = "unspecified"; })
20 ];
21 systems = [ "x86_64-linux" ];
22 perSystem = { config, inputs', pkgs, system, ... }:
23 {
24 packages = mypackages.packages."${system}";
25 lib = mypackages.lib."${system}";
26 devshells.default = {
27 packages = [
28 pkgs.colmena
29 pkgs.nixUnstable pkgs.python3 pkgs.sops
30 pkgs.curl pkgs.shellcheck pkgs.jq
31 pkgs.gnumake pkgs.yq
32 ];
33 env = [
34 { name = "NIX_BUILD_TOP"; value = ""; }
35 { name = "PATH"; prefix = "scripts"; }
36 { name = "NIX_PATH"; value = "nixpkgs=${pkgs.path}"; }
37 ];
38 };
39 };
40 flake = {
41 # FIXME: next line Can be removed in nix 2.16.*
42 devShell.x86_64-linux = self.devShells.x86_64-linux.default;
43 inherit (mypackages) mylibs sources overlays;
44 inherit (flakes) subflakes;
45 };
46 });
47}
diff --git a/flakes/backports/flake.lock b/flakes/backports/flake.lock
index 5f9289e..8981e53 100644
--- a/flakes/backports/flake.lock
+++ b/flakes/backports/flake.lock
@@ -2,11 +2,11 @@
2 "nodes": { 2 "nodes": {
3 "flake-utils": { 3 "flake-utils": {
4 "locked": { 4 "locked": {
5 "lastModified": 1629481132, 5 "lastModified": 1667395993,
6 "narHash": "sha256-JHgasjPR0/J1J3DRm4KxM4zTyAj4IOJY8vIl75v/kPI=", 6 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
7 "owner": "numtide", 7 "owner": "numtide",
8 "repo": "flake-utils", 8 "repo": "flake-utils",
9 "rev": "997f7efcb746a9c140ce1f13c72263189225f482", 9 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
10 "type": "github" 10 "type": "github"
11 }, 11 },
12 "original": { 12 "original": {
@@ -17,15 +17,16 @@
17 }, 17 },
18 "nixpkgs": { 18 "nixpkgs": {
19 "locked": { 19 "locked": {
20 "lastModified": 1634032472, 20 "lastModified": 1687502512,
21 "narHash": "sha256-IoSg358w6nPpTYLWhvN3UgnU6r322dDPOLFXHyqyIkM=", 21 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
22 "owner": "NixOS", 22 "owner": "NixOS",
23 "repo": "nixpkgs", 23 "repo": "nixpkgs",
24 "rev": "3abf4b55b7c991909fde3115827d398dd7c5a299", 24 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
25 "type": "github" 25 "type": "github"
26 }, 26 },
27 "original": { 27 "original": {
28 "owner": "NixOS", 28 "owner": "NixOS",
29 "ref": "nixos-unstable",
29 "repo": "nixpkgs", 30 "repo": "nixpkgs",
30 "type": "github" 31 "type": "github"
31 } 32 }
diff --git a/flakes/backports/flake.nix b/flakes/backports/flake.nix
index 8be885f..796664a 100644
--- a/flakes/backports/flake.nix
+++ b/flakes/backports/flake.nix
@@ -1,62 +1,19 @@
1{ 1{
2 description = "Backported packages"; 2 description = "Backported packages";
3 3
4 inputs.nixpkgs.url = "github:NixOS/nixpkgs"; 4 inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
5 inputs.flake-utils.url = "github:numtide/flake-utils"; 5 inputs.flake-utils.url = "github:numtide/flake-utils";
6 6
7 outputs = { self, flake-utils, nixpkgs }: flake-utils.lib.eachDefaultSystem (system: 7 outputs = { self, flake-utils, nixpkgs }: flake-utils.lib.eachDefaultSystem (system:
8 let 8 let
9 pkgs = import nixpkgs { inherit system; overlays = []; }; 9 pkgs = import nixpkgs { inherit system; overlays = []; config = {}; };
10 in rec { 10 in rec {
11 packages = { 11 packages = {
12 apprise = pkgs.apprise; 12 ntfy-sh = pkgs.ntfy-sh;
13 bitlbee-mastodon = pkgs.bitlbee-mastodon;
14 cointop = pkgs.cointop;
15 cryptpad = pkgs.cryptpad;
16 dovecot_fts-xapian = pkgs.dovecot_fts_xapian;
17 duply = pkgs.duply;
18 fiche = pkgs.fiche;
19 influxdb2 = pkgs.influxdb2;
20 ldapvi = pkgs.ldapvi;
21 lego = pkgs.lego;
22 mpd = pkgs.mpd;
23 mpd-small = pkgs.mpd-small;
24 opensmtpd = pkgs.opensmtpd;
25 pass = pkgs.pass;
26 pg_activity = pkgs.pg_activity;
27 signald = pkgs.signald;
28 ssh-to-age = pkgs.ssh-to-age;
29 stgit = pkgs.stgit;
30 sops = pkgs.sops;
31 sudo = pkgs.sudo;
32 telegram-cli = pkgs.telegram-cli;
33 woob = pkgs.python3Packages.woob;
34 zrepl = pkgs.zrepl;
35 }; 13 };
36 legacyPackages = packages; 14 legacyPackages = packages;
37 apps = { 15 apps = {
38 apprise = flake-utils.lib.mkApp { drv = packages.apprise; name = "apprise"; }; 16 ntfy-sh = flake-utils.lib.mkApp { drv = packages.ntfy-sh; name = "ntfy-sh"; };
39 cointop = flake-utils.lib.mkApp { drv = packages.cointop; name = "cointop"; };
40 cryptpad = flake-utils.lib.mkApp { drv = packages.cryptpad; name = "cryptpad"; };
41 duply = flake-utils.lib.mkApp { drv = packages.duply; name = "duply"; };
42 fiche = flake-utils.lib.mkApp { drv = packages.fiche; name = "fiche"; };
43 influxd = flake-utils.lib.mkApp { drv = packages.influxdb2; name = "influxd"; };
44 influx = flake-utils.lib.mkApp { drv = packages.influxdb2; name = "influx"; };
45 ldapvi = flake-utils.lib.mkApp { drv = packages.ldapvi; name = "ldapvi"; };
46 lego = flake-utils.lib.mkApp { drv = packages.lego; name = "lego"; };
47 mpd = flake-utils.lib.mkApp { drv = packages.mpd; name = "mpd"; };
48 mpd-small = flake-utils.lib.mkApp { drv = packages.mpd-small; name = "mpd"; };
49 opensmtpd = flake-utils.lib.mkApp { drv = packages.opensmtpd; name = "opensmtpd"; };
50 pass = flake-utils.lib.mkApp { drv = packages.pass; name = "pass"; };
51 pg_activity = flake-utils.lib.mkApp { drv = packages.pg_activity; name = "pg_activity"; };
52 signald = flake-utils.lib.mkApp { drv = packages.signald; name = "signald"; };
53 ssh-to-age = flake-utils.lib.mkApp { drv = packages.ssh-to-age; name = "ssh-to-age"; };
54 stgit = flake-utils.lib.mkApp { drv = packages.stgit; name = "stgit"; };
55 sops = flake-utils.lib.mkApp { drv = packages.sops; name = "sops"; };
56 sudo = flake-utils.lib.mkApp { drv = packages.sudo; name = "sudo"; };
57 telegram-cli = flake-utils.lib.mkApp { drv = packages.telegram-cli; name = "telegram-cli"; };
58 woob = flake-utils.lib.mkApp { drv = packages.woob; name = "woob"; };
59 zrepl = flake-utils.lib.mkApp { drv = packages.zrepl; name = "zrepl"; };
60 }; 17 };
61 } 18 }
62 ) // rec { 19 ) // rec {
@@ -66,62 +23,14 @@
66 in package.override (pkgs.lib.genAttrs packageDeps (n: pkgs."${n}")); 23 in package.override (pkgs.lib.genAttrs packageDeps (n: pkgs."${n}"));
67 }; 24 };
68 overlays = { 25 overlays = {
69 apprise = final: prev: { apprise = self.packages."${final.system}".apprise; }; 26 ntfy-sh = final: prev: { ntfy-sh = self.packages."${final.system}".ntfy-sh; };
70 bitlbee-mastodon = final: prev: {
71 bitlbee-mastodon = lib.overrideDeps final self.packages."${final.system}".bitlbee-mastodon;
72 };
73 cointop = final: prev: { cointop = self.packages."${final.system}".cointop; };
74 cryptpad = final: prev: { cryptpad = self.packages."${final.system}".cryptpad; };
75 dovecot_fts-xapian = final: prev: {
76 dovecot_fts-xapian = lib.overrideDeps final self.packages."${final.system}".dovecot_fts-xapian;
77 };
78 duply = final: prev: { duply = self.packages."${final.system}".duply; };
79 fiche = final: prev: { fiche = self.packages."${final.system}".fiche; };
80 influxdb2 = final: prev: { influxdb2 = self.packages."${final.system}".influxdb2; };
81 ldapvi = final: prev: { ldapvi = self.packages."${final.system}".ldapvi; };
82 lego = final: prev: { lego = self.packages."${final.system}".lego; };
83 mpd = final: prev: { mpd = self.packages."${final.system}".mpd; };
84 opensmtpd = final: prev: { opensmtpd = self.packages."${final.system}".opensmtpd; };
85 pass = final: prev: { pass = self.packages."${final.system}".pass; };
86 pg_activity = final: prev: { pg_activity = self.packages."${final.system}".pg_activity; };
87 signald = final: prev: { signald = self.packages."${final.system}".signald; };
88 ssh-to-age = final: prev: { ssh-to-age = self.packages."${final.system}".ssh-to-age; };
89 stgit = final: prev: { stgit = self.packages."${final.system}".stgit; };
90 sops = final: prev: { sops = self.packages."${final.system}".sops; };
91 sudo = final: prev: { sudo = self.packages."${final.system}".sudo; };
92 telegram-cli = final: prev: { telegram-cli = self.packages."${final.system}".telegram-cli; };
93 woob = final: prev: { woob = self.packages."${final.system}".woob; };
94 zrepl = final: prev: { zrepl = self.packages."${final.system}".zrepl; };
95 }; 27 };
96 overlay = final: prev: ({} 28 overlay = final: prev: ({}
97 // overlays.apprise final prev 29 // overlays.ntfy-sh final prev
98 // overlays.bitlbee-mastodon final prev
99 // overlays.cointop final prev
100 // overlays.cryptpad final prev
101 // overlays.dovecot_fts-xapian final prev
102 // overlays.duply final prev
103 // overlays.fiche final prev
104 // overlays.influxdb2 final prev
105 // overlays.ldapvi final prev
106 // overlays.lego final prev
107 // overlays.mpd final prev
108 // overlays.opensmtpd final prev
109 // overlays.pass final prev
110 // overlays.pg_activity final prev
111 // overlays.signald final prev
112 // overlays.ssh-to-age final prev
113 // overlays.stgit final prev
114 // overlays.sops final prev
115 // overlays.sudo final prev
116 // overlays.telegram-cli final prev
117 // overlays.woob final prev
118 // overlays.zrepl final prev
119 ); 30 );
120 31
121 nixosModules = { 32 nixosModules = {
122 influxdb2 = import (nixpkgs + "/nixos/modules/services/databases/influxdb2.nix"); 33 #coturn = import (nixpkgs + "/nixos/modules/services/networking/coturn.nix");
123 mpd = import (nixpkgs + "/nixos/modules/services/audio/mpd.nix");
124 zrepl = import (nixpkgs + "/nixos/modules/services/backup/zrepl.nix");
125 }; 34 };
126 }; 35 };
127} 36}
diff --git a/flakes/copanier/default.nix b/flakes/copanier/default.nix
new file mode 100644
index 0000000..0486c0a
--- /dev/null
+++ b/flakes/copanier/default.nix
@@ -0,0 +1,30 @@
1{ src, glibcLocales, poetry2nix, fetchFromGitHub, python37, fetchpatch }:
2let
3 poetryApp = poetry2nix.mkPoetryApplication rec {
4 inherit src;
5 patches = [ ./fix_reduce.patch ];
6 overrides = poetry2nix.overrides.withDefaults (self: super: {
7 weasyprint = super.weasyprint.overridePythonAttrs (old: {
8 patches = let
9 p0 = (fetchpatch {
10 url = "https://github.com/Kozea/WeasyPrint/commit/47043a1fd7e50a892b9836466f521df85d597c44.patch";
11 sha256 = "18lmz6whjqxdpv4fdmg5vcpk2acdl99kfmp14badpw1jmffw7zl2";
12 postFetch = ''
13 sed -i -e "s/font_filename/filename/" $out
14 '';
15 });
16 p1 = (builtins.elemAt old.patches 1).overrideAttrs(old: {
17 postInstall = ''
18 sed -i -e "s/so.0/so/" $out
19 '';
20 });
21 in [ p0 p1 ];
22 });
23 });
24 pyproject = ./pyproject.toml;
25 poetrylock = ./poetry.lock;
26 python = python37;
27 locales = "${glibcLocales}/lib/locale/locale-archive";
28 };
29in
30 poetryApp
diff --git a/flakes/copanier/fix_reduce.patch b/flakes/copanier/fix_reduce.patch
new file mode 100644
index 0000000..5390bcc
--- /dev/null
+++ b/flakes/copanier/fix_reduce.patch
@@ -0,0 +1,13 @@
1diff --git a/copanier/views/delivery.py b/copanier/views/delivery.py
2index 779d52c..1696919 100644
3--- a/copanier/views/delivery.py
4+++ b/copanier/views/delivery.py
5@@ -401,7 +401,7 @@ async def compute_payments(request, response, id):
6 balance.append((group_id, amount))
7
8 debiters, crediters = order_balance(balance)
9- results = reduce_balance(debiters[:], crediters[:])
10+ results = reduce_balance(debiters[:], crediters[:], [])
11
12 results_dict = defaultdict(partial(defaultdict, float))
13
diff --git a/flakes/copanier/flake.lock b/flakes/copanier/flake.lock
new file mode 100644
index 0000000..fe84a9d
--- /dev/null
+++ b/flakes/copanier/flake.lock
@@ -0,0 +1,59 @@
1{
2 "nodes": {
3 "copanier": {
4 "flake": false,
5 "locked": {
6 "lastModified": 1633895178,
7 "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
8 "owner": "spiral-project",
9 "repo": "copanier",
10 "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
11 "type": "github"
12 },
13 "original": {
14 "owner": "spiral-project",
15 "repo": "copanier",
16 "type": "github"
17 }
18 },
19 "flake-utils": {
20 "locked": {
21 "lastModified": 1631561581,
22 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
23 "owner": "numtide",
24 "repo": "flake-utils",
25 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
26 "type": "github"
27 },
28 "original": {
29 "owner": "numtide",
30 "repo": "flake-utils",
31 "type": "github"
32 }
33 },
34 "nixpkgs": {
35 "locked": {
36 "lastModified": 1633901457,
37 "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
38 "owner": "NixOS",
39 "repo": "nixpkgs",
40 "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
41 "type": "github"
42 },
43 "original": {
44 "owner": "NixOS",
45 "repo": "nixpkgs",
46 "type": "github"
47 }
48 },
49 "root": {
50 "inputs": {
51 "copanier": "copanier",
52 "flake-utils": "flake-utils",
53 "nixpkgs": "nixpkgs"
54 }
55 }
56 },
57 "root": "root",
58 "version": 7
59}
diff --git a/flakes/copanier/flake.nix b/flakes/copanier/flake.nix
new file mode 100644
index 0000000..74e6829
--- /dev/null
+++ b/flakes/copanier/flake.nix
@@ -0,0 +1,28 @@
1{
2 description = "Copanier";
3
4 inputs.flake-utils.url = "github:numtide/flake-utils";
5 inputs.nixpkgs.url = "github:NixOS/nixpkgs";
6 inputs.copanier = {
7 url = "github:spiral-project/copanier";
8 flake = false;
9 };
10
11 outputs = { self, copanier, flake-utils, nixpkgs }: flake-utils.lib.eachDefaultSystem (system:
12 let
13 pkgs = import nixpkgs { inherit system; overlays = []; };
14 in rec {
15 packages.copanier = pkgs.callPackage ./. { src = copanier; };
16 defaultPackage = packages.copanier;
17 legacyPackages.copanier = packages.copanier;
18 apps.copanier = flake-utils.lib.mkApp { drv = packages.copanier; };
19 defaultApp = apps.copanier;
20 }) // rec {
21 overlays = {
22 copanier = final: prev: {
23 copanier = self.defaultPackage."${final.system}";
24 };
25 };
26 overlay = overlays.copanier;
27 };
28 }
diff --git a/flakes/copanier/poetry.lock b/flakes/copanier/poetry.lock
new file mode 100644
index 0000000..232bdf3
--- /dev/null
+++ b/flakes/copanier/poetry.lock
@@ -0,0 +1,995 @@
1[[package]]
2name = "autoroutes"
3version = "0.3.5"
4description = "Routes for speed"
5category = "main"
6optional = false
7python-versions = "*"
8
9[package.extras]
10dev = ["cython", "pytest", "twine"]
11
12[[package]]
13name = "biscuits"
14version = "0.3.0"
15description = "Fast and tasty cookies handling."
16category = "main"
17optional = false
18python-versions = "*"
19
20[[package]]
21name = "cachetools"
22version = "4.2.4"
23description = "Extensible memoizing collections and decorators"
24category = "main"
25optional = false
26python-versions = "~=3.5"
27
28[[package]]
29name = "cairocffi"
30version = "1.3.0"
31description = "cffi-based cairo bindings for Python"
32category = "main"
33optional = false
34python-versions = ">=3.7"
35
36[package.dependencies]
37cffi = ">=1.1.0"
38
39[package.extras]
40doc = ["sphinx", "sphinx-rtd-theme"]
41test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"]
42xcb = ["xcffib (>=0.3.2)"]
43
44[[package]]
45name = "cairosvg"
46version = "2.5.2"
47description = "A Simple SVG Converter based on Cairo"
48category = "main"
49optional = false
50python-versions = ">=3.5"
51
52[package.dependencies]
53cairocffi = "*"
54cssselect2 = "*"
55defusedxml = "*"
56pillow = "*"
57tinycss2 = "*"
58
59[package.extras]
60doc = ["sphinx", "sphinx-rtd-theme"]
61test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"]
62
63[[package]]
64name = "certifi"
65version = "2021.10.8"
66description = "Python package for providing Mozilla's CA Bundle."
67category = "main"
68optional = false
69python-versions = "*"
70
71[[package]]
72name = "cffi"
73version = "1.14.6"
74description = "Foreign Function Interface for Python calling C code."
75category = "main"
76optional = false
77python-versions = "*"
78
79[package.dependencies]
80pycparser = "*"
81
82[[package]]
83name = "chardet"
84version = "4.0.0"
85description = "Universal encoding detector for Python 2 and 3"
86category = "main"
87optional = false
88python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
89
90[[package]]
91name = "charset-normalizer"
92version = "2.0.6"
93description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
94category = "main"
95optional = false
96python-versions = ">=3.5.0"
97
98[package.extras]
99unicode_backport = ["unicodedata2"]
100
101[[package]]
102name = "cssselect"
103version = "1.1.0"
104description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0"
105category = "main"
106optional = false
107python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
108
109[[package]]
110name = "cssselect2"
111version = "0.4.1"
112description = "cssselect2"
113category = "main"
114optional = false
115python-versions = ">=3.6"
116
117[package.dependencies]
118tinycss2 = "*"
119webencodings = "*"
120
121[package.extras]
122doc = ["sphinx", "sphinx-rtd-theme"]
123test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"]
124
125[[package]]
126name = "cssutils"
127version = "2.3.0"
128description = "A CSS Cascading Style Sheets library for Python"
129category = "main"
130optional = false
131python-versions = ">=3.6"
132
133[package.dependencies]
134importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
135
136[package.extras]
137docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
138testing = ["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"]
139
140[[package]]
141name = "debts"
142version = "0.5"
143description = "Help solve debts settlement."
144category = "main"
145optional = false
146python-versions = "*"
147
148[package.dependencies]
149jinja2 = "*"
150
151[[package]]
152name = "defusedxml"
153version = "0.7.1"
154description = "XML bomb protection for Python stdlib modules"
155category = "main"
156optional = false
157python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
158
159[[package]]
160name = "emails"
161version = "0.6"
162description = "Modern python library for emails."
163category = "main"
164optional = false
165python-versions = "*"
166
167[package.dependencies]
168chardet = "*"
169cssutils = "*"
170lxml = "*"
171premailer = "*"
172python-dateutil = "*"
173requests = "*"
174
175[[package]]
176name = "et-xmlfile"
177version = "1.1.0"
178description = "An implementation of lxml.xmlfile for the standard library"
179category = "main"
180optional = false
181python-versions = ">=3.6"
182
183[[package]]
184name = "html5lib"
185version = "1.1"
186description = "HTML parser based on the WHATWG HTML specification"
187category = "main"
188optional = false
189python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
190
191[package.dependencies]
192six = ">=1.9"
193webencodings = "*"
194
195[package.extras]
196all = ["genshi", "chardet (>=2.2)", "lxml"]
197chardet = ["chardet (>=2.2)"]
198genshi = ["genshi"]
199lxml = ["lxml"]
200
201[[package]]
202name = "httptools"
203version = "0.2.0"
204description = "A collection of framework independent HTTP protocol utils."
205category = "main"
206optional = false
207python-versions = "*"
208
209[package.extras]
210test = ["Cython (==0.29.22)"]
211
212[[package]]
213name = "idna"
214version = "3.2"
215description = "Internationalized Domain Names in Applications (IDNA)"
216category = "main"
217optional = false
218python-versions = ">=3.5"
219
220[[package]]
221name = "importlib-metadata"
222version = "4.8.1"
223description = "Read metadata from Python packages"
224category = "main"
225optional = false
226python-versions = ">=3.6"
227
228[package.dependencies]
229typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
230zipp = ">=0.5"
231
232[package.extras]
233docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
234perf = ["ipython"]
235testing = ["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)"]
236
237[[package]]
238name = "jdcal"
239version = "1.4.1"
240description = "Julian dates from proleptic Gregorian and Julian calendars."
241category = "main"
242optional = false
243python-versions = "*"
244
245[[package]]
246name = "jinja2"
247version = "2.11.2"
248description = "A very fast and expressive template engine."
249category = "main"
250optional = false
251python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
252
253[package.dependencies]
254MarkupSafe = ">=0.23"
255
256[package.extras]
257i18n = ["Babel (>=0.8)"]
258
259[[package]]
260name = "lxml"
261version = "4.6.3"
262description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
263category = "main"
264optional = false
265python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*"
266
267[package.extras]
268cssselect = ["cssselect (>=0.7)"]
269html5 = ["html5lib"]
270htmlsoup = ["beautifulsoup4"]
271source = ["Cython (>=0.29.7)"]
272
273[[package]]
274name = "markupsafe"
275version = "2.0.1"
276description = "Safely add untrusted strings to HTML/XML markup."
277category = "main"
278optional = false
279python-versions = ">=3.6"
280
281[[package]]
282name = "minicli"
283version = "0.5.0"
284description = "Minimalist CLI"
285category = "main"
286optional = false
287python-versions = "*"
288
289[package.extras]
290doc = ["mkdocs (==1.1.2)"]
291test = ["pytest (==6.0.1)"]
292
293[[package]]
294name = "multifruits"
295version = "0.1.5"
296description = "Tasty multipart form data parser built with cython."
297category = "main"
298optional = false
299python-versions = "*"
300
301[package.extras]
302dev = ["Cython (==0.29.21)"]
303
304[[package]]
305name = "openpyxl"
306version = "3.0.5"
307description = "A Python library to read/write Excel 2010 xlsx/xlsm files"
308category = "main"
309optional = false
310python-versions = ">=3.6,"
311
312[package.dependencies]
313et-xmlfile = "*"
314jdcal = "*"
315
316[[package]]
317name = "pillow"
318version = "8.3.2"
319description = "Python Imaging Library (Fork)"
320category = "main"
321optional = false
322python-versions = ">=3.6"
323
324[[package]]
325name = "premailer"
326version = "3.10.0"
327description = "Turns CSS blocks into style attributes"
328category = "main"
329optional = false
330python-versions = "*"
331
332[package.dependencies]
333cachetools = "*"
334cssselect = "*"
335cssutils = "*"
336lxml = "*"
337requests = "*"
338
339[package.extras]
340dev = ["tox", "twine", "therapist", "black", "flake8", "wheel"]
341test = ["nose", "mock"]
342
343[[package]]
344name = "pycparser"
345version = "2.20"
346description = "C parser in Python"
347category = "main"
348optional = false
349python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
350
351[[package]]
352name = "pyjwt"
353version = "1.7.1"
354description = "JSON Web Token implementation in Python"
355category = "main"
356optional = false
357python-versions = "*"
358
359[package.extras]
360crypto = ["cryptography (>=1.4)"]
361flake8 = ["flake8", "flake8-import-order", "pep8-naming"]
362test = ["pytest (>=4.0.1,<5.0.0)", "pytest-cov (>=2.6.0,<3.0.0)", "pytest-runner (>=4.2,<5.0.0)"]
363
364[[package]]
365name = "pyphen"
366version = "0.11.0"
367description = "Pure Python module to hyphenate text"
368category = "main"
369optional = false
370python-versions = ">=3.6"
371
372[package.extras]
373test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"]
374
375[[package]]
376name = "python-dateutil"
377version = "2.8.2"
378description = "Extensions to the standard Python datetime module"
379category = "main"
380optional = false
381python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
382
383[package.dependencies]
384six = ">=1.5"
385
386[[package]]
387name = "python-slugify"
388version = "4.0.1"
389description = "A Python Slugify application that handles Unicode"
390category = "main"
391optional = false
392python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
393
394[package.dependencies]
395text-unidecode = ">=1.3"
396
397[package.extras]
398unidecode = ["Unidecode (>=1.1.1)"]
399
400[[package]]
401name = "pyyaml"
402version = "5.3.1"
403description = "YAML parser and emitter for Python"
404category = "main"
405optional = false
406python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
407
408[[package]]
409name = "requests"
410version = "2.26.0"
411description = "Python HTTP for Humans."
412category = "main"
413optional = false
414python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
415
416[package.dependencies]
417certifi = ">=2017.4.17"
418charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""}
419idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""}
420urllib3 = ">=1.21.1,<1.27"
421
422[package.extras]
423socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
424use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
425
426[[package]]
427name = "roll"
428version = "0.13.0"
429description = "Roll is a pico framework with performances and aesthetic in mind."
430category = "main"
431optional = false
432python-versions = "*"
433
434[package.dependencies]
435autoroutes = "0.3.5"
436biscuits = "0.3.0"
437httptools = "0.2.0"
438multifruits = "0.1.5"
439websockets = "8.1"
440
441[package.extras]
442docs = ["mkdocs"]
443test = ["pytest"]
444
445[[package]]
446name = "six"
447version = "1.16.0"
448description = "Python 2 and 3 compatibility utilities"
449category = "main"
450optional = false
451python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
452
453[[package]]
454name = "text-unidecode"
455version = "1.3"
456description = "The most basic Text::Unidecode port"
457category = "main"
458optional = false
459python-versions = "*"
460
461[[package]]
462name = "tinycss2"
463version = "1.1.0"
464description = "tinycss2"
465category = "main"
466optional = false
467python-versions = ">=3.6"
468
469[package.dependencies]
470webencodings = ">=0.4"
471
472[package.extras]
473doc = ["sphinx", "sphinx-rtd-theme"]
474test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"]
475
476[[package]]
477name = "typing-extensions"
478version = "3.10.0.2"
479description = "Backported and Experimental Type Hints for Python 3.5+"
480category = "main"
481optional = false
482python-versions = "*"
483
484[[package]]
485name = "ujson"
486version = "3.2.0"
487description = "Ultra fast JSON encoder and decoder for Python"
488category = "main"
489optional = false
490python-versions = ">=3.5"
491
492[[package]]
493name = "urllib3"
494version = "1.26.7"
495description = "HTTP library with thread-safe connection pooling, file post, and more."
496category = "main"
497optional = false
498python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
499
500[package.extras]
501brotli = ["brotlipy (>=0.6.0)"]
502secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
503socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
504
505[[package]]
506name = "weasyprint"
507version = "51"
508description = "The Awesome Document Factory"
509category = "main"
510optional = false
511python-versions = ">=3.5"
512
513[package.dependencies]
514cairocffi = ">=0.9.0"
515CairoSVG = ">=2.4.0"
516cffi = ">=0.6"
517cssselect2 = ">=0.1"
518html5lib = ">=0.999999999"
519Pyphen = ">=0.9.1"
520tinycss2 = ">=1.0.0"
521
522[package.extras]
523doc = ["sphinx", "sphinx-rtd-theme"]
524test = ["pytest-runner", "pytest-cov", "pytest-flake8", "pytest-isort"]
525
526[[package]]
527name = "webencodings"
528version = "0.5.1"
529description = "Character encoding aliases for legacy web content"
530category = "main"
531optional = false
532python-versions = "*"
533
534[[package]]
535name = "websockets"
536version = "8.1"
537description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
538category = "main"
539optional = false
540python-versions = ">=3.6.1"
541
542[[package]]
543name = "zipp"
544version = "3.6.0"
545description = "Backport of pathlib-compatible object wrapper for zip files"
546category = "main"
547optional = false
548python-versions = ">=3.6"
549
550[package.extras]
551docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
552testing = ["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"]
553
554[metadata]
555lock-version = "1.1"
556python-versions = "^3.7"
557content-hash = "e82001513bafdfab9338f3fe9e786a7cc23c55f7e77a98e6b1d3924ab8887f5f"
558
559[metadata.files]
560autoroutes = [
561 {file = "autoroutes-0.3.5.tar.gz", hash = "sha256:087fcc5bd7e6f457931b9e8420d575f6aa7d35803d667013463c58d2bcf6b814"},
562]
563biscuits = [
564 {file = "biscuits-0.3.0.tar.gz", hash = "sha256:08b899164133c81b99b7307d629a45e2fb6a3bcc3ea7c08b1ff24b464b411307"},
565]
566cachetools = [
567 {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"},
568 {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"},
569]
570cairocffi = [
571 {file = "cairocffi-1.3.0.tar.gz", hash = "sha256:108a3a7cb09e203bdd8501d9baad91d786d204561bd71e9364e8b34897c47b91"},
572]
573cairosvg = [
574 {file = "CairoSVG-2.5.2-py3-none-any.whl", hash = "sha256:98c276b7e4f0caf01e5c7176765c104ffa1aa1461d63b2053b04ab663cf7052b"},
575 {file = "CairoSVG-2.5.2.tar.gz", hash = "sha256:b0b9929cf5dba005178d746a8036fcf0025550f498ca54db61873322384783bc"},
576]
577certifi = [
578 {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
579 {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
580]
581cffi = [
582 {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"},
583 {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"},
584 {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"},
585 {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"},
586 {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"},
587 {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"},
588 {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"},
589 {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"},
590 {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"},
591 {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"},
592 {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"},
593 {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"},
594 {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"},
595 {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"},
596 {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"},
597 {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"},
598 {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"},
599 {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"},
600 {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"},
601 {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"},
602 {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"},
603 {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"},
604 {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"},
605 {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"},
606 {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"},
607 {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"},
608 {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"},
609 {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"},
610 {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"},
611 {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"},
612 {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"},
613 {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"},
614 {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"},
615 {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"},
616 {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"},
617 {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"},
618 {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"},
619 {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"},
620 {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"},
621 {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"},
622 {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"},
623 {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"},
624 {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"},
625 {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"},
626 {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"},
627]
628chardet = [
629 {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
630 {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
631]
632charset-normalizer = [
633 {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"},
634 {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"},
635]
636cssselect = [
637 {file = "cssselect-1.1.0-py2.py3-none-any.whl", hash = "sha256:f612ee47b749c877ebae5bb77035d8f4202c6ad0f0fc1271b3c18ad6c4468ecf"},
638 {file = "cssselect-1.1.0.tar.gz", hash = "sha256:f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc"},
639]
640cssselect2 = [
641 {file = "cssselect2-0.4.1-py3-none-any.whl", hash = "sha256:2f4a9f20965367bae459e3bb42561f7927e0cfe5b7ea1692757cf67ef5d7dace"},
642 {file = "cssselect2-0.4.1.tar.gz", hash = "sha256:93fbb9af860e95dd40bf18c3b2b6ed99189a07c0f29ba76f9c5be71344664ec8"},
643]
644cssutils = [
645 {file = "cssutils-2.3.0-py3-none-any.whl", hash = "sha256:0cf1f6086b020dee18048ff3999339499f725934017ef9ae2cd5bb77f9ab5f46"},
646 {file = "cssutils-2.3.0.tar.gz", hash = "sha256:b2d3b16047caae82e5c590036935bafa1b621cf45c2f38885af4be4838f0fd00"},
647]
648debts = [
649 {file = "debts-0.5.tar.gz", hash = "sha256:f239fa356500b0cc7d2334a6ad45dcaf542796f759ca44052c59566afca8e5f8"},
650]
651defusedxml = [
652 {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"},
653 {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"},
654]
655emails = [
656 {file = "emails-0.6-py2.py3-none-any.whl", hash = "sha256:72c1e3198075709cc35f67e1b49e2da1a2bc087e9b444073db61a379adfb7f3c"},
657 {file = "emails-0.6.tar.gz", hash = "sha256:a4c2d67ea8b8831967a750d8edc6e77040d7693143fe280e6d2a367d9c36ff88"},
658]
659et-xmlfile = [
660 {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"},
661 {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"},
662]
663html5lib = [
664 {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"},
665 {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"},
666]
667httptools = [
668 {file = "httptools-0.2.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:79dbc21f3612a78b28384e989b21872e2e3cf3968532601544696e4ed0007ce5"},
669 {file = "httptools-0.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:78d03dd39b09c99ec917d50189e6743adbfd18c15d5944392d2eabda688bf149"},
670 {file = "httptools-0.2.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a23166e5ae2775709cf4f7ad4c2048755ebfb272767d244e1a96d55ac775cca7"},
671 {file = "httptools-0.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3ab1f390d8867f74b3b5ee2a7ecc9b8d7f53750bd45714bf1cb72a953d7dfa77"},
672 {file = "httptools-0.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a7594f9a010cdf1e16a58b3bf26c9da39bbf663e3b8d46d39176999d71816658"},
673 {file = "httptools-0.2.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:01b392a166adcc8bc2f526a939a8aabf89fe079243e1543fd0e7dc1b58d737cb"},
674 {file = "httptools-0.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:80ffa04fe8c8dfacf6e4cef8277347d35b0442c581f5814f3b0cf41b65c43c6e"},
675 {file = "httptools-0.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d5682eeb10cca0606c4a8286a3391d4c3c5a36f0c448e71b8bd05be4e1694bfb"},
676 {file = "httptools-0.2.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a289c27ccae399a70eacf32df9a44059ca2ba4ac444604b00a19a6c1f0809943"},
677 {file = "httptools-0.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:813871f961edea6cb2fe312f2d9b27d12a51ba92545380126f80d0de1917ea15"},
678 {file = "httptools-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:cc9be041e428c10f8b6ab358c6b393648f9457094e1dcc11b4906026d43cd380"},
679 {file = "httptools-0.2.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b08d00d889a118f68f37f3c43e359aab24ee29eb2e3fe96d64c6a2ba8b9d6557"},
680 {file = "httptools-0.2.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fd3b8905e21431ad306eeaf56644a68fdd621bf8f3097eff54d0f6bdf7262065"},
681 {file = "httptools-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:200fc1cdf733a9ff554c0bb97a4047785cfaad9875307d6087001db3eb2b417f"},
682 {file = "httptools-0.2.0.tar.gz", hash = "sha256:94505026be56652d7a530ab03d89474dc6021019d6b8682281977163b3471ea0"},
683]
684idna = [
685 {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"},
686 {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"},
687]
688importlib-metadata = [
689 {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"},
690 {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"},
691]
692jdcal = [
693 {file = "jdcal-1.4.1-py2.py3-none-any.whl", hash = "sha256:1abf1305fce18b4e8aa248cf8fe0c56ce2032392bc64bbd61b5dff2a19ec8bba"},
694 {file = "jdcal-1.4.1.tar.gz", hash = "sha256:472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8"},
695]
696jinja2 = [
697 {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"},
698 {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"},
699]
700lxml = [
701 {file = "lxml-4.6.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2"},
702 {file = "lxml-4.6.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f"},
703 {file = "lxml-4.6.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d"},
704 {file = "lxml-4.6.3-cp27-cp27m-win32.whl", hash = "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106"},
705 {file = "lxml-4.6.3-cp27-cp27m-win_amd64.whl", hash = "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee"},
706 {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f"},
707 {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4"},
708 {file = "lxml-4.6.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51"},
709 {file = "lxml-4.6.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586"},
710 {file = "lxml-4.6.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:4c61b3a0db43a1607d6264166b230438f85bfed02e8cff20c22e564d0faff354"},
711 {file = "lxml-4.6.3-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:5c8c163396cc0df3fd151b927e74f6e4acd67160d6c33304e805b84293351d16"},
712 {file = "lxml-4.6.3-cp35-cp35m-win32.whl", hash = "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2"},
713 {file = "lxml-4.6.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4"},
714 {file = "lxml-4.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4"},
715 {file = "lxml-4.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3"},
716 {file = "lxml-4.6.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d"},
717 {file = "lxml-4.6.3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d916d31fd85b2f78c76400d625076d9124de3e4bda8b016d25a050cc7d603f24"},
718 {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec"},
719 {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:c47ff7e0a36d4efac9fd692cfa33fbd0636674c102e9e8d9b26e1b93a94e7617"},
720 {file = "lxml-4.6.3-cp36-cp36m-win32.whl", hash = "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04"},
721 {file = "lxml-4.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a"},
722 {file = "lxml-4.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654"},
723 {file = "lxml-4.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0"},
724 {file = "lxml-4.6.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3"},
725 {file = "lxml-4.6.3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:36108c73739985979bf302006527cf8a20515ce444ba916281d1c43938b8bb96"},
726 {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2"},
727 {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:cdaf11d2bd275bf391b5308f86731e5194a21af45fbaaaf1d9e8147b9160ea92"},
728 {file = "lxml-4.6.3-cp37-cp37m-win32.whl", hash = "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade"},
729 {file = "lxml-4.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b"},
730 {file = "lxml-4.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa"},
731 {file = "lxml-4.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a"},
732 {file = "lxml-4.6.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927"},
733 {file = "lxml-4.6.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:e1cbd3f19a61e27e011e02f9600837b921ac661f0c40560eefb366e4e4fb275e"},
734 {file = "lxml-4.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791"},
735 {file = "lxml-4.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:1b38116b6e628118dea5b2186ee6820ab138dbb1e24a13e478490c7db2f326ae"},
736 {file = "lxml-4.6.3-cp38-cp38-win32.whl", hash = "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28"},
737 {file = "lxml-4.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7"},
738 {file = "lxml-4.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0"},
739 {file = "lxml-4.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1"},
740 {file = "lxml-4.6.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23"},
741 {file = "lxml-4.6.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:3082c518be8e97324390614dacd041bb1358c882d77108ca1957ba47738d9d59"},
742 {file = "lxml-4.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969"},
743 {file = "lxml-4.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:6f12e1427285008fd32a6025e38e977d44d6382cf28e7201ed10d6c1698d2a9a"},
744 {file = "lxml-4.6.3-cp39-cp39-win32.whl", hash = "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f"},
745 {file = "lxml-4.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83"},
746 {file = "lxml-4.6.3.tar.gz", hash = "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468"},
747]
748markupsafe = [
749 {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"},
750 {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"},
751 {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"},
752 {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"},
753 {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"},
754 {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"},
755 {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"},
756 {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"},
757 {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"},
758 {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"},
759 {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"},
760 {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"},
761 {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"},
762 {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"},
763 {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"},
764 {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"},
765 {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"},
766 {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"},
767 {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"},
768 {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"},
769 {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"},
770 {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"},
771 {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"},
772 {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"},
773 {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"},
774 {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"},
775 {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"},
776 {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"},
777 {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"},
778 {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"},
779 {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"},
780 {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"},
781 {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"},
782 {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"},
783 {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"},
784 {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"},
785 {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"},
786 {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"},
787 {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"},
788 {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"},
789 {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"},
790 {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"},
791 {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"},
792 {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"},
793 {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"},
794 {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"},
795 {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"},
796 {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"},
797 {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"},
798 {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"},
799 {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"},
800 {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"},
801 {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
802 {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
803]
804minicli = [
805 {file = "minicli-0.5.0-py3-none-any.whl", hash = "sha256:c6118c0c6c5678cfc2ad7317dca9bfa8c4da2363337a0adbe526aeeb3007582e"},
806 {file = "minicli-0.5.0.tar.gz", hash = "sha256:baea96017039c0eba448cd07d746eda623be3226367b3a532d3843154bb347ad"},
807]
808multifruits = [
809 {file = "multifruits-0.1.5.tar.gz", hash = "sha256:c5eff8b375121b96a96a0c4bd05cd817ec7e204feadc6c6a211ca16029f78a7f"},
810]
811openpyxl = [
812 {file = "openpyxl-3.0.5-py2.py3-none-any.whl", hash = "sha256:f7d666b569f729257082cf7ddc56262431878f602dcc2bc3980775c59439cdab"},
813 {file = "openpyxl-3.0.5.tar.gz", hash = "sha256:18e11f9a650128a12580a58e3daba14e00a11d9e907c554a17ea016bf1a2c71b"},
814]
815pillow = [
816 {file = "Pillow-8.3.2-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:c691b26283c3a31594683217d746f1dad59a7ae1d4cfc24626d7a064a11197d4"},
817 {file = "Pillow-8.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f514c2717012859ccb349c97862568fdc0479aad85b0270d6b5a6509dbc142e2"},
818 {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be25cb93442c6d2f8702c599b51184bd3ccd83adebd08886b682173e09ef0c3f"},
819 {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d675a876b295afa114ca8bf42d7f86b5fb1298e1b6bb9a24405a3f6c8338811c"},
820 {file = "Pillow-8.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59697568a0455764a094585b2551fd76bfd6b959c9f92d4bdec9d0e14616303a"},
821 {file = "Pillow-8.3.2-cp310-cp310-win32.whl", hash = "sha256:2d5e9dc0bf1b5d9048a94c48d0813b6c96fccfa4ccf276d9c36308840f40c228"},
822 {file = "Pillow-8.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:11c27e74bab423eb3c9232d97553111cc0be81b74b47165f07ebfdd29d825875"},
823 {file = "Pillow-8.3.2-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:11eb7f98165d56042545c9e6db3ce394ed8b45089a67124298f0473b29cb60b2"},
824 {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f23b2d3079522fdf3c09de6517f625f7a964f916c956527bed805ac043799b8"},
825 {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19ec4cfe4b961edc249b0e04b5618666c23a83bc35842dea2bfd5dfa0157f81b"},
826 {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5a31c07cea5edbaeb4bdba6f2b87db7d3dc0f446f379d907e51cc70ea375629"},
827 {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15ccb81a6ffc57ea0137f9f3ac2737ffa1d11f786244d719639df17476d399a7"},
828 {file = "Pillow-8.3.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8f284dc1695caf71a74f24993b7c7473d77bc760be45f776a2c2f4e04c170550"},
829 {file = "Pillow-8.3.2-cp36-cp36m-win32.whl", hash = "sha256:4abc247b31a98f29e5224f2d31ef15f86a71f79c7f4d2ac345a5d551d6393073"},
830 {file = "Pillow-8.3.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a048dad5ed6ad1fad338c02c609b862dfaa921fcd065d747194a6805f91f2196"},
831 {file = "Pillow-8.3.2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:06d1adaa284696785375fa80a6a8eb309be722cf4ef8949518beb34487a3df71"},
832 {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd24054aaf21e70a51e2a2a5ed1183560d3a69e6f9594a4bfe360a46f94eba83"},
833 {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a330bf7014ee034046db43ccbb05c766aa9e70b8d6c5260bfc38d73103b0ba"},
834 {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13654b521fb98abdecec105ea3fb5ba863d1548c9b58831dd5105bb3873569f1"},
835 {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1bd983c565f92779be456ece2479840ec39d386007cd4ae83382646293d681b"},
836 {file = "Pillow-8.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4326ea1e2722f3dc00ed77c36d3b5354b8fb7399fb59230249ea6d59cbed90da"},
837 {file = "Pillow-8.3.2-cp37-cp37m-win32.whl", hash = "sha256:085a90a99404b859a4b6c3daa42afde17cb3ad3115e44a75f0d7b4a32f06a6c9"},
838 {file = "Pillow-8.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:18a07a683805d32826c09acfce44a90bf474e6a66ce482b1c7fcd3757d588df3"},
839 {file = "Pillow-8.3.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4e59e99fd680e2b8b11bbd463f3c9450ab799305d5f2bafb74fefba6ac058616"},
840 {file = "Pillow-8.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d89a2e9219a526401015153c0e9dd48319ea6ab9fe3b066a20aa9aee23d9fd3"},
841 {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fd98c8294f57636084f4b076b75f86c57b2a63a8410c0cd172bc93695ee979"},
842 {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b11c9d310a3522b0fd3c35667914271f570576a0e387701f370eb39d45f08a4"},
843 {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0412516dcc9de9b0a1e0ae25a280015809de8270f134cc2c1e32c4eeb397cf30"},
844 {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bcb04ff12e79b28be6c9988f275e7ab69f01cc2ba319fb3114f87817bb7c74b6"},
845 {file = "Pillow-8.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0b9911ec70731711c3b6ebcde26caea620cbdd9dcb73c67b0730c8817f24711b"},
846 {file = "Pillow-8.3.2-cp38-cp38-win32.whl", hash = "sha256:ce2e5e04bb86da6187f96d7bab3f93a7877830981b37f0287dd6479e27a10341"},
847 {file = "Pillow-8.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:35d27687f027ad25a8d0ef45dd5208ef044c588003cdcedf05afb00dbc5c2deb"},
848 {file = "Pillow-8.3.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:04835e68ef12904bc3e1fd002b33eea0779320d4346082bd5b24bec12ad9c3e9"},
849 {file = "Pillow-8.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10e00f7336780ca7d3653cf3ac26f068fa11b5a96894ea29a64d3dc4b810d630"},
850 {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cde7a4d3687f21cffdf5bb171172070bb95e02af448c4c8b2f223d783214056"},
851 {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c3ff00110835bdda2b1e2b07f4a2548a39744bb7de5946dc8e95517c4fb2ca6"},
852 {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d409030bf3bd05fa66fb5fdedc39c521b397f61ad04309c90444e893d05f7d"},
853 {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bff50ba9891be0a004ef48828e012babaaf7da204d81ab9be37480b9020a82b"},
854 {file = "Pillow-8.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7dbfbc0020aa1d9bc1b0b8bcf255a7d73f4ad0336f8fd2533fcc54a4ccfb9441"},
855 {file = "Pillow-8.3.2-cp39-cp39-win32.whl", hash = "sha256:963ebdc5365d748185fdb06daf2ac758116deecb2277ec5ae98139f93844bc09"},
856 {file = "Pillow-8.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:cc9d0dec711c914ed500f1d0d3822868760954dce98dfb0b7382a854aee55d19"},
857 {file = "Pillow-8.3.2-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2c661542c6f71dfd9dc82d9d29a8386287e82813b0375b3a02983feac69ef864"},
858 {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:548794f99ff52a73a156771a0402f5e1c35285bd981046a502d7e4793e8facaa"},
859 {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b68f565a4175e12e68ca900af8910e8fe48aaa48fd3ca853494f384e11c8bcd"},
860 {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:838eb85de6d9307c19c655c726f8d13b8b646f144ca6b3771fa62b711ebf7624"},
861 {file = "Pillow-8.3.2-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:feb5db446e96bfecfec078b943cc07744cc759893cef045aa8b8b6d6aaa8274e"},
862 {file = "Pillow-8.3.2-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:fc0db32f7223b094964e71729c0361f93db43664dd1ec86d3df217853cedda87"},
863 {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd4fd83aa912d7b89b4b4a1580d30e2a4242f3936882a3f433586e5ab97ed0d5"},
864 {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d0c8ebbfd439c37624db98f3877d9ed12c137cadd99dde2d2eae0dab0bbfc355"},
865 {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cb3dd7f23b044b0737317f892d399f9e2f0b3a02b22b2c692851fb8120d82c6"},
866 {file = "Pillow-8.3.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66566f8a22561fc1a88dc87606c69b84fa9ce724f99522cf922c801ec68f5c1"},
867 {file = "Pillow-8.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ce651ca46d0202c302a535d3047c55a0131a720cf554a578fc1b8a2aff0e7d96"},
868 {file = "Pillow-8.3.2.tar.gz", hash = "sha256:dde3f3ed8d00c72631bc19cbfff8ad3b6215062a5eed402381ad365f82f0c18c"},
869]
870premailer = [
871 {file = "premailer-3.10.0-py2.py3-none-any.whl", hash = "sha256:021b8196364d7df96d04f9ade51b794d0b77bcc19e998321c515633a2273be1a"},
872 {file = "premailer-3.10.0.tar.gz", hash = "sha256:d1875a8411f5dc92b53ef9f193db6c0f879dc378d618e0ad292723e388bfe4c2"},
873]
874pycparser = [
875 {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"},
876 {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"},
877]
878pyjwt = [
879 {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"},
880 {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"},
881]
882pyphen = [
883 {file = "pyphen-0.11.0-py3-none-any.whl", hash = "sha256:e3c1b1d05deaa31acdd78e2e24005402358feb7a4b407c4af7e5cc2e41c4d608"},
884 {file = "pyphen-0.11.0.tar.gz", hash = "sha256:e2c3ed82c3a04317df5102addafe89652b0876bc6c6265f5dd4c3efaf02315e8"},
885]
886python-dateutil = [
887 {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
888 {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
889]
890python-slugify = [
891 {file = "python-slugify-4.0.1.tar.gz", hash = "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270"},
892]
893pyyaml = [
894 {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"},
895 {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"},
896 {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"},
897 {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"},
898 {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"},
899 {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"},
900 {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"},
901 {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"},
902 {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"},
903 {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"},
904 {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"},
905 {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"},
906 {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"},
907]
908requests = [
909 {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
910 {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"},
911]
912roll = [
913 {file = "roll-0.13.0-py3-none-any.whl", hash = "sha256:a9a833c791167406599f4a234c7b244e074e9e1c796f94adf99bde2894730684"},
914 {file = "roll-0.13.0.tar.gz", hash = "sha256:5847d408bc74ec495d55fe7b482b4d780f88fc6ab56c0bef49336d3fa078e050"},
915]
916six = [
917 {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
918 {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
919]
920text-unidecode = [
921 {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"},
922 {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"},
923]
924tinycss2 = [
925 {file = "tinycss2-1.1.0-py3-none-any.whl", hash = "sha256:0353b5234bcaee7b1ac7ca3dea7e02cd338a9f8dcbb8f2dcd32a5795ec1e5f9a"},
926 {file = "tinycss2-1.1.0.tar.gz", hash = "sha256:fbdcac3044d60eb85fdb2aa840ece43cf7dbe798e373e6ee0be545d4d134e18a"},
927]
928typing-extensions = [
929 {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"},
930 {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"},
931 {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"},
932]
933ujson = [
934 {file = "ujson-3.2.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:437e051a3e292ddbd5b4682f9b6c3e2ea4cd059d0d75bc9f8314349d63cbb015"},
935 {file = "ujson-3.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a27ea44406100a97fb0fcc0b18dcdaf324824e722a00856a2992fafc65779351"},
936 {file = "ujson-3.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6f7c24dabb0ff0ff43744d18211af6035ef37197f530c13edf704e627da7251d"},
937 {file = "ujson-3.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:5ae6f599ef7c01ef626697f9e15e9d4e2a186ab4c0593ddb529b86866b562efb"},
938 {file = "ujson-3.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:59048958793e0b0489449a414e2fbe54644457be1dd882b99a4fe16158632af1"},
939 {file = "ujson-3.2.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a476525862a394018a7a3438c86596815b84518b2744184444fc6f8b0e3e4aee"},
940 {file = "ujson-3.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:2050c7f1ce72055f1b6fba29e4694ccf4509917d3be3ed6f3543ef3ff00eec4a"},
941 {file = "ujson-3.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fda324ca055e671eae46e8fc32b46fab20eb251d3e6e22beb67f71f1d240b0b4"},
942 {file = "ujson-3.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0bdc62a1543d697e9c649ac0ac41e0d076a7b886d6b45f9f21971e25b90a2b27"},
943 {file = "ujson-3.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d0ad63fc88d4e4cb7630f59aacd742256804a4cee447e9589e55957107a469b7"},
944 {file = "ujson-3.2.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:66d47eabb4f0e12b5784b1a49c59bc6f32e91e18e02f2a43c5e91e2f6ad9cc60"},
945 {file = "ujson-3.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:253edfe274538bb1060ab8877d51fc75e416047d5fab5340454a48b971f30612"},
946 {file = "ujson-3.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6ee651c0210a67e3a72367de53ccac83b623913214e7c75015caadfad2b7e0dc"},
947 {file = "ujson-3.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:0784f35f2ace41ed55c435ee11f9d9877cf3e6ff03c8850f87504cb93e9a9469"},
948 {file = "ujson-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:812748c8de041f1ef5e9b37f33121c0c7390055fa5f12215b3d06a63b1c055a2"},
949 {file = "ujson-3.2.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:17460d88dd4b9630e449e5d29b97301e6dbbbedbf46a6f95f3b2cb7e1333e6ea"},
950 {file = "ujson-3.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2d50cb3d87d4aabe6dbeb6ef79025bf9fdf350c4355c24819dc5c5cc38bad3dc"},
951 {file = "ujson-3.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7060105de892cada2f01bd072d33b2421b4eefd32536207c1c9f2ade18656139"},
952 {file = "ujson-3.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7b6496b3e2bc396628f114fd96ec41655b10c84adececc0ef8cf1c2329dae36c"},
953 {file = "ujson-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:782bdf016da793a3bf138e50ed973428e59006b8d73a9e1911bc6207c6b79fff"},
954 {file = "ujson-3.2.0.tar.gz", hash = "sha256:abb1996ba1c1d2faf5b1e38efa97da7f64e5373a31f705b96fe0587f5f778db4"},
955]
956urllib3 = [
957 {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"},
958 {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
959]
960weasyprint = [
961 {file = "WeasyPrint-51-py3-none-any.whl", hash = "sha256:469974f6e74b1eef71dc56a9b80cc17621f319234d2a4ab656ddd0fd9e66c27f"},
962 {file = "WeasyPrint-51.tar.gz", hash = "sha256:b3e971973a4f03c1430e6b838b75b5b57630415fcae8666d2be1347630ff6d6a"},
963]
964webencodings = [
965 {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"},
966 {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
967]
968websockets = [
969 {file = "websockets-8.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:3762791ab8b38948f0c4d281c8b2ddfa99b7e510e46bd8dfa942a5fff621068c"},
970 {file = "websockets-8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3db87421956f1b0779a7564915875ba774295cc86e81bc671631379371af1170"},
971 {file = "websockets-8.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4f9f7d28ce1d8f1295717c2c25b732c2bc0645db3215cf757551c392177d7cb8"},
972 {file = "websockets-8.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:295359a2cc78736737dd88c343cd0747546b2174b5e1adc223824bcaf3e164cb"},
973 {file = "websockets-8.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1d3f1bf059d04a4e0eb4985a887d49195e15ebabc42364f4eb564b1d065793f5"},
974 {file = "websockets-8.1-cp36-cp36m-win32.whl", hash = "sha256:2db62a9142e88535038a6bcfea70ef9447696ea77891aebb730a333a51ed559a"},
975 {file = "websockets-8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5"},
976 {file = "websockets-8.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:9b248ba3dd8a03b1a10b19efe7d4f7fa41d158fdaa95e2cf65af5a7b95a4f989"},
977 {file = "websockets-8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ce85b06a10fc65e6143518b96d3dca27b081a740bae261c2fb20375801a9d56d"},
978 {file = "websockets-8.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:965889d9f0e2a75edd81a07592d0ced54daa5b0785f57dc429c378edbcffe779"},
979 {file = "websockets-8.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:751a556205d8245ff94aeef23546a1113b1dd4f6e4d102ded66c39b99c2ce6c8"},
980 {file = "websockets-8.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3ef56fcc7b1ff90de46ccd5a687bbd13a3180132268c4254fc0fa44ecf4fc422"},
981 {file = "websockets-8.1-cp37-cp37m-win32.whl", hash = "sha256:7ff46d441db78241f4c6c27b3868c9ae71473fe03341340d2dfdbe8d79310acc"},
982 {file = "websockets-8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:20891f0dddade307ffddf593c733a3fdb6b83e6f9eef85908113e628fa5a8308"},
983 {file = "websockets-8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c1ec8db4fac31850286b7cd3b9c0e1b944204668b8eb721674916d4e28744092"},
984 {file = "websockets-8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5c01fd846263a75bc8a2b9542606927cfad57e7282965d96b93c387622487485"},
985 {file = "websockets-8.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9bef37ee224e104a413f0780e29adb3e514a5b698aabe0d969a6ba426b8435d1"},
986 {file = "websockets-8.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d705f8aeecdf3262379644e4b55107a3b55860eb812b673b28d0fbc347a60c55"},
987 {file = "websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c8a116feafdb1f84607cb3b14aa1418424ae71fee131642fc568d21423b51824"},
988 {file = "websockets-8.1-cp38-cp38-win32.whl", hash = "sha256:e898a0863421650f0bebac8ba40840fc02258ef4714cb7e1fd76b6a6354bda36"},
989 {file = "websockets-8.1-cp38-cp38-win_amd64.whl", hash = "sha256:f8a7bff6e8664afc4e6c28b983845c5bc14965030e3fb98789734d416af77c4b"},
990 {file = "websockets-8.1.tar.gz", hash = "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f"},
991]
992zipp = [
993 {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"},
994 {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"},
995]
diff --git a/flakes/copanier/pyproject.toml b/flakes/copanier/pyproject.toml
new file mode 100644
index 0000000..ba487ae
--- /dev/null
+++ b/flakes/copanier/pyproject.toml
@@ -0,0 +1,40 @@
1[tool.poetry]
2name = "copanier"
3version = "0.0.4"
4description = ""
5authors = ["Your Name <you@example.com>"]
6
7[tool.poetry.dependencies]
8python = "^3.7"
9Jinja2 = "2.11.2"
10openpyxl = "3.0.5"
11PyJWT = "1.7.1"
12PyYAML = "5.3.1"
13roll = "0.13.0"
14ujson = "3.2.0"
15minicli = "0.5.0"
16python-slugify = "4.0.1"
17debts = "0.5"
18emails = "0.6"
19Weasyprint = "51"
20
21#[tool.poetry.dev-dependencies]
22#hupper = "1.10.2"
23#minicli = "0.5.0"
24#usine = "0.2.3"
25#
26#[tool.poetry.group.test.dependencies]
27#pyquery = "1.4.1"
28#pytest = "6.0.2"
29#pytest-asyncio = "0.14.0"
30#
31#[tool.poetry.group.prod.dependencies]
32#gunicorn = "20.0.4"
33#uvloop = "0.14.0"
34
35[tool.poetry.scripts]
36copanier = 'copanier:main'
37
38[build-system]
39requires = ["poetry-core>=1.0.0"]
40build-backend = "poetry.core.masonry.api"
diff --git a/flakes/diaspora/default.nix b/flakes/diaspora/default.nix
new file mode 100644
index 0000000..f4038ad
--- /dev/null
+++ b/flakes/diaspora/default.nix
@@ -0,0 +1,74 @@
1{ ldap ? false, varDir ? "/var/lib/diaspora", podmin_email ? null, config_dir ? "/etc/diaspora",
2 src, stdenv, bundlerEnv, writeText,
3 cacert, defaultGemConfig, perl, ruby_2_4, nodejs, which, git }:
4let
5 diaspora_src = stdenv.mkDerivation {
6 inherit (src) version;
7 pname = "diaspora";
8 inherit src;
9 buildPhase = ''
10 ${if ldap then "patch -p1 < ${./ldap.patch}" else ""}
11 # FIXME: bundlerEnv below doesn't take postgresql group for some
12 # reason
13 echo 'gem "pg", "1.1.3"' >> Gemfile
14 '';
15 installPhase = ''
16 cp -a . $out
17 '';
18 };
19 gems = bundlerEnv {
20 name = "diaspora-env";
21 gemfile = "${diaspora_src}/Gemfile";
22 lockfile = "${diaspora_src}/Gemfile.lock";
23 gemset = if ldap then ./gemset_ldap.nix else ./gemset.nix;
24 groups = [ "postgresql" "default" "production" ];
25 gemConfig = defaultGemConfig // {
26 kostya-sigar = attrs: {
27 buildInputs = [ perl ];
28 };
29 };
30 };
31 build_config = writeText "diaspora.yml" ''
32 configuration:
33 environment:
34 certificate_authorities: '${cacert}/etc/ssl/certs/ca-bundle.crt'
35 ${if podmin_email != null then ''
36 # dummy comment for indentation
37 admins:
38 podmin_email: '${podmin_email}'
39 '' else ""}
40 production:
41 environment:
42 '';
43 dummy_token = writeText "secret_token.rb" ''
44 Diaspora::Application.config.secret_key_base = 'dummy'
45 '';
46 diaspora = stdenv.mkDerivation {
47 name = "diaspora";
48 version = src.version;
49 inherit diaspora_src;
50 builder = writeText "build_diaspora" ''
51 source $stdenv/setup
52 cp -a $diaspora_src $out
53 cd $out
54 chmod -R u+rwX .
55 tar -czf public/source.tar.gz ./{app,db,lib,script,Gemfile,Gemfile.lock,Rakefile,config.ru}
56 ln -s database.yml.example config/database.yml
57 ln -s ${build_config} config/diaspora.yml
58 ln -s ${dummy_token} config/initializers/secret_token.rb
59 ln -sf ${varDir}/schedule.yml config/schedule.yml
60 ln -sf ${varDir}/oidc_key.pem config/oidc_key.pem
61 ln -sf ${varDir}/uploads public/uploads
62 RAILS_ENV=production ${gems}/bin/rake assets:precompile
63 ln -sf ${config_dir}/database.yml config/database.yml
64 ln -sf ${config_dir}/diaspora.yml config/diaspora.yml
65 ln -sf ${config_dir}/secret_token.rb config/initializers/secret_token.rb
66 rm -rf tmp log
67 ln -sf ${varDir}/tmp tmp
68 ln -sf ${varDir}/log log
69 '';
70 propagatedBuildInputs = [ gems nodejs which git ];
71 passthru = { inherit gems varDir; };
72 };
73in
74 diaspora
diff --git a/flakes/diaspora/flake.lock b/flakes/diaspora/flake.lock
new file mode 100644
index 0000000..3af470f
--- /dev/null
+++ b/flakes/diaspora/flake.lock
@@ -0,0 +1,75 @@
1{
2 "nodes": {
3 "diaspora": {
4 "flake": false,
5 "locked": {
6 "lastModified": 1551139311,
7 "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
8 "owner": "diaspora",
9 "repo": "diaspora",
10 "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
11 "type": "github"
12 },
13 "original": {
14 "owner": "diaspora",
15 "ref": "v0.7.10.0",
16 "repo": "diaspora",
17 "type": "github"
18 }
19 },
20 "flake-utils": {
21 "locked": {
22 "lastModified": 1648297722,
23 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
24 "owner": "numtide",
25 "repo": "flake-utils",
26 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
27 "type": "github"
28 },
29 "original": {
30 "owner": "numtide",
31 "repo": "flake-utils",
32 "type": "github"
33 }
34 },
35 "myuids": {
36 "locked": {
37 "lastModified": 1,
38 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
39 "path": "../myuids",
40 "type": "path"
41 },
42 "original": {
43 "path": "../myuids",
44 "type": "path"
45 }
46 },
47 "nixpkgs": {
48 "flake": false,
49 "locked": {
50 "lastModified": 1596265691,
51 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
52 "owner": "NixOS",
53 "repo": "nixpkgs",
54 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
55 "type": "github"
56 },
57 "original": {
58 "owner": "NixOS",
59 "repo": "nixpkgs",
60 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
61 "type": "github"
62 }
63 },
64 "root": {
65 "inputs": {
66 "diaspora": "diaspora",
67 "flake-utils": "flake-utils",
68 "myuids": "myuids",
69 "nixpkgs": "nixpkgs"
70 }
71 }
72 },
73 "root": "root",
74 "version": 7
75}
diff --git a/flakes/diaspora/flake.nix b/flakes/diaspora/flake.nix
new file mode 100644
index 0000000..21b05d6
--- /dev/null
+++ b/flakes/diaspora/flake.nix
@@ -0,0 +1,214 @@
1{
2 description = "A privacy-aware, distributed, open source social network.";
3 inputs.myuids = {
4 url = "path:../myuids";
5 };
6 inputs.flake-utils.url = "github:numtide/flake-utils";
7 inputs.nixpkgs = {
8 url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
9 flake = false;
10 };
11 inputs.diaspora = {
12 url = "github:diaspora/diaspora/v0.7.10.0";
13 flake = false;
14 };
15
16 outputs = { self, myuids, nixpkgs, diaspora, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
17 let
18 pkgs = import nixpkgs { inherit system; overlays = []; };
19 version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.diaspora.original.ref;
20 inherit (pkgs) callPackage;
21 in rec {
22 packages.diaspora = callPackage ./. { src = diaspora // { inherit version; }; };
23 defaultPackage = packages.diaspora;
24 legacyPackages.diaspora = packages.diaspora;
25 checks = {
26 build = defaultPackage;
27 };
28 }
29 ) // rec {
30 overlays = {
31 diaspora = final: prev: {
32 diaspora = self.defaultPackage."${final.system}";
33 };
34 };
35 overlay = overlays.diaspora;
36 nixosModule = { lib, pkgs, config, ... }:
37 let
38 name = "diaspora";
39 cfg = config.services.diaspora;
40
41 uid = config.ids.uids.diaspora;
42 gid = config.ids.gids.diaspora;
43 in
44 {
45 options.services.diaspora = {
46 enable = lib.mkEnableOption "Enable Diaspora’s service";
47 user = lib.mkOption {
48 type = lib.types.str;
49 default = name;
50 description = "User account under which Diaspora runs";
51 };
52 group = lib.mkOption {
53 type = lib.types.str;
54 default = name;
55 description = "Group under which Diaspora runs";
56 };
57 adminEmail = lib.mkOption {
58 type = lib.types.str;
59 example = "admin@example.com";
60 description = "Admin e-mail for Diaspora";
61 };
62 dataDir = lib.mkOption {
63 type = lib.types.path;
64 default = "/var/lib/${name}";
65 description = ''
66 The directory where Diaspora stores its data.
67 '';
68 };
69 socketsDir = lib.mkOption {
70 type = lib.types.path;
71 default = "/run/${name}";
72 description = ''
73 The directory where Diaspora puts runtime files and sockets.
74 '';
75 };
76 configDir = lib.mkOption {
77 type = lib.types.path;
78 description = ''
79 The configuration path for Diaspora.
80 '';
81 };
82 package = lib.mkOption {
83 type = lib.types.package;
84 default = pkgs.diaspora;
85 description = ''
86 Diaspora package to use.
87 '';
88 };
89 withLdap = lib.mkEnableOption "Add ldap patch";
90 # Output variables
91 systemdStateDirectory = lib.mkOption {
92 type = lib.types.str;
93 # Use ReadWritePaths= instead if varDir is outside of /var/lib
94 default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
95 lib.strings.removePrefix "/var/lib/" cfg.dataDir;
96 description = ''
97 Adjusted Diaspora data directory for systemd
98 '';
99 readOnly = true;
100 };
101 systemdRuntimeDirectory = lib.mkOption {
102 type = lib.types.str;
103 # Use ReadWritePaths= instead if socketsDir is outside of /run
104 default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
105 lib.strings.removePrefix "/run/" cfg.socketsDir;
106 description = ''
107 Adjusted Diaspora sockets directory for systemd
108 '';
109 readOnly = true;
110 };
111 workdir = lib.mkOption {
112 type = lib.types.package;
113 default = cfg.package.override {
114 varDir = cfg.dataDir;
115 podmin_email = cfg.adminEmail;
116 config_dir = cfg.configDir;
117 ldap = cfg.withLdap;
118 };
119 description = ''
120 Adjusted diaspora package with overriden values
121 '';
122 readOnly = true;
123 };
124 sockets = lib.mkOption {
125 type = lib.types.attrsOf lib.types.path;
126 default = {
127 rails = "${cfg.socketsDir}/diaspora.sock";
128 eye = "${cfg.socketsDir}/eye.sock";
129 };
130 readOnly = true;
131 description = ''
132 Diaspora sockets
133 '';
134 };
135 pids = lib.mkOption {
136 type = lib.types.attrsOf lib.types.path;
137 default = {
138 eye = "${cfg.socketsDir}/eye.pid";
139 };
140 readOnly = true;
141 description = ''
142 Diaspora pids
143 '';
144 };
145 };
146
147 config = lib.mkIf cfg.enable {
148 nixpkgs.overlays = [ self.overlay ];
149 users.users = lib.optionalAttrs (cfg.user == name) {
150 "${name}" = {
151 uid = myuids.lib.uids.diaspora;
152 group = cfg.group;
153 description = "Diaspora user";
154 home = cfg.dataDir;
155 packages = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby ];
156 useDefaultShell = true;
157 };
158 };
159 users.groups = lib.optionalAttrs (cfg.group == name) {
160 "${name}" = {
161 gid = myuids.lib.gids.diaspora;
162 };
163 };
164
165 systemd.services.diaspora = {
166 description = "Diaspora";
167 wantedBy = [ "multi-user.target" ];
168 after = [
169 "network.target" "redis.service" "postgresql.service"
170 ];
171 wants = [
172 "redis.service" "postgresql.service"
173 ];
174
175 environment.RAILS_ENV = "production";
176 environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
177 environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
178 environment.EYE_SOCK = cfg.sockets.eye;
179 environment.EYE_PID = cfg.pids.eye;
180
181 path = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby pkgs.curl pkgs.which pkgs.gawk ];
182
183 preStart = ''
184 install -m 0755 -d ${cfg.dataDir}/uploads ${cfg.dataDir}/tmp ${cfg.dataDir}/log
185 install -m 0700 -d ${cfg.dataDir}/tmp/pids
186 if [ ! -f ${cfg.dataDir}/schedule.yml ]; then
187 echo "{}" > ${cfg.dataDir}/schedule.yml
188 fi
189 ./bin/bundle exec rails db:migrate
190 '';
191
192 script = ''
193 exec ${cfg.workdir}/script/server
194 '';
195
196 serviceConfig = {
197 User = cfg.user;
198 PrivateTmp = true;
199 Restart = "always";
200 Type = "simple";
201 WorkingDirectory = cfg.workdir;
202 StateDirectory = cfg.systemdStateDirectory;
203 RuntimeDirectory = cfg.systemdRuntimeDirectory;
204 StandardInput = "null";
205 KillMode = "control-group";
206 };
207
208 unitConfig.RequiresMountsFor = cfg.dataDir;
209 };
210 };
211 };
212 };
213}
214
diff --git a/pkgs/webapps/diaspora/gemset.nix b/flakes/diaspora/gemset.nix
index e47f5b7..e47f5b7 100644
--- a/pkgs/webapps/diaspora/gemset.nix
+++ b/flakes/diaspora/gemset.nix
diff --git a/pkgs/webapps/diaspora/gemset_ldap.nix b/flakes/diaspora/gemset_ldap.nix
index d7892f8..d7892f8 100644
--- a/pkgs/webapps/diaspora/gemset_ldap.nix
+++ b/flakes/diaspora/gemset_ldap.nix
diff --git a/pkgs/webapps/diaspora/ldap.patch b/flakes/diaspora/ldap.patch
index 3d4f785..3d4f785 100644
--- a/pkgs/webapps/diaspora/ldap.patch
+++ b/flakes/diaspora/ldap.patch
diff --git a/flakes/etherpad-lite/default.nix b/flakes/etherpad-lite/default.nix
new file mode 100644
index 0000000..1dd5aa4
--- /dev/null
+++ b/flakes/etherpad-lite/default.nix
@@ -0,0 +1,68 @@
1{ varDir ? "/var/lib/etherpad-lite" # if you override this change the StateDirectory in service file too!
2, nodeEnv, stdenv, callPackage, src, lib, nodejs }:
3let
4 moduleNames = [
5 "ep_aa_file_menu_toolbar" "ep_adminpads" "ep_align" "ep_bookmark"
6 "ep_clear_formatting" "ep_colors" "ep_comments_page"
7 "ep_copy_paste_select_all" "ep_cursortrace" "ep_delete_empty_pads"
8 "ep_embedmedia" "ep_font_family" "ep_font_size" "ep_headings2"
9 "ep_immae_buttons" "ep_ldapauth" "ep_line_height" "ep_markdown"
10 "ep_mypads" "ep_page_view" "ep_previewimages" "ep_ruler"
11 "ep_scrollto" "ep_set_title_on_pad" "ep_subscript_and_superscript"
12 "ep_timesliderdiff"
13 ];
14 # nix files are built using node2nix -i node-packages.json
15 allModules = lib.attrsets.genAttrs moduleNames
16 (name: (callPackage (./modules + "/${name}/node-packages.nix") { nodeEnv = callPackage nodeEnv {}; }).${name});
17 toPassthru = pkg: moduleNames: {
18 inherit varDir allModules nodejs moduleNames;
19 withModules = withModules pkg;
20 };
21 withModules = pkg: toModules:
22 let
23 modules = toModules allModules;
24 toInstallModule = n: ''
25 cp -a ${n}/lib/node_modules/${n.packageName} $out/node_modules
26 if [ ! -f $out/node_modules/${n.packageName}/.ep_initialized ]; then
27 chmod u+w $out/node_modules/${n.packageName}/
28 ln -s ${varDir}/ep_initialized/${n.packageName} $out/node_modules/${n.packageName}/.ep_initialized
29 fi
30 '';
31 modulesNames = map (n: n.packageName) modules;
32 newEtherpad = pkg.overrideAttrs(old: {
33 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallModule modules);
34 passthru = toPassthru newEtherpad moduleNames;
35 });
36 in newEtherpad;
37 # built using node2nix -l package-lock.json
38 # and changing "./." to "src"
39 node-environment = (callPackage ./node-packages.nix {
40 nodeEnv = callPackage nodeEnv {};
41 src = stdenv.mkDerivation {
42 pname = "etherpad-lite";
43 version = src.version;
44 inherit src;
45 patches = [ ./libreoffice_patch.diff ];
46 buildPhase = ''
47 touch src/.ep_initialized
48 '';
49 installPhase = ''
50 cp -a src/ $out
51 '';
52 };
53 }).package;
54 package = stdenv.mkDerivation rec {
55 name = "etherpad-lite-${src.version}";
56 src = node-environment;
57 version = src.version;
58 installPhase = ''
59 mkdir -p $out
60 mkdir $out/node_modules
61 cp -a lib/node_modules/ep_etherpad-lite $out/src
62 chmod u+w $out/src/static/js/
63 ln -s ../src $out/node_modules/ep_etherpad-lite
64 ln -s ${varDir}/var $out/var
65 '';
66 passthru = toPassthru package [];
67 };
68in package
diff --git a/flakes/etherpad-lite/etherpad_cleanup.sql b/flakes/etherpad-lite/etherpad_cleanup.sql
new file mode 100644
index 0000000..4002715
--- /dev/null
+++ b/flakes/etherpad-lite/etherpad_cleanup.sql
@@ -0,0 +1,30 @@
1DO $$
2 DECLARE todelete record;
3 BEGIN
4 FOR todelete IN
5 select split_part(key, ':', 4) as k from store where key like 'mypads:jobqueue:deletePad:%'
6 LOOP
7 select * from store where key in (select 'readonly2pad:' || split_part(value, '"', 2) from store where key = 'pad2readonly:' || todelete.k);
8 select * from store where key = 'pad2readonly:' || todelete.k;
9 select * from store where key like 'pad:' || todelete.k || ':revs:%';
10 select * from store where key like 'pad:' || todelete.k || ':chats:%';
11 END LOOP;
12 END $$
13
14-- /nix/store/1i77431p6996lbyflpkb803zsiaj24kx-etherpad-lite-1.8.3/node_modules/ep_mypads/scripts/mypads-jobqueue-minion.js
15for toDelete in
16 select split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%'
17loop
18 select * from store where key in (select 'readonly2pad:' || split_part(value, '"', 2) from store where key = 'pad2readonly:' || toDelete);
19 select * from store where key = 'pad2readonly:' || toDelete;
20 select * from store where key like 'pad:' || toDelete || ':revs:%';
21 select * from store where key like 'pad:' || toDelete || ':chats:%';
22end loop
23--select * from store where key in (select 'pad2readonly:' || split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%');
24--
25--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:%'))
26--delete from store where key in (select 'pad2readonly:' || split_part(key, ':', 4) from store where key like 'mypads:jobqueue:deletePad:%');
27--delete from store where key like any(select 'pad:' || split_part(key, ':', 4) || ':revs:%' from store where key like 'mypads:jobqueue:deletePad:%');
28--delete from store where key like any(select 'pad:' || split_part(key, ':', 4) || ':chats:%' from store where key like 'mypads:jobqueue:deletePad:%');
29--delete from store where key like 'mypads:jobqueue:deletePad:%';
30
diff --git a/flakes/etherpad-lite/flake.lock b/flakes/etherpad-lite/flake.lock
new file mode 100644
index 0000000..19d9ffa
--- /dev/null
+++ b/flakes/etherpad-lite/flake.lock
@@ -0,0 +1,150 @@
1{
2 "nodes": {
3 "etherpad-lite": {
4 "flake": false,
5 "locked": {
6 "lastModified": 1587951095,
7 "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
8 "owner": "ether",
9 "repo": "etherpad-lite",
10 "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
11 "type": "github"
12 },
13 "original": {
14 "owner": "ether",
15 "ref": "1.8.3",
16 "repo": "etherpad-lite",
17 "type": "github"
18 }
19 },
20 "flake-parts": {
21 "inputs": {
22 "nixpkgs-lib": "nixpkgs-lib"
23 },
24 "locked": {
25 "lastModified": 1675295133,
26 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
27 "owner": "hercules-ci",
28 "repo": "flake-parts",
29 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
30 "type": "github"
31 },
32 "original": {
33 "owner": "hercules-ci",
34 "repo": "flake-parts",
35 "type": "github"
36 }
37 },
38 "flake-utils": {
39 "locked": {
40 "lastModified": 1648297722,
41 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
42 "owner": "numtide",
43 "repo": "flake-utils",
44 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
45 "type": "github"
46 },
47 "original": {
48 "owner": "numtide",
49 "repo": "flake-utils",
50 "type": "github"
51 }
52 },
53 "mypackages": {
54 "inputs": {
55 "flake-parts": "flake-parts",
56 "nixpkgs": "nixpkgs",
57 "webapps-ttrss": "webapps-ttrss"
58 },
59 "locked": {
60 "lastModified": 1,
61 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
62 "path": "../mypackages",
63 "type": "path"
64 },
65 "original": {
66 "path": "../mypackages",
67 "type": "path"
68 }
69 },
70 "nixpkgs": {
71 "locked": {
72 "lastModified": 1646497237,
73 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
74 "owner": "nixos",
75 "repo": "nixpkgs",
76 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
77 "type": "github"
78 },
79 "original": {
80 "owner": "nixos",
81 "repo": "nixpkgs",
82 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
83 "type": "github"
84 }
85 },
86 "nixpkgs-lib": {
87 "locked": {
88 "dir": "lib",
89 "lastModified": 1675183161,
90 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
91 "owner": "NixOS",
92 "repo": "nixpkgs",
93 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
94 "type": "github"
95 },
96 "original": {
97 "dir": "lib",
98 "owner": "NixOS",
99 "ref": "nixos-unstable",
100 "repo": "nixpkgs",
101 "type": "github"
102 }
103 },
104 "nixpkgs_2": {
105 "flake": false,
106 "locked": {
107 "lastModified": 1596265691,
108 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
109 "owner": "NixOS",
110 "repo": "nixpkgs",
111 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
112 "type": "github"
113 },
114 "original": {
115 "owner": "NixOS",
116 "repo": "nixpkgs",
117 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
118 "type": "github"
119 }
120 },
121 "root": {
122 "inputs": {
123 "etherpad-lite": "etherpad-lite",
124 "flake-utils": "flake-utils",
125 "mypackages": "mypackages",
126 "nixpkgs": "nixpkgs_2"
127 }
128 },
129 "webapps-ttrss": {
130 "flake": false,
131 "locked": {
132 "lastModified": 1546759381,
133 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
134 "ref": "master",
135 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
136 "revCount": 9256,
137 "type": "git",
138 "url": "https://git.tt-rss.org/fox/tt-rss.git"
139 },
140 "original": {
141 "ref": "master",
142 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
143 "type": "git",
144 "url": "https://git.tt-rss.org/fox/tt-rss.git"
145 }
146 }
147 },
148 "root": "root",
149 "version": 7
150}
diff --git a/flakes/etherpad-lite/flake.nix b/flakes/etherpad-lite/flake.nix
new file mode 100644
index 0000000..6e0d7db
--- /dev/null
+++ b/flakes/etherpad-lite/flake.nix
@@ -0,0 +1,227 @@
1{
2 description = "Your self-hosted, globally interconnected microblogging community";
3 inputs.flake-utils.url = "github:numtide/flake-utils";
4 inputs.nixpkgs = {
5 url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
6 flake = false;
7 };
8 inputs.etherpad-lite = {
9 url = "github:ether/etherpad-lite/1.8.3";
10 flake = false;
11 };
12 inputs.mypackages.url = "path:../mypackages";
13
14 outputs = { self, nixpkgs, etherpad-lite, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
15 let
16 pkgs = import nixpkgs { inherit system; overlays = []; };
17 version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.etherpad-lite.original.ref;
18 inherit (pkgs) callPackage;
19 in rec {
20 packages.etherpad-lite = callPackage ./. { inherit (mypackages.mylibs) nodeEnv; src = etherpad-lite // { inherit version; }; };
21 defaultPackage = packages.etherpad-lite;
22 legacyPackages.etherpad-lite = packages.etherpad-lite;
23 checks = {
24 build = defaultPackage;
25 };
26 }
27 ) // rec {
28 overlays = {
29 etherpad-lite = final: prev: {
30 etherpad-lite = self.defaultPackage."${final.system}";
31 };
32 };
33 overlay = overlays.etherpad-lite;
34 nixosModule = { lib, pkgs, config, ... }:
35 let
36 name = "etherpad-lite";
37 cfg = config.services.etherpad-lite;
38 in
39 {
40 options.services.etherpad-lite = {
41 enable = lib.mkEnableOption "Enable Etherpad lite’s service";
42 user = lib.mkOption {
43 type = lib.types.str;
44 default = name;
45 description = "User account under which Etherpad lite runs";
46 };
47 group = lib.mkOption {
48 type = lib.types.str;
49 default = name;
50 description = "Group under which Etherpad lite runs";
51 };
52 dataDir = lib.mkOption {
53 type = lib.types.path;
54 default = "/var/lib/${name}";
55 description = ''
56 The directory where Etherpad lite stores its data.
57 '';
58 };
59 socketsDir = lib.mkOption {
60 type = lib.types.path;
61 default = "/run/${name}";
62 description = ''
63 The directory where Etherpad lite stores its sockets.
64 '';
65 };
66 configFile = lib.mkOption {
67 type = lib.types.path;
68 description = ''
69 The config file path for Etherpad lite.
70 '';
71 };
72 sessionKeyFile = lib.mkOption {
73 type = lib.types.path;
74 description = ''
75 The Session key file path for Etherpad lite.
76 '';
77 };
78 apiKeyFile = lib.mkOption {
79 type = lib.types.path;
80 description = ''
81 The API key file path for Etherpad lite.
82 '';
83 };
84 package = lib.mkOption {
85 type = lib.types.package;
86 default = pkgs.etherpad-lite;
87 description = ''
88 Etherpad lite package to use.
89 '';
90 example = lib.literalExample ''
91 pkgs.webapps.etherpad-lite.withModules (p: [ p.ep_align ]);
92 '';
93 };
94 modules = lib.mkOption {
95 type = lib.types.listOf lib.types.package;
96 default = [];
97 description = ''
98 Etherpad lite modules to use.
99 DEPRECATED: use package directly
100 '';
101 };
102 # Output variables
103 workdir = lib.mkOption {
104 type = lib.types.package;
105 default = cfg.package.withModules (_: cfg.modules);
106 description = ''
107 Adjusted Etherpad lite package with plugins
108 '';
109 readOnly = true;
110 };
111 systemdStateDirectory = lib.mkOption {
112 type = lib.types.str;
113 # Use ReadWritePaths= instead if varDir is outside of /var/lib
114 default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
115 lib.strings.removePrefix "/var/lib/" cfg.dataDir;
116 description = ''
117 Adjusted Etherpad lite data directory for systemd
118 '';
119 readOnly = true;
120 };
121 systemdRuntimeDirectory = lib.mkOption {
122 type = lib.types.str;
123 # Use ReadWritePaths= instead if socketsDir is outside of /run
124 default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
125 lib.strings.removePrefix "/run/" cfg.socketsDir;
126 description = ''
127 Adjusted Etherpad lite sockets directory for systemd
128 '';
129 readOnly = true;
130 };
131 sockets = lib.mkOption {
132 type = lib.types.attrsOf lib.types.path;
133 default = {
134 node = "${cfg.socketsDir}/etherpad-lite.sock";
135 };
136 readOnly = true;
137 description = ''
138 Etherpad lite sockets
139 '';
140 };
141 };
142
143 config = lib.mkIf cfg.enable {
144 nixpkgs.overlays = [ self.overlay ];
145 systemd.services.etherpad-lite-cleanup = {
146 description = "Etherpad-lite cleanup old mypads";
147 after = [ "network.target" "postgresql.service" ];
148 wants = [ "postgresql.service" ];
149
150 environment.NODE_ENV = "production";
151 environment.HOME = cfg.workdir;
152
153 path = [ cfg.workdir.nodejs ];
154
155 script = ''
156 exec ${cfg.workdir.nodejs}/bin/node ${cfg.workdir}/node_modules/ep_mypads/scripts/mypads-jobqueue-minion.js \
157 --settings ${cfg.configFile} \
158 --oneshot
159 '';
160
161 serviceConfig = {
162 DynamicUser = true;
163 User = cfg.user;
164 Group = cfg.group;
165 WorkingDirectory = "%T";
166 PrivateTmp = true;
167 NoNewPrivileges = true;
168 PrivateDevices = true;
169 ProtectHome = true;
170 ProtectControlGroups = true;
171 ProtectKernelModules = true;
172 Type = "oneshot";
173 };
174 };
175 systemd.services.etherpad-lite = {
176 description = "Etherpad-lite";
177 wantedBy = [ "multi-user.target" ];
178 after = [ "network.target" "postgresql.service" ];
179 wants = [ "postgresql.service" ];
180
181 environment.NODE_ENV = "production";
182 environment.HOME = cfg.workdir;
183
184 path = [ cfg.workdir.nodejs ];
185
186 script = ''
187 exec ${cfg.workdir.nodejs}/bin/node ${cfg.workdir}/src/node/server.js \
188 --sessionkey ${cfg.sessionKeyFile} \
189 --apikey ${cfg.apiKeyFile} \
190 --settings ${cfg.configFile}
191 '';
192
193 postStart = ''
194 while [ ! -S ${cfg.sockets.node} ]; do
195 sleep 0.5
196 done
197 chmod a+w ${cfg.sockets.node}
198 '';
199 serviceConfig = {
200 DynamicUser = true;
201 User = cfg.user;
202 Group = cfg.group;
203 WorkingDirectory = cfg.workdir;
204 PrivateTmp = true;
205 NoNewPrivileges = true;
206 PrivateDevices = true;
207 ProtectHome = true;
208 ProtectControlGroups = true;
209 ProtectKernelModules = true;
210 Restart = "always";
211 Type = "simple";
212 TimeoutSec = 60;
213 RuntimeDirectory = cfg.systemdRuntimeDirectory;
214 StateDirectory= cfg.systemdStateDirectory;
215 ExecStartPre = [
216 "+${pkgs.coreutils}/bin/install -d -m 0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dataDir}/var ${cfg.dataDir}/ep_initialized"
217 "+${pkgs.coreutils}/bin/chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} ${cfg.configFile} ${cfg.sessionKeyFile} ${cfg.apiKeyFile}"
218 ];
219 };
220 };
221
222 };
223 };
224 };
225}
226
227
diff --git a/pkgs/webapps/etherpad-lite/libreoffice_patch.diff b/flakes/etherpad-lite/libreoffice_patch.diff
index 86fac15..86fac15 100644
--- a/pkgs/webapps/etherpad-lite/libreoffice_patch.diff
+++ b/flakes/etherpad-lite/libreoffice_patch.diff
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json b/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json
index 9b0f681..9b0f681 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix b/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix
index 8a2fb1b..8a2fb1b 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_aa_file_menu_toolbar/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.json b/flakes/etherpad-lite/modules/ep_adminpads/node-packages.json
index 7643607..7643607 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_adminpads/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.nix b/flakes/etherpad-lite/modules/ep_adminpads/node-packages.nix
index 2f62257..2f62257 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_adminpads/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_adminpads/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.json b/flakes/etherpad-lite/modules/ep_align/node-packages.json
index 9405dd2..9405dd2 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_align/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.nix b/flakes/etherpad-lite/modules/ep_align/node-packages.nix
index 1a57a9c..1a57a9c 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_align/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_align/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.json b/flakes/etherpad-lite/modules/ep_bookmark/node-packages.json
index 80745ca..80745ca 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_bookmark/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.nix b/flakes/etherpad-lite/modules/ep_bookmark/node-packages.nix
index 3975044..3975044 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_bookmark/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_bookmark/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.json b/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.json
index 07c0662..07c0662 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.nix b/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.nix
index adb22f1..adb22f1 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_clear_formatting/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_clear_formatting/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.json b/flakes/etherpad-lite/modules/ep_colors/node-packages.json
index b513f5c..b513f5c 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_colors/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.nix b/flakes/etherpad-lite/modules/ep_colors/node-packages.nix
index f2f8201..f2f8201 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_colors/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_colors/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.json b/flakes/etherpad-lite/modules/ep_comments_page/node-packages.json
index ae32884..ae32884 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_comments_page/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.nix b/flakes/etherpad-lite/modules/ep_comments_page/node-packages.nix
index 8d7c85a..8d7c85a 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_comments_page/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_comments_page/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json b/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json
index f6da8df..f6da8df 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix b/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix
index 504bee2..504bee2 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_copy_paste_select_all/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.json b/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.json
index b409581..b409581 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.nix b/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.nix
index d8c1480..d8c1480 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_cursortrace/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_cursortrace/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json b/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json
index 8688afc..8688afc 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix b/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix
index 8f3e9c0..8f3e9c0 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_delete_empty_pads/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/fix.patch b/flakes/etherpad-lite/modules/ep_embedmedia/fix.patch
index 162f1b0..162f1b0 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/fix.patch
+++ b/flakes/etherpad-lite/modules/ep_embedmedia/fix.patch
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.json b/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.json
index e4961d3..e4961d3 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix b/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.nix
index 80ba484..80ba484 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_embedmedia/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_embedmedia/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.json b/flakes/etherpad-lite/modules/ep_font_family/node-packages.json
index a719a45..a719a45 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_font_family/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.nix b/flakes/etherpad-lite/modules/ep_font_family/node-packages.nix
index c64f0cb..c64f0cb 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_font_family/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_font_family/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.json b/flakes/etherpad-lite/modules/ep_font_size/node-packages.json
index 472df3b..472df3b 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_font_size/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.nix b/flakes/etherpad-lite/modules/ep_font_size/node-packages.nix
index 06b69f9..06b69f9 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_font_size/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_font_size/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.json b/flakes/etherpad-lite/modules/ep_headings2/node-packages.json
index adbc268..adbc268 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_headings2/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix b/flakes/etherpad-lite/modules/ep_headings2/node-packages.nix
index ba6392c..ba6392c 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_headings2/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_headings2/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/ep.json b/flakes/etherpad-lite/modules/ep_immae_buttons/ep.json
index 10db4ef..10db4ef 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/ep.json
+++ b/flakes/etherpad-lite/modules/ep_immae_buttons/ep.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/hooks.js b/flakes/etherpad-lite/modules/ep_immae_buttons/hooks.js
index dcf7782..dcf7782 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/hooks.js
+++ b/flakes/etherpad-lite/modules/ep_immae_buttons/hooks.js
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/node-packages.nix b/flakes/etherpad-lite/modules/ep_immae_buttons/node-packages.nix
index d7045df..d7045df 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_immae_buttons/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/package.json b/flakes/etherpad-lite/modules/ep_immae_buttons/package.json
index 39bb0a8..39bb0a8 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/package.json
+++ b/flakes/etherpad-lite/modules/ep_immae_buttons/package.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/static/js/main.js b/flakes/etherpad-lite/modules/ep_immae_buttons/static/js/main.js
index 07f7b9c..07f7b9c 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/static/js/main.js
+++ b/flakes/etherpad-lite/modules/ep_immae_buttons/static/js/main.js
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs b/flakes/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs
index 339ae3d..339ae3d 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs
+++ b/flakes/etherpad-lite/modules/ep_immae_buttons/templates/editbarButtons.ejs
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.json b/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.json
index cacc12a..cacc12a 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix b/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.nix
index 8140187..8140187 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_ldapauth/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_ldapauth/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/fix.patch b/flakes/etherpad-lite/modules/ep_line_height/fix.patch
index ffd65f1..ffd65f1 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_line_height/fix.patch
+++ b/flakes/etherpad-lite/modules/ep_line_height/fix.patch
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.json b/flakes/etherpad-lite/modules/ep_line_height/node-packages.json
index 307c2e7..307c2e7 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_line_height/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix b/flakes/etherpad-lite/modules/ep_line_height/node-packages.nix
index d5d5c21..d5d5c21 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_line_height/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_line_height/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.json b/flakes/etherpad-lite/modules/ep_markdown/node-packages.json
index 1c5526c..1c5526c 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_markdown/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.nix b/flakes/etherpad-lite/modules/ep_markdown/node-packages.nix
index eb7a43e..eb7a43e 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_markdown/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_markdown/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_mypads/fix_ldap.patch b/flakes/etherpad-lite/modules/ep_mypads/fix_ldap.patch
index 6ade6cb..6ade6cb 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_mypads/fix_ldap.patch
+++ b/flakes/etherpad-lite/modules/ep_mypads/fix_ldap.patch
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.json b/flakes/etherpad-lite/modules/ep_mypads/node-packages.json
index 36b70bd..36b70bd 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_mypads/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.nix b/flakes/etherpad-lite/modules/ep_mypads/node-packages.nix
index 13b302c..13b302c 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_mypads/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_mypads/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.json b/flakes/etherpad-lite/modules/ep_page_view/node-packages.json
index c5f4a7b..c5f4a7b 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_page_view/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.nix b/flakes/etherpad-lite/modules/ep_page_view/node-packages.nix
index e6c6b65..e6c6b65 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_page_view/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_page_view/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.json b/flakes/etherpad-lite/modules/ep_previewimages/node-packages.json
index cc14ec4..cc14ec4 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_previewimages/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.nix b/flakes/etherpad-lite/modules/ep_previewimages/node-packages.nix
index cd0972b..cd0972b 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_previewimages/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_previewimages/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.json b/flakes/etherpad-lite/modules/ep_private_pad/node-packages.json
index c25d8c9..c25d8c9 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_private_pad/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.nix b/flakes/etherpad-lite/modules/ep_private_pad/node-packages.nix
index 1744f52..1744f52 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_private_pad/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_private_pad/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.json b/flakes/etherpad-lite/modules/ep_ruler/node-packages.json
index d31b236..d31b236 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_ruler/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.nix b/flakes/etherpad-lite/modules/ep_ruler/node-packages.nix
index c8697d4..c8697d4 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_ruler/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_ruler/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.json b/flakes/etherpad-lite/modules/ep_scrollto/node-packages.json
index 6d068d0..6d068d0 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_scrollto/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.nix b/flakes/etherpad-lite/modules/ep_scrollto/node-packages.nix
index 8f7656f..8f7656f 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_scrollto/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_scrollto/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json b/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json
index 8755cd2..8755cd2 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix b/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix
index 74f9612..74f9612 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_set_title_on_pad/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/font.patch b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/font.patch
index 474e823..474e823 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/font.patch
+++ b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/font.patch
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json
index aa1cf21..aa1cf21 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix
index 04065dd..04065dd 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_subscript_and_superscript/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.json b/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.json
index d50e856..d50e856 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.json
+++ b/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.json
diff --git a/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix b/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix
index e3ddb1f..e3ddb1f 100644
--- a/pkgs/webapps/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix
+++ b/flakes/etherpad-lite/modules/ep_timesliderdiff/node-packages.nix
diff --git a/pkgs/webapps/etherpad-lite/node-packages.nix b/flakes/etherpad-lite/node-packages.nix
index 0058508..0058508 100644
--- a/pkgs/webapps/etherpad-lite/node-packages.nix
+++ b/flakes/etherpad-lite/node-packages.nix
diff --git a/flakes/files-watcher/flake.nix b/flakes/files-watcher/flake.nix
index 29ea428..3be566d 100644
--- a/flakes/files-watcher/flake.nix
+++ b/flakes/files-watcher/flake.nix
@@ -2,6 +2,8 @@
2 description = "Module to watch fo file changes to force restart systemd service"; 2 description = "Module to watch fo file changes to force restart systemd service";
3 outputs = { self }: { 3 outputs = { self }: {
4 nixosModule = { config, lib, pkgs, ... }: let cfg = config.services.filesWatcher; in with lib; { 4 nixosModule = { config, lib, pkgs, ... }: let cfg = config.services.filesWatcher; in with lib; {
5 # Necessary for situations where flake gets included multiple times
6 key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
5 options = { 7 options = {
6 services.filesWatcher = with lib.types; mkOption { 8 services.filesWatcher = with lib.types; mkOption {
7 default = {}; 9 default = {};
diff --git a/flakes/flake.lock b/flakes/flake.lock
new file mode 100644
index 0000000..c65312c
--- /dev/null
+++ b/flakes/flake.lock
@@ -0,0 +1,9669 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_6",
6 "nixpkgs": "nixpkgs_10"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "backports_2": {
20 "inputs": {
21 "flake-utils": "flake-utils_8",
22 "nixpkgs": "nixpkgs_17"
23 },
24 "locked": {
25 "lastModified": 1,
26 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
27 "path": "../../backports",
28 "type": "path"
29 },
30 "original": {
31 "path": "../../backports",
32 "type": "path"
33 }
34 },
35 "backports_3": {
36 "inputs": {
37 "flake-utils": "flake-utils_20",
38 "nixpkgs": "nixpkgs_33"
39 },
40 "locked": {
41 "lastModified": 1,
42 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
43 "path": "../../backports",
44 "type": "path"
45 },
46 "original": {
47 "path": "../../backports",
48 "type": "path"
49 }
50 },
51 "backports_4": {
52 "inputs": {
53 "flake-utils": "flake-utils_34",
54 "nixpkgs": "nixpkgs_56"
55 },
56 "locked": {
57 "lastModified": 1,
58 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
59 "path": "../../backports",
60 "type": "path"
61 },
62 "original": {
63 "path": "../../backports",
64 "type": "path"
65 }
66 },
67 "backports_5": {
68 "inputs": {
69 "flake-utils": "flake-utils_37",
70 "nixpkgs": "nixpkgs_64"
71 },
72 "locked": {
73 "lastModified": 1,
74 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
75 "path": "../../backports",
76 "type": "path"
77 },
78 "original": {
79 "path": "../../backports",
80 "type": "path"
81 }
82 },
83 "backports_6": {
84 "inputs": {
85 "flake-utils": "flake-utils_39",
86 "nixpkgs": "nixpkgs_71"
87 },
88 "locked": {
89 "lastModified": 1,
90 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
91 "path": "../../backports",
92 "type": "path"
93 },
94 "original": {
95 "path": "../../backports",
96 "type": "path"
97 }
98 },
99 "backports_7": {
100 "inputs": {
101 "flake-utils": "flake-utils_61",
102 "nixpkgs": "nixpkgs_100"
103 },
104 "locked": {
105 "lastModified": 1,
106 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
107 "path": "../../backports",
108 "type": "path"
109 },
110 "original": {
111 "path": "../../backports",
112 "type": "path"
113 }
114 },
115 "buildslist": {
116 "flake": false,
117 "locked": {
118 "lastModified": 1585697026,
119 "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
120 "ref": "master",
121 "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
122 "revCount": 4,
123 "type": "git",
124 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
125 },
126 "original": {
127 "type": "git",
128 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
129 }
130 },
131 "buildslist_2": {
132 "flake": false,
133 "locked": {
134 "lastModified": 1585697026,
135 "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
136 "ref": "master",
137 "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
138 "revCount": 4,
139 "type": "git",
140 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
141 },
142 "original": {
143 "type": "git",
144 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
145 }
146 },
147 "chatons": {
148 "inputs": {
149 "environment": "environment"
150 },
151 "locked": {
152 "lastModified": 1,
153 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
154 "path": "../../flakes/private/chatons",
155 "type": "path"
156 },
157 "original": {
158 "path": "../../flakes/private/chatons",
159 "type": "path"
160 }
161 },
162 "chatons_2": {
163 "inputs": {
164 "environment": "environment_18"
165 },
166 "locked": {
167 "lastModified": 1,
168 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
169 "path": "../../flakes/private/chatons",
170 "type": "path"
171 },
172 "original": {
173 "path": "../../flakes/private/chatons",
174 "type": "path"
175 }
176 },
177 "colmena": {
178 "inputs": {
179 "flake-compat": "flake-compat",
180 "flake-utils": "flake-utils_3",
181 "nixpkgs": "nixpkgs_3",
182 "stable": "stable"
183 },
184 "locked": {
185 "lastModified": 1687954574,
186 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
187 "owner": "immae",
188 "repo": "colmena",
189 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
190 "type": "github"
191 },
192 "original": {
193 "owner": "immae",
194 "ref": "add-lib-get-flake",
195 "repo": "colmena",
196 "type": "github"
197 }
198 },
199 "colmena_2": {
200 "inputs": {
201 "flake-compat": "flake-compat_2",
202 "flake-utils": "flake-utils_7",
203 "nixpkgs": "nixpkgs_12",
204 "stable": "stable_2"
205 },
206 "locked": {
207 "lastModified": 1687954574,
208 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
209 "owner": "immae",
210 "repo": "colmena",
211 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
212 "type": "github"
213 },
214 "original": {
215 "owner": "immae",
216 "ref": "add-lib-get-flake",
217 "repo": "colmena",
218 "type": "github"
219 }
220 },
221 "colmena_3": {
222 "inputs": {
223 "flake-compat": "flake-compat_3",
224 "flake-utils": "flake-utils_10",
225 "nixpkgs": "nixpkgs_19",
226 "stable": "stable_3"
227 },
228 "locked": {
229 "lastModified": 1687954574,
230 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
231 "owner": "immae",
232 "repo": "colmena",
233 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
234 "type": "github"
235 },
236 "original": {
237 "owner": "immae",
238 "ref": "add-lib-get-flake",
239 "repo": "colmena",
240 "type": "github"
241 }
242 },
243 "colmena_4": {
244 "inputs": {
245 "flake-compat": "flake-compat_4",
246 "flake-utils": "flake-utils_32",
247 "nixpkgs": "nixpkgs_50",
248 "stable": "stable_4"
249 },
250 "locked": {
251 "lastModified": 1687954574,
252 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
253 "owner": "immae",
254 "repo": "colmena",
255 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
256 "type": "github"
257 },
258 "original": {
259 "owner": "immae",
260 "ref": "add-lib-get-flake",
261 "repo": "colmena",
262 "type": "github"
263 }
264 },
265 "colmena_5": {
266 "inputs": {
267 "flake-compat": "flake-compat_5",
268 "flake-utils": "flake-utils_35",
269 "nixpkgs": "nixpkgs_58",
270 "stable": "stable_5"
271 },
272 "locked": {
273 "lastModified": 1687954574,
274 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
275 "owner": "immae",
276 "repo": "colmena",
277 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
278 "type": "github"
279 },
280 "original": {
281 "owner": "immae",
282 "ref": "add-lib-get-flake",
283 "repo": "colmena",
284 "type": "github"
285 }
286 },
287 "colmena_6": {
288 "inputs": {
289 "flake-compat": "flake-compat_6",
290 "flake-utils": "flake-utils_38",
291 "nixpkgs": "nixpkgs_66",
292 "stable": "stable_6"
293 },
294 "locked": {
295 "lastModified": 1687954574,
296 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
297 "owner": "immae",
298 "repo": "colmena",
299 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
300 "type": "github"
301 },
302 "original": {
303 "owner": "immae",
304 "ref": "add-lib-get-flake",
305 "repo": "colmena",
306 "type": "github"
307 }
308 },
309 "colmena_7": {
310 "inputs": {
311 "flake-compat": "flake-compat_7",
312 "flake-utils": "flake-utils_45",
313 "nixpkgs": "nixpkgs_80",
314 "stable": "stable_7"
315 },
316 "locked": {
317 "lastModified": 1687954574,
318 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
319 "owner": "immae",
320 "repo": "colmena",
321 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
322 "type": "github"
323 },
324 "original": {
325 "owner": "immae",
326 "ref": "add-lib-get-flake",
327 "repo": "colmena",
328 "type": "github"
329 }
330 },
331 "copanier": {
332 "flake": false,
333 "locked": {
334 "lastModified": 1633895178,
335 "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
336 "owner": "spiral-project",
337 "repo": "copanier",
338 "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
339 "type": "github"
340 },
341 "original": {
342 "owner": "spiral-project",
343 "repo": "copanier",
344 "type": "github"
345 }
346 },
347 "copanier_2": {
348 "flake": false,
349 "locked": {
350 "lastModified": 1633895178,
351 "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
352 "owner": "spiral-project",
353 "repo": "copanier",
354 "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
355 "type": "github"
356 },
357 "original": {
358 "owner": "spiral-project",
359 "repo": "copanier",
360 "type": "github"
361 }
362 },
363 "diaspora": {
364 "flake": false,
365 "locked": {
366 "lastModified": 1551139311,
367 "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
368 "owner": "diaspora",
369 "repo": "diaspora",
370 "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
371 "type": "github"
372 },
373 "original": {
374 "owner": "diaspora",
375 "ref": "v0.7.10.0",
376 "repo": "diaspora",
377 "type": "github"
378 }
379 },
380 "diaspora_2": {
381 "flake": false,
382 "locked": {
383 "lastModified": 1551139311,
384 "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
385 "owner": "diaspora",
386 "repo": "diaspora",
387 "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
388 "type": "github"
389 },
390 "original": {
391 "owner": "diaspora",
392 "ref": "v0.7.10.0",
393 "repo": "diaspora",
394 "type": "github"
395 }
396 },
397 "disko": {
398 "inputs": {
399 "nixpkgs": "nixpkgs_4"
400 },
401 "locked": {
402 "lastModified": 1687968164,
403 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
404 "owner": "nix-community",
405 "repo": "disko",
406 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
407 "type": "github"
408 },
409 "original": {
410 "owner": "nix-community",
411 "repo": "disko",
412 "type": "github"
413 }
414 },
415 "disko_2": {
416 "inputs": {
417 "nixpkgs": "nixpkgs_13"
418 },
419 "locked": {
420 "lastModified": 1687968164,
421 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
422 "owner": "nix-community",
423 "repo": "disko",
424 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
425 "type": "github"
426 },
427 "original": {
428 "owner": "nix-community",
429 "repo": "disko",
430 "type": "github"
431 }
432 },
433 "disko_3": {
434 "inputs": {
435 "nixpkgs": "nixpkgs_20"
436 },
437 "locked": {
438 "lastModified": 1687968164,
439 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
440 "owner": "nix-community",
441 "repo": "disko",
442 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
443 "type": "github"
444 },
445 "original": {
446 "owner": "nix-community",
447 "repo": "disko",
448 "type": "github"
449 }
450 },
451 "disko_4": {
452 "inputs": {
453 "nixpkgs": "nixpkgs_51"
454 },
455 "locked": {
456 "lastModified": 1687968164,
457 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
458 "owner": "nix-community",
459 "repo": "disko",
460 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
461 "type": "github"
462 },
463 "original": {
464 "owner": "nix-community",
465 "repo": "disko",
466 "type": "github"
467 }
468 },
469 "disko_5": {
470 "inputs": {
471 "nixpkgs": "nixpkgs_59"
472 },
473 "locked": {
474 "lastModified": 1687968164,
475 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
476 "owner": "nix-community",
477 "repo": "disko",
478 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
479 "type": "github"
480 },
481 "original": {
482 "owner": "nix-community",
483 "repo": "disko",
484 "type": "github"
485 }
486 },
487 "disko_6": {
488 "inputs": {
489 "nixpkgs": "nixpkgs_67"
490 },
491 "locked": {
492 "lastModified": 1687968164,
493 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
494 "owner": "nix-community",
495 "repo": "disko",
496 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
497 "type": "github"
498 },
499 "original": {
500 "owner": "nix-community",
501 "repo": "disko",
502 "type": "github"
503 }
504 },
505 "disko_7": {
506 "inputs": {
507 "nixpkgs": "nixpkgs_81"
508 },
509 "locked": {
510 "lastModified": 1687968164,
511 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
512 "owner": "nix-community",
513 "repo": "disko",
514 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
515 "type": "github"
516 },
517 "original": {
518 "owner": "nix-community",
519 "repo": "disko",
520 "type": "github"
521 }
522 },
523 "dns-nix": {
524 "inputs": {
525 "flake-utils": "flake-utils_9",
526 "nixpkgs": [
527 "n-eldiron",
528 "nixpkgs"
529 ]
530 },
531 "locked": {
532 "lastModified": 1635273082,
533 "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=",
534 "owner": "kirelagin",
535 "repo": "dns.nix",
536 "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a",
537 "type": "github"
538 },
539 "original": {
540 "owner": "kirelagin",
541 "repo": "dns.nix",
542 "type": "github"
543 }
544 },
545 "environment": {
546 "locked": {
547 "lastModified": 1,
548 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
549 "path": "../environment",
550 "type": "path"
551 },
552 "original": {
553 "path": "../environment",
554 "type": "path"
555 }
556 },
557 "environment_10": {
558 "locked": {
559 "lastModified": 1,
560 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
561 "path": "../environment",
562 "type": "path"
563 },
564 "original": {
565 "path": "../environment",
566 "type": "path"
567 }
568 },
569 "environment_11": {
570 "locked": {
571 "lastModified": 1,
572 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
573 "path": "../environment",
574 "type": "path"
575 },
576 "original": {
577 "path": "../environment",
578 "type": "path"
579 }
580 },
581 "environment_12": {
582 "locked": {
583 "lastModified": 1,
584 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
585 "path": "../environment",
586 "type": "path"
587 },
588 "original": {
589 "path": "../environment",
590 "type": "path"
591 }
592 },
593 "environment_13": {
594 "locked": {
595 "lastModified": 1,
596 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
597 "path": "../environment",
598 "type": "path"
599 },
600 "original": {
601 "path": "../environment",
602 "type": "path"
603 }
604 },
605 "environment_14": {
606 "locked": {
607 "lastModified": 1,
608 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
609 "path": "../environment",
610 "type": "path"
611 },
612 "original": {
613 "path": "../environment",
614 "type": "path"
615 }
616 },
617 "environment_15": {
618 "locked": {
619 "lastModified": 1,
620 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
621 "path": "../environment",
622 "type": "path"
623 },
624 "original": {
625 "path": "../environment",
626 "type": "path"
627 }
628 },
629 "environment_16": {
630 "locked": {
631 "lastModified": 1,
632 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
633 "path": "../environment",
634 "type": "path"
635 },
636 "original": {
637 "path": "../environment",
638 "type": "path"
639 }
640 },
641 "environment_17": {
642 "locked": {
643 "lastModified": 1,
644 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
645 "path": "../environment",
646 "type": "path"
647 },
648 "original": {
649 "path": "../environment",
650 "type": "path"
651 }
652 },
653 "environment_18": {
654 "locked": {
655 "lastModified": 1,
656 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
657 "path": "../environment",
658 "type": "path"
659 },
660 "original": {
661 "path": "../environment",
662 "type": "path"
663 }
664 },
665 "environment_19": {
666 "locked": {
667 "lastModified": 1,
668 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
669 "path": "../../flakes/private/environment",
670 "type": "path"
671 },
672 "original": {
673 "path": "../../flakes/private/environment",
674 "type": "path"
675 }
676 },
677 "environment_2": {
678 "locked": {
679 "lastModified": 1,
680 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
681 "path": "../../flakes/private/environment",
682 "type": "path"
683 },
684 "original": {
685 "path": "../../flakes/private/environment",
686 "type": "path"
687 }
688 },
689 "environment_20": {
690 "locked": {
691 "lastModified": 1,
692 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
693 "path": "../environment",
694 "type": "path"
695 },
696 "original": {
697 "path": "../environment",
698 "type": "path"
699 }
700 },
701 "environment_21": {
702 "locked": {
703 "lastModified": 1,
704 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
705 "path": "../environment",
706 "type": "path"
707 },
708 "original": {
709 "path": "../environment",
710 "type": "path"
711 }
712 },
713 "environment_22": {
714 "locked": {
715 "lastModified": 1,
716 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
717 "path": "../environment",
718 "type": "path"
719 },
720 "original": {
721 "path": "../environment",
722 "type": "path"
723 }
724 },
725 "environment_23": {
726 "locked": {
727 "lastModified": 1,
728 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
729 "path": "../../flakes/private/environment",
730 "type": "path"
731 },
732 "original": {
733 "path": "../../flakes/private/environment",
734 "type": "path"
735 }
736 },
737 "environment_24": {
738 "locked": {
739 "lastModified": 1,
740 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
741 "path": "../environment",
742 "type": "path"
743 },
744 "original": {
745 "path": "../environment",
746 "type": "path"
747 }
748 },
749 "environment_25": {
750 "locked": {
751 "lastModified": 1,
752 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
753 "path": "../environment",
754 "type": "path"
755 },
756 "original": {
757 "path": "../environment",
758 "type": "path"
759 }
760 },
761 "environment_26": {
762 "locked": {
763 "lastModified": 1,
764 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
765 "path": "../environment",
766 "type": "path"
767 },
768 "original": {
769 "path": "../environment",
770 "type": "path"
771 }
772 },
773 "environment_27": {
774 "locked": {
775 "lastModified": 1,
776 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
777 "path": "../environment",
778 "type": "path"
779 },
780 "original": {
781 "path": "../environment",
782 "type": "path"
783 }
784 },
785 "environment_28": {
786 "locked": {
787 "lastModified": 1,
788 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
789 "path": "../environment",
790 "type": "path"
791 },
792 "original": {
793 "path": "../environment",
794 "type": "path"
795 }
796 },
797 "environment_29": {
798 "locked": {
799 "lastModified": 1,
800 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
801 "path": "../environment",
802 "type": "path"
803 },
804 "original": {
805 "path": "../environment",
806 "type": "path"
807 }
808 },
809 "environment_3": {
810 "locked": {
811 "lastModified": 1,
812 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
813 "path": "../environment",
814 "type": "path"
815 },
816 "original": {
817 "path": "../environment",
818 "type": "path"
819 }
820 },
821 "environment_30": {
822 "locked": {
823 "lastModified": 1,
824 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
825 "path": "../environment",
826 "type": "path"
827 },
828 "original": {
829 "path": "../environment",
830 "type": "path"
831 }
832 },
833 "environment_31": {
834 "locked": {
835 "lastModified": 1,
836 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
837 "path": "../environment",
838 "type": "path"
839 },
840 "original": {
841 "path": "../environment",
842 "type": "path"
843 }
844 },
845 "environment_32": {
846 "locked": {
847 "lastModified": 1,
848 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
849 "path": "../environment",
850 "type": "path"
851 },
852 "original": {
853 "path": "../environment",
854 "type": "path"
855 }
856 },
857 "environment_33": {
858 "locked": {
859 "lastModified": 1,
860 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
861 "path": "../environment",
862 "type": "path"
863 },
864 "original": {
865 "path": "../environment",
866 "type": "path"
867 }
868 },
869 "environment_4": {
870 "locked": {
871 "lastModified": 1,
872 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
873 "path": "../environment",
874 "type": "path"
875 },
876 "original": {
877 "path": "../environment",
878 "type": "path"
879 }
880 },
881 "environment_5": {
882 "locked": {
883 "lastModified": 1,
884 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
885 "path": "../environment",
886 "type": "path"
887 },
888 "original": {
889 "path": "../environment",
890 "type": "path"
891 }
892 },
893 "environment_6": {
894 "locked": {
895 "lastModified": 1,
896 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
897 "path": "../environment",
898 "type": "path"
899 },
900 "original": {
901 "path": "../environment",
902 "type": "path"
903 }
904 },
905 "environment_7": {
906 "locked": {
907 "lastModified": 1,
908 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
909 "path": "../environment",
910 "type": "path"
911 },
912 "original": {
913 "path": "../environment",
914 "type": "path"
915 }
916 },
917 "environment_8": {
918 "locked": {
919 "lastModified": 1,
920 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
921 "path": "../../flakes/private/environment",
922 "type": "path"
923 },
924 "original": {
925 "path": "../../flakes/private/environment",
926 "type": "path"
927 }
928 },
929 "environment_9": {
930 "locked": {
931 "lastModified": 1,
932 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
933 "path": "../environment",
934 "type": "path"
935 },
936 "original": {
937 "path": "../environment",
938 "type": "path"
939 }
940 },
941 "etherpad-lite": {
942 "flake": false,
943 "locked": {
944 "lastModified": 1587951095,
945 "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
946 "owner": "ether",
947 "repo": "etherpad-lite",
948 "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
949 "type": "github"
950 },
951 "original": {
952 "owner": "ether",
953 "ref": "1.8.3",
954 "repo": "etherpad-lite",
955 "type": "github"
956 }
957 },
958 "etherpad-lite_2": {
959 "flake": false,
960 "locked": {
961 "lastModified": 1587951095,
962 "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
963 "owner": "ether",
964 "repo": "etherpad-lite",
965 "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
966 "type": "github"
967 },
968 "original": {
969 "owner": "ether",
970 "ref": "1.8.3",
971 "repo": "etherpad-lite",
972 "type": "github"
973 }
974 },
975 "files-watcher": {
976 "locked": {
977 "lastModified": 1,
978 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
979 "path": "../../files-watcher",
980 "type": "path"
981 },
982 "original": {
983 "path": "../../files-watcher",
984 "type": "path"
985 }
986 },
987 "files-watcher_10": {
988 "locked": {
989 "lastModified": 1,
990 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
991 "path": "../../flakes/files-watcher",
992 "type": "path"
993 },
994 "original": {
995 "path": "../../flakes/files-watcher",
996 "type": "path"
997 }
998 },
999 "files-watcher_11": {
1000 "locked": {
1001 "lastModified": 1,
1002 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1003 "path": "../files-watcher",
1004 "type": "path"
1005 },
1006 "original": {
1007 "path": "../files-watcher",
1008 "type": "path"
1009 }
1010 },
1011 "files-watcher_12": {
1012 "locked": {
1013 "lastModified": 1,
1014 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1015 "path": "../files-watcher",
1016 "type": "path"
1017 },
1018 "original": {
1019 "path": "../files-watcher",
1020 "type": "path"
1021 }
1022 },
1023 "files-watcher_13": {
1024 "locked": {
1025 "lastModified": 1,
1026 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1027 "path": "../../files-watcher",
1028 "type": "path"
1029 },
1030 "original": {
1031 "path": "../../files-watcher",
1032 "type": "path"
1033 }
1034 },
1035 "files-watcher_14": {
1036 "locked": {
1037 "lastModified": 1,
1038 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1039 "path": "../../files-watcher",
1040 "type": "path"
1041 },
1042 "original": {
1043 "path": "../../files-watcher",
1044 "type": "path"
1045 }
1046 },
1047 "files-watcher_15": {
1048 "locked": {
1049 "lastModified": 1,
1050 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1051 "path": "../../files-watcher",
1052 "type": "path"
1053 },
1054 "original": {
1055 "path": "../../files-watcher",
1056 "type": "path"
1057 }
1058 },
1059 "files-watcher_2": {
1060 "locked": {
1061 "lastModified": 1,
1062 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1063 "path": "../../files-watcher",
1064 "type": "path"
1065 },
1066 "original": {
1067 "path": "../../files-watcher",
1068 "type": "path"
1069 }
1070 },
1071 "files-watcher_3": {
1072 "locked": {
1073 "lastModified": 1,
1074 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1075 "path": "../../files-watcher",
1076 "type": "path"
1077 },
1078 "original": {
1079 "path": "../../files-watcher",
1080 "type": "path"
1081 }
1082 },
1083 "files-watcher_4": {
1084 "locked": {
1085 "lastModified": 1,
1086 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1087 "path": "../../flakes/files-watcher",
1088 "type": "path"
1089 },
1090 "original": {
1091 "path": "../../flakes/files-watcher",
1092 "type": "path"
1093 }
1094 },
1095 "files-watcher_5": {
1096 "locked": {
1097 "lastModified": 1,
1098 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1099 "path": "../../files-watcher",
1100 "type": "path"
1101 },
1102 "original": {
1103 "path": "../../files-watcher",
1104 "type": "path"
1105 }
1106 },
1107 "files-watcher_6": {
1108 "locked": {
1109 "lastModified": 1,
1110 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1111 "path": "../../files-watcher",
1112 "type": "path"
1113 },
1114 "original": {
1115 "path": "../../files-watcher",
1116 "type": "path"
1117 }
1118 },
1119 "files-watcher_7": {
1120 "locked": {
1121 "lastModified": 1,
1122 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1123 "path": "../../files-watcher",
1124 "type": "path"
1125 },
1126 "original": {
1127 "path": "../../files-watcher",
1128 "type": "path"
1129 }
1130 },
1131 "files-watcher_8": {
1132 "locked": {
1133 "lastModified": 1,
1134 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1135 "path": "../files-watcher",
1136 "type": "path"
1137 },
1138 "original": {
1139 "path": "../files-watcher",
1140 "type": "path"
1141 }
1142 },
1143 "files-watcher_9": {
1144 "locked": {
1145 "lastModified": 1,
1146 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
1147 "path": "../../flakes/files-watcher",
1148 "type": "path"
1149 },
1150 "original": {
1151 "path": "../../flakes/files-watcher",
1152 "type": "path"
1153 }
1154 },
1155 "flake-compat": {
1156 "flake": false,
1157 "locked": {
1158 "lastModified": 1650374568,
1159 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1160 "owner": "edolstra",
1161 "repo": "flake-compat",
1162 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1163 "type": "github"
1164 },
1165 "original": {
1166 "owner": "edolstra",
1167 "repo": "flake-compat",
1168 "type": "github"
1169 }
1170 },
1171 "flake-compat_2": {
1172 "flake": false,
1173 "locked": {
1174 "lastModified": 1650374568,
1175 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1176 "owner": "edolstra",
1177 "repo": "flake-compat",
1178 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1179 "type": "github"
1180 },
1181 "original": {
1182 "owner": "edolstra",
1183 "repo": "flake-compat",
1184 "type": "github"
1185 }
1186 },
1187 "flake-compat_3": {
1188 "flake": false,
1189 "locked": {
1190 "lastModified": 1650374568,
1191 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1192 "owner": "edolstra",
1193 "repo": "flake-compat",
1194 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1195 "type": "github"
1196 },
1197 "original": {
1198 "owner": "edolstra",
1199 "repo": "flake-compat",
1200 "type": "github"
1201 }
1202 },
1203 "flake-compat_4": {
1204 "flake": false,
1205 "locked": {
1206 "lastModified": 1650374568,
1207 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1208 "owner": "edolstra",
1209 "repo": "flake-compat",
1210 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1211 "type": "github"
1212 },
1213 "original": {
1214 "owner": "edolstra",
1215 "repo": "flake-compat",
1216 "type": "github"
1217 }
1218 },
1219 "flake-compat_5": {
1220 "flake": false,
1221 "locked": {
1222 "lastModified": 1650374568,
1223 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1224 "owner": "edolstra",
1225 "repo": "flake-compat",
1226 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1227 "type": "github"
1228 },
1229 "original": {
1230 "owner": "edolstra",
1231 "repo": "flake-compat",
1232 "type": "github"
1233 }
1234 },
1235 "flake-compat_6": {
1236 "flake": false,
1237 "locked": {
1238 "lastModified": 1650374568,
1239 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1240 "owner": "edolstra",
1241 "repo": "flake-compat",
1242 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1243 "type": "github"
1244 },
1245 "original": {
1246 "owner": "edolstra",
1247 "repo": "flake-compat",
1248 "type": "github"
1249 }
1250 },
1251 "flake-compat_7": {
1252 "flake": false,
1253 "locked": {
1254 "lastModified": 1650374568,
1255 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
1256 "owner": "edolstra",
1257 "repo": "flake-compat",
1258 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
1259 "type": "github"
1260 },
1261 "original": {
1262 "owner": "edolstra",
1263 "repo": "flake-compat",
1264 "type": "github"
1265 }
1266 },
1267 "flake-parts": {
1268 "inputs": {
1269 "nixpkgs-lib": "nixpkgs-lib_2"
1270 },
1271 "locked": {
1272 "lastModified": 1687762428,
1273 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1274 "owner": "hercules-ci",
1275 "repo": "flake-parts",
1276 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1277 "type": "github"
1278 },
1279 "original": {
1280 "owner": "hercules-ci",
1281 "repo": "flake-parts",
1282 "type": "github"
1283 }
1284 },
1285 "flake-parts_10": {
1286 "inputs": {
1287 "nixpkgs-lib": "nixpkgs-lib_13"
1288 },
1289 "locked": {
1290 "lastModified": 1675295133,
1291 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1292 "owner": "hercules-ci",
1293 "repo": "flake-parts",
1294 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1295 "type": "github"
1296 },
1297 "original": {
1298 "owner": "hercules-ci",
1299 "repo": "flake-parts",
1300 "type": "github"
1301 }
1302 },
1303 "flake-parts_11": {
1304 "inputs": {
1305 "nixpkgs-lib": "nixpkgs-lib_15"
1306 },
1307 "locked": {
1308 "lastModified": 1687762428,
1309 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1310 "owner": "hercules-ci",
1311 "repo": "flake-parts",
1312 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1313 "type": "github"
1314 },
1315 "original": {
1316 "owner": "hercules-ci",
1317 "repo": "flake-parts",
1318 "type": "github"
1319 }
1320 },
1321 "flake-parts_12": {
1322 "inputs": {
1323 "nixpkgs-lib": "nixpkgs-lib_16"
1324 },
1325 "locked": {
1326 "lastModified": 1675295133,
1327 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1328 "owner": "hercules-ci",
1329 "repo": "flake-parts",
1330 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1331 "type": "github"
1332 },
1333 "original": {
1334 "owner": "hercules-ci",
1335 "repo": "flake-parts",
1336 "type": "github"
1337 }
1338 },
1339 "flake-parts_13": {
1340 "inputs": {
1341 "nixpkgs-lib": "nixpkgs-lib_18"
1342 },
1343 "locked": {
1344 "lastModified": 1687762428,
1345 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1346 "owner": "hercules-ci",
1347 "repo": "flake-parts",
1348 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1349 "type": "github"
1350 },
1351 "original": {
1352 "owner": "hercules-ci",
1353 "repo": "flake-parts",
1354 "type": "github"
1355 }
1356 },
1357 "flake-parts_14": {
1358 "inputs": {
1359 "nixpkgs-lib": "nixpkgs-lib_19"
1360 },
1361 "locked": {
1362 "lastModified": 1675295133,
1363 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1364 "owner": "hercules-ci",
1365 "repo": "flake-parts",
1366 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1367 "type": "github"
1368 },
1369 "original": {
1370 "owner": "hercules-ci",
1371 "repo": "flake-parts",
1372 "type": "github"
1373 }
1374 },
1375 "flake-parts_15": {
1376 "inputs": {
1377 "nixpkgs-lib": "nixpkgs-lib_20"
1378 },
1379 "locked": {
1380 "lastModified": 1687762428,
1381 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1382 "owner": "hercules-ci",
1383 "repo": "flake-parts",
1384 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1385 "type": "github"
1386 },
1387 "original": {
1388 "owner": "hercules-ci",
1389 "repo": "flake-parts",
1390 "type": "github"
1391 }
1392 },
1393 "flake-parts_16": {
1394 "inputs": {
1395 "nixpkgs-lib": "nixpkgs-lib_21"
1396 },
1397 "locked": {
1398 "lastModified": 1675295133,
1399 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1400 "owner": "hercules-ci",
1401 "repo": "flake-parts",
1402 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1403 "type": "github"
1404 },
1405 "original": {
1406 "owner": "hercules-ci",
1407 "repo": "flake-parts",
1408 "type": "github"
1409 }
1410 },
1411 "flake-parts_17": {
1412 "inputs": {
1413 "nixpkgs-lib": "nixpkgs-lib_22"
1414 },
1415 "locked": {
1416 "lastModified": 1675295133,
1417 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1418 "owner": "hercules-ci",
1419 "repo": "flake-parts",
1420 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1421 "type": "github"
1422 },
1423 "original": {
1424 "owner": "hercules-ci",
1425 "repo": "flake-parts",
1426 "type": "github"
1427 }
1428 },
1429 "flake-parts_18": {
1430 "inputs": {
1431 "nixpkgs-lib": "nixpkgs-lib_23"
1432 },
1433 "locked": {
1434 "lastModified": 1675295133,
1435 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1436 "owner": "hercules-ci",
1437 "repo": "flake-parts",
1438 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1439 "type": "github"
1440 },
1441 "original": {
1442 "owner": "hercules-ci",
1443 "repo": "flake-parts",
1444 "type": "github"
1445 }
1446 },
1447 "flake-parts_19": {
1448 "inputs": {
1449 "nixpkgs-lib": "nixpkgs-lib_24"
1450 },
1451 "locked": {
1452 "lastModified": 1687762428,
1453 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1454 "owner": "hercules-ci",
1455 "repo": "flake-parts",
1456 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1457 "type": "github"
1458 },
1459 "original": {
1460 "owner": "hercules-ci",
1461 "repo": "flake-parts",
1462 "type": "github"
1463 }
1464 },
1465 "flake-parts_2": {
1466 "inputs": {
1467 "nixpkgs-lib": "nixpkgs-lib_3"
1468 },
1469 "locked": {
1470 "lastModified": 1675295133,
1471 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1472 "owner": "hercules-ci",
1473 "repo": "flake-parts",
1474 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1475 "type": "github"
1476 },
1477 "original": {
1478 "owner": "hercules-ci",
1479 "repo": "flake-parts",
1480 "type": "github"
1481 }
1482 },
1483 "flake-parts_20": {
1484 "inputs": {
1485 "nixpkgs-lib": "nixpkgs-lib_25"
1486 },
1487 "locked": {
1488 "lastModified": 1675295133,
1489 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1490 "owner": "hercules-ci",
1491 "repo": "flake-parts",
1492 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1493 "type": "github"
1494 },
1495 "original": {
1496 "owner": "hercules-ci",
1497 "repo": "flake-parts",
1498 "type": "github"
1499 }
1500 },
1501 "flake-parts_21": {
1502 "inputs": {
1503 "nixpkgs-lib": "nixpkgs-lib_27"
1504 },
1505 "locked": {
1506 "lastModified": 1675295133,
1507 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1508 "owner": "hercules-ci",
1509 "repo": "flake-parts",
1510 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1511 "type": "github"
1512 },
1513 "original": {
1514 "owner": "hercules-ci",
1515 "repo": "flake-parts",
1516 "type": "github"
1517 }
1518 },
1519 "flake-parts_22": {
1520 "inputs": {
1521 "nixpkgs-lib": "nixpkgs-lib_28"
1522 },
1523 "locked": {
1524 "lastModified": 1675295133,
1525 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1526 "owner": "hercules-ci",
1527 "repo": "flake-parts",
1528 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1529 "type": "github"
1530 },
1531 "original": {
1532 "owner": "hercules-ci",
1533 "repo": "flake-parts",
1534 "type": "github"
1535 }
1536 },
1537 "flake-parts_3": {
1538 "inputs": {
1539 "nixpkgs-lib": "nixpkgs-lib_5"
1540 },
1541 "locked": {
1542 "lastModified": 1687762428,
1543 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1544 "owner": "hercules-ci",
1545 "repo": "flake-parts",
1546 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1547 "type": "github"
1548 },
1549 "original": {
1550 "owner": "hercules-ci",
1551 "repo": "flake-parts",
1552 "type": "github"
1553 }
1554 },
1555 "flake-parts_4": {
1556 "inputs": {
1557 "nixpkgs-lib": "nixpkgs-lib_6"
1558 },
1559 "locked": {
1560 "lastModified": 1675295133,
1561 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1562 "owner": "hercules-ci",
1563 "repo": "flake-parts",
1564 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1565 "type": "github"
1566 },
1567 "original": {
1568 "owner": "hercules-ci",
1569 "repo": "flake-parts",
1570 "type": "github"
1571 }
1572 },
1573 "flake-parts_5": {
1574 "inputs": {
1575 "nixpkgs-lib": "nixpkgs-lib_7"
1576 },
1577 "locked": {
1578 "lastModified": 1687762428,
1579 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
1580 "owner": "hercules-ci",
1581 "repo": "flake-parts",
1582 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
1583 "type": "github"
1584 },
1585 "original": {
1586 "owner": "hercules-ci",
1587 "repo": "flake-parts",
1588 "type": "github"
1589 }
1590 },
1591 "flake-parts_6": {
1592 "inputs": {
1593 "nixpkgs-lib": "nixpkgs-lib_9"
1594 },
1595 "locked": {
1596 "lastModified": 1675295133,
1597 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1598 "owner": "hercules-ci",
1599 "repo": "flake-parts",
1600 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1601 "type": "github"
1602 },
1603 "original": {
1604 "owner": "hercules-ci",
1605 "repo": "flake-parts",
1606 "type": "github"
1607 }
1608 },
1609 "flake-parts_7": {
1610 "inputs": {
1611 "nixpkgs-lib": "nixpkgs-lib_10"
1612 },
1613 "locked": {
1614 "lastModified": 1675295133,
1615 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1616 "owner": "hercules-ci",
1617 "repo": "flake-parts",
1618 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1619 "type": "github"
1620 },
1621 "original": {
1622 "owner": "hercules-ci",
1623 "repo": "flake-parts",
1624 "type": "github"
1625 }
1626 },
1627 "flake-parts_8": {
1628 "inputs": {
1629 "nixpkgs-lib": "nixpkgs-lib_11"
1630 },
1631 "locked": {
1632 "lastModified": 1675295133,
1633 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1634 "owner": "hercules-ci",
1635 "repo": "flake-parts",
1636 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1637 "type": "github"
1638 },
1639 "original": {
1640 "owner": "hercules-ci",
1641 "repo": "flake-parts",
1642 "type": "github"
1643 }
1644 },
1645 "flake-parts_9": {
1646 "inputs": {
1647 "nixpkgs-lib": "nixpkgs-lib_12"
1648 },
1649 "locked": {
1650 "lastModified": 1675295133,
1651 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
1652 "owner": "hercules-ci",
1653 "repo": "flake-parts",
1654 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
1655 "type": "github"
1656 },
1657 "original": {
1658 "owner": "hercules-ci",
1659 "repo": "flake-parts",
1660 "type": "github"
1661 }
1662 },
1663 "flake-utils": {
1664 "locked": {
1665 "lastModified": 1609246779,
1666 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1667 "owner": "numtide",
1668 "repo": "flake-utils",
1669 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1670 "type": "github"
1671 },
1672 "original": {
1673 "owner": "numtide",
1674 "repo": "flake-utils",
1675 "type": "github"
1676 }
1677 },
1678 "flake-utils_10": {
1679 "locked": {
1680 "lastModified": 1659877975,
1681 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
1682 "owner": "numtide",
1683 "repo": "flake-utils",
1684 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
1685 "type": "github"
1686 },
1687 "original": {
1688 "owner": "numtide",
1689 "repo": "flake-utils",
1690 "type": "github"
1691 }
1692 },
1693 "flake-utils_11": {
1694 "locked": {
1695 "lastModified": 1648297722,
1696 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1697 "owner": "numtide",
1698 "repo": "flake-utils",
1699 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1700 "type": "github"
1701 },
1702 "original": {
1703 "owner": "numtide",
1704 "repo": "flake-utils",
1705 "type": "github"
1706 }
1707 },
1708 "flake-utils_12": {
1709 "locked": {
1710 "lastModified": 1609246779,
1711 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1712 "owner": "numtide",
1713 "repo": "flake-utils",
1714 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1715 "type": "github"
1716 },
1717 "original": {
1718 "owner": "numtide",
1719 "repo": "flake-utils",
1720 "type": "github"
1721 }
1722 },
1723 "flake-utils_13": {
1724 "locked": {
1725 "lastModified": 1609246779,
1726 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1727 "owner": "numtide",
1728 "repo": "flake-utils",
1729 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1730 "type": "github"
1731 },
1732 "original": {
1733 "owner": "numtide",
1734 "repo": "flake-utils",
1735 "type": "github"
1736 }
1737 },
1738 "flake-utils_14": {
1739 "locked": {
1740 "lastModified": 1609246779,
1741 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1742 "owner": "numtide",
1743 "repo": "flake-utils",
1744 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1745 "type": "github"
1746 },
1747 "original": {
1748 "owner": "numtide",
1749 "repo": "flake-utils",
1750 "type": "github"
1751 }
1752 },
1753 "flake-utils_15": {
1754 "locked": {
1755 "lastModified": 1609246779,
1756 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1757 "owner": "numtide",
1758 "repo": "flake-utils",
1759 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1760 "type": "github"
1761 },
1762 "original": {
1763 "owner": "numtide",
1764 "repo": "flake-utils",
1765 "type": "github"
1766 }
1767 },
1768 "flake-utils_16": {
1769 "locked": {
1770 "lastModified": 1631561581,
1771 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
1772 "owner": "numtide",
1773 "repo": "flake-utils",
1774 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
1775 "type": "github"
1776 },
1777 "original": {
1778 "owner": "numtide",
1779 "repo": "flake-utils",
1780 "type": "github"
1781 }
1782 },
1783 "flake-utils_17": {
1784 "locked": {
1785 "lastModified": 1610051610,
1786 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
1787 "owner": "numtide",
1788 "repo": "flake-utils",
1789 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
1790 "type": "github"
1791 },
1792 "original": {
1793 "owner": "numtide",
1794 "repo": "flake-utils",
1795 "type": "github"
1796 }
1797 },
1798 "flake-utils_18": {
1799 "locked": {
1800 "lastModified": 1610051610,
1801 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
1802 "owner": "numtide",
1803 "repo": "flake-utils",
1804 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
1805 "type": "github"
1806 },
1807 "original": {
1808 "owner": "numtide",
1809 "repo": "flake-utils",
1810 "type": "github"
1811 }
1812 },
1813 "flake-utils_19": {
1814 "locked": {
1815 "lastModified": 1648297722,
1816 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1817 "owner": "numtide",
1818 "repo": "flake-utils",
1819 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1820 "type": "github"
1821 },
1822 "original": {
1823 "owner": "numtide",
1824 "repo": "flake-utils",
1825 "type": "github"
1826 }
1827 },
1828 "flake-utils_2": {
1829 "locked": {
1830 "lastModified": 1609246779,
1831 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1832 "owner": "numtide",
1833 "repo": "flake-utils",
1834 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1835 "type": "github"
1836 },
1837 "original": {
1838 "owner": "numtide",
1839 "repo": "flake-utils",
1840 "type": "github"
1841 }
1842 },
1843 "flake-utils_20": {
1844 "locked": {
1845 "lastModified": 1667395993,
1846 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
1847 "owner": "numtide",
1848 "repo": "flake-utils",
1849 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
1850 "type": "github"
1851 },
1852 "original": {
1853 "owner": "numtide",
1854 "repo": "flake-utils",
1855 "type": "github"
1856 }
1857 },
1858 "flake-utils_21": {
1859 "locked": {
1860 "lastModified": 1631561581,
1861 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
1862 "owner": "numtide",
1863 "repo": "flake-utils",
1864 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
1865 "type": "github"
1866 },
1867 "original": {
1868 "owner": "numtide",
1869 "repo": "flake-utils",
1870 "type": "github"
1871 }
1872 },
1873 "flake-utils_22": {
1874 "locked": {
1875 "lastModified": 1648297722,
1876 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1877 "owner": "numtide",
1878 "repo": "flake-utils",
1879 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1880 "type": "github"
1881 },
1882 "original": {
1883 "owner": "numtide",
1884 "repo": "flake-utils",
1885 "type": "github"
1886 }
1887 },
1888 "flake-utils_23": {
1889 "locked": {
1890 "lastModified": 1648297722,
1891 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1892 "owner": "numtide",
1893 "repo": "flake-utils",
1894 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1895 "type": "github"
1896 },
1897 "original": {
1898 "owner": "numtide",
1899 "repo": "flake-utils",
1900 "type": "github"
1901 }
1902 },
1903 "flake-utils_24": {
1904 "locked": {
1905 "lastModified": 1648297722,
1906 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1907 "owner": "numtide",
1908 "repo": "flake-utils",
1909 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1910 "type": "github"
1911 },
1912 "original": {
1913 "owner": "numtide",
1914 "repo": "flake-utils",
1915 "type": "github"
1916 }
1917 },
1918 "flake-utils_25": {
1919 "locked": {
1920 "lastModified": 1648297722,
1921 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
1922 "owner": "numtide",
1923 "repo": "flake-utils",
1924 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
1925 "type": "github"
1926 },
1927 "original": {
1928 "owner": "numtide",
1929 "repo": "flake-utils",
1930 "type": "github"
1931 }
1932 },
1933 "flake-utils_26": {
1934 "locked": {
1935 "lastModified": 1649676176,
1936 "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
1937 "owner": "numtide",
1938 "repo": "flake-utils",
1939 "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
1940 "type": "github"
1941 },
1942 "original": {
1943 "owner": "numtide",
1944 "repo": "flake-utils",
1945 "type": "github"
1946 }
1947 },
1948 "flake-utils_27": {
1949 "locked": {
1950 "lastModified": 1609246779,
1951 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1952 "owner": "numtide",
1953 "repo": "flake-utils",
1954 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1955 "type": "github"
1956 },
1957 "original": {
1958 "owner": "numtide",
1959 "repo": "flake-utils",
1960 "type": "github"
1961 }
1962 },
1963 "flake-utils_28": {
1964 "locked": {
1965 "lastModified": 1609246779,
1966 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
1967 "owner": "numtide",
1968 "repo": "flake-utils",
1969 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
1970 "type": "github"
1971 },
1972 "original": {
1973 "owner": "numtide",
1974 "repo": "flake-utils",
1975 "type": "github"
1976 }
1977 },
1978 "flake-utils_29": {
1979 "locked": {
1980 "lastModified": 1610051610,
1981 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
1982 "owner": "numtide",
1983 "repo": "flake-utils",
1984 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
1985 "type": "github"
1986 },
1987 "original": {
1988 "owner": "numtide",
1989 "repo": "flake-utils",
1990 "type": "github"
1991 }
1992 },
1993 "flake-utils_3": {
1994 "locked": {
1995 "lastModified": 1659877975,
1996 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
1997 "owner": "numtide",
1998 "repo": "flake-utils",
1999 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2000 "type": "github"
2001 },
2002 "original": {
2003 "owner": "numtide",
2004 "repo": "flake-utils",
2005 "type": "github"
2006 }
2007 },
2008 "flake-utils_30": {
2009 "locked": {
2010 "lastModified": 1648297722,
2011 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2012 "owner": "numtide",
2013 "repo": "flake-utils",
2014 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2015 "type": "github"
2016 },
2017 "original": {
2018 "owner": "numtide",
2019 "repo": "flake-utils",
2020 "type": "github"
2021 }
2022 },
2023 "flake-utils_31": {
2024 "locked": {
2025 "lastModified": 1648297722,
2026 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2027 "owner": "numtide",
2028 "repo": "flake-utils",
2029 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2030 "type": "github"
2031 },
2032 "original": {
2033 "owner": "numtide",
2034 "repo": "flake-utils",
2035 "type": "github"
2036 }
2037 },
2038 "flake-utils_32": {
2039 "locked": {
2040 "lastModified": 1659877975,
2041 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2042 "owner": "numtide",
2043 "repo": "flake-utils",
2044 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2045 "type": "github"
2046 },
2047 "original": {
2048 "owner": "numtide",
2049 "repo": "flake-utils",
2050 "type": "github"
2051 }
2052 },
2053 "flake-utils_33": {
2054 "locked": {
2055 "lastModified": 1648297722,
2056 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2057 "owner": "numtide",
2058 "repo": "flake-utils",
2059 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2060 "type": "github"
2061 },
2062 "original": {
2063 "owner": "numtide",
2064 "repo": "flake-utils",
2065 "type": "github"
2066 }
2067 },
2068 "flake-utils_34": {
2069 "locked": {
2070 "lastModified": 1667395993,
2071 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2072 "owner": "numtide",
2073 "repo": "flake-utils",
2074 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2075 "type": "github"
2076 },
2077 "original": {
2078 "owner": "numtide",
2079 "repo": "flake-utils",
2080 "type": "github"
2081 }
2082 },
2083 "flake-utils_35": {
2084 "locked": {
2085 "lastModified": 1659877975,
2086 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2087 "owner": "numtide",
2088 "repo": "flake-utils",
2089 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2090 "type": "github"
2091 },
2092 "original": {
2093 "owner": "numtide",
2094 "repo": "flake-utils",
2095 "type": "github"
2096 }
2097 },
2098 "flake-utils_36": {
2099 "locked": {
2100 "lastModified": 1648297722,
2101 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2102 "owner": "numtide",
2103 "repo": "flake-utils",
2104 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2105 "type": "github"
2106 },
2107 "original": {
2108 "owner": "numtide",
2109 "repo": "flake-utils",
2110 "type": "github"
2111 }
2112 },
2113 "flake-utils_37": {
2114 "locked": {
2115 "lastModified": 1667395993,
2116 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2117 "owner": "numtide",
2118 "repo": "flake-utils",
2119 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2120 "type": "github"
2121 },
2122 "original": {
2123 "owner": "numtide",
2124 "repo": "flake-utils",
2125 "type": "github"
2126 }
2127 },
2128 "flake-utils_38": {
2129 "locked": {
2130 "lastModified": 1659877975,
2131 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2132 "owner": "numtide",
2133 "repo": "flake-utils",
2134 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2135 "type": "github"
2136 },
2137 "original": {
2138 "owner": "numtide",
2139 "repo": "flake-utils",
2140 "type": "github"
2141 }
2142 },
2143 "flake-utils_39": {
2144 "locked": {
2145 "lastModified": 1667395993,
2146 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2147 "owner": "numtide",
2148 "repo": "flake-utils",
2149 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2150 "type": "github"
2151 },
2152 "original": {
2153 "owner": "numtide",
2154 "repo": "flake-utils",
2155 "type": "github"
2156 }
2157 },
2158 "flake-utils_4": {
2159 "locked": {
2160 "lastModified": 1609246779,
2161 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2162 "owner": "numtide",
2163 "repo": "flake-utils",
2164 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2165 "type": "github"
2166 },
2167 "original": {
2168 "owner": "numtide",
2169 "repo": "flake-utils",
2170 "type": "github"
2171 }
2172 },
2173 "flake-utils_40": {
2174 "locked": {
2175 "lastModified": 1667395993,
2176 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2177 "owner": "numtide",
2178 "repo": "flake-utils",
2179 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2180 "type": "github"
2181 },
2182 "original": {
2183 "owner": "numtide",
2184 "repo": "flake-utils",
2185 "type": "github"
2186 }
2187 },
2188 "flake-utils_41": {
2189 "locked": {
2190 "lastModified": 1631561581,
2191 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
2192 "owner": "numtide",
2193 "repo": "flake-utils",
2194 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
2195 "type": "github"
2196 },
2197 "original": {
2198 "owner": "numtide",
2199 "repo": "flake-utils",
2200 "type": "github"
2201 }
2202 },
2203 "flake-utils_42": {
2204 "locked": {
2205 "lastModified": 1648297722,
2206 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2207 "owner": "numtide",
2208 "repo": "flake-utils",
2209 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2210 "type": "github"
2211 },
2212 "original": {
2213 "owner": "numtide",
2214 "repo": "flake-utils",
2215 "type": "github"
2216 }
2217 },
2218 "flake-utils_43": {
2219 "locked": {
2220 "lastModified": 1648297722,
2221 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2222 "owner": "numtide",
2223 "repo": "flake-utils",
2224 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2225 "type": "github"
2226 },
2227 "original": {
2228 "owner": "numtide",
2229 "repo": "flake-utils",
2230 "type": "github"
2231 }
2232 },
2233 "flake-utils_44": {
2234 "locked": {
2235 "lastModified": 1648297722,
2236 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2237 "owner": "numtide",
2238 "repo": "flake-utils",
2239 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2240 "type": "github"
2241 },
2242 "original": {
2243 "owner": "numtide",
2244 "repo": "flake-utils",
2245 "type": "github"
2246 }
2247 },
2248 "flake-utils_45": {
2249 "locked": {
2250 "lastModified": 1659877975,
2251 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2252 "owner": "numtide",
2253 "repo": "flake-utils",
2254 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2255 "type": "github"
2256 },
2257 "original": {
2258 "owner": "numtide",
2259 "repo": "flake-utils",
2260 "type": "github"
2261 }
2262 },
2263 "flake-utils_46": {
2264 "locked": {
2265 "lastModified": 1648297722,
2266 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2267 "owner": "numtide",
2268 "repo": "flake-utils",
2269 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2270 "type": "github"
2271 },
2272 "original": {
2273 "owner": "numtide",
2274 "repo": "flake-utils",
2275 "type": "github"
2276 }
2277 },
2278 "flake-utils_47": {
2279 "locked": {
2280 "lastModified": 1649676176,
2281 "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
2282 "owner": "numtide",
2283 "repo": "flake-utils",
2284 "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
2285 "type": "github"
2286 },
2287 "original": {
2288 "owner": "numtide",
2289 "repo": "flake-utils",
2290 "type": "github"
2291 }
2292 },
2293 "flake-utils_48": {
2294 "locked": {
2295 "lastModified": 1609246779,
2296 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2297 "owner": "numtide",
2298 "repo": "flake-utils",
2299 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2300 "type": "github"
2301 },
2302 "original": {
2303 "owner": "numtide",
2304 "repo": "flake-utils",
2305 "type": "github"
2306 }
2307 },
2308 "flake-utils_49": {
2309 "locked": {
2310 "lastModified": 1609246779,
2311 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2312 "owner": "numtide",
2313 "repo": "flake-utils",
2314 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2315 "type": "github"
2316 },
2317 "original": {
2318 "owner": "numtide",
2319 "repo": "flake-utils",
2320 "type": "github"
2321 }
2322 },
2323 "flake-utils_5": {
2324 "locked": {
2325 "lastModified": 1609246779,
2326 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2327 "owner": "numtide",
2328 "repo": "flake-utils",
2329 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2330 "type": "github"
2331 },
2332 "original": {
2333 "owner": "numtide",
2334 "repo": "flake-utils",
2335 "type": "github"
2336 }
2337 },
2338 "flake-utils_50": {
2339 "locked": {
2340 "lastModified": 1631561581,
2341 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
2342 "owner": "numtide",
2343 "repo": "flake-utils",
2344 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
2345 "type": "github"
2346 },
2347 "original": {
2348 "owner": "numtide",
2349 "repo": "flake-utils",
2350 "type": "github"
2351 }
2352 },
2353 "flake-utils_51": {
2354 "locked": {
2355 "lastModified": 1610051610,
2356 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
2357 "owner": "numtide",
2358 "repo": "flake-utils",
2359 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
2360 "type": "github"
2361 },
2362 "original": {
2363 "owner": "numtide",
2364 "repo": "flake-utils",
2365 "type": "github"
2366 }
2367 },
2368 "flake-utils_52": {
2369 "locked": {
2370 "lastModified": 1648297722,
2371 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2372 "owner": "numtide",
2373 "repo": "flake-utils",
2374 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2375 "type": "github"
2376 },
2377 "original": {
2378 "owner": "numtide",
2379 "repo": "flake-utils",
2380 "type": "github"
2381 }
2382 },
2383 "flake-utils_53": {
2384 "locked": {
2385 "lastModified": 1609246779,
2386 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2387 "owner": "numtide",
2388 "repo": "flake-utils",
2389 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2390 "type": "github"
2391 },
2392 "original": {
2393 "owner": "numtide",
2394 "repo": "flake-utils",
2395 "type": "github"
2396 }
2397 },
2398 "flake-utils_54": {
2399 "locked": {
2400 "lastModified": 1609246779,
2401 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2402 "owner": "numtide",
2403 "repo": "flake-utils",
2404 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2405 "type": "github"
2406 },
2407 "original": {
2408 "owner": "numtide",
2409 "repo": "flake-utils",
2410 "type": "github"
2411 }
2412 },
2413 "flake-utils_55": {
2414 "locked": {
2415 "lastModified": 1609246779,
2416 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2417 "owner": "numtide",
2418 "repo": "flake-utils",
2419 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2420 "type": "github"
2421 },
2422 "original": {
2423 "owner": "numtide",
2424 "repo": "flake-utils",
2425 "type": "github"
2426 }
2427 },
2428 "flake-utils_56": {
2429 "locked": {
2430 "lastModified": 1609246779,
2431 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
2432 "owner": "numtide",
2433 "repo": "flake-utils",
2434 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
2435 "type": "github"
2436 },
2437 "original": {
2438 "owner": "numtide",
2439 "repo": "flake-utils",
2440 "type": "github"
2441 }
2442 },
2443 "flake-utils_57": {
2444 "locked": {
2445 "lastModified": 1631561581,
2446 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
2447 "owner": "numtide",
2448 "repo": "flake-utils",
2449 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
2450 "type": "github"
2451 },
2452 "original": {
2453 "owner": "numtide",
2454 "repo": "flake-utils",
2455 "type": "github"
2456 }
2457 },
2458 "flake-utils_58": {
2459 "locked": {
2460 "lastModified": 1610051610,
2461 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
2462 "owner": "numtide",
2463 "repo": "flake-utils",
2464 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
2465 "type": "github"
2466 },
2467 "original": {
2468 "owner": "numtide",
2469 "repo": "flake-utils",
2470 "type": "github"
2471 }
2472 },
2473 "flake-utils_59": {
2474 "locked": {
2475 "lastModified": 1610051610,
2476 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
2477 "owner": "numtide",
2478 "repo": "flake-utils",
2479 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
2480 "type": "github"
2481 },
2482 "original": {
2483 "owner": "numtide",
2484 "repo": "flake-utils",
2485 "type": "github"
2486 }
2487 },
2488 "flake-utils_6": {
2489 "locked": {
2490 "lastModified": 1667395993,
2491 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2492 "owner": "numtide",
2493 "repo": "flake-utils",
2494 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2495 "type": "github"
2496 },
2497 "original": {
2498 "owner": "numtide",
2499 "repo": "flake-utils",
2500 "type": "github"
2501 }
2502 },
2503 "flake-utils_60": {
2504 "locked": {
2505 "lastModified": 1648297722,
2506 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2507 "owner": "numtide",
2508 "repo": "flake-utils",
2509 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2510 "type": "github"
2511 },
2512 "original": {
2513 "owner": "numtide",
2514 "repo": "flake-utils",
2515 "type": "github"
2516 }
2517 },
2518 "flake-utils_61": {
2519 "locked": {
2520 "lastModified": 1667395993,
2521 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2522 "owner": "numtide",
2523 "repo": "flake-utils",
2524 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2525 "type": "github"
2526 },
2527 "original": {
2528 "owner": "numtide",
2529 "repo": "flake-utils",
2530 "type": "github"
2531 }
2532 },
2533 "flake-utils_62": {
2534 "locked": {
2535 "lastModified": 1648297722,
2536 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2537 "owner": "numtide",
2538 "repo": "flake-utils",
2539 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2540 "type": "github"
2541 },
2542 "original": {
2543 "owner": "numtide",
2544 "repo": "flake-utils",
2545 "type": "github"
2546 }
2547 },
2548 "flake-utils_63": {
2549 "locked": {
2550 "lastModified": 1648297722,
2551 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
2552 "owner": "numtide",
2553 "repo": "flake-utils",
2554 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
2555 "type": "github"
2556 },
2557 "original": {
2558 "owner": "numtide",
2559 "repo": "flake-utils",
2560 "type": "github"
2561 }
2562 },
2563 "flake-utils_7": {
2564 "locked": {
2565 "lastModified": 1659877975,
2566 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
2567 "owner": "numtide",
2568 "repo": "flake-utils",
2569 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
2570 "type": "github"
2571 },
2572 "original": {
2573 "owner": "numtide",
2574 "repo": "flake-utils",
2575 "type": "github"
2576 }
2577 },
2578 "flake-utils_8": {
2579 "locked": {
2580 "lastModified": 1667395993,
2581 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
2582 "owner": "numtide",
2583 "repo": "flake-utils",
2584 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
2585 "type": "github"
2586 },
2587 "original": {
2588 "owner": "numtide",
2589 "repo": "flake-utils",
2590 "type": "github"
2591 }
2592 },
2593 "flake-utils_9": {
2594 "locked": {
2595 "lastModified": 1614513358,
2596 "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=",
2597 "owner": "numtide",
2598 "repo": "flake-utils",
2599 "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3",
2600 "type": "github"
2601 },
2602 "original": {
2603 "owner": "numtide",
2604 "repo": "flake-utils",
2605 "type": "github"
2606 }
2607 },
2608 "grocy": {
2609 "flake": false,
2610 "locked": {
2611 "lastModified": 1585166193,
2612 "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
2613 "owner": "grocy",
2614 "repo": "grocy",
2615 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2616 "type": "github"
2617 },
2618 "original": {
2619 "owner": "grocy",
2620 "repo": "grocy",
2621 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2622 "type": "github"
2623 }
2624 },
2625 "grocy_2": {
2626 "flake": false,
2627 "locked": {
2628 "lastModified": 1585166193,
2629 "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
2630 "owner": "grocy",
2631 "repo": "grocy",
2632 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2633 "type": "github"
2634 },
2635 "original": {
2636 "owner": "grocy",
2637 "repo": "grocy",
2638 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
2639 "type": "github"
2640 }
2641 },
2642 "impermanence": {
2643 "locked": {
2644 "lastModified": 1684264534,
2645 "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=",
2646 "owner": "nix-community",
2647 "repo": "impermanence",
2648 "rev": "89253fb1518063556edd5e54509c30ac3089d5e6",
2649 "type": "github"
2650 },
2651 "original": {
2652 "owner": "nix-community",
2653 "ref": "master",
2654 "repo": "impermanence",
2655 "type": "github"
2656 }
2657 },
2658 "landing-page": {
2659 "flake": false,
2660 "locked": {
2661 "lastModified": 1691524124,
2662 "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=",
2663 "ref": "main",
2664 "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf",
2665 "revCount": 573,
2666 "type": "git",
2667 "url": "https://github.com/bastienwirtz/homer.git"
2668 },
2669 "original": {
2670 "ref": "main",
2671 "type": "git",
2672 "url": "https://github.com/bastienwirtz/homer.git"
2673 }
2674 },
2675 "loginctl-linger": {
2676 "locked": {
2677 "lastModified": 1,
2678 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
2679 "path": "../../flakes/loginctl-linger",
2680 "type": "path"
2681 },
2682 "original": {
2683 "path": "../../flakes/loginctl-linger",
2684 "type": "path"
2685 }
2686 },
2687 "loginctl-linger_2": {
2688 "locked": {
2689 "lastModified": 1,
2690 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
2691 "path": "../../flakes/loginctl-linger",
2692 "type": "path"
2693 },
2694 "original": {
2695 "path": "../../flakes/loginctl-linger",
2696 "type": "path"
2697 }
2698 },
2699 "loginctl-linger_3": {
2700 "locked": {
2701 "lastModified": 1,
2702 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
2703 "path": "../../flakes/loginctl-linger",
2704 "type": "path"
2705 },
2706 "original": {
2707 "path": "../../flakes/loginctl-linger",
2708 "type": "path"
2709 }
2710 },
2711 "mail-relay": {
2712 "inputs": {
2713 "environment": "environment_3",
2714 "secrets": "secrets"
2715 },
2716 "locked": {
2717 "lastModified": 1,
2718 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
2719 "path": "../../flakes/private/mail-relay",
2720 "type": "path"
2721 },
2722 "original": {
2723 "path": "../../flakes/private/mail-relay",
2724 "type": "path"
2725 }
2726 },
2727 "mail-relay_2": {
2728 "inputs": {
2729 "environment": "environment_20",
2730 "secrets": "secrets_15"
2731 },
2732 "locked": {
2733 "lastModified": 1,
2734 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
2735 "path": "../../flakes/private/mail-relay",
2736 "type": "path"
2737 },
2738 "original": {
2739 "path": "../../flakes/private/mail-relay",
2740 "type": "path"
2741 }
2742 },
2743 "mastodon": {
2744 "flake": false,
2745 "locked": {
2746 "lastModified": 1582790581,
2747 "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
2748 "owner": "tootsuite",
2749 "repo": "mastodon",
2750 "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
2751 "type": "github"
2752 },
2753 "original": {
2754 "owner": "tootsuite",
2755 "ref": "v2.9.4",
2756 "repo": "mastodon",
2757 "type": "github"
2758 }
2759 },
2760 "mastodon_2": {
2761 "flake": false,
2762 "locked": {
2763 "lastModified": 1582790581,
2764 "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
2765 "owner": "tootsuite",
2766 "repo": "mastodon",
2767 "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
2768 "type": "github"
2769 },
2770 "original": {
2771 "owner": "tootsuite",
2772 "ref": "v2.9.4",
2773 "repo": "mastodon",
2774 "type": "github"
2775 }
2776 },
2777 "mediagoblin": {
2778 "flake": false,
2779 "locked": {
2780 "lastModified": 1531090939,
2781 "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
2782 "ref": "stable",
2783 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2784 "revCount": 4805,
2785 "submodules": true,
2786 "type": "git",
2787 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2788 },
2789 "original": {
2790 "ref": "stable",
2791 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2792 "submodules": true,
2793 "type": "git",
2794 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2795 }
2796 },
2797 "mediagoblin_2": {
2798 "flake": false,
2799 "locked": {
2800 "lastModified": 1531090939,
2801 "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
2802 "ref": "stable",
2803 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2804 "revCount": 4805,
2805 "submodules": true,
2806 "type": "git",
2807 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2808 },
2809 "original": {
2810 "ref": "stable",
2811 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
2812 "submodules": true,
2813 "type": "git",
2814 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
2815 }
2816 },
2817 "milters": {
2818 "inputs": {
2819 "environment": "environment_4",
2820 "files-watcher": "files-watcher",
2821 "openarc": "openarc",
2822 "opendmarc": "opendmarc",
2823 "secrets": "secrets_2"
2824 },
2825 "locked": {
2826 "lastModified": 1,
2827 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
2828 "path": "../../flakes/private/milters",
2829 "type": "path"
2830 },
2831 "original": {
2832 "path": "../../flakes/private/milters",
2833 "type": "path"
2834 }
2835 },
2836 "monitoring": {
2837 "inputs": {
2838 "environment": "environment_5",
2839 "naemon": "naemon",
2840 "nixpkgs-lib": "nixpkgs-lib",
2841 "secrets": "secrets_3"
2842 },
2843 "locked": {
2844 "lastModified": 1,
2845 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2846 "path": "../../flakes/private/monitoring",
2847 "type": "path"
2848 },
2849 "original": {
2850 "path": "../../flakes/private/monitoring",
2851 "type": "path"
2852 }
2853 },
2854 "monitoring_2": {
2855 "inputs": {
2856 "environment": "environment_9",
2857 "naemon": "naemon_2",
2858 "nixpkgs-lib": "nixpkgs-lib_4",
2859 "secrets": "secrets_7"
2860 },
2861 "locked": {
2862 "lastModified": 1,
2863 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2864 "path": "../../flakes/private/monitoring",
2865 "type": "path"
2866 },
2867 "original": {
2868 "path": "../../flakes/private/monitoring",
2869 "type": "path"
2870 }
2871 },
2872 "monitoring_3": {
2873 "inputs": {
2874 "environment": "environment_21",
2875 "naemon": "naemon_4",
2876 "nixpkgs-lib": "nixpkgs-lib_14",
2877 "secrets": "secrets_16"
2878 },
2879 "locked": {
2880 "lastModified": 1,
2881 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2882 "path": "../../flakes/private/monitoring",
2883 "type": "path"
2884 },
2885 "original": {
2886 "path": "../../flakes/private/monitoring",
2887 "type": "path"
2888 }
2889 },
2890 "monitoring_4": {
2891 "inputs": {
2892 "environment": "environment_24",
2893 "naemon": "naemon_5",
2894 "nixpkgs-lib": "nixpkgs-lib_17",
2895 "secrets": "secrets_18"
2896 },
2897 "locked": {
2898 "lastModified": 1,
2899 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2900 "path": "../../flakes/private/monitoring",
2901 "type": "path"
2902 },
2903 "original": {
2904 "path": "../../flakes/private/monitoring",
2905 "type": "path"
2906 }
2907 },
2908 "multi-apache-container": {
2909 "inputs": {
2910 "files-watcher": "files-watcher_11",
2911 "myuids": "myuids_25"
2912 },
2913 "locked": {
2914 "lastModified": 1,
2915 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
2916 "path": "../../flakes/multi-apache-container",
2917 "type": "path"
2918 },
2919 "original": {
2920 "path": "../../flakes/multi-apache-container",
2921 "type": "path"
2922 }
2923 },
2924 "my-lib": {
2925 "inputs": {
2926 "colmena": "colmena",
2927 "disko": "disko",
2928 "flake-parts": "flake-parts",
2929 "nixos-anywhere": "nixos-anywhere",
2930 "nixpkgs": "nixpkgs_6"
2931 },
2932 "locked": {
2933 "lastModified": 1,
2934 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
2935 "path": "../../flakes/lib",
2936 "type": "path"
2937 },
2938 "original": {
2939 "path": "../../flakes/lib",
2940 "type": "path"
2941 }
2942 },
2943 "my-lib_2": {
2944 "inputs": {
2945 "colmena": "colmena_2",
2946 "disko": "disko_2",
2947 "flake-parts": "flake-parts_3",
2948 "nixos-anywhere": "nixos-anywhere_2",
2949 "nixpkgs": "nixpkgs_15"
2950 },
2951 "locked": {
2952 "lastModified": 1,
2953 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
2954 "path": "../../flakes/lib",
2955 "type": "path"
2956 },
2957 "original": {
2958 "path": "../../flakes/lib",
2959 "type": "path"
2960 }
2961 },
2962 "my-lib_3": {
2963 "inputs": {
2964 "colmena": "colmena_3",
2965 "disko": "disko_3",
2966 "flake-parts": "flake-parts_5",
2967 "nixos-anywhere": "nixos-anywhere_3",
2968 "nixpkgs": "nixpkgs_22"
2969 },
2970 "locked": {
2971 "lastModified": 1,
2972 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
2973 "path": "../../flakes/lib",
2974 "type": "path"
2975 },
2976 "original": {
2977 "path": "../../flakes/lib",
2978 "type": "path"
2979 }
2980 },
2981 "my-lib_4": {
2982 "inputs": {
2983 "colmena": "colmena_4",
2984 "disko": "disko_4",
2985 "flake-parts": "flake-parts_11",
2986 "nixos-anywhere": "nixos-anywhere_4",
2987 "nixpkgs": "nixpkgs_53"
2988 },
2989 "locked": {
2990 "lastModified": 1,
2991 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
2992 "path": "../../flakes/lib",
2993 "type": "path"
2994 },
2995 "original": {
2996 "path": "../../flakes/lib",
2997 "type": "path"
2998 }
2999 },
3000 "my-lib_5": {
3001 "inputs": {
3002 "colmena": "colmena_5",
3003 "disko": "disko_5",
3004 "flake-parts": "flake-parts_13",
3005 "nixos-anywhere": "nixos-anywhere_5",
3006 "nixpkgs": "nixpkgs_61"
3007 },
3008 "locked": {
3009 "lastModified": 1,
3010 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3011 "path": "../../flakes/lib",
3012 "type": "path"
3013 },
3014 "original": {
3015 "path": "../../flakes/lib",
3016 "type": "path"
3017 }
3018 },
3019 "my-lib_6": {
3020 "inputs": {
3021 "colmena": "colmena_6",
3022 "disko": "disko_6",
3023 "flake-parts": "flake-parts_15",
3024 "nixos-anywhere": "nixos-anywhere_6",
3025 "nixpkgs": "nixpkgs_69"
3026 },
3027 "locked": {
3028 "lastModified": 1,
3029 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
3030 "path": "../../flakes/lib",
3031 "type": "path"
3032 },
3033 "original": {
3034 "path": "../../flakes/lib",
3035 "type": "path"
3036 }
3037 },
3038 "mypackages": {
3039 "inputs": {
3040 "flake-parts": "flake-parts_2",
3041 "nixpkgs": "nixpkgs_11",
3042 "webapps-ttrss": "webapps-ttrss"
3043 },
3044 "locked": {
3045 "lastModified": 1,
3046 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3047 "path": "../../mypackages",
3048 "type": "path"
3049 },
3050 "original": {
3051 "path": "../../mypackages",
3052 "type": "path"
3053 }
3054 },
3055 "mypackages_10": {
3056 "inputs": {
3057 "flake-parts": "flake-parts_17",
3058 "nixpkgs": "nixpkgs_76",
3059 "webapps-ttrss": "webapps-ttrss_11"
3060 },
3061 "locked": {
3062 "lastModified": 1,
3063 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3064 "path": "../mypackages",
3065 "type": "path"
3066 },
3067 "original": {
3068 "path": "../mypackages",
3069 "type": "path"
3070 }
3071 },
3072 "mypackages_11": {
3073 "inputs": {
3074 "flake-parts": "flake-parts_18",
3075 "nixpkgs": "nixpkgs_78",
3076 "webapps-ttrss": "webapps-ttrss_12"
3077 },
3078 "locked": {
3079 "lastModified": 1,
3080 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3081 "path": "../mypackages",
3082 "type": "path"
3083 },
3084 "original": {
3085 "path": "../mypackages",
3086 "type": "path"
3087 }
3088 },
3089 "mypackages_12": {
3090 "inputs": {
3091 "flake-parts": "flake-parts_21",
3092 "nixpkgs": "nixpkgs_101",
3093 "webapps-ttrss": "webapps-ttrss_14"
3094 },
3095 "locked": {
3096 "lastModified": 1,
3097 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3098 "path": "../../mypackages",
3099 "type": "path"
3100 },
3101 "original": {
3102 "path": "../../mypackages",
3103 "type": "path"
3104 }
3105 },
3106 "mypackages_13": {
3107 "inputs": {
3108 "flake-parts": "flake-parts_22",
3109 "nixpkgs": "nixpkgs_102",
3110 "webapps-ttrss": "webapps-ttrss_15"
3111 },
3112 "locked": {
3113 "lastModified": 1,
3114 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3115 "path": "../mypackages",
3116 "type": "path"
3117 },
3118 "original": {
3119 "path": "../mypackages",
3120 "type": "path"
3121 }
3122 },
3123 "mypackages_2": {
3124 "inputs": {
3125 "flake-parts": "flake-parts_4",
3126 "nixpkgs": "nixpkgs_18",
3127 "webapps-ttrss": "webapps-ttrss_2"
3128 },
3129 "locked": {
3130 "lastModified": 1,
3131 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3132 "path": "../../mypackages",
3133 "type": "path"
3134 },
3135 "original": {
3136 "path": "../../mypackages",
3137 "type": "path"
3138 }
3139 },
3140 "mypackages_3": {
3141 "inputs": {
3142 "flake-parts": "flake-parts_6",
3143 "nixpkgs": "nixpkgs_34",
3144 "webapps-ttrss": "webapps-ttrss_3"
3145 },
3146 "locked": {
3147 "lastModified": 1,
3148 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3149 "path": "../../mypackages",
3150 "type": "path"
3151 },
3152 "original": {
3153 "path": "../../mypackages",
3154 "type": "path"
3155 }
3156 },
3157 "mypackages_4": {
3158 "inputs": {
3159 "flake-parts": "flake-parts_7",
3160 "nixpkgs": "nixpkgs_37",
3161 "webapps-ttrss": "webapps-ttrss_4"
3162 },
3163 "locked": {
3164 "lastModified": 1,
3165 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3166 "path": "../mypackages",
3167 "type": "path"
3168 },
3169 "original": {
3170 "path": "../mypackages",
3171 "type": "path"
3172 }
3173 },
3174 "mypackages_5": {
3175 "inputs": {
3176 "flake-parts": "flake-parts_8",
3177 "nixpkgs": "nixpkgs_39",
3178 "webapps-ttrss": "webapps-ttrss_5"
3179 },
3180 "locked": {
3181 "lastModified": 1,
3182 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3183 "path": "../mypackages",
3184 "type": "path"
3185 },
3186 "original": {
3187 "path": "../mypackages",
3188 "type": "path"
3189 }
3190 },
3191 "mypackages_6": {
3192 "inputs": {
3193 "flake-parts": "flake-parts_10",
3194 "nixpkgs": "nixpkgs_47",
3195 "webapps-ttrss": "webapps-ttrss_7"
3196 },
3197 "locked": {
3198 "lastModified": 1,
3199 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3200 "path": "../mypackages",
3201 "type": "path"
3202 },
3203 "original": {
3204 "path": "../mypackages",
3205 "type": "path"
3206 }
3207 },
3208 "mypackages_7": {
3209 "inputs": {
3210 "flake-parts": "flake-parts_12",
3211 "nixpkgs": "nixpkgs_57",
3212 "webapps-ttrss": "webapps-ttrss_8"
3213 },
3214 "locked": {
3215 "lastModified": 1,
3216 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3217 "path": "../../mypackages",
3218 "type": "path"
3219 },
3220 "original": {
3221 "path": "../../mypackages",
3222 "type": "path"
3223 }
3224 },
3225 "mypackages_8": {
3226 "inputs": {
3227 "flake-parts": "flake-parts_14",
3228 "nixpkgs": "nixpkgs_65",
3229 "webapps-ttrss": "webapps-ttrss_9"
3230 },
3231 "locked": {
3232 "lastModified": 1,
3233 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3234 "path": "../../mypackages",
3235 "type": "path"
3236 },
3237 "original": {
3238 "path": "../../mypackages",
3239 "type": "path"
3240 }
3241 },
3242 "mypackages_9": {
3243 "inputs": {
3244 "flake-parts": "flake-parts_16",
3245 "nixpkgs": "nixpkgs_72",
3246 "webapps-ttrss": "webapps-ttrss_10"
3247 },
3248 "locked": {
3249 "lastModified": 1,
3250 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
3251 "path": "../../mypackages",
3252 "type": "path"
3253 },
3254 "original": {
3255 "path": "../../mypackages",
3256 "type": "path"
3257 }
3258 },
3259 "myuids": {
3260 "locked": {
3261 "lastModified": 1,
3262 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3263 "path": "../myuids",
3264 "type": "path"
3265 },
3266 "original": {
3267 "path": "../myuids",
3268 "type": "path"
3269 }
3270 },
3271 "myuids_10": {
3272 "locked": {
3273 "lastModified": 1,
3274 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3275 "path": "../myuids",
3276 "type": "path"
3277 },
3278 "original": {
3279 "path": "../myuids",
3280 "type": "path"
3281 }
3282 },
3283 "myuids_11": {
3284 "locked": {
3285 "lastModified": 1,
3286 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3287 "path": "../myuids",
3288 "type": "path"
3289 },
3290 "original": {
3291 "path": "../myuids",
3292 "type": "path"
3293 }
3294 },
3295 "myuids_12": {
3296 "locked": {
3297 "lastModified": 1,
3298 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3299 "path": "../myuids",
3300 "type": "path"
3301 },
3302 "original": {
3303 "path": "../myuids",
3304 "type": "path"
3305 }
3306 },
3307 "myuids_13": {
3308 "locked": {
3309 "lastModified": 1,
3310 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3311 "path": "../myuids",
3312 "type": "path"
3313 },
3314 "original": {
3315 "path": "../myuids",
3316 "type": "path"
3317 }
3318 },
3319 "myuids_14": {
3320 "locked": {
3321 "lastModified": 1,
3322 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3323 "path": "../myuids",
3324 "type": "path"
3325 },
3326 "original": {
3327 "path": "../myuids",
3328 "type": "path"
3329 }
3330 },
3331 "myuids_15": {
3332 "locked": {
3333 "lastModified": 1,
3334 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3335 "path": "../../myuids",
3336 "type": "path"
3337 },
3338 "original": {
3339 "path": "../../myuids",
3340 "type": "path"
3341 }
3342 },
3343 "myuids_16": {
3344 "locked": {
3345 "lastModified": 1,
3346 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3347 "path": "../myuids",
3348 "type": "path"
3349 },
3350 "original": {
3351 "path": "../myuids",
3352 "type": "path"
3353 }
3354 },
3355 "myuids_17": {
3356 "locked": {
3357 "lastModified": 1,
3358 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3359 "path": "../myuids",
3360 "type": "path"
3361 },
3362 "original": {
3363 "path": "../myuids",
3364 "type": "path"
3365 }
3366 },
3367 "myuids_18": {
3368 "locked": {
3369 "lastModified": 1,
3370 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3371 "path": "../myuids",
3372 "type": "path"
3373 },
3374 "original": {
3375 "path": "../myuids",
3376 "type": "path"
3377 }
3378 },
3379 "myuids_19": {
3380 "locked": {
3381 "lastModified": 1,
3382 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3383 "path": "../myuids",
3384 "type": "path"
3385 },
3386 "original": {
3387 "path": "../myuids",
3388 "type": "path"
3389 }
3390 },
3391 "myuids_2": {
3392 "locked": {
3393 "lastModified": 1,
3394 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3395 "path": "../myuids",
3396 "type": "path"
3397 },
3398 "original": {
3399 "path": "../myuids",
3400 "type": "path"
3401 }
3402 },
3403 "myuids_20": {
3404 "locked": {
3405 "lastModified": 1,
3406 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3407 "path": "../myuids",
3408 "type": "path"
3409 },
3410 "original": {
3411 "path": "../myuids",
3412 "type": "path"
3413 }
3414 },
3415 "myuids_21": {
3416 "locked": {
3417 "lastModified": 1,
3418 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3419 "path": "../myuids",
3420 "type": "path"
3421 },
3422 "original": {
3423 "path": "../myuids",
3424 "type": "path"
3425 }
3426 },
3427 "myuids_22": {
3428 "locked": {
3429 "lastModified": 1,
3430 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3431 "path": "../myuids",
3432 "type": "path"
3433 },
3434 "original": {
3435 "path": "../myuids",
3436 "type": "path"
3437 }
3438 },
3439 "myuids_23": {
3440 "locked": {
3441 "lastModified": 1,
3442 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3443 "path": "../../flakes/myuids",
3444 "type": "path"
3445 },
3446 "original": {
3447 "path": "../../flakes/myuids",
3448 "type": "path"
3449 }
3450 },
3451 "myuids_24": {
3452 "locked": {
3453 "lastModified": 1,
3454 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3455 "path": "../../myuids",
3456 "type": "path"
3457 },
3458 "original": {
3459 "path": "../../myuids",
3460 "type": "path"
3461 }
3462 },
3463 "myuids_25": {
3464 "locked": {
3465 "lastModified": 1,
3466 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3467 "path": "../myuids",
3468 "type": "path"
3469 },
3470 "original": {
3471 "path": "../myuids",
3472 "type": "path"
3473 }
3474 },
3475 "myuids_26": {
3476 "locked": {
3477 "lastModified": 1,
3478 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3479 "path": "../../flakes/myuids",
3480 "type": "path"
3481 },
3482 "original": {
3483 "path": "../../flakes/myuids",
3484 "type": "path"
3485 }
3486 },
3487 "myuids_27": {
3488 "locked": {
3489 "lastModified": 1,
3490 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3491 "path": "../../myuids",
3492 "type": "path"
3493 },
3494 "original": {
3495 "path": "../../myuids",
3496 "type": "path"
3497 }
3498 },
3499 "myuids_28": {
3500 "locked": {
3501 "lastModified": 1,
3502 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3503 "path": "../../myuids",
3504 "type": "path"
3505 },
3506 "original": {
3507 "path": "../../myuids",
3508 "type": "path"
3509 }
3510 },
3511 "myuids_29": {
3512 "locked": {
3513 "lastModified": 1,
3514 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3515 "path": "../myuids",
3516 "type": "path"
3517 },
3518 "original": {
3519 "path": "../myuids",
3520 "type": "path"
3521 }
3522 },
3523 "myuids_3": {
3524 "locked": {
3525 "lastModified": 1,
3526 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3527 "path": "../../flakes/myuids",
3528 "type": "path"
3529 },
3530 "original": {
3531 "path": "../../flakes/myuids",
3532 "type": "path"
3533 }
3534 },
3535 "myuids_30": {
3536 "locked": {
3537 "lastModified": 1,
3538 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3539 "path": "../myuids",
3540 "type": "path"
3541 },
3542 "original": {
3543 "path": "../myuids",
3544 "type": "path"
3545 }
3546 },
3547 "myuids_31": {
3548 "locked": {
3549 "lastModified": 1,
3550 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3551 "path": "../myuids",
3552 "type": "path"
3553 },
3554 "original": {
3555 "path": "../myuids",
3556 "type": "path"
3557 }
3558 },
3559 "myuids_32": {
3560 "locked": {
3561 "lastModified": 1,
3562 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3563 "path": "../myuids",
3564 "type": "path"
3565 },
3566 "original": {
3567 "path": "../myuids",
3568 "type": "path"
3569 }
3570 },
3571 "myuids_33": {
3572 "locked": {
3573 "lastModified": 1,
3574 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3575 "path": "../myuids",
3576 "type": "path"
3577 },
3578 "original": {
3579 "path": "../myuids",
3580 "type": "path"
3581 }
3582 },
3583 "myuids_34": {
3584 "locked": {
3585 "lastModified": 1,
3586 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3587 "path": "../myuids",
3588 "type": "path"
3589 },
3590 "original": {
3591 "path": "../myuids",
3592 "type": "path"
3593 }
3594 },
3595 "myuids_35": {
3596 "locked": {
3597 "lastModified": 1,
3598 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3599 "path": "../myuids",
3600 "type": "path"
3601 },
3602 "original": {
3603 "path": "../myuids",
3604 "type": "path"
3605 }
3606 },
3607 "myuids_36": {
3608 "locked": {
3609 "lastModified": 1,
3610 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3611 "path": "../myuids",
3612 "type": "path"
3613 },
3614 "original": {
3615 "path": "../myuids",
3616 "type": "path"
3617 }
3618 },
3619 "myuids_37": {
3620 "locked": {
3621 "lastModified": 1,
3622 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3623 "path": "../myuids",
3624 "type": "path"
3625 },
3626 "original": {
3627 "path": "../myuids",
3628 "type": "path"
3629 }
3630 },
3631 "myuids_38": {
3632 "locked": {
3633 "lastModified": 1,
3634 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3635 "path": "../myuids",
3636 "type": "path"
3637 },
3638 "original": {
3639 "path": "../myuids",
3640 "type": "path"
3641 }
3642 },
3643 "myuids_39": {
3644 "locked": {
3645 "lastModified": 1,
3646 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3647 "path": "../myuids",
3648 "type": "path"
3649 },
3650 "original": {
3651 "path": "../myuids",
3652 "type": "path"
3653 }
3654 },
3655 "myuids_4": {
3656 "locked": {
3657 "lastModified": 1,
3658 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3659 "path": "../myuids",
3660 "type": "path"
3661 },
3662 "original": {
3663 "path": "../myuids",
3664 "type": "path"
3665 }
3666 },
3667 "myuids_40": {
3668 "locked": {
3669 "lastModified": 1,
3670 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3671 "path": "../myuids",
3672 "type": "path"
3673 },
3674 "original": {
3675 "path": "../myuids",
3676 "type": "path"
3677 }
3678 },
3679 "myuids_41": {
3680 "locked": {
3681 "lastModified": 1,
3682 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3683 "path": "../myuids",
3684 "type": "path"
3685 },
3686 "original": {
3687 "path": "../myuids",
3688 "type": "path"
3689 }
3690 },
3691 "myuids_42": {
3692 "locked": {
3693 "lastModified": 1,
3694 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3695 "path": "../../myuids",
3696 "type": "path"
3697 },
3698 "original": {
3699 "path": "../../myuids",
3700 "type": "path"
3701 }
3702 },
3703 "myuids_5": {
3704 "locked": {
3705 "lastModified": 1,
3706 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3707 "path": "../myuids",
3708 "type": "path"
3709 },
3710 "original": {
3711 "path": "../myuids",
3712 "type": "path"
3713 }
3714 },
3715 "myuids_6": {
3716 "locked": {
3717 "lastModified": 1,
3718 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3719 "path": "../../myuids",
3720 "type": "path"
3721 },
3722 "original": {
3723 "path": "../../myuids",
3724 "type": "path"
3725 }
3726 },
3727 "myuids_7": {
3728 "locked": {
3729 "lastModified": 1,
3730 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3731 "path": "../../flakes/myuids",
3732 "type": "path"
3733 },
3734 "original": {
3735 "path": "../../flakes/myuids",
3736 "type": "path"
3737 }
3738 },
3739 "myuids_8": {
3740 "locked": {
3741 "lastModified": 1,
3742 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3743 "path": "../../myuids",
3744 "type": "path"
3745 },
3746 "original": {
3747 "path": "../../myuids",
3748 "type": "path"
3749 }
3750 },
3751 "myuids_9": {
3752 "locked": {
3753 "lastModified": 1,
3754 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
3755 "path": "../myuids",
3756 "type": "path"
3757 },
3758 "original": {
3759 "path": "../myuids",
3760 "type": "path"
3761 }
3762 },
3763 "n-backup-2": {
3764 "inputs": {
3765 "chatons": "chatons",
3766 "environment": "environment_2",
3767 "loginctl-linger": "loginctl-linger",
3768 "mail-relay": "mail-relay",
3769 "milters": "milters",
3770 "monitoring": "monitoring",
3771 "my-lib": "my-lib",
3772 "myuids": "myuids_3",
3773 "nixpkgs": "nixpkgs_7",
3774 "openarc": "openarc_3",
3775 "opendmarc": "opendmarc_2",
3776 "openldap": "openldap",
3777 "rsync_backup": "rsync_backup",
3778 "secrets": "secrets_6",
3779 "system": "system"
3780 },
3781 "locked": {
3782 "lastModified": 1,
3783 "narHash": "sha256-0CPGGyOWQadU9c8y+A4XtveOrmkMlFiH+WJ55RPzJnE=",
3784 "path": "../systems/backup-2",
3785 "type": "path"
3786 },
3787 "original": {
3788 "path": "../systems/backup-2",
3789 "type": "path"
3790 }
3791 },
3792 "n-dilion": {
3793 "inputs": {
3794 "environment": "environment_8",
3795 "files-watcher": "files-watcher_4",
3796 "loginctl-linger": "loginctl-linger_2",
3797 "monitoring": "monitoring_2",
3798 "my-lib": "my-lib_2",
3799 "myuids": "myuids_7",
3800 "nixpkgs": "nixpkgs_16",
3801 "secrets": "secrets_8",
3802 "ssh": "ssh",
3803 "system": "system_2"
3804 },
3805 "locked": {
3806 "lastModified": 1,
3807 "narHash": "sha256-Ctp8QY0OkGwv/YkOlipwM1ldEz7OebVDbAqg1O/tRe8=",
3808 "path": "../systems/dilion",
3809 "type": "path"
3810 },
3811 "original": {
3812 "path": "../systems/dilion",
3813 "type": "path"
3814 }
3815 },
3816 "n-eldiron": {
3817 "inputs": {
3818 "dns-nix": "dns-nix",
3819 "my-lib": "my-lib_3",
3820 "nixpkgs": "nixpkgs_23",
3821 "private-buildbot": "private-buildbot",
3822 "private-chatons": "private-chatons",
3823 "private-environment": "private-environment",
3824 "private-milters": "private-milters",
3825 "private-monitoring": "private-monitoring",
3826 "private-openarc": "private-openarc",
3827 "private-opendmarc": "private-opendmarc",
3828 "private-openldap": "private-openldap",
3829 "private-paste": "private-paste",
3830 "private-peertube": "private-peertube",
3831 "private-php": "private-php",
3832 "private-ssh": "private-ssh",
3833 "private-system": "private-system",
3834 "public-copanier": "public-copanier",
3835 "public-diaspora": "public-diaspora",
3836 "public-etherpad-lite": "public-etherpad-lite",
3837 "public-fiche": "public-fiche",
3838 "public-files-watcher": "public-files-watcher",
3839 "public-grocy": "public-grocy",
3840 "public-loginctl-linger": "public-loginctl-linger",
3841 "public-mastodon": "public-mastodon",
3842 "public-mediagoblin": "public-mediagoblin",
3843 "public-multi-apache-container": "public-multi-apache-container",
3844 "public-mypackages": "public-mypackages",
3845 "public-myuids": "public-myuids",
3846 "public-openarc": "public-openarc",
3847 "public-opendmarc": "public-opendmarc",
3848 "public-peertube": "public-peertube",
3849 "public-secrets": "public-secrets",
3850 "public-surfer": "public-surfer",
3851 "public-taskwarrior-web": "public-taskwarrior-web"
3852 },
3853 "locked": {
3854 "lastModified": 1,
3855 "narHash": "sha256-g9f3SCavl9ssNr8Xw9Z8KkpeEwCYv+47dqwoIPneMSs=",
3856 "path": "../systems/eldiron",
3857 "type": "path"
3858 },
3859 "original": {
3860 "path": "../systems/eldiron",
3861 "type": "path"
3862 }
3863 },
3864 "n-monitoring-1": {
3865 "inputs": {
3866 "chatons": "chatons_2",
3867 "environment": "environment_19",
3868 "files-watcher": "files-watcher_9",
3869 "loginctl-linger": "loginctl-linger_3",
3870 "mail-relay": "mail-relay_2",
3871 "monitoring": "monitoring_3",
3872 "my-lib": "my-lib_4",
3873 "myuids": "myuids_23",
3874 "nixpkgs": "nixpkgs_54",
3875 "php": "php",
3876 "secrets": "secrets_17",
3877 "system": "system_3"
3878 },
3879 "locked": {
3880 "lastModified": 1,
3881 "narHash": "sha256-kLIVhZAxEWcN3W1AaF/gmopYuRdq0U43jkA4hliY50I=",
3882 "path": "../systems/monitoring-1",
3883 "type": "path"
3884 },
3885 "original": {
3886 "path": "../systems/monitoring-1",
3887 "type": "path"
3888 }
3889 },
3890 "n-quatresaisons": {
3891 "inputs": {
3892 "environment": "environment_23",
3893 "files-watcher": "files-watcher_10",
3894 "landing-page": "landing-page",
3895 "monitoring": "monitoring_4",
3896 "multi-apache-container": "multi-apache-container",
3897 "my-lib": "my-lib_5",
3898 "myuids": "myuids_26",
3899 "nixpkgs": "nixpkgs_62",
3900 "php": "php_2",
3901 "secrets": "secrets_19",
3902 "system": "system_4"
3903 },
3904 "locked": {
3905 "lastModified": 1,
3906 "narHash": "sha256-FtjFgqcSXs0dTkbUggbPwaDeCoOoYZragHCUkcyq538=",
3907 "path": "../systems/quatresaisons",
3908 "type": "path"
3909 },
3910 "original": {
3911 "path": "../systems/quatresaisons",
3912 "type": "path"
3913 }
3914 },
3915 "n-zoldene": {
3916 "inputs": {
3917 "impermanence": "impermanence",
3918 "my-lib": "my-lib_6",
3919 "nixpkgs": "nixpkgs_70",
3920 "private-environment": "private-environment_2",
3921 "private-system": "private-system_2",
3922 "public-secrets": "public-secrets_2"
3923 },
3924 "locked": {
3925 "lastModified": 1,
3926 "narHash": "sha256-YSYLjETf7yMwdHeEisU1V7e5O3yB+YxVoIPLi00PCdo=",
3927 "path": "../systems/zoldene",
3928 "type": "path"
3929 },
3930 "original": {
3931 "path": "../systems/zoldene",
3932 "type": "path"
3933 }
3934 },
3935 "naemon": {
3936 "locked": {
3937 "lastModified": 1,
3938 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
3939 "path": "../../naemon",
3940 "type": "path"
3941 },
3942 "original": {
3943 "path": "../../naemon",
3944 "type": "path"
3945 }
3946 },
3947 "naemon_2": {
3948 "locked": {
3949 "lastModified": 1,
3950 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
3951 "path": "../../naemon",
3952 "type": "path"
3953 },
3954 "original": {
3955 "path": "../../naemon",
3956 "type": "path"
3957 }
3958 },
3959 "naemon_3": {
3960 "locked": {
3961 "lastModified": 1,
3962 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
3963 "path": "../../naemon",
3964 "type": "path"
3965 },
3966 "original": {
3967 "path": "../../naemon",
3968 "type": "path"
3969 }
3970 },
3971 "naemon_4": {
3972 "locked": {
3973 "lastModified": 1,
3974 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
3975 "path": "../../naemon",
3976 "type": "path"
3977 },
3978 "original": {
3979 "path": "../../naemon",
3980 "type": "path"
3981 }
3982 },
3983 "naemon_5": {
3984 "locked": {
3985 "lastModified": 1,
3986 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
3987 "path": "../../naemon",
3988 "type": "path"
3989 },
3990 "original": {
3991 "path": "../../naemon",
3992 "type": "path"
3993 }
3994 },
3995 "naemon_6": {
3996 "locked": {
3997 "lastModified": 1,
3998 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
3999 "path": "../../naemon",
4000 "type": "path"
4001 },
4002 "original": {
4003 "path": "../../naemon",
4004 "type": "path"
4005 }
4006 },
4007 "nixos-2305": {
4008 "locked": {
4009 "lastModified": 1687938137,
4010 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4011 "owner": "NixOS",
4012 "repo": "nixpkgs",
4013 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4014 "type": "github"
4015 },
4016 "original": {
4017 "owner": "NixOS",
4018 "ref": "release-23.05",
4019 "repo": "nixpkgs",
4020 "type": "github"
4021 }
4022 },
4023 "nixos-2305_2": {
4024 "locked": {
4025 "lastModified": 1687938137,
4026 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4027 "owner": "NixOS",
4028 "repo": "nixpkgs",
4029 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4030 "type": "github"
4031 },
4032 "original": {
4033 "owner": "NixOS",
4034 "ref": "release-23.05",
4035 "repo": "nixpkgs",
4036 "type": "github"
4037 }
4038 },
4039 "nixos-2305_3": {
4040 "locked": {
4041 "lastModified": 1687938137,
4042 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4043 "owner": "NixOS",
4044 "repo": "nixpkgs",
4045 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4046 "type": "github"
4047 },
4048 "original": {
4049 "owner": "NixOS",
4050 "ref": "release-23.05",
4051 "repo": "nixpkgs",
4052 "type": "github"
4053 }
4054 },
4055 "nixos-2305_4": {
4056 "locked": {
4057 "lastModified": 1687938137,
4058 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4059 "owner": "NixOS",
4060 "repo": "nixpkgs",
4061 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4062 "type": "github"
4063 },
4064 "original": {
4065 "owner": "NixOS",
4066 "ref": "release-23.05",
4067 "repo": "nixpkgs",
4068 "type": "github"
4069 }
4070 },
4071 "nixos-2305_5": {
4072 "locked": {
4073 "lastModified": 1687938137,
4074 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4075 "owner": "NixOS",
4076 "repo": "nixpkgs",
4077 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4078 "type": "github"
4079 },
4080 "original": {
4081 "owner": "NixOS",
4082 "ref": "release-23.05",
4083 "repo": "nixpkgs",
4084 "type": "github"
4085 }
4086 },
4087 "nixos-2305_6": {
4088 "locked": {
4089 "lastModified": 1687938137,
4090 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4091 "owner": "NixOS",
4092 "repo": "nixpkgs",
4093 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4094 "type": "github"
4095 },
4096 "original": {
4097 "owner": "NixOS",
4098 "ref": "release-23.05",
4099 "repo": "nixpkgs",
4100 "type": "github"
4101 }
4102 },
4103 "nixos-2305_7": {
4104 "locked": {
4105 "lastModified": 1687938137,
4106 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
4107 "owner": "NixOS",
4108 "repo": "nixpkgs",
4109 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
4110 "type": "github"
4111 },
4112 "original": {
4113 "owner": "NixOS",
4114 "ref": "release-23.05",
4115 "repo": "nixpkgs",
4116 "type": "github"
4117 }
4118 },
4119 "nixos-anywhere": {
4120 "inputs": {
4121 "disko": [
4122 "n-backup-2",
4123 "my-lib",
4124 "disko"
4125 ],
4126 "flake-parts": [
4127 "n-backup-2",
4128 "my-lib",
4129 "flake-parts"
4130 ],
4131 "nixos-2305": "nixos-2305",
4132 "nixos-images": "nixos-images",
4133 "nixpkgs": "nixpkgs_5",
4134 "treefmt-nix": "treefmt-nix"
4135 },
4136 "locked": {
4137 "lastModified": 1689945193,
4138 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4139 "owner": "numtide",
4140 "repo": "nixos-anywhere",
4141 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4142 "type": "github"
4143 },
4144 "original": {
4145 "owner": "numtide",
4146 "repo": "nixos-anywhere",
4147 "type": "github"
4148 }
4149 },
4150 "nixos-anywhere_2": {
4151 "inputs": {
4152 "disko": [
4153 "n-dilion",
4154 "my-lib",
4155 "disko"
4156 ],
4157 "flake-parts": [
4158 "n-dilion",
4159 "my-lib",
4160 "flake-parts"
4161 ],
4162 "nixos-2305": "nixos-2305_2",
4163 "nixos-images": "nixos-images_2",
4164 "nixpkgs": "nixpkgs_14",
4165 "treefmt-nix": "treefmt-nix_2"
4166 },
4167 "locked": {
4168 "lastModified": 1689945193,
4169 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4170 "owner": "numtide",
4171 "repo": "nixos-anywhere",
4172 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4173 "type": "github"
4174 },
4175 "original": {
4176 "owner": "numtide",
4177 "repo": "nixos-anywhere",
4178 "type": "github"
4179 }
4180 },
4181 "nixos-anywhere_3": {
4182 "inputs": {
4183 "disko": [
4184 "n-eldiron",
4185 "my-lib",
4186 "disko"
4187 ],
4188 "flake-parts": [
4189 "n-eldiron",
4190 "my-lib",
4191 "flake-parts"
4192 ],
4193 "nixos-2305": "nixos-2305_3",
4194 "nixos-images": "nixos-images_3",
4195 "nixpkgs": "nixpkgs_21",
4196 "treefmt-nix": "treefmt-nix_3"
4197 },
4198 "locked": {
4199 "lastModified": 1689945193,
4200 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4201 "owner": "numtide",
4202 "repo": "nixos-anywhere",
4203 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4204 "type": "github"
4205 },
4206 "original": {
4207 "owner": "numtide",
4208 "repo": "nixos-anywhere",
4209 "type": "github"
4210 }
4211 },
4212 "nixos-anywhere_4": {
4213 "inputs": {
4214 "disko": [
4215 "n-monitoring-1",
4216 "my-lib",
4217 "disko"
4218 ],
4219 "flake-parts": [
4220 "n-monitoring-1",
4221 "my-lib",
4222 "flake-parts"
4223 ],
4224 "nixos-2305": "nixos-2305_4",
4225 "nixos-images": "nixos-images_4",
4226 "nixpkgs": "nixpkgs_52",
4227 "treefmt-nix": "treefmt-nix_4"
4228 },
4229 "locked": {
4230 "lastModified": 1689945193,
4231 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4232 "owner": "numtide",
4233 "repo": "nixos-anywhere",
4234 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4235 "type": "github"
4236 },
4237 "original": {
4238 "owner": "numtide",
4239 "repo": "nixos-anywhere",
4240 "type": "github"
4241 }
4242 },
4243 "nixos-anywhere_5": {
4244 "inputs": {
4245 "disko": [
4246 "n-quatresaisons",
4247 "my-lib",
4248 "disko"
4249 ],
4250 "flake-parts": [
4251 "n-quatresaisons",
4252 "my-lib",
4253 "flake-parts"
4254 ],
4255 "nixos-2305": "nixos-2305_5",
4256 "nixos-images": "nixos-images_5",
4257 "nixpkgs": "nixpkgs_60",
4258 "treefmt-nix": "treefmt-nix_5"
4259 },
4260 "locked": {
4261 "lastModified": 1689945193,
4262 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4263 "owner": "numtide",
4264 "repo": "nixos-anywhere",
4265 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4266 "type": "github"
4267 },
4268 "original": {
4269 "owner": "numtide",
4270 "repo": "nixos-anywhere",
4271 "type": "github"
4272 }
4273 },
4274 "nixos-anywhere_6": {
4275 "inputs": {
4276 "disko": [
4277 "n-zoldene",
4278 "my-lib",
4279 "disko"
4280 ],
4281 "flake-parts": [
4282 "n-zoldene",
4283 "my-lib",
4284 "flake-parts"
4285 ],
4286 "nixos-2305": "nixos-2305_6",
4287 "nixos-images": "nixos-images_6",
4288 "nixpkgs": "nixpkgs_68",
4289 "treefmt-nix": "treefmt-nix_6"
4290 },
4291 "locked": {
4292 "lastModified": 1689945193,
4293 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4294 "owner": "numtide",
4295 "repo": "nixos-anywhere",
4296 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4297 "type": "github"
4298 },
4299 "original": {
4300 "owner": "numtide",
4301 "repo": "nixos-anywhere",
4302 "type": "github"
4303 }
4304 },
4305 "nixos-anywhere_7": {
4306 "inputs": {
4307 "disko": [
4308 "s-lib",
4309 "disko"
4310 ],
4311 "flake-parts": [
4312 "s-lib",
4313 "flake-parts"
4314 ],
4315 "nixos-2305": "nixos-2305_7",
4316 "nixos-images": "nixos-images_7",
4317 "nixpkgs": "nixpkgs_82",
4318 "treefmt-nix": "treefmt-nix_7"
4319 },
4320 "locked": {
4321 "lastModified": 1689945193,
4322 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
4323 "owner": "numtide",
4324 "repo": "nixos-anywhere",
4325 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
4326 "type": "github"
4327 },
4328 "original": {
4329 "owner": "numtide",
4330 "repo": "nixos-anywhere",
4331 "type": "github"
4332 }
4333 },
4334 "nixos-images": {
4335 "inputs": {
4336 "nixos-2305": [
4337 "n-backup-2",
4338 "my-lib",
4339 "nixos-anywhere",
4340 "nixos-2305"
4341 ],
4342 "nixos-unstable": [
4343 "n-backup-2",
4344 "my-lib",
4345 "nixos-anywhere",
4346 "nixpkgs"
4347 ]
4348 },
4349 "locked": {
4350 "lastModified": 1686819168,
4351 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4352 "owner": "nix-community",
4353 "repo": "nixos-images",
4354 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4355 "type": "github"
4356 },
4357 "original": {
4358 "owner": "nix-community",
4359 "repo": "nixos-images",
4360 "type": "github"
4361 }
4362 },
4363 "nixos-images_2": {
4364 "inputs": {
4365 "nixos-2305": [
4366 "n-dilion",
4367 "my-lib",
4368 "nixos-anywhere",
4369 "nixos-2305"
4370 ],
4371 "nixos-unstable": [
4372 "n-dilion",
4373 "my-lib",
4374 "nixos-anywhere",
4375 "nixpkgs"
4376 ]
4377 },
4378 "locked": {
4379 "lastModified": 1686819168,
4380 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4381 "owner": "nix-community",
4382 "repo": "nixos-images",
4383 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4384 "type": "github"
4385 },
4386 "original": {
4387 "owner": "nix-community",
4388 "repo": "nixos-images",
4389 "type": "github"
4390 }
4391 },
4392 "nixos-images_3": {
4393 "inputs": {
4394 "nixos-2305": [
4395 "n-eldiron",
4396 "my-lib",
4397 "nixos-anywhere",
4398 "nixos-2305"
4399 ],
4400 "nixos-unstable": [
4401 "n-eldiron",
4402 "my-lib",
4403 "nixos-anywhere",
4404 "nixpkgs"
4405 ]
4406 },
4407 "locked": {
4408 "lastModified": 1686819168,
4409 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4410 "owner": "nix-community",
4411 "repo": "nixos-images",
4412 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4413 "type": "github"
4414 },
4415 "original": {
4416 "owner": "nix-community",
4417 "repo": "nixos-images",
4418 "type": "github"
4419 }
4420 },
4421 "nixos-images_4": {
4422 "inputs": {
4423 "nixos-2305": [
4424 "n-monitoring-1",
4425 "my-lib",
4426 "nixos-anywhere",
4427 "nixos-2305"
4428 ],
4429 "nixos-unstable": [
4430 "n-monitoring-1",
4431 "my-lib",
4432 "nixos-anywhere",
4433 "nixpkgs"
4434 ]
4435 },
4436 "locked": {
4437 "lastModified": 1686819168,
4438 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4439 "owner": "nix-community",
4440 "repo": "nixos-images",
4441 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4442 "type": "github"
4443 },
4444 "original": {
4445 "owner": "nix-community",
4446 "repo": "nixos-images",
4447 "type": "github"
4448 }
4449 },
4450 "nixos-images_5": {
4451 "inputs": {
4452 "nixos-2305": [
4453 "n-quatresaisons",
4454 "my-lib",
4455 "nixos-anywhere",
4456 "nixos-2305"
4457 ],
4458 "nixos-unstable": [
4459 "n-quatresaisons",
4460 "my-lib",
4461 "nixos-anywhere",
4462 "nixpkgs"
4463 ]
4464 },
4465 "locked": {
4466 "lastModified": 1686819168,
4467 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4468 "owner": "nix-community",
4469 "repo": "nixos-images",
4470 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4471 "type": "github"
4472 },
4473 "original": {
4474 "owner": "nix-community",
4475 "repo": "nixos-images",
4476 "type": "github"
4477 }
4478 },
4479 "nixos-images_6": {
4480 "inputs": {
4481 "nixos-2305": [
4482 "n-zoldene",
4483 "my-lib",
4484 "nixos-anywhere",
4485 "nixos-2305"
4486 ],
4487 "nixos-unstable": [
4488 "n-zoldene",
4489 "my-lib",
4490 "nixos-anywhere",
4491 "nixpkgs"
4492 ]
4493 },
4494 "locked": {
4495 "lastModified": 1686819168,
4496 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4497 "owner": "nix-community",
4498 "repo": "nixos-images",
4499 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4500 "type": "github"
4501 },
4502 "original": {
4503 "owner": "nix-community",
4504 "repo": "nixos-images",
4505 "type": "github"
4506 }
4507 },
4508 "nixos-images_7": {
4509 "inputs": {
4510 "nixos-2305": [
4511 "s-lib",
4512 "nixos-anywhere",
4513 "nixos-2305"
4514 ],
4515 "nixos-unstable": [
4516 "s-lib",
4517 "nixos-anywhere",
4518 "nixpkgs"
4519 ]
4520 },
4521 "locked": {
4522 "lastModified": 1686819168,
4523 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
4524 "owner": "nix-community",
4525 "repo": "nixos-images",
4526 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
4527 "type": "github"
4528 },
4529 "original": {
4530 "owner": "nix-community",
4531 "repo": "nixos-images",
4532 "type": "github"
4533 }
4534 },
4535 "nixpkgs": {
4536 "locked": {
4537 "lastModified": 1597943282,
4538 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
4539 "owner": "NixOS",
4540 "repo": "nixpkgs",
4541 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
4542 "type": "github"
4543 },
4544 "original": {
4545 "owner": "NixOS",
4546 "repo": "nixpkgs",
4547 "type": "github"
4548 }
4549 },
4550 "nixpkgs-4": {
4551 "flake": false,
4552 "locked": {
4553 "lastModified": 1646497237,
4554 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4555 "owner": "NixOS",
4556 "repo": "nixpkgs",
4557 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4558 "type": "github"
4559 },
4560 "original": {
4561 "owner": "NixOS",
4562 "repo": "nixpkgs",
4563 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4564 "type": "github"
4565 }
4566 },
4567 "nixpkgs-4_2": {
4568 "flake": false,
4569 "locked": {
4570 "lastModified": 1646497237,
4571 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4572 "owner": "NixOS",
4573 "repo": "nixpkgs",
4574 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4575 "type": "github"
4576 },
4577 "original": {
4578 "owner": "NixOS",
4579 "repo": "nixpkgs",
4580 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4581 "type": "github"
4582 }
4583 },
4584 "nixpkgs-4_3": {
4585 "flake": false,
4586 "locked": {
4587 "lastModified": 1646497237,
4588 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4589 "owner": "NixOS",
4590 "repo": "nixpkgs",
4591 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4592 "type": "github"
4593 },
4594 "original": {
4595 "owner": "NixOS",
4596 "repo": "nixpkgs",
4597 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4598 "type": "github"
4599 }
4600 },
4601 "nixpkgs-4_4": {
4602 "flake": false,
4603 "locked": {
4604 "lastModified": 1646497237,
4605 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
4606 "owner": "NixOS",
4607 "repo": "nixpkgs",
4608 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4609 "type": "github"
4610 },
4611 "original": {
4612 "owner": "NixOS",
4613 "repo": "nixpkgs",
4614 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
4615 "type": "github"
4616 }
4617 },
4618 "nixpkgs-lib": {
4619 "locked": {
4620 "dir": "lib",
4621 "lastModified": 1691269286,
4622 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
4623 "owner": "NixOS",
4624 "repo": "nixpkgs",
4625 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
4626 "type": "github"
4627 },
4628 "original": {
4629 "dir": "lib",
4630 "owner": "NixOS",
4631 "repo": "nixpkgs",
4632 "type": "github"
4633 }
4634 },
4635 "nixpkgs-lib_10": {
4636 "locked": {
4637 "dir": "lib",
4638 "lastModified": 1675183161,
4639 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4640 "owner": "NixOS",
4641 "repo": "nixpkgs",
4642 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4643 "type": "github"
4644 },
4645 "original": {
4646 "dir": "lib",
4647 "owner": "NixOS",
4648 "ref": "nixos-unstable",
4649 "repo": "nixpkgs",
4650 "type": "github"
4651 }
4652 },
4653 "nixpkgs-lib_11": {
4654 "locked": {
4655 "dir": "lib",
4656 "lastModified": 1675183161,
4657 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4658 "owner": "NixOS",
4659 "repo": "nixpkgs",
4660 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4661 "type": "github"
4662 },
4663 "original": {
4664 "dir": "lib",
4665 "owner": "NixOS",
4666 "ref": "nixos-unstable",
4667 "repo": "nixpkgs",
4668 "type": "github"
4669 }
4670 },
4671 "nixpkgs-lib_12": {
4672 "locked": {
4673 "dir": "lib",
4674 "lastModified": 1675183161,
4675 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4676 "owner": "NixOS",
4677 "repo": "nixpkgs",
4678 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4679 "type": "github"
4680 },
4681 "original": {
4682 "dir": "lib",
4683 "owner": "NixOS",
4684 "ref": "nixos-unstable",
4685 "repo": "nixpkgs",
4686 "type": "github"
4687 }
4688 },
4689 "nixpkgs-lib_13": {
4690 "locked": {
4691 "dir": "lib",
4692 "lastModified": 1675183161,
4693 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4694 "owner": "NixOS",
4695 "repo": "nixpkgs",
4696 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4697 "type": "github"
4698 },
4699 "original": {
4700 "dir": "lib",
4701 "owner": "NixOS",
4702 "ref": "nixos-unstable",
4703 "repo": "nixpkgs",
4704 "type": "github"
4705 }
4706 },
4707 "nixpkgs-lib_14": {
4708 "locked": {
4709 "dir": "lib",
4710 "lastModified": 1691269286,
4711 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
4712 "owner": "NixOS",
4713 "repo": "nixpkgs",
4714 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
4715 "type": "github"
4716 },
4717 "original": {
4718 "dir": "lib",
4719 "owner": "NixOS",
4720 "repo": "nixpkgs",
4721 "type": "github"
4722 }
4723 },
4724 "nixpkgs-lib_15": {
4725 "locked": {
4726 "dir": "lib",
4727 "lastModified": 1685564631,
4728 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4729 "owner": "NixOS",
4730 "repo": "nixpkgs",
4731 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4732 "type": "github"
4733 },
4734 "original": {
4735 "dir": "lib",
4736 "owner": "NixOS",
4737 "ref": "nixos-unstable",
4738 "repo": "nixpkgs",
4739 "type": "github"
4740 }
4741 },
4742 "nixpkgs-lib_16": {
4743 "locked": {
4744 "dir": "lib",
4745 "lastModified": 1675183161,
4746 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4747 "owner": "NixOS",
4748 "repo": "nixpkgs",
4749 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4750 "type": "github"
4751 },
4752 "original": {
4753 "dir": "lib",
4754 "owner": "NixOS",
4755 "ref": "nixos-unstable",
4756 "repo": "nixpkgs",
4757 "type": "github"
4758 }
4759 },
4760 "nixpkgs-lib_17": {
4761 "locked": {
4762 "dir": "lib",
4763 "lastModified": 1691269286,
4764 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
4765 "owner": "NixOS",
4766 "repo": "nixpkgs",
4767 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
4768 "type": "github"
4769 },
4770 "original": {
4771 "dir": "lib",
4772 "owner": "NixOS",
4773 "repo": "nixpkgs",
4774 "type": "github"
4775 }
4776 },
4777 "nixpkgs-lib_18": {
4778 "locked": {
4779 "dir": "lib",
4780 "lastModified": 1685564631,
4781 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4782 "owner": "NixOS",
4783 "repo": "nixpkgs",
4784 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4785 "type": "github"
4786 },
4787 "original": {
4788 "dir": "lib",
4789 "owner": "NixOS",
4790 "ref": "nixos-unstable",
4791 "repo": "nixpkgs",
4792 "type": "github"
4793 }
4794 },
4795 "nixpkgs-lib_19": {
4796 "locked": {
4797 "dir": "lib",
4798 "lastModified": 1675183161,
4799 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4800 "owner": "NixOS",
4801 "repo": "nixpkgs",
4802 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4803 "type": "github"
4804 },
4805 "original": {
4806 "dir": "lib",
4807 "owner": "NixOS",
4808 "ref": "nixos-unstable",
4809 "repo": "nixpkgs",
4810 "type": "github"
4811 }
4812 },
4813 "nixpkgs-lib_2": {
4814 "locked": {
4815 "dir": "lib",
4816 "lastModified": 1685564631,
4817 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4818 "owner": "NixOS",
4819 "repo": "nixpkgs",
4820 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4821 "type": "github"
4822 },
4823 "original": {
4824 "dir": "lib",
4825 "owner": "NixOS",
4826 "ref": "nixos-unstable",
4827 "repo": "nixpkgs",
4828 "type": "github"
4829 }
4830 },
4831 "nixpkgs-lib_20": {
4832 "locked": {
4833 "dir": "lib",
4834 "lastModified": 1685564631,
4835 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4836 "owner": "NixOS",
4837 "repo": "nixpkgs",
4838 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4839 "type": "github"
4840 },
4841 "original": {
4842 "dir": "lib",
4843 "owner": "NixOS",
4844 "ref": "nixos-unstable",
4845 "repo": "nixpkgs",
4846 "type": "github"
4847 }
4848 },
4849 "nixpkgs-lib_21": {
4850 "locked": {
4851 "dir": "lib",
4852 "lastModified": 1675183161,
4853 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4854 "owner": "NixOS",
4855 "repo": "nixpkgs",
4856 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4857 "type": "github"
4858 },
4859 "original": {
4860 "dir": "lib",
4861 "owner": "NixOS",
4862 "ref": "nixos-unstable",
4863 "repo": "nixpkgs",
4864 "type": "github"
4865 }
4866 },
4867 "nixpkgs-lib_22": {
4868 "locked": {
4869 "dir": "lib",
4870 "lastModified": 1675183161,
4871 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4872 "owner": "NixOS",
4873 "repo": "nixpkgs",
4874 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4875 "type": "github"
4876 },
4877 "original": {
4878 "dir": "lib",
4879 "owner": "NixOS",
4880 "ref": "nixos-unstable",
4881 "repo": "nixpkgs",
4882 "type": "github"
4883 }
4884 },
4885 "nixpkgs-lib_23": {
4886 "locked": {
4887 "dir": "lib",
4888 "lastModified": 1675183161,
4889 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4890 "owner": "NixOS",
4891 "repo": "nixpkgs",
4892 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4893 "type": "github"
4894 },
4895 "original": {
4896 "dir": "lib",
4897 "owner": "NixOS",
4898 "ref": "nixos-unstable",
4899 "repo": "nixpkgs",
4900 "type": "github"
4901 }
4902 },
4903 "nixpkgs-lib_24": {
4904 "locked": {
4905 "dir": "lib",
4906 "lastModified": 1685564631,
4907 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
4908 "owner": "NixOS",
4909 "repo": "nixpkgs",
4910 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
4911 "type": "github"
4912 },
4913 "original": {
4914 "dir": "lib",
4915 "owner": "NixOS",
4916 "ref": "nixos-unstable",
4917 "repo": "nixpkgs",
4918 "type": "github"
4919 }
4920 },
4921 "nixpkgs-lib_25": {
4922 "locked": {
4923 "dir": "lib",
4924 "lastModified": 1675183161,
4925 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4926 "owner": "NixOS",
4927 "repo": "nixpkgs",
4928 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4929 "type": "github"
4930 },
4931 "original": {
4932 "dir": "lib",
4933 "owner": "NixOS",
4934 "ref": "nixos-unstable",
4935 "repo": "nixpkgs",
4936 "type": "github"
4937 }
4938 },
4939 "nixpkgs-lib_26": {
4940 "locked": {
4941 "dir": "lib",
4942 "lastModified": 1691269286,
4943 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
4944 "owner": "NixOS",
4945 "repo": "nixpkgs",
4946 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
4947 "type": "github"
4948 },
4949 "original": {
4950 "dir": "lib",
4951 "owner": "NixOS",
4952 "repo": "nixpkgs",
4953 "type": "github"
4954 }
4955 },
4956 "nixpkgs-lib_27": {
4957 "locked": {
4958 "dir": "lib",
4959 "lastModified": 1675183161,
4960 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4961 "owner": "NixOS",
4962 "repo": "nixpkgs",
4963 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4964 "type": "github"
4965 },
4966 "original": {
4967 "dir": "lib",
4968 "owner": "NixOS",
4969 "ref": "nixos-unstable",
4970 "repo": "nixpkgs",
4971 "type": "github"
4972 }
4973 },
4974 "nixpkgs-lib_28": {
4975 "locked": {
4976 "dir": "lib",
4977 "lastModified": 1675183161,
4978 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4979 "owner": "NixOS",
4980 "repo": "nixpkgs",
4981 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
4982 "type": "github"
4983 },
4984 "original": {
4985 "dir": "lib",
4986 "owner": "NixOS",
4987 "ref": "nixos-unstable",
4988 "repo": "nixpkgs",
4989 "type": "github"
4990 }
4991 },
4992 "nixpkgs-lib_3": {
4993 "locked": {
4994 "dir": "lib",
4995 "lastModified": 1675183161,
4996 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
4997 "owner": "NixOS",
4998 "repo": "nixpkgs",
4999 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5000 "type": "github"
5001 },
5002 "original": {
5003 "dir": "lib",
5004 "owner": "NixOS",
5005 "ref": "nixos-unstable",
5006 "repo": "nixpkgs",
5007 "type": "github"
5008 }
5009 },
5010 "nixpkgs-lib_4": {
5011 "locked": {
5012 "dir": "lib",
5013 "lastModified": 1691269286,
5014 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
5015 "owner": "NixOS",
5016 "repo": "nixpkgs",
5017 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
5018 "type": "github"
5019 },
5020 "original": {
5021 "dir": "lib",
5022 "owner": "NixOS",
5023 "repo": "nixpkgs",
5024 "type": "github"
5025 }
5026 },
5027 "nixpkgs-lib_5": {
5028 "locked": {
5029 "dir": "lib",
5030 "lastModified": 1685564631,
5031 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
5032 "owner": "NixOS",
5033 "repo": "nixpkgs",
5034 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
5035 "type": "github"
5036 },
5037 "original": {
5038 "dir": "lib",
5039 "owner": "NixOS",
5040 "ref": "nixos-unstable",
5041 "repo": "nixpkgs",
5042 "type": "github"
5043 }
5044 },
5045 "nixpkgs-lib_6": {
5046 "locked": {
5047 "dir": "lib",
5048 "lastModified": 1675183161,
5049 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5050 "owner": "NixOS",
5051 "repo": "nixpkgs",
5052 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5053 "type": "github"
5054 },
5055 "original": {
5056 "dir": "lib",
5057 "owner": "NixOS",
5058 "ref": "nixos-unstable",
5059 "repo": "nixpkgs",
5060 "type": "github"
5061 }
5062 },
5063 "nixpkgs-lib_7": {
5064 "locked": {
5065 "dir": "lib",
5066 "lastModified": 1685564631,
5067 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
5068 "owner": "NixOS",
5069 "repo": "nixpkgs",
5070 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
5071 "type": "github"
5072 },
5073 "original": {
5074 "dir": "lib",
5075 "owner": "NixOS",
5076 "ref": "nixos-unstable",
5077 "repo": "nixpkgs",
5078 "type": "github"
5079 }
5080 },
5081 "nixpkgs-lib_8": {
5082 "locked": {
5083 "dir": "lib",
5084 "lastModified": 1691269286,
5085 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
5086 "owner": "NixOS",
5087 "repo": "nixpkgs",
5088 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
5089 "type": "github"
5090 },
5091 "original": {
5092 "dir": "lib",
5093 "owner": "NixOS",
5094 "repo": "nixpkgs",
5095 "type": "github"
5096 }
5097 },
5098 "nixpkgs-lib_9": {
5099 "locked": {
5100 "dir": "lib",
5101 "lastModified": 1675183161,
5102 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
5103 "owner": "NixOS",
5104 "repo": "nixpkgs",
5105 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
5106 "type": "github"
5107 },
5108 "original": {
5109 "dir": "lib",
5110 "owner": "NixOS",
5111 "ref": "nixos-unstable",
5112 "repo": "nixpkgs",
5113 "type": "github"
5114 }
5115 },
5116 "nixpkgs_10": {
5117 "locked": {
5118 "lastModified": 1687502512,
5119 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5120 "owner": "NixOS",
5121 "repo": "nixpkgs",
5122 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5123 "type": "github"
5124 },
5125 "original": {
5126 "owner": "NixOS",
5127 "ref": "nixos-unstable",
5128 "repo": "nixpkgs",
5129 "type": "github"
5130 }
5131 },
5132 "nixpkgs_100": {
5133 "locked": {
5134 "lastModified": 1687502512,
5135 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5136 "owner": "NixOS",
5137 "repo": "nixpkgs",
5138 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5139 "type": "github"
5140 },
5141 "original": {
5142 "owner": "NixOS",
5143 "ref": "nixos-unstable",
5144 "repo": "nixpkgs",
5145 "type": "github"
5146 }
5147 },
5148 "nixpkgs_101": {
5149 "locked": {
5150 "lastModified": 1646497237,
5151 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5152 "owner": "nixos",
5153 "repo": "nixpkgs",
5154 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5155 "type": "github"
5156 },
5157 "original": {
5158 "owner": "nixos",
5159 "repo": "nixpkgs",
5160 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5161 "type": "github"
5162 }
5163 },
5164 "nixpkgs_102": {
5165 "locked": {
5166 "lastModified": 1646497237,
5167 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5168 "owner": "nixos",
5169 "repo": "nixpkgs",
5170 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5171 "type": "github"
5172 },
5173 "original": {
5174 "owner": "nixos",
5175 "repo": "nixpkgs",
5176 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5177 "type": "github"
5178 }
5179 },
5180 "nixpkgs_103": {
5181 "flake": false,
5182 "locked": {
5183 "lastModified": 1596265691,
5184 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5185 "owner": "NixOS",
5186 "repo": "nixpkgs",
5187 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5188 "type": "github"
5189 },
5190 "original": {
5191 "owner": "NixOS",
5192 "repo": "nixpkgs",
5193 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5194 "type": "github"
5195 }
5196 },
5197 "nixpkgs_104": {
5198 "flake": false,
5199 "locked": {
5200 "lastModified": 1596265691,
5201 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5202 "owner": "NixOS",
5203 "repo": "nixpkgs",
5204 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5205 "type": "github"
5206 },
5207 "original": {
5208 "owner": "NixOS",
5209 "repo": "nixpkgs",
5210 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5211 "type": "github"
5212 }
5213 },
5214 "nixpkgs_11": {
5215 "locked": {
5216 "lastModified": 1646497237,
5217 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5218 "owner": "nixos",
5219 "repo": "nixpkgs",
5220 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5221 "type": "github"
5222 },
5223 "original": {
5224 "owner": "nixos",
5225 "repo": "nixpkgs",
5226 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5227 "type": "github"
5228 }
5229 },
5230 "nixpkgs_12": {
5231 "locked": {
5232 "lastModified": 1683408522,
5233 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
5234 "owner": "NixOS",
5235 "repo": "nixpkgs",
5236 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
5237 "type": "github"
5238 },
5239 "original": {
5240 "owner": "NixOS",
5241 "ref": "nixos-unstable",
5242 "repo": "nixpkgs",
5243 "type": "github"
5244 }
5245 },
5246 "nixpkgs_13": {
5247 "locked": {
5248 "lastModified": 1687701825,
5249 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
5250 "owner": "NixOS",
5251 "repo": "nixpkgs",
5252 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
5253 "type": "github"
5254 },
5255 "original": {
5256 "owner": "NixOS",
5257 "ref": "nixpkgs-unstable",
5258 "repo": "nixpkgs",
5259 "type": "github"
5260 }
5261 },
5262 "nixpkgs_14": {
5263 "locked": {
5264 "lastModified": 1687893427,
5265 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
5266 "owner": "nixos",
5267 "repo": "nixpkgs",
5268 "rev": "4b14ab2a916508442e685089672681dff46805be",
5269 "type": "github"
5270 },
5271 "original": {
5272 "owner": "nixos",
5273 "ref": "nixos-unstable-small",
5274 "repo": "nixpkgs",
5275 "type": "github"
5276 }
5277 },
5278 "nixpkgs_15": {
5279 "locked": {
5280 "lastModified": 1648725829,
5281 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
5282 "owner": "NixOS",
5283 "repo": "nixpkgs",
5284 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
5285 "type": "github"
5286 },
5287 "original": {
5288 "owner": "NixOS",
5289 "repo": "nixpkgs",
5290 "type": "github"
5291 }
5292 },
5293 "nixpkgs_16": {
5294 "locked": {
5295 "lastModified": 1693158576,
5296 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
5297 "owner": "nixos",
5298 "repo": "nixpkgs",
5299 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
5300 "type": "github"
5301 },
5302 "original": {
5303 "owner": "nixos",
5304 "ref": "nixos-unstable",
5305 "repo": "nixpkgs",
5306 "type": "github"
5307 }
5308 },
5309 "nixpkgs_17": {
5310 "locked": {
5311 "lastModified": 1687502512,
5312 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5313 "owner": "NixOS",
5314 "repo": "nixpkgs",
5315 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5316 "type": "github"
5317 },
5318 "original": {
5319 "owner": "NixOS",
5320 "ref": "nixos-unstable",
5321 "repo": "nixpkgs",
5322 "type": "github"
5323 }
5324 },
5325 "nixpkgs_18": {
5326 "locked": {
5327 "lastModified": 1646497237,
5328 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5329 "owner": "nixos",
5330 "repo": "nixpkgs",
5331 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5332 "type": "github"
5333 },
5334 "original": {
5335 "owner": "nixos",
5336 "repo": "nixpkgs",
5337 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5338 "type": "github"
5339 }
5340 },
5341 "nixpkgs_19": {
5342 "locked": {
5343 "lastModified": 1683408522,
5344 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
5345 "owner": "NixOS",
5346 "repo": "nixpkgs",
5347 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
5348 "type": "github"
5349 },
5350 "original": {
5351 "owner": "NixOS",
5352 "ref": "nixos-unstable",
5353 "repo": "nixpkgs",
5354 "type": "github"
5355 }
5356 },
5357 "nixpkgs_2": {
5358 "locked": {
5359 "lastModified": 1597943282,
5360 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5361 "owner": "NixOS",
5362 "repo": "nixpkgs",
5363 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5364 "type": "github"
5365 },
5366 "original": {
5367 "owner": "NixOS",
5368 "repo": "nixpkgs",
5369 "type": "github"
5370 }
5371 },
5372 "nixpkgs_20": {
5373 "locked": {
5374 "lastModified": 1687701825,
5375 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
5376 "owner": "NixOS",
5377 "repo": "nixpkgs",
5378 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
5379 "type": "github"
5380 },
5381 "original": {
5382 "owner": "NixOS",
5383 "ref": "nixpkgs-unstable",
5384 "repo": "nixpkgs",
5385 "type": "github"
5386 }
5387 },
5388 "nixpkgs_21": {
5389 "locked": {
5390 "lastModified": 1687893427,
5391 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
5392 "owner": "nixos",
5393 "repo": "nixpkgs",
5394 "rev": "4b14ab2a916508442e685089672681dff46805be",
5395 "type": "github"
5396 },
5397 "original": {
5398 "owner": "nixos",
5399 "ref": "nixos-unstable-small",
5400 "repo": "nixpkgs",
5401 "type": "github"
5402 }
5403 },
5404 "nixpkgs_22": {
5405 "locked": {
5406 "lastModified": 1648725829,
5407 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
5408 "owner": "NixOS",
5409 "repo": "nixpkgs",
5410 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
5411 "type": "github"
5412 },
5413 "original": {
5414 "owner": "NixOS",
5415 "repo": "nixpkgs",
5416 "type": "github"
5417 }
5418 },
5419 "nixpkgs_23": {
5420 "locked": {
5421 "lastModified": 1693158576,
5422 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
5423 "owner": "nixos",
5424 "repo": "nixpkgs",
5425 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
5426 "type": "github"
5427 },
5428 "original": {
5429 "owner": "nixos",
5430 "ref": "nixos-unstable",
5431 "repo": "nixpkgs",
5432 "type": "github"
5433 }
5434 },
5435 "nixpkgs_24": {
5436 "flake": false,
5437 "locked": {
5438 "lastModified": 1596265691,
5439 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5440 "owner": "NixOS",
5441 "repo": "nixpkgs",
5442 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5443 "type": "github"
5444 },
5445 "original": {
5446 "owner": "NixOS",
5447 "repo": "nixpkgs",
5448 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5449 "type": "github"
5450 }
5451 },
5452 "nixpkgs_25": {
5453 "locked": {
5454 "lastModified": 1597943282,
5455 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5456 "owner": "NixOS",
5457 "repo": "nixpkgs",
5458 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5459 "type": "github"
5460 },
5461 "original": {
5462 "owner": "NixOS",
5463 "repo": "nixpkgs",
5464 "type": "github"
5465 }
5466 },
5467 "nixpkgs_26": {
5468 "locked": {
5469 "lastModified": 1597943282,
5470 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5471 "owner": "NixOS",
5472 "repo": "nixpkgs",
5473 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5474 "type": "github"
5475 },
5476 "original": {
5477 "owner": "NixOS",
5478 "repo": "nixpkgs",
5479 "type": "github"
5480 }
5481 },
5482 "nixpkgs_27": {
5483 "locked": {
5484 "lastModified": 1597943282,
5485 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5486 "owner": "NixOS",
5487 "repo": "nixpkgs",
5488 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5489 "type": "github"
5490 },
5491 "original": {
5492 "owner": "NixOS",
5493 "repo": "nixpkgs",
5494 "type": "github"
5495 }
5496 },
5497 "nixpkgs_28": {
5498 "locked": {
5499 "lastModified": 1597943282,
5500 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5501 "owner": "NixOS",
5502 "repo": "nixpkgs",
5503 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5504 "type": "github"
5505 },
5506 "original": {
5507 "owner": "NixOS",
5508 "repo": "nixpkgs",
5509 "type": "github"
5510 }
5511 },
5512 "nixpkgs_29": {
5513 "locked": {
5514 "lastModified": 1631570365,
5515 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
5516 "owner": "NixOS",
5517 "repo": "nixpkgs",
5518 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
5519 "type": "github"
5520 },
5521 "original": {
5522 "owner": "NixOS",
5523 "repo": "nixpkgs",
5524 "type": "github"
5525 }
5526 },
5527 "nixpkgs_3": {
5528 "locked": {
5529 "lastModified": 1683408522,
5530 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
5531 "owner": "NixOS",
5532 "repo": "nixpkgs",
5533 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
5534 "type": "github"
5535 },
5536 "original": {
5537 "owner": "NixOS",
5538 "ref": "nixos-unstable",
5539 "repo": "nixpkgs",
5540 "type": "github"
5541 }
5542 },
5543 "nixpkgs_30": {
5544 "locked": {
5545 "lastModified": 1611097871,
5546 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
5547 "owner": "NixOS",
5548 "repo": "nixpkgs",
5549 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
5550 "type": "github"
5551 },
5552 "original": {
5553 "owner": "NixOS",
5554 "repo": "nixpkgs",
5555 "type": "github"
5556 }
5557 },
5558 "nixpkgs_31": {
5559 "locked": {
5560 "lastModified": 1611097871,
5561 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
5562 "owner": "NixOS",
5563 "repo": "nixpkgs",
5564 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
5565 "type": "github"
5566 },
5567 "original": {
5568 "owner": "NixOS",
5569 "repo": "nixpkgs",
5570 "type": "github"
5571 }
5572 },
5573 "nixpkgs_32": {
5574 "flake": false,
5575 "locked": {
5576 "lastModified": 1596265691,
5577 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5578 "owner": "NixOS",
5579 "repo": "nixpkgs",
5580 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5581 "type": "github"
5582 },
5583 "original": {
5584 "owner": "NixOS",
5585 "repo": "nixpkgs",
5586 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5587 "type": "github"
5588 }
5589 },
5590 "nixpkgs_33": {
5591 "locked": {
5592 "lastModified": 1687502512,
5593 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5594 "owner": "NixOS",
5595 "repo": "nixpkgs",
5596 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
5597 "type": "github"
5598 },
5599 "original": {
5600 "owner": "NixOS",
5601 "ref": "nixos-unstable",
5602 "repo": "nixpkgs",
5603 "type": "github"
5604 }
5605 },
5606 "nixpkgs_34": {
5607 "locked": {
5608 "lastModified": 1646497237,
5609 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5610 "owner": "nixos",
5611 "repo": "nixpkgs",
5612 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5613 "type": "github"
5614 },
5615 "original": {
5616 "owner": "nixos",
5617 "repo": "nixpkgs",
5618 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5619 "type": "github"
5620 }
5621 },
5622 "nixpkgs_35": {
5623 "locked": {
5624 "lastModified": 1633901457,
5625 "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
5626 "owner": "NixOS",
5627 "repo": "nixpkgs",
5628 "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
5629 "type": "github"
5630 },
5631 "original": {
5632 "owner": "NixOS",
5633 "repo": "nixpkgs",
5634 "type": "github"
5635 }
5636 },
5637 "nixpkgs_36": {
5638 "flake": false,
5639 "locked": {
5640 "lastModified": 1596265691,
5641 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5642 "owner": "NixOS",
5643 "repo": "nixpkgs",
5644 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5645 "type": "github"
5646 },
5647 "original": {
5648 "owner": "NixOS",
5649 "repo": "nixpkgs",
5650 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5651 "type": "github"
5652 }
5653 },
5654 "nixpkgs_37": {
5655 "locked": {
5656 "lastModified": 1646497237,
5657 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5658 "owner": "nixos",
5659 "repo": "nixpkgs",
5660 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5661 "type": "github"
5662 },
5663 "original": {
5664 "owner": "nixos",
5665 "repo": "nixpkgs",
5666 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5667 "type": "github"
5668 }
5669 },
5670 "nixpkgs_38": {
5671 "flake": false,
5672 "locked": {
5673 "lastModified": 1596265691,
5674 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5675 "owner": "NixOS",
5676 "repo": "nixpkgs",
5677 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5678 "type": "github"
5679 },
5680 "original": {
5681 "owner": "NixOS",
5682 "repo": "nixpkgs",
5683 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5684 "type": "github"
5685 }
5686 },
5687 "nixpkgs_39": {
5688 "locked": {
5689 "lastModified": 1646497237,
5690 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5691 "owner": "nixos",
5692 "repo": "nixpkgs",
5693 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5694 "type": "github"
5695 },
5696 "original": {
5697 "owner": "nixos",
5698 "repo": "nixpkgs",
5699 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5700 "type": "github"
5701 }
5702 },
5703 "nixpkgs_4": {
5704 "locked": {
5705 "lastModified": 1687701825,
5706 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
5707 "owner": "NixOS",
5708 "repo": "nixpkgs",
5709 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
5710 "type": "github"
5711 },
5712 "original": {
5713 "owner": "NixOS",
5714 "ref": "nixpkgs-unstable",
5715 "repo": "nixpkgs",
5716 "type": "github"
5717 }
5718 },
5719 "nixpkgs_40": {
5720 "flake": false,
5721 "locked": {
5722 "lastModified": 1596265691,
5723 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5724 "owner": "NixOS",
5725 "repo": "nixpkgs",
5726 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5727 "type": "github"
5728 },
5729 "original": {
5730 "owner": "NixOS",
5731 "repo": "nixpkgs",
5732 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5733 "type": "github"
5734 }
5735 },
5736 "nixpkgs_41": {
5737 "flake": false,
5738 "locked": {
5739 "lastModified": 1596265691,
5740 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5741 "owner": "NixOS",
5742 "repo": "nixpkgs",
5743 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5744 "type": "github"
5745 },
5746 "original": {
5747 "owner": "NixOS",
5748 "repo": "nixpkgs",
5749 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5750 "type": "github"
5751 }
5752 },
5753 "nixpkgs_42": {
5754 "flake": false,
5755 "locked": {
5756 "lastModified": 1596265691,
5757 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5758 "owner": "NixOS",
5759 "repo": "nixpkgs",
5760 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5761 "type": "github"
5762 },
5763 "original": {
5764 "owner": "NixOS",
5765 "repo": "nixpkgs",
5766 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5767 "type": "github"
5768 }
5769 },
5770 "nixpkgs_43": {
5771 "locked": {
5772 "lastModified": 1646497237,
5773 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5774 "owner": "nixos",
5775 "repo": "nixpkgs",
5776 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5777 "type": "github"
5778 },
5779 "original": {
5780 "owner": "nixos",
5781 "repo": "nixpkgs",
5782 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5783 "type": "github"
5784 }
5785 },
5786 "nixpkgs_44": {
5787 "locked": {
5788 "lastModified": 1597943282,
5789 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5790 "owner": "NixOS",
5791 "repo": "nixpkgs",
5792 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5793 "type": "github"
5794 },
5795 "original": {
5796 "owner": "NixOS",
5797 "repo": "nixpkgs",
5798 "type": "github"
5799 }
5800 },
5801 "nixpkgs_45": {
5802 "locked": {
5803 "lastModified": 1597943282,
5804 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
5805 "owner": "NixOS",
5806 "repo": "nixpkgs",
5807 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
5808 "type": "github"
5809 },
5810 "original": {
5811 "owner": "NixOS",
5812 "repo": "nixpkgs",
5813 "type": "github"
5814 }
5815 },
5816 "nixpkgs_46": {
5817 "locked": {
5818 "lastModified": 1611097871,
5819 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
5820 "owner": "NixOS",
5821 "repo": "nixpkgs",
5822 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
5823 "type": "github"
5824 },
5825 "original": {
5826 "owner": "NixOS",
5827 "repo": "nixpkgs",
5828 "type": "github"
5829 }
5830 },
5831 "nixpkgs_47": {
5832 "locked": {
5833 "lastModified": 1646497237,
5834 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
5835 "owner": "nixos",
5836 "repo": "nixpkgs",
5837 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5838 "type": "github"
5839 },
5840 "original": {
5841 "owner": "nixos",
5842 "repo": "nixpkgs",
5843 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
5844 "type": "github"
5845 }
5846 },
5847 "nixpkgs_48": {
5848 "flake": false,
5849 "locked": {
5850 "lastModified": 1596265691,
5851 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5852 "owner": "NixOS",
5853 "repo": "nixpkgs",
5854 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5855 "type": "github"
5856 },
5857 "original": {
5858 "owner": "NixOS",
5859 "repo": "nixpkgs",
5860 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5861 "type": "github"
5862 }
5863 },
5864 "nixpkgs_49": {
5865 "flake": false,
5866 "locked": {
5867 "lastModified": 1596265691,
5868 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5869 "owner": "NixOS",
5870 "repo": "nixpkgs",
5871 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5872 "type": "github"
5873 },
5874 "original": {
5875 "owner": "NixOS",
5876 "repo": "nixpkgs",
5877 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5878 "type": "github"
5879 }
5880 },
5881 "nixpkgs_5": {
5882 "locked": {
5883 "lastModified": 1687893427,
5884 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
5885 "owner": "nixos",
5886 "repo": "nixpkgs",
5887 "rev": "4b14ab2a916508442e685089672681dff46805be",
5888 "type": "github"
5889 },
5890 "original": {
5891 "owner": "nixos",
5892 "ref": "nixos-unstable-small",
5893 "repo": "nixpkgs",
5894 "type": "github"
5895 }
5896 },
5897 "nixpkgs_50": {
5898 "locked": {
5899 "lastModified": 1683408522,
5900 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
5901 "owner": "NixOS",
5902 "repo": "nixpkgs",
5903 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
5904 "type": "github"
5905 },
5906 "original": {
5907 "owner": "NixOS",
5908 "ref": "nixos-unstable",
5909 "repo": "nixpkgs",
5910 "type": "github"
5911 }
5912 },
5913 "nixpkgs_51": {
5914 "locked": {
5915 "lastModified": 1687701825,
5916 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
5917 "owner": "NixOS",
5918 "repo": "nixpkgs",
5919 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
5920 "type": "github"
5921 },
5922 "original": {
5923 "owner": "NixOS",
5924 "ref": "nixpkgs-unstable",
5925 "repo": "nixpkgs",
5926 "type": "github"
5927 }
5928 },
5929 "nixpkgs_52": {
5930 "locked": {
5931 "lastModified": 1687893427,
5932 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
5933 "owner": "nixos",
5934 "repo": "nixpkgs",
5935 "rev": "4b14ab2a916508442e685089672681dff46805be",
5936 "type": "github"
5937 },
5938 "original": {
5939 "owner": "nixos",
5940 "ref": "nixos-unstable-small",
5941 "repo": "nixpkgs",
5942 "type": "github"
5943 }
5944 },
5945 "nixpkgs_53": {
5946 "locked": {
5947 "lastModified": 1648725829,
5948 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
5949 "owner": "NixOS",
5950 "repo": "nixpkgs",
5951 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
5952 "type": "github"
5953 },
5954 "original": {
5955 "owner": "NixOS",
5956 "repo": "nixpkgs",
5957 "type": "github"
5958 }
5959 },
5960 "nixpkgs_54": {
5961 "locked": {
5962 "lastModified": 1693158576,
5963 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
5964 "owner": "nixos",
5965 "repo": "nixpkgs",
5966 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
5967 "type": "github"
5968 },
5969 "original": {
5970 "owner": "nixos",
5971 "ref": "nixos-unstable",
5972 "repo": "nixpkgs",
5973 "type": "github"
5974 }
5975 },
5976 "nixpkgs_55": {
5977 "flake": false,
5978 "locked": {
5979 "lastModified": 1596265691,
5980 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
5981 "owner": "NixOS",
5982 "repo": "nixpkgs",
5983 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5984 "type": "github"
5985 },
5986 "original": {
5987 "owner": "NixOS",
5988 "repo": "nixpkgs",
5989 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
5990 "type": "github"
5991 }
5992 },
5993 "nixpkgs_56": {
5994 "locked": {
5995 "lastModified": 1687502512,
5996 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
5997 "owner": "NixOS",
5998 "repo": "nixpkgs",
5999 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6000 "type": "github"
6001 },
6002 "original": {
6003 "owner": "NixOS",
6004 "ref": "nixos-unstable",
6005 "repo": "nixpkgs",
6006 "type": "github"
6007 }
6008 },
6009 "nixpkgs_57": {
6010 "locked": {
6011 "lastModified": 1646497237,
6012 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6013 "owner": "nixos",
6014 "repo": "nixpkgs",
6015 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6016 "type": "github"
6017 },
6018 "original": {
6019 "owner": "nixos",
6020 "repo": "nixpkgs",
6021 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6022 "type": "github"
6023 }
6024 },
6025 "nixpkgs_58": {
6026 "locked": {
6027 "lastModified": 1683408522,
6028 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
6029 "owner": "NixOS",
6030 "repo": "nixpkgs",
6031 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
6032 "type": "github"
6033 },
6034 "original": {
6035 "owner": "NixOS",
6036 "ref": "nixos-unstable",
6037 "repo": "nixpkgs",
6038 "type": "github"
6039 }
6040 },
6041 "nixpkgs_59": {
6042 "locked": {
6043 "lastModified": 1687701825,
6044 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6045 "owner": "NixOS",
6046 "repo": "nixpkgs",
6047 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6048 "type": "github"
6049 },
6050 "original": {
6051 "owner": "NixOS",
6052 "ref": "nixpkgs-unstable",
6053 "repo": "nixpkgs",
6054 "type": "github"
6055 }
6056 },
6057 "nixpkgs_6": {
6058 "locked": {
6059 "lastModified": 1648725829,
6060 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6061 "owner": "NixOS",
6062 "repo": "nixpkgs",
6063 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6064 "type": "github"
6065 },
6066 "original": {
6067 "owner": "NixOS",
6068 "repo": "nixpkgs",
6069 "type": "github"
6070 }
6071 },
6072 "nixpkgs_60": {
6073 "locked": {
6074 "lastModified": 1687893427,
6075 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6076 "owner": "nixos",
6077 "repo": "nixpkgs",
6078 "rev": "4b14ab2a916508442e685089672681dff46805be",
6079 "type": "github"
6080 },
6081 "original": {
6082 "owner": "nixos",
6083 "ref": "nixos-unstable-small",
6084 "repo": "nixpkgs",
6085 "type": "github"
6086 }
6087 },
6088 "nixpkgs_61": {
6089 "locked": {
6090 "lastModified": 1648725829,
6091 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6092 "owner": "NixOS",
6093 "repo": "nixpkgs",
6094 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6095 "type": "github"
6096 },
6097 "original": {
6098 "owner": "NixOS",
6099 "repo": "nixpkgs",
6100 "type": "github"
6101 }
6102 },
6103 "nixpkgs_62": {
6104 "locked": {
6105 "lastModified": 1693158576,
6106 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
6107 "owner": "nixos",
6108 "repo": "nixpkgs",
6109 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
6110 "type": "github"
6111 },
6112 "original": {
6113 "owner": "nixos",
6114 "ref": "nixos-unstable",
6115 "repo": "nixpkgs",
6116 "type": "github"
6117 }
6118 },
6119 "nixpkgs_63": {
6120 "flake": false,
6121 "locked": {
6122 "lastModified": 1596265691,
6123 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6124 "owner": "NixOS",
6125 "repo": "nixpkgs",
6126 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6127 "type": "github"
6128 },
6129 "original": {
6130 "owner": "NixOS",
6131 "repo": "nixpkgs",
6132 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6133 "type": "github"
6134 }
6135 },
6136 "nixpkgs_64": {
6137 "locked": {
6138 "lastModified": 1687502512,
6139 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
6140 "owner": "NixOS",
6141 "repo": "nixpkgs",
6142 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6143 "type": "github"
6144 },
6145 "original": {
6146 "owner": "NixOS",
6147 "ref": "nixos-unstable",
6148 "repo": "nixpkgs",
6149 "type": "github"
6150 }
6151 },
6152 "nixpkgs_65": {
6153 "locked": {
6154 "lastModified": 1646497237,
6155 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6156 "owner": "nixos",
6157 "repo": "nixpkgs",
6158 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6159 "type": "github"
6160 },
6161 "original": {
6162 "owner": "nixos",
6163 "repo": "nixpkgs",
6164 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6165 "type": "github"
6166 }
6167 },
6168 "nixpkgs_66": {
6169 "locked": {
6170 "lastModified": 1683408522,
6171 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
6172 "owner": "NixOS",
6173 "repo": "nixpkgs",
6174 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
6175 "type": "github"
6176 },
6177 "original": {
6178 "owner": "NixOS",
6179 "ref": "nixos-unstable",
6180 "repo": "nixpkgs",
6181 "type": "github"
6182 }
6183 },
6184 "nixpkgs_67": {
6185 "locked": {
6186 "lastModified": 1687701825,
6187 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6188 "owner": "NixOS",
6189 "repo": "nixpkgs",
6190 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6191 "type": "github"
6192 },
6193 "original": {
6194 "owner": "NixOS",
6195 "ref": "nixpkgs-unstable",
6196 "repo": "nixpkgs",
6197 "type": "github"
6198 }
6199 },
6200 "nixpkgs_68": {
6201 "locked": {
6202 "lastModified": 1687893427,
6203 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6204 "owner": "nixos",
6205 "repo": "nixpkgs",
6206 "rev": "4b14ab2a916508442e685089672681dff46805be",
6207 "type": "github"
6208 },
6209 "original": {
6210 "owner": "nixos",
6211 "ref": "nixos-unstable-small",
6212 "repo": "nixpkgs",
6213 "type": "github"
6214 }
6215 },
6216 "nixpkgs_69": {
6217 "locked": {
6218 "lastModified": 1648725829,
6219 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6220 "owner": "NixOS",
6221 "repo": "nixpkgs",
6222 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6223 "type": "github"
6224 },
6225 "original": {
6226 "owner": "NixOS",
6227 "repo": "nixpkgs",
6228 "type": "github"
6229 }
6230 },
6231 "nixpkgs_7": {
6232 "locked": {
6233 "lastModified": 1693158576,
6234 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
6235 "owner": "nixos",
6236 "repo": "nixpkgs",
6237 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
6238 "type": "github"
6239 },
6240 "original": {
6241 "owner": "nixos",
6242 "ref": "nixos-unstable",
6243 "repo": "nixpkgs",
6244 "type": "github"
6245 }
6246 },
6247 "nixpkgs_70": {
6248 "locked": {
6249 "lastModified": 1693158576,
6250 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
6251 "owner": "nixos",
6252 "repo": "nixpkgs",
6253 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
6254 "type": "github"
6255 },
6256 "original": {
6257 "owner": "NixOS",
6258 "ref": "nixos-unstable",
6259 "repo": "nixpkgs",
6260 "type": "github"
6261 }
6262 },
6263 "nixpkgs_71": {
6264 "locked": {
6265 "lastModified": 1687502512,
6266 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
6267 "owner": "NixOS",
6268 "repo": "nixpkgs",
6269 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6270 "type": "github"
6271 },
6272 "original": {
6273 "owner": "NixOS",
6274 "ref": "nixos-unstable",
6275 "repo": "nixpkgs",
6276 "type": "github"
6277 }
6278 },
6279 "nixpkgs_72": {
6280 "locked": {
6281 "lastModified": 1646497237,
6282 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6283 "owner": "nixos",
6284 "repo": "nixpkgs",
6285 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6286 "type": "github"
6287 },
6288 "original": {
6289 "owner": "nixos",
6290 "repo": "nixpkgs",
6291 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6292 "type": "github"
6293 }
6294 },
6295 "nixpkgs_73": {
6296 "locked": {
6297 "lastModified": 1687502512,
6298 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
6299 "owner": "NixOS",
6300 "repo": "nixpkgs",
6301 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
6302 "type": "github"
6303 },
6304 "original": {
6305 "owner": "NixOS",
6306 "ref": "nixos-unstable",
6307 "repo": "nixpkgs",
6308 "type": "github"
6309 }
6310 },
6311 "nixpkgs_74": {
6312 "locked": {
6313 "lastModified": 1633901457,
6314 "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
6315 "owner": "NixOS",
6316 "repo": "nixpkgs",
6317 "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
6318 "type": "github"
6319 },
6320 "original": {
6321 "owner": "NixOS",
6322 "repo": "nixpkgs",
6323 "type": "github"
6324 }
6325 },
6326 "nixpkgs_75": {
6327 "flake": false,
6328 "locked": {
6329 "lastModified": 1596265691,
6330 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6331 "owner": "NixOS",
6332 "repo": "nixpkgs",
6333 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6334 "type": "github"
6335 },
6336 "original": {
6337 "owner": "NixOS",
6338 "repo": "nixpkgs",
6339 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6340 "type": "github"
6341 }
6342 },
6343 "nixpkgs_76": {
6344 "locked": {
6345 "lastModified": 1646497237,
6346 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6347 "owner": "nixos",
6348 "repo": "nixpkgs",
6349 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6350 "type": "github"
6351 },
6352 "original": {
6353 "owner": "nixos",
6354 "repo": "nixpkgs",
6355 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6356 "type": "github"
6357 }
6358 },
6359 "nixpkgs_77": {
6360 "flake": false,
6361 "locked": {
6362 "lastModified": 1596265691,
6363 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6364 "owner": "NixOS",
6365 "repo": "nixpkgs",
6366 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6367 "type": "github"
6368 },
6369 "original": {
6370 "owner": "NixOS",
6371 "repo": "nixpkgs",
6372 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6373 "type": "github"
6374 }
6375 },
6376 "nixpkgs_78": {
6377 "locked": {
6378 "lastModified": 1646497237,
6379 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6380 "owner": "nixos",
6381 "repo": "nixpkgs",
6382 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6383 "type": "github"
6384 },
6385 "original": {
6386 "owner": "nixos",
6387 "repo": "nixpkgs",
6388 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6389 "type": "github"
6390 }
6391 },
6392 "nixpkgs_79": {
6393 "flake": false,
6394 "locked": {
6395 "lastModified": 1596265691,
6396 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6397 "owner": "NixOS",
6398 "repo": "nixpkgs",
6399 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6400 "type": "github"
6401 },
6402 "original": {
6403 "owner": "NixOS",
6404 "repo": "nixpkgs",
6405 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6406 "type": "github"
6407 }
6408 },
6409 "nixpkgs_8": {
6410 "locked": {
6411 "lastModified": 1597943282,
6412 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6413 "owner": "NixOS",
6414 "repo": "nixpkgs",
6415 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6416 "type": "github"
6417 },
6418 "original": {
6419 "owner": "NixOS",
6420 "repo": "nixpkgs",
6421 "type": "github"
6422 }
6423 },
6424 "nixpkgs_80": {
6425 "locked": {
6426 "lastModified": 1683408522,
6427 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
6428 "owner": "NixOS",
6429 "repo": "nixpkgs",
6430 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
6431 "type": "github"
6432 },
6433 "original": {
6434 "owner": "NixOS",
6435 "ref": "nixos-unstable",
6436 "repo": "nixpkgs",
6437 "type": "github"
6438 }
6439 },
6440 "nixpkgs_81": {
6441 "locked": {
6442 "lastModified": 1687701825,
6443 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
6444 "owner": "NixOS",
6445 "repo": "nixpkgs",
6446 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
6447 "type": "github"
6448 },
6449 "original": {
6450 "owner": "NixOS",
6451 "ref": "nixpkgs-unstable",
6452 "repo": "nixpkgs",
6453 "type": "github"
6454 }
6455 },
6456 "nixpkgs_82": {
6457 "locked": {
6458 "lastModified": 1687893427,
6459 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
6460 "owner": "nixos",
6461 "repo": "nixpkgs",
6462 "rev": "4b14ab2a916508442e685089672681dff46805be",
6463 "type": "github"
6464 },
6465 "original": {
6466 "owner": "nixos",
6467 "ref": "nixos-unstable-small",
6468 "repo": "nixpkgs",
6469 "type": "github"
6470 }
6471 },
6472 "nixpkgs_83": {
6473 "locked": {
6474 "lastModified": 1648725829,
6475 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
6476 "owner": "NixOS",
6477 "repo": "nixpkgs",
6478 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
6479 "type": "github"
6480 },
6481 "original": {
6482 "owner": "NixOS",
6483 "repo": "nixpkgs",
6484 "type": "github"
6485 }
6486 },
6487 "nixpkgs_84": {
6488 "flake": false,
6489 "locked": {
6490 "lastModified": 1596265691,
6491 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6492 "owner": "NixOS",
6493 "repo": "nixpkgs",
6494 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6495 "type": "github"
6496 },
6497 "original": {
6498 "owner": "NixOS",
6499 "repo": "nixpkgs",
6500 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6501 "type": "github"
6502 }
6503 },
6504 "nixpkgs_85": {
6505 "flake": false,
6506 "locked": {
6507 "lastModified": 1596265691,
6508 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6509 "owner": "NixOS",
6510 "repo": "nixpkgs",
6511 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6512 "type": "github"
6513 },
6514 "original": {
6515 "owner": "NixOS",
6516 "repo": "nixpkgs",
6517 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6518 "type": "github"
6519 }
6520 },
6521 "nixpkgs_86": {
6522 "locked": {
6523 "lastModified": 1646497237,
6524 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
6525 "owner": "nixos",
6526 "repo": "nixpkgs",
6527 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6528 "type": "github"
6529 },
6530 "original": {
6531 "owner": "nixos",
6532 "repo": "nixpkgs",
6533 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
6534 "type": "github"
6535 }
6536 },
6537 "nixpkgs_87": {
6538 "locked": {
6539 "lastModified": 1597943282,
6540 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6541 "owner": "NixOS",
6542 "repo": "nixpkgs",
6543 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6544 "type": "github"
6545 },
6546 "original": {
6547 "owner": "NixOS",
6548 "repo": "nixpkgs",
6549 "type": "github"
6550 }
6551 },
6552 "nixpkgs_88": {
6553 "locked": {
6554 "lastModified": 1597943282,
6555 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6556 "owner": "NixOS",
6557 "repo": "nixpkgs",
6558 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6559 "type": "github"
6560 },
6561 "original": {
6562 "owner": "NixOS",
6563 "repo": "nixpkgs",
6564 "type": "github"
6565 }
6566 },
6567 "nixpkgs_89": {
6568 "locked": {
6569 "lastModified": 1631570365,
6570 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
6571 "owner": "NixOS",
6572 "repo": "nixpkgs",
6573 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
6574 "type": "github"
6575 },
6576 "original": {
6577 "owner": "NixOS",
6578 "repo": "nixpkgs",
6579 "type": "github"
6580 }
6581 },
6582 "nixpkgs_9": {
6583 "locked": {
6584 "lastModified": 1597943282,
6585 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6586 "owner": "NixOS",
6587 "repo": "nixpkgs",
6588 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6589 "type": "github"
6590 },
6591 "original": {
6592 "owner": "NixOS",
6593 "repo": "nixpkgs",
6594 "type": "github"
6595 }
6596 },
6597 "nixpkgs_90": {
6598 "locked": {
6599 "lastModified": 1611097871,
6600 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
6601 "owner": "NixOS",
6602 "repo": "nixpkgs",
6603 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
6604 "type": "github"
6605 },
6606 "original": {
6607 "owner": "NixOS",
6608 "repo": "nixpkgs",
6609 "type": "github"
6610 }
6611 },
6612 "nixpkgs_91": {
6613 "flake": false,
6614 "locked": {
6615 "lastModified": 1596265691,
6616 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6617 "owner": "NixOS",
6618 "repo": "nixpkgs",
6619 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6620 "type": "github"
6621 },
6622 "original": {
6623 "owner": "NixOS",
6624 "repo": "nixpkgs",
6625 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6626 "type": "github"
6627 }
6628 },
6629 "nixpkgs_92": {
6630 "locked": {
6631 "lastModified": 1597943282,
6632 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6633 "owner": "NixOS",
6634 "repo": "nixpkgs",
6635 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6636 "type": "github"
6637 },
6638 "original": {
6639 "owner": "NixOS",
6640 "repo": "nixpkgs",
6641 "type": "github"
6642 }
6643 },
6644 "nixpkgs_93": {
6645 "locked": {
6646 "lastModified": 1597943282,
6647 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6648 "owner": "NixOS",
6649 "repo": "nixpkgs",
6650 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6651 "type": "github"
6652 },
6653 "original": {
6654 "owner": "NixOS",
6655 "repo": "nixpkgs",
6656 "type": "github"
6657 }
6658 },
6659 "nixpkgs_94": {
6660 "locked": {
6661 "lastModified": 1597943282,
6662 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6663 "owner": "NixOS",
6664 "repo": "nixpkgs",
6665 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6666 "type": "github"
6667 },
6668 "original": {
6669 "owner": "NixOS",
6670 "repo": "nixpkgs",
6671 "type": "github"
6672 }
6673 },
6674 "nixpkgs_95": {
6675 "locked": {
6676 "lastModified": 1597943282,
6677 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
6678 "owner": "NixOS",
6679 "repo": "nixpkgs",
6680 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
6681 "type": "github"
6682 },
6683 "original": {
6684 "owner": "NixOS",
6685 "repo": "nixpkgs",
6686 "type": "github"
6687 }
6688 },
6689 "nixpkgs_96": {
6690 "locked": {
6691 "lastModified": 1631570365,
6692 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
6693 "owner": "NixOS",
6694 "repo": "nixpkgs",
6695 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
6696 "type": "github"
6697 },
6698 "original": {
6699 "owner": "NixOS",
6700 "repo": "nixpkgs",
6701 "type": "github"
6702 }
6703 },
6704 "nixpkgs_97": {
6705 "locked": {
6706 "lastModified": 1611097871,
6707 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
6708 "owner": "NixOS",
6709 "repo": "nixpkgs",
6710 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
6711 "type": "github"
6712 },
6713 "original": {
6714 "owner": "NixOS",
6715 "repo": "nixpkgs",
6716 "type": "github"
6717 }
6718 },
6719 "nixpkgs_98": {
6720 "locked": {
6721 "lastModified": 1611097871,
6722 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
6723 "owner": "NixOS",
6724 "repo": "nixpkgs",
6725 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
6726 "type": "github"
6727 },
6728 "original": {
6729 "owner": "NixOS",
6730 "repo": "nixpkgs",
6731 "type": "github"
6732 }
6733 },
6734 "nixpkgs_99": {
6735 "flake": false,
6736 "locked": {
6737 "lastModified": 1596265691,
6738 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
6739 "owner": "NixOS",
6740 "repo": "nixpkgs",
6741 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6742 "type": "github"
6743 },
6744 "original": {
6745 "owner": "NixOS",
6746 "repo": "nixpkgs",
6747 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
6748 "type": "github"
6749 }
6750 },
6751 "openarc": {
6752 "inputs": {
6753 "flake-utils": "flake-utils",
6754 "myuids": "myuids",
6755 "nixpkgs": "nixpkgs",
6756 "openarc": "openarc_2"
6757 },
6758 "locked": {
6759 "lastModified": 1,
6760 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
6761 "path": "../../openarc",
6762 "type": "path"
6763 },
6764 "original": {
6765 "path": "../../openarc",
6766 "type": "path"
6767 }
6768 },
6769 "openarc_10": {
6770 "flake": false,
6771 "locked": {
6772 "lastModified": 1537545083,
6773 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6774 "owner": "trusteddomainproject",
6775 "repo": "OpenARC",
6776 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6777 "type": "github"
6778 },
6779 "original": {
6780 "owner": "trusteddomainproject",
6781 "repo": "OpenARC",
6782 "type": "github"
6783 }
6784 },
6785 "openarc_11": {
6786 "flake": false,
6787 "locked": {
6788 "lastModified": 1537545083,
6789 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6790 "owner": "trusteddomainproject",
6791 "repo": "OpenARC",
6792 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6793 "type": "github"
6794 },
6795 "original": {
6796 "owner": "trusteddomainproject",
6797 "repo": "OpenARC",
6798 "type": "github"
6799 }
6800 },
6801 "openarc_12": {
6802 "inputs": {
6803 "flake-utils": "flake-utils_53",
6804 "myuids": "myuids_36",
6805 "nixpkgs": "nixpkgs_92",
6806 "openarc": "openarc_13"
6807 },
6808 "locked": {
6809 "lastModified": 1,
6810 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
6811 "path": "../../openarc",
6812 "type": "path"
6813 },
6814 "original": {
6815 "path": "../../openarc",
6816 "type": "path"
6817 }
6818 },
6819 "openarc_13": {
6820 "flake": false,
6821 "locked": {
6822 "lastModified": 1537545083,
6823 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6824 "owner": "trusteddomainproject",
6825 "repo": "OpenARC",
6826 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6827 "type": "github"
6828 },
6829 "original": {
6830 "owner": "trusteddomainproject",
6831 "repo": "OpenARC",
6832 "type": "github"
6833 }
6834 },
6835 "openarc_14": {
6836 "inputs": {
6837 "flake-utils": "flake-utils_55",
6838 "myuids": "myuids_38",
6839 "nixpkgs": "nixpkgs_94",
6840 "openarc": "openarc_15"
6841 },
6842 "locked": {
6843 "lastModified": 1,
6844 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
6845 "path": "../../openarc",
6846 "type": "path"
6847 },
6848 "original": {
6849 "path": "../../openarc",
6850 "type": "path"
6851 }
6852 },
6853 "openarc_15": {
6854 "flake": false,
6855 "locked": {
6856 "lastModified": 1537545083,
6857 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6858 "owner": "trusteddomainproject",
6859 "repo": "OpenARC",
6860 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6861 "type": "github"
6862 },
6863 "original": {
6864 "owner": "trusteddomainproject",
6865 "repo": "OpenARC",
6866 "type": "github"
6867 }
6868 },
6869 "openarc_2": {
6870 "flake": false,
6871 "locked": {
6872 "lastModified": 1537545083,
6873 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6874 "owner": "trusteddomainproject",
6875 "repo": "OpenARC",
6876 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6877 "type": "github"
6878 },
6879 "original": {
6880 "owner": "trusteddomainproject",
6881 "repo": "OpenARC",
6882 "type": "github"
6883 }
6884 },
6885 "openarc_3": {
6886 "inputs": {
6887 "files-watcher": "files-watcher_2",
6888 "openarc": "openarc_4",
6889 "secrets": "secrets_4"
6890 },
6891 "locked": {
6892 "lastModified": 1,
6893 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
6894 "path": "../../flakes/private/openarc",
6895 "type": "path"
6896 },
6897 "original": {
6898 "path": "../../flakes/private/openarc",
6899 "type": "path"
6900 }
6901 },
6902 "openarc_4": {
6903 "inputs": {
6904 "flake-utils": "flake-utils_4",
6905 "myuids": "myuids_4",
6906 "nixpkgs": "nixpkgs_8",
6907 "openarc": "openarc_5"
6908 },
6909 "locked": {
6910 "lastModified": 1,
6911 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
6912 "path": "../../openarc",
6913 "type": "path"
6914 },
6915 "original": {
6916 "path": "../../openarc",
6917 "type": "path"
6918 }
6919 },
6920 "openarc_5": {
6921 "flake": false,
6922 "locked": {
6923 "lastModified": 1537545083,
6924 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6925 "owner": "trusteddomainproject",
6926 "repo": "OpenARC",
6927 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6928 "type": "github"
6929 },
6930 "original": {
6931 "owner": "trusteddomainproject",
6932 "repo": "OpenARC",
6933 "type": "github"
6934 }
6935 },
6936 "openarc_6": {
6937 "inputs": {
6938 "flake-utils": "flake-utils_12",
6939 "myuids": "myuids_9",
6940 "nixpkgs": "nixpkgs_25",
6941 "openarc": "openarc_7"
6942 },
6943 "locked": {
6944 "lastModified": 1,
6945 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
6946 "path": "../../openarc",
6947 "type": "path"
6948 },
6949 "original": {
6950 "path": "../../openarc",
6951 "type": "path"
6952 }
6953 },
6954 "openarc_7": {
6955 "flake": false,
6956 "locked": {
6957 "lastModified": 1537545083,
6958 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6959 "owner": "trusteddomainproject",
6960 "repo": "OpenARC",
6961 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6962 "type": "github"
6963 },
6964 "original": {
6965 "owner": "trusteddomainproject",
6966 "repo": "OpenARC",
6967 "type": "github"
6968 }
6969 },
6970 "openarc_8": {
6971 "inputs": {
6972 "flake-utils": "flake-utils_14",
6973 "myuids": "myuids_11",
6974 "nixpkgs": "nixpkgs_27",
6975 "openarc": "openarc_9"
6976 },
6977 "locked": {
6978 "lastModified": 1,
6979 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
6980 "path": "../../openarc",
6981 "type": "path"
6982 },
6983 "original": {
6984 "path": "../../openarc",
6985 "type": "path"
6986 }
6987 },
6988 "openarc_9": {
6989 "flake": false,
6990 "locked": {
6991 "lastModified": 1537545083,
6992 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
6993 "owner": "trusteddomainproject",
6994 "repo": "OpenARC",
6995 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
6996 "type": "github"
6997 },
6998 "original": {
6999 "owner": "trusteddomainproject",
7000 "repo": "OpenARC",
7001 "type": "github"
7002 }
7003 },
7004 "opendmarc": {
7005 "inputs": {
7006 "flake-utils": "flake-utils_2",
7007 "myuids": "myuids_2",
7008 "nixpkgs": "nixpkgs_2"
7009 },
7010 "locked": {
7011 "lastModified": 1,
7012 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7013 "path": "../../opendmarc",
7014 "type": "path"
7015 },
7016 "original": {
7017 "path": "../../opendmarc",
7018 "type": "path"
7019 }
7020 },
7021 "opendmarc_2": {
7022 "inputs": {
7023 "environment": "environment_6",
7024 "files-watcher": "files-watcher_3",
7025 "opendmarc": "opendmarc_3",
7026 "secrets": "secrets_5"
7027 },
7028 "locked": {
7029 "lastModified": 1,
7030 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
7031 "path": "../../flakes/private/opendmarc",
7032 "type": "path"
7033 },
7034 "original": {
7035 "path": "../../flakes/private/opendmarc",
7036 "type": "path"
7037 }
7038 },
7039 "opendmarc_3": {
7040 "inputs": {
7041 "flake-utils": "flake-utils_5",
7042 "myuids": "myuids_5",
7043 "nixpkgs": "nixpkgs_9"
7044 },
7045 "locked": {
7046 "lastModified": 1,
7047 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7048 "path": "../../opendmarc",
7049 "type": "path"
7050 },
7051 "original": {
7052 "path": "../../opendmarc",
7053 "type": "path"
7054 }
7055 },
7056 "opendmarc_4": {
7057 "inputs": {
7058 "flake-utils": "flake-utils_13",
7059 "myuids": "myuids_10",
7060 "nixpkgs": "nixpkgs_26"
7061 },
7062 "locked": {
7063 "lastModified": 1,
7064 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7065 "path": "../../opendmarc",
7066 "type": "path"
7067 },
7068 "original": {
7069 "path": "../../opendmarc",
7070 "type": "path"
7071 }
7072 },
7073 "opendmarc_5": {
7074 "inputs": {
7075 "flake-utils": "flake-utils_15",
7076 "myuids": "myuids_12",
7077 "nixpkgs": "nixpkgs_28"
7078 },
7079 "locked": {
7080 "lastModified": 1,
7081 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7082 "path": "../../opendmarc",
7083 "type": "path"
7084 },
7085 "original": {
7086 "path": "../../opendmarc",
7087 "type": "path"
7088 }
7089 },
7090 "opendmarc_6": {
7091 "inputs": {
7092 "flake-utils": "flake-utils_54",
7093 "myuids": "myuids_37",
7094 "nixpkgs": "nixpkgs_93"
7095 },
7096 "locked": {
7097 "lastModified": 1,
7098 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7099 "path": "../../opendmarc",
7100 "type": "path"
7101 },
7102 "original": {
7103 "path": "../../opendmarc",
7104 "type": "path"
7105 }
7106 },
7107 "opendmarc_7": {
7108 "inputs": {
7109 "flake-utils": "flake-utils_56",
7110 "myuids": "myuids_39",
7111 "nixpkgs": "nixpkgs_95"
7112 },
7113 "locked": {
7114 "lastModified": 1,
7115 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7116 "path": "../../opendmarc",
7117 "type": "path"
7118 },
7119 "original": {
7120 "path": "../../opendmarc",
7121 "type": "path"
7122 }
7123 },
7124 "openldap": {
7125 "locked": {
7126 "lastModified": 1,
7127 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
7128 "path": "../../flakes/private/openldap",
7129 "type": "path"
7130 },
7131 "original": {
7132 "path": "../../flakes/private/openldap",
7133 "type": "path"
7134 }
7135 },
7136 "paste": {
7137 "inputs": {
7138 "flake-utils": "flake-utils_16",
7139 "nixpkgs": "nixpkgs_29"
7140 },
7141 "locked": {
7142 "lastModified": 1,
7143 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
7144 "path": "../../paste",
7145 "type": "path"
7146 },
7147 "original": {
7148 "path": "../../paste",
7149 "type": "path"
7150 }
7151 },
7152 "paste_2": {
7153 "inputs": {
7154 "flake-utils": "flake-utils_57",
7155 "nixpkgs": "nixpkgs_96"
7156 },
7157 "locked": {
7158 "lastModified": 1,
7159 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
7160 "path": "../../paste",
7161 "type": "path"
7162 },
7163 "original": {
7164 "path": "../../paste",
7165 "type": "path"
7166 }
7167 },
7168 "peertube": {
7169 "flake": false,
7170 "locked": {
7171 "lastModified": 1611184594,
7172 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
7173 "ref": "gitolite_local/open_instance",
7174 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
7175 "revCount": 6316,
7176 "type": "git",
7177 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
7178 },
7179 "original": {
7180 "owner": "Chocobozzz",
7181 "ref": "v3.0.1",
7182 "repo": "PeerTube",
7183 "type": "github"
7184 }
7185 },
7186 "peertube_2": {
7187 "flake": false,
7188 "locked": {
7189 "lastModified": 1610436329,
7190 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7191 "owner": "Chocobozzz",
7192 "repo": "PeerTube",
7193 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7194 "type": "github"
7195 },
7196 "original": {
7197 "owner": "Chocobozzz",
7198 "ref": "v3.0.1",
7199 "repo": "PeerTube",
7200 "type": "github"
7201 }
7202 },
7203 "peertube_3": {
7204 "flake": false,
7205 "locked": {
7206 "lastModified": 1610436329,
7207 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7208 "owner": "Chocobozzz",
7209 "repo": "PeerTube",
7210 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7211 "type": "github"
7212 },
7213 "original": {
7214 "owner": "Chocobozzz",
7215 "ref": "v3.0.1",
7216 "repo": "PeerTube",
7217 "type": "github"
7218 }
7219 },
7220 "peertube_4": {
7221 "flake": false,
7222 "locked": {
7223 "lastModified": 1610436329,
7224 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7225 "owner": "Chocobozzz",
7226 "repo": "PeerTube",
7227 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7228 "type": "github"
7229 },
7230 "original": {
7231 "owner": "Chocobozzz",
7232 "ref": "v3.0.1",
7233 "repo": "PeerTube",
7234 "type": "github"
7235 }
7236 },
7237 "peertube_5": {
7238 "flake": false,
7239 "locked": {
7240 "lastModified": 1611184594,
7241 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
7242 "ref": "gitolite_local/open_instance",
7243 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
7244 "revCount": 6316,
7245 "type": "git",
7246 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
7247 },
7248 "original": {
7249 "owner": "Chocobozzz",
7250 "ref": "v3.0.1",
7251 "repo": "PeerTube",
7252 "type": "github"
7253 }
7254 },
7255 "peertube_6": {
7256 "flake": false,
7257 "locked": {
7258 "lastModified": 1610436329,
7259 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
7260 "owner": "Chocobozzz",
7261 "repo": "PeerTube",
7262 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
7263 "type": "github"
7264 },
7265 "original": {
7266 "owner": "Chocobozzz",
7267 "ref": "v3.0.1",
7268 "repo": "PeerTube",
7269 "type": "github"
7270 }
7271 },
7272 "peertube_open_instance": {
7273 "inputs": {
7274 "flake-utils": "flake-utils_17",
7275 "myuids": "myuids_13",
7276 "nixpkgs": "nixpkgs_30",
7277 "peertube": "peertube"
7278 },
7279 "locked": {
7280 "lastModified": 1,
7281 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7282 "path": "./../../peertube",
7283 "type": "path"
7284 },
7285 "original": {
7286 "path": "./../../peertube",
7287 "type": "path"
7288 }
7289 },
7290 "peertube_open_instance_2": {
7291 "inputs": {
7292 "flake-utils": "flake-utils_58",
7293 "myuids": "myuids_40",
7294 "nixpkgs": "nixpkgs_97",
7295 "peertube": "peertube_5"
7296 },
7297 "locked": {
7298 "lastModified": 1,
7299 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7300 "path": "./../../peertube",
7301 "type": "path"
7302 },
7303 "original": {
7304 "path": "./../../peertube",
7305 "type": "path"
7306 }
7307 },
7308 "peertube_origin": {
7309 "inputs": {
7310 "flake-utils": "flake-utils_18",
7311 "myuids": "myuids_14",
7312 "nixpkgs": "nixpkgs_31",
7313 "peertube": "peertube_2"
7314 },
7315 "locked": {
7316 "lastModified": 1,
7317 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7318 "path": "./../../peertube",
7319 "type": "path"
7320 },
7321 "original": {
7322 "path": "./../../peertube",
7323 "type": "path"
7324 }
7325 },
7326 "peertube_origin_2": {
7327 "inputs": {
7328 "flake-utils": "flake-utils_59",
7329 "myuids": "myuids_41",
7330 "nixpkgs": "nixpkgs_98",
7331 "peertube": "peertube_6"
7332 },
7333 "locked": {
7334 "lastModified": 1,
7335 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7336 "path": "./../../peertube",
7337 "type": "path"
7338 },
7339 "original": {
7340 "path": "./../../peertube",
7341 "type": "path"
7342 }
7343 },
7344 "php": {
7345 "inputs": {
7346 "flake-utils": "flake-utils_33",
7347 "nixpkgs": "nixpkgs_55",
7348 "nixpkgs-4": "nixpkgs-4_2"
7349 },
7350 "locked": {
7351 "lastModified": 1,
7352 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
7353 "path": "../../flakes/private/php",
7354 "type": "path"
7355 },
7356 "original": {
7357 "path": "../../flakes/private/php",
7358 "type": "path"
7359 }
7360 },
7361 "php_2": {
7362 "inputs": {
7363 "flake-utils": "flake-utils_36",
7364 "nixpkgs": "nixpkgs_63",
7365 "nixpkgs-4": "nixpkgs-4_3"
7366 },
7367 "locked": {
7368 "lastModified": 1,
7369 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
7370 "path": "../../flakes/private/php",
7371 "type": "path"
7372 },
7373 "original": {
7374 "path": "../../flakes/private/php",
7375 "type": "path"
7376 }
7377 },
7378 "private-buildbot": {
7379 "inputs": {
7380 "buildslist": "buildslist",
7381 "flake-utils": "flake-utils_11",
7382 "nixpkgs": "nixpkgs_24"
7383 },
7384 "locked": {
7385 "lastModified": 1,
7386 "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
7387 "path": "../../flakes/private/buildbot",
7388 "type": "path"
7389 },
7390 "original": {
7391 "path": "../../flakes/private/buildbot",
7392 "type": "path"
7393 }
7394 },
7395 "private-chatons": {
7396 "inputs": {
7397 "environment": "environment_12"
7398 },
7399 "locked": {
7400 "lastModified": 1,
7401 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
7402 "path": "../../flakes/private/chatons",
7403 "type": "path"
7404 },
7405 "original": {
7406 "path": "../../flakes/private/chatons",
7407 "type": "path"
7408 }
7409 },
7410 "private-environment": {
7411 "locked": {
7412 "lastModified": 1,
7413 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7414 "path": "../../flakes/private/environment",
7415 "type": "path"
7416 },
7417 "original": {
7418 "path": "../../flakes/private/environment",
7419 "type": "path"
7420 }
7421 },
7422 "private-environment_2": {
7423 "locked": {
7424 "lastModified": 1,
7425 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7426 "path": "../../flakes/private/environment",
7427 "type": "path"
7428 },
7429 "original": {
7430 "path": "../../flakes/private/environment",
7431 "type": "path"
7432 }
7433 },
7434 "private-milters": {
7435 "inputs": {
7436 "environment": "environment_13",
7437 "files-watcher": "files-watcher_5",
7438 "openarc": "openarc_6",
7439 "opendmarc": "opendmarc_4",
7440 "secrets": "secrets_10"
7441 },
7442 "locked": {
7443 "lastModified": 1,
7444 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
7445 "path": "../../flakes/private/milters",
7446 "type": "path"
7447 },
7448 "original": {
7449 "path": "../../flakes/private/milters",
7450 "type": "path"
7451 }
7452 },
7453 "private-monitoring": {
7454 "inputs": {
7455 "environment": "environment_14",
7456 "naemon": "naemon_3",
7457 "nixpkgs-lib": "nixpkgs-lib_8",
7458 "secrets": "secrets_11"
7459 },
7460 "locked": {
7461 "lastModified": 1,
7462 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
7463 "path": "../../flakes/private/monitoring",
7464 "type": "path"
7465 },
7466 "original": {
7467 "path": "../../flakes/private/monitoring",
7468 "type": "path"
7469 }
7470 },
7471 "private-openarc": {
7472 "inputs": {
7473 "files-watcher": "files-watcher_6",
7474 "openarc": "openarc_8",
7475 "secrets": "secrets_12"
7476 },
7477 "locked": {
7478 "lastModified": 1,
7479 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
7480 "path": "../../flakes/private/openarc",
7481 "type": "path"
7482 },
7483 "original": {
7484 "path": "../../flakes/private/openarc",
7485 "type": "path"
7486 }
7487 },
7488 "private-opendmarc": {
7489 "inputs": {
7490 "environment": "environment_15",
7491 "files-watcher": "files-watcher_7",
7492 "opendmarc": "opendmarc_5",
7493 "secrets": "secrets_13"
7494 },
7495 "locked": {
7496 "lastModified": 1,
7497 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
7498 "path": "../../flakes/private/opendmarc",
7499 "type": "path"
7500 },
7501 "original": {
7502 "path": "../../flakes/private/opendmarc",
7503 "type": "path"
7504 }
7505 },
7506 "private-openldap": {
7507 "locked": {
7508 "lastModified": 1,
7509 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
7510 "path": "../../flakes/private/openldap",
7511 "type": "path"
7512 },
7513 "original": {
7514 "path": "../../flakes/private/openldap",
7515 "type": "path"
7516 }
7517 },
7518 "private-paste": {
7519 "inputs": {
7520 "paste": "paste"
7521 },
7522 "locked": {
7523 "lastModified": 1,
7524 "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
7525 "path": "../../flakes/private/paste",
7526 "type": "path"
7527 },
7528 "original": {
7529 "path": "../../flakes/private/paste",
7530 "type": "path"
7531 }
7532 },
7533 "private-peertube": {
7534 "inputs": {
7535 "peertube_open_instance": "peertube_open_instance",
7536 "peertube_origin": "peertube_origin"
7537 },
7538 "locked": {
7539 "lastModified": 1,
7540 "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
7541 "path": "../../flakes/private/peertube",
7542 "type": "path"
7543 },
7544 "original": {
7545 "path": "../../flakes/private/peertube",
7546 "type": "path"
7547 }
7548 },
7549 "private-php": {
7550 "inputs": {
7551 "flake-utils": "flake-utils_19",
7552 "nixpkgs": "nixpkgs_32",
7553 "nixpkgs-4": "nixpkgs-4"
7554 },
7555 "locked": {
7556 "lastModified": 1,
7557 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
7558 "path": "../../flakes/private/php",
7559 "type": "path"
7560 },
7561 "original": {
7562 "path": "../../flakes/private/php",
7563 "type": "path"
7564 }
7565 },
7566 "private-ssh": {
7567 "inputs": {
7568 "environment": "environment_16",
7569 "secrets": "secrets_14"
7570 },
7571 "locked": {
7572 "lastModified": 1,
7573 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
7574 "path": "../../flakes/private/ssh",
7575 "type": "path"
7576 },
7577 "original": {
7578 "path": "../../flakes/private/ssh",
7579 "type": "path"
7580 }
7581 },
7582 "private-system": {
7583 "inputs": {
7584 "backports": "backports_3",
7585 "environment": "environment_17",
7586 "mypackages": "mypackages_3",
7587 "myuids": "myuids_15",
7588 "secrets-public": "secrets-public_3"
7589 },
7590 "locked": {
7591 "lastModified": 1,
7592 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
7593 "path": "../../flakes/private/system",
7594 "type": "path"
7595 },
7596 "original": {
7597 "path": "../../flakes/private/system",
7598 "type": "path"
7599 }
7600 },
7601 "private-system_2": {
7602 "inputs": {
7603 "backports": "backports_6",
7604 "environment": "environment_26",
7605 "mypackages": "mypackages_9",
7606 "myuids": "myuids_28",
7607 "secrets-public": "secrets-public_6"
7608 },
7609 "locked": {
7610 "lastModified": 1,
7611 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
7612 "path": "../../flakes/private/system",
7613 "type": "path"
7614 },
7615 "original": {
7616 "path": "../../flakes/private/system",
7617 "type": "path"
7618 }
7619 },
7620 "public-copanier": {
7621 "inputs": {
7622 "copanier": "copanier",
7623 "flake-utils": "flake-utils_21",
7624 "nixpkgs": "nixpkgs_35"
7625 },
7626 "locked": {
7627 "lastModified": 1,
7628 "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
7629 "path": "../../flakes/copanier",
7630 "type": "path"
7631 },
7632 "original": {
7633 "path": "../../flakes/copanier",
7634 "type": "path"
7635 }
7636 },
7637 "public-diaspora": {
7638 "inputs": {
7639 "diaspora": "diaspora",
7640 "flake-utils": "flake-utils_22",
7641 "myuids": "myuids_16",
7642 "nixpkgs": "nixpkgs_36"
7643 },
7644 "locked": {
7645 "lastModified": 1,
7646 "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
7647 "path": "../../flakes/diaspora",
7648 "type": "path"
7649 },
7650 "original": {
7651 "path": "../../flakes/diaspora",
7652 "type": "path"
7653 }
7654 },
7655 "public-etherpad-lite": {
7656 "inputs": {
7657 "etherpad-lite": "etherpad-lite",
7658 "flake-utils": "flake-utils_23",
7659 "mypackages": "mypackages_4",
7660 "nixpkgs": "nixpkgs_38"
7661 },
7662 "locked": {
7663 "lastModified": 1,
7664 "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
7665 "path": "../../flakes/etherpad-lite",
7666 "type": "path"
7667 },
7668 "original": {
7669 "path": "../../flakes/etherpad-lite",
7670 "type": "path"
7671 }
7672 },
7673 "public-fiche": {
7674 "locked": {
7675 "lastModified": 1,
7676 "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
7677 "path": "../../flakes/fiche",
7678 "type": "path"
7679 },
7680 "original": {
7681 "path": "../../flakes/fiche",
7682 "type": "path"
7683 }
7684 },
7685 "public-files-watcher": {
7686 "locked": {
7687 "lastModified": 1,
7688 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
7689 "path": "../../flakes/files-watcher",
7690 "type": "path"
7691 },
7692 "original": {
7693 "path": "../../flakes/files-watcher",
7694 "type": "path"
7695 }
7696 },
7697 "public-grocy": {
7698 "inputs": {
7699 "flake-utils": "flake-utils_24",
7700 "grocy": "grocy",
7701 "mypackages": "mypackages_5",
7702 "nixpkgs": "nixpkgs_40"
7703 },
7704 "locked": {
7705 "lastModified": 1,
7706 "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
7707 "path": "../../flakes/grocy",
7708 "type": "path"
7709 },
7710 "original": {
7711 "path": "../../flakes/grocy",
7712 "type": "path"
7713 }
7714 },
7715 "public-loginctl-linger": {
7716 "locked": {
7717 "lastModified": 1,
7718 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
7719 "path": "../../flakes/loginctl-linger",
7720 "type": "path"
7721 },
7722 "original": {
7723 "path": "../../flakes/loginctl-linger",
7724 "type": "path"
7725 }
7726 },
7727 "public-mastodon": {
7728 "inputs": {
7729 "flake-utils": "flake-utils_25",
7730 "mastodon": "mastodon",
7731 "myuids": "myuids_17",
7732 "nixpkgs": "nixpkgs_41"
7733 },
7734 "locked": {
7735 "lastModified": 1,
7736 "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
7737 "path": "../../flakes/mastodon",
7738 "type": "path"
7739 },
7740 "original": {
7741 "path": "../../flakes/mastodon",
7742 "type": "path"
7743 }
7744 },
7745 "public-mediagoblin": {
7746 "inputs": {
7747 "flake-utils": "flake-utils_26",
7748 "mediagoblin": "mediagoblin",
7749 "myuids": "myuids_18",
7750 "nixpkgs": "nixpkgs_42"
7751 },
7752 "locked": {
7753 "lastModified": 1,
7754 "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
7755 "path": "../../flakes/mediagoblin",
7756 "type": "path"
7757 },
7758 "original": {
7759 "path": "../../flakes/mediagoblin",
7760 "type": "path"
7761 }
7762 },
7763 "public-multi-apache-container": {
7764 "inputs": {
7765 "files-watcher": "files-watcher_8",
7766 "myuids": "myuids_19"
7767 },
7768 "locked": {
7769 "lastModified": 1,
7770 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
7771 "path": "../../flakes/multi-apache-container",
7772 "type": "path"
7773 },
7774 "original": {
7775 "path": "../../flakes/multi-apache-container",
7776 "type": "path"
7777 }
7778 },
7779 "public-mypackages": {
7780 "inputs": {
7781 "flake-parts": "flake-parts_9",
7782 "nixpkgs": "nixpkgs_43",
7783 "webapps-ttrss": "webapps-ttrss_6"
7784 },
7785 "locked": {
7786 "lastModified": 1,
7787 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
7788 "path": "../../flakes/mypackages",
7789 "type": "path"
7790 },
7791 "original": {
7792 "path": "../../flakes/mypackages",
7793 "type": "path"
7794 }
7795 },
7796 "public-myuids": {
7797 "locked": {
7798 "lastModified": 1,
7799 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
7800 "path": "../../flakes/myuids",
7801 "type": "path"
7802 },
7803 "original": {
7804 "path": "../../flakes/myuids",
7805 "type": "path"
7806 }
7807 },
7808 "public-openarc": {
7809 "inputs": {
7810 "flake-utils": "flake-utils_27",
7811 "myuids": "myuids_20",
7812 "nixpkgs": "nixpkgs_44",
7813 "openarc": "openarc_10"
7814 },
7815 "locked": {
7816 "lastModified": 1,
7817 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
7818 "path": "../../flakes/openarc",
7819 "type": "path"
7820 },
7821 "original": {
7822 "path": "../../flakes/openarc",
7823 "type": "path"
7824 }
7825 },
7826 "public-opendmarc": {
7827 "inputs": {
7828 "flake-utils": "flake-utils_28",
7829 "myuids": "myuids_21",
7830 "nixpkgs": "nixpkgs_45"
7831 },
7832 "locked": {
7833 "lastModified": 1,
7834 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
7835 "path": "../../flakes/opendmarc",
7836 "type": "path"
7837 },
7838 "original": {
7839 "path": "../../flakes/opendmarc",
7840 "type": "path"
7841 }
7842 },
7843 "public-peertube": {
7844 "inputs": {
7845 "flake-utils": "flake-utils_29",
7846 "myuids": "myuids_22",
7847 "nixpkgs": "nixpkgs_46",
7848 "peertube": "peertube_3"
7849 },
7850 "locked": {
7851 "lastModified": 1,
7852 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
7853 "path": "../../flakes/peertube",
7854 "type": "path"
7855 },
7856 "original": {
7857 "path": "../../flakes/peertube",
7858 "type": "path"
7859 }
7860 },
7861 "public-secrets": {
7862 "locked": {
7863 "lastModified": 1,
7864 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
7865 "path": "../../flakes/secrets",
7866 "type": "path"
7867 },
7868 "original": {
7869 "path": "../../flakes/secrets",
7870 "type": "path"
7871 }
7872 },
7873 "public-secrets_2": {
7874 "locked": {
7875 "lastModified": 1,
7876 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
7877 "path": "../../flakes/secrets",
7878 "type": "path"
7879 },
7880 "original": {
7881 "path": "../../flakes/secrets",
7882 "type": "path"
7883 }
7884 },
7885 "public-surfer": {
7886 "inputs": {
7887 "flake-utils": "flake-utils_30",
7888 "mypackages": "mypackages_6",
7889 "nixpkgs": "nixpkgs_48",
7890 "surfer": "surfer"
7891 },
7892 "locked": {
7893 "lastModified": 1,
7894 "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
7895 "path": "../../flakes/surfer",
7896 "type": "path"
7897 },
7898 "original": {
7899 "path": "../../flakes/surfer",
7900 "type": "path"
7901 }
7902 },
7903 "public-taskwarrior-web": {
7904 "inputs": {
7905 "flake-utils": "flake-utils_31",
7906 "nixpkgs": "nixpkgs_49",
7907 "taskwarrior-web": "taskwarrior-web"
7908 },
7909 "locked": {
7910 "lastModified": 1,
7911 "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
7912 "path": "../../flakes/taskwarrior-web",
7913 "type": "path"
7914 },
7915 "original": {
7916 "path": "../../flakes/taskwarrior-web",
7917 "type": "path"
7918 }
7919 },
7920 "root": {
7921 "inputs": {
7922 "n-backup-2": "n-backup-2",
7923 "n-dilion": "n-dilion",
7924 "n-eldiron": "n-eldiron",
7925 "n-monitoring-1": "n-monitoring-1",
7926 "n-quatresaisons": "n-quatresaisons",
7927 "n-zoldene": "n-zoldene",
7928 "s-backports": "s-backports",
7929 "s-copanier": "s-copanier",
7930 "s-diaspora": "s-diaspora",
7931 "s-etherpad-lite": "s-etherpad-lite",
7932 "s-fiche": "s-fiche",
7933 "s-files-watcher": "s-files-watcher",
7934 "s-grocy": "s-grocy",
7935 "s-lib": "s-lib",
7936 "s-loginctl-linger": "s-loginctl-linger",
7937 "s-mastodon": "s-mastodon",
7938 "s-mediagoblin": "s-mediagoblin",
7939 "s-multi-apache-container": "s-multi-apache-container",
7940 "s-mypackages": "s-mypackages",
7941 "s-myuids": "s-myuids",
7942 "s-naemon": "s-naemon",
7943 "s-openarc": "s-openarc",
7944 "s-opendmarc": "s-opendmarc",
7945 "s-paste": "s-paste",
7946 "s-peertube": "s-peertube",
7947 "s-private-buildbot": "s-private-buildbot",
7948 "s-private-chatons": "s-private-chatons",
7949 "s-private-environment": "s-private-environment",
7950 "s-private-mail-relay": "s-private-mail-relay",
7951 "s-private-milters": "s-private-milters",
7952 "s-private-monitoring": "s-private-monitoring",
7953 "s-private-openarc": "s-private-openarc",
7954 "s-private-opendmarc": "s-private-opendmarc",
7955 "s-private-openldap": "s-private-openldap",
7956 "s-private-paste": "s-private-paste",
7957 "s-private-peertube": "s-private-peertube",
7958 "s-private-php": "s-private-php",
7959 "s-private-ssh": "s-private-ssh",
7960 "s-private-system": "s-private-system",
7961 "s-rsync_backup": "s-rsync_backup",
7962 "s-secrets": "s-secrets",
7963 "s-surfer": "s-surfer",
7964 "s-taskwarrior-web": "s-taskwarrior-web",
7965 "secrets": "secrets_26"
7966 }
7967 },
7968 "rsync_backup": {
7969 "locked": {
7970 "lastModified": 1,
7971 "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
7972 "path": "../../flakes/rsync_backup",
7973 "type": "path"
7974 },
7975 "original": {
7976 "path": "../../flakes/rsync_backup",
7977 "type": "path"
7978 }
7979 },
7980 "s-backports": {
7981 "inputs": {
7982 "flake-utils": "flake-utils_40",
7983 "nixpkgs": "nixpkgs_73"
7984 },
7985 "locked": {
7986 "lastModified": 1,
7987 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
7988 "path": "./backports",
7989 "type": "path"
7990 },
7991 "original": {
7992 "path": "./backports",
7993 "type": "path"
7994 }
7995 },
7996 "s-copanier": {
7997 "inputs": {
7998 "copanier": "copanier_2",
7999 "flake-utils": "flake-utils_41",
8000 "nixpkgs": "nixpkgs_74"
8001 },
8002 "locked": {
8003 "lastModified": 1,
8004 "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
8005 "path": "./copanier",
8006 "type": "path"
8007 },
8008 "original": {
8009 "path": "./copanier",
8010 "type": "path"
8011 }
8012 },
8013 "s-diaspora": {
8014 "inputs": {
8015 "diaspora": "diaspora_2",
8016 "flake-utils": "flake-utils_42",
8017 "myuids": "myuids_29",
8018 "nixpkgs": "nixpkgs_75"
8019 },
8020 "locked": {
8021 "lastModified": 1,
8022 "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
8023 "path": "./diaspora",
8024 "type": "path"
8025 },
8026 "original": {
8027 "path": "./diaspora",
8028 "type": "path"
8029 }
8030 },
8031 "s-etherpad-lite": {
8032 "inputs": {
8033 "etherpad-lite": "etherpad-lite_2",
8034 "flake-utils": "flake-utils_43",
8035 "mypackages": "mypackages_10",
8036 "nixpkgs": "nixpkgs_77"
8037 },
8038 "locked": {
8039 "lastModified": 1,
8040 "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
8041 "path": "./etherpad-lite",
8042 "type": "path"
8043 },
8044 "original": {
8045 "path": "./etherpad-lite",
8046 "type": "path"
8047 }
8048 },
8049 "s-fiche": {
8050 "locked": {
8051 "lastModified": 1,
8052 "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
8053 "path": "./fiche",
8054 "type": "path"
8055 },
8056 "original": {
8057 "path": "./fiche",
8058 "type": "path"
8059 }
8060 },
8061 "s-files-watcher": {
8062 "locked": {
8063 "lastModified": 1,
8064 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
8065 "path": "./files-watcher",
8066 "type": "path"
8067 },
8068 "original": {
8069 "path": "./files-watcher",
8070 "type": "path"
8071 }
8072 },
8073 "s-grocy": {
8074 "inputs": {
8075 "flake-utils": "flake-utils_44",
8076 "grocy": "grocy_2",
8077 "mypackages": "mypackages_11",
8078 "nixpkgs": "nixpkgs_79"
8079 },
8080 "locked": {
8081 "lastModified": 1,
8082 "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
8083 "path": "./grocy",
8084 "type": "path"
8085 },
8086 "original": {
8087 "path": "./grocy",
8088 "type": "path"
8089 }
8090 },
8091 "s-lib": {
8092 "inputs": {
8093 "colmena": "colmena_7",
8094 "disko": "disko_7",
8095 "flake-parts": "flake-parts_19",
8096 "nixos-anywhere": "nixos-anywhere_7",
8097 "nixpkgs": "nixpkgs_83"
8098 },
8099 "locked": {
8100 "lastModified": 1,
8101 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
8102 "path": "./lib",
8103 "type": "path"
8104 },
8105 "original": {
8106 "path": "./lib",
8107 "type": "path"
8108 }
8109 },
8110 "s-loginctl-linger": {
8111 "locked": {
8112 "lastModified": 1,
8113 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
8114 "path": "./loginctl-linger",
8115 "type": "path"
8116 },
8117 "original": {
8118 "path": "./loginctl-linger",
8119 "type": "path"
8120 }
8121 },
8122 "s-mastodon": {
8123 "inputs": {
8124 "flake-utils": "flake-utils_46",
8125 "mastodon": "mastodon_2",
8126 "myuids": "myuids_30",
8127 "nixpkgs": "nixpkgs_84"
8128 },
8129 "locked": {
8130 "lastModified": 1,
8131 "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
8132 "path": "./mastodon",
8133 "type": "path"
8134 },
8135 "original": {
8136 "path": "./mastodon",
8137 "type": "path"
8138 }
8139 },
8140 "s-mediagoblin": {
8141 "inputs": {
8142 "flake-utils": "flake-utils_47",
8143 "mediagoblin": "mediagoblin_2",
8144 "myuids": "myuids_31",
8145 "nixpkgs": "nixpkgs_85"
8146 },
8147 "locked": {
8148 "lastModified": 1,
8149 "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
8150 "path": "./mediagoblin",
8151 "type": "path"
8152 },
8153 "original": {
8154 "path": "./mediagoblin",
8155 "type": "path"
8156 }
8157 },
8158 "s-multi-apache-container": {
8159 "inputs": {
8160 "files-watcher": "files-watcher_12",
8161 "myuids": "myuids_32"
8162 },
8163 "locked": {
8164 "lastModified": 1,
8165 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
8166 "path": "./multi-apache-container",
8167 "type": "path"
8168 },
8169 "original": {
8170 "path": "./multi-apache-container",
8171 "type": "path"
8172 }
8173 },
8174 "s-mypackages": {
8175 "inputs": {
8176 "flake-parts": "flake-parts_20",
8177 "nixpkgs": "nixpkgs_86",
8178 "webapps-ttrss": "webapps-ttrss_13"
8179 },
8180 "locked": {
8181 "lastModified": 1,
8182 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
8183 "path": "./mypackages",
8184 "type": "path"
8185 },
8186 "original": {
8187 "path": "./mypackages",
8188 "type": "path"
8189 }
8190 },
8191 "s-myuids": {
8192 "locked": {
8193 "lastModified": 1,
8194 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
8195 "path": "./myuids",
8196 "type": "path"
8197 },
8198 "original": {
8199 "path": "./myuids",
8200 "type": "path"
8201 }
8202 },
8203 "s-naemon": {
8204 "locked": {
8205 "lastModified": 1,
8206 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
8207 "path": "./naemon",
8208 "type": "path"
8209 },
8210 "original": {
8211 "path": "./naemon",
8212 "type": "path"
8213 }
8214 },
8215 "s-openarc": {
8216 "inputs": {
8217 "flake-utils": "flake-utils_48",
8218 "myuids": "myuids_33",
8219 "nixpkgs": "nixpkgs_87",
8220 "openarc": "openarc_11"
8221 },
8222 "locked": {
8223 "lastModified": 1,
8224 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
8225 "path": "./openarc",
8226 "type": "path"
8227 },
8228 "original": {
8229 "path": "./openarc",
8230 "type": "path"
8231 }
8232 },
8233 "s-opendmarc": {
8234 "inputs": {
8235 "flake-utils": "flake-utils_49",
8236 "myuids": "myuids_34",
8237 "nixpkgs": "nixpkgs_88"
8238 },
8239 "locked": {
8240 "lastModified": 1,
8241 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
8242 "path": "./opendmarc",
8243 "type": "path"
8244 },
8245 "original": {
8246 "path": "./opendmarc",
8247 "type": "path"
8248 }
8249 },
8250 "s-paste": {
8251 "inputs": {
8252 "flake-utils": "flake-utils_50",
8253 "nixpkgs": "nixpkgs_89"
8254 },
8255 "locked": {
8256 "lastModified": 1,
8257 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
8258 "path": "./paste",
8259 "type": "path"
8260 },
8261 "original": {
8262 "path": "./paste",
8263 "type": "path"
8264 }
8265 },
8266 "s-peertube": {
8267 "inputs": {
8268 "flake-utils": "flake-utils_51",
8269 "myuids": "myuids_35",
8270 "nixpkgs": "nixpkgs_90",
8271 "peertube": "peertube_4"
8272 },
8273 "locked": {
8274 "lastModified": 1,
8275 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
8276 "path": "./peertube",
8277 "type": "path"
8278 },
8279 "original": {
8280 "path": "./peertube",
8281 "type": "path"
8282 }
8283 },
8284 "s-private-buildbot": {
8285 "inputs": {
8286 "buildslist": "buildslist_2",
8287 "flake-utils": "flake-utils_52",
8288 "nixpkgs": "nixpkgs_91"
8289 },
8290 "locked": {
8291 "lastModified": 1,
8292 "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
8293 "path": "./private/buildbot",
8294 "type": "path"
8295 },
8296 "original": {
8297 "path": "./private/buildbot",
8298 "type": "path"
8299 }
8300 },
8301 "s-private-chatons": {
8302 "inputs": {
8303 "environment": "environment_27"
8304 },
8305 "locked": {
8306 "lastModified": 1,
8307 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
8308 "path": "./private/chatons",
8309 "type": "path"
8310 },
8311 "original": {
8312 "path": "./private/chatons",
8313 "type": "path"
8314 }
8315 },
8316 "s-private-environment": {
8317 "locked": {
8318 "lastModified": 1,
8319 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
8320 "path": "./private/environment",
8321 "type": "path"
8322 },
8323 "original": {
8324 "path": "./private/environment",
8325 "type": "path"
8326 }
8327 },
8328 "s-private-mail-relay": {
8329 "inputs": {
8330 "environment": "environment_28",
8331 "secrets": "secrets_20"
8332 },
8333 "locked": {
8334 "lastModified": 1,
8335 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
8336 "path": "./private/mail-relay",
8337 "type": "path"
8338 },
8339 "original": {
8340 "path": "./private/mail-relay",
8341 "type": "path"
8342 }
8343 },
8344 "s-private-milters": {
8345 "inputs": {
8346 "environment": "environment_29",
8347 "files-watcher": "files-watcher_13",
8348 "openarc": "openarc_12",
8349 "opendmarc": "opendmarc_6",
8350 "secrets": "secrets_21"
8351 },
8352 "locked": {
8353 "lastModified": 1,
8354 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
8355 "path": "./private/milters",
8356 "type": "path"
8357 },
8358 "original": {
8359 "path": "./private/milters",
8360 "type": "path"
8361 }
8362 },
8363 "s-private-monitoring": {
8364 "inputs": {
8365 "environment": "environment_30",
8366 "naemon": "naemon_6",
8367 "nixpkgs-lib": "nixpkgs-lib_26",
8368 "secrets": "secrets_22"
8369 },
8370 "locked": {
8371 "lastModified": 1,
8372 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
8373 "path": "./private/monitoring",
8374 "type": "path"
8375 },
8376 "original": {
8377 "path": "./private/monitoring",
8378 "type": "path"
8379 }
8380 },
8381 "s-private-openarc": {
8382 "inputs": {
8383 "files-watcher": "files-watcher_14",
8384 "openarc": "openarc_14",
8385 "secrets": "secrets_23"
8386 },
8387 "locked": {
8388 "lastModified": 1,
8389 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
8390 "path": "./private/openarc",
8391 "type": "path"
8392 },
8393 "original": {
8394 "path": "./private/openarc",
8395 "type": "path"
8396 }
8397 },
8398 "s-private-opendmarc": {
8399 "inputs": {
8400 "environment": "environment_31",
8401 "files-watcher": "files-watcher_15",
8402 "opendmarc": "opendmarc_7",
8403 "secrets": "secrets_24"
8404 },
8405 "locked": {
8406 "lastModified": 1,
8407 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
8408 "path": "./private/opendmarc",
8409 "type": "path"
8410 },
8411 "original": {
8412 "path": "./private/opendmarc",
8413 "type": "path"
8414 }
8415 },
8416 "s-private-openldap": {
8417 "locked": {
8418 "lastModified": 1,
8419 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
8420 "path": "./private/openldap",
8421 "type": "path"
8422 },
8423 "original": {
8424 "path": "./private/openldap",
8425 "type": "path"
8426 }
8427 },
8428 "s-private-paste": {
8429 "inputs": {
8430 "paste": "paste_2"
8431 },
8432 "locked": {
8433 "lastModified": 1,
8434 "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
8435 "path": "./private/paste",
8436 "type": "path"
8437 },
8438 "original": {
8439 "path": "./private/paste",
8440 "type": "path"
8441 }
8442 },
8443 "s-private-peertube": {
8444 "inputs": {
8445 "peertube_open_instance": "peertube_open_instance_2",
8446 "peertube_origin": "peertube_origin_2"
8447 },
8448 "locked": {
8449 "lastModified": 1,
8450 "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
8451 "path": "./private/peertube",
8452 "type": "path"
8453 },
8454 "original": {
8455 "path": "./private/peertube",
8456 "type": "path"
8457 }
8458 },
8459 "s-private-php": {
8460 "inputs": {
8461 "flake-utils": "flake-utils_60",
8462 "nixpkgs": "nixpkgs_99",
8463 "nixpkgs-4": "nixpkgs-4_4"
8464 },
8465 "locked": {
8466 "lastModified": 1,
8467 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
8468 "path": "./private/php",
8469 "type": "path"
8470 },
8471 "original": {
8472 "path": "./private/php",
8473 "type": "path"
8474 }
8475 },
8476 "s-private-ssh": {
8477 "inputs": {
8478 "environment": "environment_32",
8479 "secrets": "secrets_25"
8480 },
8481 "locked": {
8482 "lastModified": 1,
8483 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
8484 "path": "./private/ssh",
8485 "type": "path"
8486 },
8487 "original": {
8488 "path": "./private/ssh",
8489 "type": "path"
8490 }
8491 },
8492 "s-private-system": {
8493 "inputs": {
8494 "backports": "backports_7",
8495 "environment": "environment_33",
8496 "mypackages": "mypackages_12",
8497 "myuids": "myuids_42",
8498 "secrets-public": "secrets-public_7"
8499 },
8500 "locked": {
8501 "lastModified": 1,
8502 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
8503 "path": "./private/system",
8504 "type": "path"
8505 },
8506 "original": {
8507 "path": "./private/system",
8508 "type": "path"
8509 }
8510 },
8511 "s-rsync_backup": {
8512 "locked": {
8513 "lastModified": 1,
8514 "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
8515 "path": "./rsync_backup",
8516 "type": "path"
8517 },
8518 "original": {
8519 "path": "./rsync_backup",
8520 "type": "path"
8521 }
8522 },
8523 "s-secrets": {
8524 "locked": {
8525 "lastModified": 1,
8526 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8527 "path": "./secrets",
8528 "type": "path"
8529 },
8530 "original": {
8531 "path": "./secrets",
8532 "type": "path"
8533 }
8534 },
8535 "s-surfer": {
8536 "inputs": {
8537 "flake-utils": "flake-utils_62",
8538 "mypackages": "mypackages_13",
8539 "nixpkgs": "nixpkgs_103",
8540 "surfer": "surfer_2"
8541 },
8542 "locked": {
8543 "lastModified": 1,
8544 "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
8545 "path": "./surfer",
8546 "type": "path"
8547 },
8548 "original": {
8549 "path": "./surfer",
8550 "type": "path"
8551 }
8552 },
8553 "s-taskwarrior-web": {
8554 "inputs": {
8555 "flake-utils": "flake-utils_63",
8556 "nixpkgs": "nixpkgs_104",
8557 "taskwarrior-web": "taskwarrior-web_2"
8558 },
8559 "locked": {
8560 "lastModified": 1,
8561 "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
8562 "path": "./taskwarrior-web",
8563 "type": "path"
8564 },
8565 "original": {
8566 "path": "./taskwarrior-web",
8567 "type": "path"
8568 }
8569 },
8570 "secrets": {
8571 "locked": {
8572 "lastModified": 1,
8573 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8574 "path": "../../secrets",
8575 "type": "path"
8576 },
8577 "original": {
8578 "path": "../../secrets",
8579 "type": "path"
8580 }
8581 },
8582 "secrets-public": {
8583 "locked": {
8584 "lastModified": 1,
8585 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8586 "path": "../../secrets",
8587 "type": "path"
8588 },
8589 "original": {
8590 "path": "../../secrets",
8591 "type": "path"
8592 }
8593 },
8594 "secrets-public_2": {
8595 "locked": {
8596 "lastModified": 1,
8597 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8598 "path": "../../secrets",
8599 "type": "path"
8600 },
8601 "original": {
8602 "path": "../../secrets",
8603 "type": "path"
8604 }
8605 },
8606 "secrets-public_3": {
8607 "locked": {
8608 "lastModified": 1,
8609 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8610 "path": "../../secrets",
8611 "type": "path"
8612 },
8613 "original": {
8614 "path": "../../secrets",
8615 "type": "path"
8616 }
8617 },
8618 "secrets-public_4": {
8619 "locked": {
8620 "lastModified": 1,
8621 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8622 "path": "../../secrets",
8623 "type": "path"
8624 },
8625 "original": {
8626 "path": "../../secrets",
8627 "type": "path"
8628 }
8629 },
8630 "secrets-public_5": {
8631 "locked": {
8632 "lastModified": 1,
8633 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8634 "path": "../../secrets",
8635 "type": "path"
8636 },
8637 "original": {
8638 "path": "../../secrets",
8639 "type": "path"
8640 }
8641 },
8642 "secrets-public_6": {
8643 "locked": {
8644 "lastModified": 1,
8645 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8646 "path": "../../secrets",
8647 "type": "path"
8648 },
8649 "original": {
8650 "path": "../../secrets",
8651 "type": "path"
8652 }
8653 },
8654 "secrets-public_7": {
8655 "locked": {
8656 "lastModified": 1,
8657 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8658 "path": "../../secrets",
8659 "type": "path"
8660 },
8661 "original": {
8662 "path": "../../secrets",
8663 "type": "path"
8664 }
8665 },
8666 "secrets_10": {
8667 "locked": {
8668 "lastModified": 1,
8669 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8670 "path": "../../secrets",
8671 "type": "path"
8672 },
8673 "original": {
8674 "path": "../../secrets",
8675 "type": "path"
8676 }
8677 },
8678 "secrets_11": {
8679 "locked": {
8680 "lastModified": 1,
8681 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8682 "path": "../../secrets",
8683 "type": "path"
8684 },
8685 "original": {
8686 "path": "../../secrets",
8687 "type": "path"
8688 }
8689 },
8690 "secrets_12": {
8691 "locked": {
8692 "lastModified": 1,
8693 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8694 "path": "../../secrets",
8695 "type": "path"
8696 },
8697 "original": {
8698 "path": "../../secrets",
8699 "type": "path"
8700 }
8701 },
8702 "secrets_13": {
8703 "locked": {
8704 "lastModified": 1,
8705 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8706 "path": "../../secrets",
8707 "type": "path"
8708 },
8709 "original": {
8710 "path": "../../secrets",
8711 "type": "path"
8712 }
8713 },
8714 "secrets_14": {
8715 "locked": {
8716 "lastModified": 1,
8717 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8718 "path": "../../secrets",
8719 "type": "path"
8720 },
8721 "original": {
8722 "path": "../../secrets",
8723 "type": "path"
8724 }
8725 },
8726 "secrets_15": {
8727 "locked": {
8728 "lastModified": 1,
8729 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8730 "path": "../../secrets",
8731 "type": "path"
8732 },
8733 "original": {
8734 "path": "../../secrets",
8735 "type": "path"
8736 }
8737 },
8738 "secrets_16": {
8739 "locked": {
8740 "lastModified": 1,
8741 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8742 "path": "../../secrets",
8743 "type": "path"
8744 },
8745 "original": {
8746 "path": "../../secrets",
8747 "type": "path"
8748 }
8749 },
8750 "secrets_17": {
8751 "locked": {
8752 "lastModified": 1,
8753 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8754 "path": "../../flakes/secrets",
8755 "type": "path"
8756 },
8757 "original": {
8758 "path": "../../flakes/secrets",
8759 "type": "path"
8760 }
8761 },
8762 "secrets_18": {
8763 "locked": {
8764 "lastModified": 1,
8765 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8766 "path": "../../secrets",
8767 "type": "path"
8768 },
8769 "original": {
8770 "path": "../../secrets",
8771 "type": "path"
8772 }
8773 },
8774 "secrets_19": {
8775 "locked": {
8776 "lastModified": 1,
8777 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8778 "path": "../../flakes/secrets",
8779 "type": "path"
8780 },
8781 "original": {
8782 "path": "../../flakes/secrets",
8783 "type": "path"
8784 }
8785 },
8786 "secrets_2": {
8787 "locked": {
8788 "lastModified": 1,
8789 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8790 "path": "../../secrets",
8791 "type": "path"
8792 },
8793 "original": {
8794 "path": "../../secrets",
8795 "type": "path"
8796 }
8797 },
8798 "secrets_20": {
8799 "locked": {
8800 "lastModified": 1,
8801 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8802 "path": "../../secrets",
8803 "type": "path"
8804 },
8805 "original": {
8806 "path": "../../secrets",
8807 "type": "path"
8808 }
8809 },
8810 "secrets_21": {
8811 "locked": {
8812 "lastModified": 1,
8813 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8814 "path": "../../secrets",
8815 "type": "path"
8816 },
8817 "original": {
8818 "path": "../../secrets",
8819 "type": "path"
8820 }
8821 },
8822 "secrets_22": {
8823 "locked": {
8824 "lastModified": 1,
8825 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8826 "path": "../../secrets",
8827 "type": "path"
8828 },
8829 "original": {
8830 "path": "../../secrets",
8831 "type": "path"
8832 }
8833 },
8834 "secrets_23": {
8835 "locked": {
8836 "lastModified": 1,
8837 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8838 "path": "../../secrets",
8839 "type": "path"
8840 },
8841 "original": {
8842 "path": "../../secrets",
8843 "type": "path"
8844 }
8845 },
8846 "secrets_24": {
8847 "locked": {
8848 "lastModified": 1,
8849 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8850 "path": "../../secrets",
8851 "type": "path"
8852 },
8853 "original": {
8854 "path": "../../secrets",
8855 "type": "path"
8856 }
8857 },
8858 "secrets_25": {
8859 "locked": {
8860 "lastModified": 1,
8861 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8862 "path": "../../secrets",
8863 "type": "path"
8864 },
8865 "original": {
8866 "path": "../../secrets",
8867 "type": "path"
8868 }
8869 },
8870 "secrets_26": {
8871 "locked": {
8872 "lastModified": 1,
8873 "narHash": "sha256-yvhc2jxW1AQVmtrKPoYPr5DgpXKt/ua+ATuxvE3iY6c=",
8874 "path": "./private/environment-dummy",
8875 "type": "path"
8876 },
8877 "original": {
8878 "path": "./private/environment-dummy",
8879 "type": "path"
8880 }
8881 },
8882 "secrets_3": {
8883 "locked": {
8884 "lastModified": 1,
8885 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8886 "path": "../../secrets",
8887 "type": "path"
8888 },
8889 "original": {
8890 "path": "../../secrets",
8891 "type": "path"
8892 }
8893 },
8894 "secrets_4": {
8895 "locked": {
8896 "lastModified": 1,
8897 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8898 "path": "../../secrets",
8899 "type": "path"
8900 },
8901 "original": {
8902 "path": "../../secrets",
8903 "type": "path"
8904 }
8905 },
8906 "secrets_5": {
8907 "locked": {
8908 "lastModified": 1,
8909 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8910 "path": "../../secrets",
8911 "type": "path"
8912 },
8913 "original": {
8914 "path": "../../secrets",
8915 "type": "path"
8916 }
8917 },
8918 "secrets_6": {
8919 "locked": {
8920 "lastModified": 1,
8921 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8922 "path": "../../flakes/secrets",
8923 "type": "path"
8924 },
8925 "original": {
8926 "path": "../../flakes/secrets",
8927 "type": "path"
8928 }
8929 },
8930 "secrets_7": {
8931 "locked": {
8932 "lastModified": 1,
8933 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8934 "path": "../../secrets",
8935 "type": "path"
8936 },
8937 "original": {
8938 "path": "../../secrets",
8939 "type": "path"
8940 }
8941 },
8942 "secrets_8": {
8943 "locked": {
8944 "lastModified": 1,
8945 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8946 "path": "../../flakes/secrets",
8947 "type": "path"
8948 },
8949 "original": {
8950 "path": "../../flakes/secrets",
8951 "type": "path"
8952 }
8953 },
8954 "secrets_9": {
8955 "locked": {
8956 "lastModified": 1,
8957 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
8958 "path": "../../secrets",
8959 "type": "path"
8960 },
8961 "original": {
8962 "path": "../../secrets",
8963 "type": "path"
8964 }
8965 },
8966 "ssh": {
8967 "inputs": {
8968 "environment": "environment_10",
8969 "secrets": "secrets_9"
8970 },
8971 "locked": {
8972 "lastModified": 1,
8973 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
8974 "path": "../../flakes/private/ssh",
8975 "type": "path"
8976 },
8977 "original": {
8978 "path": "../../flakes/private/ssh",
8979 "type": "path"
8980 }
8981 },
8982 "stable": {
8983 "locked": {
8984 "lastModified": 1669735802,
8985 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
8986 "owner": "NixOS",
8987 "repo": "nixpkgs",
8988 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
8989 "type": "github"
8990 },
8991 "original": {
8992 "owner": "NixOS",
8993 "ref": "nixos-22.11",
8994 "repo": "nixpkgs",
8995 "type": "github"
8996 }
8997 },
8998 "stable_2": {
8999 "locked": {
9000 "lastModified": 1669735802,
9001 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9002 "owner": "NixOS",
9003 "repo": "nixpkgs",
9004 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9005 "type": "github"
9006 },
9007 "original": {
9008 "owner": "NixOS",
9009 "ref": "nixos-22.11",
9010 "repo": "nixpkgs",
9011 "type": "github"
9012 }
9013 },
9014 "stable_3": {
9015 "locked": {
9016 "lastModified": 1669735802,
9017 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9018 "owner": "NixOS",
9019 "repo": "nixpkgs",
9020 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9021 "type": "github"
9022 },
9023 "original": {
9024 "owner": "NixOS",
9025 "ref": "nixos-22.11",
9026 "repo": "nixpkgs",
9027 "type": "github"
9028 }
9029 },
9030 "stable_4": {
9031 "locked": {
9032 "lastModified": 1669735802,
9033 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9034 "owner": "NixOS",
9035 "repo": "nixpkgs",
9036 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9037 "type": "github"
9038 },
9039 "original": {
9040 "owner": "NixOS",
9041 "ref": "nixos-22.11",
9042 "repo": "nixpkgs",
9043 "type": "github"
9044 }
9045 },
9046 "stable_5": {
9047 "locked": {
9048 "lastModified": 1669735802,
9049 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9050 "owner": "NixOS",
9051 "repo": "nixpkgs",
9052 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9053 "type": "github"
9054 },
9055 "original": {
9056 "owner": "NixOS",
9057 "ref": "nixos-22.11",
9058 "repo": "nixpkgs",
9059 "type": "github"
9060 }
9061 },
9062 "stable_6": {
9063 "locked": {
9064 "lastModified": 1669735802,
9065 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9066 "owner": "NixOS",
9067 "repo": "nixpkgs",
9068 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9069 "type": "github"
9070 },
9071 "original": {
9072 "owner": "NixOS",
9073 "ref": "nixos-22.11",
9074 "repo": "nixpkgs",
9075 "type": "github"
9076 }
9077 },
9078 "stable_7": {
9079 "locked": {
9080 "lastModified": 1669735802,
9081 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
9082 "owner": "NixOS",
9083 "repo": "nixpkgs",
9084 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
9085 "type": "github"
9086 },
9087 "original": {
9088 "owner": "NixOS",
9089 "ref": "nixos-22.11",
9090 "repo": "nixpkgs",
9091 "type": "github"
9092 }
9093 },
9094 "surfer": {
9095 "flake": false,
9096 "locked": {
9097 "lastModified": 1588637864,
9098 "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
9099 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9100 "revCount": 318,
9101 "type": "git",
9102 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9103 },
9104 "original": {
9105 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9106 "type": "git",
9107 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9108 }
9109 },
9110 "surfer_2": {
9111 "flake": false,
9112 "locked": {
9113 "lastModified": 1588637864,
9114 "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
9115 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9116 "revCount": 318,
9117 "type": "git",
9118 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9119 },
9120 "original": {
9121 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
9122 "type": "git",
9123 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
9124 }
9125 },
9126 "system": {
9127 "inputs": {
9128 "backports": "backports",
9129 "environment": "environment_7",
9130 "mypackages": "mypackages",
9131 "myuids": "myuids_6",
9132 "secrets-public": "secrets-public"
9133 },
9134 "locked": {
9135 "lastModified": 1,
9136 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9137 "path": "../../flakes/private/system",
9138 "type": "path"
9139 },
9140 "original": {
9141 "path": "../../flakes/private/system",
9142 "type": "path"
9143 }
9144 },
9145 "system_2": {
9146 "inputs": {
9147 "backports": "backports_2",
9148 "environment": "environment_11",
9149 "mypackages": "mypackages_2",
9150 "myuids": "myuids_8",
9151 "secrets-public": "secrets-public_2"
9152 },
9153 "locked": {
9154 "lastModified": 1,
9155 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9156 "path": "../../flakes/private/system",
9157 "type": "path"
9158 },
9159 "original": {
9160 "path": "../../flakes/private/system",
9161 "type": "path"
9162 }
9163 },
9164 "system_3": {
9165 "inputs": {
9166 "backports": "backports_4",
9167 "environment": "environment_22",
9168 "mypackages": "mypackages_7",
9169 "myuids": "myuids_24",
9170 "secrets-public": "secrets-public_4"
9171 },
9172 "locked": {
9173 "lastModified": 1,
9174 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9175 "path": "../../flakes/private/system",
9176 "type": "path"
9177 },
9178 "original": {
9179 "path": "../../flakes/private/system",
9180 "type": "path"
9181 }
9182 },
9183 "system_4": {
9184 "inputs": {
9185 "backports": "backports_5",
9186 "environment": "environment_25",
9187 "mypackages": "mypackages_8",
9188 "myuids": "myuids_27",
9189 "secrets-public": "secrets-public_5"
9190 },
9191 "locked": {
9192 "lastModified": 1,
9193 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
9194 "path": "../../flakes/private/system",
9195 "type": "path"
9196 },
9197 "original": {
9198 "path": "../../flakes/private/system",
9199 "type": "path"
9200 }
9201 },
9202 "taskwarrior-web": {
9203 "flake": false,
9204 "locked": {
9205 "lastModified": 1546434241,
9206 "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
9207 "owner": "theunraveler",
9208 "repo": "taskwarrior-web",
9209 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9210 "type": "github"
9211 },
9212 "original": {
9213 "owner": "theunraveler",
9214 "repo": "taskwarrior-web",
9215 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9216 "type": "github"
9217 }
9218 },
9219 "taskwarrior-web_2": {
9220 "flake": false,
9221 "locked": {
9222 "lastModified": 1546434241,
9223 "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
9224 "owner": "theunraveler",
9225 "repo": "taskwarrior-web",
9226 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9227 "type": "github"
9228 },
9229 "original": {
9230 "owner": "theunraveler",
9231 "repo": "taskwarrior-web",
9232 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
9233 "type": "github"
9234 }
9235 },
9236 "treefmt-nix": {
9237 "inputs": {
9238 "nixpkgs": [
9239 "n-backup-2",
9240 "my-lib",
9241 "nixos-anywhere",
9242 "nixpkgs"
9243 ]
9244 },
9245 "locked": {
9246 "lastModified": 1687940979,
9247 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9248 "owner": "numtide",
9249 "repo": "treefmt-nix",
9250 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9251 "type": "github"
9252 },
9253 "original": {
9254 "owner": "numtide",
9255 "repo": "treefmt-nix",
9256 "type": "github"
9257 }
9258 },
9259 "treefmt-nix_2": {
9260 "inputs": {
9261 "nixpkgs": [
9262 "n-dilion",
9263 "my-lib",
9264 "nixos-anywhere",
9265 "nixpkgs"
9266 ]
9267 },
9268 "locked": {
9269 "lastModified": 1687940979,
9270 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9271 "owner": "numtide",
9272 "repo": "treefmt-nix",
9273 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9274 "type": "github"
9275 },
9276 "original": {
9277 "owner": "numtide",
9278 "repo": "treefmt-nix",
9279 "type": "github"
9280 }
9281 },
9282 "treefmt-nix_3": {
9283 "inputs": {
9284 "nixpkgs": [
9285 "n-eldiron",
9286 "my-lib",
9287 "nixos-anywhere",
9288 "nixpkgs"
9289 ]
9290 },
9291 "locked": {
9292 "lastModified": 1687940979,
9293 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9294 "owner": "numtide",
9295 "repo": "treefmt-nix",
9296 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9297 "type": "github"
9298 },
9299 "original": {
9300 "owner": "numtide",
9301 "repo": "treefmt-nix",
9302 "type": "github"
9303 }
9304 },
9305 "treefmt-nix_4": {
9306 "inputs": {
9307 "nixpkgs": [
9308 "n-monitoring-1",
9309 "my-lib",
9310 "nixos-anywhere",
9311 "nixpkgs"
9312 ]
9313 },
9314 "locked": {
9315 "lastModified": 1687940979,
9316 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9317 "owner": "numtide",
9318 "repo": "treefmt-nix",
9319 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9320 "type": "github"
9321 },
9322 "original": {
9323 "owner": "numtide",
9324 "repo": "treefmt-nix",
9325 "type": "github"
9326 }
9327 },
9328 "treefmt-nix_5": {
9329 "inputs": {
9330 "nixpkgs": [
9331 "n-quatresaisons",
9332 "my-lib",
9333 "nixos-anywhere",
9334 "nixpkgs"
9335 ]
9336 },
9337 "locked": {
9338 "lastModified": 1687940979,
9339 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9340 "owner": "numtide",
9341 "repo": "treefmt-nix",
9342 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9343 "type": "github"
9344 },
9345 "original": {
9346 "owner": "numtide",
9347 "repo": "treefmt-nix",
9348 "type": "github"
9349 }
9350 },
9351 "treefmt-nix_6": {
9352 "inputs": {
9353 "nixpkgs": [
9354 "n-zoldene",
9355 "my-lib",
9356 "nixos-anywhere",
9357 "nixpkgs"
9358 ]
9359 },
9360 "locked": {
9361 "lastModified": 1687940979,
9362 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9363 "owner": "numtide",
9364 "repo": "treefmt-nix",
9365 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9366 "type": "github"
9367 },
9368 "original": {
9369 "owner": "numtide",
9370 "repo": "treefmt-nix",
9371 "type": "github"
9372 }
9373 },
9374 "treefmt-nix_7": {
9375 "inputs": {
9376 "nixpkgs": [
9377 "s-lib",
9378 "nixos-anywhere",
9379 "nixpkgs"
9380 ]
9381 },
9382 "locked": {
9383 "lastModified": 1687940979,
9384 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
9385 "owner": "numtide",
9386 "repo": "treefmt-nix",
9387 "rev": "0a4f06c27610a99080b69433873885df82003aae",
9388 "type": "github"
9389 },
9390 "original": {
9391 "owner": "numtide",
9392 "repo": "treefmt-nix",
9393 "type": "github"
9394 }
9395 },
9396 "webapps-ttrss": {
9397 "flake": false,
9398 "locked": {
9399 "lastModified": 1546759381,
9400 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9401 "ref": "master",
9402 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9403 "revCount": 9256,
9404 "type": "git",
9405 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9406 },
9407 "original": {
9408 "ref": "master",
9409 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9410 "type": "git",
9411 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9412 }
9413 },
9414 "webapps-ttrss_10": {
9415 "flake": false,
9416 "locked": {
9417 "lastModified": 1546759381,
9418 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9419 "ref": "master",
9420 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9421 "revCount": 9256,
9422 "type": "git",
9423 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9424 },
9425 "original": {
9426 "ref": "master",
9427 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9428 "type": "git",
9429 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9430 }
9431 },
9432 "webapps-ttrss_11": {
9433 "flake": false,
9434 "locked": {
9435 "lastModified": 1546759381,
9436 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9437 "ref": "master",
9438 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9439 "revCount": 9256,
9440 "type": "git",
9441 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9442 },
9443 "original": {
9444 "ref": "master",
9445 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9446 "type": "git",
9447 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9448 }
9449 },
9450 "webapps-ttrss_12": {
9451 "flake": false,
9452 "locked": {
9453 "lastModified": 1546759381,
9454 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9455 "ref": "master",
9456 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9457 "revCount": 9256,
9458 "type": "git",
9459 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9460 },
9461 "original": {
9462 "ref": "master",
9463 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9464 "type": "git",
9465 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9466 }
9467 },
9468 "webapps-ttrss_13": {
9469 "flake": false,
9470 "locked": {
9471 "lastModified": 1546759381,
9472 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9473 "ref": "master",
9474 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9475 "revCount": 9256,
9476 "type": "git",
9477 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9478 },
9479 "original": {
9480 "ref": "master",
9481 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9482 "type": "git",
9483 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9484 }
9485 },
9486 "webapps-ttrss_14": {
9487 "flake": false,
9488 "locked": {
9489 "lastModified": 1546759381,
9490 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9491 "ref": "master",
9492 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9493 "revCount": 9256,
9494 "type": "git",
9495 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9496 },
9497 "original": {
9498 "ref": "master",
9499 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9500 "type": "git",
9501 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9502 }
9503 },
9504 "webapps-ttrss_15": {
9505 "flake": false,
9506 "locked": {
9507 "lastModified": 1546759381,
9508 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9509 "ref": "master",
9510 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9511 "revCount": 9256,
9512 "type": "git",
9513 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9514 },
9515 "original": {
9516 "ref": "master",
9517 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9518 "type": "git",
9519 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9520 }
9521 },
9522 "webapps-ttrss_2": {
9523 "flake": false,
9524 "locked": {
9525 "lastModified": 1546759381,
9526 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9527 "ref": "master",
9528 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9529 "revCount": 9256,
9530 "type": "git",
9531 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9532 },
9533 "original": {
9534 "ref": "master",
9535 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9536 "type": "git",
9537 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9538 }
9539 },
9540 "webapps-ttrss_3": {
9541 "flake": false,
9542 "locked": {
9543 "lastModified": 1546759381,
9544 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9545 "ref": "master",
9546 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9547 "revCount": 9256,
9548 "type": "git",
9549 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9550 },
9551 "original": {
9552 "ref": "master",
9553 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9554 "type": "git",
9555 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9556 }
9557 },
9558 "webapps-ttrss_4": {
9559 "flake": false,
9560 "locked": {
9561 "lastModified": 1546759381,
9562 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9563 "ref": "master",
9564 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9565 "revCount": 9256,
9566 "type": "git",
9567 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9568 },
9569 "original": {
9570 "ref": "master",
9571 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9572 "type": "git",
9573 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9574 }
9575 },
9576 "webapps-ttrss_5": {
9577 "flake": false,
9578 "locked": {
9579 "lastModified": 1546759381,
9580 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9581 "ref": "master",
9582 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9583 "revCount": 9256,
9584 "type": "git",
9585 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9586 },
9587 "original": {
9588 "ref": "master",
9589 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9590 "type": "git",
9591 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9592 }
9593 },
9594 "webapps-ttrss_6": {
9595 "flake": false,
9596 "locked": {
9597 "lastModified": 1546759381,
9598 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9599 "ref": "master",
9600 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9601 "revCount": 9256,
9602 "type": "git",
9603 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9604 },
9605 "original": {
9606 "ref": "master",
9607 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9608 "type": "git",
9609 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9610 }
9611 },
9612 "webapps-ttrss_7": {
9613 "flake": false,
9614 "locked": {
9615 "lastModified": 1546759381,
9616 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9617 "ref": "master",
9618 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9619 "revCount": 9256,
9620 "type": "git",
9621 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9622 },
9623 "original": {
9624 "ref": "master",
9625 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9626 "type": "git",
9627 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9628 }
9629 },
9630 "webapps-ttrss_8": {
9631 "flake": false,
9632 "locked": {
9633 "lastModified": 1546759381,
9634 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9635 "ref": "master",
9636 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9637 "revCount": 9256,
9638 "type": "git",
9639 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9640 },
9641 "original": {
9642 "ref": "master",
9643 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9644 "type": "git",
9645 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9646 }
9647 },
9648 "webapps-ttrss_9": {
9649 "flake": false,
9650 "locked": {
9651 "lastModified": 1546759381,
9652 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
9653 "ref": "master",
9654 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9655 "revCount": 9256,
9656 "type": "git",
9657 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9658 },
9659 "original": {
9660 "ref": "master",
9661 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
9662 "type": "git",
9663 "url": "https://git.tt-rss.org/fox/tt-rss.git"
9664 }
9665 }
9666 },
9667 "root": "root",
9668 "version": 7
9669}
diff --git a/flakes/flake.nix b/flakes/flake.nix
new file mode 100644
index 0000000..aecff57
--- /dev/null
+++ b/flakes/flake.nix
@@ -0,0 +1,67 @@
1{
2 description = "immae-eu infrastructure";
3 inputs = {
4 s-backports.url = "path:./backports";
5 s-copanier.url = "path:./copanier";
6 s-diaspora.url = "path:./diaspora";
7 s-etherpad-lite.url = "path:./etherpad-lite";
8 s-fiche.url = "path:./fiche";
9 s-files-watcher.url = "path:./files-watcher";
10 s-grocy.url = "path:./grocy";
11 s-lib.url = "path:./lib";
12 s-loginctl-linger.url = "path:./loginctl-linger";
13 s-mastodon.url = "path:./mastodon";
14 s-mediagoblin.url = "path:./mediagoblin";
15 s-multi-apache-container.url = "path:./multi-apache-container";
16 s-mypackages.url = "path:./mypackages";
17 s-myuids.url = "path:./myuids";
18 s-naemon.url = "path:./naemon";
19 s-openarc.url = "path:./openarc";
20 s-opendmarc.url = "path:./opendmarc";
21 s-paste.url = "path:./paste";
22 s-peertube.url = "path:./peertube";
23 s-rsync_backup.url = "path:./rsync_backup";
24 s-secrets.url = "path:./secrets";
25 s-surfer.url = "path:./surfer";
26 s-taskwarrior-web.url = "path:./taskwarrior-web";
27
28 s-private-buildbot.url = "path:./private/buildbot";
29 s-private-chatons.url = "path:./private/chatons";
30 s-private-environment.url = "path:./private/environment";
31 s-private-mail-relay.url = "path:./private/mail-relay";
32 s-private-milters.url = "path:./private/milters";
33 s-private-monitoring.url = "path:./private/monitoring";
34 s-private-openarc.url = "path:./private/openarc";
35 s-private-opendmarc.url = "path:./private/opendmarc";
36 s-private-openldap.url = "path:./private/openldap";
37 s-private-paste.url = "path:./private/paste";
38 s-private-peertube.url = "path:./private/peertube";
39 s-private-php.url = "path:./private/php";
40 s-private-ssh.url = "path:./private/ssh";
41 s-private-system.url = "path:./private/system";
42
43 n-backup-2.url = "path:../systems/backup-2";
44 n-dilion.url = "path:../systems/dilion";
45 n-eldiron.url = "path:../systems/eldiron";
46 n-monitoring-1.url = "path:../systems/monitoring-1";
47 n-quatresaisons.url = "path:../systems/quatresaisons";
48 n-zoldene.url = "path:../systems/zoldene";
49
50 secrets.url = "path:./private/environment-dummy";
51 };
52 outputs = inputs@{ self, secrets, ... }: {
53 subflakes = let
54 flakeNames = builtins.map (a: builtins.substring 2 (builtins.stringLength a) a) (builtins.filter (a: builtins.substring 0 2 a == "s-") (builtins.attrNames inputs));
55 partitionned = builtins.partition (a: builtins.substring 0 8 a == "private-") flakeNames;
56 privateFlakes = builtins.map (a: builtins.substring 8 (builtins.stringLength a) a) partitionned.right;
57 publicFlakes = partitionned.wrong;
58
59 nodeFlakes = builtins.map (a: builtins.substring 2 (builtins.stringLength a) a) (builtins.filter (a: builtins.substring 0 2 a == "n-") (builtins.attrNames inputs));
60 in {
61 public = builtins.foldl' (a: b: a // { "${b}" = inputs."s-${b}"; }) {} publicFlakes;
62 private = builtins.foldl' (a: b: a // { "${b}" = inputs."s-private-${b}"; }) {} privateFlakes;
63 nodes = builtins.foldl' (a: b: a // { "${b}" = inputs."n-${b}"; }) {} nodeFlakes;
64 inherit secrets;
65 };
66 };
67}
diff --git a/flakes/grocy/default.nix b/flakes/grocy/default.nix
new file mode 100644
index 0000000..26b6ed8
--- /dev/null
+++ b/flakes/grocy/default.nix
@@ -0,0 +1,47 @@
1{ varDir ? "/var/lib/grocy", stdenv, callPackage, composerEnv, fetchurl, src, runCommand, git, which, jq, yarn2nix-moretea }:
2let
3 version = "2.6.1-1";
4 patchedPackages = stdenv.mkDerivation rec {
5 name = "grocy";
6 inherit src;
7 buildInputs = [ jq ];
8 patches = [ ./yarn.patch ];
9 installPhase = ''
10 mkdir $out
11 cat package.json | jq -r '.version = "${version}"' > $out/package.json
12 cp yarn.lock $out/
13 '';
14 };
15 yarnModules = yarn2nix-moretea.mkYarnModules rec {
16 name = "grocy-yarn";
17 pname = name;
18 version = version;
19 packageJSON = "${patchedPackages}/package.json";
20 yarnLock = "${patchedPackages}/yarn.lock";
21 yarnNix = ./yarn-packages.nix;
22 pkgConfig = {
23 all = {
24 buildInputs = [ git which ];
25 };
26 };
27 };
28 app = composerEnv.buildPackage (
29 import ./php-packages.nix { inherit composerEnv fetchurl; } //
30 {
31 name = "grocy";
32 inherit src;
33 noDev = true;
34 buildInputs = [ yarnModules ];
35 postInstall = ''
36 rm -rf data
37 ln -sf ${varDir}/data data
38 ln -sf ${yarnModules}/node_modules public
39 '';
40 passthru = {
41 inherit varDir yarnModules;
42 webRoot = "${app}/public";
43 };
44 }
45 );
46in
47 app
diff --git a/flakes/grocy/flake.lock b/flakes/grocy/flake.lock
new file mode 100644
index 0000000..13aa4a6
--- /dev/null
+++ b/flakes/grocy/flake.lock
@@ -0,0 +1,150 @@
1{
2 "nodes": {
3 "flake-parts": {
4 "inputs": {
5 "nixpkgs-lib": "nixpkgs-lib"
6 },
7 "locked": {
8 "lastModified": 1675295133,
9 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
10 "owner": "hercules-ci",
11 "repo": "flake-parts",
12 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
13 "type": "github"
14 },
15 "original": {
16 "owner": "hercules-ci",
17 "repo": "flake-parts",
18 "type": "github"
19 }
20 },
21 "flake-utils": {
22 "locked": {
23 "lastModified": 1648297722,
24 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
25 "owner": "numtide",
26 "repo": "flake-utils",
27 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
28 "type": "github"
29 },
30 "original": {
31 "owner": "numtide",
32 "repo": "flake-utils",
33 "type": "github"
34 }
35 },
36 "grocy": {
37 "flake": false,
38 "locked": {
39 "lastModified": 1585166193,
40 "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
41 "owner": "grocy",
42 "repo": "grocy",
43 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
44 "type": "github"
45 },
46 "original": {
47 "owner": "grocy",
48 "repo": "grocy",
49 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
50 "type": "github"
51 }
52 },
53 "mypackages": {
54 "inputs": {
55 "flake-parts": "flake-parts",
56 "nixpkgs": "nixpkgs",
57 "webapps-ttrss": "webapps-ttrss"
58 },
59 "locked": {
60 "lastModified": 1,
61 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
62 "path": "../mypackages",
63 "type": "path"
64 },
65 "original": {
66 "path": "../mypackages",
67 "type": "path"
68 }
69 },
70 "nixpkgs": {
71 "locked": {
72 "lastModified": 1646497237,
73 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
74 "owner": "nixos",
75 "repo": "nixpkgs",
76 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
77 "type": "github"
78 },
79 "original": {
80 "owner": "nixos",
81 "repo": "nixpkgs",
82 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
83 "type": "github"
84 }
85 },
86 "nixpkgs-lib": {
87 "locked": {
88 "dir": "lib",
89 "lastModified": 1675183161,
90 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
91 "owner": "NixOS",
92 "repo": "nixpkgs",
93 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
94 "type": "github"
95 },
96 "original": {
97 "dir": "lib",
98 "owner": "NixOS",
99 "ref": "nixos-unstable",
100 "repo": "nixpkgs",
101 "type": "github"
102 }
103 },
104 "nixpkgs_2": {
105 "flake": false,
106 "locked": {
107 "lastModified": 1596265691,
108 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
109 "owner": "NixOS",
110 "repo": "nixpkgs",
111 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
112 "type": "github"
113 },
114 "original": {
115 "owner": "NixOS",
116 "repo": "nixpkgs",
117 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
118 "type": "github"
119 }
120 },
121 "root": {
122 "inputs": {
123 "flake-utils": "flake-utils",
124 "grocy": "grocy",
125 "mypackages": "mypackages",
126 "nixpkgs": "nixpkgs_2"
127 }
128 },
129 "webapps-ttrss": {
130 "flake": false,
131 "locked": {
132 "lastModified": 1546759381,
133 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
134 "ref": "master",
135 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
136 "revCount": 9256,
137 "type": "git",
138 "url": "https://git.tt-rss.org/fox/tt-rss.git"
139 },
140 "original": {
141 "ref": "master",
142 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
143 "type": "git",
144 "url": "https://git.tt-rss.org/fox/tt-rss.git"
145 }
146 }
147 },
148 "root": "root",
149 "version": 7
150}
diff --git a/flakes/grocy/flake.nix b/flakes/grocy/flake.nix
new file mode 100644
index 0000000..a08852f
--- /dev/null
+++ b/flakes/grocy/flake.nix
@@ -0,0 +1,35 @@
1{
2 description = "ERP beyond your fridge - grocy is a web-based self-hosted groceries & household management solution for your home";
3 inputs.flake-utils.url = "github:numtide/flake-utils";
4 inputs.nixpkgs = {
5 url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
6 flake = false;
7 };
8 inputs.grocy = {
9 url = "github:grocy/grocy/d7738aa1ec330c81f11e4976681df0299d4ed35a";
10 flake = false;
11 };
12 inputs.mypackages.url = "path:../mypackages";
13 outputs = { self, nixpkgs, grocy, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
14 let
15 pkgs = import nixpkgs { inherit system; overlays = []; };
16 composerEnv = mypackages.lib."${system}".composerEnv;
17 version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.grocy.original.ref;
18 inherit (pkgs) callPackage;
19 in rec {
20 packages.grocy = callPackage ./. { inherit composerEnv; src = grocy // { inherit version; }; };
21 defaultPackage = packages.grocy;
22 legacyPackages.grocy = packages.grocy;
23 checks = {
24 build = defaultPackage;
25 };
26 }
27 ) // rec {
28 overlays = {
29 grocy = final: prev: {
30 grocy = self.defaultPackage."${final.system}";
31 };
32 };
33 overlay = overlays.grocy;
34 };
35}
diff --git a/pkgs/webapps/grocy/php-packages.nix b/flakes/grocy/php-packages.nix
index 47491f9..47491f9 100644
--- a/pkgs/webapps/grocy/php-packages.nix
+++ b/flakes/grocy/php-packages.nix
diff --git a/pkgs/webapps/grocy/yarn-packages.nix b/flakes/grocy/yarn-packages.nix
index 073fb5a..073fb5a 100644
--- a/pkgs/webapps/grocy/yarn-packages.nix
+++ b/flakes/grocy/yarn-packages.nix
diff --git a/pkgs/webapps/grocy/yarn.patch b/flakes/grocy/yarn.patch
index e6f318d..e6f318d 100644
--- a/pkgs/webapps/grocy/yarn.patch
+++ b/flakes/grocy/yarn.patch
diff --git a/flakes/lib/flake.lock b/flakes/lib/flake.lock
index 3e0b21e..3ca158e 100644
--- a/flakes/lib/flake.lock
+++ b/flakes/lib/flake.lock
@@ -1,12 +1,235 @@
1{ 1{
2 "nodes": { 2 "nodes": {
3 "colmena": {
4 "inputs": {
5 "flake-compat": "flake-compat",
6 "flake-utils": "flake-utils",
7 "nixpkgs": "nixpkgs",
8 "stable": "stable"
9 },
10 "locked": {
11 "lastModified": 1687954574,
12 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
13 "owner": "immae",
14 "repo": "colmena",
15 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
16 "type": "github"
17 },
18 "original": {
19 "owner": "immae",
20 "ref": "add-lib-get-flake",
21 "repo": "colmena",
22 "type": "github"
23 }
24 },
25 "disko": {
26 "inputs": {
27 "nixpkgs": "nixpkgs_2"
28 },
29 "locked": {
30 "lastModified": 1687968164,
31 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
32 "owner": "nix-community",
33 "repo": "disko",
34 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
35 "type": "github"
36 },
37 "original": {
38 "owner": "nix-community",
39 "repo": "disko",
40 "type": "github"
41 }
42 },
43 "flake-compat": {
44 "flake": false,
45 "locked": {
46 "lastModified": 1650374568,
47 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
48 "owner": "edolstra",
49 "repo": "flake-compat",
50 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
51 "type": "github"
52 },
53 "original": {
54 "owner": "edolstra",
55 "repo": "flake-compat",
56 "type": "github"
57 }
58 },
59 "flake-parts": {
60 "inputs": {
61 "nixpkgs-lib": "nixpkgs-lib"
62 },
63 "locked": {
64 "lastModified": 1687762428,
65 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
66 "owner": "hercules-ci",
67 "repo": "flake-parts",
68 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
69 "type": "github"
70 },
71 "original": {
72 "owner": "hercules-ci",
73 "repo": "flake-parts",
74 "type": "github"
75 }
76 },
77 "flake-utils": {
78 "locked": {
79 "lastModified": 1659877975,
80 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
81 "owner": "numtide",
82 "repo": "flake-utils",
83 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
84 "type": "github"
85 },
86 "original": {
87 "owner": "numtide",
88 "repo": "flake-utils",
89 "type": "github"
90 }
91 },
92 "nixos-2305": {
93 "locked": {
94 "lastModified": 1687938137,
95 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
96 "owner": "NixOS",
97 "repo": "nixpkgs",
98 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
99 "type": "github"
100 },
101 "original": {
102 "owner": "NixOS",
103 "ref": "release-23.05",
104 "repo": "nixpkgs",
105 "type": "github"
106 }
107 },
108 "nixos-anywhere": {
109 "inputs": {
110 "disko": [
111 "disko"
112 ],
113 "flake-parts": [
114 "flake-parts"
115 ],
116 "nixos-2305": "nixos-2305",
117 "nixos-images": "nixos-images",
118 "nixpkgs": "nixpkgs_3",
119 "treefmt-nix": "treefmt-nix"
120 },
121 "locked": {
122 "lastModified": 1689945193,
123 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
124 "owner": "numtide",
125 "repo": "nixos-anywhere",
126 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
127 "type": "github"
128 },
129 "original": {
130 "owner": "numtide",
131 "repo": "nixos-anywhere",
132 "type": "github"
133 }
134 },
135 "nixos-images": {
136 "inputs": {
137 "nixos-2305": [
138 "nixos-anywhere",
139 "nixos-2305"
140 ],
141 "nixos-unstable": [
142 "nixos-anywhere",
143 "nixpkgs"
144 ]
145 },
146 "locked": {
147 "lastModified": 1686819168,
148 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
149 "owner": "nix-community",
150 "repo": "nixos-images",
151 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
152 "type": "github"
153 },
154 "original": {
155 "owner": "nix-community",
156 "repo": "nixos-images",
157 "type": "github"
158 }
159 },
3 "nixpkgs": { 160 "nixpkgs": {
4 "locked": { 161 "locked": {
5 "lastModified": 1631570365, 162 "lastModified": 1683408522,
6 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=", 163 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
164 "owner": "NixOS",
165 "repo": "nixpkgs",
166 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
167 "type": "github"
168 },
169 "original": {
170 "owner": "NixOS",
171 "ref": "nixos-unstable",
172 "repo": "nixpkgs",
173 "type": "github"
174 }
175 },
176 "nixpkgs-lib": {
177 "locked": {
178 "dir": "lib",
179 "lastModified": 1685564631,
180 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
181 "owner": "NixOS",
182 "repo": "nixpkgs",
183 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
184 "type": "github"
185 },
186 "original": {
187 "dir": "lib",
188 "owner": "NixOS",
189 "ref": "nixos-unstable",
190 "repo": "nixpkgs",
191 "type": "github"
192 }
193 },
194 "nixpkgs_2": {
195 "locked": {
196 "lastModified": 1687701825,
197 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
198 "owner": "NixOS",
199 "repo": "nixpkgs",
200 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
201 "type": "github"
202 },
203 "original": {
204 "owner": "NixOS",
205 "ref": "nixpkgs-unstable",
206 "repo": "nixpkgs",
207 "type": "github"
208 }
209 },
210 "nixpkgs_3": {
211 "locked": {
212 "lastModified": 1687893427,
213 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
214 "owner": "nixos",
215 "repo": "nixpkgs",
216 "rev": "4b14ab2a916508442e685089672681dff46805be",
217 "type": "github"
218 },
219 "original": {
220 "owner": "nixos",
221 "ref": "nixos-unstable-small",
222 "repo": "nixpkgs",
223 "type": "github"
224 }
225 },
226 "nixpkgs_4": {
227 "locked": {
228 "lastModified": 1648725829,
229 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
7 "owner": "NixOS", 230 "owner": "NixOS",
8 "repo": "nixpkgs", 231 "repo": "nixpkgs",
9 "rev": "df7113c0727881519248d4c7d080324e0ee3327b", 232 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
10 "type": "github" 233 "type": "github"
11 }, 234 },
12 "original": { 235 "original": {
@@ -17,7 +240,48 @@
17 }, 240 },
18 "root": { 241 "root": {
19 "inputs": { 242 "inputs": {
20 "nixpkgs": "nixpkgs" 243 "colmena": "colmena",
244 "disko": "disko",
245 "flake-parts": "flake-parts",
246 "nixos-anywhere": "nixos-anywhere",
247 "nixpkgs": "nixpkgs_4"
248 }
249 },
250 "stable": {
251 "locked": {
252 "lastModified": 1669735802,
253 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
254 "owner": "NixOS",
255 "repo": "nixpkgs",
256 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
257 "type": "github"
258 },
259 "original": {
260 "owner": "NixOS",
261 "ref": "nixos-22.11",
262 "repo": "nixpkgs",
263 "type": "github"
264 }
265 },
266 "treefmt-nix": {
267 "inputs": {
268 "nixpkgs": [
269 "nixos-anywhere",
270 "nixpkgs"
271 ]
272 },
273 "locked": {
274 "lastModified": 1687940979,
275 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
276 "owner": "numtide",
277 "repo": "treefmt-nix",
278 "rev": "0a4f06c27610a99080b69433873885df82003aae",
279 "type": "github"
280 },
281 "original": {
282 "owner": "numtide",
283 "repo": "treefmt-nix",
284 "type": "github"
21 } 285 }
22 } 286 }
23 }, 287 },
diff --git a/flakes/lib/flake.nix b/flakes/lib/flake.nix
index 8faa136..5b78fb6 100644
--- a/flakes/lib/flake.nix
+++ b/flakes/lib/flake.nix
@@ -1,28 +1,68 @@
1{ 1{
2 inputs.nixpkgs.url = "github:NixOS/nixpkgs"; 2 inputs.nixpkgs.url = "github:NixOS/nixpkgs";
3 inputs.flake-parts.url = "github:hercules-ci/flake-parts";
4 inputs.disko.url = "github:nix-community/disko";
5 # replace with zhaofengli/colmena once https://github.com/zhaofengli/colmena/pull/161 is merged
6 inputs.colmena.url = "github:immae/colmena/add-lib-get-flake";
7 inputs.nixos-anywhere.url = "github:numtide/nixos-anywhere";
8 inputs.nixos-anywhere.inputs.disko.follows = "disko";
9 inputs.nixos-anywhere.inputs.flake-parts.follows = "flake-parts";
3 10
4 description = "Useful libs"; 11 description = "Useful libs";
5 outputs = { self, nixpkgs }: { 12 outputs = { self, nixpkgs, flake-parts, disko, colmena, nixos-anywhere }: {
6 lib = rec { 13 lib = rec {
7 computeNarHash = path: 14 mkColmenaFlake = { name, self, nixpkgs, system ? "x86_64-linux", nixosModules, moduleArgs ? {}, targetHost, targetUser ? "root" }:
8 let pkgs = import nixpkgs {}; 15 flake-parts.lib.mkFlake { inputs = { inherit nixpkgs self; }; } {
9 in 16 systems = [ system ];
10 builtins.readFile (pkgs.runCommand "narHash" { 17 perSystem = { pkgs, ... }: {
11 buildInputs = [ pkgs.nix ]; 18 apps."${name}-install" = {
12 } "echo -n $(nix hash-path ${path}) > $out"); 19 type = "app";
20 program = pkgs.writeScriptBin "${name}-install" ''
21 #!${pkgs.stdenv.shell}
22 set -euo pipefail
23 : $SOPS_VARS_FILE
24 TEMPDIR=$(mktemp -d)
25 trap '[ -d "$TEMPDIR" ] && rm -rf "$TEMPDIR"' EXIT
13 26
14 withNarKeyCompat = flakeCompat: path: moduleAttrs: 27 password=$(sops -d $SOPS_VARS_FILE | yq -r .cryptsetup_encryption_keys.${name})
15 let module = (flakeCompat path).${moduleAttrs}; 28 mkdir -p $TEMPDIR/boot/initrdSecrets
16 narHash = computeNarHash path; 29 chmod -R go-rwx $TEMPDIR/boot/initrdSecrets
17 in if builtins.isFunction module 30 sops -d $SOPS_VARS_FILE | yq -c '.ssh_host_keys.${name}[]' | while read -r key; do
18 then args@{ config, lib, pkgs, ... }: (module args // { key = narHash; }) 31 keytype=$(echo "$key" | yq -r .type)
19 else module // { key = narHash; }; 32 keyprivate=$(echo "$key" | yq -r .private)
33 keypublic=$(echo "$key" | yq -r .public)
34 echo "$keyprivate" > $TEMPDIR/boot/initrdSecrets/ssh_host_''${keytype}_key
35 echo "$keypublic" > $TEMPDIR/boot/initrdSecrets/ssh_host_''${keytype}_key.pub
36 done
37 chmod -R go-rwx $TEMPDIR/boot/initrdSecrets
20 38
21 withNarKey = dep: moduleAttrs: 39 ${nixos-anywhere.packages.${system}.nixos-anywhere}/bin/nixos-anywhere \
22 let module = dep.${moduleAttrs}; 40 -f .#${name}WithEncryption ${targetUser}@${targetHost} \
23 in if builtins.isFunction module 41 --disk-encryption-keys /run/decrypt-key <(echo -n "$password") \
24 then args@{ config, lib, pkgs, ... }: (module args // { key = dep.narHash; }) 42 --extra-files "$TEMPDIR"
25 else module // { key = dep.narHash; }; 43 '';
44 };
45
46 };
47 flake = {
48 nixosConfigurations.${name} = (colmena.lib.fromRawFlake self).nodes.${name};
49 nixosConfigurations."${name}WithEncryption" = let
50 selfWithEncryption = nixpkgs.lib.recursiveUpdate self { outputs.colmena.meta.specialArgs.cryptKeyFile = "/run/decrypt-key"; };
51 in
52 (colmena.lib.fromRawFlake selfWithEncryption).nodes.${name};
53 colmena = {
54 meta.nixpkgs = nixpkgs.legacyPackages.${system};
55 meta.specialArgs = moduleArgs;
56 "${name}" = {
57 deployment = { inherit targetHost targetUser; };
58 imports = builtins.attrValues self.nixosModules;
59 };
60 };
61 nixosModules = {
62 _diskoModules = disko.nixosModules.disko;
63 } // nixosModules;
64 };
65 };
26 }; 66 };
27 }; 67 };
28} 68}
diff --git a/flakes/loginctl-linger/flake.nix b/flakes/loginctl-linger/flake.nix
new file mode 100644
index 0000000..4828d37
--- /dev/null
+++ b/flakes/loginctl-linger/flake.nix
@@ -0,0 +1,56 @@
1{
2 outputs = { self }: {
3 nixosModule = { config, lib, pkgs, ... }:
4 # https://github.com/michalrus/dotfiles/commit/ebd5fa9583f82589f23531647aa677feb3f8d344#diff-4d353005ef5b3e37f33c07332b8523edR1
5 # A temporary hack to `loginctl enable-linger $somebody` (for
6 # multiplexer sessions to last), until this one is unresolved:
7 # https://github.com/NixOS/nixpkgs/issues/3702
8 #
9 # Usage: `users.extraUsers.somebody.linger = true` or slt.
10
11 with lib;
12
13 let
14
15 dataDir = "/var/lib/systemd/linger";
16
17 lingeringUsers = map (u: u.name) (attrValues (flip filterAttrs config.users.users (n: u: u.linger)));
18
19 lingeringUsersFile = builtins.toFile "lingering-users"
20 (concatStrings (map (s: "${s}\n")
21 (sort (a: b: a < b) lingeringUsers))); # this sorting is important for `comm` to work correctly
22
23 updateLingering = pkgs.writeScript "update-lingering" ''
24 if [ ! -e ${dataDir} ]; then
25 install -m 0755 -o root -g root -d ${dataDir}
26 fi
27 if [ -e ${dataDir} ] ; then
28 ls ${dataDir} | sort | comm -3 -1 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl disable-linger
29 ls ${dataDir} | sort | comm -3 -2 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl enable-linger
30 fi
31 '';
32
33 in
34
35 {
36 # Necessary for situations where flake gets included multiple times
37 key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
38 options = {
39 users.users = mkOption {
40 type = lib.types.attrsOf (lib.types.submodule {
41 options = {
42 linger = mkEnableOption "lingering for the user";
43 };
44 });
45 };
46 };
47
48 config = {
49 system.activationScripts.update-lingering = {
50 deps = ["users"];
51 text = "${updateLingering}";
52 };
53 };
54 };
55 };
56}
diff --git a/flakes/mastodon/default.nix b/flakes/mastodon/default.nix
new file mode 100644
index 0000000..5d32c23
--- /dev/null
+++ b/flakes/mastodon/default.nix
@@ -0,0 +1,94 @@
1{ varDir ? "/var/lib/mastodon",
2 stdenv, src, writeText, runCommand,
3 ruby_2_6, bundlerEnv, defaultGemConfig,
4 jq, protobuf, protobufc, pkgconfig, libidn, pam, nodejs, yarn, yarn2nix-moretea }:
5let
6 patched = runCommand "mastodon-patched" {
7 source = src;
8 } ''
9 cp -a $source $out
10 chmod -R u+w $out
11 sed -i -e "/fuubar/s/2.4.0/2.4.1/" $out/Gemfile.lock
12 sed -i -e "s/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9#4255dc41fa7df9c3a02c1595f058e248bc37b784/" $out/yarn.lock
13 '';
14 gems = bundlerEnv {
15 name = "mastodon-env";
16 ruby = ruby_2_6;
17 gemset = ./gemset.nix;
18 gemdir = patched;
19 groups = [ "default" "production" "test" "development" ];
20 gemConfig = defaultGemConfig // {
21 redis-rack = attrs: {
22 preBuild = ''
23 sed -i 's!s\.files.*!!' redis-rack.gemspec
24 '';
25 };
26 tzinfo = attrs: {
27 preBuild = ''
28 sed -i 's!s\.files.*!!' tzinfo.gemspec
29 '';
30 };
31 cld3 = attrs: {
32 buildInputs = [ protobuf protobufc pkgconfig ];
33 };
34 idn-ruby = attrs: {
35 buildInputs = [ libidn ];
36 };
37 rpam2 = attrs: {
38 buildInputs = [ pam ];
39 };
40 };
41 };
42 yarnModules = let
43 packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
44 cat ${patched}/package.json | jq -r '.version = "${src.version}"' > $out
45 '';
46 in
47 yarn2nix-moretea.mkYarnModules rec {
48 name = "mastodon-yarn";
49 pname = name;
50 version = src.version;
51 packageJSON = packagejson;
52 yarnLock = "${patched}/yarn.lock";
53 yarnNix = ./yarn-packages.nix;
54 pkgConfig = {
55 uws = {
56 postInstall = ''
57 npx node-gyp rebuild > build_log.txt 2>&1 || true
58 '';
59 };
60 };
61 };
62 mastodon_with_yarn = stdenv.mkDerivation {
63 pname = "mastodon";
64 version = src.version;
65 inherit src;
66 installPhase = ''
67 cp -a . $out
68 cp -a ${yarnModules}/node_modules $out
69 '';
70 buildInputs = [ yarnModules ];
71 };
72in
73stdenv.mkDerivation {
74 name = "mastodon";
75 version = src.version;
76 inherit mastodon_with_yarn;
77 builder = writeText "build_mastodon" ''
78 source $stdenv/setup
79 set -a
80 SECRET_KEY_BASE=Dummy
81 OTP_SECRET=Dummy
82 set +a
83 cp -a $mastodon_with_yarn $out
84 cd $out
85 chmod u+rwX . public
86 chmod -R u+rwX config/ node_modules/
87 sed -i -e 's@^end$@ config.action_mailer.sendmail_settings = { location: ENV.fetch("SENDMAIL_LOCATION", "/usr/sbin/sendmail") }\nend@' config/environments/production.rb
88 RAILS_ENV=production ${gems}/bin/rails assets:precompile
89 rm -rf tmp/cache
90 ln -sf ${varDir}/tmp/cache tmp
91 '';
92 buildInputs = [ gems gems.ruby nodejs yarn ];
93 passthru = { inherit gems varDir nodejs; };
94}
diff --git a/flakes/mastodon/flake.lock b/flakes/mastodon/flake.lock
new file mode 100644
index 0000000..aed0925
--- /dev/null
+++ b/flakes/mastodon/flake.lock
@@ -0,0 +1,75 @@
1{
2 "nodes": {
3 "flake-utils": {
4 "locked": {
5 "lastModified": 1648297722,
6 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
7 "owner": "numtide",
8 "repo": "flake-utils",
9 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
10 "type": "github"
11 },
12 "original": {
13 "owner": "numtide",
14 "repo": "flake-utils",
15 "type": "github"
16 }
17 },
18 "mastodon": {
19 "flake": false,
20 "locked": {
21 "lastModified": 1582790581,
22 "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
23 "owner": "tootsuite",
24 "repo": "mastodon",
25 "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
26 "type": "github"
27 },
28 "original": {
29 "owner": "tootsuite",
30 "ref": "v2.9.4",
31 "repo": "mastodon",
32 "type": "github"
33 }
34 },
35 "myuids": {
36 "locked": {
37 "lastModified": 1,
38 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
39 "path": "../myuids",
40 "type": "path"
41 },
42 "original": {
43 "path": "../myuids",
44 "type": "path"
45 }
46 },
47 "nixpkgs": {
48 "flake": false,
49 "locked": {
50 "lastModified": 1596265691,
51 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
52 "owner": "NixOS",
53 "repo": "nixpkgs",
54 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
55 "type": "github"
56 },
57 "original": {
58 "owner": "NixOS",
59 "repo": "nixpkgs",
60 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
61 "type": "github"
62 }
63 },
64 "root": {
65 "inputs": {
66 "flake-utils": "flake-utils",
67 "mastodon": "mastodon",
68 "myuids": "myuids",
69 "nixpkgs": "nixpkgs"
70 }
71 }
72 },
73 "root": "root",
74 "version": 7
75}
diff --git a/flakes/mastodon/flake.nix b/flakes/mastodon/flake.nix
new file mode 100644
index 0000000..1d0db10
--- /dev/null
+++ b/flakes/mastodon/flake.nix
@@ -0,0 +1,331 @@
1{
2 description = "Your self-hosted, globally interconnected microblogging community";
3 inputs.myuids = {
4 url = "path:../myuids";
5 };
6 inputs.flake-utils.url = "github:numtide/flake-utils";
7 inputs.nixpkgs = {
8 url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
9 flake = false;
10 };
11 inputs.mastodon = {
12 url = "github:tootsuite/mastodon/v2.9.4";
13 flake = false;
14 };
15
16 outputs = { self, myuids, nixpkgs, mastodon, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
17 let
18 pkgs = import nixpkgs { inherit system; overlays = []; };
19 version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.mastodon.original.ref;
20 inherit (pkgs) callPackage;
21 in rec {
22 packages.mastodon = callPackage ./. { src = mastodon // { inherit version; }; };
23 defaultPackage = packages.mastodon;
24 legacyPackages.mastodon = packages.mastodon;
25 checks = {
26 build = defaultPackage;
27 };
28 }
29 ) // rec {
30 overlays = {
31 mastodon = final: prev: {
32 mastodon = self.defaultPackage."${final.system}";
33 };
34 };
35 overlay = overlays.mastodon;
36 nixosModule = { lib, pkgs, config, ... }:
37 let
38 name = "mastodon";
39 cfg = config.immaeServices.mastodon;
40 in
41 {
42 options.immaeServices.mastodon = {
43 enable = lib.mkEnableOption "Enable Mastodon’s service";
44 user = lib.mkOption {
45 type = lib.types.str;
46 default = name;
47 description = "User account under which Mastodon runs";
48 };
49 group = lib.mkOption {
50 type = lib.types.str;
51 default = name;
52 description = "Group under which Mastodon runs";
53 };
54 dataDir = lib.mkOption {
55 type = lib.types.path;
56 default = "/var/lib/${name}";
57 description = ''
58 The directory where Mastodon stores its data.
59 '';
60 };
61 socketsPrefix = lib.mkOption {
62 type = lib.types.str;
63 default = "live";
64 description = ''
65 The prefix to use for Mastodon sockets.
66 '';
67 };
68 socketsDir = lib.mkOption {
69 type = lib.types.path;
70 default = "/run/${name}";
71 description = ''
72 The directory where Mastodon puts runtime files and sockets.
73 '';
74 };
75 configFile = lib.mkOption {
76 type = lib.types.path;
77 description = ''
78 The configuration file path for Mastodon.
79 '';
80 };
81 package = lib.mkOption {
82 type = lib.types.package;
83 default = pkgs.mastodon;
84 description = ''
85 Mastodon package to use.
86 '';
87 };
88 # Output variables
89 workdir = lib.mkOption {
90 type = lib.types.package;
91 default = cfg.package.override { varDir = cfg.dataDir; };
92 description = ''
93 Adjusted mastodon package with overriden varDir
94 '';
95 readOnly = true;
96 };
97 systemdStateDirectory = lib.mkOption {
98 type = lib.types.str;
99 # Use ReadWritePaths= instead if varDir is outside of /var/lib
100 default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
101 lib.strings.removePrefix "/var/lib/" cfg.dataDir;
102 description = ''
103 Adjusted Mastodon data directory for systemd
104 '';
105 readOnly = true;
106 };
107 systemdRuntimeDirectory = lib.mkOption {
108 type = lib.types.str;
109 # Use ReadWritePaths= instead if socketsDir is outside of /run
110 default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
111 lib.strings.removePrefix "/run/" cfg.socketsDir;
112 description = ''
113 Adjusted Mastodon sockets directory for systemd
114 '';
115 readOnly = true;
116 };
117 sockets = lib.mkOption {
118 type = lib.types.attrsOf lib.types.path;
119 default = {
120 node = "${cfg.socketsDir}/${cfg.socketsPrefix}_node.sock";
121 rails = "${cfg.socketsDir}/${cfg.socketsPrefix}_puma.sock";
122 };
123 readOnly = true;
124 description = ''
125 Mastodon sockets
126 '';
127 };
128 };
129
130 config = lib.mkIf cfg.enable {
131 nixpkgs.overlays = [ self.overlay ];
132 users.users = lib.optionalAttrs (cfg.user == name) {
133 "${name}" = {
134 uid = myuids.lib.uids.mastodon;
135 group = cfg.group;
136 description = "Mastodon user";
137 home = cfg.dataDir;
138 useDefaultShell = true;
139 };
140 };
141 users.groups = lib.optionalAttrs (cfg.group == name) {
142 "${name}" = {
143 gid = myuids.lib.gids.mastodon;
144 };
145 };
146
147 systemd.slices.mastodon = {
148 description = "Mastodon slice";
149 };
150
151 systemd.services.mastodon-streaming = {
152 description = "Mastodon Streaming";
153 wantedBy = [ "multi-user.target" ];
154 after = [ "network.target" "mastodon-web.service" ];
155
156 environment.NODE_ENV = "production";
157 environment.SOCKET = cfg.sockets.node;
158
159 path = [ cfg.workdir.nodejs pkgs.bashInteractive ];
160
161 script = ''
162 exec npm run start
163 '';
164
165 postStart = ''
166 while [ ! -S $SOCKET ]; do
167 sleep 0.5
168 done
169 chmod a+w $SOCKET
170 '';
171
172 postStop = ''
173 rm $SOCKET
174 '';
175
176 serviceConfig = {
177 Slice = "mastodon.slice";
178 User = cfg.user;
179 EnvironmentFile = cfg.configFile;
180 PrivateTmp = true;
181 Restart = "always";
182 TimeoutSec = 15;
183 Type = "simple";
184 WorkingDirectory = cfg.workdir;
185 StateDirectory = cfg.systemdStateDirectory;
186 RuntimeDirectory = cfg.systemdRuntimeDirectory;
187 RuntimeDirectoryPreserve = "yes";
188 };
189
190 unitConfig.RequiresMountsFor = cfg.dataDir;
191 };
192
193 systemd.services.mastodon-web = {
194 description = "Mastodon Web app";
195 wantedBy = [ "multi-user.target" ];
196 after = [ "network.target" ];
197
198 environment.RAILS_ENV = "production";
199 environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
200 environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
201 environment.SOCKET = cfg.sockets.rails;
202
203 path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file pkgs.imagemagick ];
204
205 preStart = ''
206 install -m 0755 -d ${cfg.dataDir}/tmp/cache
207 ./bin/bundle exec rails db:migrate
208 '';
209
210 script = ''
211 exec ./bin/bundle exec puma -C config/puma.rb
212 '';
213
214 postStart = ''
215 exec ./bin/tootctl cache clear
216 '';
217 serviceConfig = {
218 Slice = "mastodon.slice";
219 User = cfg.user;
220 EnvironmentFile = cfg.configFile;
221 PrivateTmp = true;
222 Restart = "always";
223 TimeoutSec = 60;
224 Type = "simple";
225 WorkingDirectory = cfg.workdir;
226 StateDirectory = cfg.systemdStateDirectory;
227 RuntimeDirectory = cfg.systemdRuntimeDirectory;
228 RuntimeDirectoryPreserve = "yes";
229 };
230
231 unitConfig.RequiresMountsFor = cfg.dataDir;
232 };
233
234 # To be run manually because computationnally heavy
235 systemd.services.mastodon-cleanup-manual = {
236 description = "Cleanup mastodon";
237
238 environment.RAILS_ENV = "production";
239 environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
240 environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
241 environment.SOCKET = cfg.sockets.rails;
242
243 path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ];
244
245 script = ''
246 exec ./bin/tootctl statuses remove --days 365
247 '';
248
249 serviceConfig = {
250 User = cfg.user;
251 EnvironmentFile = cfg.configFile;
252 PrivateTmp = true;
253 Type = "oneshot";
254 WorkingDirectory = cfg.workdir;
255 StateDirectory = cfg.systemdStateDirectory;
256 RuntimeDirectory = cfg.systemdRuntimeDirectory;
257 RuntimeDirectoryPreserve = "yes";
258 };
259
260 unitConfig.RequiresMountsFor = cfg.dataDir;
261 };
262
263 systemd.services.mastodon-cleanup = {
264 description = "Cleanup mastodon";
265 startAt = "daily";
266 restartIfChanged = false;
267
268 environment.RAILS_ENV = "production";
269 environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
270 environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
271 environment.SOCKET = cfg.sockets.rails;
272
273 path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ];
274
275 script = ''
276 exec ./bin/tootctl media remove --days 30
277 '';
278
279 serviceConfig = {
280 User = cfg.user;
281 EnvironmentFile = cfg.configFile;
282 PrivateTmp = true;
283 Type = "oneshot";
284 WorkingDirectory = cfg.workdir;
285 StateDirectory = cfg.systemdStateDirectory;
286 RuntimeDirectory = cfg.systemdRuntimeDirectory;
287 RuntimeDirectoryPreserve = "yes";
288 };
289
290 unitConfig.RequiresMountsFor = cfg.dataDir;
291 };
292
293 systemd.services.mastodon-sidekiq = {
294 description = "Mastodon Sidekiq";
295 wantedBy = [ "multi-user.target" ];
296 after = [ "network.target" "mastodon-web.service" ];
297
298 environment.RAILS_ENV="production";
299 environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
300 environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
301 environment.DB_POOL="5";
302
303 path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.imagemagick pkgs.ffmpeg pkgs.file ];
304
305 script = ''
306 exec ./bin/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push
307 '';
308
309 serviceConfig = {
310 Slice = "mastodon.slice";
311 User = cfg.user;
312 EnvironmentFile = cfg.configFile;
313 PrivateTmp = true;
314 Restart = "always";
315 TimeoutSec = 15;
316 Type = "simple";
317 WorkingDirectory = cfg.workdir;
318 StateDirectory = cfg.systemdStateDirectory;
319 RuntimeDirectory = cfg.systemdRuntimeDirectory;
320 RuntimeDirectoryPreserve = "yes";
321 };
322
323 unitConfig.RequiresMountsFor = cfg.dataDir;
324 };
325
326 };
327 };
328 };
329}
330
331
diff --git a/pkgs/webapps/mastodon/gemset.nix b/flakes/mastodon/gemset.nix
index 74fa5b3..74fa5b3 100644
--- a/pkgs/webapps/mastodon/gemset.nix
+++ b/flakes/mastodon/gemset.nix
diff --git a/pkgs/webapps/mastodon/yarn-packages.nix b/flakes/mastodon/yarn-packages.nix
index cca2efb..cca2efb 100644
--- a/pkgs/webapps/mastodon/yarn-packages.nix
+++ b/flakes/mastodon/yarn-packages.nix
diff --git a/pkgs/webapps/mediagoblin/bower-packages.nix b/flakes/mediagoblin/bower-packages.nix
index 03af849..03af849 100644
--- a/pkgs/webapps/mediagoblin/bower-packages.nix
+++ b/flakes/mediagoblin/bower-packages.nix
diff --git a/flakes/mediagoblin/default.nix b/flakes/mediagoblin/default.nix
new file mode 100644
index 0000000..47cc628
--- /dev/null
+++ b/flakes/mediagoblin/default.nix
@@ -0,0 +1,213 @@
1{ src, makeWrapper, stdenv, writeScript, fetchurl, buildBowerComponents, which, python36, gst_all_1, automake, autoconf, nodejs, nodePackages, lib, callPackage, fetchgit, fetchFromGitHub }:
2let
3 overridePython = let
4 packageOverrides = self: super: {
5 pybcrypt = super.buildPythonPackage rec {
6 pname = "pybcrypt";
7 version = "0.4";
8
9 src = self.fetchPypi {
10 inherit pname version;
11 sha256 = "5fa13bce551468350d66c4883694850570f3da28d6866bb638ba44fe5eabda78";
12 };
13 };
14 celery = super.celery.overridePythonAttrs(old: rec {
15 version = "3.1.26.post2";
16 src = self.fetchPypi {
17 inherit version;
18 inherit (old) pname;
19 sha256 = "5493e172ae817b81ba7d09443ada114886765a8ce02f16a56e6fac68d953a9b2";
20 };
21 patches = [];
22 doCheck = false;
23 });
24 billiard = super.billiard.overridePythonAttrs(old: rec {
25 version = "3.3.0.23";
26 src = self.fetchPypi {
27 inherit version;
28 inherit (old) pname;
29 sha256 = "02wxsc6bhqvzh8j6w758kvgqbnj14l796mvmrcms8fgfamd2lak9";
30 };
31 doCheck = false;
32 doInstallCheck = false;
33 });
34 amqp = super.amqp.overridePythonAttrs(old: rec {
35 version = "1.4.9";
36 src = self.fetchPypi {
37 inherit version;
38 inherit (old) pname;
39 sha256 = "2dea4d16d073c902c3b89d9b96620fb6729ac0f7a923bbc777cb4ad827c0c61a";
40 };
41 doCheck = false;
42 });
43 kombu = super.kombu.overridePythonAttrs(old: rec {
44 version = "3.0.37";
45 src = self.fetchPypi {
46 inherit version;
47 inherit (old) pname;
48 sha256 = "e064a00c66b4d1058cd2b0523fb8d98c82c18450244177b6c0f7913016642650";
49 };
50 propagatedBuildInputs = old.propagatedBuildInputs ++ [ self.anyjson ];
51 doCheck = false;
52 });
53 markdown = super.markdown.overridePythonAttrs(old: rec {
54 version = "3.1.1";
55 src = self.fetchPypi {
56 inherit version;
57 inherit (old) pname;
58 sha256 = "2e50876bcdd74517e7b71f3e7a76102050edec255b3983403f1a63e7c8a41e7a";
59 };
60 });
61 sqlalchemy = super.sqlalchemy.overridePythonAttrs(old: rec {
62 version = "1.1.18";
63 src = self.fetchPypi {
64 inherit version;
65 inherit (old) pname;
66 sha256 = "8b0ec71af9291191ba83a91c03d157b19ab3e7119e27da97932a4773a3f664a9";
67 };
68 doCheck = false;
69 });
70 tempita_5_3_dev = super.buildPythonPackage rec {
71 version = "47414a7-master";
72 pname = "tempita";
73 name = "${pname}-${version}";
74 src = fetchFromGitHub {
75 owner = "gjhiggins";
76 repo = "tempita";
77 rev = "47414a7c6e46a9a9afe78f0bce2ea299fa84d10d";
78 sha256 = "0f33jjjs5rvp7ar2j6ggyfykcrsrn04jaqcq71qfvycf6b7nw3rn";
79 fetchSubmodules = true;
80 };
81 buildInputs = with self; [ nose ];
82 disabled = false;
83 };
84 sqlalchemy_migrate = super.sqlalchemy_migrate.overridePythonAttrs(old: rec {
85 propagatedBuildInputs = with self; [ pbr tempita_5_3_dev decorator sqlalchemy six sqlparse ];
86 });
87 pasteScript = super.pasteScript.overridePythonAttrs(old: rec {
88 version = "2.0.2";
89 name = "PasteScript-${version}";
90 src = fetchurl {
91 url = "mirror://pypi/P/PasteScript/${name}.tar.gz";
92 sha256 = "1h3nnhn45kf4pbcv669ik4faw04j58k8vbj1hwrc532k0nc28gy0";
93 };
94 propagatedBuildInputs = with self; [ six paste PasteDeploy ];
95 });
96 werkzeug = super.werkzeug.overridePythonAttrs(old: rec {
97 version = "0.16.1";
98 src = self.fetchPypi {
99 inherit version;
100 inherit (old) pname;
101 sha256 = "b353856d37dec59d6511359f97f6a4b2468442e454bd1c98298ddce53cac1f04";
102 };
103 });
104 };
105 in
106 python36.override { inherit packageOverrides; };
107 pythonEnv = python-pkgs: with python-pkgs; [
108 waitress alembic dateutil wtforms pybcrypt
109 pytest pytest_xdist werkzeug celery
110 kombu jinja2 Babel webtest configobj markdown
111 sqlalchemy itsdangerous pytz sphinx six
112 oauthlib unidecode jsonschema PasteDeploy
113 requests PyLD exifread
114 typing pasteScript lxml
115 # For images plugin
116 pillow
117 # For video plugin
118 gst-python
119 # migrations
120 sqlalchemy_migrate
121 # authentication
122 ldap3
123 redis
124 psycopg2
125 ];
126 python = overridePython.withPackages pythonEnv;
127 gmg = writeScript "gmg" ''
128 #!${python}/bin/python
129 __requires__ = 'mediagoblin'
130 import sys
131 from pkg_resources import load_entry_point
132
133 if __name__ == '__main__':
134 sys.exit(
135 load_entry_point('mediagoblin', 'console_scripts', 'gmg')()
136 )
137 '';
138 bowerComponents = buildBowerComponents {
139 name = "mediagoblin-bower-components";
140 generated = ./bower-packages.nix;
141 inherit src;
142 };
143 pluginNames = [ "basicsearch" ];
144 allPlugins = lib.attrsets.genAttrs pluginNames
145 (name: callPackage (./plugins + "/${name}") {});
146 toPassthru = pkg: plugins: {
147 inherit allPlugins plugins;
148 withPlugins = withPlugins pkg;
149 };
150 withPlugins = pkg: toPlugins:
151 let
152 plugins = toPlugins allPlugins;
153 toBuildPlugin = n: "ln -s ${n} mediagoblin/plugins/${n.pluginName}";
154 newMediagoblin = pkg.overrideAttrs(old: {
155 postBuild = old.postBuild + "\n" + builtins.concatStringsSep "\n" (map toBuildPlugin plugins);
156 passthru = toPassthru newMediagoblin plugins;
157 });
158 in newMediagoblin;
159 package = stdenv.mkDerivation rec {
160 pname = "mediagoblin";
161 name = "${pname}-${version}";
162 version = "cd465eb-stable";
163 inherit src;
164 preConfigure = ''
165 # ./bootstrap.sh
166 aclocal -I m4 --install
167 autoreconf -fvi
168 # end
169 export HOME=$PWD
170 '';
171 configureFlags = [ "--with-python3" "--without-virtualenv" ];
172 postBuild = ''
173 cp -a ${bowerComponents}/bower_components/* extlib
174 chmod -R u+w extlib
175 make extlib
176 '';
177 installPhase = let
178 libpaths = with gst_all_1; [
179 python
180 gstreamer
181 gst-plugins-base
182 gst-libav
183 gst-plugins-good
184 gst-plugins-bad
185 gst-plugins-ugly
186 ];
187 plugin_paths = builtins.concatStringsSep ":" (map (x: "${x}/lib") libpaths);
188 typelib_paths = with gst_all_1; "${gstreamer}/lib/girepository-1.0:${gst-plugins-base}/lib/girepository-1.0";
189 in ''
190 sed -i "s/registry.has_key(current_theme_name)/current_theme_name in registry/" mediagoblin/tools/theme.py
191 sed -i -e "s@\[DEFAULT\]@[DEFAULT]\nhere = $out@" mediagoblin/config_spec.ini
192 sed -i -e "/from gi.repository import GstPbutils/s/^/gi.require_version('GstPbutils', '1.0')\n/" mediagoblin/media_types/video/transcoders.py
193 cp ${./ldap_fix.py} mediagoblin/plugins/ldap/tools.py
194 find . -name '*.pyc' -delete
195 find . -type f -exec sed -i "s|$PWD|$out|g" {} \;
196 python setup.py build
197 cp -a . $out
198 mkdir $out/bin
199 makeWrapper ${gmg} $out/bin/gmg --prefix PYTHONPATH : "$out:$PYTHONPATH" \
200 --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
201 --prefix GI_TYPELIB_PATH : ${typelib_paths}
202 makeWrapper ${python}/bin/paster $out/bin/paster --prefix PYTHONPATH : "$out:$PYTHONPATH" \
203 --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
204 --prefix GI_TYPELIB_PATH : ${typelib_paths}
205 makeWrapper ${python}/bin/celery $out/bin/celery --prefix PYTHONPATH : "$out:$PYTHONPATH" \
206 --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
207 --prefix GI_TYPELIB_PATH : ${typelib_paths}
208 '';
209 buildInputs = [ makeWrapper automake autoconf which nodePackages.bower nodejs python ];
210 propagatedBuildInputs = with gst_all_1; [ python gst-libav gst-plugins-good gst-plugins-bad gst-plugins-ugly gstreamer ];
211 passthru = toPassthru package [];
212 };
213in package
diff --git a/flakes/mediagoblin/flake.lock b/flakes/mediagoblin/flake.lock
new file mode 100644
index 0000000..bba6479
--- /dev/null
+++ b/flakes/mediagoblin/flake.lock
@@ -0,0 +1,78 @@
1{
2 "nodes": {
3 "flake-utils": {
4 "locked": {
5 "lastModified": 1649676176,
6 "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
7 "owner": "numtide",
8 "repo": "flake-utils",
9 "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
10 "type": "github"
11 },
12 "original": {
13 "owner": "numtide",
14 "repo": "flake-utils",
15 "type": "github"
16 }
17 },
18 "mediagoblin": {
19 "flake": false,
20 "locked": {
21 "lastModified": 1531090939,
22 "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
23 "ref": "stable",
24 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
25 "revCount": 4805,
26 "submodules": true,
27 "type": "git",
28 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
29 },
30 "original": {
31 "ref": "stable",
32 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
33 "submodules": true,
34 "type": "git",
35 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
36 }
37 },
38 "myuids": {
39 "locked": {
40 "lastModified": 1,
41 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
42 "path": "../myuids",
43 "type": "path"
44 },
45 "original": {
46 "path": "../myuids",
47 "type": "path"
48 }
49 },
50 "nixpkgs": {
51 "flake": false,
52 "locked": {
53 "lastModified": 1596265691,
54 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
55 "owner": "NixOS",
56 "repo": "nixpkgs",
57 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
58 "type": "github"
59 },
60 "original": {
61 "owner": "NixOS",
62 "repo": "nixpkgs",
63 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
64 "type": "github"
65 }
66 },
67 "root": {
68 "inputs": {
69 "flake-utils": "flake-utils",
70 "mediagoblin": "mediagoblin",
71 "myuids": "myuids",
72 "nixpkgs": "nixpkgs"
73 }
74 }
75 },
76 "root": "root",
77 "version": 7
78}
diff --git a/flakes/mediagoblin/flake.nix b/flakes/mediagoblin/flake.nix
new file mode 100644
index 0000000..2e821d5
--- /dev/null
+++ b/flakes/mediagoblin/flake.nix
@@ -0,0 +1,271 @@
1{
2 description = "a free software media publishing platform that anyone can run.";
3 inputs.myuids = {
4 url = "path:../myuids";
5 };
6 inputs.flake-utils.url = "github:numtide/flake-utils";
7 inputs.nixpkgs = {
8 url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
9 flake = false;
10 };
11 inputs.mediagoblin = {
12 url = "git+https://git.savannah.gnu.org/git/mediagoblin.git?submodules=1&ref=stable&rev=cd465ebfec837a75a44c4ebd727dffe2fff6d850";
13 flake = false;
14 };
15
16 outputs = { self, myuids, nixpkgs, mediagoblin, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
17 let
18 pkgs = import nixpkgs { inherit system; overlays = []; };
19 version = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.mediagoblin.original.ref;
20 inherit (pkgs) callPackage;
21 in rec {
22 packages.mediagoblin = callPackage ./. { src = mediagoblin // { inherit version; }; };
23 defaultPackage = packages.mediagoblin;
24 legacyPackages.mediagoblin = packages.mediagoblin;
25 checks = {
26 build = defaultPackage;
27 };
28 }
29 ) // rec {
30 overlays = {
31 mediagoblin = final: prev: {
32 mediagoblin = self.defaultPackage."${final.system}";
33 };
34 };
35 overlay = overlays.mediagoblin;
36 nixosModule = { lib, pkgs, config, ... }:
37 let
38 name = "mediagoblin";
39 cfg = config.services.mediagoblin;
40
41 uid = config.ids.uids.mediagoblin;
42 gid = config.ids.gids.mediagoblin;
43
44 paste_local = pkgs.writeText "paste_local.ini" ''
45 [DEFAULT]
46 debug = false
47
48 [pipeline:main]
49 pipeline = mediagoblin
50
51 [app:mediagoblin]
52 use = egg:mediagoblin#app
53 config = ${cfg.configFile} ${cfg.package}/mediagoblin.ini
54 /mgoblin_static = ${cfg.package}/mediagoblin/static
55
56 [loggers]
57 keys = root
58
59 [handlers]
60 keys = console
61
62 [formatters]
63 keys = generic
64
65 [logger_root]
66 level = INFO
67 handlers = console
68
69 [handler_console]
70 class = StreamHandler
71 args = (sys.stderr,)
72 level = NOTSET
73 formatter = generic
74
75 [formatter_generic]
76 format = %(levelname)-7.7s [%(name)s] %(message)s
77
78 [filter:errors]
79 use = egg:mediagoblin#errors
80 debug = false
81
82 [server:main]
83 use = egg:waitress#main
84 unix_socket = ${cfg.sockets.paster}
85 unix_socket_perms = 777
86 url_scheme = https
87 '';
88 in
89 {
90 options.services.mediagoblin = {
91 enable = lib.mkEnableOption "Enable Mediagoblin’s service";
92 user = lib.mkOption {
93 type = lib.types.str;
94 default = name;
95 description = "User account under which Mediagoblin runs";
96 };
97 group = lib.mkOption {
98 type = lib.types.str;
99 default = name;
100 description = "Group under which Mediagoblin runs";
101 };
102 dataDir = lib.mkOption {
103 type = lib.types.path;
104 default = "/var/lib/${name}";
105 description = ''
106 The directory where Mediagoblin stores its data.
107 '';
108 };
109 socketsDir = lib.mkOption {
110 type = lib.types.path;
111 default = "/run/${name}";
112 description = ''
113 The directory where Mediagoblin puts runtime files and sockets.
114 '';
115 };
116 configFile = lib.mkOption {
117 type = lib.types.path;
118 description = ''
119 The configuration file path for Mediagoblin.
120 '';
121 };
122 package = lib.mkOption {
123 type = lib.types.package;
124 default = pkgs.mediagoblin;
125 example = lib.literalExample ''
126 pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch])
127 '';
128 description = ''
129 Mediagoblin package to use.
130 '';
131 };
132 systemdStateDirectory = lib.mkOption {
133 type = lib.types.str;
134 # Use ReadWritePaths= instead if varDir is outside of /var/lib
135 default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
136 lib.strings.removePrefix "/var/lib/" cfg.dataDir;
137 description = ''
138 Adjusted Mediagoblin data directory for systemd
139 '';
140 readOnly = true;
141 };
142 systemdRuntimeDirectory = lib.mkOption {
143 type = lib.types.str;
144 # Use ReadWritePaths= instead if socketsDir is outside of /run
145 default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
146 lib.strings.removePrefix "/run/" cfg.socketsDir;
147 description = ''
148 Adjusted Mediagoblin sockets directory for systemd
149 '';
150 readOnly = true;
151 };
152 sockets = lib.mkOption {
153 type = lib.types.attrsOf lib.types.path;
154 default = {
155 paster = "${cfg.socketsDir}/mediagoblin.sock";
156 };
157 readOnly = true;
158 description = ''
159 Mediagoblin sockets
160 '';
161 };
162 pids = lib.mkOption {
163 type = lib.types.attrsOf lib.types.path;
164 default = {
165 paster = "${cfg.socketsDir}/mediagoblin.pid";
166 celery = "${cfg.socketsDir}/mediagoblin-celeryd.pid";
167 };
168 readOnly = true;
169 description = ''
170 Mediagoblin pid files
171 '';
172 };
173 };
174
175 config = lib.mkIf cfg.enable {
176 nixpkgs.overlays = [ self.overlay ];
177 users.users = lib.optionalAttrs (cfg.user == name) {
178 "${name}" = {
179 inherit uid;
180 group = cfg.group;
181 description = "Mediagoblin user";
182 home = cfg.dataDir;
183 useDefaultShell = true;
184 };
185 };
186 users.groups = lib.optionalAttrs (cfg.group == name) {
187 "${name}" = {
188 inherit gid;
189 };
190 };
191
192 systemd.slices.mediagoblin = {
193 description = "Mediagoblin slice";
194 };
195 systemd.services.mediagoblin-web = {
196 description = "Mediagoblin service";
197 wantedBy = [ "multi-user.target" ];
198 after = [ "network.target" ];
199 wants = [ "postgresql.service" "redis.service" ];
200
201 environment.SCRIPT_NAME = "/mediagoblin/";
202
203 script = ''
204 exec ./bin/paster serve \
205 ${paste_local} \
206 --pid-file=${cfg.pids.paster}
207 '';
208 preStop = ''
209 exec ./bin/paster serve \
210 --pid-file=${cfg.pids.paster} \
211 ${paste_local} stop
212 '';
213 preStart = ''
214 if [ -d ${cfg.dataDir}/plugin_static/ ]; then
215 rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
216 ln -sf ${cfg.package}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
217 fi
218 ./bin/gmg -cf ${cfg.configFile} dbupdate
219 '';
220
221 serviceConfig = {
222 Slice = "mediagoblin.slice";
223 User = cfg.user;
224 PrivateTmp = true;
225 Restart = "always";
226 TimeoutSec = 15;
227 Type = "simple";
228 WorkingDirectory = cfg.package;
229 RuntimeDirectory = cfg.systemdRuntimeDirectory;
230 StateDirectory= cfg.systemdStateDirectory;
231 PIDFile = cfg.pids.paster;
232 };
233
234 unitConfig.RequiresMountsFor = cfg.dataDir;
235 };
236
237 systemd.services.mediagoblin-celeryd = {
238 description = "Mediagoblin service";
239 wantedBy = [ "multi-user.target" ];
240 after = [ "network.target" "mediagoblin-web.service" ];
241
242 environment.MEDIAGOBLIN_CONFIG = cfg.configFile;
243 environment.CELERY_CONFIG_MODULE = "mediagoblin.init.celery.from_celery";
244
245 script = ''
246 exec ./bin/celery worker \
247 --logfile=${cfg.dataDir}/celery.log \
248 --loglevel=INFO
249 '';
250
251 serviceConfig = {
252 Slice = "mediagoblin.slice";
253 User = cfg.user;
254 PrivateTmp = true;
255 Restart = "always";
256 TimeoutSec = 60;
257 Type = "simple";
258 WorkingDirectory = cfg.package;
259 RuntimeDirectory = cfg.systemdRuntimeDirectory;
260 StateDirectory= cfg.systemdStateDirectory;
261 PIDFile = cfg.pids.celery;
262 };
263
264 unitConfig.RequiresMountsFor = cfg.dataDir;
265 };
266 };
267 };
268 };
269}
270
271
diff --git a/pkgs/webapps/mediagoblin/ldap_fix.py b/flakes/mediagoblin/ldap_fix.py
index 10cc375..10cc375 100644
--- a/pkgs/webapps/mediagoblin/ldap_fix.py
+++ b/flakes/mediagoblin/ldap_fix.py
diff --git a/pkgs/webapps/mediagoblin/plugins/basicsearch/default.nix b/flakes/mediagoblin/plugins/basicsearch/default.nix
index 16be613..16be613 100644
--- a/pkgs/webapps/mediagoblin/plugins/basicsearch/default.nix
+++ b/flakes/mediagoblin/plugins/basicsearch/default.nix
diff --git a/flakes/multi-apache-container/flake.lock b/flakes/multi-apache-container/flake.lock
new file mode 100644
index 0000000..f8dda19
--- /dev/null
+++ b/flakes/multi-apache-container/flake.lock
@@ -0,0 +1,36 @@
1{
2 "nodes": {
3 "files-watcher": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
7 "path": "../files-watcher",
8 "type": "path"
9 },
10 "original": {
11 "path": "../files-watcher",
12 "type": "path"
13 }
14 },
15 "myuids": {
16 "locked": {
17 "lastModified": 1,
18 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
19 "path": "../myuids",
20 "type": "path"
21 },
22 "original": {
23 "path": "../myuids",
24 "type": "path"
25 }
26 },
27 "root": {
28 "inputs": {
29 "files-watcher": "files-watcher",
30 "myuids": "myuids"
31 }
32 }
33 },
34 "root": "root",
35 "version": 7
36}
diff --git a/flakes/multi-apache-container/flake.nix b/flakes/multi-apache-container/flake.nix
new file mode 100644
index 0000000..fd788f7
--- /dev/null
+++ b/flakes/multi-apache-container/flake.nix
@@ -0,0 +1,389 @@
1{
2 description = "Module to handle multiple separate apache instances (using containers)";
3 inputs.myuids = {
4 url = "path:../myuids";
5 };
6 inputs.files-watcher = {
7 url = "path:../files-watcher";
8 };
9
10 outputs = { self, myuids, files-watcher }: {
11 nixosModule = { lib, config, pkgs, options, ... }:
12 with lib;
13 let
14 cfg = config.services.websites;
15 hostConfig = config;
16 toHttpdConfig = icfg:
17 let
18 nosslVhost = ips: cfg: {
19 listen = map (ip: { inherit ip; port = 80; }) ips;
20 hostName = cfg.host;
21 logFormat = "combinedVhost";
22 documentRoot = cfg.root;
23 extraConfig = ''
24 <Directory ${cfg.root}>
25 DirectoryIndex ${cfg.indexFile}
26 AllowOverride None
27 Require all granted
28
29 RewriteEngine on
30 RewriteRule ^/(.+) / [L]
31 </Directory>
32 '';
33 };
34 toVhost = ips: vhostConf: {
35 acmeRoot = hostConfig.security.acme.certs.${vhostConf.certName}.webroot;
36 forceSSL = vhostConf.forceSSL or true;
37 useACMEHost = vhostConf.certName;
38 logFormat = "combinedVhost";
39 listen = if vhostConf.forceSSL
40 then lists.flatten (map (ip: [{ inherit ip; port = 443; ssl = true; } { inherit ip; port = 80; }]) ips)
41 else map (ip: { inherit ip; port = 443; ssl = true; }) ips;
42 hostName = builtins.head vhostConf.hosts;
43 serverAliases = builtins.tail vhostConf.hosts or [];
44 documentRoot = vhostConf.root;
45 extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig;
46 };
47 toVhostNoSSL = ips: vhostConf: {
48 logFormat = "combinedVhost";
49 listen = map (ip: { inherit ip; port = 80; }) ips;
50 hostName = builtins.head vhostConf.hosts;
51 serverAliases = builtins.tail vhostConf.hosts or [];
52 documentRoot = vhostConf.root;
53 extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig;
54 };
55 in {
56 enable = true;
57 logPerVirtualHost = true;
58 mpm = "event";
59 # https://ssl-config.mozilla.org/#server=apache&version=2.4.41&config=intermediate&openssl=1.0.2t&guideline=5.4
60 # test with https://www.ssllabs.com/ssltest/analyze.html?d=www.immae.eu&s=176.9.151.154&latest
61 sslProtocols = "all -SSLv3 -TLSv1 -TLSv1.1";
62 sslCiphers = builtins.concatStringsSep ":" [
63 "ECDHE-ECDSA-AES128-GCM-SHA256" "ECDHE-RSA-AES128-GCM-SHA256"
64 "ECDHE-ECDSA-AES256-GCM-SHA384" "ECDHE-RSA-AES256-GCM-SHA384"
65 "ECDHE-ECDSA-CHACHA20-POLY1305" "ECDHE-RSA-CHACHA20-POLY1305"
66 "DHE-RSA-AES128-GCM-SHA256" "DHE-RSA-AES256-GCM-SHA384"
67 ];
68 inherit (icfg) adminAddr;
69 logFormat = "combinedVhost";
70 extraModules = lists.unique icfg.modules;
71 extraConfig = builtins.concatStringsSep "\n" icfg.extraConfig;
72
73 virtualHosts = with attrsets; {
74 ___fallbackVhost = toVhost icfg.ips icfg.fallbackVhost;
75 } // (optionalAttrs icfg.nosslVhost.enable {
76 nosslVhost = nosslVhost icfg.ips icfg.nosslVhost;
77 }) // (mapAttrs' (n: v: nameValuePair ("nossl_" + n) (toVhostNoSSL icfg.ips v)) icfg.vhostNoSSLConfs)
78 // (mapAttrs' (n: v: nameValuePair ("ssl_" + n) (toVhost icfg.ips v)) icfg.vhostConfs);
79 };
80 in
81 {
82 options.services.websites = with types; {
83 env = mkOption {
84 default = {};
85 description = "Each type of website to enable will target a distinct httpd server";
86 type = attrsOf (submodule ({ name, config, ... }: {
87 options = {
88 enable = mkEnableOption "Enable websites of this type";
89 moduleType = mkOption {
90 type = enum [ "container" "main" ];
91 default = "container";
92 description = ''
93 How to deploy the web environment:
94 - container -> inside a dedicated container (running only httpd)
95 - main -> as main services.httpd module
96 '';
97 };
98 adminAddr = mkOption {
99 type = str;
100 description = "Admin e-mail address of the instance";
101 };
102 user = mkOption {
103 type = str;
104 description = "Username of httpd service";
105 readOnly = true;
106 default = if config.moduleType == "container"
107 then hostConfig.containers."httpd-${name}".config.services.httpd.user
108 else hostConfig.services.httpd.user;
109 };
110 group = mkOption {
111 type = str;
112 description = "Group of httpd service";
113 readOnly = true;
114 default = if config.moduleType == "container"
115 then hostConfig.containers."httpd-${name}".config.services.httpd.group
116 else hostConfig.services.httpd.group;
117 };
118 httpdName = mkOption {
119 type = str;
120 description = "Name of the httpd instance to assign this type to";
121 };
122 ips = mkOption {
123 type = listOf str;
124 default = [];
125 description = "ips to listen to";
126 };
127 bindMounts = mkOption {
128 type = attrsOf unspecified;
129 default = {};
130 description = "bind mounts to add to container";
131 };
132 modules = mkOption {
133 type = listOf str;
134 default = [];
135 description = "Additional modules to load in Apache";
136 };
137 extraConfig = mkOption {
138 type = listOf lines;
139 default = [];
140 description = "Additional configuration to append to Apache";
141 };
142 nosslVhost = mkOption {
143 description = "A default nossl vhost for captive portals";
144 default = {};
145 type = submodule {
146 options = {
147 enable = mkEnableOption "Add default no-ssl vhost for this instance";
148 host = mkOption {
149 type = str;
150 description = "The hostname to use for this vhost";
151 };
152 root = mkOption {
153 type = path;
154 description = "The root folder to serve";
155 };
156 indexFile = mkOption {
157 type = str;
158 default = "index.html";
159 description = "The index file to show.";
160 };
161 };
162 };
163 };
164 fallbackVhost = mkOption {
165 description = "The fallback vhost that will be defined as first vhost in Apache";
166 type = submodule {
167 options = {
168 certName = mkOption { type = str; };
169 hosts = mkOption { type = listOf str; };
170 root = mkOption { type = nullOr path; };
171 forceSSL = mkOption {
172 type = bool;
173 default = true;
174 description = ''
175 Automatically create a corresponding non-ssl vhost
176 that will only redirect to the ssl version
177 '';
178 };
179 extraConfig = mkOption { type = listOf lines; default = []; };
180 };
181 };
182 };
183 vhostNoSSLConfs = mkOption {
184 default = {};
185 description = "List of no ssl vhosts to define for Apache";
186 type = attrsOf (submodule {
187 options = {
188 hosts = mkOption { type = listOf str; };
189 root = mkOption { type = nullOr path; };
190 extraConfig = mkOption { type = listOf lines; default = []; };
191 };
192 });
193 };
194 vhostConfs = mkOption {
195 default = {};
196 description = "List of vhosts to define for Apache";
197 type = attrsOf (submodule {
198 options = {
199 certName = mkOption { type = str; };
200 hosts = mkOption { type = listOf str; };
201 root = mkOption { type = nullOr path; };
202 forceSSL = mkOption {
203 type = bool;
204 default = true;
205 description = ''
206 Automatically create a corresponding non-ssl vhost
207 that will only redirect to the ssl version
208 '';
209 };
210 extraConfig = mkOption { type = listOf lines; default = []; };
211 };
212 });
213 };
214 watchPaths = mkOption {
215 type = listOf str;
216 default = [];
217 description = ''
218 Paths to watch that should trigger a reload of httpd
219 '';
220 };
221 };
222 }));
223 };
224 };
225
226 config = lib.mkMerge [
227 {
228 assertions = [
229 {
230 assertion = builtins.length (builtins.attrNames (lib.filterAttrs (k: v: v.enable && v.moduleType == "main") cfg.env)) <= 1;
231 message = ''
232 Only one enabled environment can have moduleType = "main"
233 '';
234 }
235 ];
236 }
237
238 {
239 environment.etc = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
240 "httpd/${name}/httpd.conf" { source = (pkgs.nixos {
241 imports = [
242 {
243 config.security.acme.acceptTerms = true;
244 config.security.acme.preliminarySelfsigned = false;
245 config.security.acme.certs =
246 lib.mapAttrs (n: lib.filterAttrs (n': v': n' != "directory")) config.security.acme.certs;
247 config.security.acme.defaults = config.security.acme.defaults;
248 config.networking.hostName = "${hostConfig.networking.hostName}-${name}";
249 config.services.httpd = toHttpdConfig icfg;
250 }
251 ];
252 }).config.services.httpd.configFile;
253 }) (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env);
254
255 system.activationScripts.httpd-containers = {
256 deps = [ "etc" ];
257 text = builtins.concatStringsSep "\n" (
258 lib.mapAttrsToList (n: v: ''
259 install -d -m 0750 -o ${v.user} -g ${v.group} /var/log/httpd/${n} /var/lib/nixos-containers/httpd-${n}-mounts/conf
260 install -Dm644 -o ${v.user} -g ${v.group} /etc/httpd/${n}/httpd.conf /var/lib/nixos-containers/httpd-${n}-mounts/conf/
261 '') (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env)
262 );
263 };
264
265 security.acme.certs = lib.mkMerge (lib.mapAttrsToList (name: icfg:
266 let
267 containerCertNames = lib.unique (lib.mapAttrsToList (n: v: v.certName) icfg.vhostConfs
268 ++ [ icfg.fallbackVhost.certName ]);
269 in
270 lib.genAttrs containerCertNames (n:
271 { postRun = "machinectl shell httpd-${name} /run/current-system/sw/bin/systemctl reload httpd.service"; }
272 )
273 ) (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env)
274 );
275 containers = let hostConfig = config; in attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
276 "httpd-${name}" {
277 autoStart = true;
278 privateNetwork = false;
279 bindMounts = {
280 "/var/log/httpd" = {
281 hostPath = "/var/log/httpd/${name}";
282 isReadOnly = false;
283 };
284 "/etc/httpd" = {
285 hostPath = "/var/lib/nixos-containers/httpd-${name}-mounts/conf";
286 };
287 } // icfg.bindMounts;
288
289 config = { config, options, ... }: {
290 imports = [
291 myuids.nixosModule
292 files-watcher.nixosModule
293 ];
294 config = lib.mkMerge [
295 {
296 # This value determines the NixOS release with which your system is
297 # to be compatible, in order to avoid breaking some software such as
298 # database servers. You should change this only after NixOS release
299 # notes say you should.
300 # https://nixos.org/nixos/manual/release-notes.html
301 system.stateVersion = "23.05"; # Did you read the comment?
302 }
303 {
304 users.mutableUsers = false;
305 users.allowNoPasswordLogin = true;
306 users.users.acme.uid = config.ids.uids.acme;
307 users.users.acme.group = "acme";
308 users.groups.acme.gid = config.ids.gids.acme;
309 }
310 {
311 services.logrotate.settings.httpd.enable = false;
312 }
313 {
314 environment.etc."httpd/httpd.conf".enable = false;
315 services.httpd = {
316 enable = true;
317 configFile = "/etc/httpd/httpd.conf";
318 };
319
320 services.filesWatcher.http-config-reload = {
321 paths = [ "/etc/httpd/httpd.conf" ];
322 waitTime = 2;
323 restart = true;
324 };
325 services.filesWatcher.httpd = {
326 paths = icfg.watchPaths;
327 waitTime = 5;
328 };
329
330 users.users.${icfg.user}.extraGroups = [ "acme" "keys" ];
331 systemd.services.http-config-reload = {
332 wants = [ "httpd.service" ];
333 wantedBy = [ "multi-user.target" ];
334 restartTriggers = [ config.services.httpd.configFile ];
335 serviceConfig.Type = "oneshot";
336 serviceConfig.TimeoutSec = 60;
337 serviceConfig.RemainAfterExit = true;
338 script = ''
339 if ${pkgs.systemd}/bin/systemctl -q is-active httpd.service ; then
340 ${config.services.httpd.package.out}/bin/httpd -f ${config.services.httpd.configFile} -t && \
341 ${pkgs.systemd}/bin/systemctl reload httpd.service
342 fi
343 '';
344 };
345 }
346 ];
347 };
348 }) (lib.filterAttrs (k: v: v.moduleType == "container" && v.enable) cfg.env);
349 }
350
351 {
352 services.httpd = lib.concatMapAttrs (name: toHttpdConfig)
353 (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env);
354
355 users.users = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
356 config.services.httpd.user { extraGroups = [ "acme" ]; }
357 ) (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env);
358
359 services.filesWatcher = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
360 "httpd" {
361 paths = icfg.watchPaths;
362 waitTime = 5;
363 }
364 ) (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env);
365
366 services.logrotate.settings.httpd.enable = false;
367 systemd.services = lib.concatMapAttrs (name: v: {
368 httpd.restartTriggers = lib.mkForce [];
369 })
370 (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env);
371
372 security.acme.certs = lib.mkMerge (lib.mapAttrsToList (name: icfg:
373 let
374 containerCertNames = lib.unique (lib.mapAttrsToList (n: v: v.certName) icfg.vhostConfs
375 ++ [ icfg.fallbackVhost.certName ]);
376 in
377 lib.genAttrs containerCertNames (n:
378 { postRun = "systemctl reload httpd.service"; }
379 )
380 ) (lib.filterAttrs (k: v: v.moduleType == "main" && v.enable) cfg.env)
381 );
382
383 }
384 ];
385 };
386 };
387}
388
389
diff --git a/flakes/mypackages/flake.lock b/flakes/mypackages/flake.lock
new file mode 100644
index 0000000..f11f6c5
--- /dev/null
+++ b/flakes/mypackages/flake.lock
@@ -0,0 +1,83 @@
1{
2 "nodes": {
3 "flake-parts": {
4 "inputs": {
5 "nixpkgs-lib": "nixpkgs-lib"
6 },
7 "locked": {
8 "lastModified": 1675295133,
9 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
10 "owner": "hercules-ci",
11 "repo": "flake-parts",
12 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
13 "type": "github"
14 },
15 "original": {
16 "owner": "hercules-ci",
17 "repo": "flake-parts",
18 "type": "github"
19 }
20 },
21 "nixpkgs": {
22 "locked": {
23 "lastModified": 1646497237,
24 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
25 "owner": "nixos",
26 "repo": "nixpkgs",
27 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
28 "type": "github"
29 },
30 "original": {
31 "owner": "nixos",
32 "repo": "nixpkgs",
33 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
34 "type": "github"
35 }
36 },
37 "nixpkgs-lib": {
38 "locked": {
39 "dir": "lib",
40 "lastModified": 1675183161,
41 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
42 "owner": "NixOS",
43 "repo": "nixpkgs",
44 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
45 "type": "github"
46 },
47 "original": {
48 "dir": "lib",
49 "owner": "NixOS",
50 "ref": "nixos-unstable",
51 "repo": "nixpkgs",
52 "type": "github"
53 }
54 },
55 "root": {
56 "inputs": {
57 "flake-parts": "flake-parts",
58 "nixpkgs": "nixpkgs",
59 "webapps-ttrss": "webapps-ttrss"
60 }
61 },
62 "webapps-ttrss": {
63 "flake": false,
64 "locked": {
65 "lastModified": 1546759381,
66 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
67 "ref": "master",
68 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
69 "revCount": 9256,
70 "type": "git",
71 "url": "https://git.tt-rss.org/fox/tt-rss.git"
72 },
73 "original": {
74 "ref": "master",
75 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
76 "type": "git",
77 "url": "https://git.tt-rss.org/fox/tt-rss.git"
78 }
79 }
80 },
81 "root": "root",
82 "version": 7
83}
diff --git a/flakes/mypackages/flake.nix b/flakes/mypackages/flake.nix
new file mode 100644
index 0000000..adad96f
--- /dev/null
+++ b/flakes/mypackages/flake.nix
@@ -0,0 +1,43 @@
1{
2 description = "immae-eu infrastructure";
3 inputs = {
4 flake-parts.url = "github:hercules-ci/flake-parts";
5 # TODO: use nixos-unstable branch at some point and use the lock to keep the actual commit
6 nixpkgs.url = "github:nixos/nixpkgs/062a0c5437b68f950b081bbfc8a699d57a4ee026";
7 webapps-ttrss = {
8 url = "https://git.tt-rss.org/fox/tt-rss.git";
9 ref = "master";
10 rev = "986ca251f995f7754a0470d3e0c44538a545081f";
11 type = "git";
12 flake = false;
13 };
14 };
15 outputs = inputs@{ self, flake-parts, ... }:
16 flake-parts.lib.mkFlake { inherit inputs; } {
17 imports = [
18 (import ./lib/flake-parts-lib.nix { name = "lib"; type = "unspecified"; })
19 ];
20 systems = [ "x86_64-linux" ];
21 perSystem = { config, inputs', pkgs, ... }:
22 let
23 mypkgs = import ./pkgs/default.nix { inherit pkgs; inherit (self) mylibs sources; };
24 in {
25 packages = builtins.removeAttrs mypkgs [ "composerEnv" "webapps-apache-theme" ];
26 lib = {
27 inherit (self) sources;
28 inherit (mypkgs) composerEnv;
29 inherit (self.mylibs) postfixScript;
30 apache-theme = mypkgs.webapps-apache-theme;
31 };
32 };
33 flake = {
34 mylibs = import ./lib/default.nix;
35 sources.tools.ttrss = inputs.webapps-ttrss;
36 # We want overlays to be infected (in contrary to "packages"
37 # above): if someone imports an overlay here, we want his own
38 # overlays to be taken into account in every package, even new
39 # ones.
40 overlays = import ./overlays/default.nix { inherit (self) sources mylibs; };
41 };
42 };
43}
diff --git a/flakes/mypackages/lib/default.nix b/flakes/mypackages/lib/default.nix
new file mode 100644
index 0000000..972ace0
--- /dev/null
+++ b/flakes/mypackages/lib/default.nix
@@ -0,0 +1,37 @@
1{
2 flakePartsAddPerSystem = import ./flake-parts-lib.nix;
3 nodeEnv = import ./node-env.nix;
4 postfixScript = pkgs: name: script: pkgs.writeScript name ''
5 #! ${pkgs.stdenv.shell}
6 mail=$(${pkgs.coreutils}/bin/cat -)
7 output=$(echo "$mail" | ${script} 2>&1)
8 ret=$?
9
10 if [ "$ret" != "0" ]; then
11 echo "$mail" \
12 | ${pkgs.procmail}/bin/formail -i "X-Return-Code: $ret" \
13 | /run/wrappers/bin/sendmail -i scripts_error+${name}@mail.immae.eu
14
15 messageId=$(echo "$mail" | ${pkgs.procmail}/bin/formail -x "Message-Id:")
16 repeat=$(echo "$mail" | ${pkgs.procmail}/bin/formail -X "From:" -X "Received:")
17
18 ${pkgs.coreutils}/bin/cat <<EOF | /run/wrappers/bin/sendmail -i scripts_error+${name}@mail.immae.eu
19 $repeat
20 To: scripts_error+${name}@mail.immae.eu
21 Subject: Log from script error
22 Content-Type: text/plain; charset="UTF-8"
23 Content-Transfer-Encoding: 8bit
24 References:$messageId
25 MIME-Version: 1.0
26 X-Return-Code: $ret
27
28 Error code: $ret
29 Output of message:
30 --------------
31 $output
32 --------------
33 EOF
34 fi
35 '';
36
37}
diff --git a/flakes/mypackages/lib/flake-parts-lib.nix b/flakes/mypackages/lib/flake-parts-lib.nix
new file mode 100644
index 0000000..271a4cf
--- /dev/null
+++ b/flakes/mypackages/lib/flake-parts-lib.nix
@@ -0,0 +1,10 @@
1i@{ name, type }:
2{ lib, flake-parts-lib, ... }:
3flake-parts-lib.mkTransposedPerSystemModule {
4 inherit name;
5 option = lib.mkOption {
6 type = lib.types.lazyAttrsOf lib.types."${type}";
7 default = { };
8 };
9 file = import ./flake-parts-lib.nix i;
10}
diff --git a/flakes/mypackages/lib/node-env.nix b/flakes/mypackages/lib/node-env.nix
new file mode 100644
index 0000000..842caa1
--- /dev/null
+++ b/flakes/mypackages/lib/node-env.nix
@@ -0,0 +1,542 @@
1# This file originates from node2nix
2
3{lib, stdenv, nodejs, python2, utillinux, libtool, runCommand, writeTextFile}:
4
5let
6 python = if nodejs ? python then nodejs.python else python2;
7
8 # Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise
9 tarWrapper = runCommand "tarWrapper" {} ''
10 mkdir -p $out/bin
11
12 cat > $out/bin/tar <<EOF
13 #! ${stdenv.shell} -e
14 $(type -p tar) "\$@" --warning=no-unknown-keyword
15 EOF
16
17 chmod +x $out/bin/tar
18 '';
19
20 # Function that generates a TGZ file from a NPM project
21 buildNodeSourceDist =
22 { name, version, src, ... }:
23
24 stdenv.mkDerivation {
25 name = "node-tarball-${name}-${version}";
26 inherit src;
27 buildInputs = [ nodejs ];
28 buildPhase = ''
29 export HOME=$TMPDIR
30 tgzFile=$(npm pack | tail -n 1) # Hooks to the pack command will add output (https://docs.npmjs.com/misc/scripts)
31 '';
32 installPhase = ''
33 mkdir -p $out/tarballs
34 mv $tgzFile $out/tarballs
35 mkdir -p $out/nix-support
36 echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products
37 '';
38 };
39
40 includeDependencies = {dependencies}:
41 lib.optionalString (dependencies != [])
42 (lib.concatMapStrings (dependency:
43 ''
44 # Bundle the dependencies of the package
45 mkdir -p node_modules
46 cd node_modules
47
48 # Only include dependencies if they don't exist. They may also be bundled in the package.
49 if [ ! -e "${dependency.name}" ]
50 then
51 ${composePackage dependency}
52 fi
53
54 cd ..
55 ''
56 ) dependencies);
57
58 # Recursively composes the dependencies of a package
59 composePackage = { name, packageName, src, dependencies ? [], ... }@args:
60 ''
61 DIR=$(pwd)
62 cd $TMPDIR
63
64 unpackFile ${src}
65
66 # Make the base dir in which the target dependency resides first
67 mkdir -p "$(dirname "$DIR/${packageName}")"
68
69 if [ -f "${src}" ]
70 then
71 # Figure out what directory has been unpacked
72 packageDir="$(find . -maxdepth 1 -type d | tail -1)"
73
74 # Restore write permissions to make building work
75 find "$packageDir" -type d -print0 | xargs -0 chmod u+x
76 chmod -R u+w "$packageDir"
77
78 # Move the extracted tarball into the output folder
79 mv "$packageDir" "$DIR/${packageName}"
80 elif [ -d "${src}" ]
81 then
82 # Get a stripped name (without hash) of the source directory.
83 # On old nixpkgs it's already set internally.
84 if [ -z "$strippedName" ]
85 then
86 strippedName="$(stripHash ${src})"
87 fi
88
89 # Restore write permissions to make building work
90 chmod -R u+w "$strippedName"
91
92 # Move the extracted directory into the output folder
93 mv "$strippedName" "$DIR/${packageName}"
94 fi
95
96 # Unset the stripped name to not confuse the next unpack step
97 unset strippedName
98
99 # Include the dependencies of the package
100 cd "$DIR/${packageName}"
101 ${includeDependencies { inherit dependencies; }}
102 cd ..
103 ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
104 '';
105
106 pinpointDependencies = {dependencies, production}:
107 let
108 pinpointDependenciesFromPackageJSON = writeTextFile {
109 name = "pinpointDependencies.js";
110 text = ''
111 var fs = require('fs');
112 var path = require('path');
113
114 function resolveDependencyVersion(location, name) {
115 if(location == process.env['NIX_STORE']) {
116 return null;
117 } else {
118 var dependencyPackageJSON = path.join(location, "node_modules", name, "package.json");
119
120 if(fs.existsSync(dependencyPackageJSON)) {
121 var dependencyPackageObj = JSON.parse(fs.readFileSync(dependencyPackageJSON));
122
123 if(dependencyPackageObj.name == name) {
124 return dependencyPackageObj.version;
125 }
126 } else {
127 return resolveDependencyVersion(path.resolve(location, ".."), name);
128 }
129 }
130 }
131
132 function replaceDependencies(dependencies) {
133 if(typeof dependencies == "object" && dependencies !== null) {
134 for(var dependency in dependencies) {
135 var resolvedVersion = resolveDependencyVersion(process.cwd(), dependency);
136
137 if(resolvedVersion === null) {
138 process.stderr.write("WARNING: cannot pinpoint dependency: "+dependency+", context: "+process.cwd()+"\n");
139 } else {
140 dependencies[dependency] = resolvedVersion;
141 }
142 }
143 }
144 }
145
146 /* Read the package.json configuration */
147 var packageObj = JSON.parse(fs.readFileSync('./package.json'));
148
149 /* Pinpoint all dependencies */
150 replaceDependencies(packageObj.dependencies);
151 if(process.argv[2] == "development") {
152 replaceDependencies(packageObj.devDependencies);
153 }
154 replaceDependencies(packageObj.optionalDependencies);
155
156 /* Write the fixed package.json file */
157 fs.writeFileSync("package.json", JSON.stringify(packageObj, null, 2));
158 '';
159 };
160 in
161 ''
162 node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"}
163
164 ${lib.optionalString (dependencies != [])
165 ''
166 if [ -d node_modules ]
167 then
168 cd node_modules
169 ${lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
170 cd ..
171 fi
172 ''}
173 '';
174
175 # Recursively traverses all dependencies of a package and pinpoints all
176 # dependencies in the package.json file to the versions that are actually
177 # being used.
178
179 pinpointDependenciesOfPackage = { packageName, dependencies ? [], production ? true, ... }@args:
180 ''
181 if [ -d "${packageName}" ]
182 then
183 cd "${packageName}"
184 ${pinpointDependencies { inherit dependencies production; }}
185 cd ..
186 ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
187 fi
188 '';
189
190 # Extract the Node.js source code which is used to compile packages with
191 # native bindings
192 nodeSources = runCommand "node-sources" {} ''
193 tar --no-same-owner --no-same-permissions -xf ${nodejs.src}
194 mv node-* $out
195 '';
196
197 # Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty)
198 addIntegrityFieldsScript = writeTextFile {
199 name = "addintegrityfields.js";
200 text = ''
201 var fs = require('fs');
202 var path = require('path');
203
204 function augmentDependencies(baseDir, dependencies) {
205 for(var dependencyName in dependencies) {
206 var dependency = dependencies[dependencyName];
207
208 // Open package.json and augment metadata fields
209 var packageJSONDir = path.join(baseDir, "node_modules", dependencyName);
210 var packageJSONPath = path.join(packageJSONDir, "package.json");
211
212 if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored
213 console.log("Adding metadata fields to: "+packageJSONPath);
214 var packageObj = JSON.parse(fs.readFileSync(packageJSONPath));
215
216 if(dependency.integrity) {
217 packageObj["_integrity"] = dependency.integrity;
218 } else {
219 packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads.
220 }
221
222 packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories.
223 fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2));
224 }
225
226 // Augment transitive dependencies
227 if(dependency.dependencies !== undefined) {
228 augmentDependencies(packageJSONDir, dependency.dependencies);
229 }
230 }
231 }
232
233 if(fs.existsSync("./package-lock.json")) {
234 var packageLock = JSON.parse(fs.readFileSync("./package-lock.json"));
235
236 if(packageLock.lockfileVersion !== 1) {
237 process.stderr.write("Sorry, I only understand lock file version 1!\n");
238 process.exit(1);
239 }
240
241 if(packageLock.dependencies !== undefined) {
242 augmentDependencies(".", packageLock.dependencies);
243 }
244 }
245 '';
246 };
247
248 # Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes
249 reconstructPackageLock = writeTextFile {
250 name = "addintegrityfields.js";
251 text = ''
252 var fs = require('fs');
253 var path = require('path');
254
255 var packageObj = JSON.parse(fs.readFileSync("package.json"));
256
257 var lockObj = {
258 name: packageObj.name,
259 version: packageObj.version,
260 lockfileVersion: 1,
261 requires: true,
262 dependencies: {}
263 };
264
265 function augmentPackageJSON(filePath, dependencies) {
266 var packageJSON = path.join(filePath, "package.json");
267 if(fs.existsSync(packageJSON)) {
268 var packageObj = JSON.parse(fs.readFileSync(packageJSON));
269 dependencies[packageObj.name] = {
270 version: packageObj.version,
271 integrity: "sha1-000000000000000000000000000=",
272 dependencies: {}
273 };
274 processDependencies(path.join(filePath, "node_modules"), dependencies[packageObj.name].dependencies);
275 }
276 }
277
278 function processDependencies(dir, dependencies) {
279 if(fs.existsSync(dir)) {
280 var files = fs.readdirSync(dir);
281
282 files.forEach(function(entry) {
283 var filePath = path.join(dir, entry);
284 var stats = fs.statSync(filePath);
285
286 if(stats.isDirectory()) {
287 if(entry.substr(0, 1) == "@") {
288 // When we encounter a namespace folder, augment all packages belonging to the scope
289 var pkgFiles = fs.readdirSync(filePath);
290
291 pkgFiles.forEach(function(entry) {
292 if(stats.isDirectory()) {
293 var pkgFilePath = path.join(filePath, entry);
294 augmentPackageJSON(pkgFilePath, dependencies);
295 }
296 });
297 } else {
298 augmentPackageJSON(filePath, dependencies);
299 }
300 }
301 });
302 }
303 }
304
305 processDependencies("node_modules", lockObj.dependencies);
306
307 fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2));
308 '';
309 };
310
311 # Builds and composes an NPM package including all its dependencies
312 buildNodePackage =
313 { name
314 , packageName
315 , version
316 , dependencies ? []
317 , buildInputs ? []
318 , production ? true
319 , npmFlags ? ""
320 , dontNpmInstall ? false
321 , bypassCache ? false
322 , preRebuild ? ""
323 , dontStrip ? true
324 , unpackPhase ? "true"
325 , buildPhase ? "true"
326 , ... }@args:
327
328 let
329 forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
330 extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "preRebuild" "unpackPhase" "buildPhase" ];
331 in
332 stdenv.mkDerivation ({
333 name = "node-${name}-${version}";
334 buildInputs = [ tarWrapper python nodejs ]
335 ++ lib.optional (stdenv.isLinux) utillinux
336 ++ lib.optional (stdenv.isDarwin) libtool
337 ++ buildInputs;
338
339 inherit dontStrip; # Stripping may fail a build for some package deployments
340 inherit dontNpmInstall preRebuild unpackPhase buildPhase;
341
342 compositionScript = composePackage args;
343 pinpointDependenciesScript = pinpointDependenciesOfPackage args;
344
345 passAsFile = [ "compositionScript" "pinpointDependenciesScript" ];
346
347 installPhase = ''
348 # Create and enter a root node_modules/ folder
349 mkdir -p $out/lib/node_modules
350 cd $out/lib/node_modules
351
352 # Compose the package and all its dependencies
353 source $compositionScriptPath
354
355 # Pinpoint the versions of all dependencies to the ones that are actually being used
356 echo "pinpointing versions of dependencies..."
357 source $pinpointDependenciesScriptPath
358
359 # Patch the shebangs of the bundled modules to prevent them from
360 # calling executables outside the Nix store as much as possible
361 patchShebangs .
362
363 # Deploy the Node.js package by running npm install. Since the
364 # dependencies have been provided already by ourselves, it should not
365 # attempt to install them again, which is good, because we want to make
366 # it Nix's responsibility. If it needs to install any dependencies
367 # anyway (e.g. because the dependency parameters are
368 # incomplete/incorrect), it fails.
369 #
370 # The other responsibilities of NPM are kept -- version checks, build
371 # steps, postprocessing etc.
372
373 export HOME=$TMPDIR
374 cd "${packageName}"
375 runHook preRebuild
376
377 ${lib.optionalString bypassCache ''
378 if [ ! -f package-lock.json ]
379 then
380 echo "No package-lock.json file found, reconstructing..."
381 node ${reconstructPackageLock}
382 fi
383
384 node ${addIntegrityFieldsScript}
385 ''}
386
387 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} rebuild
388
389 if [ "$dontNpmInstall" != "1" ]
390 then
391 # NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
392 rm -f npm-shrinkwrap.json
393
394 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} install
395 fi
396
397 # Create symlink to the deployed executable folder, if applicable
398 if [ -d "$out/lib/node_modules/.bin" ]
399 then
400 ln -s $out/lib/node_modules/.bin $out/bin
401 fi
402
403 # Create symlinks to the deployed manual page folders, if applicable
404 if [ -d "$out/lib/node_modules/${packageName}/man" ]
405 then
406 mkdir -p $out/share
407 for dir in "$out/lib/node_modules/${packageName}/man/"*
408 do
409 mkdir -p $out/share/man/$(basename "$dir")
410 for page in "$dir"/*
411 do
412 ln -s $page $out/share/man/$(basename "$dir")
413 done
414 done
415 fi
416
417 # Run post install hook, if provided
418 runHook postInstall
419 '';
420 } // extraArgs);
421
422 # Builds a development shell
423 buildNodeShell =
424 { name
425 , packageName
426 , version
427 , src
428 , dependencies ? []
429 , buildInputs ? []
430 , production ? true
431 , npmFlags ? ""
432 , dontNpmInstall ? false
433 , bypassCache ? false
434 , dontStrip ? true
435 , unpackPhase ? "true"
436 , buildPhase ? "true"
437 , ... }@args:
438
439 let
440 forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
441
442 extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" ];
443
444 nodeDependencies = stdenv.mkDerivation ({
445 name = "node-dependencies-${name}-${version}";
446
447 buildInputs = [ tarWrapper python nodejs ]
448 ++ lib.optional (stdenv.isLinux) utillinux
449 ++ lib.optional (stdenv.isDarwin) libtool
450 ++ buildInputs;
451
452 inherit dontStrip; # Stripping may fail a build for some package deployments
453 inherit dontNpmInstall unpackPhase buildPhase;
454
455 includeScript = includeDependencies { inherit dependencies; };
456 pinpointDependenciesScript = pinpointDependenciesOfPackage args;
457
458 passAsFile = [ "includeScript" "pinpointDependenciesScript" ];
459
460 installPhase = ''
461 mkdir -p $out/${packageName}
462 cd $out/${packageName}
463
464 source $includeScriptPath
465
466 # Create fake package.json to make the npm commands work properly
467 cp ${src}/package.json .
468 chmod 644 package.json
469 ${lib.optionalString bypassCache ''
470 if [ -f ${src}/package-lock.json ]
471 then
472 cp ${src}/package-lock.json .
473 fi
474 ''}
475
476 # Pinpoint the versions of all dependencies to the ones that are actually being used
477 echo "pinpointing versions of dependencies..."
478 cd ..
479 ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
480
481 source $pinpointDependenciesScriptPath
482 cd ${packageName}
483
484 # Patch the shebangs of the bundled modules to prevent them from
485 # calling executables outside the Nix store as much as possible
486 patchShebangs .
487
488 export HOME=$PWD
489
490 ${lib.optionalString bypassCache ''
491 if [ ! -f package-lock.json ]
492 then
493 echo "No package-lock.json file found, reconstructing..."
494 node ${reconstructPackageLock}
495 fi
496
497 node ${addIntegrityFieldsScript}
498 ''}
499
500 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} rebuild
501
502 ${lib.optionalString (!dontNpmInstall) ''
503 # NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
504 rm -f npm-shrinkwrap.json
505
506 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} install
507 ''}
508
509 cd ..
510 ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
511
512 mv ${packageName} lib
513 ln -s $out/lib/node_modules/.bin $out/bin
514 '';
515 } // extraArgs);
516 in
517 stdenv.mkDerivation {
518 name = "node-shell-${name}-${version}";
519
520 buildInputs = [ python nodejs ] ++ lib.optional (stdenv.isLinux) utillinux ++ buildInputs;
521 buildCommand = ''
522 mkdir -p $out/bin
523 cat > $out/bin/shell <<EOF
524 #! ${stdenv.shell} -e
525 $shellHook
526 exec ${stdenv.shell}
527 EOF
528 chmod +x $out/bin/shell
529 '';
530
531 # Provide the dependencies in a development shell through the NODE_PATH environment variable
532 inherit nodeDependencies;
533 shellHook = lib.optionalString (dependencies != []) ''
534 export NODE_PATH=$nodeDependencies/lib/node_modules
535 '';
536 };
537in
538{
539 buildNodeSourceDist = lib.makeOverridable buildNodeSourceDist;
540 buildNodePackage = lib.makeOverridable buildNodePackage;
541 buildNodeShell = lib.makeOverridable buildNodeShell;
542}
diff --git a/flakes/mypackages/lib/private/default.nix b/flakes/mypackages/lib/private/default.nix
new file mode 100644
index 0000000..86dd840
--- /dev/null
+++ b/flakes/mypackages/lib/private/default.nix
@@ -0,0 +1,20 @@
1{ pkgs }:
2{
3 # This adds header colors to the builds, but it rebuilds the whole
4 # world from scratch, so only use it to debug!
5 # add it as postHook in derivations
6 immaePostHook = ''
7 header() {
8 echo -ne "\033[1;36m"
9 echo -n "$1"
10 echo -e "\033[0m"
11 }
12
13 echoCmd() {
14 printf "\033[1;34m%s:\033[0m" "$1"
15 shift
16 printf ' %q' "$@"
17 echo
18 }
19 '';
20}
diff --git a/flakes/mypackages/overlays/bitlbee-discord/default.nix b/flakes/mypackages/overlays/bitlbee-discord/default.nix
new file mode 100644
index 0000000..4227677
--- /dev/null
+++ b/flakes/mypackages/overlays/bitlbee-discord/default.nix
@@ -0,0 +1,12 @@
1self: super: {
2 bitlbee-discord = super.bitlbee-discord.overrideAttrs(old: rec {
3 version = "master";
4 name = "bitlbee-discord-${version}";
5 src = self.fetchFromGitHub {
6 rev = "607f9887ca85f246e970778e3d40aa5c346365a7";
7 owner = "sm00th";
8 repo = "bitlbee-discord";
9 sha256 = "0jkwhx2walx2ay0vc9x13q0j1qq4r5x30ss03a3j7ks28xvsnxc7";
10 };
11 });
12}
diff --git a/overlays/bitlbee/bitlbee_long_nicks.patch b/flakes/mypackages/overlays/bitlbee/bitlbee_long_nicks.patch
index 70be092..70be092 100644
--- a/overlays/bitlbee/bitlbee_long_nicks.patch
+++ b/flakes/mypackages/overlays/bitlbee/bitlbee_long_nicks.patch
diff --git a/overlays/bitlbee/default.nix b/flakes/mypackages/overlays/bitlbee/default.nix
index 5183d01..5183d01 100644
--- a/overlays/bitlbee/default.nix
+++ b/flakes/mypackages/overlays/bitlbee/default.nix
diff --git a/flakes/mypackages/overlays/databases/mysql/default.nix b/flakes/mypackages/overlays/databases/mysql/default.nix
new file mode 100644
index 0000000..45dc468
--- /dev/null
+++ b/flakes/mypackages/overlays/databases/mysql/default.nix
@@ -0,0 +1,28 @@
1self: super: rec {
2 #mariadb = super.mariadb_106.overrideAttrs(old: {
3 # passthru = old.passthru // { mysqlVersion = "5.7"; };
4 #});
5 #mariadb_pam = super.mariadb_106.overrideAttrs(old: {
6 # cmakeFlags = old.cmakeFlags ++ [ "-DWITH_AUTHENTICATION_PAM=ON" ];
7 # buildInputs = old.buildInputs ++ [ self.pam ];
8 # outputs = old.outputs ++ [ "dev" ];
9 # passthru = old.passthru // { mysqlVersion = "5.7"; };
10 # postInstall = ''
11 # mkdir -p $dev $dev/lib $dev/share
12 # cp -a $out/include $dev
13 # cp -a $out/lib/{libmariadbclient.a,libmysqlclient.a,libmysqlclient_r.a,libmysqlservices.a} $dev/lib
14 # cp -a $out/lib/pkgconfig $dev/lib
15 # cp -a $out/share/aclocal $dev/share
16 # '' + old.postInstall;
17 #});
18 ## This patched version includes C headers from the server part (see
19 ## above). It seems to be required to build pam support in clients.
20 #libmysqlclient_pam = super.libmysqlclient.overrideAttrs(old: {
21 # prePatch = old.prePatch or "" + ''
22 # 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
23 # '';
24 # postInstall = old.postInstall or "" + ''
25 # cp -a ${mariadb_pam.dev}/include/* $out/include/mariadb
26 # '';
27 #});
28}
diff --git a/overlays/databases/postgresql/default.nix b/flakes/mypackages/overlays/databases/postgresql/default.nix
index 9ada29c..9ada29c 100644
--- a/overlays/databases/postgresql/default.nix
+++ b/flakes/mypackages/overlays/databases/postgresql/default.nix
diff --git a/flakes/mypackages/overlays/default.nix b/flakes/mypackages/overlays/default.nix
new file mode 100644
index 0000000..e91d6a1
--- /dev/null
+++ b/flakes/mypackages/overlays/default.nix
@@ -0,0 +1,25 @@
1{ sources, mylibs }:
2{
3 mylibs = self: super: { inherit mylibs; };
4 mypkgs = final: prev: import ../pkgs/default.nix { pkgs = final; inherit mylibs sources; };
5
6 bitlbee = import ./bitlbee;
7 bitlbee-discord = import ./bitlbee-discord;
8 gitweb = import ./gitweb;
9 gitolite = import ./gitolite;
10 goaccess = import ./goaccess;
11 kanboard = import ./kanboard;
12 mysql = import ./databases/mysql;
13 postfix = import ./postfix;
14 postgresql = import ./databases/postgresql;
15 ympd = import ./ympd;
16 morph = import ./morph;
17 cron = self: super: {
18 cron = super.cron.overrideAttrs(old: {
19 # Allow "+" char in MAILTO
20 patchPhase = ''
21 sed -i -e "/static const char safe_delim/s/@/@+/" do_command.c
22 '';
23 });
24 };
25}
diff --git a/overlays/gitolite/default.nix b/flakes/mypackages/overlays/gitolite/default.nix
index 7f8f007..7f8f007 100644
--- a/overlays/gitolite/default.nix
+++ b/flakes/mypackages/overlays/gitolite/default.nix
diff --git a/overlays/gitolite/invite b/flakes/mypackages/overlays/gitolite/invite
index 3cc2dbd..3cc2dbd 100755
--- a/overlays/gitolite/invite
+++ b/flakes/mypackages/overlays/gitolite/invite
diff --git a/overlays/gitweb/default.nix b/flakes/mypackages/overlays/gitweb/default.nix
index 27a1152..27a1152 100644
--- a/overlays/gitweb/default.nix
+++ b/flakes/mypackages/overlays/gitweb/default.nix
diff --git a/overlays/gitweb/theme/git-favicon.png b/flakes/mypackages/overlays/gitweb/theme/git-favicon.png
index 4fa44bb..4fa44bb 100644
--- a/overlays/gitweb/theme/git-favicon.png
+++ b/flakes/mypackages/overlays/gitweb/theme/git-favicon.png
Binary files differ
diff --git a/overlays/gitweb/theme/git-logo.png b/flakes/mypackages/overlays/gitweb/theme/git-logo.png
index fdaf7b7..fdaf7b7 100644
--- a/overlays/gitweb/theme/git-logo.png
+++ b/flakes/mypackages/overlays/gitweb/theme/git-logo.png
Binary files differ
diff --git a/overlays/gitweb/theme/gitweb.css b/flakes/mypackages/overlays/gitweb/theme/gitweb.css
index 83e0742..83e0742 100644
--- a/overlays/gitweb/theme/gitweb.css
+++ b/flakes/mypackages/overlays/gitweb/theme/gitweb.css
diff --git a/overlays/gitweb/theme/gitweb.js b/flakes/mypackages/overlays/gitweb/theme/gitweb.js
index 72f3cfa..72f3cfa 100644
--- a/overlays/gitweb/theme/gitweb.js
+++ b/flakes/mypackages/overlays/gitweb/theme/gitweb.js
diff --git a/overlays/goaccess/default.nix b/flakes/mypackages/overlays/goaccess/default.nix
index 6b9758b..6b9758b 100644
--- a/overlays/goaccess/default.nix
+++ b/flakes/mypackages/overlays/goaccess/default.nix
diff --git a/flakes/mypackages/overlays/kanboard/default.nix b/flakes/mypackages/overlays/kanboard/default.nix
new file mode 100644
index 0000000..2a0d41b
--- /dev/null
+++ b/flakes/mypackages/overlays/kanboard/default.nix
@@ -0,0 +1,19 @@
1self: super: {
2 kanboard = self.stdenv.mkDerivation rec {
3 name = "kanboard-${version}";
4 version = "1.2.21";
5 src = self.fetchFromGitHub {
6 owner = "kanboard";
7 repo = "kanboard";
8 rev = "ee18479b7e019e6415d7b095da629932ee1b3fd5";
9 sha256 = "00pnpq5qgxpb2f9la58ycvx5kx3pmcvpssh6lwgpcdk04yciw8nh";
10 };
11
12 dontBuild = true;
13
14 installPhase = ''
15 cp -a . $out
16 mv $out/data $out/dataold
17 '';
18 };
19}
diff --git a/flakes/mypackages/overlays/morph/default.nix b/flakes/mypackages/overlays/morph/default.nix
new file mode 100644
index 0000000..b316d70
--- /dev/null
+++ b/flakes/mypackages/overlays/morph/default.nix
@@ -0,0 +1,27 @@
1self: super: {
2 morph = super.morph.overrideAttrs(old: rec {
3 version = "1.6.0-30-g5b85237";
4 src = self.fetchFromGitHub {
5 owner = "dbcdk";
6 repo = "morph";
7 rev = "5b852370d8054a895b5ba79b5ef017c3afbb3a3c";
8 sha256 = "166dwibbpb90bdy8dvhlinh6gc509f8pq8wn345h01pilf7fc8fh";
9 };
10
11 ldflags = [
12 "-X main.version=${version}"
13 ];
14 preBuild = ''
15 ldflags+=" -X main.assetRoot=$lib"
16 '';
17 postInstall = ''
18 mkdir -p $lib
19 cp -v ./data/*.nix $lib
20 '';
21
22 outputs = [ "out" "lib" ];
23 vendorSha256 = "08zzp0h4c4i5hk4whz06a3da7qjms6lr36596vxz0d8q0n7rspr9";
24
25 patches = (old.patches or []) ++ [ ./dry-run.patch ];
26 });
27}
diff --git a/overlays/morph/dry-run.patch b/flakes/mypackages/overlays/morph/dry-run.patch
index 2ff099e..2ff099e 100644
--- a/overlays/morph/dry-run.patch
+++ b/flakes/mypackages/overlays/morph/dry-run.patch
diff --git a/overlays/morph/verbose_nix.patch b/flakes/mypackages/overlays/morph/verbose_nix.patch
index 389a79c..389a79c 100644
--- a/overlays/morph/verbose_nix.patch
+++ b/flakes/mypackages/overlays/morph/verbose_nix.patch
diff --git a/overlays/php-packages/mysqli_patch.patch b/flakes/mypackages/overlays/php-packages/mysqli_patch.patch
index a8f03e3..a8f03e3 100644
--- a/overlays/php-packages/mysqli_patch.patch
+++ b/flakes/mypackages/overlays/php-packages/mysqli_patch.patch
diff --git a/overlays/postfix/default.nix b/flakes/mypackages/overlays/postfix/default.nix
index c77e4cf..c77e4cf 100644
--- a/overlays/postfix/default.nix
+++ b/flakes/mypackages/overlays/postfix/default.nix
diff --git a/overlays/taskwarrior/TW-1778_patch.diff b/flakes/mypackages/overlays/taskwarrior/TW-1778_patch.diff
index 6d7e376..6d7e376 100644
--- a/overlays/taskwarrior/TW-1778_patch.diff
+++ b/flakes/mypackages/overlays/taskwarrior/TW-1778_patch.diff
diff --git a/overlays/taskwarrior/default.nix b/flakes/mypackages/overlays/taskwarrior/default.nix
index 9ca52b8..9ca52b8 100644
--- a/overlays/taskwarrior/default.nix
+++ b/flakes/mypackages/overlays/taskwarrior/default.nix
diff --git a/flakes/mypackages/overlays/ympd/default.nix b/flakes/mypackages/overlays/ympd/default.nix
new file mode 100644
index 0000000..648403f
--- /dev/null
+++ b/flakes/mypackages/overlays/ympd/default.nix
@@ -0,0 +1,14 @@
1self: super: {
2 ympd = super.ympd.overrideAttrs(old: {
3 pname = "ympd";
4 version = "612f8fc-master";
5 src = self.fetchFromGitHub {
6 owner = "notandy";
7 repo = "ympd";
8 rev = "612f8fc0b2c47fc89d403e4a044541c6b2b238c8";
9 sha256 = "01hnj10zl103mrn82vyd42fvq7w5az3jf1qz18889zv67kn73ll9";
10 fetchSubmodules = true;
11 };
12 patches = (old.patches or []) ++ [ ./ympd-password-env.patch ];
13 });
14}
diff --git a/overlays/ympd/ympd-password-env.patch b/flakes/mypackages/overlays/ympd/ympd-password-env.patch
index 2bbe188..2bbe188 100644
--- a/overlays/ympd/ympd-password-env.patch
+++ b/flakes/mypackages/overlays/ympd/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
index 0000000..991c9d2
--- /dev/null
+++ b/flakes/mypackages/pkgs/bash-libs/default.nix
@@ -0,0 +1,33 @@
1{ lib, stdenv, fetchFromGitHub, makeWrapper, shellcheck, bashInteractive, coreutils, gnugrep, gawk, file, aspell, util-linux, gnused }:
2stdenv.mkDerivation {
3 pname = "bash-libs";
4 version = "master";
5 src = fetchFromGitHub {
6 owner = "foopgp";
7 repo = "bash-libs";
8 rev = "4bf7fe3a488f55beecc74b76e0daf24244bd824f";
9 sha256 = "sha256-8AHUXPd1dQpo1Ce9MT4++eFhJT3X8SYtgaIKbPFUYjM=";
10 };
11
12 buildInputs = [ shellcheck makeWrapper bashInteractive ];
13 phases = [ "checkPhase" "installPhase" ];
14 checkPhase = ''
15 shellcheck bin/*
16 '';
17 installPhase =
18 let binPath = lib.makeBinPath [
19 coreutils file aspell util-linux gnused gnugrep gawk
20 ];
21 in ''
22 mkdir -p $out/bin $out/nix-support $out/share/doc/bash-libs $out/share/bash-libs/include
23
24 for i in $src/bin/*; do
25 name=$(basename $i)
26 cp "$i" $out/share/bash-libs/include
27 patchShebangs $out/share/bash-libs/include/$name
28 makeWrapper $out/share/bash-libs/include/$name $out/bin/$name --set PATH ${binPath}
29 done
30 echo "${binPath}" > $out/nix-support/propagated-build-inputs
31 cp $src/man/* $out/share/doc/bash-libs
32 '';
33}
diff --git a/flakes/mypackages/pkgs/boinctui/default.nix b/flakes/mypackages/pkgs/boinctui/default.nix
new file mode 100644
index 0000000..565840c
--- /dev/null
+++ b/flakes/mypackages/pkgs/boinctui/default.nix
@@ -0,0 +1,21 @@
1{ stdenv, fetchurl, expat, openssl, autoconf269, ncurses }:
2stdenv.mkDerivation rec {
3 name = "boinctui-${version}";
4 version = "2.6.0";
5 src = fetchurl {
6 url = "http://sourceforge.net/projects/boinctui/files/boinctui_${version}.tar.gz";
7 sha256 = "1c6hc4x28z8hjncxcwxhb0r3980f72i6480569a0hd9y7vcgf3d0";
8 };
9
10 configureFlags = [ "--without-gnutls" ];
11 preConfigure = ''
12 autoconf
13 '';
14
15 makeFlags = [ "DESTDIR=$(out)" ];
16 preBuild = ''
17 sed -i -e 's/"HOME"/"XDG_CONFIG_HOME"/' src/cfg.cpp
18 sed -i -e 's@\.boinctui\.cfg@boinctui/boinctui.cfg@' src/mainprog.cpp
19 '';
20 buildInputs = [ expat openssl autoconf269 ncurses ];
21}
diff --git a/flakes/mypackages/pkgs/cnagios/default.nix b/flakes/mypackages/pkgs/cnagios/default.nix
new file mode 100644
index 0000000..2b8b0da
--- /dev/null
+++ b/flakes/mypackages/pkgs/cnagios/default.nix
@@ -0,0 +1,32 @@
1{ stdenv, fetchFromGitHub, perl, ncurses }:
2stdenv.mkDerivation (rec {
3 version = "3bd27fb-master";
4 pname = "cnagios";
5 name = "${pname}-${version}";
6 src = fetchFromGitHub {
7 owner = "dannywarren";
8 repo = "cnagios";
9 rev = "3bd27fb40e68f61ffd01bea6234b919a667b6fe4";
10 sha256 = "0iy5pmlcz6y3if72nav22xqxniiv1v8ywi0927m6s459hkw5n2rb";
11 fetchSubmodules = true;
12 };
13 configureFlags = [
14 "--with-etc-dir=/etc/cnagios"
15 "--with-var-dir=/var/lib/naemon"
16 "--with-status-file=/var/lib/naemon/status.dat"
17 "--with-nagios-data=4"
18 ];
19
20 prePatch = ''
21 sed -i -e "s/-lcurses/-lncurses/" Makefile.in
22 '';
23 installPhase = ''
24 install -dm755 $out/share/doc/cnagios
25 install -Dm644 cnagiosrc $out/share/doc/cnagios/
26 install -Dm644 cnagios.help $out/share/doc/cnagios/
27 install -Dm644 cnagios.pl $out/share/doc/cnagios/
28 install -dm755 $out/bin
29 install -Dm755 cnagios $out/bin/
30 '';
31 buildInputs = [ perl ncurses ];
32})
diff --git a/pkgs/commento/default.nix b/flakes/mypackages/pkgs/commento/default.nix
index 6361583..6361583 100644
--- a/pkgs/commento/default.nix
+++ b/flakes/mypackages/pkgs/commento/default.nix
diff --git a/flakes/mypackages/pkgs/composer-env/default.nix b/flakes/mypackages/pkgs/composer-env/default.nix
new file mode 100644
index 0000000..772ed73
--- /dev/null
+++ b/flakes/mypackages/pkgs/composer-env/default.nix
@@ -0,0 +1,243 @@
1# This file originates from composer2nix
2
3{ stdenv, lib, writeTextFile, fetchurl, php, unzip, composer ? php.packages.composer }:
4
5let
6 buildZipPackage = { name, src }:
7 stdenv.mkDerivation {
8 inherit name src;
9 buildInputs = [ unzip ];
10 buildCommand = ''
11 unzip $src
12 baseDir=$(find . -type d -mindepth 1 -maxdepth 1)
13 cd $baseDir
14 mkdir -p $out
15 mv * $out
16 '';
17 };
18
19 buildPackage =
20 { name
21 , src
22 , packages ? {}
23 , devPackages ? {}
24 , buildInputs ? []
25 , symlinkDependencies ? false
26 , executable ? false
27 , removeComposerArtifacts ? false
28 , postInstall ? ""
29 , preInstall ? ""
30 , noDev ? false
31 , unpackPhase ? "true"
32 , buildPhase ? "true"
33 , doRemoveVendor ? true
34 , ...}@args:
35
36 let
37 reconstructInstalled = writeTextFile {
38 name = "reconstructinstalled.php";
39 executable = true;
40 text = ''
41 #! ${php}/bin/php
42 <?php
43 if(file_exists($argv[1]))
44 {
45 $composerLockStr = file_get_contents($argv[1]);
46
47 if($composerLockStr === false)
48 {
49 fwrite(STDERR, "Cannot open composer.lock contents\n");
50 exit(1);
51 }
52 else
53 {
54 $config = json_decode($composerLockStr, true);
55
56 if(array_key_exists("packages", $config))
57 $allPackages = $config["packages"];
58 else
59 $allPackages = array();
60
61 ${lib.optionalString (!noDev) ''
62 if(array_key_exists("packages-dev", $config))
63 $allPackages = array_merge($allPackages, $config["packages-dev"]);
64 ''}
65
66 $packagesStr = json_encode($allPackages, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
67 print($packagesStr);
68 }
69 }
70 else
71 print("[]");
72 ?>
73 '';
74 };
75
76 constructBin = writeTextFile {
77 name = "constructbin.php";
78 executable = true;
79 text = ''
80 #! ${php}/bin/php
81 <?php
82 $composerJSONStr = file_get_contents($argv[1]);
83
84 if($composerJSONStr === false)
85 {
86 fwrite(STDERR, "Cannot open composer.json contents\n");
87 exit(1);
88 }
89 else
90 {
91 $config = json_decode($composerJSONStr, true);
92
93 if(array_key_exists("bin-dir", $config))
94 $binDir = $config["bin-dir"];
95 else
96 $binDir = "bin";
97
98 if(array_key_exists("bin", $config))
99 {
100 if(!file_exists("vendor/".$binDir))
101 mkdir("vendor/".$binDir);
102
103 foreach($config["bin"] as $bin)
104 symlink("../../".$bin, "vendor/".$binDir."/".basename($bin));
105 }
106 }
107 ?>
108 '';
109 };
110
111 bundleDependencies = dependencies:
112 lib.concatMapStrings (dependencyName:
113 let
114 dependency = dependencies.${dependencyName};
115 in
116 ''
117 ${if dependency.targetDir == "" then ''
118 vendorDir="$(dirname ${dependencyName})"
119 mkdir -p "$vendorDir"
120 ${if symlinkDependencies then
121 ''ln -s "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"''
122 else
123 ''cp -a "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"''
124 }${if dependency.needsModifyRights or false then "\n" + ''
125 chmod -R u+rwx "$vendorDir/$(basename "${dependencyName}")"
126 '' else ""}
127 '' else ''
128 namespaceDir="${dependencyName}/$(dirname "${dependency.targetDir}")"
129 mkdir -p "$namespaceDir"
130 ${if symlinkDependencies then
131 ''ln -s "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"''
132 else
133 ''cp -a "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"''
134 }${if dependency.needsModifyRights or false then "\n" + ''
135 chmod -R u+rwx "$namespaceDir/$(basename "${dependency.targetDir}")"
136 '' else ""}
137 ''}
138 '') (builtins.attrNames dependencies);
139
140 extraArgs = removeAttrs args [ "name" "packages" "devPackages" "buildInputs" ];
141 in
142 stdenv.mkDerivation ({
143 name = "composer-${name}";
144 buildInputs = [ php composer ] ++ buildInputs;
145
146 inherit unpackPhase buildPhase;
147
148 installPhase = ''
149 ${if executable then ''
150 mkdir -p $out/share/php
151 cp -a $src $out/share/php/$name
152 chmod -R u+w $out/share/php/$name
153 cd $out/share/php/$name
154 '' else ''
155 cp -a $src $out
156 chmod -R u+w $out
157 cd $out
158 ''}
159
160 # Execute pre install hook
161 runHook preInstall
162
163 # Remove unwanted files
164 rm -f *.nix
165
166 export HOME=$TMPDIR
167
168 ${if doRemoveVendor then ''
169 # Remove the provided vendor folder if it exists
170 rm -Rf vendor
171 '' else ""}
172 # If there is no composer.lock file, compose a dummy file.
173 # Otherwise, composer attempts to download the package.json file from
174 # the registry which we do not want.
175 if [ ! -f composer.lock ]
176 then
177 cat > composer.lock <<EOF
178 {
179 "packages": []
180 }
181 EOF
182 fi
183
184 # Reconstruct the installed.json file from the lock file
185 mkdir -p vendor/composer
186 ${reconstructInstalled} composer.lock > vendor/composer/installed.json
187
188 # Copy or symlink the provided dependencies
189 cd vendor
190 ${bundleDependencies packages}
191 ${lib.optionalString (!noDev) (bundleDependencies devPackages)}
192 cd ..
193
194 # Reconstruct autoload scripts
195 # We use the optimize feature because Nix packages cannot change after they have been built
196 # Using the dynamic loader for a Nix package is useless since there is nothing to dynamically reload.
197 composer dump-autoload --optimize ${lib.optionalString noDev "--no-dev"}
198
199 # Run the install step as a validation to confirm that everything works out as expected
200 composer install --optimize-autoloader ${lib.optionalString noDev "--no-dev"}
201
202 ${lib.optionalString executable ''
203 # Reconstruct the bin/ folder if we deploy an executable project
204 ${constructBin} composer.json
205 ln -s $(pwd)/vendor/bin $out/bin
206 ''}
207
208 ${lib.optionalString (!symlinkDependencies) ''
209 # Patch the shebangs if possible
210 if [ -d $(pwd)/vendor/bin ]
211 then
212 # Look for all executables in bin/
213 for i in $(pwd)/vendor/bin/*
214 do
215 # Look for their location
216 realFile=$(readlink -f "$i")
217
218 # Restore write permissions
219 chmod u+wx "$(dirname "$realFile")"
220 chmod u+w "$realFile"
221
222 # Patch shebang
223 sed -e "s|#!/usr/bin/php|#!${php}/bin/php|" \
224 -e "s|#!/usr/bin/env php|#!${php}/bin/php|" \
225 "$realFile" > tmp
226 mv tmp "$realFile"
227 chmod u+x "$realFile"
228 done
229 fi
230 ''}
231
232 if [ "$removeComposerArtifacts" = "1" ]
233 then
234 # Remove composer stuff
235 rm -f composer.json composer.lock
236 fi
237
238 # Execute post install hook
239 runHook postInstall
240 '';
241 } // extraArgs);
242in
243{ inherit composer buildZipPackage buildPackage; }
diff --git a/pkgs/crypto/cardano-cli/default.nix b/flakes/mypackages/pkgs/crypto/cardano-cli/default.nix
index 3cd5a4c..3cd5a4c 100644
--- a/pkgs/crypto/cardano-cli/default.nix
+++ b/flakes/mypackages/pkgs/crypto/cardano-cli/default.nix
diff --git a/flakes/mypackages/pkgs/crypto/cardano/default.nix b/flakes/mypackages/pkgs/crypto/cardano/default.nix
new file mode 100644
index 0000000..8e3c83f
--- /dev/null
+++ b/flakes/mypackages/pkgs/crypto/cardano/default.nix
@@ -0,0 +1,35 @@
1{ stdenv, fetchFromGitHub }:
2let
3 src = fetchFromGitHub {
4 owner = "input-output-hk";
5 repo = "daedalus";
6 rev = "998fd3189c9a54fac496dfef7a6224714c67bc80";
7 sha256 = "1r3gwfv6hn7lzp4h2s6849m7x12nxadsql358ss615krvdlnb6rr";
8 fetchSubmodules = true;
9 };
10 daedalusOrig = (import src {}).daedalus;
11 cfg = stdenv.mkDerivation rec {
12 name = "launcher-config-custom";
13 buildInputs = [ src daedalusOrig.cfg ];
14 src = daedalusOrig.cfg;
15 installPhase = ''
16 cp -a $src $out
17 chmod -R u+w $out
18 cd $out/etc
19 sed -e "/^walletPath/d" -e "/^walletArgs/d" launcher-config.yaml > launcher-config-server-only.yaml
20 '';
21 };
22in
23stdenv.mkDerivation rec {
24 name = "daedalus-custom";
25 src = daedalusOrig;
26 buildInputs = [ cfg daedalusOrig ];
27 installPhase = ''
28 cp -a $src $out
29 chmod -R u+w $out
30 cd $out/bin
31 sed -i -e "s@${builtins.storeDir}/[0-9a-z]*-daedalus-config@${cfg}/etc@" daedalus
32 sed -e "s@${cfg}/etc/launcher-config.yaml@${cfg}/etc/launcher-config-server-only.yaml@" daedalus > daedalus-server-only
33 chmod a+x daedalus-server-only
34 '';
35}
diff --git a/flakes/mypackages/pkgs/crypto/iota-cli-app/default.nix b/flakes/mypackages/pkgs/crypto/iota-cli-app/default.nix
new file mode 100644
index 0000000..e386489
--- /dev/null
+++ b/flakes/mypackages/pkgs/crypto/iota-cli-app/default.nix
@@ -0,0 +1,29 @@
1{ stdenv, mylibs, fetchFromGitHub, fetchurl, fetchgit, callPackage, nodePackages, nodejs-10_x }:
2let
3 nodeEnv = callPackage mylibs.nodeEnv { nodejs = nodejs-10_x; };
4 # built using node2nix -8 -l package-lock.json
5 # and changing "./." to "src"
6 packageEnv = import ./node-packages.nix {
7 src = stdenv.mkDerivation ({
8 pname = "iota-cli-app";
9 version = "d7e2e08-master";
10 src = fetchFromGitHub {
11 owner = "iotaledger";
12 repo = "cli-app";
13 rev = "d7e2e0856ae6bd34890fefb4245c07cd467a5032";
14 sha256 = "1n9kczsxdgjv8282nj2grlijvxipiskx0ndn169vz6v1l1hrwc8b";
15 fetchSubmodules = true;
16 };
17 phases = "installPhase";
18 installPhase = ''
19 cp -a $src $out
20 chmod u+w -R $out
21 cd $out
22 sed -i -e "s@host: 'http://localhost',@host: 'https://nodes.thetangle.org',@" index.js
23 sed -i -e "s@port: 14265@port: 443@" index.js
24 '';
25 });
26 inherit fetchurl fetchgit nodeEnv;
27 };
28in
29packageEnv.package
diff --git a/pkgs/crypto/iota-cli-app/node-packages.nix b/flakes/mypackages/pkgs/crypto/iota-cli-app/node-packages.nix
index d5c61d6..d5c61d6 100644
--- a/pkgs/crypto/iota-cli-app/node-packages.nix
+++ b/flakes/mypackages/pkgs/crypto/iota-cli-app/node-packages.nix
diff --git a/pkgs/crypto/sia/default.nix b/flakes/mypackages/pkgs/crypto/sia/default.nix
index 27e4014..27e4014 100644
--- a/pkgs/crypto/sia/default.nix
+++ b/flakes/mypackages/pkgs/crypto/sia/default.nix
diff --git a/flakes/mypackages/pkgs/default.nix b/flakes/mypackages/pkgs/default.nix
new file mode 100644
index 0000000..cd6b1a1
--- /dev/null
+++ b/flakes/mypackages/pkgs/default.nix
@@ -0,0 +1,64 @@
1{ pkgs, mylibs, sources }:
2let
3 inherit (pkgs) callPackage python2Packages python38Packages python38;
4 composerEnv = callPackage ./composer-env {};
5 webapps = import ./webapps { inherit callPackage mylibs composerEnv sources; };
6in
7rec {
8 bash-libs = callPackage ./bash-libs {};
9 boinctui = callPackage ./boinctui {};
10 cnagios = callPackage ./cnagios {};
11 commento = callPackage ./commento {};
12 flrn = callPackage ./flrn { slang = callPackage ./slang_1 {}; };
13 fluentd = callPackage ./fluentd {};
14 fluent-bit = callPackage ./fluent-bit {};
15 genius = callPackage ./genius {};
16 ical2html = callPackage ./ical2html {};
17 mtop = callPackage ./mtop {};
18 muttprint = callPackage ./muttprint {};
19 mutt-ics = callPackage ./mutt-ics {};
20 nagios-cli = callPackage ./nagios-cli {};
21 nagnu = callPackage ./nagnu {};
22 nb = callPackage ./nb {};
23 note = callPackage ./note {};
24 notmuch-python2 = callPackage ./notmuch/notmuch-python { pythonPackages = python2Packages; };
25 notmuch-python3 = callPackage ./notmuch/notmuch-python { pythonPackages = python38Packages; };
26 notmuch-vim = callPackage ./notmuch/notmuch-vim {};
27 perl-ical-parser-html = callPackage ./perl-ical-parser-html {};
28 pgpid = callPackage ./pgpid { inherit bash-libs; };
29 predixy = callPackage ./predixy {};
30 riotkit-do = callPackage ./riotkit-do {};
31 rrsync_sudo = callPackage ./rrsync_sudo {};
32 signaldctl = callPackage ./signaldctl {};
33 telegram-history-dump = callPackage ./telegram-history-dump {};
34 telegramircd = callPackage ./telegramircd { telethon = callPackage ./telethon_sync {}; };
35 terminal-velocity = callPackage ./terminal-velocity {};
36 tiv = callPackage ./tiv {};
37 twins = callPackage ./twins {};
38 upcmd = callPackage ./upcmd {};
39 umami = callPackage ./umami {};
40 unicodeDoc = callPackage ./unicode {};
41 shaarli = callPackage ./shaarli {};
42
43 cardano = callPackage ./crypto/cardano {};
44 cardano-cli = callPackage ./crypto/cardano-cli {};
45 iota-cli-app = callPackage ./crypto/iota-cli-app { inherit mylibs; };
46 sia = callPackage ./crypto/sia {};
47
48 proftpd = callPackage ./proftpd {};
49 pure-ftpd = callPackage ./pure-ftpd {};
50
51 inherit composerEnv;
52
53 monitoring-plugins = callPackage ./monitoring-plugins {};
54 naemon = callPackage ./naemon { inherit monitoring-plugins; };
55 naemon-livestatus = callPackage ./naemon-livestatus { inherit naemon; };
56 gearmand = callPackage ./gearmand {};
57 status-engine-module = callPackage ./status_engine/module.nix { inherit gearmand; };
58 status-engine-worker = callPackage ./status_engine/worker.nix { inherit composerEnv gearmand; };
59 status-engine-interface = callPackage ./status_engine/interface.nix { inherit composerEnv; };
60
61 dovecot_deleted-to-trash = callPackage ./dovecot/plugins/deleted_to_trash {};
62}
63# lib.mapAttrs' produces infinite recursion
64// (builtins.listToAttrs (builtins.map (n: { name = "webapps-${n}"; value = webapps."${n}"; }) (builtins.attrNames webapps)))
diff --git a/flakes/mypackages/pkgs/dovecot/plugins/deleted_to_trash/default.nix b/flakes/mypackages/pkgs/dovecot/plugins/deleted_to_trash/default.nix
new file mode 100644
index 0000000..f270032
--- /dev/null
+++ b/flakes/mypackages/pkgs/dovecot/plugins/deleted_to_trash/default.nix
@@ -0,0 +1,30 @@
1{ stdenv, fetchurl, dovecot, fetchFromGitHub, fetchpatch }:
2
3stdenv.mkDerivation ({
4 pname = "dovecot-deleted_to_trash";
5 version = "81b0754-master";
6 src = fetchFromGitHub {
7 owner = "lexbrugman";
8 repo = "dovecot_deleted_to_trash";
9 rev = "81b07549accfc36467bf8527a53c295c7a02dbb9";
10 sha256 = "1b3k31g898s4fa0a9l4kvjsdyds772waaay84sjdxv09jw6mqs0f";
11 fetchSubmodules = true;
12 };
13 buildInputs = [ dovecot ];
14 patches = [
15 (fetchpatch {
16 name = "fix-dovecot-2.3.diff";
17 url = "https://github.com/lexbrugman/dovecot_deleted_to_trash/commit/c52a3799a96104a603ade33404ef6aa1db647b2f.diff";
18 sha256 = "0pld3rdcjp9df2qxbp807k6v4f48lyk0xy5q508ypa57d559y6dq";
19 })
20 ./fix_mbox.patch
21 ];
22 preConfigure = ''
23 substituteInPlace Makefile --replace \
24 "/usr/include/dovecot" \
25 "${dovecot}/include/dovecot"
26 substituteInPlace Makefile --replace \
27 "/usr/lib/dovecot/modules" \
28 "$out/lib/dovecot"
29 '';
30})
diff --git a/pkgs/dovecot/plugins/deleted_to_trash/fix_mbox.patch b/flakes/mypackages/pkgs/dovecot/plugins/deleted_to_trash/fix_mbox.patch
index 0060fb4..0060fb4 100644
--- a/pkgs/dovecot/plugins/deleted_to_trash/fix_mbox.patch
+++ b/flakes/mypackages/pkgs/dovecot/plugins/deleted_to_trash/fix_mbox.patch
diff --git a/flakes/mypackages/pkgs/flrn/default.nix b/flakes/mypackages/pkgs/flrn/default.nix
new file mode 100644
index 0000000..088654c
--- /dev/null
+++ b/flakes/mypackages/pkgs/flrn/default.nix
@@ -0,0 +1,22 @@
1{ stdenv, fetchFromGitHub, libetpan, openssl, autoconf, groff, slang, yacc }:
2stdenv.mkDerivation (rec {
3 version = "860d642-master";
4 pname = "flrn";
5 src = fetchFromGitHub {
6 owner = "Cigaes";
7 repo = "flrn";
8 rev = "860d642bd6389a209c8b697bd044f78d23406509";
9 sha256 = "0sqlxxpy1xg7cb2hbxcr0al46nyr6jjnns4b5i8w04z5sypa9r5c";
10 fetchSubmodules = true;
11 };
12 buildInputs = [ libetpan openssl autoconf groff slang yacc ];
13 preConfigure = ''
14 sed -i -e "s/test -e configure/false/" configure.in
15 autoconf
16 sed -i -e '/define CHECK_MAIL/d' src/flrn_config.h
17 sed -i -e '/DEFAULT_DIR_FILE/s@".flrn"@".config/flrn"@' src/flrn_config.h
18 sed -i -e '/DEFAULT_CONFIG_FILE/s@".flrnrc"@"flrnrc"@' src/flrn_config.h
19 sed -i -e '/DEFAULT_FLNEWS_FILE/s@".flnewsrc"@"flnewsrc"@' src/flrn_config.h
20 sed -i -e '/flrn_char chaine/s@18@20@' src/flrn_command.c
21 '';
22})
diff --git a/flakes/mypackages/pkgs/fluent-bit/default.nix b/flakes/mypackages/pkgs/fluent-bit/default.nix
new file mode 100644
index 0000000..390223e
--- /dev/null
+++ b/flakes/mypackages/pkgs/fluent-bit/default.nix
@@ -0,0 +1,47 @@
1{ lib, stdenv, fetchFromGitHub, cmake, flex, bison, pkg-config
2, systemd, openssl, postgresql }:
3
4stdenv.mkDerivation rec {
5 pname = "fluent-bit";
6 version = "1.8.3";
7
8 src = fetchFromGitHub {
9 owner = "fluent";
10 repo = "fluent-bit";
11 rev = "v${version}";
12 sha256 = "004x135imja67babmmpkk1jpp5xwhfa8cwg1svaas2asq6cnv77d";
13 };
14
15 nativeBuildInputs = [ cmake flex bison pkg-config postgresql ];
16
17 buildInputs = [ openssl ]
18 ++ lib.optionals stdenv.isLinux [ systemd ];
19
20 cmakeFlags = [ "-DFLB_METRICS=ON" "-DFLB_HTTP_SERVER=ON" "-DFLB_SQLDB=ON" "-DFLB_OUT_PGSQL=ON" "-DFLB_IN_SYSTEMD=ON" ];
21
22 patches = lib.optionals stdenv.isDarwin [ ./fix-luajit-darwin.patch ];
23
24 NIX_CFLAGS_COMPILE = lib.optionals stdenv.cc.isGNU [
25 # _FORTIFY_SOURCE requires compiling with optimization (-O)
26 "-O"
27 # Needed due to bundled mbedtls
28 "-Wno-error=format"
29 "-Wno-error=format-truncation"
30 ];
31
32
33 outputs = [ "out" "dev" ];
34
35 postPatch = ''
36 substituteInPlace src/CMakeLists.txt \
37 --replace /lib/systemd $out/lib/systemd
38 '';
39
40 meta = with lib; {
41 description = "Log forwarder and processor, part of Fluentd ecosystem";
42 homepage = "https://fluentbit.io";
43 maintainers = with maintainers; [ samrose fpletz ];
44 license = licenses.asl20;
45 platforms = platforms.unix;
46 };
47}
diff --git a/flakes/mypackages/pkgs/fluentd/Gemfile b/flakes/mypackages/pkgs/fluentd/Gemfile
new file mode 100644
index 0000000..71486df
--- /dev/null
+++ b/flakes/mypackages/pkgs/fluentd/Gemfile
@@ -0,0 +1,3 @@
1source "https://rubygems.org"
2
3gem 'fluentd'
diff --git a/flakes/mypackages/pkgs/fluentd/Gemfile.lock b/flakes/mypackages/pkgs/fluentd/Gemfile.lock
new file mode 100644
index 0000000..3f022cf
--- /dev/null
+++ b/flakes/mypackages/pkgs/fluentd/Gemfile.lock
@@ -0,0 +1,38 @@
1GEM
2 remote: https://rubygems.org/
3 specs:
4 concurrent-ruby (1.1.9)
5 cool.io (1.7.1)
6 fluentd (1.13.3)
7 bundler
8 cool.io (>= 1.4.5, < 2.0.0)
9 http_parser.rb (>= 0.5.1, < 0.8.0)
10 msgpack (>= 1.3.1, < 2.0.0)
11 serverengine (>= 2.2.2, < 3.0.0)
12 sigdump (~> 0.2.2)
13 strptime (>= 0.2.2, < 1.0.0)
14 tzinfo (>= 1.0, < 3.0)
15 tzinfo-data (~> 1.0)
16 webrick (>= 1.4.2, < 1.8.0)
17 yajl-ruby (~> 1.0)
18 http_parser.rb (0.7.0)
19 msgpack (1.4.2)
20 serverengine (2.2.4)
21 sigdump (~> 0.2.2)
22 sigdump (0.2.4)
23 strptime (0.2.5)
24 tzinfo (2.0.4)
25 concurrent-ruby (~> 1.0)
26 tzinfo-data (1.2021.1)
27 tzinfo (>= 1.0.0)
28 webrick (1.7.0)
29 yajl-ruby (1.4.1)
30
31PLATFORMS
32 x86_64-linux
33
34DEPENDENCIES
35 fluentd
36
37BUNDLED WITH
38 2.2.20
diff --git a/flakes/mypackages/pkgs/fluentd/default.nix b/flakes/mypackages/pkgs/fluentd/default.nix
new file mode 100644
index 0000000..f6a22f0
--- /dev/null
+++ b/flakes/mypackages/pkgs/fluentd/default.nix
@@ -0,0 +1,20 @@
1{ ruby, bundlerEnv, bundlerUpdateScript, lib }:
2
3bundlerEnv {
4 inherit ruby;
5
6 pname = "fluentd";
7 gemdir = ./.;
8
9 passthru.updateScript = bundlerUpdateScript "fluentd";
10
11 copyGemFiles = true;
12
13 meta = with lib; {
14 description = "A data collector";
15 homepage = "https://www.fluentd.org/";
16 license = licenses.asl20;
17 maintainers = with maintainers; [ offline nicknovitski ];
18 platforms = platforms.unix;
19 };
20}
diff --git a/flakes/mypackages/pkgs/fluentd/gemset.nix b/flakes/mypackages/pkgs/fluentd/gemset.nix
new file mode 100644
index 0000000..8ee42b6
--- /dev/null
+++ b/flakes/mypackages/pkgs/fluentd/gemset.nix
@@ -0,0 +1,126 @@
1{
2 concurrent-ruby = {
3 groups = ["default"];
4 platforms = [];
5 source = {
6 remotes = ["https://rubygems.org"];
7 sha256 = "0nwad3211p7yv9sda31jmbyw6sdafzmdi2i2niaz6f0wk5nq9h0f";
8 type = "gem";
9 };
10 version = "1.1.9";
11 };
12 "cool.io" = {
13 groups = ["default"];
14 platforms = [];
15 source = {
16 remotes = ["https://rubygems.org"];
17 sha256 = "0dfq4h168wzvs9cvn2mm8648ynkl936pgjva2p8ik34p6d620537";
18 type = "gem";
19 };
20 version = "1.7.1";
21 };
22 fluentd = {
23 dependencies = ["cool.io" "http_parser.rb" "msgpack" "serverengine" "sigdump" "strptime" "tzinfo" "tzinfo-data" "webrick" "yajl-ruby"];
24 groups = ["default"];
25 platforms = [];
26 source = {
27 remotes = ["https://rubygems.org"];
28 sha256 = "12k9b9903x5fi3lqb41h20qx8s0fwx7chjldbxmyi7j1x6xdm7cv";
29 type = "gem";
30 };
31 version = "1.13.3";
32 };
33 "http_parser.rb" = {
34 groups = ["default"];
35 platforms = [];
36 source = {
37 remotes = ["https://rubygems.org"];
38 sha256 = "1xha614fi6l04wryqjj1xmpalzlmhb6lb9qmlh8mmliycdhvcshp";
39 type = "gem";
40 };
41 version = "0.7.0";
42 };
43 msgpack = {
44 groups = ["default"];
45 platforms = [];
46 source = {
47 remotes = ["https://rubygems.org"];
48 sha256 = "06iajjyhx0rvpn4yr3h1hc4w4w3k59bdmfhxnjzzh76wsrdxxrc6";
49 type = "gem";
50 };
51 version = "1.4.2";
52 };
53 serverengine = {
54 dependencies = ["sigdump"];
55 groups = ["default"];
56 platforms = [];
57 source = {
58 remotes = ["https://rubygems.org"];
59 sha256 = "1gzhggx40a53mnv4f32xag4h6ai0s5m3w06s59b0h6ih7rqvwns9";
60 type = "gem";
61 };
62 version = "2.2.4";
63 };
64 sigdump = {
65 groups = ["default"];
66 platforms = [];
67 source = {
68 remotes = ["https://rubygems.org"];
69 sha256 = "1mqf06iw7rymv54y7rgbmfi6ppddgjjmxzi3hrw658n1amp1gwhb";
70 type = "gem";
71 };
72 version = "0.2.4";
73 };
74 strptime = {
75 groups = ["default"];
76 platforms = [];
77 source = {
78 remotes = ["https://rubygems.org"];
79 sha256 = "1ycs0xz58kymf7yp4h56f0nid2z7g3s18dj7pa3p790pfzzpgvcq";
80 type = "gem";
81 };
82 version = "0.2.5";
83 };
84 tzinfo = {
85 dependencies = ["concurrent-ruby"];
86 groups = ["default"];
87 platforms = [];
88 source = {
89 remotes = ["https://rubygems.org"];
90 sha256 = "10qp5x7f9hvlc0psv9gsfbxg4a7s0485wsbq1kljkxq94in91l4z";
91 type = "gem";
92 };
93 version = "2.0.4";
94 };
95 tzinfo-data = {
96 dependencies = ["tzinfo"];
97 groups = ["default"];
98 platforms = [];
99 source = {
100 remotes = ["https://rubygems.org"];
101 sha256 = "0ik16lnsyr2739jzwl4r5sz8q639lqw8f9s68iszwhm2pcq8p4w2";
102 type = "gem";
103 };
104 version = "1.2021.1";
105 };
106 webrick = {
107 groups = ["default"];
108 platforms = [];
109 source = {
110 remotes = ["https://rubygems.org"];
111 sha256 = "1d4cvgmxhfczxiq5fr534lmizkhigd15bsx5719r5ds7k7ivisc7";
112 type = "gem";
113 };
114 version = "1.7.0";
115 };
116 yajl-ruby = {
117 groups = ["default"];
118 platforms = [];
119 source = {
120 remotes = ["https://rubygems.org"];
121 sha256 = "16v0w5749qjp13xhjgr2gcsvjv6mf35br7iqwycix1n2h7kfcckf";
122 type = "gem";
123 };
124 version = "1.4.1";
125 };
126} \ No newline at end of file
diff --git a/flakes/mypackages/pkgs/gearmand/default.nix b/flakes/mypackages/pkgs/gearmand/default.nix
new file mode 100644
index 0000000..14ef8c2
--- /dev/null
+++ b/flakes/mypackages/pkgs/gearmand/default.nix
@@ -0,0 +1,16 @@
1{ stdenv, fetchurl, boost, gperf, libevent, libmysqlclient, libuuid, sqlite, hiredis, postgresql, openssl }:
2stdenv.mkDerivation rec {
3 pname = "gearmand";
4 version = "1.1.20";
5 src = fetchurl {
6 url = "https://github.com/gearman/${pname}/releases/download/${version}/${pname}-${version}.tar.gz";
7 sha256 = "sha256-L2D6IH3NcwWV75ap3DyomVZnB8gXYQazxj7PR+3BR6Y=";
8 };
9 buildInputs = [ boost gperf libevent openssl libmysqlclient libuuid sqlite hiredis postgresql ];
10 configureFlags = [
11 "--with-boost=${boost.dev}"
12 "--with-boost-libdir=${boost}/lib"
13 "--with-openssl=${openssl.dev}"
14 "--enable-ssl"
15 ];
16}
diff --git a/flakes/mypackages/pkgs/genius/default.nix b/flakes/mypackages/pkgs/genius/default.nix
new file mode 100644
index 0000000..54a7957
--- /dev/null
+++ b/flakes/mypackages/pkgs/genius/default.nix
@@ -0,0 +1,19 @@
1{ stdenv, fetchurl, mpfr, glib, hicolor-icon-theme, gtk2, intltool, gnome-doc-utils, python38, gnome2, autoconf, automake, libtool, ncurses, readline, pkg-config, }:
2stdenv.mkDerivation rec {
3 name = "genius-${version}";
4 version = "1.0.24";
5 src = fetchurl {
6 url = "https://download.gnome.org/sources/genius/1.0/${name}.tar.xz";
7 sha256 = "772f95f6ae4716d39bb180cd50e8b6b9b074107bee0cd083b825e1e6e55916b6";
8 };
9 buildInputs = [
10 mpfr glib hicolor-icon-theme gtk2 intltool gnome-doc-utils python38 gnome2.gtksourceview
11 autoconf automake libtool ncurses readline pkg-config
12 ];
13 preConfigure = ''
14 autoreconf -fi
15 '';
16 preBuild = ''
17 sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool
18 '';
19}
diff --git a/flakes/mypackages/pkgs/ical2html/default.nix b/flakes/mypackages/pkgs/ical2html/default.nix
new file mode 100644
index 0000000..62e0b95
--- /dev/null
+++ b/flakes/mypackages/pkgs/ical2html/default.nix
@@ -0,0 +1,11 @@
1{ stdenv, fetchurl, libical }:
2stdenv.mkDerivation rec {
3 pname = "ical2html";
4 version = "3.0";
5 src= fetchurl {
6 url = "https://www.w3.org/Tools/Ical2html/${pname}-${version}.tar.gz";
7 sha256 = "sha256-1QhE04cmohhPgZ3I8jz28Z7ZnSJkH2aPnRse5/pReEA=";
8 };
9 buildInputs = [ libical ];
10
11}
diff --git a/flakes/mypackages/pkgs/monitoring-plugins/default.nix b/flakes/mypackages/pkgs/monitoring-plugins/default.nix
new file mode 100644
index 0000000..b09d7a4
--- /dev/null
+++ b/flakes/mypackages/pkgs/monitoring-plugins/default.nix
@@ -0,0 +1,33 @@
1{ stdenv, iputils, fetchpatch, fetchurl, file, hostname, perl, openssl,
2 bind, openldap, procps, postfix,
3 wrapperDir ? "/run/wrappers/bin"
4}:
5stdenv.mkDerivation rec {
6 pname = "monitoring-plugins";
7 version = "2.2";
8 name = "${pname}-${version}";
9
10 src = fetchurl {
11 url = "https://www.monitoring-plugins.org/download/${name}.tar.gz";
12 sha256 = "0r9nvnk64nv7k8w352n99lw4p92pycxd9wlga9zyzjx9027m6si9";
13 };
14
15 patches = [
16 (fetchpatch {
17 name = "mariadb.patch";
18 url = "https://git.archlinux.org/svntogit/community.git/plain/trunk/0001-mariadb.patch?h=packages/monitoring-plugins";
19 sha256 = "0jf6fqkyzag66rid92m7asnr2dp8rr8kn4zjvhqg0mqvf8imppky";
20 })
21 ];
22
23 # ping needs CAP_NET_RAW capability which is set only in the wrappers namespace
24 configurePhase = ''
25 ./configure --disable-static --disable-dependency-tracking \
26 --prefix=$out \
27 --with-ping-command="${wrapperDir}/ping -4 -n -U -w %d -c %d %s" \
28 --with-ping6-command="${wrapperDir}/ping -6 -n -U -w %d -c %d %s" \
29 --with-sudo-command="${wrapperDir}/sudo"
30 '';
31
32 buildInputs = [ perl file hostname iputils openssl openldap procps bind.dnsutils postfix ];
33}
diff --git a/flakes/mypackages/pkgs/mtop/default.nix b/flakes/mypackages/pkgs/mtop/default.nix
new file mode 100644
index 0000000..ca9be2c
--- /dev/null
+++ b/flakes/mypackages/pkgs/mtop/default.nix
@@ -0,0 +1,24 @@
1{ fetchurl, perlPackages, lib }:
2perlPackages.buildPerlPackage rec {
3 pname = "mtop";
4 version = "0.6.6";
5 src = fetchurl {
6 url = "http://downloads.sourceforge.net/project/mtop/mtop/v${version}/mtop-${version}.tar.gz";
7 sha256 = "0x0x5300b1j9i0xxk8rsrki0pspyzj2vylhzv8qg3l6j26aw0zrf";
8 };
9 outputs = ["out"];
10 buildInputs = with perlPackages; [ DBI DBDmysql Curses ];
11
12 postInstall = ''
13 cd "$out"
14 preConfigure || true
15 '';
16
17 meta = with lib; {
18 description = "MySQL top (monitor and examine slow queries)";
19 homepage = http://mtop.sourceforge.net/;
20 license = licenses.gpl3;
21 maintainers = with maintainers; [ { name = "Marc Prewitt"; email = "mprewitt@chelsea.net"; } ];
22 platforms = platforms.unix;
23 };
24}
diff --git a/flakes/mypackages/pkgs/mutt-ics/default.nix b/flakes/mypackages/pkgs/mutt-ics/default.nix
new file mode 100644
index 0000000..2d50475
--- /dev/null
+++ b/flakes/mypackages/pkgs/mutt-ics/default.nix
@@ -0,0 +1,15 @@
1{ python3Packages, fetchFromGitHub }:
2with python3Packages;
3buildPythonApplication (rec {
4 version = "d291187-master";
5 pname = "mutt-ics";
6 name = "${pname}-${version}";
7 src = fetchFromGitHub {
8 owner = "dmedvinsky";
9 repo = "mutt-ics";
10 rev = "d29118788f291f67d34fefa6eda9f95846a2fe34";
11 sha256 = "0kqzngsvzjq5gpf60jhfmb2xzjznvk172khf4dlcb72n3ak4rb92";
12 fetchSubmodules = true;
13 };
14 propagatedBuildInputs = [ icalendar ];
15})
diff --git a/pkgs/muttprint/0.73-4.diff.gz b/flakes/mypackages/pkgs/muttprint/0.73-4.diff.gz
index c4f3cef..c4f3cef 100644
--- a/pkgs/muttprint/0.73-4.diff.gz
+++ b/flakes/mypackages/pkgs/muttprint/0.73-4.diff.gz
Binary files differ
diff --git a/pkgs/muttprint/default.nix b/flakes/mypackages/pkgs/muttprint/default.nix
index 0863a7b..0863a7b 100644
--- a/pkgs/muttprint/default.nix
+++ b/flakes/mypackages/pkgs/muttprint/default.nix
diff --git a/pkgs/muttprint/regex.patch b/flakes/mypackages/pkgs/muttprint/regex.patch
index e99c4a2..e99c4a2 100644
--- a/pkgs/muttprint/regex.patch
+++ b/flakes/mypackages/pkgs/muttprint/regex.patch
diff --git a/pkgs/muttprint/two_edge.patch b/flakes/mypackages/pkgs/muttprint/two_edge.patch
index 4a7290d..4a7290d 100644
--- a/pkgs/muttprint/two_edge.patch
+++ b/flakes/mypackages/pkgs/muttprint/two_edge.patch
diff --git a/flakes/mypackages/pkgs/naemon-livestatus/default.nix b/flakes/mypackages/pkgs/naemon-livestatus/default.nix
new file mode 100644
index 0000000..623230a
--- /dev/null
+++ b/flakes/mypackages/pkgs/naemon-livestatus/default.nix
@@ -0,0 +1,32 @@
1{ stdenv, fetchFromGitHub, autoconf, automake,
2 libtool, pkg-config, naemon,
3 varDir ? "/var/lib/naemon",
4 etcDir ? "/etc/naemon"
5}:
6stdenv.mkDerivation ({
7 pname = "naemon-livestatus";
8 version = "33dbcfe-master";
9 src = fetchFromGitHub {
10 owner = "naemon";
11 repo = "naemon-livestatus";
12 rev = "33dbcfe18e42158f25c27cff95a1e07b73be53b0";
13 sha256 = "16jk0c6pwr7ck0g6s12hj6czbhgdr7c7f74zzsp5279af86y8fd6";
14 fetchSubmodules = true;
15 };
16 preConfigure = ''
17 ./autogen.sh || true
18 '';
19
20 configureFlags = [
21 "--localstatedir=${varDir}"
22 "--sysconfdir=${etcDir}"
23 ];
24
25 preInstall = ''
26 substituteInPlace Makefile --replace \
27 '@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am' \
28 '@$(MAKE) $(AM_MAKEFLAGS) install-exec-am'
29 '';
30
31 buildInputs = [ autoconf automake libtool pkg-config naemon ];
32})
diff --git a/flakes/mypackages/pkgs/naemon/default.nix b/flakes/mypackages/pkgs/naemon/default.nix
new file mode 100644
index 0000000..2a29bdc
--- /dev/null
+++ b/flakes/mypackages/pkgs/naemon/default.nix
@@ -0,0 +1,44 @@
1{ stdenv, fetchFromGitHub, help2man, monitoring-plugins, autoconf, automake,
2 libtool, glib, pkg-config, gperf,
3 varDir ? "/var/lib/naemon",
4 etcDir ? "/etc/naemon",
5 cacheDir ? "/var/cache/naemon",
6 logDir ? "/var/log/naemon",
7 runDir ? "/run/naemon",
8 user ? "naemon",
9 group ? "naemon"
10}:
11stdenv.mkDerivation ({
12 pname = "naemon";
13 version = "d7ac1c8-master";
14 src = fetchFromGitHub {
15 owner = "naemon";
16 repo = "naemon-core";
17 rev = "d7ac1c824e01dbb1c4a6bd0550b324e7cf165d54";
18 sha256 = "003grwciplnqfn9jh2km2pm6xxp8fxvmwihg3vmch8f0vfwcmv1m";
19 fetchSubmodules = true;
20 };
21 passthru.status_engine_version = "1-1-0";
22 preConfigure = ''
23 ./autogen.sh || true
24 '';
25
26 configureFlags = [
27 "--localstatedir=${varDir}"
28 "--sysconfdir=${etcDir}"
29 "--with-pkgconfdir=${etcDir}"
30 "--with-pluginsdir=${monitoring-plugins}/libexec"
31 "--with-tempdir=${cacheDir}"
32 "--with-checkresultdir=${cacheDir}/checkresults"
33 "--with-logdir=${logDir}"
34 "--with-naemon-user=${user}"
35 "--with-naemon-group=${group}"
36 "--with-lockfile=${runDir}/naemon.pid"
37 ];
38
39 preInstall = ''
40 substituteInPlace Makefile --replace '$(MAKE) $(AM_MAKEFLAGS) install-exec-hook' ""
41 '';
42
43 buildInputs = [ autoconf automake help2man libtool glib pkg-config gperf ];
44})
diff --git a/flakes/mypackages/pkgs/nagios-cli/default.nix b/flakes/mypackages/pkgs/nagios-cli/default.nix
new file mode 100644
index 0000000..99ae843
--- /dev/null
+++ b/flakes/mypackages/pkgs/nagios-cli/default.nix
@@ -0,0 +1,12 @@
1{ python2Packages, fetchFromGitHub }:
2python2Packages.buildPythonApplication rec {
3 version = "edc51ea-master";
4 pname = "nagios-cli";
5 src = fetchFromGitHub {
6 owner = "tehmaze";
7 repo = "nagios-cli";
8 rev = "edc51eaccf1086bb4469ce45c5e5155f2d71a2f9";
9 sha256 = "1qw5fv4niz079zqwmfr3kzjv8cc31rbhi9whdbv9c32qdi3h7vsp";
10 fetchSubmodules = true;
11 };
12}
diff --git a/flakes/mypackages/pkgs/nagnu/default.nix b/flakes/mypackages/pkgs/nagnu/default.nix
new file mode 100644
index 0000000..c7a1162
--- /dev/null
+++ b/flakes/mypackages/pkgs/nagnu/default.nix
@@ -0,0 +1,21 @@
1{ stdenv, fetchFromGitHub, ncurses, curl }:
2stdenv.mkDerivation (rec {
3 pname = "nagnu";
4 version = "c7e65fc-master";
5 src = fetchFromGitHub {
6 owner = "frlen";
7 repo = "nagnu";
8 rev = "c7e65fc02f46a3756a4cc47953ea2f3e57a84728";
9 sha256 = "1i2jm8ibvqcc734daamnzc3hx8q0nsry1x12q0kr5yvcsdjjgyy3";
10 fetchSubmodules = true;
11 };
12 buildInputs = [ ncurses curl ];
13 installPhase = ''
14 mkdir -p $out/bin
15 cp nagnu $out/bin
16 mkdir -p $out/share/doc/nagnu
17 cp nagnu.conf.sample $out/share/doc/nagnu
18 mkdir -p $out/share/man/man8
19 cp docs/nagnu.8 $out/share/man/man8
20 '';
21})
diff --git a/flakes/mypackages/pkgs/nb/default.nix b/flakes/mypackages/pkgs/nb/default.nix
new file mode 100644
index 0000000..337c286
--- /dev/null
+++ b/flakes/mypackages/pkgs/nb/default.nix
@@ -0,0 +1,22 @@
1{ fetchFromGitHub, stdenv, makeWrapper, lib, file }:
2stdenv.mkDerivation {
3 pname = "nb";
4 version = "e0d4e24-master";
5 src = fetchFromGitHub {
6 owner = "xwmx";
7 repo = "nb";
8 rev = "e0d4e24201299916d736be6a9800793cec32927e";
9 sha256 = "0gpnlzxjlfn3bagw74lsrmfhxj2xzvk6sjj24wp9rjpk42d9mfml";
10 };
11 phases = "installPhase";
12 buildInputs = [ makeWrapper ];
13 installPhase = ''
14 mkdir -p $out/bin $out/share/zsh/vendor-completions $out/share/bash-completion/completions
15 cp $src/nb $out/bin/nb
16 chmod +x $out/bin/nb
17 patchShebangs $out/bin/nb
18 wrapProgram $out/bin/nb --prefix PATH : ${lib.makeBinPath [ file ]}
19 cp $src/etc/nb-completion.zsh $out/share/zsh/vendor-completions/_nb
20 cp $src/etc/nb-completion.bash $out/share/bash-completion/completions/nb
21 '';
22}
diff --git a/flakes/mypackages/pkgs/note/default.nix b/flakes/mypackages/pkgs/note/default.nix
new file mode 100644
index 0000000..b3b03ef
--- /dev/null
+++ b/flakes/mypackages/pkgs/note/default.nix
@@ -0,0 +1,19 @@
1{ lib, fetchurl, perlPackages }:
2perlPackages.buildPerlPackage rec {
3 pname = "note";
4 version = "1.3.26";
5 src = fetchurl {
6 url = "mirror://cpan/authors/id/T/TL/TLINDEN/${pname}-${version}.tar.gz";
7 sha256 = "1h645rnb5vpms48fcyzvp7cwwcbf9k5xq49w2bpniyzzgk2brjrq";
8 };
9 outputs = ["out" "man"];
10 propagatedBuildInputs = with perlPackages; [ YAML ];
11
12 meta = with lib; {
13 description = "A perl script for maintaining notes";
14 homepage = http://www.daemon.de/NOTE;
15 license = licenses.gpl3;
16 maintainers = with maintainers; [ { name = "T.v.Dein"; email = "tlinden@cpan.org"; } ];
17 platforms = platforms.unix;
18 };
19}
diff --git a/pkgs/notmuch/notmuch-python/default.nix b/flakes/mypackages/pkgs/notmuch/notmuch-python/default.nix
index d639d9a..d639d9a 100644
--- a/pkgs/notmuch/notmuch-python/default.nix
+++ b/flakes/mypackages/pkgs/notmuch/notmuch-python/default.nix
diff --git a/pkgs/notmuch/notmuch-vim/default.nix b/flakes/mypackages/pkgs/notmuch/notmuch-vim/default.nix
index e79a253..e79a253 100644
--- a/pkgs/notmuch/notmuch-vim/default.nix
+++ b/flakes/mypackages/pkgs/notmuch/notmuch-vim/default.nix
diff --git a/flakes/mypackages/pkgs/perl-ical-parser-html/default.nix b/flakes/mypackages/pkgs/perl-ical-parser-html/default.nix
new file mode 100644
index 0000000..96e9abc
--- /dev/null
+++ b/flakes/mypackages/pkgs/perl-ical-parser-html/default.nix
@@ -0,0 +1,48 @@
1{ perlPackages, fetchurl }:
2let
3 TestXML = perlPackages.buildPerlPackage rec {
4 pname = "Test-XML";
5 version = "0.08";
6 src = fetchurl {
7 url = "mirror://cpan/authors/id/S/SE/SEMANTICO/Test-XML-0.08.tar.gz";
8 sha256 = "sha256-61TMI83shg062KyKaXy/A40N7JUimRLZdcMBiQyoPuI=";
9 };
10 propagatedBuildInputs = with perlPackages; [
11 ModuleBuild XMLSemanticDiff XMLParser
12 ];
13 };
14 iCalParserSAX = perlPackages.buildPerlPackage rec {
15 pname = "iCal-Parser-SAX";
16 version = "1.09";
17 src = fetchurl {
18 url = "mirror://cpan/authors/id/R/RF/RFRANKEL/iCal-Parser-SAX-1.09.tar.gz";
19 sha256 = "sha256-fouAjQ+MTUgwZ/j3dIarOK0rVBZcZy6aOJFor4pLql0=";
20 };
21 propagatedBuildInputs = with perlPackages; [
22 ModuleBuild DateTime IOString XMLSAXBase XMLSAXWriter iCalParser
23 LWPUserAgent
24 ];
25 buildInputs = [ TestXML ];
26 doCheck = false;
27 };
28in
29perlPackages.buildPerlPackage rec {
30 pname = "iCal-Parser-HTML";
31 version = "1.07";
32 src = fetchurl {
33 url = "mirror://cpan/authors/id/R/RF/RFRANKEL/${pname}-${version}.tar.gz";
34 sha256 = "sha256-cxRS2M6aVrCtAXHQae0Y6EtEfGnGx41UuB7z442NSrU=";
35 };
36 patchPhase = ''
37 sed -i -e "s/qw(week month year)/(qw(week month year))/" lib/iCal/Parser/HTML.pm
38 '';
39 doCheck = false;
40 postInstall = ''
41 mkdir -p $out/bin
42 cp scripts/ical2html $out/bin
43 chmod +x $out/bin/ical2html
44 '';
45 propagatedBuildInputs = with perlPackages; [
46 ModuleBuild XMLLibXML XMLLibXSLT iCalParser iCalParserSAX
47 ];
48}
diff --git a/flakes/mypackages/pkgs/pgpid/default.nix b/flakes/mypackages/pkgs/pgpid/default.nix
new file mode 100644
index 0000000..a1fb9c2
--- /dev/null
+++ b/flakes/mypackages/pkgs/pgpid/default.nix
@@ -0,0 +1,33 @@
1{ 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 }:
2stdenv.mkDerivation {
3 pname = "pgpid";
4 version = "master";
5 src = fetchFromGitHub {
6 owner = "foopgp";
7 repo = "pgpid";
8 rev = "26c2137951775652e9e774977639ecaea5845cf7";
9 sha256 = "sha256-noXDYWWxUryFnV99pyl0eV7hJLUkSy97Vqylx5dKN9g=";
10 };
11
12 buildInputs = [ makeWrapper ];
13 phases = [ "installPhase" ];
14 installPhase = ''
15 mkdir -p $out/bin $out/share/pgpid $out/share/doc/pgpid
16
17 cp $src/pgpid-gen $src/pgpid-qrscan $out/bin
18 cp -r $src/doc $out/share/doc/pgpid
19 cp -r $src/data $out/share/pgpid
20 cp -r $src/imgsamples $out/share/pgpid
21 for i in $out/bin/*; do
22 patchShebangs $i
23 sed -i -e "/^TESSDATADIR/d" -e "/^GEOLIST_CENTROID/d" $i
24 sed -i -e 's@"$(dirname "$BASH_SOURCE")"@${bash-libs}/share/bash-libs/include@' $i
25 wrapProgram $i --set PATH ${lib.makeBinPath [
26 facedetect graphicsmagick qrencode tesseract4 zbar cups gnugrep vim gnupg findutils
27 pandoc (texlive.combine { scheme-small = texlive.scheme-small; pdfcrop = texlive.pdfcrop; })
28 ]}:$(cat ${bash-libs}/nix-support/propagated-build-inputs) \
29 --set TESSDATADIR $out/share/pgpid/data \
30 --set GEOLIST_CENTROID $out/share/pgpid/data/geolist_centroid.txt
31 done
32 '';
33}
diff --git a/flakes/mypackages/pkgs/predixy/default.nix b/flakes/mypackages/pkgs/predixy/default.nix
new file mode 100644
index 0000000..259d7fd
--- /dev/null
+++ b/flakes/mypackages/pkgs/predixy/default.nix
@@ -0,0 +1,19 @@
1{ stdenv, fetchFromGitHub }:
2stdenv.mkDerivation ({
3 pname = "predixy";
4 version = "dacf3fb-master";
5 src = fetchFromGitHub {
6 owner = "joyieldInc";
7 repo = "predixy";
8 rev = "dacf3fb30c2602dc044040df04e194d44b49c1be";
9 sha256 = "0sbvy0jg551lwkfq8qh0a49cl9mhfnkhi3cnk25l8pz4jcdrr9k9";
10 fetchSubmodules = true;
11 };
12 installPhase = ''
13 mkdir -p $out/bin
14 cp src/predixy $out/bin
15 mkdir -p $out/share
16 cp -r doc $out/share
17 cp -r conf $out/share/doc
18 '';
19})
diff --git a/flakes/mypackages/pkgs/proftpd/default.nix b/flakes/mypackages/pkgs/proftpd/default.nix
new file mode 100644
index 0000000..8bdf531
--- /dev/null
+++ b/flakes/mypackages/pkgs/proftpd/default.nix
@@ -0,0 +1,22 @@
1{ stdenv, fetchurl, file, openssl, libsodium, ncurses, cyrus_sasl, openldap, pkg-config, libxcrypt }:
2
3stdenv.mkDerivation rec {
4 pname = "proftpd";
5 version = "1.3.8";
6 src = fetchurl {
7 url = "https://github.com/proftpd/proftpd/archive/refs/tags/v${version}.tar.gz";
8 sha256 = "sha256-9xOec3eiywWbi5sU12pt9fRA4xgcsVrokNQ7vK5XR0g=";
9 };
10 postPatch = ''
11 sed -i -e "s@/usr/bin/file@${file}/bin/file@" configure
12 '';
13 dontDisableStatic = 1;
14 configureFlags = [ "--enable-openssl" "--with-modules=mod_ldap:mod_sftp:mod_tls:mod_site_misc" "--with-includes=${libsodium.dev}/include" "--with-libraries=${libsodium}/lib" ];
15 preInstall = ''
16 installFlagsArray=(INSTALL_USER=$(id -u) INSTALL_GROUP=$(id -g))
17 '';
18 buildInputs = [ openssl libsodium ncurses cyrus_sasl openldap pkg-config libxcrypt ];
19 postInstall = ''
20 rmdir $out/var $out/libexec $out/lib/proftpd $out/share/locale
21 '';
22}
diff --git a/flakes/mypackages/pkgs/pure-ftpd/default.nix b/flakes/mypackages/pkgs/pure-ftpd/default.nix
new file mode 100644
index 0000000..55c698f
--- /dev/null
+++ b/flakes/mypackages/pkgs/pure-ftpd/default.nix
@@ -0,0 +1,30 @@
1{ ldapFtpId ? null
2, stdenv, lib, fetchurl, openssl, postgresql, openldap }:
3
4stdenv.mkDerivation rec {
5 name = "pure-ftpd-1.0.47";
6
7 src = fetchurl {
8 url = "https://download.pureftpd.org/pub/pure-ftpd/releases/${name}.tar.gz";
9 sha256 = "1b97ixva8m10vln8xrfwwwzi344bkgxqji26d0nrm1yzylbc6h27";
10 };
11
12 preConfigure = stdenv.lib.optionalString (!isNull ldapFtpId) ''
13 sed -i -e "s#FTPuid#${ldapFtpId}Uid#" src/log_ldap.h
14 sed -i -e "s#FTPgid#${ldapFtpId}Gid#" src/log_ldap.h
15 '';
16 postConfigure = ''
17 sed -i 's/define MAX_DATA_SIZE (40/define MAX_DATA_SIZE (70/' src/ftpd.h
18 '';
19 buildInputs = [ openssl postgresql openldap ];
20
21 configureFlags = [ "--with-everything" "--with-tls" "--with-pgsql" "--with-ldap" ];
22
23 meta = with lib; {
24 description = "A free, secure, production-quality and standard-conformant FTP server";
25 homepage = https://www.pureftpd.org;
26 license = licenses.isc; # with some parts covered by BSD3(?)
27 maintainers = [ maintainers.lethalman ];
28 platforms = platforms.linux;
29 };
30}
diff --git a/flakes/mypackages/pkgs/riotkit-do/default.nix b/flakes/mypackages/pkgs/riotkit-do/default.nix
new file mode 100644
index 0000000..3ddb1ab
--- /dev/null
+++ b/flakes/mypackages/pkgs/riotkit-do/default.nix
@@ -0,0 +1,60 @@
1{ python3Packages }:
2let
3 tabulate = python3Packages.buildPythonPackage rec {
4 version = "0.8.7";
5 pname = "tabulate";
6
7 src = python3Packages.fetchPypi {
8 inherit pname version;
9 sha256 = "sha256-2ycjog0EvNqFIhZcc+6nwwDtp04M6FLZAi4BWdeJUAc=";
10 };
11
12 checkInputs = with python3Packages; [ nose ];
13
14 doCheck = false;
15 };
16
17 python-dotenv = python3Packages.buildPythonPackage rec {
18 pname = "python-dotenv";
19 version = "0.13.0";
20
21 src = python3Packages.fetchPypi {
22 inherit pname version;
23 sha256 = "sha256-O5kJvJaw7cawFYbh7tBecRdO9OBMcdpXhjcM6+pTrXQ=";
24 };
25
26 propagatedBuildInputs = with python3Packages; [ click ];
27
28 checkInputs = with python3Packages; [
29 ipython
30 mock
31 pytestCheckHook
32 sh
33 ];
34
35 disabledTests = [
36 "cli"
37 ];
38
39 pythonImportsCheck = [ "dotenv" ];
40 };
41in
42python3Packages.buildPythonApplication rec {
43 pname = "rkd";
44 version = "2.4.0";
45 src = python3Packages.fetchPypi {
46 inherit pname version;
47 sha256 = "sha256-WC0FmUYGkV9PFvRtiFW6w6RtP+9Zf6kizl8jGiRb4HQ=";
48 };
49
50 propagatedBuildInputs = with python3Packages; [
51 pbr
52 jinja2
53 pyyaml
54 tabulate
55 psutil
56 pytest
57 python-dotenv
58 jsonschema
59 ];
60}
diff --git a/pkgs/rrsync_sudo/default.nix b/flakes/mypackages/pkgs/rrsync_sudo/default.nix
index 7a47320..7a47320 100644
--- a/pkgs/rrsync_sudo/default.nix
+++ b/flakes/mypackages/pkgs/rrsync_sudo/default.nix
diff --git a/pkgs/rrsync_sudo/sudo.patch b/flakes/mypackages/pkgs/rrsync_sudo/sudo.patch
index 6de9cc9..6de9cc9 100644
--- a/pkgs/rrsync_sudo/sudo.patch
+++ b/flakes/mypackages/pkgs/rrsync_sudo/sudo.patch
diff --git a/flakes/mypackages/pkgs/shaarli/default.nix b/flakes/mypackages/pkgs/shaarli/default.nix
new file mode 100644
index 0000000..23f9937
--- /dev/null
+++ b/flakes/mypackages/pkgs/shaarli/default.nix
@@ -0,0 +1,24 @@
1{ varDir ? "/var/lib/shaarli", stdenv, fetchurl }:
2
3stdenv.mkDerivation rec {
4 pname = "shaarli";
5 version = "0.10.2";
6 src = fetchurl {
7 url = "https://github.com/shaarli/Shaarli/releases/download/v${version}/shaarli-v${version}-full.tar.gz";
8 sha256 = "0h8sspj7siy3vgpi2i3gdrjcr5935fr4dfwq2zwd70sjx2sh9s78";
9 };
10 patchPhase = "";
11
12 outputs = [ "out" "doc" ];
13
14 patches = [ ./shaarli_ldap.patch ];
15 installPhase = ''
16 rm -r {cache,pagecache,tmp,data}/
17 mkdir -p $doc/share/doc
18 mv doc/ $doc/share/doc/shaarli
19 mkdir $out/
20 cp -R ./* $out
21 cp .htaccess $out/
22 ln -sf ${varDir}/{cache,pagecache,tmp,data} $out/
23 '';
24}
diff --git a/overlays/shaarli/shaarli_ldap.patch b/flakes/mypackages/pkgs/shaarli/shaarli_ldap.patch
index e66a54f..e66a54f 100644
--- a/overlays/shaarli/shaarli_ldap.patch
+++ b/flakes/mypackages/pkgs/shaarli/shaarli_ldap.patch
diff --git a/pkgs/signaldctl/default.nix b/flakes/mypackages/pkgs/signaldctl/default.nix
index 3ae85d8..3ae85d8 100644
--- a/pkgs/signaldctl/default.nix
+++ b/flakes/mypackages/pkgs/signaldctl/default.nix
diff --git a/pkgs/slang_1/default.nix b/flakes/mypackages/pkgs/slang_1/default.nix
index cd626e0..cd626e0 100644
--- a/pkgs/slang_1/default.nix
+++ b/flakes/mypackages/pkgs/slang_1/default.nix
diff --git a/pkgs/status_engine/host_perfdata.patch b/flakes/mypackages/pkgs/status_engine/host_perfdata.patch
index 0c8a20b..0c8a20b 100644
--- a/pkgs/status_engine/host_perfdata.patch
+++ b/flakes/mypackages/pkgs/status_engine/host_perfdata.patch
diff --git a/flakes/mypackages/pkgs/status_engine/interface.nix b/flakes/mypackages/pkgs/status_engine/interface.nix
new file mode 100644
index 0000000..9c8ff5e
--- /dev/null
+++ b/flakes/mypackages/pkgs/status_engine/interface.nix
@@ -0,0 +1,24 @@
1{ stdenv, composerEnv, php73, fetchurl, callPackage, config_file ? "/var/lib/status_engine/interface.yml" }:
2let
3 composerEnv' = composerEnv.override { php = php73; };
4in
5composerEnv'.buildPackage (
6 import ./interface_php_packages.nix { composerEnv = composerEnv'; inherit fetchurl; } // rec {
7 pname = "interface";
8 version = "3.4.0";
9 name = "${pname}-${version}";
10 src = fetchurl {
11 url = "https://github.com/statusengine/${pname}/archive/${version}.tar.gz";
12 sha256 = "1l11cskv740xvqs9a2yj9zkvgvxvymaq5qap36g2r4hkqbfbbjj2";
13 };
14 unpackPhase = null;
15 postUnpack = ''
16 src=$(pwd)/$sourceRoot
17 '';
18 postInstall = ''
19 ln -s ${config_file} $out/etc/config.yml
20 '';
21 preInstall = ''
22 cp ${./interface_composer.lock} $out/composer.lock
23 '';
24 })
diff --git a/pkgs/status_engine/interface_composer.lock b/flakes/mypackages/pkgs/status_engine/interface_composer.lock
index 8911d9f..8911d9f 100644
--- a/pkgs/status_engine/interface_composer.lock
+++ b/flakes/mypackages/pkgs/status_engine/interface_composer.lock
diff --git a/pkgs/status_engine/interface_php_packages.nix b/flakes/mypackages/pkgs/status_engine/interface_php_packages.nix
index d81e83c..d81e83c 100644
--- a/pkgs/status_engine/interface_php_packages.nix
+++ b/flakes/mypackages/pkgs/status_engine/interface_php_packages.nix
diff --git a/flakes/mypackages/pkgs/status_engine/module.nix b/flakes/mypackages/pkgs/status_engine/module.nix
new file mode 100644
index 0000000..d3ac03e
--- /dev/null
+++ b/flakes/mypackages/pkgs/status_engine/module.nix
@@ -0,0 +1,19 @@
1{ stdenv, fetchFromGitHub, gearmand, json_c, libuuid, libevent, pkgconfig, glib }:
2stdenv.mkDerivation ({
3 pname = "statusengine-module";
4 version = "d461e95-master";
5 src = fetchFromGitHub {
6 owner = "statusengine";
7 repo = "module";
8 rev = "d461e95a11fffaac604d11ac42d237b5e13071bc";
9 sha256 = "1awmq9rck9xy82pambnd2wh66ndif8x8jpk4qbbghs9f2sd48x1n";
10 fetchSubmodules = true;
11 };
12 patches = [ ./host_perfdata.patch ];
13 buildInputs = [ gearmand json_c libuuid libevent pkgconfig glib ];
14 makeFlags = "all";
15 installPhase = ''
16 mkdir -p $out/lib/status-engine
17 cp -a src/bin/* $out/lib/status-engine
18 '';
19})
diff --git a/flakes/mypackages/pkgs/status_engine/worker.nix b/flakes/mypackages/pkgs/status_engine/worker.nix
new file mode 100644
index 0000000..d8425e1
--- /dev/null
+++ b/flakes/mypackages/pkgs/status_engine/worker.nix
@@ -0,0 +1,37 @@
1{ stdenv, fetchFromGitHub, composerEnv, fetchurl, gearmand, callPackage, php81, config_file ? "/var/lib/status_engine/ui.yml" }:
2let
3 gearman = php81.buildPecl rec {
4 # git describe
5 version = "2.1.0-12-g8fb88d5";
6 pname = "gearman";
7 src = fetchFromGitHub {
8 owner = "php";
9 repo = "pecl-networking-gearman";
10 rev = "8fb88d5a97111a7e8f0dc67553c387b49f047e53";
11 sha256 = "sha256-VPJX29JfNjh0mHlYY+iYKBHSJGUINbWHvojyYBSkSho=";
12 };
13 configureFlags = [ "--with-gearman=${gearmand}" ];
14 nativeBuildInputs = [ gearmand ];
15 };
16 php = php81.withExtensions({ enabled, all }: enabled ++ (with all; [gearman redis mbstring bcmath iconv]));
17in
18(composerEnv.override { inherit php; }).buildPackage (
19 import ./worker_php_packages.nix { inherit composerEnv fetchurl; } // rec {
20 name = "${pname}-${version}";
21 pname = "worker";
22 version = "master";
23 src = fetchFromGitHub {
24 owner = "statusengine";
25 repo = "worker";
26 rev = "e20d6b5c83c6b3c6a2030c9506542fa59dcbb551";
27 sha256 = "sha256-dcC+SLEqMUubp4JQFSuKNpd6U4VYvGR38Vn1jf6ZvTU=";
28 fetchSubmodules = true;
29 };
30 passthru.php = php;
31 postInstall = ''
32 ln -s ${config_file} $out/etc/config.yml
33 '';
34 preInstall = ''
35 cp ${./worker_composer.lock} $out/composer.lock
36 '';
37})
diff --git a/flakes/mypackages/pkgs/status_engine/worker_composer.lock b/flakes/mypackages/pkgs/status_engine/worker_composer.lock
new file mode 100644
index 0000000..bba0d2d
--- /dev/null
+++ b/flakes/mypackages/pkgs/status_engine/worker_composer.lock
@@ -0,0 +1,2072 @@
1{
2 "_readme": [
3 "This file locks the dependencies of your project to a known state",
4 "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5 "This file is @generated automatically"
6 ],
7 "content-hash": "f61ef94b19969eb2446f52577078d701",
8 "packages": [
9 {
10 "name": "composer/package-versions-deprecated",
11 "version": "1.11.99.5",
12 "source": {
13 "type": "git",
14 "url": "https://github.com/composer/package-versions-deprecated.git",
15 "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d"
16 },
17 "dist": {
18 "type": "zip",
19 "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d",
20 "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d",
21 "shasum": ""
22 },
23 "require": {
24 "composer-plugin-api": "^1.1.0 || ^2.0",
25 "php": "^7 || ^8"
26 },
27 "replace": {
28 "ocramius/package-versions": "1.11.99"
29 },
30 "require-dev": {
31 "composer/composer": "^1.9.3 || ^2.0@dev",
32 "ext-zip": "^1.13",
33 "phpunit/phpunit": "^6.5 || ^7"
34 },
35 "type": "composer-plugin",
36 "extra": {
37 "class": "PackageVersions\\Installer",
38 "branch-alias": {
39 "dev-master": "1.x-dev"
40 }
41 },
42 "autoload": {
43 "psr-4": {
44 "PackageVersions\\": "src/PackageVersions"
45 }
46 },
47 "notification-url": "https://packagist.org/downloads/",
48 "license": [
49 "MIT"
50 ],
51 "authors": [
52 {
53 "name": "Marco Pivetta",
54 "email": "ocramius@gmail.com"
55 },
56 {
57 "name": "Jordi Boggiano",
58 "email": "j.boggiano@seld.be"
59 }
60 ],
61 "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
62 "support": {
63 "issues": "https://github.com/composer/package-versions-deprecated/issues",
64 "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5"
65 },
66 "funding": [
67 {
68 "url": "https://packagist.com",
69 "type": "custom"
70 },
71 {
72 "url": "https://github.com/composer",
73 "type": "github"
74 },
75 {
76 "url": "https://tidelift.com/funding/github/packagist/composer/composer",
77 "type": "tidelift"
78 }
79 ],
80 "time": "2022-01-17T14:14:24+00:00"
81 },
82 {
83 "name": "doctrine/cache",
84 "version": "2.2.0",
85 "source": {
86 "type": "git",
87 "url": "https://github.com/doctrine/cache.git",
88 "reference": "1ca8f21980e770095a31456042471a57bc4c68fb"
89 },
90 "dist": {
91 "type": "zip",
92 "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb",
93 "reference": "1ca8f21980e770095a31456042471a57bc4c68fb",
94 "shasum": ""
95 },
96 "require": {
97 "php": "~7.1 || ^8.0"
98 },
99 "conflict": {
100 "doctrine/common": ">2.2,<2.4"
101 },
102 "require-dev": {
103 "cache/integration-tests": "dev-master",
104 "doctrine/coding-standard": "^9",
105 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
106 "psr/cache": "^1.0 || ^2.0 || ^3.0",
107 "symfony/cache": "^4.4 || ^5.4 || ^6",
108 "symfony/var-exporter": "^4.4 || ^5.4 || ^6"
109 },
110 "type": "library",
111 "autoload": {
112 "psr-4": {
113 "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
114 }
115 },
116 "notification-url": "https://packagist.org/downloads/",
117 "license": [
118 "MIT"
119 ],
120 "authors": [
121 {
122 "name": "Guilherme Blanco",
123 "email": "guilhermeblanco@gmail.com"
124 },
125 {
126 "name": "Roman Borschel",
127 "email": "roman@code-factory.org"
128 },
129 {
130 "name": "Benjamin Eberlei",
131 "email": "kontakt@beberlei.de"
132 },
133 {
134 "name": "Jonathan Wage",
135 "email": "jonwage@gmail.com"
136 },
137 {
138 "name": "Johannes Schmitt",
139 "email": "schmittjoh@gmail.com"
140 }
141 ],
142 "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.",
143 "homepage": "https://www.doctrine-project.org/projects/cache.html",
144 "keywords": [
145 "abstraction",
146 "apcu",
147 "cache",
148 "caching",
149 "couchdb",
150 "memcached",
151 "php",
152 "redis",
153 "xcache"
154 ],
155 "support": {
156 "issues": "https://github.com/doctrine/cache/issues",
157 "source": "https://github.com/doctrine/cache/tree/2.2.0"
158 },
159 "funding": [
160 {
161 "url": "https://www.doctrine-project.org/sponsorship.html",
162 "type": "custom"
163 },
164 {
165 "url": "https://www.patreon.com/phpdoctrine",
166 "type": "patreon"
167 },
168 {
169 "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache",
170 "type": "tidelift"
171 }
172 ],
173 "time": "2022-05-20T20:07:39+00:00"
174 },
175 {
176 "name": "doctrine/dbal",
177 "version": "2.13.9",
178 "source": {
179 "type": "git",
180 "url": "https://github.com/doctrine/dbal.git",
181 "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8"
182 },
183 "dist": {
184 "type": "zip",
185 "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8",
186 "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8",
187 "shasum": ""
188 },
189 "require": {
190 "doctrine/cache": "^1.0|^2.0",
191 "doctrine/deprecations": "^0.5.3|^1",
192 "doctrine/event-manager": "^1.0",
193 "ext-pdo": "*",
194 "php": "^7.1 || ^8"
195 },
196 "require-dev": {
197 "doctrine/coding-standard": "9.0.0",
198 "jetbrains/phpstorm-stubs": "2021.1",
199 "phpstan/phpstan": "1.4.6",
200 "phpunit/phpunit": "^7.5.20|^8.5|9.5.16",
201 "psalm/plugin-phpunit": "0.16.1",
202 "squizlabs/php_codesniffer": "3.6.2",
203 "symfony/cache": "^4.4",
204 "symfony/console": "^2.0.5|^3.0|^4.0|^5.0",
205 "vimeo/psalm": "4.22.0"
206 },
207 "suggest": {
208 "symfony/console": "For helpful console commands such as SQL execution and import of files."
209 },
210 "bin": [
211 "bin/doctrine-dbal"
212 ],
213 "type": "library",
214 "autoload": {
215 "psr-4": {
216 "Doctrine\\DBAL\\": "lib/Doctrine/DBAL"
217 }
218 },
219 "notification-url": "https://packagist.org/downloads/",
220 "license": [
221 "MIT"
222 ],
223 "authors": [
224 {
225 "name": "Guilherme Blanco",
226 "email": "guilhermeblanco@gmail.com"
227 },
228 {
229 "name": "Roman Borschel",
230 "email": "roman@code-factory.org"
231 },
232 {
233 "name": "Benjamin Eberlei",
234 "email": "kontakt@beberlei.de"
235 },
236 {
237 "name": "Jonathan Wage",
238 "email": "jonwage@gmail.com"
239 }
240 ],
241 "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.",
242 "homepage": "https://www.doctrine-project.org/projects/dbal.html",
243 "keywords": [
244 "abstraction",
245 "database",
246 "db2",
247 "dbal",
248 "mariadb",
249 "mssql",
250 "mysql",
251 "oci8",
252 "oracle",
253 "pdo",
254 "pgsql",
255 "postgresql",
256 "queryobject",
257 "sasql",
258 "sql",
259 "sqlanywhere",
260 "sqlite",
261 "sqlserver",
262 "sqlsrv"
263 ],
264 "support": {
265 "issues": "https://github.com/doctrine/dbal/issues",
266 "source": "https://github.com/doctrine/dbal/tree/2.13.9"
267 },
268 "funding": [
269 {
270 "url": "https://www.doctrine-project.org/sponsorship.html",
271 "type": "custom"
272 },
273 {
274 "url": "https://www.patreon.com/phpdoctrine",
275 "type": "patreon"
276 },
277 {
278 "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal",
279 "type": "tidelift"
280 }
281 ],
282 "time": "2022-05-02T20:28:55+00:00"
283 },
284 {
285 "name": "doctrine/deprecations",
286 "version": "v1.1.1",
287 "source": {
288 "type": "git",
289 "url": "https://github.com/doctrine/deprecations.git",
290 "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3"
291 },
292 "dist": {
293 "type": "zip",
294 "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
295 "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
296 "shasum": ""
297 },
298 "require": {
299 "php": "^7.1 || ^8.0"
300 },
301 "require-dev": {
302 "doctrine/coding-standard": "^9",
303 "phpstan/phpstan": "1.4.10 || 1.10.15",
304 "phpstan/phpstan-phpunit": "^1.0",
305 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
306 "psalm/plugin-phpunit": "0.18.4",
307 "psr/log": "^1 || ^2 || ^3",
308 "vimeo/psalm": "4.30.0 || 5.12.0"
309 },
310 "suggest": {
311 "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
312 },
313 "type": "library",
314 "autoload": {
315 "psr-4": {
316 "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
317 }
318 },
319 "notification-url": "https://packagist.org/downloads/",
320 "license": [
321 "MIT"
322 ],
323 "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.",
324 "homepage": "https://www.doctrine-project.org/",
325 "support": {
326 "issues": "https://github.com/doctrine/deprecations/issues",
327 "source": "https://github.com/doctrine/deprecations/tree/v1.1.1"
328 },
329 "time": "2023-06-03T09:27:29+00:00"
330 },
331 {
332 "name": "doctrine/event-manager",
333 "version": "1.2.0",
334 "source": {
335 "type": "git",
336 "url": "https://github.com/doctrine/event-manager.git",
337 "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520"
338 },
339 "dist": {
340 "type": "zip",
341 "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520",
342 "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520",
343 "shasum": ""
344 },
345 "require": {
346 "doctrine/deprecations": "^0.5.3 || ^1",
347 "php": "^7.1 || ^8.0"
348 },
349 "conflict": {
350 "doctrine/common": "<2.9"
351 },
352 "require-dev": {
353 "doctrine/coding-standard": "^9 || ^10",
354 "phpstan/phpstan": "~1.4.10 || ^1.8.8",
355 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
356 "vimeo/psalm": "^4.24"
357 },
358 "type": "library",
359 "autoload": {
360 "psr-4": {
361 "Doctrine\\Common\\": "src"
362 }
363 },
364 "notification-url": "https://packagist.org/downloads/",
365 "license": [
366 "MIT"
367 ],
368 "authors": [
369 {
370 "name": "Guilherme Blanco",
371 "email": "guilhermeblanco@gmail.com"
372 },
373 {
374 "name": "Roman Borschel",
375 "email": "roman@code-factory.org"
376 },
377 {
378 "name": "Benjamin Eberlei",
379 "email": "kontakt@beberlei.de"
380 },
381 {
382 "name": "Jonathan Wage",
383 "email": "jonwage@gmail.com"
384 },
385 {
386 "name": "Johannes Schmitt",
387 "email": "schmittjoh@gmail.com"
388 },
389 {
390 "name": "Marco Pivetta",
391 "email": "ocramius@gmail.com"
392 }
393 ],
394 "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.",
395 "homepage": "https://www.doctrine-project.org/projects/event-manager.html",
396 "keywords": [
397 "event",
398 "event dispatcher",
399 "event manager",
400 "event system",
401 "events"
402 ],
403 "support": {
404 "issues": "https://github.com/doctrine/event-manager/issues",
405 "source": "https://github.com/doctrine/event-manager/tree/1.2.0"
406 },
407 "funding": [
408 {
409 "url": "https://www.doctrine-project.org/sponsorship.html",
410 "type": "custom"
411 },
412 {
413 "url": "https://www.patreon.com/phpdoctrine",
414 "type": "patreon"
415 },
416 {
417 "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager",
418 "type": "tidelift"
419 }
420 ],
421 "time": "2022-10-12T20:51:15+00:00"
422 },
423 {
424 "name": "doctrine/migrations",
425 "version": "2.3.5",
426 "source": {
427 "type": "git",
428 "url": "https://github.com/doctrine/migrations.git",
429 "reference": "28d92a34348fee5daeb80879e56461b2e862fc05"
430 },
431 "dist": {
432 "type": "zip",
433 "url": "https://api.github.com/repos/doctrine/migrations/zipball/28d92a34348fee5daeb80879e56461b2e862fc05",
434 "reference": "28d92a34348fee5daeb80879e56461b2e862fc05",
435 "shasum": ""
436 },
437 "require": {
438 "composer/package-versions-deprecated": "^1.8",
439 "doctrine/dbal": "^2.9",
440 "friendsofphp/proxy-manager-lts": "^1.0",
441 "php": "^7.1 || ^8.0",
442 "symfony/console": "^3.4||^4.4.16||^5.0",
443 "symfony/stopwatch": "^3.4||^4.0||^5.0"
444 },
445 "require-dev": {
446 "doctrine/coding-standard": "^8.2",
447 "doctrine/orm": "^2.6",
448 "ext-pdo_sqlite": "*",
449 "jdorn/sql-formatter": "^1.1",
450 "mikey179/vfsstream": "^1.6",
451 "phpstan/phpstan": "^0.12",
452 "phpstan/phpstan-deprecation-rules": "^0.12",
453 "phpstan/phpstan-phpunit": "^0.12",
454 "phpstan/phpstan-strict-rules": "^0.12",
455 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4",
456 "symfony/cache": "^4.4. || ^5.3",
457 "symfony/process": "^3.4||^4.0||^5.0",
458 "symfony/yaml": "^3.4||^4.0||^5.0"
459 },
460 "suggest": {
461 "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command.",
462 "symfony/yaml": "Allows the use of yaml for migration configuration files."
463 },
464 "bin": [
465 "bin/doctrine-migrations"
466 ],
467 "type": "library",
468 "autoload": {
469 "psr-4": {
470 "Doctrine\\Migrations\\": "lib/Doctrine/Migrations"
471 }
472 },
473 "notification-url": "https://packagist.org/downloads/",
474 "license": [
475 "MIT"
476 ],
477 "authors": [
478 {
479 "name": "Benjamin Eberlei",
480 "email": "kontakt@beberlei.de"
481 },
482 {
483 "name": "Jonathan Wage",
484 "email": "jonwage@gmail.com"
485 },
486 {
487 "name": "Michael Simonson",
488 "email": "contact@mikesimonson.com"
489 }
490 ],
491 "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.",
492 "homepage": "https://www.doctrine-project.org/projects/migrations.html",
493 "keywords": [
494 "database",
495 "dbal",
496 "migrations",
497 "php"
498 ],
499 "support": {
500 "issues": "https://github.com/doctrine/migrations/issues",
501 "source": "https://github.com/doctrine/migrations/tree/2.3.5"
502 },
503 "funding": [
504 {
505 "url": "https://www.doctrine-project.org/sponsorship.html",
506 "type": "custom"
507 },
508 {
509 "url": "https://www.patreon.com/phpdoctrine",
510 "type": "patreon"
511 },
512 {
513 "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations",
514 "type": "tidelift"
515 }
516 ],
517 "time": "2021-10-19T19:55:20+00:00"
518 },
519 {
520 "name": "friendsofphp/proxy-manager-lts",
521 "version": "v1.0.16",
522 "source": {
523 "type": "git",
524 "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git",
525 "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c"
526 },
527 "dist": {
528 "type": "zip",
529 "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c",
530 "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c",
531 "shasum": ""
532 },
533 "require": {
534 "laminas/laminas-code": "~3.4.1|^4.0",
535 "php": ">=7.1",
536 "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0"
537 },
538 "conflict": {
539 "laminas/laminas-stdlib": "<3.2.1",
540 "zendframework/zend-stdlib": "<3.2.1"
541 },
542 "replace": {
543 "ocramius/proxy-manager": "^2.1"
544 },
545 "require-dev": {
546 "ext-phar": "*",
547 "symfony/phpunit-bridge": "^5.4|^6.0|^7.0"
548 },
549 "type": "library",
550 "extra": {
551 "thanks": {
552 "name": "ocramius/proxy-manager",
553 "url": "https://github.com/Ocramius/ProxyManager"
554 }
555 },
556 "autoload": {
557 "psr-4": {
558 "ProxyManager\\": "src/ProxyManager"
559 }
560 },
561 "notification-url": "https://packagist.org/downloads/",
562 "license": [
563 "MIT"
564 ],
565 "authors": [
566 {
567 "name": "Marco Pivetta",
568 "email": "ocramius@gmail.com",
569 "homepage": "https://ocramius.github.io/"
570 },
571 {
572 "name": "Nicolas Grekas",
573 "email": "p@tchwork.com"
574 }
575 ],
576 "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager",
577 "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts",
578 "keywords": [
579 "aop",
580 "lazy loading",
581 "proxy",
582 "proxy pattern",
583 "service proxies"
584 ],
585 "support": {
586 "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues",
587 "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.16"
588 },
589 "funding": [
590 {
591 "url": "https://github.com/Ocramius",
592 "type": "github"
593 },
594 {
595 "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager",
596 "type": "tidelift"
597 }
598 ],
599 "time": "2023-05-24T07:17:17+00:00"
600 },
601 {
602 "name": "laminas/laminas-code",
603 "version": "4.7.1",
604 "source": {
605 "type": "git",
606 "url": "https://github.com/laminas/laminas-code.git",
607 "reference": "91aabc066d5620428120800c0eafc0411e441a62"
608 },
609 "dist": {
610 "type": "zip",
611 "url": "https://api.github.com/repos/laminas/laminas-code/zipball/91aabc066d5620428120800c0eafc0411e441a62",
612 "reference": "91aabc066d5620428120800c0eafc0411e441a62",
613 "shasum": ""
614 },
615 "require": {
616 "php": ">=7.4, <8.2"
617 },
618 "require-dev": {
619 "doctrine/annotations": "^1.13.2",
620 "ext-phar": "*",
621 "laminas/laminas-coding-standard": "^2.3.0",
622 "laminas/laminas-stdlib": "^3.6.1",
623 "phpunit/phpunit": "^9.5.10",
624 "psalm/plugin-phpunit": "^0.17.0",
625 "vimeo/psalm": "^4.13.1"
626 },
627 "suggest": {
628 "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
629 "laminas/laminas-stdlib": "Laminas\\Stdlib component"
630 },
631 "type": "library",
632 "autoload": {
633 "files": [
634 "polyfill/ReflectionEnumPolyfill.php"
635 ],
636 "psr-4": {
637 "Laminas\\Code\\": "src/"
638 }
639 },
640 "notification-url": "https://packagist.org/downloads/",
641 "license": [
642 "BSD-3-Clause"
643 ],
644 "description": "Extensions to the PHP Reflection API, static code scanning, and code generation",
645 "homepage": "https://laminas.dev",
646 "keywords": [
647 "code",
648 "laminas",
649 "laminasframework"
650 ],
651 "support": {
652 "chat": "https://laminas.dev/chat",
653 "docs": "https://docs.laminas.dev/laminas-code/",
654 "forum": "https://discourse.laminas.dev",
655 "issues": "https://github.com/laminas/laminas-code/issues",
656 "rss": "https://github.com/laminas/laminas-code/releases.atom",
657 "source": "https://github.com/laminas/laminas-code"
658 },
659 "funding": [
660 {
661 "url": "https://funding.communitybridge.org/projects/laminas-project",
662 "type": "community_bridge"
663 }
664 ],
665 "time": "2022-11-21T01:32:31+00:00"
666 },
667 {
668 "name": "paragonie/constant_time_encoding",
669 "version": "v2.6.3",
670 "source": {
671 "type": "git",
672 "url": "https://github.com/paragonie/constant_time_encoding.git",
673 "reference": "58c3f47f650c94ec05a151692652a868995d2938"
674 },
675 "dist": {
676 "type": "zip",
677 "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938",
678 "reference": "58c3f47f650c94ec05a151692652a868995d2938",
679 "shasum": ""
680 },
681 "require": {
682 "php": "^7|^8"
683 },
684 "require-dev": {
685 "phpunit/phpunit": "^6|^7|^8|^9",
686 "vimeo/psalm": "^1|^2|^3|^4"
687 },
688 "type": "library",
689 "autoload": {
690 "psr-4": {
691 "ParagonIE\\ConstantTime\\": "src/"
692 }
693 },
694 "notification-url": "https://packagist.org/downloads/",
695 "license": [
696 "MIT"
697 ],
698 "authors": [
699 {
700 "name": "Paragon Initiative Enterprises",
701 "email": "security@paragonie.com",
702 "homepage": "https://paragonie.com",
703 "role": "Maintainer"
704 },
705 {
706 "name": "Steve 'Sc00bz' Thomas",
707 "email": "steve@tobtu.com",
708 "homepage": "https://www.tobtu.com",
709 "role": "Original Developer"
710 }
711 ],
712 "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
713 "keywords": [
714 "base16",
715 "base32",
716 "base32_decode",
717 "base32_encode",
718 "base64",
719 "base64_decode",
720 "base64_encode",
721 "bin2hex",
722 "encoding",
723 "hex",
724 "hex2bin",
725 "rfc4648"
726 ],
727 "support": {
728 "email": "info@paragonie.com",
729 "issues": "https://github.com/paragonie/constant_time_encoding/issues",
730 "source": "https://github.com/paragonie/constant_time_encoding"
731 },
732 "time": "2022-06-14T06:56:20+00:00"
733 },
734 {
735 "name": "paragonie/random_compat",
736 "version": "v9.99.100",
737 "source": {
738 "type": "git",
739 "url": "https://github.com/paragonie/random_compat.git",
740 "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
741 },
742 "dist": {
743 "type": "zip",
744 "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
745 "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
746 "shasum": ""
747 },
748 "require": {
749 "php": ">= 7"
750 },
751 "require-dev": {
752 "phpunit/phpunit": "4.*|5.*",
753 "vimeo/psalm": "^1"
754 },
755 "suggest": {
756 "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
757 },
758 "type": "library",
759 "notification-url": "https://packagist.org/downloads/",
760 "license": [
761 "MIT"
762 ],
763 "authors": [
764 {
765 "name": "Paragon Initiative Enterprises",
766 "email": "security@paragonie.com",
767 "homepage": "https://paragonie.com"
768 }
769 ],
770 "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
771 "keywords": [
772 "csprng",
773 "polyfill",
774 "pseudorandom",
775 "random"
776 ],
777 "support": {
778 "email": "info@paragonie.com",
779 "issues": "https://github.com/paragonie/random_compat/issues",
780 "source": "https://github.com/paragonie/random_compat"
781 },
782 "time": "2020-10-15T08:29:30+00:00"
783 },
784 {
785 "name": "php-amqplib/php-amqplib",
786 "version": "v3.5.4",
787 "source": {
788 "type": "git",
789 "url": "https://github.com/php-amqplib/php-amqplib.git",
790 "reference": "1aecbd182b35eb039667c50d7d92d71f105be779"
791 },
792 "dist": {
793 "type": "zip",
794 "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/1aecbd182b35eb039667c50d7d92d71f105be779",
795 "reference": "1aecbd182b35eb039667c50d7d92d71f105be779",
796 "shasum": ""
797 },
798 "require": {
799 "ext-mbstring": "*",
800 "ext-sockets": "*",
801 "php": "^7.1||^8.0",
802 "phpseclib/phpseclib": "^2.0|^3.0"
803 },
804 "conflict": {
805 "php": "7.4.0 - 7.4.1"
806 },
807 "replace": {
808 "videlalvaro/php-amqplib": "self.version"
809 },
810 "require-dev": {
811 "ext-curl": "*",
812 "nategood/httpful": "^0.2.20",
813 "phpunit/phpunit": "^7.5|^9.5",
814 "squizlabs/php_codesniffer": "^3.6"
815 },
816 "type": "library",
817 "extra": {
818 "branch-alias": {
819 "dev-master": "3.0-dev"
820 }
821 },
822 "autoload": {
823 "psr-4": {
824 "PhpAmqpLib\\": "PhpAmqpLib/"
825 }
826 },
827 "notification-url": "https://packagist.org/downloads/",
828 "license": [
829 "LGPL-2.1-or-later"
830 ],
831 "authors": [
832 {
833 "name": "Alvaro Videla",
834 "role": "Original Maintainer"
835 },
836 {
837 "name": "Raúl Araya",
838 "email": "nubeiro@gmail.com",
839 "role": "Maintainer"
840 },
841 {
842 "name": "Luke Bakken",
843 "email": "luke@bakken.io",
844 "role": "Maintainer"
845 },
846 {
847 "name": "Ramūnas Dronga",
848 "email": "github@ramuno.lt",
849 "role": "Maintainer"
850 }
851 ],
852 "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.",
853 "homepage": "https://github.com/php-amqplib/php-amqplib/",
854 "keywords": [
855 "message",
856 "queue",
857 "rabbitmq"
858 ],
859 "support": {
860 "issues": "https://github.com/php-amqplib/php-amqplib/issues",
861 "source": "https://github.com/php-amqplib/php-amqplib/tree/v3.5.4"
862 },
863 "time": "2023-07-01T11:25:08+00:00"
864 },
865 {
866 "name": "phpseclib/phpseclib",
867 "version": "3.0.21",
868 "source": {
869 "type": "git",
870 "url": "https://github.com/phpseclib/phpseclib.git",
871 "reference": "4580645d3fc05c189024eb3b834c6c1e4f0f30a1"
872 },
873 "dist": {
874 "type": "zip",
875 "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/4580645d3fc05c189024eb3b834c6c1e4f0f30a1",
876 "reference": "4580645d3fc05c189024eb3b834c6c1e4f0f30a1",
877 "shasum": ""
878 },
879 "require": {
880 "paragonie/constant_time_encoding": "^1|^2",
881 "paragonie/random_compat": "^1.4|^2.0|^9.99.99",
882 "php": ">=5.6.1"
883 },
884 "require-dev": {
885 "phpunit/phpunit": "*"
886 },
887 "suggest": {
888 "ext-dom": "Install the DOM extension to load XML formatted public keys.",
889 "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
890 "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
891 "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
892 "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
893 },
894 "type": "library",
895 "autoload": {
896 "files": [
897 "phpseclib/bootstrap.php"
898 ],
899 "psr-4": {
900 "phpseclib3\\": "phpseclib/"
901 }
902 },
903 "notification-url": "https://packagist.org/downloads/",
904 "license": [
905 "MIT"
906 ],
907 "authors": [
908 {
909 "name": "Jim Wigginton",
910 "email": "terrafrost@php.net",
911 "role": "Lead Developer"
912 },
913 {
914 "name": "Patrick Monnerat",
915 "email": "pm@datasphere.ch",
916 "role": "Developer"
917 },
918 {
919 "name": "Andreas Fischer",
920 "email": "bantu@phpbb.com",
921 "role": "Developer"
922 },
923 {
924 "name": "Hans-Jürgen Petrich",
925 "email": "petrich@tronic-media.com",
926 "role": "Developer"
927 },
928 {
929 "name": "Graham Campbell",
930 "email": "graham@alt-three.com",
931 "role": "Developer"
932 }
933 ],
934 "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
935 "homepage": "http://phpseclib.sourceforge.net",
936 "keywords": [
937 "BigInteger",
938 "aes",
939 "asn.1",
940 "asn1",
941 "blowfish",
942 "crypto",
943 "cryptography",
944 "encryption",
945 "rsa",
946 "security",
947 "sftp",
948 "signature",
949 "signing",
950 "ssh",
951 "twofish",
952 "x.509",
953 "x509"
954 ],
955 "support": {
956 "issues": "https://github.com/phpseclib/phpseclib/issues",
957 "source": "https://github.com/phpseclib/phpseclib/tree/3.0.21"
958 },
959 "funding": [
960 {
961 "url": "https://github.com/terrafrost",
962 "type": "github"
963 },
964 {
965 "url": "https://www.patreon.com/phpseclib",
966 "type": "patreon"
967 },
968 {
969 "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
970 "type": "tidelift"
971 }
972 ],
973 "time": "2023-07-09T15:24:48+00:00"
974 },
975 {
976 "name": "psr/container",
977 "version": "2.0.2",
978 "source": {
979 "type": "git",
980 "url": "https://github.com/php-fig/container.git",
981 "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
982 },
983 "dist": {
984 "type": "zip",
985 "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
986 "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
987 "shasum": ""
988 },
989 "require": {
990 "php": ">=7.4.0"
991 },
992 "type": "library",
993 "extra": {
994 "branch-alias": {
995 "dev-master": "2.0.x-dev"
996 }
997 },
998 "autoload": {
999 "psr-4": {
1000 "Psr\\Container\\": "src/"
1001 }
1002 },
1003 "notification-url": "https://packagist.org/downloads/",
1004 "license": [
1005 "MIT"
1006 ],
1007 "authors": [
1008 {
1009 "name": "PHP-FIG",
1010 "homepage": "https://www.php-fig.org/"
1011 }
1012 ],
1013 "description": "Common Container Interface (PHP FIG PSR-11)",
1014 "homepage": "https://github.com/php-fig/container",
1015 "keywords": [
1016 "PSR-11",
1017 "container",
1018 "container-interface",
1019 "container-interop",
1020 "psr"
1021 ],
1022 "support": {
1023 "issues": "https://github.com/php-fig/container/issues",
1024 "source": "https://github.com/php-fig/container/tree/2.0.2"
1025 },
1026 "time": "2021-11-05T16:47:00+00:00"
1027 },
1028 {
1029 "name": "symfony/console",
1030 "version": "v5.4.26",
1031 "source": {
1032 "type": "git",
1033 "url": "https://github.com/symfony/console.git",
1034 "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273"
1035 },
1036 "dist": {
1037 "type": "zip",
1038 "url": "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273",
1039 "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273",
1040 "shasum": ""
1041 },
1042 "require": {
1043 "php": ">=7.2.5",
1044 "symfony/deprecation-contracts": "^2.1|^3",
1045 "symfony/polyfill-mbstring": "~1.0",
1046 "symfony/polyfill-php73": "^1.9",
1047 "symfony/polyfill-php80": "^1.16",
1048 "symfony/service-contracts": "^1.1|^2|^3",
1049 "symfony/string": "^5.1|^6.0"
1050 },
1051 "conflict": {
1052 "psr/log": ">=3",
1053 "symfony/dependency-injection": "<4.4",
1054 "symfony/dotenv": "<5.1",
1055 "symfony/event-dispatcher": "<4.4",
1056 "symfony/lock": "<4.4",
1057 "symfony/process": "<4.4"
1058 },
1059 "provide": {
1060 "psr/log-implementation": "1.0|2.0"
1061 },
1062 "require-dev": {
1063 "psr/log": "^1|^2",
1064 "symfony/config": "^4.4|^5.0|^6.0",
1065 "symfony/dependency-injection": "^4.4|^5.0|^6.0",
1066 "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
1067 "symfony/lock": "^4.4|^5.0|^6.0",
1068 "symfony/process": "^4.4|^5.0|^6.0",
1069 "symfony/var-dumper": "^4.4|^5.0|^6.0"
1070 },
1071 "suggest": {
1072 "psr/log": "For using the console logger",
1073 "symfony/event-dispatcher": "",
1074 "symfony/lock": "",
1075 "symfony/process": ""
1076 },
1077 "type": "library",
1078 "autoload": {
1079 "psr-4": {
1080 "Symfony\\Component\\Console\\": ""
1081 },
1082 "exclude-from-classmap": [
1083 "/Tests/"
1084 ]
1085 },
1086 "notification-url": "https://packagist.org/downloads/",
1087 "license": [
1088 "MIT"
1089 ],
1090 "authors": [
1091 {
1092 "name": "Fabien Potencier",
1093 "email": "fabien@symfony.com"
1094 },
1095 {
1096 "name": "Symfony Community",
1097 "homepage": "https://symfony.com/contributors"
1098 }
1099 ],
1100 "description": "Eases the creation of beautiful and testable command line interfaces",
1101 "homepage": "https://symfony.com",
1102 "keywords": [
1103 "cli",
1104 "command-line",
1105 "console",
1106 "terminal"
1107 ],
1108 "support": {
1109 "source": "https://github.com/symfony/console/tree/v5.4.26"
1110 },
1111 "funding": [
1112 {
1113 "url": "https://symfony.com/sponsor",
1114 "type": "custom"
1115 },
1116 {
1117 "url": "https://github.com/fabpot",
1118 "type": "github"
1119 },
1120 {
1121 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1122 "type": "tidelift"
1123 }
1124 ],
1125 "time": "2023-07-19T20:11:33+00:00"
1126 },
1127 {
1128 "name": "symfony/deprecation-contracts",
1129 "version": "v3.0.2",
1130 "source": {
1131 "type": "git",
1132 "url": "https://github.com/symfony/deprecation-contracts.git",
1133 "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
1134 },
1135 "dist": {
1136 "type": "zip",
1137 "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
1138 "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
1139 "shasum": ""
1140 },
1141 "require": {
1142 "php": ">=8.0.2"
1143 },
1144 "type": "library",
1145 "extra": {
1146 "branch-alias": {
1147 "dev-main": "3.0-dev"
1148 },
1149 "thanks": {
1150 "name": "symfony/contracts",
1151 "url": "https://github.com/symfony/contracts"
1152 }
1153 },
1154 "autoload": {
1155 "files": [
1156 "function.php"
1157 ]
1158 },
1159 "notification-url": "https://packagist.org/downloads/",
1160 "license": [
1161 "MIT"
1162 ],
1163 "authors": [
1164 {
1165 "name": "Nicolas Grekas",
1166 "email": "p@tchwork.com"
1167 },
1168 {
1169 "name": "Symfony Community",
1170 "homepage": "https://symfony.com/contributors"
1171 }
1172 ],
1173 "description": "A generic function and convention to trigger deprecation notices",
1174 "homepage": "https://symfony.com",
1175 "support": {
1176 "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2"
1177 },
1178 "funding": [
1179 {
1180 "url": "https://symfony.com/sponsor",
1181 "type": "custom"
1182 },
1183 {
1184 "url": "https://github.com/fabpot",
1185 "type": "github"
1186 },
1187 {
1188 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1189 "type": "tidelift"
1190 }
1191 ],
1192 "time": "2022-01-02T09:55:41+00:00"
1193 },
1194 {
1195 "name": "symfony/filesystem",
1196 "version": "v6.0.19",
1197 "source": {
1198 "type": "git",
1199 "url": "https://github.com/symfony/filesystem.git",
1200 "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214"
1201 },
1202 "dist": {
1203 "type": "zip",
1204 "url": "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214",
1205 "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214",
1206 "shasum": ""
1207 },
1208 "require": {
1209 "php": ">=8.0.2",
1210 "symfony/polyfill-ctype": "~1.8",
1211 "symfony/polyfill-mbstring": "~1.8"
1212 },
1213 "type": "library",
1214 "autoload": {
1215 "psr-4": {
1216 "Symfony\\Component\\Filesystem\\": ""
1217 },
1218 "exclude-from-classmap": [
1219 "/Tests/"
1220 ]
1221 },
1222 "notification-url": "https://packagist.org/downloads/",
1223 "license": [
1224 "MIT"
1225 ],
1226 "authors": [
1227 {
1228 "name": "Fabien Potencier",
1229 "email": "fabien@symfony.com"
1230 },
1231 {
1232 "name": "Symfony Community",
1233 "homepage": "https://symfony.com/contributors"
1234 }
1235 ],
1236 "description": "Provides basic utilities for the filesystem",
1237 "homepage": "https://symfony.com",
1238 "support": {
1239 "source": "https://github.com/symfony/filesystem/tree/v6.0.19"
1240 },
1241 "funding": [
1242 {
1243 "url": "https://symfony.com/sponsor",
1244 "type": "custom"
1245 },
1246 {
1247 "url": "https://github.com/fabpot",
1248 "type": "github"
1249 },
1250 {
1251 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1252 "type": "tidelift"
1253 }
1254 ],
1255 "time": "2023-01-20T17:44:14+00:00"
1256 },
1257 {
1258 "name": "symfony/polyfill-ctype",
1259 "version": "v1.27.0",
1260 "source": {
1261 "type": "git",
1262 "url": "https://github.com/symfony/polyfill-ctype.git",
1263 "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
1264 },
1265 "dist": {
1266 "type": "zip",
1267 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
1268 "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
1269 "shasum": ""
1270 },
1271 "require": {
1272 "php": ">=7.1"
1273 },
1274 "provide": {
1275 "ext-ctype": "*"
1276 },
1277 "suggest": {
1278 "ext-ctype": "For best performance"
1279 },
1280 "type": "library",
1281 "extra": {
1282 "branch-alias": {
1283 "dev-main": "1.27-dev"
1284 },
1285 "thanks": {
1286 "name": "symfony/polyfill",
1287 "url": "https://github.com/symfony/polyfill"
1288 }
1289 },
1290 "autoload": {
1291 "files": [
1292 "bootstrap.php"
1293 ],
1294 "psr-4": {
1295 "Symfony\\Polyfill\\Ctype\\": ""
1296 }
1297 },
1298 "notification-url": "https://packagist.org/downloads/",
1299 "license": [
1300 "MIT"
1301 ],
1302 "authors": [
1303 {
1304 "name": "Gert de Pagter",
1305 "email": "BackEndTea@gmail.com"
1306 },
1307 {
1308 "name": "Symfony Community",
1309 "homepage": "https://symfony.com/contributors"
1310 }
1311 ],
1312 "description": "Symfony polyfill for ctype functions",
1313 "homepage": "https://symfony.com",
1314 "keywords": [
1315 "compatibility",
1316 "ctype",
1317 "polyfill",
1318 "portable"
1319 ],
1320 "support": {
1321 "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
1322 },
1323 "funding": [
1324 {
1325 "url": "https://symfony.com/sponsor",
1326 "type": "custom"
1327 },
1328 {
1329 "url": "https://github.com/fabpot",
1330 "type": "github"
1331 },
1332 {
1333 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1334 "type": "tidelift"
1335 }
1336 ],
1337 "time": "2022-11-03T14:55:06+00:00"
1338 },
1339 {
1340 "name": "symfony/polyfill-intl-grapheme",
1341 "version": "v1.27.0",
1342 "source": {
1343 "type": "git",
1344 "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
1345 "reference": "511a08c03c1960e08a883f4cffcacd219b758354"
1346 },
1347 "dist": {
1348 "type": "zip",
1349 "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
1350 "reference": "511a08c03c1960e08a883f4cffcacd219b758354",
1351 "shasum": ""
1352 },
1353 "require": {
1354 "php": ">=7.1"
1355 },
1356 "suggest": {
1357 "ext-intl": "For best performance"
1358 },
1359 "type": "library",
1360 "extra": {
1361 "branch-alias": {
1362 "dev-main": "1.27-dev"
1363 },
1364 "thanks": {
1365 "name": "symfony/polyfill",
1366 "url": "https://github.com/symfony/polyfill"
1367 }
1368 },
1369 "autoload": {
1370 "files": [
1371 "bootstrap.php"
1372 ],
1373 "psr-4": {
1374 "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
1375 }
1376 },
1377 "notification-url": "https://packagist.org/downloads/",
1378 "license": [
1379 "MIT"
1380 ],
1381 "authors": [
1382 {
1383 "name": "Nicolas Grekas",
1384 "email": "p@tchwork.com"
1385 },
1386 {
1387 "name": "Symfony Community",
1388 "homepage": "https://symfony.com/contributors"
1389 }
1390 ],
1391 "description": "Symfony polyfill for intl's grapheme_* functions",
1392 "homepage": "https://symfony.com",
1393 "keywords": [
1394 "compatibility",
1395 "grapheme",
1396 "intl",
1397 "polyfill",
1398 "portable",
1399 "shim"
1400 ],
1401 "support": {
1402 "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
1403 },
1404 "funding": [
1405 {
1406 "url": "https://symfony.com/sponsor",
1407 "type": "custom"
1408 },
1409 {
1410 "url": "https://github.com/fabpot",
1411 "type": "github"
1412 },
1413 {
1414 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1415 "type": "tidelift"
1416 }
1417 ],
1418 "time": "2022-11-03T14:55:06+00:00"
1419 },
1420 {
1421 "name": "symfony/polyfill-intl-normalizer",
1422 "version": "v1.27.0",
1423 "source": {
1424 "type": "git",
1425 "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
1426 "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
1427 },
1428 "dist": {
1429 "type": "zip",
1430 "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
1431 "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
1432 "shasum": ""
1433 },
1434 "require": {
1435 "php": ">=7.1"
1436 },
1437 "suggest": {
1438 "ext-intl": "For best performance"
1439 },
1440 "type": "library",
1441 "extra": {
1442 "branch-alias": {
1443 "dev-main": "1.27-dev"
1444 },
1445 "thanks": {
1446 "name": "symfony/polyfill",
1447 "url": "https://github.com/symfony/polyfill"
1448 }
1449 },
1450 "autoload": {
1451 "files": [
1452 "bootstrap.php"
1453 ],
1454 "psr-4": {
1455 "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
1456 },
1457 "classmap": [
1458 "Resources/stubs"
1459 ]
1460 },
1461 "notification-url": "https://packagist.org/downloads/",
1462 "license": [
1463 "MIT"
1464 ],
1465 "authors": [
1466 {
1467 "name": "Nicolas Grekas",
1468 "email": "p@tchwork.com"
1469 },
1470 {
1471 "name": "Symfony Community",
1472 "homepage": "https://symfony.com/contributors"
1473 }
1474 ],
1475 "description": "Symfony polyfill for intl's Normalizer class and related functions",
1476 "homepage": "https://symfony.com",
1477 "keywords": [
1478 "compatibility",
1479 "intl",
1480 "normalizer",
1481 "polyfill",
1482 "portable",
1483 "shim"
1484 ],
1485 "support": {
1486 "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
1487 },
1488 "funding": [
1489 {
1490 "url": "https://symfony.com/sponsor",
1491 "type": "custom"
1492 },
1493 {
1494 "url": "https://github.com/fabpot",
1495 "type": "github"
1496 },
1497 {
1498 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1499 "type": "tidelift"
1500 }
1501 ],
1502 "time": "2022-11-03T14:55:06+00:00"
1503 },
1504 {
1505 "name": "symfony/polyfill-mbstring",
1506 "version": "v1.27.0",
1507 "source": {
1508 "type": "git",
1509 "url": "https://github.com/symfony/polyfill-mbstring.git",
1510 "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
1511 },
1512 "dist": {
1513 "type": "zip",
1514 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
1515 "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
1516 "shasum": ""
1517 },
1518 "require": {
1519 "php": ">=7.1"
1520 },
1521 "provide": {
1522 "ext-mbstring": "*"
1523 },
1524 "suggest": {
1525 "ext-mbstring": "For best performance"
1526 },
1527 "type": "library",
1528 "extra": {
1529 "branch-alias": {
1530 "dev-main": "1.27-dev"
1531 },
1532 "thanks": {
1533 "name": "symfony/polyfill",
1534 "url": "https://github.com/symfony/polyfill"
1535 }
1536 },
1537 "autoload": {
1538 "files": [
1539 "bootstrap.php"
1540 ],
1541 "psr-4": {
1542 "Symfony\\Polyfill\\Mbstring\\": ""
1543 }
1544 },
1545 "notification-url": "https://packagist.org/downloads/",
1546 "license": [
1547 "MIT"
1548 ],
1549 "authors": [
1550 {
1551 "name": "Nicolas Grekas",
1552 "email": "p@tchwork.com"
1553 },
1554 {
1555 "name": "Symfony Community",
1556 "homepage": "https://symfony.com/contributors"
1557 }
1558 ],
1559 "description": "Symfony polyfill for the Mbstring extension",
1560 "homepage": "https://symfony.com",
1561 "keywords": [
1562 "compatibility",
1563 "mbstring",
1564 "polyfill",
1565 "portable",
1566 "shim"
1567 ],
1568 "support": {
1569 "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
1570 },
1571 "funding": [
1572 {
1573 "url": "https://symfony.com/sponsor",
1574 "type": "custom"
1575 },
1576 {
1577 "url": "https://github.com/fabpot",
1578 "type": "github"
1579 },
1580 {
1581 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1582 "type": "tidelift"
1583 }
1584 ],
1585 "time": "2022-11-03T14:55:06+00:00"
1586 },
1587 {
1588 "name": "symfony/polyfill-php73",
1589 "version": "v1.27.0",
1590 "source": {
1591 "type": "git",
1592 "url": "https://github.com/symfony/polyfill-php73.git",
1593 "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9"
1594 },
1595 "dist": {
1596 "type": "zip",
1597 "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
1598 "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
1599 "shasum": ""
1600 },
1601 "require": {
1602 "php": ">=7.1"
1603 },
1604 "type": "library",
1605 "extra": {
1606 "branch-alias": {
1607 "dev-main": "1.27-dev"
1608 },
1609 "thanks": {
1610 "name": "symfony/polyfill",
1611 "url": "https://github.com/symfony/polyfill"
1612 }
1613 },
1614 "autoload": {
1615 "files": [
1616 "bootstrap.php"
1617 ],
1618 "psr-4": {
1619 "Symfony\\Polyfill\\Php73\\": ""
1620 },
1621 "classmap": [
1622 "Resources/stubs"
1623 ]
1624 },
1625 "notification-url": "https://packagist.org/downloads/",
1626 "license": [
1627 "MIT"
1628 ],
1629 "authors": [
1630 {
1631 "name": "Nicolas Grekas",
1632 "email": "p@tchwork.com"
1633 },
1634 {
1635 "name": "Symfony Community",
1636 "homepage": "https://symfony.com/contributors"
1637 }
1638 ],
1639 "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
1640 "homepage": "https://symfony.com",
1641 "keywords": [
1642 "compatibility",
1643 "polyfill",
1644 "portable",
1645 "shim"
1646 ],
1647 "support": {
1648 "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0"
1649 },
1650 "funding": [
1651 {
1652 "url": "https://symfony.com/sponsor",
1653 "type": "custom"
1654 },
1655 {
1656 "url": "https://github.com/fabpot",
1657 "type": "github"
1658 },
1659 {
1660 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1661 "type": "tidelift"
1662 }
1663 ],
1664 "time": "2022-11-03T14:55:06+00:00"
1665 },
1666 {
1667 "name": "symfony/polyfill-php80",
1668 "version": "v1.27.0",
1669 "source": {
1670 "type": "git",
1671 "url": "https://github.com/symfony/polyfill-php80.git",
1672 "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
1673 },
1674 "dist": {
1675 "type": "zip",
1676 "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
1677 "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
1678 "shasum": ""
1679 },
1680 "require": {
1681 "php": ">=7.1"
1682 },
1683 "type": "library",
1684 "extra": {
1685 "branch-alias": {
1686 "dev-main": "1.27-dev"
1687 },
1688 "thanks": {
1689 "name": "symfony/polyfill",
1690 "url": "https://github.com/symfony/polyfill"
1691 }
1692 },
1693 "autoload": {
1694 "files": [
1695 "bootstrap.php"
1696 ],
1697 "psr-4": {
1698 "Symfony\\Polyfill\\Php80\\": ""
1699 },
1700 "classmap": [
1701 "Resources/stubs"
1702 ]
1703 },
1704 "notification-url": "https://packagist.org/downloads/",
1705 "license": [
1706 "MIT"
1707 ],
1708 "authors": [
1709 {
1710 "name": "Ion Bazan",
1711 "email": "ion.bazan@gmail.com"
1712 },
1713 {
1714 "name": "Nicolas Grekas",
1715 "email": "p@tchwork.com"
1716 },
1717 {
1718 "name": "Symfony Community",
1719 "homepage": "https://symfony.com/contributors"
1720 }
1721 ],
1722 "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
1723 "homepage": "https://symfony.com",
1724 "keywords": [
1725 "compatibility",
1726 "polyfill",
1727 "portable",
1728 "shim"
1729 ],
1730 "support": {
1731 "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
1732 },
1733 "funding": [
1734 {
1735 "url": "https://symfony.com/sponsor",
1736 "type": "custom"
1737 },
1738 {
1739 "url": "https://github.com/fabpot",
1740 "type": "github"
1741 },
1742 {
1743 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1744 "type": "tidelift"
1745 }
1746 ],
1747 "time": "2022-11-03T14:55:06+00:00"
1748 },
1749 {
1750 "name": "symfony/service-contracts",
1751 "version": "v3.0.2",
1752 "source": {
1753 "type": "git",
1754 "url": "https://github.com/symfony/service-contracts.git",
1755 "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66"
1756 },
1757 "dist": {
1758 "type": "zip",
1759 "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
1760 "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
1761 "shasum": ""
1762 },
1763 "require": {
1764 "php": ">=8.0.2",
1765 "psr/container": "^2.0"
1766 },
1767 "conflict": {
1768 "ext-psr": "<1.1|>=2"
1769 },
1770 "suggest": {
1771 "symfony/service-implementation": ""
1772 },
1773 "type": "library",
1774 "extra": {
1775 "branch-alias": {
1776 "dev-main": "3.0-dev"
1777 },
1778 "thanks": {
1779 "name": "symfony/contracts",
1780 "url": "https://github.com/symfony/contracts"
1781 }
1782 },
1783 "autoload": {
1784 "psr-4": {
1785 "Symfony\\Contracts\\Service\\": ""
1786 }
1787 },
1788 "notification-url": "https://packagist.org/downloads/",
1789 "license": [
1790 "MIT"
1791 ],
1792 "authors": [
1793 {
1794 "name": "Nicolas Grekas",
1795 "email": "p@tchwork.com"
1796 },
1797 {
1798 "name": "Symfony Community",
1799 "homepage": "https://symfony.com/contributors"
1800 }
1801 ],
1802 "description": "Generic abstractions related to writing services",
1803 "homepage": "https://symfony.com",
1804 "keywords": [
1805 "abstractions",
1806 "contracts",
1807 "decoupling",
1808 "interfaces",
1809 "interoperability",
1810 "standards"
1811 ],
1812 "support": {
1813 "source": "https://github.com/symfony/service-contracts/tree/v3.0.2"
1814 },
1815 "funding": [
1816 {
1817 "url": "https://symfony.com/sponsor",
1818 "type": "custom"
1819 },
1820 {
1821 "url": "https://github.com/fabpot",
1822 "type": "github"
1823 },
1824 {
1825 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1826 "type": "tidelift"
1827 }
1828 ],
1829 "time": "2022-05-30T19:17:58+00:00"
1830 },
1831 {
1832 "name": "symfony/stopwatch",
1833 "version": "v5.4.21",
1834 "source": {
1835 "type": "git",
1836 "url": "https://github.com/symfony/stopwatch.git",
1837 "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee"
1838 },
1839 "dist": {
1840 "type": "zip",
1841 "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f83692cd869a6f2391691d40a01e8acb89e76fee",
1842 "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee",
1843 "shasum": ""
1844 },
1845 "require": {
1846 "php": ">=7.2.5",
1847 "symfony/service-contracts": "^1|^2|^3"
1848 },
1849 "type": "library",
1850 "autoload": {
1851 "psr-4": {
1852 "Symfony\\Component\\Stopwatch\\": ""
1853 },
1854 "exclude-from-classmap": [
1855 "/Tests/"
1856 ]
1857 },
1858 "notification-url": "https://packagist.org/downloads/",
1859 "license": [
1860 "MIT"
1861 ],
1862 "authors": [
1863 {
1864 "name": "Fabien Potencier",
1865 "email": "fabien@symfony.com"
1866 },
1867 {
1868 "name": "Symfony Community",
1869 "homepage": "https://symfony.com/contributors"
1870 }
1871 ],
1872 "description": "Provides a way to profile code",
1873 "homepage": "https://symfony.com",
1874 "support": {
1875 "source": "https://github.com/symfony/stopwatch/tree/v5.4.21"
1876 },
1877 "funding": [
1878 {
1879 "url": "https://symfony.com/sponsor",
1880 "type": "custom"
1881 },
1882 {
1883 "url": "https://github.com/fabpot",
1884 "type": "github"
1885 },
1886 {
1887 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1888 "type": "tidelift"
1889 }
1890 ],
1891 "time": "2023-02-14T08:03:56+00:00"
1892 },
1893 {
1894 "name": "symfony/string",
1895 "version": "v6.0.19",
1896 "source": {
1897 "type": "git",
1898 "url": "https://github.com/symfony/string.git",
1899 "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a"
1900 },
1901 "dist": {
1902 "type": "zip",
1903 "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a",
1904 "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a",
1905 "shasum": ""
1906 },
1907 "require": {
1908 "php": ">=8.0.2",
1909 "symfony/polyfill-ctype": "~1.8",
1910 "symfony/polyfill-intl-grapheme": "~1.0",
1911 "symfony/polyfill-intl-normalizer": "~1.0",
1912 "symfony/polyfill-mbstring": "~1.0"
1913 },
1914 "conflict": {
1915 "symfony/translation-contracts": "<2.0"
1916 },
1917 "require-dev": {
1918 "symfony/error-handler": "^5.4|^6.0",
1919 "symfony/http-client": "^5.4|^6.0",
1920 "symfony/translation-contracts": "^2.0|^3.0",
1921 "symfony/var-exporter": "^5.4|^6.0"
1922 },
1923 "type": "library",
1924 "autoload": {
1925 "files": [
1926 "Resources/functions.php"
1927 ],
1928 "psr-4": {
1929 "Symfony\\Component\\String\\": ""
1930 },
1931 "exclude-from-classmap": [
1932 "/Tests/"
1933 ]
1934 },
1935 "notification-url": "https://packagist.org/downloads/",
1936 "license": [
1937 "MIT"
1938 ],
1939 "authors": [
1940 {
1941 "name": "Nicolas Grekas",
1942 "email": "p@tchwork.com"
1943 },
1944 {
1945 "name": "Symfony Community",
1946 "homepage": "https://symfony.com/contributors"
1947 }
1948 ],
1949 "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
1950 "homepage": "https://symfony.com",
1951 "keywords": [
1952 "grapheme",
1953 "i18n",
1954 "string",
1955 "unicode",
1956 "utf-8",
1957 "utf8"
1958 ],
1959 "support": {
1960 "source": "https://github.com/symfony/string/tree/v6.0.19"
1961 },
1962 "funding": [
1963 {
1964 "url": "https://symfony.com/sponsor",
1965 "type": "custom"
1966 },
1967 {
1968 "url": "https://github.com/fabpot",
1969 "type": "github"
1970 },
1971 {
1972 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1973 "type": "tidelift"
1974 }
1975 ],
1976 "time": "2023-01-01T08:36:10+00:00"
1977 },
1978 {
1979 "name": "symfony/yaml",
1980 "version": "v5.4.23",
1981 "source": {
1982 "type": "git",
1983 "url": "https://github.com/symfony/yaml.git",
1984 "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b"
1985 },
1986 "dist": {
1987 "type": "zip",
1988 "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b",
1989 "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b",
1990 "shasum": ""
1991 },
1992 "require": {
1993 "php": ">=7.2.5",
1994 "symfony/deprecation-contracts": "^2.1|^3",
1995 "symfony/polyfill-ctype": "^1.8"
1996 },
1997 "conflict": {
1998 "symfony/console": "<5.3"
1999 },
2000 "require-dev": {
2001 "symfony/console": "^5.3|^6.0"
2002 },
2003 "suggest": {
2004 "symfony/console": "For validating YAML files using the lint command"
2005 },
2006 "bin": [
2007 "Resources/bin/yaml-lint"
2008 ],
2009 "type": "library",
2010 "autoload": {
2011 "psr-4": {
2012 "Symfony\\Component\\Yaml\\": ""
2013 },
2014 "exclude-from-classmap": [
2015 "/Tests/"
2016 ]
2017 },
2018 "notification-url": "https://packagist.org/downloads/",
2019 "license": [
2020 "MIT"
2021 ],
2022 "authors": [
2023 {
2024 "name": "Fabien Potencier",
2025 "email": "fabien@symfony.com"
2026 },
2027 {
2028 "name": "Symfony Community",
2029 "homepage": "https://symfony.com/contributors"
2030 }
2031 ],
2032 "description": "Loads and dumps YAML files",
2033 "homepage": "https://symfony.com",
2034 "support": {
2035 "source": "https://github.com/symfony/yaml/tree/v5.4.23"
2036 },
2037 "funding": [
2038 {
2039 "url": "https://symfony.com/sponsor",
2040 "type": "custom"
2041 },
2042 {
2043 "url": "https://github.com/fabpot",
2044 "type": "github"
2045 },
2046 {
2047 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
2048 "type": "tidelift"
2049 }
2050 ],
2051 "time": "2023-04-23T19:33:36+00:00"
2052 }
2053 ],
2054 "packages-dev": [],
2055 "aliases": [],
2056 "minimum-stability": "stable",
2057 "stability-flags": [],
2058 "prefer-stable": false,
2059 "prefer-lowest": false,
2060 "platform": {
2061 "php": ">=7.2.0",
2062 "ext-redis": "*",
2063 "ext-gearman": "*",
2064 "ext-mbstring": "*",
2065 "ext-bcmath": "*",
2066 "ext-json": "*",
2067 "ext-iconv": "*",
2068 "ext-pdo": "*"
2069 },
2070 "platform-dev": [],
2071 "plugin-api-version": "2.2.0"
2072}
diff --git a/flakes/mypackages/pkgs/status_engine/worker_php_packages.nix b/flakes/mypackages/pkgs/status_engine/worker_php_packages.nix
new file mode 100644
index 0000000..47291d2
--- /dev/null
+++ b/flakes/mypackages/pkgs/status_engine/worker_php_packages.nix
@@ -0,0 +1,266 @@
1{composerEnv, fetchurl, fetchgit ? null, fetchhg ? null, fetchsvn ? null, noDev ? false}:
2{
3 packages =
4 {
5 "composer/package-versions-deprecated" = {
6 targetDir = "";
7 src = composerEnv.buildZipPackage {
8 name = "composer-package-versions-deprecated-b4f54f74ef3453349c24a845d22392cd31e65f1d";
9 src = fetchurl {
10 url = "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d";
11 sha256 = "1hrjxvk8i14pw9gi7j3qc0gljjy74hwdkv8zwsrg5brgyzhqfwam";
12 };
13 };
14 };
15 "doctrine/cache" = {
16 targetDir = "";
17 src = composerEnv.buildZipPackage {
18 name = "doctrine-cache-1ca8f21980e770095a31456042471a57bc4c68fb";
19 src = fetchurl {
20 url = "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb";
21 sha256 = "1p8ia9g3mqz71bv4x8q1ng1fgcidmyksbsli1fjbialpgjk9k1ss";
22 };
23 };
24 };
25 "doctrine/dbal" = {
26 targetDir = "";
27 src = composerEnv.buildZipPackage {
28 name = "doctrine-dbal-c480849ca3ad6706a39c970cdfe6888fa8a058b8";
29 src = fetchurl {
30 url = "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8";
31 sha256 = "15j98h80li6m1aj53p8ddy0lkbkanc5kdy6xrikpdd6zhmsfgq9k";
32 };
33 };
34 };
35 "doctrine/deprecations" = {
36 targetDir = "";
37 src = composerEnv.buildZipPackage {
38 name = "doctrine-deprecations-612a3ee5ab0d5dd97b7cf3874a6efe24325efac3";
39 src = fetchurl {
40 url = "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3";
41 sha256 = "078w4k0xdywyb44caz5grbcbxsi87iy13g7a270rs9g5f0p245fi";
42 };
43 };
44 };
45 "doctrine/event-manager" = {
46 targetDir = "";
47 src = composerEnv.buildZipPackage {
48 name = "doctrine-event-manager-95aa4cb529f1e96576f3fda9f5705ada4056a520";
49 src = fetchurl {
50 url = "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520";
51 sha256 = "0xi2s28jmmvrndg1yd0r5s10d9a0q6j2dxdbazvcbws9waf0yrvj";
52 };
53 };
54 };
55 "doctrine/migrations" = {
56 targetDir = "";
57 src = composerEnv.buildZipPackage {
58 name = "doctrine-migrations-28d92a34348fee5daeb80879e56461b2e862fc05";
59 src = fetchurl {
60 url = "https://api.github.com/repos/doctrine/migrations/zipball/28d92a34348fee5daeb80879e56461b2e862fc05";
61 sha256 = "0j5snc96r03vcjlb3k94cx871f69xaq53bza8mm8xs4jk85gr5jg";
62 };
63 };
64 };
65 "friendsofphp/proxy-manager-lts" = {
66 targetDir = "";
67 src = composerEnv.buildZipPackage {
68 name = "friendsofphp-proxy-manager-lts-ecadbdc9052e4ad08c60c8a02268712e50427f7c";
69 src = fetchurl {
70 url = "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c";
71 sha256 = "15ch54cm3rvjyvsvqs9ixfn3vnydfxa0knd4g6myapsryirrskvi";
72 };
73 };
74 };
75 "laminas/laminas-code" = {
76 targetDir = "";
77 src = composerEnv.buildZipPackage {
78 name = "laminas-laminas-code-91aabc066d5620428120800c0eafc0411e441a62";
79 src = fetchurl {
80 url = "https://api.github.com/repos/laminas/laminas-code/zipball/91aabc066d5620428120800c0eafc0411e441a62";
81 sha256 = "01wsb6ph5h8ga9rnlr0lxd3qwn897ccxqxpbz540lfgz7a1prpb0";
82 };
83 };
84 };
85 "paragonie/constant_time_encoding" = {
86 targetDir = "";
87 src = composerEnv.buildZipPackage {
88 name = "paragonie-constant_time_encoding-58c3f47f650c94ec05a151692652a868995d2938";
89 src = fetchurl {
90 url = "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938";
91 sha256 = "0i9km0lzvc7df9758fm1p3y0679pzvr5m9x3mrz0d2hxlppsm764";
92 };
93 };
94 };
95 "paragonie/random_compat" = {
96 targetDir = "";
97 src = composerEnv.buildZipPackage {
98 name = "paragonie-random_compat-996434e5492cb4c3edcb9168db6fbb1359ef965a";
99 src = fetchurl {
100 url = "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a";
101 sha256 = "0ky7lal59dihf969r1k3pb96ql8zzdc5062jdbg69j6rj0scgkyx";
102 };
103 };
104 };
105 "php-amqplib/php-amqplib" = {
106 targetDir = "";
107 src = composerEnv.buildZipPackage {
108 name = "php-amqplib-php-amqplib-1aecbd182b35eb039667c50d7d92d71f105be779";
109 src = fetchurl {
110 url = "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/1aecbd182b35eb039667c50d7d92d71f105be779";
111 sha256 = "0wwzlf2yhjrc523n0y7qh23pxgn4f2qhkbr0jnxzq9j6mm75hnjm";
112 };
113 };
114 };
115 "phpseclib/phpseclib" = {
116 targetDir = "";
117 src = composerEnv.buildZipPackage {
118 name = "phpseclib-phpseclib-4580645d3fc05c189024eb3b834c6c1e4f0f30a1";
119 src = fetchurl {
120 url = "https://api.github.com/repos/phpseclib/phpseclib/zipball/4580645d3fc05c189024eb3b834c6c1e4f0f30a1";
121 sha256 = "0v3c7n9h99pw4f03bfxjsgni7wpq7xr47nw2hf2hq8yjndw19n3p";
122 };
123 };
124 };
125 "psr/container" = {
126 targetDir = "";
127 src = composerEnv.buildZipPackage {
128 name = "psr-container-c71ecc56dfe541dbd90c5360474fbc405f8d5963";
129 src = fetchurl {
130 url = "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963";
131 sha256 = "1mvan38yb65hwk68hl0p7jymwzr4zfnaxmwjbw7nj3rsknvga49i";
132 };
133 };
134 };
135 "symfony/console" = {
136 targetDir = "";
137 src = composerEnv.buildZipPackage {
138 name = "symfony-console-b504a3d266ad2bb632f196c0936ef2af5ff6e273";
139 src = fetchurl {
140 url = "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273";
141 sha256 = "0na3lpgzvrsxngyzv2w90k3ykw1y5j4p6v965v3sal03y6rr2w2i";
142 };
143 };
144 };
145 "symfony/deprecation-contracts" = {
146 targetDir = "";
147 src = composerEnv.buildZipPackage {
148 name = "symfony-deprecation-contracts-26954b3d62a6c5fd0ea8a2a00c0353a14978d05c";
149 src = fetchurl {
150 url = "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c";
151 sha256 = "1wlaj9ngbyjmgr92gjyf7lsmjfswyh8vpbzq5rdzaxjb6bcsj3dp";
152 };
153 };
154 };
155 "symfony/filesystem" = {
156 targetDir = "";
157 src = composerEnv.buildZipPackage {
158 name = "symfony-filesystem-3d49eec03fda1f0fc19b7349fbbe55ebc1004214";
159 src = fetchurl {
160 url = "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214";
161 sha256 = "0dhnyj6m9n6359z5c0xh4pz38n89i9x5c9r1s2dlgxz0daysbbyy";
162 };
163 };
164 };
165 "symfony/polyfill-ctype" = {
166 targetDir = "";
167 src = composerEnv.buildZipPackage {
168 name = "symfony-polyfill-ctype-5bbc823adecdae860bb64756d639ecfec17b050a";
169 src = fetchurl {
170 url = "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a";
171 sha256 = "0vyv70z1yi2is727d1mkb961w5r1pb1v3wy1pvdp30h8ffy15wk6";
172 };
173 };
174 };
175 "symfony/polyfill-intl-grapheme" = {
176 targetDir = "";
177 src = composerEnv.buildZipPackage {
178 name = "symfony-polyfill-intl-grapheme-511a08c03c1960e08a883f4cffcacd219b758354";
179 src = fetchurl {
180 url = "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354";
181 sha256 = "0ifsgsyxf0z0nkynqvr5259dm5dsmbgdpvyi5zfvy8935mi0ki0i";
182 };
183 };
184 };
185 "symfony/polyfill-intl-normalizer" = {
186 targetDir = "";
187 src = composerEnv.buildZipPackage {
188 name = "symfony-polyfill-intl-normalizer-19bd1e4fcd5b91116f14d8533c57831ed00571b6";
189 src = fetchurl {
190 url = "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6";
191 sha256 = "1d80jph5ykiw6ydv8fwd43s0aglh24qc1yrzds2f3aqanpbk1gr2";
192 };
193 };
194 };
195 "symfony/polyfill-mbstring" = {
196 targetDir = "";
197 src = composerEnv.buildZipPackage {
198 name = "symfony-polyfill-mbstring-8ad114f6b39e2c98a8b0e3bd907732c207c2b534";
199 src = fetchurl {
200 url = "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534";
201 sha256 = "1ym84qp609i50lv4vkd4yz99y19kaxd5kmpdnh66mxx1a4a104mi";
202 };
203 };
204 };
205 "symfony/polyfill-php73" = {
206 targetDir = "";
207 src = composerEnv.buildZipPackage {
208 name = "symfony-polyfill-php73-9e8ecb5f92152187c4799efd3c96b78ccab18ff9";
209 src = fetchurl {
210 url = "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9";
211 sha256 = "1p0jr92x323pl4frjbhmziyk5g1zig1g30i1v1p0wfli2sq8h5mb";
212 };
213 };
214 };
215 "symfony/polyfill-php80" = {
216 targetDir = "";
217 src = composerEnv.buildZipPackage {
218 name = "symfony-polyfill-php80-7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936";
219 src = fetchurl {
220 url = "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936";
221 sha256 = "16yydk7rsknlasrpn47n4b4js8svvp4rxzw99dkav52wr3cqmcwd";
222 };
223 };
224 };
225 "symfony/service-contracts" = {
226 targetDir = "";
227 src = composerEnv.buildZipPackage {
228 name = "symfony-service-contracts-d78d39c1599bd1188b8e26bb341da52c3c6d8a66";
229 src = fetchurl {
230 url = "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66";
231 sha256 = "1cgbn2yx2fyrc3c1d85vdriiwwifr1sdg868f3rhq9bh78f03z99";
232 };
233 };
234 };
235 "symfony/stopwatch" = {
236 targetDir = "";
237 src = composerEnv.buildZipPackage {
238 name = "symfony-stopwatch-f83692cd869a6f2391691d40a01e8acb89e76fee";
239 src = fetchurl {
240 url = "https://api.github.com/repos/symfony/stopwatch/zipball/f83692cd869a6f2391691d40a01e8acb89e76fee";
241 sha256 = "1qh49p2jfca5kpcmlcbjx5izgqqvjd91385zy5mipyslsdik2lwg";
242 };
243 };
244 };
245 "symfony/string" = {
246 targetDir = "";
247 src = composerEnv.buildZipPackage {
248 name = "symfony-string-d9e72497367c23e08bf94176d2be45b00a9d232a";
249 src = fetchurl {
250 url = "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a";
251 sha256 = "0k4vvcjfdp2dni8gzq4rn8d6n0ivd38sfna70lgsh8vlc8rrlhpf";
252 };
253 };
254 };
255 "symfony/yaml" = {
256 targetDir = "";
257 src = composerEnv.buildZipPackage {
258 name = "symfony-yaml-4cd2e3ea301aadd76a4172756296fe552fb45b0b";
259 src = fetchurl {
260 url = "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b";
261 sha256 = "18yirwiqbh11fwlpqypm0wlc0lnx7prgk68xrn607zcg6cxnfhiz";
262 };
263 };
264 };
265 };
266}
diff --git a/flakes/mypackages/pkgs/telegram-history-dump/default.nix b/flakes/mypackages/pkgs/telegram-history-dump/default.nix
new file mode 100644
index 0000000..492e265
--- /dev/null
+++ b/flakes/mypackages/pkgs/telegram-history-dump/default.nix
@@ -0,0 +1,18 @@
1{ stdenv, ruby, fetchFromGitHub }:
2stdenv.mkDerivation ({
3 pname = "telegram-history-dump";
4 version = "468ea91-master";
5 src = fetchFromGitHub {
6 owner = "tvdstaaij";
7 repo = "telegram-history-dump";
8 rev = "468ea91e543529b54bc2c5ea28b1ea17f362fd3e";
9 sha256 = "1wmwiqacfa56bmwx50njnb15cg0fy6rbdrmrjd4xfbh8bs6yp0gh";
10 fetchSubmodules = true;
11 };
12 installPhase = ''
13 mkdir -p $out/lib $out/bin
14 cp -a $src $out/lib/telegram-history-dump
15 ln -s $out/lib/telegram-history-dump/telegram-history-dump.rb $out/bin/telegram-history-dump
16 '';
17 buildInputs = [ ruby ];
18})
diff --git a/flakes/mypackages/pkgs/telegramircd/default.nix b/flakes/mypackages/pkgs/telegramircd/default.nix
new file mode 100644
index 0000000..d9196a2
--- /dev/null
+++ b/flakes/mypackages/pkgs/telegramircd/default.nix
@@ -0,0 +1,22 @@
1{ openssl, telethon, python3Packages, fetchFromGitHub }:
2with python3Packages;
3buildPythonApplication rec {
4 format = "other";
5 pname = "telegramircd";
6 version = "master";
7 propagatedBuildInputs = [ telethon aiohttp ConfigArgParse openssl ];
8 src = fetchFromGitHub {
9 owner = "MaskRay";
10 repo = "telegramircd";
11 rev = "40a0c7cf60492bde3f44d43f06f62e3792480139";
12 sha256 = "123fjhgxq2fzn0ar8274jv7jjbxnlpidrj5333kbch7rpcipks0y";
13 fetchSubmodules = true;
14 };
15 LD_LIBRARY_PATH = "${openssl.out}/lib";
16 installPhase = ''
17 install -D $src/telegramircd.py $out/bin/telegramircd
18 wrapProgram "$out/bin/telegramircd" \
19 --prefix LD_LIBRARY_PATH : "${openssl.out}/lib"
20 install -Dm644 "$src/config" -t "$out/etc/telegramircd/"
21 '';
22}
diff --git a/pkgs/telethon_sync/default.nix b/flakes/mypackages/pkgs/telethon_sync/default.nix
index a03e1c3..a03e1c3 100644
--- a/pkgs/telethon_sync/default.nix
+++ b/flakes/mypackages/pkgs/telethon_sync/default.nix
diff --git a/flakes/mypackages/pkgs/terminal-velocity/default.nix b/flakes/mypackages/pkgs/terminal-velocity/default.nix
new file mode 100644
index 0000000..3ccfcd3
--- /dev/null
+++ b/flakes/mypackages/pkgs/terminal-velocity/default.nix
@@ -0,0 +1,37 @@
1{ python37Packages }:
2with python37Packages;
3buildPythonApplication rec {
4 pname = "terminal-velocity-git";
5 version = "0.2.0";
6 src = fetchPypi {
7 inherit pname version;
8 sha256 = "13yrkcmvh5h5fwnai61sbmqkrjyisz08n62pq0ada2lyyqf7g6b9";
9 };
10
11 patches = [
12 ./sort_found_notes.patch
13 ./python3_support.patch
14 # FIXME: update this patch when version changes
15 ./fix_build.patch
16 ];
17
18 preCheck = ''
19 # Needed for urwid test
20 export LC_ALL=en_US.UTF-8
21 '';
22 propagatedBuildInputs = [
23 chardet
24 urwid
25 (sh.overridePythonAttrs { doCheck = false; })
26 pyyaml
27 ];
28 buildInputs = [
29 m2r
30 (restructuredtext_lint.overridePythonAttrs { doCheck = false; })
31 pygments
32 ];
33
34 postInstall = ''
35 rm $out/bin/terminal_velocity
36 '';
37}
diff --git a/pkgs/terminal-velocity/fix_build.patch b/flakes/mypackages/pkgs/terminal-velocity/fix_build.patch
index b08e0c4..b08e0c4 100644
--- a/pkgs/terminal-velocity/fix_build.patch
+++ b/flakes/mypackages/pkgs/terminal-velocity/fix_build.patch
diff --git a/pkgs/terminal-velocity/python3_support.patch b/flakes/mypackages/pkgs/terminal-velocity/python3_support.patch
index bd4aec7..bd4aec7 100644
--- a/pkgs/terminal-velocity/python3_support.patch
+++ b/flakes/mypackages/pkgs/terminal-velocity/python3_support.patch
diff --git a/pkgs/terminal-velocity/sort_found_notes.patch b/flakes/mypackages/pkgs/terminal-velocity/sort_found_notes.patch
index 2bc563c..2bc563c 100644
--- a/pkgs/terminal-velocity/sort_found_notes.patch
+++ b/flakes/mypackages/pkgs/terminal-velocity/sort_found_notes.patch
diff --git a/flakes/mypackages/pkgs/tiv/default.nix b/flakes/mypackages/pkgs/tiv/default.nix
new file mode 100644
index 0000000..2415db9
--- /dev/null
+++ b/flakes/mypackages/pkgs/tiv/default.nix
@@ -0,0 +1,19 @@
1{ fetchurl, perlPackages }:
2perlPackages.buildPerlPackage rec {
3 pname = "tiv";
4 version = "2015";
5 src = fetchurl {
6 url = "http://xyne.archlinux.ca/projects/tiv/src/tiv-${version}.tar.xz";
7 sha256 = "1vq073v7z7vmcd57lhs4rf4jasji69cpjgkz4dykp94a77p1qq90";
8 };
9
10 outputs = ["out"];
11 buildInputs = with perlPackages; [ PerlMagick ];
12 perlPreHookScript = ./tiv_builder.sh;
13 perlPreHook = ''
14 source $perlPreHookScript
15 '';
16 installPhase = ''
17 install -Dm755 tiv "$out/bin/tiv"
18 '';
19}
diff --git a/pkgs/tiv/tiv_builder.sh b/flakes/mypackages/pkgs/tiv/tiv_builder.sh
index ea16682..ea16682 100644
--- a/pkgs/tiv/tiv_builder.sh
+++ b/flakes/mypackages/pkgs/tiv/tiv_builder.sh
diff --git a/pkgs/twins/default.nix b/flakes/mypackages/pkgs/twins/default.nix
index d0656bb..d0656bb 100644
--- a/pkgs/twins/default.nix
+++ b/flakes/mypackages/pkgs/twins/default.nix
diff --git a/pkgs/umami/build-geo.patch b/flakes/mypackages/pkgs/umami/build-geo.patch
index 7a4f075..7a4f075 100644
--- a/pkgs/umami/build-geo.patch
+++ b/flakes/mypackages/pkgs/umami/build-geo.patch
diff --git a/pkgs/umami/default.nix b/flakes/mypackages/pkgs/umami/default.nix
index 5620f90..5620f90 100644
--- a/pkgs/umami/default.nix
+++ b/flakes/mypackages/pkgs/umami/default.nix
diff --git a/pkgs/unicode/default.nix b/flakes/mypackages/pkgs/unicode/default.nix
index 756e939..756e939 100644
--- a/pkgs/unicode/default.nix
+++ b/flakes/mypackages/pkgs/unicode/default.nix
diff --git a/flakes/mypackages/pkgs/upcmd/default.nix b/flakes/mypackages/pkgs/upcmd/default.nix
new file mode 100644
index 0000000..614ae2b
--- /dev/null
+++ b/flakes/mypackages/pkgs/upcmd/default.nix
@@ -0,0 +1,13 @@
1{ buildGoModule, fetchFromGitHub }:
2buildGoModule rec {
3 pname = "upcmd";
4 version = "20220112";
5 src = fetchFromGitHub {
6 owner = pname;
7 repo = "up";
8 rev = "rolling-${version}";
9 sha256 = "sha256-dCi8p0oqLjEhEazbT4sgH7Sku3f/N79VWj5CO7LbvVA=";
10 };
11 doCheck = false;
12 vendorSha256 = "sha256-Ve+lEVrxv4rwymrqHSc1V4SL7BWP4wsIHF8ObBWyHE4=";
13}
diff --git a/flakes/mypackages/pkgs/webapps/adminer/default.nix b/flakes/mypackages/pkgs/webapps/adminer/default.nix
new file mode 100644
index 0000000..cd01080
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/adminer/default.nix
@@ -0,0 +1,14 @@
1{ stdenv, fetchurl }:
2stdenv.mkDerivation rec {
3 version = "4.8.2";
4 pname = "adminer";
5 src = fetchurl {
6 url = "https://github.com/adminerevo/adminerevo/releases/download/v${version}/${pname}-${version}.php";
7 sha256 = "sha256-jXcnGLyNQZqJKS0Rs+UY1SxzknBEZwBhcbD0BmJVFKs=";
8 };
9 phases = "installPhase";
10 installPhase = ''
11 mkdir -p $out
12 cp $src $out/index.php
13 '';
14}
diff --git a/pkgs/webapps/apache-theme/default.nix b/flakes/mypackages/pkgs/webapps/apache-theme/default.nix
index 4b5755a..4b5755a 100644
--- a/pkgs/webapps/apache-theme/default.nix
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/default.nix
diff --git a/pkgs/webapps/apache-theme/theme/.htaccess b/flakes/mypackages/pkgs/webapps/apache-theme/theme/.htaccess
index f9e5472..f9e5472 100644
--- a/pkgs/webapps/apache-theme/theme/.htaccess
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/.htaccess
diff --git a/pkgs/webapps/apache-theme/theme/footer.html b/flakes/mypackages/pkgs/webapps/apache-theme/theme/footer.html
index 57a2012..57a2012 100644
--- a/pkgs/webapps/apache-theme/theme/footer.html
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/footer.html
diff --git a/pkgs/webapps/apache-theme/theme/header.html b/flakes/mypackages/pkgs/webapps/apache-theme/theme/header.html
index cbded6a..cbded6a 100644
--- a/pkgs/webapps/apache-theme/theme/header.html
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/header.html
diff --git a/pkgs/webapps/apache-theme/theme/icons/archive.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/archive.png
index 99ae6fc..99ae6fc 100644
--- a/pkgs/webapps/apache-theme/theme/icons/archive.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/archive.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/audio.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/audio.png
index a67618d..a67618d 100644
--- a/pkgs/webapps/apache-theme/theme/icons/audio.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/audio.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/authors.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/authors.png
index 78bf784..78bf784 100644
--- a/pkgs/webapps/apache-theme/theme/icons/authors.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/authors.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/bin.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bin.png
index ec2220b..ec2220b 100644
--- a/pkgs/webapps/apache-theme/theme/icons/bin.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bin.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/blank.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/blank.png
index bef1f60..bef1f60 100644
--- a/pkgs/webapps/apache-theme/theme/icons/blank.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/blank.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/bmp.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bmp.png
index c6f3044..c6f3044 100644
--- a/pkgs/webapps/apache-theme/theme/icons/bmp.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/bmp.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/c.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/c.png
index 12adaa3..12adaa3 100644
--- a/pkgs/webapps/apache-theme/theme/icons/c.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/c.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/calc.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/calc.png
index a034367..a034367 100644
--- a/pkgs/webapps/apache-theme/theme/icons/calc.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/calc.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/cd.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cd.png
index 3a3ffbb..3a3ffbb 100644
--- a/pkgs/webapps/apache-theme/theme/icons/cd.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cd.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/copying.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/copying.png
index 83fa06e..83fa06e 100644
--- a/pkgs/webapps/apache-theme/theme/icons/copying.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/copying.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/cpp.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cpp.png
index 47e8b1e..47e8b1e 100644
--- a/pkgs/webapps/apache-theme/theme/icons/cpp.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/cpp.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/css.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/css.png
index 15f7695..15f7695 100644
--- a/pkgs/webapps/apache-theme/theme/icons/css.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/css.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/deb.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/deb.png
index 1b12d29..1b12d29 100644
--- a/pkgs/webapps/apache-theme/theme/icons/deb.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/deb.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/default.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/default.png
index 6997229..6997229 100644
--- a/pkgs/webapps/apache-theme/theme/icons/default.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/default.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/diff.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/diff.png
index 5bef920..5bef920 100644
--- a/pkgs/webapps/apache-theme/theme/icons/diff.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/diff.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/doc.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/doc.png
index 5732f9b..5732f9b 100644
--- a/pkgs/webapps/apache-theme/theme/icons/doc.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/doc.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/draw.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/draw.png
index 8f1da5c..8f1da5c 100644
--- a/pkgs/webapps/apache-theme/theme/icons/draw.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/draw.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/eps.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/eps.png
index 93736bb..93736bb 100644
--- a/pkgs/webapps/apache-theme/theme/icons/eps.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/eps.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/exe.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/exe.png
index 31299b7..31299b7 100644
--- a/pkgs/webapps/apache-theme/theme/icons/exe.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/exe.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-home.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-home.png
index 14fe20a..14fe20a 100644
--- a/pkgs/webapps/apache-theme/theme/icons/folder-home.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-home.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-open.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-open.png
index 2aa5cc7..2aa5cc7 100644
--- a/pkgs/webapps/apache-theme/theme/icons/folder-open.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-open.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-page.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-page.png
index 604f9ad..604f9ad 100644
--- a/pkgs/webapps/apache-theme/theme/icons/folder-page.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-page.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png
index b82d7a9..b82d7a9 100644
--- a/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent-old.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder-parent.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent.png
index 3c964f1..3c964f1 100644
--- a/pkgs/webapps/apache-theme/theme/icons/folder-parent.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder-parent.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/folder.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder.png
index 7c613e0..7c613e0 100644
--- a/pkgs/webapps/apache-theme/theme/icons/folder.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/folder.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/gif.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gif.png
index 01a2f2a..01a2f2a 100644
--- a/pkgs/webapps/apache-theme/theme/icons/gif.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gif.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/gzip.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gzip.png
index 99ae6fc..99ae6fc 100644
--- a/pkgs/webapps/apache-theme/theme/icons/gzip.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/gzip.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/h.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/h.png
index d3c7a9c..d3c7a9c 100644
--- a/pkgs/webapps/apache-theme/theme/icons/h.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/h.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/hpp.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/hpp.png
index e5e52e2..e5e52e2 100644
--- a/pkgs/webapps/apache-theme/theme/icons/hpp.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/hpp.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/html.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/html.png
index 2f94a78..2f94a78 100644
--- a/pkgs/webapps/apache-theme/theme/icons/html.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/html.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/ico.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ico.png
index 82227e8..82227e8 100644
--- a/pkgs/webapps/apache-theme/theme/icons/ico.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ico.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/image.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/image.png
index add1c59..add1c59 100644
--- a/pkgs/webapps/apache-theme/theme/icons/image.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/image.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/install.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/install.png
index 0a9c036..0a9c036 100644
--- a/pkgs/webapps/apache-theme/theme/icons/install.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/install.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/java.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/java.png
index 63b8683..63b8683 100644
--- a/pkgs/webapps/apache-theme/theme/icons/java.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/java.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/jpg.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/jpg.png
index a50c99b..a50c99b 100644
--- a/pkgs/webapps/apache-theme/theme/icons/jpg.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/jpg.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/js.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/js.png
index af1a475..af1a475 100644
--- a/pkgs/webapps/apache-theme/theme/icons/js.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/js.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/json.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/json.png
index af1a475..af1a475 100644
--- a/pkgs/webapps/apache-theme/theme/icons/json.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/json.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/log.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/log.png
index 02f1b9a..02f1b9a 100644
--- a/pkgs/webapps/apache-theme/theme/icons/log.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/log.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/makefile.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/makefile.png
index f99ea4c..f99ea4c 100644
--- a/pkgs/webapps/apache-theme/theme/icons/makefile.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/makefile.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/markdown.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/markdown.png
index 25c8373..25c8373 100644
--- a/pkgs/webapps/apache-theme/theme/icons/markdown.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/markdown.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/package.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/package.png
index fb1343e..fb1343e 100644
--- a/pkgs/webapps/apache-theme/theme/icons/package.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/package.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/pdf.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pdf.png
index 7408d8d..7408d8d 100644
--- a/pkgs/webapps/apache-theme/theme/icons/pdf.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pdf.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/php.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/php.png
index 22c4df6..22c4df6 100644
--- a/pkgs/webapps/apache-theme/theme/icons/php.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/php.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/playlist.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/playlist.png
index 8d6f281..8d6f281 100644
--- a/pkgs/webapps/apache-theme/theme/icons/playlist.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/playlist.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/png.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/png.png
index 1fe1ec4..1fe1ec4 100644
--- a/pkgs/webapps/apache-theme/theme/icons/png.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/png.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/pres.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pres.png
index db195e9..db195e9 100644
--- a/pkgs/webapps/apache-theme/theme/icons/pres.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/pres.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/ps.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ps.png
index 05f3ed9..05f3ed9 100644
--- a/pkgs/webapps/apache-theme/theme/icons/ps.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/ps.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/psd.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/psd.png
index 62718ee..62718ee 100644
--- a/pkgs/webapps/apache-theme/theme/icons/psd.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/psd.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/py.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/py.png
index 0aaffd1..0aaffd1 100644
--- a/pkgs/webapps/apache-theme/theme/icons/py.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/py.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/rar.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rar.png
index 8a0ff54..8a0ff54 100644
--- a/pkgs/webapps/apache-theme/theme/icons/rar.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rar.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/rb.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rb.png
index c7db42f..c7db42f 100644
--- a/pkgs/webapps/apache-theme/theme/icons/rb.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rb.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/readme.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/readme.png
index 3ae48cd..3ae48cd 100644
--- a/pkgs/webapps/apache-theme/theme/icons/readme.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/readme.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/rpm.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rpm.png
index 64699ac..64699ac 100644
--- a/pkgs/webapps/apache-theme/theme/icons/rpm.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rpm.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/rss.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rss.png
index a1130a1..a1130a1 100644
--- a/pkgs/webapps/apache-theme/theme/icons/rss.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rss.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/rtf.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rtf.png
index 25c8373..25c8373 100644
--- a/pkgs/webapps/apache-theme/theme/icons/rtf.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/rtf.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/script.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/script.png
index 1099b5f..1099b5f 100644
--- a/pkgs/webapps/apache-theme/theme/icons/script.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/script.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/source.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/source.png
index 5bef920..5bef920 100644
--- a/pkgs/webapps/apache-theme/theme/icons/source.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/source.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/sql.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/sql.png
index b3b1467..b3b1467 100644
--- a/pkgs/webapps/apache-theme/theme/icons/sql.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/sql.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/tar.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tar.png
index bab3b6a..bab3b6a 100644
--- a/pkgs/webapps/apache-theme/theme/icons/tar.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tar.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/tex.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tex.png
index 1487b25..1487b25 100644
--- a/pkgs/webapps/apache-theme/theme/icons/tex.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tex.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/text.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/text.png
index 1d48677..1d48677 100644
--- a/pkgs/webapps/apache-theme/theme/icons/text.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/text.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/tiff.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tiff.png
index 819e64c..819e64c 100644
--- a/pkgs/webapps/apache-theme/theme/icons/tiff.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/tiff.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/unknown.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/unknown.png
index b1dcc3f..b1dcc3f 100644
--- a/pkgs/webapps/apache-theme/theme/icons/unknown.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/unknown.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/vcal.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/vcal.png
index 3d81455..3d81455 100644
--- a/pkgs/webapps/apache-theme/theme/icons/vcal.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/vcal.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/video.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/video.png
index f92f7e1..f92f7e1 100644
--- a/pkgs/webapps/apache-theme/theme/icons/video.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/video.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/xml.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/xml.png
index 83a83df..83a83df 100644
--- a/pkgs/webapps/apache-theme/theme/icons/xml.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/xml.png
Binary files differ
diff --git a/pkgs/webapps/apache-theme/theme/icons/zip.png b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/zip.png
index cc196c1..cc196c1 100644
--- a/pkgs/webapps/apache-theme/theme/icons/zip.png
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/icons/zip.png
Binary files differ
diff --git a/flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css b/flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css
new file mode 100644
index 0000000..e46139f
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/apache-theme/theme/style.css
@@ -0,0 +1,160 @@
1/*------------------------------------*\
2 Apaxy
3 by @adamwhitcroft
4
5 Theme name: Apaxy
6 Theme author: @adamwhitcroft
7\*------------------------------------*/
8@import url('//assets.immae.eu/fonts/OpenSans/font.css');
9/* Have to use @import for the font, as you can only specify a single stylesheet */
10* {
11 margin:0;
12 padding:0;
13 -webkit-box-sizing:border-box;
14 -moz-box-sizing:border-box;
15 box-sizing: border-box;
16}
17
18html {
19 min-height:100%;
20 border-top:10px solid #ECEEF1;
21 border-bottom:10px solid #ECEEF1;
22 color:#61666c;
23 font-weight:400;
24 font-size:1em;
25 font-family:'Open Sans', sans-serif;
26 line-height:2em;
27}
28body {
29 padding:20px;
30 -webkit-backface-visibility:hidden;
31}
32code {
33 font-family:consolas,monospace;
34}
35a {
36 color:#61666c;
37 text-decoration:none;
38}
39a, img {
40 border:none;
41 outline:none
42}
43a:hover {
44 color:#2a2a2a;
45}
46/*------------------------------------*\
47 Wrapper
48\*------------------------------------*/
49.wrapper {
50 margin:0 auto;
51 padding-top:20px;
52 max-width:80%;
53}
54/*------------------------------------*\
55 Demo block
56\*------------------------------------*/
57.block {
58 font-size:.875em;
59 margin:20px 0;
60 padding:20px;
61 color:#9099A3;
62}
63/*------------------------------------*\
64 Table (directory listing)
65\*------------------------------------*/
66table {
67 width:100%;
68 border-collapse:collapse;
69 font-size:.875em;
70}
71tr {
72 outline:0;
73 border:0;
74}
75tr:hover td {
76 background:#f6f6f6;
77}
78th {
79 text-align:left;
80 font-size:.75em;
81 padding-right:20px;
82}
83/* 2nd Column: Filename */
84th + th {
85 width:65%;
86}
87/* 3rd Column: Last Modified */
88th + th + th {
89}
90/* 4th Column: Size */
91th + th + th + th {
92 width:5%;
93}
94tr td:first-of-type {
95 padding-left:10px;
96 padding-right:10px;
97}
98td {
99 padding:5px 0;
100 outline:0;
101 border:0;
102 border-bottom:1px solid #edf1f5;
103 vertical-align:middle;
104 text-align:left;
105 -webkit-transition:background 300ms ease;
106 -moz-transition:background 300ms ease;
107 -ms-transition:background 300ms ease;
108 -o-transition:background 300ms ease;
109 transition:background 300ms ease;
110}
111td a{
112 display: block;
113}
114tr.parent a[href^="/"] {
115 color:#9099A3;
116}
117 .parent a[href^="/"]:hover {
118 color:#2281d0;
119 }
120/*------------------------------------*\
121 Footer
122\*------------------------------------*/
123.footer {
124 text-align:center;
125 font-size:.75em;
126}
127
128h1#pagetitle {
129 text-align: center;
130}
131tr.parent a[href="/"]{
132 display: none;
133}
134
135tr.indexhead {
136 visibility: hidden;
137}
138
139th.indexcollastmod, td.indexcollastmod, th.indexcolsize, td.indexcolsize {
140 visibility: hidden;
141}
142
143.instructions a {
144 text-decoration: underline;
145}
146
147.instructions h2 {
148 margin-top: 10px;
149}
150.instructions em.important:before {
151 content: "⚠ Important ⚠ ";
152 color: red;
153}
154.instructions pre {
155 width: 50em;
156 padding: 10px 15px;
157 display: table;
158 border: 1px inset black;
159 line-height: 1em;
160}
diff --git a/pkgs/webapps/awl/default.nix b/flakes/mypackages/pkgs/webapps/awl/default.nix
index dc78339..dc78339 100644
--- a/pkgs/webapps/awl/default.nix
+++ b/flakes/mypackages/pkgs/webapps/awl/default.nix
diff --git a/pkgs/webapps/davical/default.nix b/flakes/mypackages/pkgs/webapps/davical/default.nix
index 045a93b..045a93b 100644
--- a/pkgs/webapps/davical/default.nix
+++ b/flakes/mypackages/pkgs/webapps/davical/default.nix
diff --git a/flakes/mypackages/pkgs/webapps/default.nix b/flakes/mypackages/pkgs/webapps/default.nix
new file mode 100644
index 0000000..18a724d
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/default.nix
@@ -0,0 +1,24 @@
1{ callPackage, mylibs, composerEnv, sources }:
2rec {
3 adminer = callPackage ./adminer {};
4 apache-theme = import ./apache-theme;
5 awl = callPackage ./awl {};
6 davical = callPackage ./davical {};
7 dokuwiki = callPackage ./dokuwiki {};
8 infcloud = callPackage ./infcloud {};
9 mantisbt_2 = callPackage ./mantisbt_2 {};
10 nextcloud_25 = callPackage ./nextcloud { nextcloudVersion = 25; };
11 nextcloud_26 = callPackage ./nextcloud { nextcloudVersion = 26; };
12 nextcloud_27 = callPackage ./nextcloud { nextcloudVersion = 27; };
13 nextcloud_25-all = nextcloud_25.withApps (a: builtins.attrValues nextcloud_25.allSupportedApps);
14 nextcloud_26-all = nextcloud_26.withApps (a: builtins.attrValues nextcloud_26.allSupportedApps);
15 nextcloud_27-all = nextcloud_27.withApps (a: builtins.attrValues nextcloud_27.allSupportedApps);
16 phpbb = callPackage ./phpbb {};
17 phpldapadmin = callPackage ./phpldapadmin {};
18 rompr = callPackage ./rompr {};
19 roundcubemail = callPackage ./roundcubemail {};
20 spip = callPackage ./spip {};
21 ttrss = callPackage ./ttrss { inherit sources; };
22 wallabag = callPackage ./wallabag { inherit composerEnv; };
23 yourls = callPackage ./yourls {};
24}
diff --git a/flakes/mypackages/pkgs/webapps/dokuwiki/default.nix b/flakes/mypackages/pkgs/webapps/dokuwiki/default.nix
new file mode 100644
index 0000000..db8be30
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/dokuwiki/default.nix
@@ -0,0 +1,54 @@
1{ varDir ? "/var/lib/dokuwiki", preload ? "", lib, callPackage, stdenv, fetchFromGitHub, writeText }:
2let
3 preloadFile = plugins: let preloads = [preload]
4 ++ builtins.concatMap (p: lib.optional (lib.hasAttr "preload" p) (p.preload p)) plugins;
5 in writeText "preload.php" (''
6 <?php
7 '' + builtins.concatStringsSep "\n" preloads
8 );
9 pluginNames = [ "farmer" "todo" ];
10 allPlugins = lib.attrsets.genAttrs pluginNames
11 (name: callPackage (./plugins + "/${name}.nix") {});
12 toPassthru = pkg: plugins: {
13 inherit plugins varDir allPlugins;
14 withPlugins = withPlugins pkg;
15 };
16 withPlugins = pkg: toPlugins:
17 let
18 plugins = toPlugins allPlugins;
19 toInstallPlugin = n:
20 "ln -sf ${n} $out/lib/plugins/${n.pluginName}";
21 newDokuwiki = pkg.overrideAttrs(old: {
22 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallPlugin plugins);
23 installPreloadPhase = ''
24 cp ${preloadFile (pkg.plugins ++ plugins)} $out/inc/preload.php
25 '';
26 passthru = toPassthru newDokuwiki (pkg.plugins ++ plugins);
27 });
28 in newDokuwiki;
29 package = stdenv.mkDerivation (rec {
30 pname = "dokuwiki";
31 version = "release_stable_2018-04-22b";
32 src = fetchFromGitHub {
33 owner = "splitbrain";
34 repo = "dokuwiki";
35 rev = "871dae1320b40211626c7ec665f5e6d5290aca95";
36 sha256 = "1syvd5dvv3v75swf8ig7dxqs0g5xikb0f6vlcy7g4c4ghldkw7nz";
37 fetchSubmodules = true;
38 };
39 phases = "unpackPhase buildPhase installPhase installPreloadPhase fixupPhase";
40 buildPhase = ''
41 mv conf conf.dist
42 mv data data.dist
43 '';
44 installPhase = ''
45 cp -a . $out
46 ln -sf ${varDir}/{conf,data} $out/
47 ln -sf ${varDir}/conf/.htaccess $out/
48 '';
49 installPreloadPhase = ''
50 cp ${preloadFile []} $out/inc/preload.php
51 '';
52 passthru = toPassthru package [];
53 });
54in package
diff --git a/pkgs/webapps/dokuwiki/plugins/farmer.nix b/flakes/mypackages/pkgs/webapps/dokuwiki/plugins/farmer.nix
index b737b2d..b737b2d 100644
--- a/pkgs/webapps/dokuwiki/plugins/farmer.nix
+++ b/flakes/mypackages/pkgs/webapps/dokuwiki/plugins/farmer.nix
diff --git a/pkgs/webapps/dokuwiki/plugins/todo.nix b/flakes/mypackages/pkgs/webapps/dokuwiki/plugins/todo.nix
index a3e03fb..a3e03fb 100644
--- a/pkgs/webapps/dokuwiki/plugins/todo.nix
+++ b/flakes/mypackages/pkgs/webapps/dokuwiki/plugins/todo.nix
diff --git a/pkgs/webapps/infcloud/default.nix b/flakes/mypackages/pkgs/webapps/infcloud/default.nix
index 45354fa..45354fa 100644
--- a/pkgs/webapps/infcloud/default.nix
+++ b/flakes/mypackages/pkgs/webapps/infcloud/default.nix
diff --git a/pkgs/webapps/infcloud/infcloud_config.js b/flakes/mypackages/pkgs/webapps/infcloud/infcloud_config.js
index ba73860..ba73860 100644
--- a/pkgs/webapps/infcloud/infcloud_config.js
+++ b/flakes/mypackages/pkgs/webapps/infcloud/infcloud_config.js
diff --git a/pkgs/webapps/mantisbt_2/bug_report.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report.php.diff
index 2924252..2924252 100644
--- a/pkgs/webapps/mantisbt_2/bug_report.php.diff
+++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report.php.diff
diff --git a/pkgs/webapps/mantisbt_2/bug_report_page.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report_page.php.diff
index 80dea91..80dea91 100644
--- a/pkgs/webapps/mantisbt_2/bug_report_page.php.diff
+++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/bug_report_page.php.diff
diff --git a/pkgs/webapps/mantisbt_2/bugnote_add.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add.php.diff
index 4509f0a..4509f0a 100644
--- a/pkgs/webapps/mantisbt_2/bugnote_add.php.diff
+++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add.php.diff
diff --git a/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff
index a8589c7..a8589c7 100644
--- a/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff
+++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/bugnote_add_inc.php.diff
diff --git a/flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix
new file mode 100644
index 0000000..466595d
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/default.nix
@@ -0,0 +1,44 @@
1{ mantis_config ? "/etc/mantisbt/config_inc.php", stdenv, fetchurl, lib, callPackage}:
2let
3 pluginNames = [ "slack" "source-integration" ];
4 allPlugins = lib.attrsets.genAttrs pluginNames
5 (name: callPackage (./plugins + "/${name}") {});
6 toPassthru = pkg: plugins: {
7 inherit plugins allPlugins;
8 pluginNames = map (n: n.pluginName) plugins;
9 withPlugins = withPlugins pkg;
10 };
11 withPlugins = pkg: toPlugins:
12 let
13 plugins = toPlugins allPlugins;
14 toInstallPlugin = n:
15 if builtins.hasAttr "selector" n then
16 "ln -sf ${n}/${n.selector} $out/plugins/"
17 else
18 "ln -sf ${n} $out/plugins/${n.pluginName}";
19 newMantisbt = pkg.overrideAttrs(old: {
20 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallPlugin plugins);
21 passthru = toPassthru newMantisbt (pkg.plugins ++ plugins);
22 });
23 in newMantisbt;
24 package = stdenv.mkDerivation rec {
25 name = "mantisbt-${version}";
26 version = "2.21.0";
27 src = fetchurl {
28 url = "https://downloads.sourceforge.net/project/mantisbt/mantis-stable/${version}/${name}.tar.gz";
29 sha256 = "13lx569dp1gibq5daqp7dj6gsqic85rrix1s7xkp60gwpzk8wiw5";
30 };
31 patches = [
32 ./bug_report.php.diff
33 ./bug_report_page.php.diff
34 ./bugnote_add.php.diff
35 ./bugnote_add_inc.php.diff
36 ];
37 installPhase = ''
38 cp -a . $out
39 ln -s ${mantis_config} $out/config/config_inc.php
40 '';
41
42 passthru = toPassthru package [];
43 };
44in package
diff --git a/pkgs/webapps/mantisbt_2/plugins/slack/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/slack/default.nix
index 61ed15f..61ed15f 100644
--- a/pkgs/webapps/mantisbt_2/plugins/slack/default.nix
+++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/slack/default.nix
diff --git a/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff
index c355144..c355144 100644
--- a/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff
+++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/Source.API.php.diff
diff --git a/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix
new file mode 100644
index 0000000..1ab00c5
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix
@@ -0,0 +1,22 @@
1{ stdenv, fetchFromGitHub }:
2stdenv.mkDerivation rec {
3 version = "v2.2.0";
4 name = "mantisbt-plugin-source-integration-${version}";
5 src = fetchFromGitHub {
6 owner = "mantisbt-plugins";
7 repo = "source-integration";
8 rev = "44fc9e2e770aff4f40f56833f26a86ce0e2deb76";
9 sha256 = "0gcm6kqqijnv303sk59zn27adwx5vkr545mwzyaq2nrpxnkwdy5b";
10 };
11 patches = [
12 ./Source.API.php.diff
13 ];
14 installPhase = ''
15 mkdir $out
16 cp -a Source* $out/
17 '';
18 passthru = {
19 pluginName = "source-integration";
20 selector = "Source*";
21 };
22}
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix
new file mode 100644
index 0000000..6e7380c
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/audioplayer.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 audioplayer_3_4_0 = buildApp rec {
4 appName = "audioplayer";
5 version = "3.4.0";
6 url = "https://github.com/Rello/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
7 sha256 = "sha256-pog9cll02+AbYHG/jiUztO9odqu7PSEWBUieK32Eqf4=";
8 };
9 versions = {
10 "25" = audioplayer_3_4_0;
11 "26" = audioplayer_3_4_0;
12 "27" = audioplayer_3_4_0;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app audioplayer")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix
new file mode 100644
index 0000000..0503e5b
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/bookmarks.nix
@@ -0,0 +1,21 @@
1{ buildApp, nextcloudVersion }:
2let
3 bookmarks_12_1_0 = buildApp rec {
4 appName = "bookmarks";
5 version = "12.1.0";
6 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
7 sha256 = "sha256-NVyaVeg/UPgFaW/iCZiJkw1l5Vqc+S/4FMfFhHCBUTo=";
8 };
9 bookmarks_13_0_1 = buildApp rec {
10 appName = "bookmarks";
11 version = "13.0.1";
12 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
13 sha256 = "sha256-7Gx8e8C2dDkB/39eAGKOLrP3YkVbGkfPKpQBeCaV/cE=";
14 };
15 versions = {
16 "25" = bookmarks_12_1_0;
17 "26" = bookmarks_13_0_1;
18 "27" = bookmarks_13_0_1;
19 };
20in
21 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app bookmarks")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix
new file mode 100644
index 0000000..497d4ba
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/calendar.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 calendar_4_4_4 = buildApp rec {
4 appName = "calendar";
5 version = "4.4.4";
6 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
7 sha256 = "sha256-8UeHOpgbUf2oHHOvLN58v68QvyDYQXkSjsVKn6UGrGU=";
8 };
9 versions = {
10 "25" = calendar_4_4_4;
11 "26" = calendar_4_4_4;
12 "27" = calendar_4_4_4;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app calendar")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix
new file mode 100644
index 0000000..05f0928
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/carnet.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 carnet_0_25_2 = buildApp rec {
4 appName = "carnet";
5 version = "0.25.2";
6 url = "https://github.com/PhieF/CarnetNextcloud/releases/download/v${version}/${appName}-nc-v${version}.tar.gz";
7 sha256 = "sha256-HArD+M6UA9BhSsrlpp/gsKWkUTWAoNHl/gr0S3AlKzg=";
8 };
9 versions = {
10 "25" = carnet_0_25_2;
11 "26" = carnet_0_25_2;
12 "27" = carnet_0_25_2;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app carnet")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix
new file mode 100644
index 0000000..f8931b7
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/contacts.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 contacts_5_3_2 = buildApp rec {
4 appName = "contacts";
5 version = "5.3.2";
6 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
7 sha256 = "sha256-1jQ+pyLBPU7I4wSPkmezJq7ukrQh8WPErG4J6Ps3LR4=";
8 };
9 versions = {
10 "25" = contacts_5_3_2;
11 "26" = contacts_5_3_2;
12 "27" = contacts_5_3_2;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app contacts")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix
new file mode 100644
index 0000000..32fdcc0
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/cookbook.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 cookbook_0_10_2 = buildApp rec {
4 appName = "cookbook";
5 version = "0.10.2";
6 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/Cookbook-${version}.tar.gz";
7 sha256 = "sha256-H7KVeISBnu0/4Q31ihhiXvRtkXz4yLGOAsAj5ERgeCM=";
8 };
9 versions = {
10 "25" = cookbook_0_10_2;
11 "26" = cookbook_0_10_2;
12 "27" = cookbook_0_10_2;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app cookbook")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix
new file mode 100644
index 0000000..c5dd2d3
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/deck.nix
@@ -0,0 +1,27 @@
1{ buildApp, nextcloudVersion }:
2let
3 deck_1_8_5 = buildApp rec {
4 appName = "deck";
5 version = "1.8.5";
6 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
7 sha256 = "sha256-KsSSl9orqMEKJlBftHwCi/dh+aMCxZqjS7kPT0uDZlE=";
8 };
9 deck_1_9_2 = buildApp rec {
10 appName = "deck";
11 version = "1.9.2";
12 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
13 sha256 = "sha256-h1fmT4CCEFDZPBwFDIBLmFGJmO1Wt3a5nVXX5xCk0o0=";
14 };
15 deck_1_10_0 = buildApp rec {
16 appName = "deck";
17 version = "1.10.0";
18 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
19 sha256 = "sha256-W0XVvhTQoCjoK7S2tEd7bvU0MTWtqYt7QiB9H1p1UP8=";
20 };
21 versions = {
22 "25" = deck_1_8_5;
23 "26" = deck_1_9_2;
24 "27" = deck_1_10_0;
25 };
26in
27 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app deck")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix
new file mode 100644
index 0000000..c03c479
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/drawio.nix
@@ -0,0 +1,24 @@
1{ buildApp, nextcloudVersion }:
2let
3 otherConfig = {
4 mimetypealiases = {
5 "application/x-drawio" = "drawio";
6 };
7 mimetypemapping = {
8 "drawio" = ["application/x-drawio"];
9 };
10 };
11 drawio_2_1_2 = buildApp rec {
12 appName = "drawio";
13 version = "2.1.2";
14 url = "https://github.com/jgraph/drawio-nextcloud/releases/download/v${version}/${appName}-v${version}.tar.gz";
15 sha256 = "sha256-5BrEnS2cMk/vwkAr1lXKtfocqReZAj1+pbDqmi/uG0A=";
16 inherit otherConfig;
17 };
18 versions = {
19 "25" = drawio_2_1_2;
20 "26" = drawio_2_1_2;
21 "27" = drawio_2_1_2;
22 };
23in
24 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app drawio")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix
new file mode 100644
index 0000000..941304a
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/external.nix
@@ -0,0 +1,27 @@
1{ buildApp, nextcloudVersion }:
2let
3 external_5_0_2 = buildApp rec {
4 appName = "external";
5 version = "5.0.2";
6 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
7 sha256 = "sha256-Bkk9X1tVonKsiA3YlKux2y8K7HdJv4qM/eJ9TP+i17I=";
8 };
9 external_5_1_0 = buildApp rec {
10 appName = "external";
11 version = "5.1.0";
12 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
13 sha256 = "sha256-EMKWSXufw4FMyaN2f37yifrpUm6QBqqpPPFmvLvYYmY=";
14 };
15 external_5_2_0 = buildApp rec {
16 appName = "external";
17 version = "5.2.0";
18 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
19 sha256 = "sha256-XqeJCWS8mncS7CfrnXdhtzdgkFTib/RnursJ/AqyvD8=";
20 };
21 versions = {
22 "25" = external_5_0_2;
23 "26" = external_5_1_0;
24 "27" = external_5_2_0;
25 };
26in
27 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app external")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix
new file mode 100644
index 0000000..589115e
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/extract.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 extract_1_3_6 = buildApp rec {
4 appName = "extract";
5 version = "1.3.6";
6 url = "https://github.com/PaulLereverend/NextcloudExtract/releases/download/${version}/${appName}.tar.gz";
7 sha256 = "sha256-y1NacOWnCd/f5sOeEOLeZrWnqwi8q/XezOrhT7AzV/o=";
8 };
9 versions = {
10 "25" = extract_1_3_6;
11 "26" = extract_1_3_6;
12 "27" = extract_1_3_6;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app extract")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix
new file mode 100644
index 0000000..cf8e179
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_markdown.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 files_markdown_2_4_1 = buildApp rec {
4 appName = "files_markdown";
5 version = "2.4.1";
6 url = "https://github.com/icewind1991/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
7 sha256 = "sha256-6A9IMfRbKcF1+et7pzFF4zlZDmegx562cnyYsOFsVzU=";
8 };
9 versions = {
10 "25" = files_markdown_2_4_1;
11 "26" = files_markdown_2_4_1;
12 "27" = files_markdown_2_4_1;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_markdown")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix
new file mode 100644
index 0000000..fff85d7
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_mindmap.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 files_mindmap_0_0_28 = buildApp rec {
4 appName = "files_mindmap";
5 version = "0.0.28";
6 url = "https://github.com/ACTom/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
7 sha256 = "sha256-VlzqstlsdinaqkbK32NvS1oFoQcFasJGHSlcKxdQwIM=";
8 };
9 versions = {
10 "25" = files_mindmap_0_0_28;
11 "26" = files_mindmap_0_0_28;
12 "27" = files_mindmap_0_0_28;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_mindmap")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix
new file mode 100644
index 0000000..97aeaf7
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/files_readmemd.nix
@@ -0,0 +1,14 @@
1{ buildApp, nextcloudVersion }:
2let
3 files_readmemd_2_0_0 = buildApp rec {
4 appName = "files_readmemd";
5 version = "2.0.0";
6 url = "https://github.com/mamatt/files_readmemd/releases/download/V${version}/${appName}.tar.gz";
7 sha256 = "sha256-vUoSK+b4gj51eJcocrXINO/eFKPRZQoj0q6l0gVBqgw=";
8 };
9 versions = {
10 "25" = files_readmemd_2_0_0;
11 "26" = files_readmemd_2_0_0;
12 };
13in
14 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app files_readmemd")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix
new file mode 100644
index 0000000..55f4ba7
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/flowupload.nix
@@ -0,0 +1,14 @@
1{ buildApp, nextcloudVersion }:
2let
3 flowupload_1_1_3 = buildApp rec {
4 appName = "flowupload";
5 version = "1.1.3";
6 url = "https://github.com/e-alfred/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
7 sha256 = "0d1xvimd4hzd0jpvv1h89zfqv3ajlrrm1xdbggvjhk9bllwqgxng";
8 };
9 versions = {
10 "22" = flowupload_1_1_3;
11 "23" = flowupload_1_1_3;
12 };
13in
14 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app flowupload")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix
new file mode 100644
index 0000000..be230fd
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxedit.nix
@@ -0,0 +1,22 @@
1{ buildApp, nextcloudVersion }:
2let
3 gpxedit_0_0_14 = buildApp rec {
4 appName = "gpxedit";
5 version = "0.0.14";
6 url = "https://gitlab.com/eneiluj/gpxedit-oc/wikis/uploads/5b184c24f9e767ad19a84e177a9b473c/${appName}-${version}.tar.gz";
7 sha256 = "1kgpcxps73l83krrjxdzh4vzacja4m3vwidf9kidgqq505cgzq90";
8 otherConfig = {
9 mimetypealiases = {
10 "application/gpx+xml" = "gpx";
11 };
12 mimetypemapping = {
13 "gpx" = ["application/gpx+xml"];
14 };
15 };
16 };
17 versions = {
18 "22" = gpxedit_0_0_14;
19 "23" = gpxedit_0_0_14;
20 };
21in
22 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app gpxedit")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix
new file mode 100644
index 0000000..5a3b7e7
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/gpxpod.nix
@@ -0,0 +1,31 @@
1{ buildApp, nextcloudVersion }:
2let
3 otherConfig = {
4 mimetypealiases = {
5 "application/gpx+xml" = "gpx";
6 };
7 mimetypemapping = {
8 "gpx" = ["application/gpx+xml"];
9 };
10 };
11 gpxpod_5_0_10 = buildApp rec {
12 appName = "gpxpod";
13 version = "5.0.10";
14 url = "https://github.com/julien-nc/gpxpod/releases/download/v${version}/${appName}-${version}.tar.gz";
15 sha256 = "sha256-Ylhl9jdOxG+Qfk5zgNO8FwOtAzrjGHS66y59qmorXPU=";
16 inherit otherConfig;
17 };
18 gpxpod_5_0_12 = buildApp rec {
19 appName = "gpxpod";
20 version = "5.0.12";
21 url = "https://github.com/julien-nc/gpxpod/releases/download/v${version}/${appName}-${version}.tar.gz";
22 sha256 = "sha256-uhz6AC8opDQkFQDpG4u8H4vkFtzbFAZvb8r32QHj/8I=";
23 inherit otherConfig;
24 };
25 versions = {
26 "25" = gpxpod_5_0_10;
27 "26" = gpxpod_5_0_12;
28 "27" = gpxpod_5_0_12;
29 };
30in
31 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app gpxpod")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix
new file mode 100644
index 0000000..b966d3d
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/groupfolders.nix
@@ -0,0 +1,27 @@
1{ buildApp, nextcloudVersion }:
2let
3 groupfolders_13_1_5 = buildApp rec {
4 appName = "groupfolders";
5 version = "13.1.5";
6 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
7 sha256 = "sha256-1yf/uSN8TRsYvK3m2pxGaXo9xxHNrI/NjyWJ8rLPQfg=";
8 };
9 groupfolders_14_0_4 = buildApp rec {
10 appName = "groupfolders";
11 version = "14.0.4";
12 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
13 sha256 = "sha256-QzlD8dLI6T7Sex75ZsO2F40nTrg2Ig6tHTG8cslnNME=";
14 };
15 groupfolders_15_0_2 = buildApp rec {
16 appName = "groupfolders";
17 version = "15.0.2";
18 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
19 sha256 = "sha256-NsTZhmY1XBKHn/1IcIp2Al7BwJzE2xoBzgyBXnmuWls=";
20 };
21 versions = {
22 "25" = groupfolders_13_1_5;
23 "26" = groupfolders_14_0_4;
24 "27" = groupfolders_15_0_2;
25 };
26in
27 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app groupfolders")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix
new file mode 100644
index 0000000..afae917
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/impersonate.nix
@@ -0,0 +1,27 @@
1{ buildApp, nextcloudVersion }:
2let
3 impersonate_1_12_1 = buildApp rec {
4 appName = "impersonate";
5 version = "1.12.1";
6 url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz";
7 sha256 = "sha256-xhlWGbLm1CtW4BSa/yQhv05Kn2r1DZJDUoDXQOLpEeQ=";
8 };
9 impersonate_1_13_1 = buildApp rec {
10 appName = "impersonate";
11 version = "1.13.1";
12 url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz";
13 sha256 = "sha256-+tFWW5wQnbHxbgGdnp2GAFzfXnrW+e3eECY4O6ZckCU=";
14 };
15 impersonate_1_14_0 = buildApp rec {
16 appName = "impersonate";
17 version = "1.14.0";
18 url = "https://github.com/nextcloud-releases/impersonate/releases/download/v${version}/${appName}-v${version}.tar.gz";
19 sha256 = "sha256-A1rGJJLaWhiNf9l0YUh6WOB+fKRBRDckE890hq5OB4k=";
20 };
21 versions = {
22 "25" = impersonate_1_12_1;
23 "26" = impersonate_1_13_1;
24 "27" = impersonate_1_14_0;
25 };
26in
27 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app impersonate")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix
new file mode 100644
index 0000000..d3834ad
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/integration_dropbox.nix
@@ -0,0 +1,13 @@
1{ buildApp, nextcloudVersion }:
2let
3 integration_dropbox_2_0_1 = buildApp rec {
4 appName = "integration_dropbox";
5 version = "2.0.1";
6 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
7 sha256 = "sha256-RPCd8+/yKNlIGfEU+ITS8DBIxJDfc//8MGHaIjfYxdQ=";
8 };
9 versions = {
10 "27" = integration_dropbox_2_0_1;
11 };
12in
13 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app integration_dropbox")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix
new file mode 100644
index 0000000..7be8c6b
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/keeweb.nix
@@ -0,0 +1,24 @@
1{ buildApp, nextcloudVersion }:
2let
3 keeweb_0_6_13 = buildApp rec {
4 appName = "keeweb";
5 version = "0.6.13";
6 url = "https://github.com/jhass/nextcloud-keeweb/releases/download/v${version}/${appName}-${version}.tar.gz";
7 sha256 = "sha256-J9jFVXpmoeAjDI/crsXHVJvPvxCYaimWVuq473nLsNM=";
8 installPhase = ''
9 mkdir -p $out
10 cp -R . $out/
11 '';
12 otherConfig = {
13 mimetypemapping = {
14 "kdbx" = ["application/x-kdbx"];
15 };
16 };
17 };
18 versions = {
19 "25" = keeweb_0_6_13;
20 "26" = keeweb_0_6_13;
21 "27" = keeweb_0_6_13;
22 };
23in
24 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app keeweb")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix
new file mode 100644
index 0000000..1b29173
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/maps.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 maps_1_1_0 = buildApp rec {
4 appName = "maps";
5 version = "1.1.0";
6 url = "https://github.com/nextcloud/maps/releases/download/v${version}/${appName}-${version}.tar.gz";
7 sha256 = "sha256-Me/V+9wXZyq3UEVx9Nqim6pfPFJaALjKv9f7iUjill8=";
8 };
9 versions = {
10 "25" = maps_1_1_0;
11 "26" = maps_1_1_0;
12 "27" = maps_1_1_0;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app maps")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix
new file mode 100644
index 0000000..0fe7409
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/metadata.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 metadata_0_19_0 = buildApp rec {
4 appName = "metadata";
5 version = "0.19.0";
6 url = "https://github.com/gino0631/nextcloud-metadata/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "sha256-XfFxCwRFO0WnBPU4CIejNXySRQdguvzauu62bzUKD44=";
8 };
9 versions = {
10 "25" = metadata_0_19_0;
11 "26" = metadata_0_19_0;
12 "27" = metadata_0_19_0;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app metadata")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix
new file mode 100644
index 0000000..fc96224
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/music.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 music_1_8_4 = buildApp rec {
4 appName = "music";
5 version = "1.8.4";
6 url = "https://github.com/owncloud/music/releases/download/v${version}/${appName}_${version}_for_nextcloud.tar.gz";
7 sha256 = "sha256-WWXMpOyTRxykAVeUj/h6QP5ENqaMvTcPIqPQjhY68KA=";
8 };
9 versions = {
10 "25" = music_1_8_4;
11 "26" = music_1_8_4;
12 "27" = music_1_8_4;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app music")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix
new file mode 100644
index 0000000..7677c6c
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/notes.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 notes_4_8_1 = buildApp rec {
4 appName = "notes";
5 version = "4.8.1";
6 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "sha256-BfH1W+7TWKZRuAAhKQEQtlv8ePTtJQvZQVMMu3zULR4=";
8 };
9 versions = {
10 "25" = notes_4_8_1;
11 "26" = notes_4_8_1;
12 "27" = notes_4_8_1;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app notes")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix
new file mode 100644
index 0000000..dcdaad2
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/ocsms.nix
@@ -0,0 +1,21 @@
1{ buildApp, nextcloudVersion }:
2let
3 ocsms_2_2_0 = buildApp rec {
4 appName = "ocsms";
5 version = "2.2.0";
6 url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
7 sha256 = "1hjl11lxdflk4w0l8prcjr3jvmsm8njldbrmnqm7yhdy6qcfli28";
8 installPhase = ''
9 mkdir -p $out
10 cp -R . $out/
11 '';
12 };
13 versions = {
14 "18" = ocsms_2_2_0;
15 "19" = ocsms_2_2_0;
16 "20" = ocsms_2_2_0;
17 # Beware, 1.10.1 has a too wide range of versions and is not
18 # compatible with nextcloud > 20!
19 };
20in
21 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app ocsms")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix
new file mode 100644
index 0000000..e93df00
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/onlyoffice.nix
@@ -0,0 +1,21 @@
1{ buildApp, nextcloudVersion }:
2let
3 onlyoffice_7_9_0 = buildApp rec {
4 appName = "onlyoffice";
5 version = "7.9.0";
6 url = "https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "sha256-GN0edA/aVdOEDR0LF6PgG2vTcULaG9RMj2gIAoxSVAM=";
8 };
9 onlyoffice_8_2_0 = buildApp rec {
10 appName = "onlyoffice";
11 version = "8.2.0";
12 url = "https://github.com/ONLYOFFICE/onlyoffice-nextcloud/releases/download/v${version}/${appName}.tar.gz";
13 sha256 = "sha256-DfZKgpkpcogy9I3A3ru0V/WR5wYWBr+wrHe+mQJBPYk=";
14 };
15 versions = {
16 "25" = onlyoffice_7_9_0;
17 "26" = onlyoffice_7_9_0;
18 "27" = onlyoffice_8_2_0;
19 };
20in
21 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app onlyoffice")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix
new file mode 100644
index 0000000..5559b22
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/passman.nix
@@ -0,0 +1,21 @@
1{ buildApp, nextcloudVersion }:
2let
3 passman_2_4_5 = buildApp rec {
4 appName = "passman";
5 version = "2.4.5";
6 url = "https://releases.passman.cc/${appName}_${version}.tar.gz";
7 sha256 = "sha256-wcRx1lUEHbJBJBBSKOScGljOgHM7Vpf69OymJoI8S2Y=";
8 };
9 passman_2_4_7 = buildApp rec {
10 appName = "passman";
11 version = "2.4.7";
12 url = "https://releases.passman.cc/${appName}_${version}.tar.gz";
13 sha256 = "sha256-CeNaN0cioVjcW6ILB//BIvmjQWcbvfK3m8jVQ8LGtyM=";
14 };
15 versions = {
16 "25" = passman_2_4_5;
17 "26" = passman_2_4_7;
18 "27" = passman_2_4_7;
19 };
20in
21 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app passman")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix
new file mode 100644
index 0000000..a50ac43
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/polls.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 polls_5_2_0 = buildApp rec {
4 appName = "polls";
5 version = "5.2.0";
6 url = "https://github.com/nextcloud/polls/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "sha256-45YNcSeFG9v3mfk7eLbDiy6hFgmfePY0j86JiVS0k14=";
8 };
9 versions = {
10 "25" = polls_5_2_0;
11 "26" = polls_5_2_0;
12 "27" = polls_5_2_0;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app polls")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix
new file mode 100644
index 0000000..da48f91
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/side_menu.nix
@@ -0,0 +1,16 @@
1{ buildApp, nextcloudVersion }:
2let
3 side_menu_3_10_3 = buildApp rec {
4 appName = "side_menu";
5 version = "3.10.3";
6 url = "https://gitnet.fr/attachments/9c9be610-5d3b-414d-a523-396c237c15ef";
7 filename = "${appName}-${version}.tar.gz";
8 sha256 = "sha256-WKbc6Ln6v3LYyRzwy0xAOmXilbqrWGS8XGWIT+TajdM=";
9 };
10 versions = {
11 "25" = side_menu_3_10_3;
12 "26" = side_menu_3_10_3;
13 "27" = side_menu_3_10_3;
14 };
15in
16 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app side_menu")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix
new file mode 100644
index 0000000..912b5bf
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/social.nix
@@ -0,0 +1,14 @@
1{ buildApp, nextcloudVersion }:
2let
3 social_0_6_1 = buildApp rec {
4 appName = "social";
5 version = "0.6.1";
6 url = "https://github.com/nextcloud-releases/social/releases/download/v${version}/${appName}-v${version}.tar.gz";
7 sha256 = "sha256-5mww31ibwgnSiTuTaKo5MngbhPIw8lwLt1tkQySmerY=";
8 };
9 versions = {
10 "26" = social_0_6_1;
11 "27" = social_0_6_1;
12 };
13in
14 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app social")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix
new file mode 100644
index 0000000..d8a20b9
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/spreed.nix
@@ -0,0 +1,27 @@
1{ buildApp, nextcloudVersion }:
2let
3 spreed_15_0_7 = buildApp rec {
4 appName = "spreed";
5 version = "15.0.7";
6 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
7 sha256 = "sha256-J9udO7qlRL+TDwTPTbBpYeZLUi4oco42LoqYoHJbIyE=";
8 };
9 spreed_16_0_5 = buildApp rec {
10 appName = "spreed";
11 version = "16.0.5";
12 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
13 sha256 = "sha256-tTDnWqNkP6fMSdCP1c0vPh8f0K7sTFBvRwws5Gln9Mg=";
14 };
15 spreed_17_0_3 = buildApp rec {
16 appName = "spreed";
17 version = "17.0.3";
18 url = "https://github.com/nextcloud-releases/${appName}/releases/download/v${version}/${appName}-v${version}.tar.gz";
19 sha256 = "sha256-vb08DI+q+5f87zz2UguE1y6b0NV2EoICYpaKUGmyF5w=";
20 };
21 versions = {
22 "25" = spreed_15_0_7;
23 "26" = spreed_16_0_5;
24 "27" = spreed_17_0_3;
25 };
26in
27 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app spreed")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix
new file mode 100644
index 0000000..906719d
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/talk_matterbridge.nix
@@ -0,0 +1,14 @@
1{ buildApp, nextcloudVersion }:
2let
3 talk_matterbridge_1_26_0 = buildApp rec {
4 appName = "talk_matterbridge";
5 version = "1.26.0";
6 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "sha256-gD5lfLWBjWOiy2ULf31ngQVIQbMZj3iwu3zuVrEDSks=";
8 };
9 versions = {
10 "25" = talk_matterbridge_1_26_0;
11 "26" = talk_matterbridge_1_26_0;
12 };
13in
14 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app talk_matterbridge")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix b/flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix
new file mode 100644
index 0000000..aee7650
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/apps/tasks.nix
@@ -0,0 +1,15 @@
1{ buildApp, nextcloudVersion }:
2let
3 tasks_0_15_0 = buildApp rec {
4 appName = "tasks";
5 version = "0.15.0";
6 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "sha256-nizJUFByK78FZ6KPJ4zfOU5Z9ClAxhwgQ7d+X5TGnM8=";
8 };
9 versions = {
10 "25" = tasks_0_15_0;
11 "26" = tasks_0_15_0;
12 "27" = tasks_0_15_0;
13 };
14in
15 versions."${builtins.toString nextcloudVersion}" or (throw "Unsupported version for nextcloud app tasks")
diff --git a/flakes/mypackages/pkgs/webapps/nextcloud/default.nix b/flakes/mypackages/pkgs/webapps/nextcloud/default.nix
new file mode 100644
index 0000000..6aeeaed
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/nextcloud/default.nix
@@ -0,0 +1,84 @@
1{ nextcloudVersion, otherConfig ? {}, lib, stdenv, callPackage, fetchzip, fetchurl, postInstall ? null }:
2let
3 shasumsAndVersion = {
4 "25" = { sum = "sha256-alvh0fWESSS5KbfiKI1gaoahisDWnfT/bUhsSEEXfQI="; fullVersion = "25.0.10"; }; # php 7.4 - 8.2
5 "26" = { sum = "sha256-nhq0aAY4T1hUZdKJY66ZSlirCSgPQet8YJpciwJw1b4="; fullVersion = "26.0.5"; }; # php 8.0 - 8.2
6 "27" = { sum = "sha256-ei3OpDqjuPswM0fv2kxvN3M8yhE8juFt2fDl+2jHIS8="; fullVersion = "27.0.2"; }; # php 8.0 - 8.2
7 };
8 appNames = [
9 "audioplayer" "bookmarks" "calendar" "carnet"
10 "contacts" "cookbook" "deck" "external" "extract" "files_markdown" "files_mindmap"
11 "files_readmemd" "flowupload" "gpxedit" "gpxpod" "groupfolders" "impersonate"
12 "keeweb" "maps" "metadata" "music" "notes" "ocsms" "onlyoffice" "passman" "polls"
13 "social" "spreed" "talk_matterbridge" "tasks" "drawio" "side_menu"
14 "integration_dropbox"
15 ];
16 toApp = name: callPackage (./apps + "/${name}.nix") { inherit buildApp nextcloudVersion; };
17 allSupportedApps = lib.mapAttrs (n: v: v.value) (lib.filterAttrs (n: v: v.success) (lib.genAttrs appNames (name: builtins.tryEval (toApp name))));
18 allApps = lib.genAttrs appNames toApp;
19 buildApp = { appName, version, filename ? null, url, sha256, installHook ? (n: ""), otherConfig ? {}, installPhase ? "mkdir -p $out && cp -R . $out/" }:
20 stdenv.mkDerivation rec {
21 name = "nextcloud-app-${appName}-${version}";
22 inherit version;
23 phases = "unpackPhase installPhase";
24 inherit installPhase;
25 src = fetchurl ({ inherit url sha256; } // lib.optionalAttrs (filename != null) { name = filename; });
26 passthru = {
27 inherit appName otherConfig installHook;
28 };
29 };
30 toPassthru = pkg: apps: otherConfig: {
31 inherit apps otherConfig allApps allSupportedApps buildApp;
32 withApps = withApps pkg;
33 };
34 withApps = pkg: toApps:
35 let
36 apps = toApps allApps;
37 toInstallApp = n: ''
38 if [ -e $out/apps/${n.appName} ]; then
39 echo "${n.appName} already exists"
40 false
41 fi
42 ln -sf ${n} $out/apps/${n.appName}
43 '' + (n.installHook n);
44 zipped = lib.attrsets.zipAttrs ([pkg.otherConfig or {}] ++ map (v: v.otherConfig) apps);
45 appConfigs = with lib.attrsets; with lib.lists; {
46 mimetypealiases = foldr (h: prev: prev // h) {} (zipped.mimetypealiases or []);
47 mimetypemapping = mapAttrs (_: v: unique (flatten v)) (zipAttrs (zipped.mimetypemapping or []));
48 };
49 newNextcloud = pkg.overrideAttrs(old: {
50 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallApp apps);
51 passthru = toPassthru newNextcloud (pkg.apps ++ apps) appConfigs;
52 });
53 in newNextcloud;
54 package = stdenv.mkDerivation rec {
55 name = "nextcloud-${version}";
56 version = shasumsAndVersion."${builtins.toString nextcloudVersion}".fullVersion;
57
58 src = fetchurl {
59 url = "https://download.nextcloud.com/server/releases/${name}.tar.bz2";
60 sha256 = shasumsAndVersion."${builtins.toString nextcloudVersion}".sum;
61 };
62
63 inherit postInstall;
64 installPhase = ''
65 mkdir -p $out/
66 cp -R . $out/
67 sed -i -e "/'appDirsWithDifferentOwner'/d" $out/apps/settings/lib/Controller/CheckSetupController.php
68 mv $out/config $out/config.example
69 runHook postInstall
70 '';
71
72 noAuditTmpdir = true;
73 dontPatchELF = true;
74 dontStrip = true;
75 passthru = toPassthru package [] otherConfig;
76 meta = {
77 description = "Sharing solution for files, calendars, contacts and more";
78 homepage = https://nextcloud.com;
79 maintainers = with lib.maintainers; [ schneefux bachp globin fpletz ];
80 license = lib.licenses.agpl3Plus;
81 platforms = with lib.platforms; unix;
82 };
83 };
84in package
diff --git a/pkgs/webapps/phpbb/default.nix b/flakes/mypackages/pkgs/webapps/phpbb/default.nix
index 21ee154..21ee154 100644
--- a/pkgs/webapps/phpbb/default.nix
+++ b/flakes/mypackages/pkgs/webapps/phpbb/default.nix
diff --git a/pkgs/webapps/phpbb/extensions/adduser.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/adduser.nix
index f9073e6..f9073e6 100644
--- a/pkgs/webapps/phpbb/extensions/adduser.nix
+++ b/flakes/mypackages/pkgs/webapps/phpbb/extensions/adduser.nix
diff --git a/pkgs/webapps/phpbb/extensions/autosubscribe.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/autosubscribe.nix
index 78e23fc..78e23fc 100644
--- a/pkgs/webapps/phpbb/extensions/autosubscribe.nix
+++ b/flakes/mypackages/pkgs/webapps/phpbb/extensions/autosubscribe.nix
diff --git a/pkgs/webapps/phpbb/extensions/mailinglist.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/mailinglist.nix
index d432aaf..d432aaf 100644
--- a/pkgs/webapps/phpbb/extensions/mailinglist.nix
+++ b/flakes/mypackages/pkgs/webapps/phpbb/extensions/mailinglist.nix
diff --git a/pkgs/webapps/phpbb/extensions/markdown.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/markdown.nix
index 3bd73c7..3bd73c7 100644
--- a/pkgs/webapps/phpbb/extensions/markdown.nix
+++ b/flakes/mypackages/pkgs/webapps/phpbb/extensions/markdown.nix
diff --git a/pkgs/webapps/phpbb/extensions/mchat.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/mchat.nix
index 93ea861..93ea861 100644
--- a/pkgs/webapps/phpbb/extensions/mchat.nix
+++ b/flakes/mypackages/pkgs/webapps/phpbb/extensions/mchat.nix
diff --git a/pkgs/webapps/phpbb/extensions/monitoranswers.nix b/flakes/mypackages/pkgs/webapps/phpbb/extensions/monitoranswers.nix
index 52c852e..52c852e 100644
--- a/pkgs/webapps/phpbb/extensions/monitoranswers.nix
+++ b/flakes/mypackages/pkgs/webapps/phpbb/extensions/monitoranswers.nix
diff --git a/pkgs/webapps/phpbb/langs/fr.nix b/flakes/mypackages/pkgs/webapps/phpbb/langs/fr.nix
index 12f2df0..12f2df0 100644
--- a/pkgs/webapps/phpbb/langs/fr.nix
+++ b/flakes/mypackages/pkgs/webapps/phpbb/langs/fr.nix
diff --git a/pkgs/webapps/phpldapadmin/default.nix b/flakes/mypackages/pkgs/webapps/phpldapadmin/default.nix
index da32f97..da32f97 100644
--- a/pkgs/webapps/phpldapadmin/default.nix
+++ b/flakes/mypackages/pkgs/webapps/phpldapadmin/default.nix
diff --git a/pkgs/webapps/phpldapadmin/ldap-align-button.patch b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-align-button.patch
index d9a5504..d9a5504 100644
--- a/pkgs/webapps/phpldapadmin/ldap-align-button.patch
+++ b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-align-button.patch
diff --git a/pkgs/webapps/phpldapadmin/ldap-fix-password.patch b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-fix-password.patch
index d2d80e4..d2d80e4 100644
--- a/pkgs/webapps/phpldapadmin/ldap-fix-password.patch
+++ b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-fix-password.patch
diff --git a/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch
index 55a1974..55a1974 100644
--- a/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch
+++ b/flakes/mypackages/pkgs/webapps/phpldapadmin/ldap-sort-in-templates.patch
diff --git a/flakes/mypackages/pkgs/webapps/rompr/default.nix b/flakes/mypackages/pkgs/webapps/rompr/default.nix
new file mode 100644
index 0000000..5b3e7e0
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/rompr/default.nix
@@ -0,0 +1,17 @@
1{ varDir ? "/var/lib/rompr", stdenv, fetchFromGitHub }:
2stdenv.mkDerivation ({
3 pname = "rompr";
4 version = "1.24";
5 src = fetchFromGitHub {
6 owner = "fatg3erman";
7 repo = "RompR";
8 rev = "0d8f597027ac71b320963fe3f33f461a136312ad";
9 sha256 = "13p3c4whhmvz1vvh9fva5gdx4xji288k108hjdi8b1yn506lzix2";
10 fetchSubmodules = true;
11 };
12 installPhase = ''
13 cp -a . $out
14 ln -sf ${varDir}/prefs $out/prefs
15 ln -sf ${varDir}/albumart $out/albumart
16 '';
17})
diff --git a/pkgs/webapps/roundcubemail/add_all.patch b/flakes/mypackages/pkgs/webapps/roundcubemail/add_all.patch
index ba651e2..ba651e2 100644
--- a/pkgs/webapps/roundcubemail/add_all.patch
+++ b/flakes/mypackages/pkgs/webapps/roundcubemail/add_all.patch
diff --git a/pkgs/webapps/roundcubemail/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/default.nix
index bdddf2f..bdddf2f 100644
--- a/pkgs/webapps/roundcubemail/default.nix
+++ b/flakes/mypackages/pkgs/webapps/roundcubemail/default.nix
diff --git a/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix
index cd9efee..cd9efee 100644
--- a/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix
+++ b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/automatic_addressbook/default.nix
diff --git a/pkgs/webapps/roundcubemail/plugins/carddav/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/carddav/default.nix
index ad6856b..ad6856b 100644
--- a/pkgs/webapps/roundcubemail/plugins/carddav/default.nix
+++ b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/carddav/default.nix
diff --git a/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix
index 34a43a7..34a43a7 100644
--- a/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix
+++ b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu/default.nix
diff --git a/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix
index e5cb46d..e5cb46d 100644
--- a/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix
+++ b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/contextmenu_folder/default.nix
diff --git a/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix
index a5788b3..a5788b3 100644
--- a/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix
+++ b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/html5_notifier/default.nix
diff --git a/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix
index 3e10fee..3e10fee 100644
--- a/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix
+++ b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/ident_switch/default.nix
diff --git a/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix
index dc7138a..dc7138a 100644
--- a/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix
+++ b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/message_highlight/default.nix
diff --git a/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix
index b67f16a..b67f16a 100644
--- a/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix
+++ b/flakes/mypackages/pkgs/webapps/roundcubemail/plugins/thunderbird_labels/default.nix
diff --git a/pkgs/webapps/spip/default.nix b/flakes/mypackages/pkgs/webapps/spip/default.nix
index 20d5c8c..20d5c8c 100644
--- a/pkgs/webapps/spip/default.nix
+++ b/flakes/mypackages/pkgs/webapps/spip/default.nix
diff --git a/pkgs/webapps/spip/spip_ldap_patch.patch b/flakes/mypackages/pkgs/webapps/spip/spip_ldap_patch.patch
index 653c909..653c909 100644
--- a/pkgs/webapps/spip/spip_ldap_patch.patch
+++ b/flakes/mypackages/pkgs/webapps/spip/spip_ldap_patch.patch
diff --git a/pkgs/webapps/spip/spip_mes_options.php b/flakes/mypackages/pkgs/webapps/spip/spip_mes_options.php
index 8db8389..8db8389 100644
--- a/pkgs/webapps/spip/spip_mes_options.php
+++ b/flakes/mypackages/pkgs/webapps/spip/spip_mes_options.php
diff --git a/flakes/mypackages/pkgs/webapps/ttrss/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/default.nix
new file mode 100644
index 0000000..fa2453e
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/ttrss/default.nix
@@ -0,0 +1,37 @@
1{ ttrss_config ? "/etc/ttrss/config.php"
2, varDir ? "/var/lib/ttrss"
3, stdenv, lib, callPackage, sources }:
4let
5 pluginNames = [ "auth_ldap" "af_feedmod" "feediron" "ff_instagram" "tumblr_gdpr_ua" ];
6 allPlugins = lib.attrsets.genAttrs pluginNames
7 (name: callPackage (./plugins + "/${name}") {});
8 toPassthru = pkg: plugins: {
9 inherit plugins allPlugins;
10 withPlugins = withPlugins pkg;
11 };
12 withPlugins = pkg: toPlugins:
13 let
14 plugins = toPlugins allPlugins;
15 toInstallPlugin = n:
16 "ln -sf ${n} $out/plugins/${n.pluginName}";
17 newTtrss = pkg.overrideAttrs(old: {
18 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallPlugin plugins);
19 passthru = toPassthru newTtrss (pkg.plugins ++ plugins);
20 });
21 in newTtrss;
22 package = stdenv.mkDerivation rec {
23 pname = "tt-rss";
24 version = "${sources.tools.ttrss.shortRev}-master";
25 name = "${pname}-${version}";
26 src = sources.tools.ttrss;
27 buildPhase = ''
28 rm -rf lock feed-icons cache
29 ln -sf ${varDir}/{lock,feed-icons,cache} .
30 '';
31 installPhase = ''
32 cp -a . $out
33 ln -s ${ttrss_config} $out/config.php
34 '';
35 passthru = toPassthru package [];
36 };
37in package
diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix
new file mode 100644
index 0000000..39f9e0e
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix
@@ -0,0 +1,18 @@
1{ patched ? false, stdenv, fetchFromGitHub, lib }:
2stdenv.mkDerivation ({
3 pname = "ttrss-af_feedmod";
4 version = "0ea2092-master";
5 src = fetchFromGitHub {
6 owner = "mbirth";
7 repo = "ttrss_plugin-af_feedmod";
8 rev = "0ea2092dd34067ecd898802cfca3570023d1ecfe";
9 sha256 = "02ibf47zcrsc2rr45wsix8gxyyf371davj8n8i0gj1zdq95klvnv";
10 fetchSubmodules = true;
11 };
12 patches = lib.optionals patched [ ./type_replace.patch ];
13 installPhase = ''
14 mkdir $out
15 cp init.php $out
16 '';
17 passthru.pluginName = "af_feedmod";
18})
diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch b/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch
index d622577..d622577 100644
--- a/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch
+++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/af_feedmod/type_replace.patch
diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix
new file mode 100644
index 0000000..d283160
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix
@@ -0,0 +1,17 @@
1{ stdenv, fetchFromGitHub }:
2stdenv.mkDerivation ({
3 pname = "ttrss-auth-ldap";
4 version = "4d751b0-master";
5 src = fetchFromGitHub {
6 owner = "hydrian";
7 repo = "TTRSS-Auth-LDAP";
8 rev = "4d751b095c29a8dbe2dc7bb07777742956136e94";
9 sha256 = "0b9fl86acrzpcv41r7pj3bl8b3n72hpkdywzx9zjyfqv5pskxyim";
10 fetchSubmodules = true;
11 };
12 installPhase = ''
13 mkdir $out
14 cp plugins/auth_ldap/init.php $out
15 '';
16 passthru.pluginName = "auth_ldap";
17})
diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix
new file mode 100644
index 0000000..2f86416
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/default.nix
@@ -0,0 +1,18 @@
1{ patched ? false, stdenv, fetchFromGitHub, lib }:
2stdenv.mkDerivation ({
3 pname = "ttrss-feediron";
4 version = "407168c-master";
5 src = fetchFromGitHub {
6 owner = "m42e";
7 repo = "ttrss_plugin-feediron";
8 rev = "407168c628880b5ced572cc549db6d50e866d3c8";
9 sha256 = "17b95ifpcph6m03hjd1mhi8gi1hw9yd3fnffmw66fqr5c9l3zd9r";
10 fetchSubmodules = true;
11 };
12 patches = lib.optionals patched [ ./json_reformat.patch ];
13 installPhase = ''
14 mkdir $out
15 cp -a . $out
16 '';
17 passthru.pluginName = "feediron";
18})
diff --git a/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch b/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch
index e1c44d9..e1c44d9 100644
--- a/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch
+++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/feediron/json_reformat.patch
diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix
new file mode 100644
index 0000000..f0df588
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix
@@ -0,0 +1,17 @@
1{ stdenv, fetchFromGitHub }:
2stdenv.mkDerivation ({
3 pname = "ttrss-ff_instagram";
4 version = "0366ffb-master";
5 src = fetchFromGitHub {
6 owner = "wltb";
7 repo = "ff_instagram";
8 rev = "0366ffb18c4d490c8fbfba2f5f3367a5af23cfe8";
9 sha256 = "0vvzl6wi6jmrqknsfddvckjgsgfizz1d923d1nyrpzjfn6bda1vk";
10 fetchSubmodules = true;
11 };
12 installPhase = ''
13 mkdir $out
14 cp -a . $out
15 '';
16 passthru.pluginName = "ff_instagram";
17})
diff --git a/flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix b/flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix
new file mode 100644
index 0000000..072b6c3
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix
@@ -0,0 +1,17 @@
1{ stdenv, fetchFromGitHub }:
2stdenv.mkDerivation ({
3 pname = "ttrss-tumblr_gdpr_ua";
4 version = "287c584-master";
5 src = fetchFromGitHub {
6 owner = "hkockerbeck";
7 repo = "ttrss-tumblr-gdpr-ua";
8 rev = "287c584e68845d524f920156bff0b2eaa6f65117";
9 sha256 = "1fviawgcclqky4k4xv1sqzvpb8i74w9f0pclm09m78s8l85wh9py";
10 fetchSubmodules = true;
11 };
12 installPhase = ''
13 mkdir $out
14 cp -a . $out
15 '';
16 passthru.pluginName = "tumblr_gdpr_ua";
17})
diff --git a/pkgs/webapps/wallabag/default.nix b/flakes/mypackages/pkgs/webapps/wallabag/default.nix
index bd420d4..bd420d4 100644
--- a/pkgs/webapps/wallabag/default.nix
+++ b/flakes/mypackages/pkgs/webapps/wallabag/default.nix
diff --git a/pkgs/webapps/wallabag/ldap.patch b/flakes/mypackages/pkgs/webapps/wallabag/ldap.patch
index e04dae1..e04dae1 100644
--- a/pkgs/webapps/wallabag/ldap.patch
+++ b/flakes/mypackages/pkgs/webapps/wallabag/ldap.patch
diff --git a/flakes/mypackages/pkgs/webapps/yourls/default.nix b/flakes/mypackages/pkgs/webapps/yourls/default.nix
new file mode 100644
index 0000000..8001a60
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/yourls/default.nix
@@ -0,0 +1,37 @@
1{ yourls_config ? "/etc/yourls/config.php", fetchFromGitHub, callPackage, lib, stdenv }:
2let
3 pluginNames = [ "ldap" ];
4 allPlugins = lib.attrsets.genAttrs pluginNames
5 (name: callPackage (./plugins + "/${name}") {});
6 toPassthru = pkg: plugins: {
7 inherit plugins allPlugins;
8 withPlugins = withPlugins pkg;
9 };
10 withPlugins = pkg: toPlugins:
11 let
12 plugins = toPlugins allPlugins;
13 toInstallPlugin = n: "ln -s ${n} $out/user/plugins/${n.pluginName}";
14 newYourls = pkg.overrideAttrs(old: {
15 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallPlugin plugins);
16 passthru = toPassthru newYourls (pkg.plugins ++ plugins);
17 });
18 in newYourls;
19 package = stdenv.mkDerivation (rec {
20 pname = "yourls";
21 version = "1.7.3";
22 src = fetchFromGitHub {
23 owner = "YOURLS";
24 repo = "YOURLS";
25 rev = "077018822d3594229daa8343310d0b40804b9ddc";
26 sha256 = "1av6h619rwqn0yn0kjn2s2h3gmrhmxaaa9hd5ns4ralxgg731imd";
27 fetchSubmodules = true;
28 };
29 installPhase = ''
30 mkdir -p $out
31 cp -a */ *.php $out/
32 cp sample-robots.txt $out/robots.txt
33 ln -sf ${yourls_config} $out/includes/config.php
34 '';
35 passthru = toPassthru package [];
36 });
37in package
diff --git a/flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix b/flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix
new file mode 100644
index 0000000..5870faa
--- /dev/null
+++ b/flakes/mypackages/pkgs/webapps/yourls/plugins/ldap/default.nix
@@ -0,0 +1,17 @@
1{ stdenv, fetchFromGitHub }:
2stdenv.mkDerivation (rec {
3 pname = "yourls-ldap-plugin";
4 version = "2a3cb03-master";
5 src = fetchFromGitHub {
6 owner = "k3a";
7 repo = "yourls-ldap-plugin";
8 rev = "2a3cb0334b8a6b81b284a7196e614bbd2b2b1615";
9 sha256 = "0cchbnli77d295lzf7kjmn4dcxj2bmdqa9qc3f8l8qgmp4n5n0gh";
10 fetchSubmodules = true;
11 };
12 installPhase = ''
13 mkdir -p $out
14 cp plugin.php $out
15 '';
16 passthru.pluginName = "ldap";
17})
diff --git a/flakes/myuids/flake.nix b/flakes/myuids/flake.nix
index cc6dc66..ff33651 100644
--- a/flakes/myuids/flake.nix
+++ b/flakes/myuids/flake.nix
@@ -6,6 +6,7 @@
6 # Check that there is no clash with nixos/modules/misc/ids.nix 6 # Check that there is no clash with nixos/modules/misc/ids.nix
7 uids = { 7 uids = {
8 cryptpad = 386; 8 cryptpad = 386;
9 openldap = 99; # commented in the ids file
9 postfixscripts = 387; 10 postfixscripts = 387;
10 acme = 388; 11 acme = 388;
11 backup = 389; 12 backup = 389;
@@ -21,6 +22,7 @@
21 }; 22 };
22 gids = { 23 gids = {
23 nagios = 11; # commented in the ids file 24 nagios = 11; # commented in the ids file
25 openldap = 99; # commented in the ids file
24 cryptpad = 386; 26 cryptpad = 386;
25 acme = 388; 27 acme = 388;
26 backup = 389; 28 backup = 389;
@@ -35,10 +37,20 @@
35 mastodon = 399; 37 mastodon = 399;
36 }; 38 };
37 }; 39 };
38 nixosModule = { ... }: { 40 nixosModule = { config, lib, ... }: {
39 config = { 41 config = {
40 ids.uids = self.lib.uids; 42 ids.uids = self.lib.uids;
41 ids.gids = self.lib.gids; 43 ids.gids = self.lib.gids;
44 assertions = [
45 {
46 assertion = builtins.length (builtins.attrValues config.ids.gids) == builtins.length (lib.unique (builtins.attrValues config.ids.gids));
47 message = "Non-unique list of gids";
48 }
49 {
50 assertion = builtins.length (builtins.attrValues config.ids.uids) == builtins.length (lib.unique (builtins.attrValues config.ids.uids));
51 message = "Non-unique list of uids";
52 }
53 ];
42 }; 54 };
43 }; 55 };
44 }; 56 };
diff --git a/flakes/naemon/flake.nix b/flakes/naemon/flake.nix
new file mode 100644
index 0000000..9b2ace5
--- /dev/null
+++ b/flakes/naemon/flake.nix
@@ -0,0 +1,191 @@
1{
2 outputs = { self }: {
3 nixosModule = self.nixosModules.naemon;
4 nixosModules.naemon = { config, lib, pkgs, ... }:
5 with lib;
6
7 let
8 cfg = config.services.naemon;
9
10 naemonConfig = pkgs.runCommand "naemon-config" {
11 objectsFile = pkgs.writeText "naemon_objects.cfg" cfg.objectDefs;
12 resourceFile = config.secrets.fullPaths."naemon/resources.cfg";
13 extraConfig = pkgs.writeText "extra.cfg" cfg.extraConfig;
14 inherit (cfg) logDir varDir runDir cacheDir;
15 } ''
16 substituteAll ${./naemon.cfg} $out
17 cat $extraConfig >> $out
18 '';
19 in
20 {
21 # Necessary for situations where flake gets included multiple times
22 key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
23
24 options = {
25 services.naemon = {
26 enable = mkOption {
27 default = false;
28 description = "
29 Whether to use <link
30 xlink:href='http://www.naemon.org/'>Naemon</link> to monitor
31 your system or network.
32 ";
33 };
34
35 objectDefs = mkOption {
36 type = types.lines;
37 default = "";
38 description = "
39 A list of Naemon object configuration that must define
40 the hosts, host groups, services and contacts for the
41 network that you want Naemon to monitor.
42 ";
43 };
44
45 extraResource = mkOption {
46 type = types.lines;
47 default = "";
48 example = ''
49 # Sets $USER2$ to be the path to event handlers
50 #$USER2$=/usr/lib/monitoring-plugins/eventhandlers
51
52 # Store some usernames and passwords (hidden from the CGIs)
53 #$USER3$=someuser
54 #$USER4$=somepassword
55 '';
56 description = "
57 Lines to add to the resource file
58 # You can define $USERx$ macros in this file, which can in turn be used
59 # in command definitions in your host config file(s). $USERx$ macros are
60 # useful for storing sensitive information such as usernames, passwords,
61 # etc. They are also handy for specifying the path to plugins and
62 # event handlers - if you decide to move the plugins or event handlers to
63 # a different directory in the future, you can just update one or two
64 # $USERx$ macros, instead of modifying a lot of command definitions.
65 #
66 # Naemon supports up to 256 $USERx$ macros ($USER1$ through $USER256$)
67 #
68 # Resource files may also be used to store configuration directives for
69 # external data sources like MySQL...
70 #
71 ";
72 };
73
74 extraConfig = mkOption {
75 type = types.lines;
76 default = "";
77 description = "
78 Extra config to append to main config
79 ";
80 };
81
82 user = mkOption {
83 type = types.str;
84 default = "naemon";
85 description = "User for naemon";
86 };
87
88 group = mkOption {
89 type = types.str;
90 default = "naemon";
91 description = "Group for naemon";
92 };
93
94 varDir = mkOption {
95 type = types.path;
96 default = "/var/lib/naemon";
97 description = "The directory where naemon stores its data";
98 };
99
100 cacheDir = mkOption {
101 type = types.path;
102 default = "/var/cache/naemon";
103 description = "The directory where naemon stores its cache";
104 };
105
106 runDir = mkOption {
107 type = types.path;
108 default = "/run/naemon";
109 description = "The directory where naemon stores its runtime files";
110 };
111
112 logDir = mkOption {
113 type = types.path;
114 default = "/var/log/naemon";
115 description = "The directory where naemon stores its log files";
116 };
117
118 package = mkOption {
119 type = types.package;
120 default = pkgs.naemon.override {
121 inherit (cfg) varDir cacheDir logDir runDir user group;
122 };
123 description = ''
124 Naemon package to use
125 '';
126 };
127 };
128 };
129
130
131 config = mkIf cfg.enable {
132 secrets.keys = {
133 "naemon/resources.cfg" = {
134 user = cfg.user;
135 group = cfg.group;
136 permissions = "0400";
137 text = ''
138 $USER1$=${pkgs.monitoring-plugins}/libexec
139 ${cfg.extraResource}
140 '';
141 keyDependencies = [ pkgs.monitoring-plugins ];
142 };
143 };
144
145 users.users = optionalAttrs (cfg.user == "naemon") {
146 naemon = {
147 group = cfg.group;
148 uid = config.ids.uids.nagios;
149 extraGroups = [ "keys" ];
150 };
151 };
152 users.groups = optionalAttrs (cfg.user == "naemon") {
153 naemon = {
154 gid = config.ids.gids.nagios;
155 };
156 };
157
158 services.filesWatcher.naemon = {
159 paths = [ config.secrets.fullPaths."naemon/resources.cfg" ];
160 };
161 systemd.services.naemon = {
162 description = "Naemon monitoring daemon";
163 path = [ cfg.package ];
164 wantedBy = [ "multi-user.target" ];
165 after = [ "network.target" ];
166
167 preStart = "${cfg.package}/bin/naemon -vp ${naemonConfig}";
168 script = "${cfg.package}/bin/naemon --daemon ${naemonConfig}";
169 reload = "${pkgs.utillinux}/bin/kill -HUP $MAINPID";
170 serviceConfig = {
171 User = cfg.user;
172 Restart = "always";
173 RestartSec = 2;
174 StandardOutput = "journal";
175 StandardError = "inherit";
176 PIDFile = "${cfg.runDir}/naemon.pid";
177 LogsDirectory = assert lib.strings.hasPrefix "/var/log/" cfg.logDir;
178 lib.strings.removePrefix "/var/log/" cfg.logDir;
179 CacheDirectory = assert lib.strings.hasPrefix "/var/cache/" cfg.cacheDir;
180 let unprefixed = lib.strings.removePrefix "/var/cache/" cfg.cacheDir;
181 in [ unprefixed "${unprefixed}/checkresults" ];
182 StateDirectory = assert lib.strings.hasPrefix "/var/lib/" cfg.varDir;
183 lib.strings.removePrefix "/var/lib/" cfg.varDir;
184 RuntimeDirectory = assert lib.strings.hasPrefix "/run/" cfg.runDir;
185 lib.strings.removePrefix "/run/" cfg.runDir;
186 };
187 };
188 };
189 };
190 };
191}
diff --git a/modules/naemon/naemon.cfg b/flakes/naemon/naemon.cfg
index 792e03b..792e03b 100644
--- a/modules/naemon/naemon.cfg
+++ b/flakes/naemon/naemon.cfg
diff --git a/flakes/openarc/flake.lock b/flakes/openarc/flake.lock
index e0b78a8..a9e5e81 100644
--- a/flakes/openarc/flake.lock
+++ b/flakes/openarc/flake.lock
@@ -17,19 +17,14 @@
17 }, 17 },
18 "myuids": { 18 "myuids": {
19 "locked": { 19 "locked": {
20 "dir": "flakes/myuids", 20 "lastModified": 1,
21 "lastModified": 1628207001, 21 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
22 "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", 22 "path": "../myuids",
23 "ref": "master", 23 "type": "path"
24 "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3",
25 "revCount": 865,
26 "type": "git",
27 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
28 }, 24 },
29 "original": { 25 "original": {
30 "dir": "flakes/myuids", 26 "path": "../myuids",
31 "type": "git", 27 "type": "path"
32 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
33 } 28 }
34 }, 29 },
35 "nixpkgs": { 30 "nixpkgs": {
diff --git a/flakes/openarc/flake.nix b/flakes/openarc/flake.nix
index 6fd45bf..17a3fdd 100644
--- a/flakes/openarc/flake.nix
+++ b/flakes/openarc/flake.nix
@@ -2,9 +2,7 @@
2 description = "Open source ARC implementation"; 2 description = "Open source ARC implementation";
3 3
4 inputs.myuids = { 4 inputs.myuids = {
5 url = "https://git.immae.eu/perso/Immae/Config/Nix.git"; 5 url = "path:../myuids";
6 type = "git";
7 dir = "flakes/myuids";
8 }; 6 };
9 inputs.flake-utils.url = "github:numtide/flake-utils"; 7 inputs.flake-utils.url = "github:numtide/flake-utils";
10 inputs.nixpkgs.url = "github:NixOS/nixpkgs"; 8 inputs.nixpkgs.url = "github:NixOS/nixpkgs";
@@ -66,6 +64,8 @@
66 defaultSock = "/run/openarc/openarc.sock"; 64 defaultSock = "/run/openarc/openarc.sock";
67 args = [ "-f" "-p" "local:${cfg.socket}" ] ++ lib.optionals (cfg.configFile != null) [ "-c" cfg.configFile ]; 65 args = [ "-f" "-p" "local:${cfg.socket}" ] ++ lib.optionals (cfg.configFile != null) [ "-c" cfg.configFile ];
68 in { 66 in {
67 # Necessary for situations where flake gets included multiple times
68 key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
69 options = { 69 options = {
70 services.openarc = { 70 services.openarc = {
71 enable = lib.mkOption { 71 enable = lib.mkOption {
diff --git a/flakes/opendmarc/flake.lock b/flakes/opendmarc/flake.lock
index 4503c79..e0cbe17 100644
--- a/flakes/opendmarc/flake.lock
+++ b/flakes/opendmarc/flake.lock
@@ -17,19 +17,14 @@
17 }, 17 },
18 "myuids": { 18 "myuids": {
19 "locked": { 19 "locked": {
20 "dir": "flakes/myuids", 20 "lastModified": 1,
21 "lastModified": 1628207001, 21 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
22 "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", 22 "path": "../myuids",
23 "ref": "master", 23 "type": "path"
24 "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3",
25 "revCount": 865,
26 "type": "git",
27 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
28 }, 24 },
29 "original": { 25 "original": {
30 "dir": "flakes/myuids", 26 "path": "../myuids",
31 "type": "git", 27 "type": "path"
32 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
33 } 28 }
34 }, 29 },
35 "nixpkgs": { 30 "nixpkgs": {
diff --git a/flakes/opendmarc/flake.nix b/flakes/opendmarc/flake.nix
index 277fd25..70b8cd7 100644
--- a/flakes/opendmarc/flake.nix
+++ b/flakes/opendmarc/flake.nix
@@ -2,9 +2,7 @@
2 description = "Open source ARC implementation"; 2 description = "Open source ARC implementation";
3 3
4 inputs.myuids = { 4 inputs.myuids = {
5 url = "https://git.immae.eu/perso/Immae/Config/Nix.git"; 5 url = "path:../myuids";
6 type = "git";
7 dir = "flakes/myuids";
8 }; 6 };
9 inputs.flake-utils.url = "github:numtide/flake-utils"; 7 inputs.flake-utils.url = "github:numtide/flake-utils";
10 inputs.nixpkgs.url = "github:NixOS/nixpkgs"; 8 inputs.nixpkgs.url = "github:NixOS/nixpkgs";
@@ -51,7 +49,9 @@
51 defaultSock = "/run/opendmarc/opendmarc.sock"; 49 defaultSock = "/run/opendmarc/opendmarc.sock";
52 args = [ "-f" "-l" "-p" "local:${cfg.socket}" ] ++ lib.optionals (cfg.configFile != null) [ "-c" cfg.configFile ]; 50 args = [ "-f" "-l" "-p" "local:${cfg.socket}" ] ++ lib.optionals (cfg.configFile != null) [ "-c" cfg.configFile ];
53 in { 51 in {
54 options = { 52 # Necessary for situations where flake gets included multiple times
53 key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
54 options = {
55 services.opendmarc = { 55 services.opendmarc = {
56 enable = lib.mkOption { 56 enable = lib.mkOption {
57 type = lib.types.bool; 57 type = lib.types.bool;
diff --git a/flakes/openfoodnetwork/default.nix b/flakes/openfoodnetwork/default.nix
new file mode 100644
index 0000000..dd68177
--- /dev/null
+++ b/flakes/openfoodnetwork/default.nix
@@ -0,0 +1,39 @@
1{ bundlerEnv, defaultGemConfig, writeShellScript, v8, stdenv }:
2
3let
4 gems = bundlerEnv {
5 name = "openfoodnetwork";
6 gemfile = ./Gemfile;
7 lockfile = ./Gemfile.lock;
8 gemset = import ./gemset.nix;
9 gemConfig = defaultGemConfig // {
10 libv8-node = attrs: {
11 dontBuild = false;
12 postPatch = let
13 noopScript = writeShellScript "noop" "exit 0";
14 linkFiles = writeShellScript "link-files" ''
15 cd ../..
16
17 mkdir -p vendor/v8/out.gn/libv8/obj/
18 ln -s "${v8}/lib/libv8.a" vendor/v8/out.gn/libv8/obj/libv8_monolith.a
19
20 ln -s ${v8}/include vendor/v8/include
21
22 mkdir -p ext/libv8-node
23 echo '--- !ruby/object:Libv8::Node::Location::Vendor {}' >ext/libv8-node/.location.yml
24 '';
25 in ''
26 cp ${noopScript} libexec/build-libv8
27 cp ${noopScript} libexec/build-monolith
28 cp ${noopScript} libexec/download-node
29 cp ${noopScript} libexec/extract-node
30 cp ${linkFiles} libexec/inject-libv8
31 '';
32 };
33 };
34 };
35in
36 stdenv.mkDerivation {
37 name = "openfoodnetwork";
38 inherit
39 }
diff --git a/flakes/openfoodnetwork/gemset.nix b/flakes/openfoodnetwork/gemset.nix
new file mode 100644
index 0000000..2f212b8
--- /dev/null
+++ b/flakes/openfoodnetwork/gemset.nix
@@ -0,0 +1,2896 @@
1{
2 actioncable = {
3 dependencies = ["actionpack" "activesupport" "nio4r" "websocket-driver"];
4 groups = ["default"];
5 platforms = [];
6 source = {
7 remotes = ["https://rubygems.org"];
8 sha256 = "0ilq5mniarm0zlvnkagqj9n9p73ljrhphciz02aymrpfxxxclz2x";
9 type = "gem";
10 };
11 version = "6.1.4.1";
12 };
13 actionmailbox = {
14 dependencies = ["actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail"];
15 groups = ["default"];
16 platforms = [];
17 source = {
18 remotes = ["https://rubygems.org"];
19 sha256 = "16azdnjws215clb056b9mabglx4b8f61hr82hv7hm80dmn89zqq6";
20 type = "gem";
21 };
22 version = "6.1.4.1";
23 };
24 actionmailer = {
25 dependencies = ["actionpack" "actionview" "activejob" "activesupport" "mail" "rails-dom-testing"];
26 groups = ["default"];
27 platforms = [];
28 source = {
29 remotes = ["https://rubygems.org"];
30 sha256 = "00s07l2ac5igch1g2rpa0linmiq7mhgk6v6wxkckg8gbiqijb592";
31 type = "gem";
32 };
33 version = "6.1.4.1";
34 };
35 actionpack = {
36 dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"];
37 groups = ["default" "development" "test"];
38 platforms = [];
39 source = {
40 remotes = ["https://rubygems.org"];
41 sha256 = "0xgysqnibjsy6kdz10x2xb3kwa6lssiqhh0zggrbgs31ypwhlpia";
42 type = "gem";
43 };
44 version = "6.1.4.1";
45 };
46 actionpack-action_caching = {
47 dependencies = ["actionpack"];
48 groups = ["default"];
49 platforms = [];
50 source = {
51 remotes = ["https://rubygems.org"];
52 sha256 = "1bxaz8sdhqkdjqwk58icy9668s0yxpgm28gdkdmxl3g41m94b8id";
53 type = "gem";
54 };
55 version = "1.2.2";
56 };
57 actiontext = {
58 dependencies = ["actionpack" "activerecord" "activestorage" "activesupport" "nokogiri"];
59 groups = ["default"];
60 platforms = [];
61 source = {
62 remotes = ["https://rubygems.org"];
63 sha256 = "0m4fy4qqh09vnzbhx383vjdfid6fzbs49bzzg415x05nmmjkx582";
64 type = "gem";
65 };
66 version = "6.1.4.1";
67 };
68 actionview = {
69 dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"];
70 groups = ["default" "development" "test"];
71 platforms = [];
72 source = {
73 remotes = ["https://rubygems.org"];
74 sha256 = "1yf4ic5kl324rs0raralpwx24s6hvvdzxfhinafylf8f3x7jj23z";
75 type = "gem";
76 };
77 version = "6.1.4.1";
78 };
79 active_model_serializers = {
80 dependencies = ["activemodel"];
81 groups = ["default"];
82 platforms = [];
83 source = {
84 remotes = ["https://rubygems.org"];
85 sha256 = "0k3mgia2ahh7mbk30hjq9pzqbk0kh281s91kq2z6p555nv9y6l3k";
86 type = "gem";
87 };
88 version = "0.8.4";
89 };
90 activejob = {
91 dependencies = ["activesupport" "globalid"];
92 groups = ["default"];
93 platforms = [];
94 source = {
95 remotes = ["https://rubygems.org"];
96 sha256 = "1q7c0i0kwarxgcbxk71wa9jnlg45grbxmhlrh7dk9bgcv7r7r7hn";
97 type = "gem";
98 };
99 version = "6.1.4.1";
100 };
101 activemerchant = {
102 dependencies = ["activesupport" "builder" "i18n" "nokogiri"];
103 groups = ["default"];
104 platforms = [];
105 source = {
106 remotes = ["https://rubygems.org"];
107 sha256 = "0ajmcgc4idxmvh8sghyb1ngxsc9x6r5yfi4r1z22d6a4j7b1yjzj";
108 type = "gem";
109 };
110 version = "1.123.0";
111 };
112 activemodel = {
113 dependencies = ["activesupport"];
114 groups = ["default" "development" "test"];
115 platforms = [];
116 source = {
117 remotes = ["https://rubygems.org"];
118 sha256 = "16ixam4lni8b5lgx0whnax0imzh1dh10fy5r9pxs52n83yz5nbq3";
119 type = "gem";
120 };
121 version = "6.1.4.1";
122 };
123 activerecord = {
124 dependencies = ["activemodel" "activesupport"];
125 groups = ["default" "development" "test"];
126 platforms = [];
127 source = {
128 remotes = ["https://rubygems.org"];
129 sha256 = "1ccgvlj767ybps3pxlaa4iw77n7wbriw2sr8754id3ngjfap08ja";
130 type = "gem";
131 };
132 version = "6.1.4.1";
133 };
134 activerecord-import = {
135 dependencies = ["activerecord"];
136 groups = ["default"];
137 platforms = [];
138 source = {
139 remotes = ["https://rubygems.org"];
140 sha256 = "17ydad9gcsh0c9ny68fyvxmh6rbld4pyvyabnc7882678dnvfy8i";
141 type = "gem";
142 };
143 version = "1.2.0";
144 };
145 activerecord-postgresql-adapter = {
146 dependencies = ["pg"];
147 groups = ["default"];
148 platforms = [];
149 source = {
150 remotes = ["https://rubygems.org"];
151 sha256 = "1wdfd1mkns28ilr6nm18x69h651mjxwb8p2zk8pb6cjgx7c26axl";
152 type = "gem";
153 };
154 version = "0.0.1";
155 };
156 activerecord-session_store = {
157 dependencies = ["actionpack" "activerecord" "multi_json" "rack" "railties"];
158 groups = ["default"];
159 platforms = [];
160 source = {
161 remotes = ["https://rubygems.org"];
162 sha256 = "06ddhz1b2yg72iv09n48gcd3ix5da7hxlzi7vvj13nrps2qwlffg";
163 type = "gem";
164 };
165 version = "2.0.0";
166 };
167 activestorage = {
168 dependencies = ["actionpack" "activejob" "activerecord" "activesupport" "marcel" "mini_mime"];
169 groups = ["default"];
170 platforms = [];
171 source = {
172 remotes = ["https://rubygems.org"];
173 sha256 = "17knzz9fvqg4x582vy0xmlgjkxfb13xyzl2rgw19qfma86hxsvvi";
174 type = "gem";
175 };
176 version = "6.1.4.1";
177 };
178 activesupport = {
179 dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo" "zeitwerk"];
180 groups = ["default" "development" "test"];
181 platforms = [];
182 source = {
183 remotes = ["https://rubygems.org"];
184 sha256 = "19gx1jcq46x9d1pi1w8xq0bgvvfw239y4lalr8asm291gj3q3ds4";
185 type = "gem";
186 };
187 version = "6.1.4.1";
188 };
189 acts-as-taggable-on = {
190 dependencies = ["activerecord"];
191 groups = ["default"];
192 platforms = [];
193 source = {
194 remotes = ["https://rubygems.org"];
195 sha256 = "0kfnyix173bazjswab21bx7hmqmik71awj2kz090fsa2nv58c4mw";
196 type = "gem";
197 };
198 version = "8.1.0";
199 };
200 acts_as_list = {
201 dependencies = ["activerecord"];
202 groups = ["default"];
203 platforms = [];
204 source = {
205 remotes = ["https://rubygems.org"];
206 sha256 = "12p22h59c45dnccb51pqk275ziyi502azf9w3qcnkcsq827ma5jm";
207 type = "gem";
208 };
209 version = "1.0.4";
210 };
211 addressable = {
212 dependencies = ["public_suffix"];
213 groups = ["default" "development" "test"];
214 platforms = [];
215 source = {
216 remotes = ["https://rubygems.org"];
217 sha256 = "022r3m9wdxljpbya69y2i3h9g3dhhfaqzidf95m6qjzms792jvgp";
218 type = "gem";
219 };
220 version = "2.8.0";
221 };
222 afm = {
223 groups = ["default" "test"];
224 platforms = [];
225 source = {
226 remotes = ["https://rubygems.org"];
227 sha256 = "06kj9hgd0z8pj27bxp2diwqh6fv7qhwwm17z64rhdc4sfn76jgn8";
228 type = "gem";
229 };
230 version = "0.2.2";
231 };
232 angular-rails-templates = {
233 dependencies = ["railties" "sprockets" "tilt"];
234 groups = ["default"];
235 platforms = [];
236 source = {
237 remotes = ["https://rubygems.org"];
238 sha256 = "0aja8b2bjj8af29zagkm6pv48s0933l0d38j5b4wgxipf0c0mjxq";
239 type = "gem";
240 };
241 version = "1.1.0";
242 };
243 angular_rails_csrf = {
244 dependencies = ["railties"];
245 groups = ["default"];
246 platforms = [];
247 source = {
248 remotes = ["https://rubygems.org"];
249 sha256 = "08g6xwz98apbfxwd0kbsxl7ll4bms11m563rjl4mavm1dnf3nsgh";
250 type = "gem";
251 };
252 version = "4.5.0";
253 };
254 angularjs-file-upload-rails = {
255 groups = ["default"];
256 platforms = [];
257 source = {
258 remotes = ["https://rubygems.org"];
259 sha256 = "07s0b8bwdp8asc16rp16q78p17cl5qnw8svqarbcsv0b1fkxiqbd";
260 type = "gem";
261 };
262 version = "2.4.1";
263 };
264 angularjs-rails = {
265 groups = ["default"];
266 platforms = [];
267 source = {
268 remotes = ["https://rubygems.org"];
269 sha256 = "01blhjrzg82l76s5fj7jcgnykxxdj61m5swwy9x0wxnxhid81rgx";
270 type = "gem";
271 };
272 version = "1.8.0";
273 };
274 Ascii85 = {
275 groups = ["default" "test"];
276 platforms = [];
277 source = {
278 remotes = ["https://rubygems.org"];
279 sha256 = "1ds4v9xgsyvijnlflak4dzf1qwmda9yd5bv8jwsb56nngd399rlw";
280 type = "gem";
281 };
282 version = "1.1.0";
283 };
284 ast = {
285 groups = ["default" "development"];
286 platforms = [];
287 source = {
288 remotes = ["https://rubygems.org"];
289 sha256 = "04nc8x27hlzlrr5c2gn7mar4vdr0apw5xg22wp6m8dx3wqr04a0y";
290 type = "gem";
291 };
292 version = "2.4.2";
293 };
294 awesome_nested_set = {
295 dependencies = ["activerecord"];
296 groups = ["default"];
297 platforms = [];
298 source = {
299 remotes = ["https://rubygems.org"];
300 sha256 = "06ggf81dy8wkds0b37xgx065b325fm0c6i6g1k0ml4ai8jwphm6r";
301 type = "gem";
302 };
303 version = "3.4.0";
304 };
305 awesome_print = {
306 groups = ["development" "test"];
307 platforms = [];
308 source = {
309 remotes = ["https://rubygems.org"];
310 sha256 = "0vkq6c8y2jvaw03ynds5vjzl1v9wg608cimkd3bidzxc0jvk56z9";
311 type = "gem";
312 };
313 version = "1.9.2";
314 };
315 aws-sdk = {
316 dependencies = ["aws-sdk-resources"];
317 groups = ["default"];
318 platforms = [];
319 source = {
320 remotes = ["https://rubygems.org"];
321 sha256 = "1xfan8fpiy019zp32l2a8smwfbii5m9hy49d8b8gvww2qcy5m3pr";
322 type = "gem";
323 };
324 version = "2.2.0";
325 };
326 aws-sdk-core = {
327 dependencies = ["jmespath"];
328 groups = ["default"];
329 platforms = [];
330 source = {
331 remotes = ["https://rubygems.org"];
332 sha256 = "1f8diki6xvz048i0lhkxqngirgmqqj50jda8vjw0xxgv3qzklq4r";
333 type = "gem";
334 };
335 version = "2.2.0";
336 };
337 aws-sdk-resources = {
338 dependencies = ["aws-sdk-core"];
339 groups = ["default"];
340 platforms = [];
341 source = {
342 remotes = ["https://rubygems.org"];
343 sha256 = "06y7sj2371pjw9vgsfipbz2g3pw3i4asdz27h1lb7pny8gwndkzk";
344 type = "gem";
345 };
346 version = "2.2.0";
347 };
348 bcrypt = {
349 groups = ["default"];
350 platforms = [];
351 source = {
352 remotes = ["https://rubygems.org"];
353 sha256 = "02r1c3isfchs5fxivbq99gc3aq4vfyn8snhcy707dal1p8qz12qb";
354 type = "gem";
355 };
356 version = "3.1.16";
357 };
358 bigdecimal = {
359 groups = ["default"];
360 platforms = [];
361 source = {
362 remotes = ["https://rubygems.org"];
363 sha256 = "0fxl2hybnfij668h7133p28f8b13jaj13wyyniqdiy8m3s6b1pcb";
364 type = "gem";
365 };
366 version = "3.0.2";
367 };
368 bindex = {
369 groups = ["default" "development"];
370 platforms = [];
371 source = {
372 remotes = ["https://rubygems.org"];
373 sha256 = "0zmirr3m02p52bzq4xgksq4pn8j641rx5d4czk68pv9rqnfwq7kv";
374 type = "gem";
375 };
376 version = "0.8.1";
377 };
378 bootsnap = {
379 dependencies = ["msgpack"];
380 groups = ["default"];
381 platforms = [];
382 source = {
383 remotes = ["https://rubygems.org"];
384 sha256 = "1ndjra3h86dq28njm2swmaw6n3vsywrycrf7i5iy9l8hrhfhv4x2";
385 type = "gem";
386 };
387 version = "1.9.1";
388 };
389 bugsnag = {
390 dependencies = ["concurrent-ruby"];
391 groups = ["default"];
392 platforms = [];
393 source = {
394 remotes = ["https://rubygems.org"];
395 sha256 = "19yz4s0sw2w8jywkdf445zpdkg3s9869hmxcs7w68xvykpx0ickb";
396 type = "gem";
397 };
398 version = "6.24.0";
399 };
400 builder = {
401 groups = ["default" "development" "test"];
402 platforms = [];
403 source = {
404 remotes = ["https://rubygems.org"];
405 sha256 = "045wzckxpwcqzrjr353cxnyaxgf0qg22jh00dcx7z38cys5g1jlr";
406 type = "gem";
407 };
408 version = "3.2.4";
409 };
410 bullet = {
411 dependencies = ["activesupport" "uniform_notifier"];
412 groups = ["development" "test"];
413 platforms = [];
414 source = {
415 remotes = ["https://rubygems.org"];
416 sha256 = "01xachwsyykmp153514vz2khanbsz1n27j09za5gcxj54srh5l4p";
417 type = "gem";
418 };
419 version = "6.1.5";
420 };
421 byebug = {
422 groups = ["development" "test"];
423 platforms = [];
424 source = {
425 remotes = ["https://rubygems.org"];
426 sha256 = "0nx3yjf4xzdgb8jkmk2344081gqr22pgjqnmjg2q64mj5d6r9194";
427 type = "gem";
428 };
429 version = "11.1.3";
430 };
431 cable_ready = {
432 dependencies = ["rails" "thread-local"];
433 groups = ["default"];
434 platforms = [];
435 source = {
436 remotes = ["https://rubygems.org"];
437 sha256 = "06lqnv1b3zxgn189v7df6avf3zrk1snfxkbm1ax0fz129k997hak";
438 type = "gem";
439 };
440 version = "5.0.0.pre2";
441 };
442 cancancan = {
443 groups = ["default"];
444 platforms = [];
445 source = {
446 remotes = ["https://rubygems.org"];
447 sha256 = "05kb459laaw339n7mas37v4k83nwz228bfpaghgybza347341x85";
448 type = "gem";
449 };
450 version = "1.15.0";
451 };
452 capybara = {
453 dependencies = ["addressable" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath"];
454 groups = ["development" "test"];
455 platforms = [];
456 source = {
457 remotes = ["https://rubygems.org"];
458 sha256 = "1viqcpsngy9fqjd68932m43ad6xj656d1x33nx9565q57chgi29k";
459 type = "gem";
460 };
461 version = "3.35.3";
462 };
463 catalog = {
464 groups = ["default"];
465 platforms = [];
466 source = {
467 path = engines/catalog;
468 type = "path";
469 };
470 version = "0.0.1";
471 };
472 childprocess = {
473 groups = ["default" "development" "test"];
474 platforms = [];
475 source = {
476 remotes = ["https://rubygems.org"];
477 sha256 = "1ic028k8xgm2dds9mqnvwwx3ibaz32j8455zxr9f4bcnviyahya5";
478 type = "gem";
479 };
480 version = "3.0.0";
481 };
482 chronic = {
483 groups = ["default"];
484 platforms = [];
485 source = {
486 remotes = ["https://rubygems.org"];
487 sha256 = "1hrdkn4g8x7dlzxwb1rfgr8kw3bp4ywg5l4y4i9c2g5cwv62yvvn";
488 type = "gem";
489 };
490 version = "0.10.2";
491 };
492 chunky_png = {
493 groups = ["default"];
494 platforms = [];
495 source = {
496 remotes = ["https://rubygems.org"];
497 sha256 = "1znw5x86hmm9vfhidwdsijz8m38pqgmv98l9ryilvky0aldv7mc9";
498 type = "gem";
499 };
500 version = "1.4.0";
501 };
502 climate_control = {
503 groups = ["default"];
504 platforms = [];
505 source = {
506 remotes = ["https://rubygems.org"];
507 sha256 = "0q11v0iabvr6rif0d025xh078ili5frrihlj0m04zfg7lgvagxji";
508 type = "gem";
509 };
510 version = "0.2.0";
511 };
512 cliver = {
513 groups = ["default" "development" "test"];
514 platforms = [];
515 source = {
516 remotes = ["https://rubygems.org"];
517 sha256 = "096f4rj7virwvqxhkavy0v55rax10r4jqf8cymbvn4n631948xc7";
518 type = "gem";
519 };
520 version = "0.3.2";
521 };
522 cocaine = {
523 dependencies = ["climate_control"];
524 groups = ["default"];
525 platforms = [];
526 source = {
527 remotes = ["https://rubygems.org"];
528 sha256 = "01kk5xd7lspbkdvn6nyj0y51zhvia3z6r4nalbdcqw5fbsywwi7d";
529 type = "gem";
530 };
531 version = "0.5.8";
532 };
533 codecov = {
534 dependencies = ["simplecov"];
535 groups = ["test"];
536 platforms = [];
537 source = {
538 remotes = ["https://rubygems.org"];
539 sha256 = "1pi2dmqxjw5wsn65yx5qz5ks5msqflj0zxvk11r3cxwgacvj3hys";
540 type = "gem";
541 };
542 version = "0.6.0";
543 };
544 coderay = {
545 groups = ["default" "development"];
546 platforms = [];
547 source = {
548 remotes = ["https://rubygems.org"];
549 sha256 = "0jvxqxzply1lwp7ysn94zjhh57vc14mcshw1ygw14ib8lhc00lyw";
550 type = "gem";
551 };
552 version = "1.1.3";
553 };
554 coffee-rails = {
555 dependencies = ["coffee-script" "railties"];
556 groups = ["default"];
557 platforms = [];
558 source = {
559 remotes = ["https://rubygems.org"];
560 sha256 = "170sp4y82bf6nsczkkkzypzv368sgjg6lfrkib4hfjgxa6xa3ajx";
561 type = "gem";
562 };
563 version = "5.0.0";
564 };
565 coffee-script = {
566 dependencies = ["coffee-script-source" "execjs"];
567 groups = ["default"];
568 platforms = [];
569 source = {
570 remotes = ["https://rubygems.org"];
571 sha256 = "0rc7scyk7mnpfxqv5yy4y5q1hx3i7q3ahplcp4bq2g5r24g2izl2";
572 type = "gem";
573 };
574 version = "2.4.1";
575 };
576 coffee-script-source = {
577 groups = ["default"];
578 platforms = [];
579 source = {
580 remotes = ["https://rubygems.org"];
581 sha256 = "1907v9q1zcqmmyqzhzych5l7qifgls2rlbnbhy5vzyr7i7yicaz1";
582 type = "gem";
583 };
584 version = "1.12.2";
585 };
586 combine_pdf = {
587 dependencies = ["ruby-rc4"];
588 groups = ["default"];
589 platforms = [];
590 source = {
591 remotes = ["https://rubygems.org"];
592 sha256 = "1bxakrrip0sg5gxy50wdn7lr3h2w7rd590cjhnj4qi477cvi1qgg";
593 type = "gem";
594 };
595 version = "1.0.21";
596 };
597 compass = {
598 dependencies = ["chunky_png" "compass-core" "compass-import-once" "rb-fsevent" "rb-inotify" "sass"];
599 groups = ["default"];
600 platforms = [];
601 source = {
602 remotes = ["https://rubygems.org"];
603 sha256 = "0lfi83w8z75czr0pf0rmj9hda22082h3cmvczl8r1ma9agf88y2c";
604 type = "gem";
605 };
606 version = "1.0.3";
607 };
608 compass-core = {
609 dependencies = ["multi_json" "sass"];
610 groups = ["default"];
611 platforms = [];
612 source = {
613 remotes = ["https://rubygems.org"];
614 sha256 = "0yaspqwdmzwdcqviclbs3blq7an16pysrfzylz8q1gxmmd6bpj3a";
615 type = "gem";
616 };
617 version = "1.0.3";
618 };
619 compass-import-once = {
620 dependencies = ["sass"];
621 groups = ["default"];
622 platforms = [];
623 source = {
624 remotes = ["https://rubygems.org"];
625 sha256 = "0bn7gwbfz7jvvdd0qdfqlx67fcb83gyvxqc7dr9fhcnks3z8z5rq";
626 type = "gem";
627 };
628 version = "1.0.5";
629 };
630 compass-rails = {
631 dependencies = ["compass" "sass-rails" "sprockets"];
632 groups = ["default"];
633 platforms = [];
634 source = {
635 remotes = ["https://rubygems.org"];
636 sha256 = "1y1gi9lcmxzn0xvx2pf4xzj8n0s6rl0vbycyjk1kpcvycyjnbjgr";
637 type = "gem";
638 };
639 version = "4.0.0";
640 };
641 concurrent-ruby = {
642 groups = ["default" "development" "test"];
643 platforms = [];
644 source = {
645 remotes = ["https://rubygems.org"];
646 sha256 = "0nwad3211p7yv9sda31jmbyw6sdafzmdi2i2niaz6f0wk5nq9h0f";
647 type = "gem";
648 };
649 version = "1.1.9";
650 };
651 connection_pool = {
652 groups = ["default"];
653 platforms = [];
654 source = {
655 remotes = ["https://rubygems.org"];
656 sha256 = "0ffdxhgirgc86qb42yvmfj6v1v0x4lvi0pxn9zhghkff44wzra0k";
657 type = "gem";
658 };
659 version = "2.2.5";
660 };
661 crack = {
662 dependencies = ["rexml"];
663 groups = ["default" "test"];
664 platforms = [];
665 source = {
666 remotes = ["https://rubygems.org"];
667 sha256 = "1cr1kfpw3vkhysvkk3wg7c54m75kd68mbm9rs5azdjdq57xid13r";
668 type = "gem";
669 };
670 version = "0.4.5";
671 };
672 crass = {
673 groups = ["default" "development" "test"];
674 platforms = [];
675 source = {
676 remotes = ["https://rubygems.org"];
677 sha256 = "0pfl5c0pyqaparxaqxi6s4gfl21bdldwiawrc0aknyvflli60lfw";
678 type = "gem";
679 };
680 version = "1.0.6";
681 };
682 css_parser = {
683 dependencies = ["addressable"];
684 groups = ["default"];
685 platforms = [];
686 source = {
687 remotes = ["https://rubygems.org"];
688 sha256 = "0xs4ind9xd099rb52b73pch8ha143dl8bhivqsbba4wrvxpbx751";
689 type = "gem";
690 };
691 version = "1.9.0";
692 };
693 cuprite = {
694 dependencies = ["capybara" "ferrum"];
695 groups = ["development" "test"];
696 platforms = [];
697 source = {
698 remotes = ["https://rubygems.org"];
699 sha256 = "1gz7min595pq4xkzm1nvn538i7plg7jwfc1pw6w8f4apfh94fv56";
700 type = "gem";
701 };
702 version = "0.13";
703 };
704 custom_error_message = {
705 groups = ["default"];
706 platforms = [];
707 source = {
708 fetchSubmodules = false;
709 rev = "3a8ec9dddc7a5b0aab7c69a6060596de300c68f4";
710 sha256 = "1r2yah8dzng7i0000xfdksv3cj2z65x1nr4vjrnsv9sm7fj7bbld";
711 type = "git";
712 url = "https://github.com/jeremydurham/custom-err-msg.git";
713 };
714 version = "1.1.1";
715 };
716 dalli = {
717 groups = ["default"];
718 platforms = [];
719 source = {
720 remotes = ["https://rubygems.org"];
721 sha256 = "0br39scmr187w3ifl5gsddl2fhq6ahijgw6358plqjdzrizlg764";
722 type = "gem";
723 };
724 version = "2.7.11";
725 };
726 database_cleaner = {
727 dependencies = ["database_cleaner-active_record"];
728 groups = ["development" "test"];
729 platforms = [];
730 source = {
731 remotes = ["https://rubygems.org"];
732 sha256 = "1x4r22rnpwnm9yln88vhzqj4cl3sbd26c4j50g9k6wp7y01rln4w";
733 type = "gem";
734 };
735 version = "2.0.1";
736 };
737 database_cleaner-active_record = {
738 dependencies = ["activerecord" "database_cleaner-core"];
739 groups = ["default" "development" "test"];
740 platforms = [];
741 source = {
742 remotes = ["https://rubygems.org"];
743 sha256 = "1jg7jd7w65hdarzbi8f252la3qgsnd2sjavhlmc82kwzfx37k38m";
744 type = "gem";
745 };
746 version = "2.0.0";
747 };
748 database_cleaner-core = {
749 groups = ["default" "development" "test"];
750 platforms = [];
751 source = {
752 remotes = ["https://rubygems.org"];
753 sha256 = "0v44bn386ipjjh4m2kl53dal8g4d41xajn2jggnmjbhn6965fil6";
754 type = "gem";
755 };
756 version = "2.0.1";
757 };
758 db2fog = {
759 dependencies = ["activerecord" "fog-core" "rails"];
760 groups = ["default"];
761 platforms = [];
762 source = {
763 fetchSubmodules = false;
764 rev = "5b63343847452f52aa42f7fc169d6ab3af57cda3";
765 sha256 = "02fc3v81sx6rnvc492bdg057fs67qpsf83y25bsdqz83k21xmzyl";
766 type = "git";
767 url = "https://github.com/openfoodfoundation/db2fog.git";
768 };
769 version = "0.9.2";
770 };
771 ddtrace = {
772 dependencies = ["ffi" "msgpack"];
773 groups = ["production" "staging"];
774 platforms = [];
775 source = {
776 remotes = ["https://rubygems.org"];
777 sha256 = "0p7d6r2zpy9mqmd26ni9cpgc2yas4jira66rxx92l87amypkvasc";
778 type = "gem";
779 };
780 version = "0.53.0";
781 };
782 debugger-linecache = {
783 groups = ["development"];
784 platforms = [];
785 source = {
786 remotes = ["https://rubygems.org"];
787 sha256 = "0iwyx190fd5vfwj1gzr8pg3m374kqqix4g4fc4qw29sp54d3fpdz";
788 type = "gem";
789 };
790 version = "1.2.0";
791 };
792 devise = {
793 dependencies = ["bcrypt" "orm_adapter" "railties" "responders" "warden"];
794 groups = ["default"];
795 platforms = [];
796 source = {
797 remotes = ["https://rubygems.org"];
798 sha256 = "0ag0skzk3h7bhmf1n2zwa7cg6kx5k5inxmq0kf5qpm7917ffm0mz";
799 type = "gem";
800 };
801 version = "4.8.0";
802 };
803 devise-encryptable = {
804 dependencies = ["devise"];
805 groups = ["default"];
806 platforms = [];
807 source = {
808 remotes = ["https://rubygems.org"];
809 sha256 = "1dh9gl7qa1a8x091xk9dc6lwc5jw6lqmiw7sii1hq0w4jknwlq4q";
810 type = "gem";
811 };
812 version = "0.2.0";
813 };
814 devise-i18n = {
815 dependencies = ["devise"];
816 groups = ["default"];
817 platforms = [];
818 source = {
819 remotes = ["https://rubygems.org"];
820 sha256 = "11knkl0b40pyjz8934pmr3apzsmvvaj09w5ks8xzppd5agid2r6f";
821 type = "gem";
822 };
823 version = "1.10.0";
824 };
825 devise-token_authenticatable = {
826 dependencies = ["devise"];
827 groups = ["default"];
828 platforms = [];
829 source = {
830 remotes = ["https://rubygems.org"];
831 sha256 = "0ss9wcmjghl6s2kyqrgjn5z4bw1gxmlbqv0in2kirn56428w239f";
832 type = "gem";
833 };
834 version = "1.1.0";
835 };
836 dfc_provider = {
837 dependencies = ["active_model_serializers" "jwt" "rspec"];
838 groups = ["default"];
839 platforms = [];
840 source = {
841 path = engines/dfc_provider;
842 type = "path";
843 };
844 version = "0.0.1";
845 };
846 diff-lcs = {
847 groups = ["default" "development" "test"];
848 platforms = [];
849 source = {
850 remotes = ["https://rubygems.org"];
851 sha256 = "0m925b8xc6kbpnif9dldna24q1szg4mk0fvszrki837pfn46afmz";
852 type = "gem";
853 };
854 version = "1.4.4";
855 };
856 docile = {
857 groups = ["default" "test"];
858 platforms = [];
859 source = {
860 remotes = ["https://rubygems.org"];
861 sha256 = "1lxqxgq71rqwj1lpl9q1mbhhhhhhdkkj7my341f2889pwayk85sz";
862 type = "gem";
863 };
864 version = "1.4.0";
865 };
866 dotenv = {
867 groups = ["default"];
868 platforms = [];
869 source = {
870 remotes = ["https://rubygems.org"];
871 sha256 = "0iym172c5337sm1x2ykc2i3f961vj3wdclbyg1x6sxs3irgfsl94";
872 type = "gem";
873 };
874 version = "2.7.6";
875 };
876 dotenv-rails = {
877 dependencies = ["dotenv" "railties"];
878 groups = ["default"];
879 platforms = [];
880 source = {
881 remotes = ["https://rubygems.org"];
882 sha256 = "1my2jdmgmpf32rfxffkb9cyxh7ayis4q5ygpwjqj4vpp25y3a70c";
883 type = "gem";
884 };
885 version = "2.7.6";
886 };
887 e2mmap = {
888 groups = ["default"];
889 platforms = [];
890 source = {
891 remotes = ["https://rubygems.org"];
892 sha256 = "0n8gxjb63dck3vrmsdcqqll7xs7f3wk78mw8w0gdk9wp5nx6pvj5";
893 type = "gem";
894 };
895 version = "0.1.0";
896 };
897 erubi = {
898 groups = ["default" "development" "test"];
899 platforms = [];
900 source = {
901 remotes = ["https://rubygems.org"];
902 sha256 = "09l8lz3j00m898li0yfsnb6ihc63rdvhw3k5xczna5zrjk104f2l";
903 type = "gem";
904 };
905 version = "1.10.0";
906 };
907 et-orbi = {
908 dependencies = ["tzinfo"];
909 groups = ["default"];
910 platforms = [];
911 source = {
912 remotes = ["https://rubygems.org"];
913 sha256 = "0xr8i8ql4xzx17d12590i3j299hj6vc0ja2j29dy12i5nlchxrvp";
914 type = "gem";
915 };
916 version = "1.2.4";
917 };
918 excon = {
919 groups = ["default"];
920 platforms = [];
921 source = {
922 remotes = ["https://rubygems.org"];
923 sha256 = "19g5nvkycnkzqq4mqn1zjznq9adrlv2jz0dr9w10cbn42hhqpiz7";
924 type = "gem";
925 };
926 version = "0.81.0";
927 };
928 execjs = {
929 groups = ["default"];
930 platforms = [];
931 source = {
932 remotes = ["https://rubygems.org"];
933 sha256 = "1yz55sf2nd3l666ms6xr18sm2aggcvmb8qr3v53lr4rir32y1yp1";
934 type = "gem";
935 };
936 version = "2.7.0";
937 };
938 factory_bot = {
939 dependencies = ["activesupport"];
940 groups = ["default" "development" "test"];
941 platforms = [];
942 source = {
943 remotes = ["https://rubygems.org"];
944 sha256 = "04vxmjr200akcil9fqxc9ghbb9q0lyrh2q03xxncycd5vln910fi";
945 type = "gem";
946 };
947 version = "6.2.0";
948 };
949 factory_bot_rails = {
950 dependencies = ["factory_bot" "railties"];
951 groups = ["development" "test"];
952 platforms = [];
953 source = {
954 remotes = ["https://rubygems.org"];
955 sha256 = "18fhcihkc074gk62iwqgbdgc3ymim4fm0b4p3ipffy5hcsb9d2r7";
956 type = "gem";
957 };
958 version = "6.2.0";
959 };
960 faraday = {
961 dependencies = ["faraday-excon" "faraday-net_http" "faraday-net_http_persistent" "multipart-post" "ruby2_keywords"];
962 groups = ["default"];
963 platforms = [];
964 source = {
965 remotes = ["https://rubygems.org"];
966 sha256 = "0q646m07lfahakx5jdq77j004rcgfj6lkg13c0f84993gi78dhvi";
967 type = "gem";
968 };
969 version = "1.4.1";
970 };
971 faraday-excon = {
972 groups = ["default"];
973 platforms = [];
974 source = {
975 remotes = ["https://rubygems.org"];
976 sha256 = "0h09wkb0k0bhm6dqsd47ac601qiaah8qdzjh8gvxfd376x1chmdh";
977 type = "gem";
978 };
979 version = "1.1.0";
980 };
981 faraday-net_http = {
982 groups = ["default"];
983 platforms = [];
984 source = {
985 remotes = ["https://rubygems.org"];
986 sha256 = "1fi8sda5hc54v1w3mqfl5yz09nhx35kglyx72w7b8xxvdr0cwi9j";
987 type = "gem";
988 };
989 version = "1.0.1";
990 };
991 faraday-net_http_persistent = {
992 groups = ["default"];
993 platforms = [];
994 source = {
995 remotes = ["https://rubygems.org"];
996 sha256 = "0l2c835wl7gv34xp49fhd1bl4czkpw2g3ahqsak2251iqv5589ka";
997 type = "gem";
998 };
999 version = "1.1.0";
1000 };
1001 ferrum = {
1002 dependencies = ["addressable" "cliver" "concurrent-ruby" "websocket-driver"];
1003 groups = ["default" "development" "test"];
1004 platforms = [];
1005 source = {
1006 remotes = ["https://rubygems.org"];
1007 sha256 = "17c2bryyzpdx3mj6rig4aym3wy24g2212zm0jz2gisbymhv9adbl";
1008 type = "gem";
1009 };
1010 version = "0.11";
1011 };
1012 ffaker = {
1013 groups = ["default"];
1014 platforms = [];
1015 source = {
1016 remotes = ["https://rubygems.org"];
1017 sha256 = "0gif76bq11qz73qm8hv050wf642f9zwawra78bnpnj5kpqhjg3dl";
1018 type = "gem";
1019 };
1020 version = "2.20.0";
1021 };
1022 ffi = {
1023 groups = ["default" "production" "staging"];
1024 platforms = [];
1025 source = {
1026 remotes = ["https://rubygems.org"];
1027 sha256 = "0ssxcywmb3flxsjdg13is6k01807zgzasdhj4j48dm7ac59cmksn";
1028 type = "gem";
1029 };
1030 version = "1.15.4";
1031 };
1032 flipper = {
1033 groups = ["default"];
1034 platforms = [];
1035 source = {
1036 remotes = ["https://rubygems.org"];
1037 sha256 = "1gdnd7j12a560r4pi22v1z2cy0nymwr340922rfj9qkpj7h46371";
1038 type = "gem";
1039 };
1040 version = "0.20.4";
1041 };
1042 flipper-active_record = {
1043 dependencies = ["activerecord" "flipper"];
1044 groups = ["default"];
1045 platforms = [];
1046 source = {
1047 remotes = ["https://rubygems.org"];
1048 sha256 = "042x64rr11ia7n4db2y6vjbfjv2ip0jp2m2mlyb6d9srbxvvkiif";
1049 type = "gem";
1050 };
1051 version = "0.20.4";
1052 };
1053 flipper-ui = {
1054 dependencies = ["erubi" "flipper" "rack" "rack-protection"];
1055 groups = ["default"];
1056 platforms = [];
1057 source = {
1058 remotes = ["https://rubygems.org"];
1059 sha256 = "0sf9giwiwrncvvac48rgc56xgj6s8scs7a9ahr6b2hqbyr1nja9l";
1060 type = "gem";
1061 };
1062 version = "0.20.4";
1063 };
1064 fog-aws = {
1065 dependencies = ["fog-core" "fog-json" "fog-xml" "ipaddress"];
1066 groups = ["default"];
1067 platforms = [];
1068 source = {
1069 remotes = ["https://rubygems.org"];
1070 sha256 = "00skbbgvhqzq6gpgzmw0957n0wf1y3vjgrdyq3sib0ghpyfgmig3";
1071 type = "gem";
1072 };
1073 version = "2.0.1";
1074 };
1075 fog-core = {
1076 dependencies = ["builder" "excon" "formatador"];
1077 groups = ["default"];
1078 platforms = [];
1079 source = {
1080 remotes = ["https://rubygems.org"];
1081 sha256 = "02449kh2x3zj9xxszm02vy8zpbsrykvjrg5gj3kqcy2yizy2bhp3";
1082 type = "gem";
1083 };
1084 version = "1.45.0";
1085 };
1086 fog-json = {
1087 dependencies = ["fog-core" "multi_json"];
1088 groups = ["default"];
1089 platforms = [];
1090 source = {
1091 remotes = ["https://rubygems.org"];
1092 sha256 = "1zj8llzc119zafbmfa4ai3z5s7c4vp9akfs0f9l2piyvcarmlkyx";
1093 type = "gem";
1094 };
1095 version = "1.2.0";
1096 };
1097 fog-xml = {
1098 dependencies = ["fog-core" "nokogiri"];
1099 groups = ["default"];
1100 platforms = [];
1101 source = {
1102 remotes = ["https://rubygems.org"];
1103 sha256 = "043lwdw2wsi6d55ifk0w3izi5l1d1h0alwyr3fixic7b94kc812n";
1104 type = "gem";
1105 };
1106 version = "0.1.3";
1107 };
1108 foreman = {
1109 groups = ["development"];
1110 platforms = [];
1111 source = {
1112 remotes = ["https://rubygems.org"];
1113 sha256 = "0szgxvnzwkzrfbq5dkwa98mig78aqglfy6irdsvq1gq045pbq9r7";
1114 type = "gem";
1115 };
1116 version = "0.87.2";
1117 };
1118 formatador = {
1119 groups = ["default"];
1120 platforms = [];
1121 source = {
1122 remotes = ["https://rubygems.org"];
1123 sha256 = "1gc26phrwlmlqrmz4bagq1wd5b7g64avpx0ghxr9xdxcvmlii0l0";
1124 type = "gem";
1125 };
1126 version = "0.2.5";
1127 };
1128 foundation-icons-sass-rails = {
1129 dependencies = ["railties" "sass-rails"];
1130 groups = ["default"];
1131 platforms = [];
1132 source = {
1133 remotes = ["https://rubygems.org"];
1134 sha256 = "1z3bp0kcz7csid9r6h8z8asywh8mn2fwcm71b4v4qjca13qf4n2w";
1135 type = "gem";
1136 };
1137 version = "3.0.0";
1138 };
1139 foundation-rails = {
1140 dependencies = ["railties" "sass"];
1141 groups = ["default"];
1142 platforms = [];
1143 source = {
1144 remotes = ["https://rubygems.org"];
1145 sha256 = "1dizpi3k3bb2arnf96rxx1qx3x3rwqshbdzb3l8ycj1laddrhwnl";
1146 type = "gem";
1147 };
1148 version = "5.5.2.1";
1149 };
1150 fugit = {
1151 dependencies = ["et-orbi" "raabro"];
1152 groups = ["default"];
1153 platforms = [];
1154 source = {
1155 remotes = ["https://rubygems.org"];
1156 sha256 = "0jhbmc1l94vz25byfbmgi783lrwsh74xvslqzxd0pjf8i9xsxv49";
1157 type = "gem";
1158 };
1159 version = "1.4.5";
1160 };
1161 fuubar = {
1162 dependencies = ["rspec-core" "ruby-progressbar"];
1163 groups = ["development" "test"];
1164 platforms = [];
1165 source = {
1166 remotes = ["https://rubygems.org"];
1167 sha256 = "1028vn7j3kc5qqwswrf3has3qm4j9xva70xmzb3n29i89f0afwmj";
1168 type = "gem";
1169 };
1170 version = "2.5.1";
1171 };
1172 geocoder = {
1173 groups = ["default"];
1174 platforms = [];
1175 source = {
1176 remotes = ["https://rubygems.org"];
1177 sha256 = "0is3xss043nxvckqrbk0r881950q4khigrh41qqqjff44gm24bs3";
1178 type = "gem";
1179 };
1180 version = "1.6.7";
1181 };
1182 globalid = {
1183 dependencies = ["activesupport"];
1184 groups = ["default"];
1185 platforms = [];
1186 source = {
1187 remotes = ["https://rubygems.org"];
1188 sha256 = "0k6ww3shk3mv119xvr9m99l6ql0czq91xhd66hm8hqssb18r2lvm";
1189 type = "gem";
1190 };
1191 version = "0.5.2";
1192 };
1193 gmaps4rails = {
1194 groups = ["default"];
1195 platforms = [];
1196 source = {
1197 remotes = ["https://rubygems.org"];
1198 sha256 = "0avwx3ygmq2krkawyplw76q4bm05v56rwp1vdwfpvsd8bh4vzhq9";
1199 type = "gem";
1200 };
1201 version = "2.1.2";
1202 };
1203 good_migrations = {
1204 dependencies = ["activerecord" "railties"];
1205 groups = ["default"];
1206 platforms = [];
1207 source = {
1208 remotes = ["https://rubygems.org"];
1209 sha256 = "0f613j6gkdkipzhw6r9kngqk3g2zi6hwmscy1sdf5snfjpamhvin";
1210 type = "gem";
1211 };
1212 version = "0.1.0";
1213 };
1214 haml = {
1215 dependencies = ["temple" "tilt"];
1216 groups = ["default"];
1217 platforms = [];
1218 source = {
1219 remotes = ["https://rubygems.org"];
1220 sha256 = "035fgbfr20m08w4603ls2lwqbggr0vy71mijz0p68ib1am394xbf";
1221 type = "gem";
1222 };
1223 version = "5.2.2";
1224 };
1225 hashdiff = {
1226 groups = ["default" "test"];
1227 platforms = [];
1228 source = {
1229 remotes = ["https://rubygems.org"];
1230 sha256 = "1nynpl0xbj0nphqx1qlmyggq58ms1phf5i03hk64wcc0a17x1m1c";
1231 type = "gem";
1232 };
1233 version = "1.0.1";
1234 };
1235 hashery = {
1236 groups = ["default" "test"];
1237 platforms = [];
1238 source = {
1239 remotes = ["https://rubygems.org"];
1240 sha256 = "0qj8815bf7q6q7llm5rzdz279gzmpqmqqicxnzv066a020iwqffj";
1241 type = "gem";
1242 };
1243 version = "2.1.2";
1244 };
1245 highline = {
1246 groups = ["default"];
1247 platforms = [];
1248 source = {
1249 remotes = ["https://rubygems.org"];
1250 sha256 = "0yclf57n2j3cw8144ania99h1zinf8q3f5zrhqa754j6gl95rp9d";
1251 type = "gem";
1252 };
1253 version = "2.0.3";
1254 };
1255 hiredis = {
1256 groups = ["default"];
1257 platforms = [];
1258 source = {
1259 remotes = ["https://rubygems.org"];
1260 sha256 = "04jj8k7lxqxw24sp0jiravigdkgsyrpprxpxm71ba93x1wr2w1bz";
1261 type = "gem";
1262 };
1263 version = "0.6.3";
1264 };
1265 i18n = {
1266 dependencies = ["concurrent-ruby"];
1267 groups = ["default" "development" "test"];
1268 platforms = [];
1269 source = {
1270 remotes = ["https://rubygems.org"];
1271 sha256 = "0g2fnag935zn2ggm5cn6k4s4xvv53v2givj1j90szmvavlpya96a";
1272 type = "gem";
1273 };
1274 version = "1.8.10";
1275 };
1276 i18n-js = {
1277 dependencies = ["i18n"];
1278 groups = ["default"];
1279 platforms = [];
1280 source = {
1281 remotes = ["https://rubygems.org"];
1282 sha256 = "0xiq65q0rhafp3aknj602nbj7i016yjfvw28y83hg8ddqlqvc9x0";
1283 type = "gem";
1284 };
1285 version = "3.9.0";
1286 };
1287 immigrant = {
1288 dependencies = ["activerecord"];
1289 groups = ["default"];
1290 platforms = [];
1291 source = {
1292 remotes = ["https://rubygems.org"];
1293 sha256 = "15jf08h8if3wyq0kdgijcknqzmgfw4rqnyln68mydg1c5bn4s5cw";
1294 type = "gem";
1295 };
1296 version = "0.3.6";
1297 };
1298 ipaddress = {
1299 groups = ["default"];
1300 platforms = [];
1301 source = {
1302 remotes = ["https://rubygems.org"];
1303 sha256 = "1x86s0s11w202j6ka40jbmywkrx8fhq8xiy8mwvnkhllj57hqr45";
1304 type = "gem";
1305 };
1306 version = "0.8.3";
1307 };
1308 jmespath = {
1309 groups = ["default"];
1310 platforms = [];
1311 source = {
1312 remotes = ["https://rubygems.org"];
1313 sha256 = "1d4wac0dcd1jf6kc57891glih9w57552zgqswgy74d1xhgnk0ngf";
1314 type = "gem";
1315 };
1316 version = "1.4.0";
1317 };
1318 jquery-rails = {
1319 dependencies = ["rails-dom-testing" "railties" "thor"];
1320 groups = ["default"];
1321 platforms = [];
1322 source = {
1323 remotes = ["https://rubygems.org"];
1324 sha256 = "0dkhm8lan1vnyl3ll0ks2q06576pdils8a1dr354vfc1y5dqw15i";
1325 type = "gem";
1326 };
1327 version = "4.4.0";
1328 };
1329 jquery-ui-rails = {
1330 dependencies = ["railties"];
1331 groups = ["default"];
1332 platforms = [];
1333 source = {
1334 remotes = ["https://rubygems.org"];
1335 sha256 = "1garrnqwh35acj2pp4sp6fpm2g881h23y644lzbic2qmcrq9wd2v";
1336 type = "gem";
1337 };
1338 version = "4.2.1";
1339 };
1340 json = {
1341 groups = ["default"];
1342 platforms = [];
1343 source = {
1344 remotes = ["https://rubygems.org"];
1345 sha256 = "0lrirj0gw420kw71bjjlqkqhqbrplla61gbv1jzgsz6bv90qr3ci";
1346 type = "gem";
1347 };
1348 version = "2.5.1";
1349 };
1350 json-schema = {
1351 dependencies = ["addressable"];
1352 groups = ["default" "development" "test"];
1353 platforms = [];
1354 source = {
1355 remotes = ["https://rubygems.org"];
1356 sha256 = "1yv5lfmr2nzd14af498xqd5p89f3g080q8wk0klr3vxgypsikkb5";
1357 type = "gem";
1358 };
1359 version = "2.8.1";
1360 };
1361 json_spec = {
1362 dependencies = ["multi_json" "rspec"];
1363 groups = ["development" "test"];
1364 platforms = [];
1365 source = {
1366 remotes = ["https://rubygems.org"];
1367 sha256 = "03yiravv6q8lp37rip2i25w2qd63mwwi4jmw7ymf51y7j9xbjxvs";
1368 type = "gem";
1369 };
1370 version = "1.1.5";
1371 };
1372 jwt = {
1373 groups = ["default"];
1374 platforms = [];
1375 source = {
1376 remotes = ["https://rubygems.org"];
1377 sha256 = "0bg8pjx0mpvl10k6d8a6gc8dzlv2z5jkqcjbjcirnk032iriq838";
1378 type = "gem";
1379 };
1380 version = "2.3.0";
1381 };
1382 knapsack = {
1383 dependencies = ["rake"];
1384 groups = ["development" "test"];
1385 platforms = [];
1386 source = {
1387 remotes = ["https://rubygems.org"];
1388 sha256 = "1f42akjbdkrg1ihwvls9pkkvz8vikaapzgxl82dd128rfn42chm9";
1389 type = "gem";
1390 };
1391 version = "4.0.0";
1392 };
1393 launchy = {
1394 dependencies = ["addressable"];
1395 groups = ["default" "development" "test"];
1396 platforms = [];
1397 source = {
1398 remotes = ["https://rubygems.org"];
1399 sha256 = "1xdyvr5j0gjj7b10kgvh8ylxnwk3wx19my42wqn9h82r4p246hlm";
1400 type = "gem";
1401 };
1402 version = "2.5.0";
1403 };
1404 letter_opener = {
1405 dependencies = ["launchy"];
1406 groups = ["development" "test"];
1407 platforms = [];
1408 source = {
1409 remotes = ["https://rubygems.org"];
1410 sha256 = "09a7kgsmr10a0hrc9bwxglgqvppjxij9w8bxx91mnvh0ivaw0nq9";
1411 type = "gem";
1412 };
1413 version = "1.7.0";
1414 };
1415 libv8-node = {
1416 groups = ["default"];
1417 platforms = [];
1418 source = {
1419 remotes = ["https://rubygems.org"];
1420 sha256 = "1xx217hrkpcm41p41inmy05kb7g8p9w5fwabgjgmpvz0d60j2862";
1421 type = "gem";
1422 };
1423 version = "15.14.0.1";
1424 };
1425 loofah = {
1426 dependencies = ["crass" "nokogiri"];
1427 groups = ["default" "development" "test"];
1428 platforms = [];
1429 source = {
1430 remotes = ["https://rubygems.org"];
1431 sha256 = "1nqcya57x2n58y1dify60i0dpla40n4yir928khp4nj5jrn9mgmw";
1432 type = "gem";
1433 };
1434 version = "2.12.0";
1435 };
1436 mail = {
1437 dependencies = ["mini_mime"];
1438 groups = ["default"];
1439 platforms = [];
1440 source = {
1441 remotes = ["https://rubygems.org"];
1442 sha256 = "00wwz6ys0502dpk8xprwcqfwyf3hmnx6lgxaiq6vj43mkx43sapc";
1443 type = "gem";
1444 };
1445 version = "2.7.1";
1446 };
1447 marcel = {
1448 groups = ["default"];
1449 platforms = [];
1450 source = {
1451 remotes = ["https://rubygems.org"];
1452 sha256 = "0bp001p687nsa4a8sp3q1iv8pfhs24w7s3avychjp64sdkg6jxq3";
1453 type = "gem";
1454 };
1455 version = "1.0.1";
1456 };
1457 method_source = {
1458 groups = ["default" "development" "test"];
1459 platforms = [];
1460 source = {
1461 remotes = ["https://rubygems.org"];
1462 sha256 = "1pnyh44qycnf9mzi1j6fywd5fkskv3x7nmsqrrws0rjn5dd4ayfp";
1463 type = "gem";
1464 };
1465 version = "1.0.0";
1466 };
1467 mime-types = {
1468 dependencies = ["mime-types-data"];
1469 groups = ["default"];
1470 platforms = [];
1471 source = {
1472 remotes = ["https://rubygems.org"];
1473 sha256 = "1zj12l9qk62anvk9bjvandpa6vy4xslil15wl6wlivyf51z773vh";
1474 type = "gem";
1475 };
1476 version = "3.3.1";
1477 };
1478 mime-types-data = {
1479 groups = ["default"];
1480 platforms = [];
1481 source = {
1482 remotes = ["https://rubygems.org"];
1483 sha256 = "1phcq7z0zpipwd7y4fbqmlaqghv07fjjgrx99mwq3z3n0yvy7fmi";
1484 type = "gem";
1485 };
1486 version = "3.2021.0225";
1487 };
1488 mimemagic = {
1489 dependencies = ["nokogiri" "rake"];
1490 groups = ["default"];
1491 platforms = [];
1492 source = {
1493 remotes = ["https://rubygems.org"];
1494 sha256 = "17ycgsmz2229jh224ws77yg974cz326flgc401xrdkfpw90jvb08";
1495 type = "gem";
1496 };
1497 version = "0.4.3";
1498 };
1499 mini_mime = {
1500 groups = ["default" "development" "test"];
1501 platforms = [];
1502 source = {
1503 remotes = ["https://rubygems.org"];
1504 sha256 = "0kb7jq3wjgckmkzna799y5qmvn6vg52878bkgw35qay6lflcrwih";
1505 type = "gem";
1506 };
1507 version = "1.1.0";
1508 };
1509 mini_portile2 = {
1510 groups = ["default" "development" "test"];
1511 platforms = [];
1512 source = {
1513 remotes = ["https://rubygems.org"];
1514 sha256 = "1lvxm91hi0pabnkkg47wh1siv56s6slm2mdq1idfm86dyfidfprq";
1515 type = "gem";
1516 };
1517 version = "2.6.1";
1518 };
1519 mini_racer = {
1520 dependencies = ["libv8-node"];
1521 groups = ["default"];
1522 platforms = [];
1523 source = {
1524 remotes = ["https://rubygems.org"];
1525 sha256 = "0334q46gi3il9izw7k4z32fj06nm8pznqdkr9r51033lnwwy9zy3";
1526 type = "gem";
1527 };
1528 version = "0.4.0";
1529 };
1530 minitest = {
1531 groups = ["default" "development" "test"];
1532 platforms = [];
1533 source = {
1534 remotes = ["https://rubygems.org"];
1535 sha256 = "19z7wkhg59y8abginfrm2wzplz7py3va8fyngiigngqvsws6cwgl";
1536 type = "gem";
1537 };
1538 version = "5.14.4";
1539 };
1540 monetize = {
1541 dependencies = ["money"];
1542 groups = ["default"];
1543 platforms = [];
1544 source = {
1545 remotes = ["https://rubygems.org"];
1546 sha256 = "0cna2myxdbwfq0gn6k2hgrh368dq7wld3jklm96443ysykd0difn";
1547 type = "gem";
1548 };
1549 version = "1.11.0";
1550 };
1551 money = {
1552 dependencies = ["i18n"];
1553 groups = ["default"];
1554 platforms = [];
1555 source = {
1556 remotes = ["https://rubygems.org"];
1557 sha256 = "11fk7i1w3qjb1br7507z748g1rh3mcmnvpm4jach0i4hsc2wrb5k";
1558 type = "gem";
1559 };
1560 version = "6.14.1";
1561 };
1562 msgpack = {
1563 groups = ["default" "production" "staging"];
1564 platforms = [];
1565 source = {
1566 remotes = ["https://rubygems.org"];
1567 sha256 = "06iajjyhx0rvpn4yr3h1hc4w4w3k59bdmfhxnjzzh76wsrdxxrc6";
1568 type = "gem";
1569 };
1570 version = "1.4.2";
1571 };
1572 multi_json = {
1573 groups = ["default" "development" "test"];
1574 platforms = [];
1575 source = {
1576 remotes = ["https://rubygems.org"];
1577 sha256 = "0pb1g1y3dsiahavspyzkdy39j4q377009f6ix0bh1ag4nqw43l0z";
1578 type = "gem";
1579 };
1580 version = "1.15.0";
1581 };
1582 multi_xml = {
1583 groups = ["default"];
1584 platforms = [];
1585 source = {
1586 remotes = ["https://rubygems.org"];
1587 sha256 = "0lmd4f401mvravi1i1yq7b2qjjli0yq7dfc4p1nj5nwajp7r6hyj";
1588 type = "gem";
1589 };
1590 version = "0.6.0";
1591 };
1592 multipart-post = {
1593 groups = ["default"];
1594 platforms = [];
1595 source = {
1596 remotes = ["https://rubygems.org"];
1597 sha256 = "1zgw9zlwh2a6i1yvhhc4a84ry1hv824d6g2iw2chs3k5aylpmpfj";
1598 type = "gem";
1599 };
1600 version = "2.1.1";
1601 };
1602 nio4r = {
1603 groups = ["default"];
1604 platforms = [];
1605 source = {
1606 remotes = ["https://rubygems.org"];
1607 sha256 = "0xk64wghkscs6bv2n22853k2nh39d131c6rfpnlw12mbjnnv9v1v";
1608 type = "gem";
1609 };
1610 version = "2.5.8";
1611 };
1612 nokogiri = {
1613 dependencies = ["mini_portile2" "racc"];
1614 groups = ["default" "development" "test"];
1615 platforms = [];
1616 source = {
1617 remotes = ["https://rubygems.org"];
1618 sha256 = "1v02g7k7cxiwdcahvlxrmizn3avj2q6nsjccgilq1idc89cr081b";
1619 type = "gem";
1620 };
1621 version = "1.12.5";
1622 };
1623 oauth2 = {
1624 dependencies = ["faraday" "jwt" "multi_json" "multi_xml" "rack"];
1625 groups = ["default"];
1626 platforms = [];
1627 source = {
1628 remotes = ["https://rubygems.org"];
1629 sha256 = "1q6q2kgpxmygk8kmxqn54zkw8cs57a34zzz5cxpsh1bj3ag06rk3";
1630 type = "gem";
1631 };
1632 version = "1.4.7";
1633 };
1634 ofn-qz = {
1635 groups = ["default"];
1636 platforms = [];
1637 source = {
1638 fetchSubmodules = false;
1639 rev = "467f6ea1c44529c7c91cac4c8211bbd863588c0b";
1640 sha256 = "1rm2r2gfbc8cbv9gd4619ivv3qvklwpdayvklyd7w5k9c110fm7j";
1641 type = "git";
1642 url = "https://github.com/openfoodfoundation/ofn-qz.git";
1643 };
1644 version = "0.1.0";
1645 };
1646 order_management = {
1647 groups = ["default"];
1648 platforms = [];
1649 source = {
1650 path = engines/order_management;
1651 type = "path";
1652 };
1653 version = "0.0.1";
1654 };
1655 orm_adapter = {
1656 groups = ["default"];
1657 platforms = [];
1658 source = {
1659 remotes = ["https://rubygems.org"];
1660 sha256 = "1fg9jpjlzf5y49qs9mlpdrgs5rpcyihq1s4k79nv9js0spjhnpda";
1661 type = "gem";
1662 };
1663 version = "0.5.0";
1664 };
1665 pagy = {
1666 groups = ["default"];
1667 platforms = [];
1668 source = {
1669 remotes = ["https://rubygems.org"];
1670 sha256 = "010z4lmpj7ld8k6hcpsyd2m0iicycaaabyzscgvnir8cklx1w9cw";
1671 type = "gem";
1672 };
1673 version = "4.11.0";
1674 };
1675 paper_trail = {
1676 dependencies = ["activerecord" "request_store"];
1677 groups = ["default"];
1678 platforms = [];
1679 source = {
1680 remotes = ["https://rubygems.org"];
1681 sha256 = "1hvz0fdzginyyx2x8c755aibdhfvmpjfb9666pdk6ccr9nkb7w1k";
1682 type = "gem";
1683 };
1684 version = "12.1.0";
1685 };
1686 paperclip = {
1687 dependencies = ["activemodel" "activerecord" "activesupport" "cocaine" "mime-types"];
1688 groups = ["default"];
1689 platforms = [];
1690 source = {
1691 remotes = ["https://rubygems.org"];
1692 sha256 = "12acd9ambpsq25x4mi4anmsz9p442zhqkba2f4hgml01njxpn8y9";
1693 type = "gem";
1694 };
1695 version = "3.4.2";
1696 };
1697 parallel = {
1698 groups = ["default" "development"];
1699 platforms = [];
1700 source = {
1701 remotes = ["https://rubygems.org"];
1702 sha256 = "1hkfpm78c2vs1qblnva3k1grijvxh87iixcnyd83s3lxrxsjvag4";
1703 type = "gem";
1704 };
1705 version = "1.21.0";
1706 };
1707 paranoia = {
1708 dependencies = ["activerecord"];
1709 groups = ["default"];
1710 platforms = [];
1711 source = {
1712 remotes = ["https://rubygems.org"];
1713 sha256 = "02plzv9qygzxa3fryz6cgap64jqrzwprjsm7r467g15mhaa4fzxi";
1714 type = "gem";
1715 };
1716 version = "2.4.3";
1717 };
1718 parser = {
1719 dependencies = ["ast"];
1720 groups = ["default" "development"];
1721 platforms = [];
1722 source = {
1723 remotes = ["https://rubygems.org"];
1724 sha256 = "06ma6w87ph8lnc9z4hi40ynmcdnjv0p8x53x0s3fjkz4q2p6sxh5";
1725 type = "gem";
1726 };
1727 version = "3.0.2.0";
1728 };
1729 paypal-sdk-core = {
1730 dependencies = ["multi_json" "xml-simple"];
1731 groups = ["default"];
1732 platforms = [];
1733 source = {
1734 remotes = ["https://rubygems.org"];
1735 sha256 = "0zjqykpxn6snv92wn8a179xyn1vbj327x91dh75lld3myfjz0b0l";
1736 type = "gem";
1737 };
1738 version = "0.3.4";
1739 };
1740 paypal-sdk-merchant = {
1741 dependencies = ["paypal-sdk-core"];
1742 groups = ["default"];
1743 platforms = [];
1744 source = {
1745 remotes = ["https://rubygems.org"];
1746 sha256 = "0v8gqhn7s53xdf5583hcf3ph22n81hniwli3s1jprak7nx5453f7";
1747 type = "gem";
1748 };
1749 version = "1.117.2";
1750 };
1751 pdf-reader = {
1752 dependencies = ["Ascii85" "afm" "hashery" "ruby-rc4" "ttfunk"];
1753 groups = ["test"];
1754 platforms = [];
1755 source = {
1756 remotes = ["https://rubygems.org"];
1757 sha256 = "14cxj3ra9nnn334qpm2vsx9s0zk3095s8ih6cwcp47h3hv03c73y";
1758 type = "gem";
1759 };
1760 version = "2.5.0";
1761 };
1762 pg = {
1763 groups = ["default"];
1764 platforms = [];
1765 source = {
1766 remotes = ["https://rubygems.org"];
1767 sha256 = "13mfrysrdrh8cka1d96zm0lnfs59i5x2g6ps49r2kz5p3q81xrzj";
1768 type = "gem";
1769 };
1770 version = "1.2.3";
1771 };
1772 power_assert = {
1773 groups = ["default"];
1774 platforms = [];
1775 source = {
1776 remotes = ["https://rubygems.org"];
1777 sha256 = "01z44m715rb6nzfrc90c5rkkdiy42dv3q94jw1q8baf9dg33nwi5";
1778 type = "gem";
1779 };
1780 version = "2.0.1";
1781 };
1782 pry = {
1783 dependencies = ["coderay" "method_source"];
1784 groups = ["development"];
1785 platforms = [];
1786 source = {
1787 remotes = ["https://rubygems.org"];
1788 sha256 = "0iyw4q4an2wmk8v5rn2ghfy2jaz9vmw2nk8415nnpx2s866934qk";
1789 type = "gem";
1790 };
1791 version = "0.13.1";
1792 };
1793 pry-byebug = {
1794 dependencies = ["byebug" "pry"];
1795 groups = ["development"];
1796 platforms = [];
1797 source = {
1798 remotes = ["https://rubygems.org"];
1799 sha256 = "096y5vmzpyy4x9h4ky4cs4y7d19vdq9vbwwrqafbh5gagzwhifiv";
1800 type = "gem";
1801 };
1802 version = "3.9.0";
1803 };
1804 public_suffix = {
1805 groups = ["default" "development" "test"];
1806 platforms = [];
1807 source = {
1808 remotes = ["https://rubygems.org"];
1809 sha256 = "1xqcgkl7bwws1qrlnmxgh8g4g9m10vg60bhlw40fplninb3ng6d9";
1810 type = "gem";
1811 };
1812 version = "4.0.6";
1813 };
1814 puma = {
1815 dependencies = ["nio4r"];
1816 groups = ["default"];
1817 platforms = [];
1818 source = {
1819 remotes = ["https://rubygems.org"];
1820 sha256 = "0ahk9a2a05985m0037gqlpha5vdkvmwhyk8v1shkbnwkkm30k0mq";
1821 type = "gem";
1822 };
1823 version = "5.5.0";
1824 };
1825 raabro = {
1826 groups = ["default"];
1827 platforms = [];
1828 source = {
1829 remotes = ["https://rubygems.org"];
1830 sha256 = "10m8bln9d00dwzjil1k42i5r7l82x25ysbi45fwyv4932zsrzynl";
1831 type = "gem";
1832 };
1833 version = "1.4.0";
1834 };
1835 racc = {
1836 groups = ["default" "development" "test"];
1837 platforms = [];
1838 source = {
1839 remotes = ["https://rubygems.org"];
1840 sha256 = "178k7r0xn689spviqzhvazzvxfq6fyjldxb3ywjbgipbfi4s8j1g";
1841 type = "gem";
1842 };
1843 version = "1.5.2";
1844 };
1845 rack = {
1846 groups = ["default" "development" "test"];
1847 platforms = [];
1848 source = {
1849 remotes = ["https://rubygems.org"];
1850 sha256 = "0i5vs0dph9i5jn8dfc6aqd6njcafmb20rwqngrf759c9cvmyff16";
1851 type = "gem";
1852 };
1853 version = "2.2.3";
1854 };
1855 rack-mini-profiler = {
1856 dependencies = ["rack"];
1857 groups = ["development"];
1858 platforms = [];
1859 source = {
1860 remotes = ["https://rubygems.org"];
1861 sha256 = "03hcvjw9nrv0w6yjy2zkv4ivin9xg2wr7xfcvx7rc2msv1gmjb6z";
1862 type = "gem";
1863 };
1864 version = "2.3.3";
1865 };
1866 rack-protection = {
1867 dependencies = ["rack"];
1868 groups = ["default"];
1869 platforms = [];
1870 source = {
1871 remotes = ["https://rubygems.org"];
1872 sha256 = "159a4j4kragqh0z0z8vrpilpmaisnlz3n7kgiyf16bxkwlb3qlhz";
1873 type = "gem";
1874 };
1875 version = "2.1.0";
1876 };
1877 rack-proxy = {
1878 dependencies = ["rack"];
1879 groups = ["default"];
1880 platforms = [];
1881 source = {
1882 remotes = ["https://rubygems.org"];
1883 sha256 = "0jdr2r5phr3q7d6k9cnxjwlkaps0my0n43wq9mzw3xdqhg9wa3d6";
1884 type = "gem";
1885 };
1886 version = "0.7.0";
1887 };
1888 rack-rewrite = {
1889 groups = ["default"];
1890 platforms = [];
1891 source = {
1892 remotes = ["https://rubygems.org"];
1893 sha256 = "0milw71dv96wnc6i48vbzypws51dgf415kkp8c4air0mkdhpj838";
1894 type = "gem";
1895 };
1896 version = "1.5.1";
1897 };
1898 rack-ssl = {
1899 dependencies = ["rack"];
1900 groups = ["default"];
1901 platforms = [];
1902 source = {
1903 remotes = ["https://rubygems.org"];
1904 sha256 = "0c21xqkjyl10fngq6dy8082vmn2png8cwkiyzv83ymixq5cx7ygp";
1905 type = "gem";
1906 };
1907 version = "1.4.1";
1908 };
1909 rack-test = {
1910 dependencies = ["rack"];
1911 groups = ["default" "development" "test"];
1912 platforms = [];
1913 source = {
1914 remotes = ["https://rubygems.org"];
1915 sha256 = "0rh8h376mx71ci5yklnpqqn118z3bl67nnv5k801qaqn1zs62h8m";
1916 type = "gem";
1917 };
1918 version = "1.1.0";
1919 };
1920 rack-timeout = {
1921 groups = ["production" "staging"];
1922 platforms = [];
1923 source = {
1924 remotes = ["https://rubygems.org"];
1925 sha256 = "16ahj3qz3xhfrwvqb4nf6cfzvliigg0idfsp5jyr8qwk676d2f30";
1926 type = "gem";
1927 };
1928 version = "0.6.0";
1929 };
1930 rails = {
1931 dependencies = ["actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties" "sprockets-rails"];
1932 groups = ["default"];
1933 platforms = [];
1934 source = {
1935 remotes = ["https://rubygems.org"];
1936 sha256 = "1y59m2x8rdc581bjgyyr9dabi3vk3frqhhpbb5ldpbj622kxfpbz";
1937 type = "gem";
1938 };
1939 version = "6.1.4.1";
1940 };
1941 rails-controller-testing = {
1942 dependencies = ["actionpack" "actionview" "activesupport"];
1943 groups = ["test"];
1944 platforms = [];
1945 source = {
1946 remotes = ["https://rubygems.org"];
1947 sha256 = "151f303jcvs8s149mhx2g5mn67487x0blrf9dzl76q1nb7dlh53l";
1948 type = "gem";
1949 };
1950 version = "1.0.5";
1951 };
1952 rails-dom-testing = {
1953 dependencies = ["activesupport" "nokogiri"];
1954 groups = ["default" "development" "test"];
1955 platforms = [];
1956 source = {
1957 remotes = ["https://rubygems.org"];
1958 sha256 = "1lfq2a7kp2x64dzzi5p4cjcbiv62vxh9lyqk2f0rqq3fkzrw8h5i";
1959 type = "gem";
1960 };
1961 version = "2.0.3";
1962 };
1963 rails-html-sanitizer = {
1964 dependencies = ["loofah"];
1965 groups = ["default" "development" "test"];
1966 platforms = [];
1967 source = {
1968 remotes = ["https://rubygems.org"];
1969 sha256 = "09qrfi3pgllxb08r024lln9k0qzxs57v0slsj8616xf9c0cwnwbk";
1970 type = "gem";
1971 };
1972 version = "1.4.2";
1973 };
1974 rails-i18n = {
1975 dependencies = ["i18n" "railties"];
1976 groups = ["default"];
1977 platforms = [];
1978 source = {
1979 remotes = ["https://rubygems.org"];
1980 sha256 = "05mcgv748vppnm3fnml37wjy3dw61wj8vfw14ldaj1yx1bmkhb07";
1981 type = "gem";
1982 };
1983 version = "6.0.0";
1984 };
1985 rails_safe_tasks = {
1986 groups = ["default"];
1987 platforms = [];
1988 source = {
1989 remotes = ["https://rubygems.org"];
1990 sha256 = "06bl9cgj8jyc04qdm4jp02ph2vlarapy119lagk6cq1hadzdw7n2";
1991 type = "gem";
1992 };
1993 version = "1.0.0";
1994 };
1995 railties = {
1996 dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor"];
1997 groups = ["default" "development" "test"];
1998 platforms = [];
1999 source = {
2000 remotes = ["https://rubygems.org"];
2001 sha256 = "1kwpm068cqys34p2g0j3l1g0cd5f3kxnsay5v7lmbd0sgarac0vy";
2002 type = "gem";
2003 };
2004 version = "6.1.4.1";
2005 };
2006 rainbow = {
2007 groups = ["default" "development"];
2008 platforms = [];
2009 source = {
2010 remotes = ["https://rubygems.org"];
2011 sha256 = "0bb2fpjspydr6x0s8pn1pqkzmxszvkfapv0p4627mywl7ky4zkhk";
2012 type = "gem";
2013 };
2014 version = "3.0.0";
2015 };
2016 rake = {
2017 groups = ["default" "development" "test"];
2018 platforms = [];
2019 source = {
2020 remotes = ["https://rubygems.org"];
2021 sha256 = "15whn7p9nrkxangbs9hh75q585yfn66lv0v2mhj6q6dl6x8bzr2w";
2022 type = "gem";
2023 };
2024 version = "13.0.6";
2025 };
2026 ransack = {
2027 dependencies = ["activerecord" "activesupport" "i18n"];
2028 groups = ["default"];
2029 platforms = [];
2030 source = {
2031 remotes = ["https://rubygems.org"];
2032 sha256 = "0z25sv93lfiyjjm9fgkmnjkc9kjdlpkd7wairk2vqj7dxklv7yvs";
2033 type = "gem";
2034 };
2035 version = "2.4.2";
2036 };
2037 rb-fsevent = {
2038 groups = ["default"];
2039 platforms = [];
2040 source = {
2041 remotes = ["https://rubygems.org"];
2042 sha256 = "1qsx9c4jr11vr3a9s5j83avczx9qn9rjaf32gxpc2v451hvbc0is";
2043 type = "gem";
2044 };
2045 version = "0.11.0";
2046 };
2047 rb-inotify = {
2048 dependencies = ["ffi"];
2049 groups = ["default"];
2050 platforms = [];
2051 source = {
2052 remotes = ["https://rubygems.org"];
2053 sha256 = "1jm76h8f8hji38z3ggf4bzi8vps6p7sagxn3ab57qc0xyga64005";
2054 type = "gem";
2055 };
2056 version = "0.10.1";
2057 };
2058 redcarpet = {
2059 groups = ["default"];
2060 platforms = [];
2061 source = {
2062 remotes = ["https://rubygems.org"];
2063 sha256 = "0bvk8yyns5s1ls437z719y5sdv9fr8kfs8dmr6g8s761dv5n8zvi";
2064 type = "gem";
2065 };
2066 version = "3.5.1";
2067 };
2068 redis = {
2069 groups = ["default"];
2070 platforms = [];
2071 source = {
2072 remotes = ["https://rubygems.org"];
2073 sha256 = "1ig832dp0xmpp6a934nifzaj7wm9lzjxzasw911fagycs8p6m720";
2074 type = "gem";
2075 };
2076 version = "4.4.0";
2077 };
2078 regexp_parser = {
2079 groups = ["default" "development" "test"];
2080 platforms = [];
2081 source = {
2082 remotes = ["https://rubygems.org"];
2083 sha256 = "0vg7imjnfcqjx7kw94ccj5r78j4g190cqzi1i59sh4a0l940b9cr";
2084 type = "gem";
2085 };
2086 version = "2.1.1";
2087 };
2088 request_store = {
2089 dependencies = ["rack"];
2090 groups = ["default"];
2091 platforms = [];
2092 source = {
2093 remotes = ["https://rubygems.org"];
2094 sha256 = "0cx74kispmnw3ljwb239j65a2j14n8jlsygy372hrsa8mxc71hxi";
2095 type = "gem";
2096 };
2097 version = "1.5.0";
2098 };
2099 responders = {
2100 dependencies = ["actionpack" "railties"];
2101 groups = ["default"];
2102 platforms = [];
2103 source = {
2104 remotes = ["https://rubygems.org"];
2105 sha256 = "14kjykc6rpdh24sshg9savqdajya2dislc1jmbzg91w9967f4gv1";
2106 type = "gem";
2107 };
2108 version = "3.0.1";
2109 };
2110 rexml = {
2111 groups = ["default" "development" "test"];
2112 platforms = [];
2113 source = {
2114 remotes = ["https://rubygems.org"];
2115 sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53";
2116 type = "gem";
2117 };
2118 version = "3.2.5";
2119 };
2120 roadie = {
2121 dependencies = ["css_parser" "nokogiri"];
2122 groups = ["default"];
2123 platforms = [];
2124 source = {
2125 remotes = ["https://rubygems.org"];
2126 sha256 = "01kld3drqfiih5x8c13cvr6dpvdl7jml0v9bcw4fsy322lax3kn0";
2127 type = "gem";
2128 };
2129 version = "4.0.0";
2130 };
2131 roadie-rails = {
2132 dependencies = ["railties" "roadie"];
2133 groups = ["default"];
2134 platforms = [];
2135 source = {
2136 remotes = ["https://rubygems.org"];
2137 sha256 = "0jjcqnp37z65dksykzwjiz149kx65nw70lyx8dkw1fm5x7yraqvh";
2138 type = "gem";
2139 };
2140 version = "2.2.0";
2141 };
2142 roo = {
2143 dependencies = ["nokogiri" "rubyzip"];
2144 groups = ["default"];
2145 platforms = [];
2146 source = {
2147 remotes = ["https://rubygems.org"];
2148 sha256 = "1z2nbf1w48ip2akf1ql86y6569aizi53d6ickjbplkga12n0isf8";
2149 type = "gem";
2150 };
2151 version = "2.8.3";
2152 };
2153 rspec = {
2154 dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks"];
2155 groups = ["default" "development" "test"];
2156 platforms = [];
2157 source = {
2158 remotes = ["https://rubygems.org"];
2159 sha256 = "1dwai7jnwmdmd7ajbi2q0k0lx1dh88knv5wl7c34wjmf94yv8w5q";
2160 type = "gem";
2161 };
2162 version = "3.10.0";
2163 };
2164 rspec-core = {
2165 dependencies = ["rspec-support"];
2166 groups = ["default" "development" "test"];
2167 platforms = [];
2168 source = {
2169 remotes = ["https://rubygems.org"];
2170 sha256 = "0wwnfhxxvrlxlk1a3yxlb82k2f9lm0yn0598x7lk8fksaz4vv6mc";
2171 type = "gem";
2172 };
2173 version = "3.10.1";
2174 };
2175 rspec-expectations = {
2176 dependencies = ["diff-lcs" "rspec-support"];
2177 groups = ["default" "development" "test"];
2178 platforms = [];
2179 source = {
2180 remotes = ["https://rubygems.org"];
2181 sha256 = "1sz9bj4ri28adsklnh257pnbq4r5ayziw02qf67wry0kvzazbb17";
2182 type = "gem";
2183 };
2184 version = "3.10.1";
2185 };
2186 rspec-mocks = {
2187 dependencies = ["diff-lcs" "rspec-support"];
2188 groups = ["default" "development" "test"];
2189 platforms = [];
2190 source = {
2191 remotes = ["https://rubygems.org"];
2192 sha256 = "1d13g6kipqqc9lmwz5b244pdwc97z15vcbnbq6n9rlf32bipdz4k";
2193 type = "gem";
2194 };
2195 version = "3.10.2";
2196 };
2197 rspec-rails = {
2198 dependencies = ["actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support"];
2199 groups = ["development" "test"];
2200 platforms = [];
2201 source = {
2202 remotes = ["https://rubygems.org"];
2203 sha256 = "152yz205p8zi5nxxhs8z581rjdvvqsfjndklkvn11f2vi50nv7n9";
2204 type = "gem";
2205 };
2206 version = "5.0.2";
2207 };
2208 rspec-retry = {
2209 dependencies = ["rspec-core"];
2210 groups = ["development" "test"];
2211 platforms = [];
2212 source = {
2213 remotes = ["https://rubygems.org"];
2214 sha256 = "0n6qc0d16h6bgh1xarmc8vc58728mgjcsjj8wcd822c8lcivl0b1";
2215 type = "gem";
2216 };
2217 version = "0.6.2";
2218 };
2219 rspec-support = {
2220 groups = ["default" "development" "test"];
2221 platforms = [];
2222 source = {
2223 remotes = ["https://rubygems.org"];
2224 sha256 = "15j52parvb8cgvl6s0pbxi2ywxrv6x0764g222kz5flz0s4mycbl";
2225 type = "gem";
2226 };
2227 version = "3.10.2";
2228 };
2229 rswag = {
2230 dependencies = ["rswag-api" "rswag-specs" "rswag-ui"];
2231 groups = ["development" "test"];
2232 platforms = [];
2233 source = {
2234 remotes = ["https://rubygems.org"];
2235 sha256 = "1w7dc4ipxaf6dagj6zbn4j7r384gh4zhdb2i7dvpqahrszf6cc7r";
2236 type = "gem";
2237 };
2238 version = "2.4.0";
2239 };
2240 rswag-api = {
2241 dependencies = ["railties"];
2242 groups = ["default" "development" "test"];
2243 platforms = [];
2244 source = {
2245 remotes = ["https://rubygems.org"];
2246 sha256 = "1s8wc2m4xngbdm5ms2xskpykzbmr9cvapxpjv4k6yirv71lqdxqc";
2247 type = "gem";
2248 };
2249 version = "2.4.0";
2250 };
2251 rswag-specs = {
2252 dependencies = ["activesupport" "json-schema" "railties"];
2253 groups = ["default" "development" "test"];
2254 platforms = [];
2255 source = {
2256 remotes = ["https://rubygems.org"];
2257 sha256 = "1dma3j5vfjhyclg8y0gsp44vs4wn9chf4jgfhc9r6ws018xrbxzd";
2258 type = "gem";
2259 };
2260 version = "2.4.0";
2261 };
2262 rswag-ui = {
2263 dependencies = ["actionpack" "railties"];
2264 groups = ["default" "development" "test"];
2265 platforms = [];
2266 source = {
2267 remotes = ["https://rubygems.org"];
2268 sha256 = "08f7g0cmz5gyzsszaqwmy4mrj2xh6krnd03jw9yi80gqayda4rkr";
2269 type = "gem";
2270 };
2271 version = "2.4.0";
2272 };
2273 rubocop = {
2274 dependencies = ["parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"];
2275 groups = ["development"];
2276 platforms = [];
2277 source = {
2278 remotes = ["https://rubygems.org"];
2279 sha256 = "19jg2mm4xj044j06asqv7v0bmq1axikl9pskf35riz54rskv8wci";
2280 type = "gem";
2281 };
2282 version = "1.22.1";
2283 };
2284 rubocop-ast = {
2285 dependencies = ["parser"];
2286 groups = ["default" "development"];
2287 platforms = [];
2288 source = {
2289 remotes = ["https://rubygems.org"];
2290 sha256 = "0x0xfq2mpg194rcanbjrgvjbh94s9kq72jynxx61789s628kxy59";
2291 type = "gem";
2292 };
2293 version = "1.12.0";
2294 };
2295 rubocop-rails = {
2296 dependencies = ["activesupport" "rack" "rubocop"];
2297 groups = ["development"];
2298 platforms = [];
2299 source = {
2300 remotes = ["https://rubygems.org"];
2301 sha256 = "1mq3x7jpmp49wwa2r880dcmn27arqc9ln8v2y0dv3ha7s5g8mzrn";
2302 type = "gem";
2303 };
2304 version = "2.12.3";
2305 };
2306 ruby-progressbar = {
2307 groups = ["default" "development" "test"];
2308 platforms = [];
2309 source = {
2310 remotes = ["https://rubygems.org"];
2311 sha256 = "02nmaw7yx9kl7rbaan5pl8x5nn0y4j5954mzrkzi9i3dhsrps4nc";
2312 type = "gem";
2313 };
2314 version = "1.11.0";
2315 };
2316 ruby-rc4 = {
2317 groups = ["default" "test"];
2318 platforms = [];
2319 source = {
2320 remotes = ["https://rubygems.org"];
2321 sha256 = "00vci475258mmbvsdqkmqadlwn6gj9m01sp7b5a3zd90knil1k00";
2322 type = "gem";
2323 };
2324 version = "0.1.5";
2325 };
2326 ruby2_keywords = {
2327 groups = ["default"];
2328 platforms = [];
2329 source = {
2330 remotes = ["https://rubygems.org"];
2331 sha256 = "15wfcqxyfgka05v2a7kpg64x57gl1y4xzvnc9lh60bqx5sf1iqrs";
2332 type = "gem";
2333 };
2334 version = "0.0.4";
2335 };
2336 rubyzip = {
2337 groups = ["default" "development" "test"];
2338 platforms = [];
2339 source = {
2340 remotes = ["https://rubygems.org"];
2341 sha256 = "0grps9197qyxakbpw02pda59v45lfgbgiyw48i0mq9f2bn9y6mrz";
2342 type = "gem";
2343 };
2344 version = "2.3.2";
2345 };
2346 rufus-scheduler = {
2347 dependencies = ["fugit"];
2348 groups = ["default"];
2349 platforms = [];
2350 source = {
2351 remotes = ["https://rubygems.org"];
2352 sha256 = "1x1cr9hd3phshgrrh796ql37339j5i6w7i7skxjkyygigdzl5kjy";
2353 type = "gem";
2354 };
2355 version = "3.7.0";
2356 };
2357 sass = {
2358 groups = ["default"];
2359 platforms = [];
2360 source = {
2361 remotes = ["https://rubygems.org"];
2362 sha256 = "0kfpcwh8dgw4lc81qglkvjl73689jy3g7196zkxm4fpskg1p5lkw";
2363 type = "gem";
2364 };
2365 version = "3.4.25";
2366 };
2367 sass-rails = {
2368 dependencies = ["railties" "sass" "sprockets" "sprockets-rails" "tilt"];
2369 groups = ["default"];
2370 platforms = [];
2371 source = {
2372 remotes = ["https://rubygems.org"];
2373 sha256 = "19bcs1ya3bkx36qaz21kgiz28s9h678m3rszcw7aany2lsis56y7";
2374 type = "gem";
2375 };
2376 version = "5.0.8";
2377 };
2378 sd_notify = {
2379 groups = ["production" "staging"];
2380 platforms = [];
2381 source = {
2382 remotes = ["https://rubygems.org"];
2383 sha256 = "0c9imnjbakx25r2n7widfp00s19ndzmmwax761mx5vbwm9nariyb";
2384 type = "gem";
2385 };
2386 version = "0.1.1";
2387 };
2388 select2-rails = {
2389 dependencies = ["sass-rails" "thor"];
2390 groups = ["default"];
2391 platforms = [];
2392 source = {
2393 fetchSubmodules = false;
2394 rev = "fc240e85fbdf1878ff3c39d972c0cd9a312f5ed4";
2395 sha256 = "0lflvygxgmm4yqhnx66h77g742g01x7jajjjn33a4hm0n7lgdq5y";
2396 type = "git";
2397 url = "https://github.com/openfoodfoundation/select2-rails.git";
2398 };
2399 version = "3.4.9";
2400 };
2401 selenium-webdriver = {
2402 dependencies = ["childprocess" "rubyzip"];
2403 groups = ["development" "test"];
2404 platforms = [];
2405 source = {
2406 remotes = ["https://rubygems.org"];
2407 sha256 = "0adcvp86dinaqq3nhf8p3m0rl2g6q0a4h52k0i7kdnsg1qz9k86y";
2408 type = "gem";
2409 };
2410 version = "3.142.7";
2411 };
2412 semantic_range = {
2413 groups = ["default"];
2414 platforms = [];
2415 source = {
2416 remotes = ["https://rubygems.org"];
2417 sha256 = "1dlp97vg95plrsaaqj7x8l7z9vsjbhnqk4rw1l30gy26lmxpfrih";
2418 type = "gem";
2419 };
2420 version = "3.0.0";
2421 };
2422 shoulda-matchers = {
2423 dependencies = ["activesupport"];
2424 groups = ["development" "test"];
2425 platforms = [];
2426 source = {
2427 remotes = ["https://rubygems.org"];
2428 sha256 = "0z6v2acldnvqrnvfk70f9xq39ppw5j03kbz2hpz7s17lgnn21vx8";
2429 type = "gem";
2430 };
2431 version = "5.0.0";
2432 };
2433 sidekiq = {
2434 dependencies = ["connection_pool" "rack" "redis"];
2435 groups = ["default"];
2436 platforms = [];
2437 source = {
2438 remotes = ["https://rubygems.org"];
2439 sha256 = "104a97cl94aclg71ngrr097zjbdf6cibnz4q3rqjb88izmd7cfk6";
2440 type = "gem";
2441 };
2442 version = "6.2.2";
2443 };
2444 sidekiq-scheduler = {
2445 dependencies = ["e2mmap" "redis" "rufus-scheduler" "sidekiq" "thwait" "tilt"];
2446 groups = ["default"];
2447 platforms = [];
2448 source = {
2449 remotes = ["https://rubygems.org"];
2450 sha256 = "0k686psrg8rd902yyqi38vys11zb07192skzx8zyyvyz2l9vrzds";
2451 type = "gem";
2452 };
2453 version = "3.1.0";
2454 };
2455 simplecov = {
2456 dependencies = ["docile" "simplecov-html" "simplecov_json_formatter"];
2457 groups = ["test"];
2458 platforms = [];
2459 source = {
2460 remotes = ["https://rubygems.org"];
2461 sha256 = "1hrv046jll6ad1s964gsmcq4hvkr3zzr6jc7z1mns22mvfpbc3cr";
2462 type = "gem";
2463 };
2464 version = "0.21.2";
2465 };
2466 simplecov-html = {
2467 groups = ["default" "test"];
2468 platforms = [];
2469 source = {
2470 remotes = ["https://rubygems.org"];
2471 sha256 = "0yx01bxa8pbf9ip4hagqkp5m0mqfnwnw2xk8kjraiywz4lrss6jb";
2472 type = "gem";
2473 };
2474 version = "0.12.3";
2475 };
2476 simplecov_json_formatter = {
2477 groups = ["default" "test"];
2478 platforms = [];
2479 source = {
2480 remotes = ["https://rubygems.org"];
2481 sha256 = "19r15hyvh52jx7fmsrcflb58xh8l7l0zx4sxkh3hqzhq68y81pjl";
2482 type = "gem";
2483 };
2484 version = "0.1.3";
2485 };
2486 spring = {
2487 groups = ["development"];
2488 platforms = [];
2489 source = {
2490 remotes = ["https://rubygems.org"];
2491 sha256 = "12kyz3jdnaarhf2jbykmd9mqg085gxsx00c16la5q7czxvpb2x2r";
2492 type = "gem";
2493 };
2494 version = "3.0.0";
2495 };
2496 spring-commands-rspec = {
2497 dependencies = ["spring"];
2498 groups = ["development"];
2499 platforms = [];
2500 source = {
2501 remotes = ["https://rubygems.org"];
2502 sha256 = "0b0svpq3md1pjz5drpa5pxwg8nk48wrshq8lckim4x3nli7ya0k2";
2503 type = "gem";
2504 };
2505 version = "1.0.4";
2506 };
2507 sprockets = {
2508 dependencies = ["concurrent-ruby" "rack"];
2509 groups = ["default"];
2510 platforms = [];
2511 source = {
2512 remotes = ["https://rubygems.org"];
2513 sha256 = "182jw5a0fbqah5w9jancvfmjbk88h8bxdbwnl4d3q809rpxdg8ay";
2514 type = "gem";
2515 };
2516 version = "3.7.2";
2517 };
2518 sprockets-rails = {
2519 dependencies = ["actionpack" "activesupport" "sprockets"];
2520 groups = ["default"];
2521 platforms = [];
2522 source = {
2523 remotes = ["https://rubygems.org"];
2524 sha256 = "0mwmz36265646xqfyczgr1mhkm1hfxgxxvgdgr4xfcbf2g72p1k2";
2525 type = "gem";
2526 };
2527 version = "3.2.2";
2528 };
2529 state_machines = {
2530 groups = ["default"];
2531 platforms = [];
2532 source = {
2533 remotes = ["https://rubygems.org"];
2534 sha256 = "00mi16hg3rhkxz4y58s173cbnjlba41y9bfcim90p4ja6yfj9ri3";
2535 type = "gem";
2536 };
2537 version = "0.5.0";
2538 };
2539 state_machines-activemodel = {
2540 dependencies = ["activemodel" "state_machines"];
2541 groups = ["default"];
2542 platforms = [];
2543 source = {
2544 remotes = ["https://rubygems.org"];
2545 sha256 = "0b4dffzlj38adin6gm0ky72r5c507qdb1jprnm7h9gnlj2qxlcp9";
2546 type = "gem";
2547 };
2548 version = "0.8.0";
2549 };
2550 state_machines-activerecord = {
2551 dependencies = ["activerecord" "state_machines-activemodel"];
2552 groups = ["default"];
2553 platforms = [];
2554 source = {
2555 remotes = ["https://rubygems.org"];
2556 sha256 = "1dmaf4f4cg3gamzgga3gamp0kv9lvianqzr9103dw0xbp00vfbq7";
2557 type = "gem";
2558 };
2559 version = "0.8.0";
2560 };
2561 stringex = {
2562 groups = ["default"];
2563 platforms = [];
2564 source = {
2565 remotes = ["https://rubygems.org"];
2566 sha256 = "15ns7j5smw04w6w7bqd5mm2qcl7w9lhwykyb974i4isgg9yc23ys";
2567 type = "gem";
2568 };
2569 version = "2.8.5";
2570 };
2571 stripe = {
2572 groups = ["default"];
2573 platforms = [];
2574 source = {
2575 remotes = ["https://rubygems.org"];
2576 sha256 = "0b2savy5h9shdzr6fkfqyrpmpx1a82gn4j47895zwc279dhwnlrh";
2577 type = "gem";
2578 };
2579 version = "5.38.0";
2580 };
2581 temple = {
2582 groups = ["default"];
2583 platforms = [];
2584 source = {
2585 remotes = ["https://rubygems.org"];
2586 sha256 = "060zzj7c2kicdfk6cpnn40n9yjnhfrr13d0rsbdhdij68chp2861";
2587 type = "gem";
2588 };
2589 version = "0.8.2";
2590 };
2591 test-prof = {
2592 groups = ["test"];
2593 platforms = [];
2594 source = {
2595 remotes = ["https://rubygems.org"];
2596 sha256 = "1vg0zjfgibdcgkzb4c25v0f4v6v8mvpzvgcag194rwglmkkyrwkx";
2597 type = "gem";
2598 };
2599 version = "1.0.7";
2600 };
2601 test-unit = {
2602 dependencies = ["power_assert"];
2603 groups = ["default"];
2604 platforms = [];
2605 source = {
2606 remotes = ["https://rubygems.org"];
2607 sha256 = "03pn837vgza8v550ggzhcxbvb80d6qivqnhv3n39lrfnsc8xgi7m";
2608 type = "gem";
2609 };
2610 version = "3.4.7";
2611 };
2612 thor = {
2613 groups = ["default" "development" "test"];
2614 platforms = [];
2615 source = {
2616 remotes = ["https://rubygems.org"];
2617 sha256 = "18yhlvmfya23cs3pvhr1qy38y41b6mhr5q9vwv5lrgk16wmf3jna";
2618 type = "gem";
2619 };
2620 version = "1.1.0";
2621 };
2622 thread-local = {
2623 groups = ["default"];
2624 platforms = [];
2625 source = {
2626 remotes = ["https://rubygems.org"];
2627 sha256 = "1ryjgfwcsbkxph1l24x87p1yabnnbqy958s57w37iwhf3z9nid9g";
2628 type = "gem";
2629 };
2630 version = "1.1.0";
2631 };
2632 thwait = {
2633 dependencies = ["e2mmap"];
2634 groups = ["default"];
2635 platforms = [];
2636 source = {
2637 remotes = ["https://rubygems.org"];
2638 sha256 = "0q0fqlh0668j66z0g3s5yhqs39368az2ycxyphsx4c5nib5r4kak";
2639 type = "gem";
2640 };
2641 version = "0.2.0";
2642 };
2643 tilt = {
2644 groups = ["default"];
2645 platforms = [];
2646 source = {
2647 remotes = ["https://rubygems.org"];
2648 sha256 = "0rn8z8hda4h41a64l0zhkiwz2vxw9b1nb70gl37h1dg2k874yrlv";
2649 type = "gem";
2650 };
2651 version = "2.0.10";
2652 };
2653 timecop = {
2654 groups = ["development" "test"];
2655 platforms = [];
2656 source = {
2657 remotes = ["https://rubygems.org"];
2658 sha256 = "1fw3nzycvd15qa7sxy9dxb4hqyizy1s8f7q3d50smbzyyvr8fvia";
2659 type = "gem";
2660 };
2661 version = "0.9.4";
2662 };
2663 ttfunk = {
2664 groups = ["default" "test"];
2665 platforms = [];
2666 source = {
2667 remotes = ["https://rubygems.org"];
2668 sha256 = "15iaxz9iak5643bq2bc0jkbjv8w2zn649lxgvh5wg48q9d4blw13";
2669 type = "gem";
2670 };
2671 version = "1.7.0";
2672 };
2673 tzinfo = {
2674 dependencies = ["concurrent-ruby"];
2675 groups = ["default" "development" "test"];
2676 platforms = [];
2677 source = {
2678 remotes = ["https://rubygems.org"];
2679 sha256 = "10qp5x7f9hvlc0psv9gsfbxg4a7s0485wsbq1kljkxq94in91l4z";
2680 type = "gem";
2681 };
2682 version = "2.0.4";
2683 };
2684 uglifier = {
2685 dependencies = ["execjs"];
2686 groups = ["default"];
2687 platforms = [];
2688 source = {
2689 remotes = ["https://rubygems.org"];
2690 sha256 = "0wgh7bzy68vhv9v68061519dd8samcy8sazzz0w3k8kqpy3g4s5f";
2691 type = "gem";
2692 };
2693 version = "4.2.0";
2694 };
2695 unicode-display_width = {
2696 groups = ["default" "development"];
2697 platforms = [];
2698 source = {
2699 remotes = ["https://rubygems.org"];
2700 sha256 = "0csjm9shhfik0ci9mgimb7hf3xgh7nx45rkd9rzgdz6vkwr8rzxn";
2701 type = "gem";
2702 };
2703 version = "2.1.0";
2704 };
2705 uniform_notifier = {
2706 groups = ["default" "development" "test"];
2707 platforms = [];
2708 source = {
2709 remotes = ["https://rubygems.org"];
2710 sha256 = "1614dqnky0f9f1znj0lih8i184vfps86md93dw0kxrg3af9gnqb4";
2711 type = "gem";
2712 };
2713 version = "1.14.2";
2714 };
2715 valid_email2 = {
2716 dependencies = ["activemodel" "mail"];
2717 groups = ["default"];
2718 platforms = [];
2719 source = {
2720 remotes = ["https://rubygems.org"];
2721 sha256 = "0l4xkwvx7aj5z18h6vzp0wsfjbcrl76ixp0x95wwlrhn03qab6hs";
2722 type = "gem";
2723 };
2724 version = "4.0.0";
2725 };
2726 view_component = {
2727 dependencies = ["activesupport" "method_source"];
2728 groups = ["default" "development"];
2729 platforms = [];
2730 source = {
2731 remotes = ["https://rubygems.org"];
2732 sha256 = "0qygf9dfn42q8y3i2g04zqqmw1bjklmsxgdcpfk07nbnpjh391i9";
2733 type = "gem";
2734 };
2735 version = "2.40.0";
2736 };
2737 view_component_storybook = {
2738 dependencies = ["view_component"];
2739 groups = ["development"];
2740 platforms = [];
2741 source = {
2742 remotes = ["https://rubygems.org"];
2743 sha256 = "0yslfpcw58mqqaig83b2h98mf04i19ck37m270d8naxr69iv9h0n";
2744 type = "gem";
2745 };
2746 version = "0.10.1";
2747 };
2748 warden = {
2749 dependencies = ["rack"];
2750 groups = ["default"];
2751 platforms = [];
2752 source = {
2753 remotes = ["https://rubygems.org"];
2754 sha256 = "1l7gl7vms023w4clg02pm4ky9j12la2vzsixi2xrv9imbn44ys26";
2755 type = "gem";
2756 };
2757 version = "1.2.9";
2758 };
2759 web = {
2760 groups = ["default"];
2761 platforms = [];
2762 source = {
2763 path = engines/web;
2764 type = "path";
2765 };
2766 version = "0.0.1";
2767 };
2768 web-console = {
2769 dependencies = ["actionview" "activemodel" "bindex" "railties"];
2770 groups = ["development"];
2771 platforms = [];
2772 source = {
2773 remotes = ["https://rubygems.org"];
2774 sha256 = "0d9hk929cmisix2l1w9kkh05b57ih9yvnh4wv52axxw41scnv2d9";
2775 type = "gem";
2776 };
2777 version = "4.1.0";
2778 };
2779 webdrivers = {
2780 dependencies = ["nokogiri" "rubyzip" "selenium-webdriver"];
2781 groups = ["development" "test"];
2782 platforms = [];
2783 source = {
2784 remotes = ["https://rubygems.org"];
2785 sha256 = "1naymcfmm9pkf0f67xd99d9f6dpv477ggyvc1c04gxifirynfydp";
2786 type = "gem";
2787 };
2788 version = "4.6.1";
2789 };
2790 webmock = {
2791 dependencies = ["addressable" "crack" "hashdiff"];
2792 groups = ["test"];
2793 platforms = [];
2794 source = {
2795 remotes = ["https://rubygems.org"];
2796 sha256 = "1l8vh8p0g92cqcvv0ra3mblsa4nczh0rz8nbwbkc3g3yzbva85xk";
2797 type = "gem";
2798 };
2799 version = "3.14.0";
2800 };
2801 webpacker = {
2802 dependencies = ["activesupport" "rack-proxy" "railties" "semantic_range"];
2803 groups = ["default"];
2804 platforms = [];
2805 source = {
2806 remotes = ["https://rubygems.org"];
2807 sha256 = "1cq6m5qwm3bmi7hkjfmbg2cs4qjq4wswlrwcfk8l1svfqbi135v3";
2808 type = "gem";
2809 };
2810 version = "5.4.3";
2811 };
2812 websocket-driver = {
2813 dependencies = ["websocket-extensions"];
2814 groups = ["default" "development" "test"];
2815 platforms = [];
2816 source = {
2817 remotes = ["https://rubygems.org"];
2818 sha256 = "0a3bwxd9v3ghrxzjc4vxmf4xa18c6m4xqy5wb0yk5c6b9psc7052";
2819 type = "gem";
2820 };
2821 version = "0.7.5";
2822 };
2823 websocket-extensions = {
2824 groups = ["default" "development" "test"];
2825 platforms = [];
2826 source = {
2827 remotes = ["https://rubygems.org"];
2828 sha256 = "0hc2g9qps8lmhibl5baa91b4qx8wqw872rgwagml78ydj8qacsqw";
2829 type = "gem";
2830 };
2831 version = "0.1.5";
2832 };
2833 whenever = {
2834 dependencies = ["chronic"];
2835 groups = ["default"];
2836 platforms = [];
2837 source = {
2838 remotes = ["https://rubygems.org"];
2839 sha256 = "0im2x9rgr752hb9f1nnfj486k96bfiqj0xsv2bmzaq1rqhbi9dyr";
2840 type = "gem";
2841 };
2842 version = "1.0.0";
2843 };
2844 wicked_pdf = {
2845 dependencies = ["activesupport"];
2846 groups = ["default"];
2847 platforms = [];
2848 source = {
2849 remotes = ["https://rubygems.org"];
2850 sha256 = "0i7ifpb5ynvg7m6i1bivmvnaz29vjfwf6f4qj9gs7nq4yyxflqr6";
2851 type = "gem";
2852 };
2853 version = "2.1.0";
2854 };
2855 wkhtmltopdf-binary = {
2856 groups = ["default"];
2857 platforms = [];
2858 source = {
2859 remotes = ["https://rubygems.org"];
2860 sha256 = "1ksmryizimmw60k5siciv3xfxx9q797bh5a1rga7hqban98rv0c2";
2861 type = "gem";
2862 };
2863 version = "0.12.6.5";
2864 };
2865 xml-simple = {
2866 groups = ["default"];
2867 platforms = [];
2868 source = {
2869 remotes = ["https://rubygems.org"];
2870 sha256 = "1flpmghcbil6qbl3f6w67kpjrnjbw86x7h6g5n4m5ff0cg4sylrv";
2871 type = "gem";
2872 };
2873 version = "1.1.8";
2874 };
2875 xpath = {
2876 dependencies = ["nokogiri"];
2877 groups = ["default" "development" "test"];
2878 platforms = [];
2879 source = {
2880 remotes = ["https://rubygems.org"];
2881 sha256 = "0bh8lk9hvlpn7vmi6h4hkcwjzvs2y0cmkk3yjjdr8fxvj6fsgzbd";
2882 type = "gem";
2883 };
2884 version = "3.2.0";
2885 };
2886 zeitwerk = {
2887 groups = ["default" "development" "test"];
2888 platforms = [];
2889 source = {
2890 remotes = ["https://rubygems.org"];
2891 sha256 = "1746czsjarixq0x05f7p3hpzi38ldg6wxnxxw74kbjzh1sdjgmpl";
2892 type = "gem";
2893 };
2894 version = "2.4.2";
2895 };
2896} \ No newline at end of file
diff --git a/flakes/paste/flake.nix b/flakes/paste/flake.nix
index 08d0681..97e31c8 100644
--- a/flakes/paste/flake.nix
+++ b/flakes/paste/flake.nix
@@ -45,6 +45,8 @@
45 let 45 let
46 cfg = config.services.paste; 46 cfg = config.services.paste;
47 in { 47 in {
48 # Necessary for situations where flake gets included multiple times
49 key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
48 options = { 50 options = {
49 services.paste = { 51 services.paste = {
50 enable = lib.mkOption { 52 enable = lib.mkOption {
diff --git a/flakes/paste/paste/paste.py b/flakes/paste/paste/paste.py
index 86666b8..3172de5 100644
--- a/flakes/paste/paste/paste.py
+++ b/flakes/paste/paste/paste.py
@@ -10,9 +10,32 @@ import mimetypes
10 10
11magic = magic.Magic(mime=True) 11magic = magic.Magic(mime=True)
12 12
13mit_license = """
14Copyright (c) 2022 Immae
15
16Permission is hereby granted, free of charge, to any person obtaining a copy
17of this software and associated documentation files (the "Software"), to deal
18in the Software without restriction, including without limitation the rights
19to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20copies of the Software, and to permit persons to whom the Software is
21furnished to do so, subject to the following conditions:
22
23The above copyright notice and this permission notice shall be included in all
24copies or substantial portions of the Software.
25
26THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32SOFTWARE.
33"""
34
13config = { 35config = {
14 "directory": os.environ["PASTE_DIRECTORY"], 36 "directory": os.environ["PASTE_DIRECTORY"],
15 "self_paste_id": "abcd123", 37 "self_paste_id": "abcd123",
38 "license_paste_id": "license",
16 "max_content_length": 16 * 1000 * 1000 39 "max_content_length": 16 * 1000 * 1000
17 } 40 }
18 41
@@ -33,6 +56,8 @@ def read_paste(paste_id):
33 if mime.startswith("text/x-script."): 56 if mime.startswith("text/x-script."):
34 mime="text/plain" 57 mime="text/plain"
35 return (content, mime) 58 return (content, mime)
59 elif paste_id == config["license_paste_id"]:
60 return (mit_license, "text/plain")
36 else: 61 else:
37 abort(404) 62 abort(404)
38 63
@@ -69,9 +94,11 @@ $ curl -X POST --data-binary @{self} {host}
69-> GET {paste}/download 94-> GET {paste}/download
70 force download of file 95 force download of file
71</pre> 96</pre>
72<a href="{paste}/py">Get the source</a> 97<a href="{paste}/py">Get the source</a><br />
98Software licensed under the terms of the <a href="{host}/license">MIT license</a>
73'''.format(host=url_for('post_paste', _external=True, _scheme="https"), 99'''.format(host=url_for('post_paste', _external=True, _scheme="https"),
74 paste=url_for('get_paste', _external=True, _scheme="https", paste_id=config["self_paste_id"]), 100 paste=url_for('get_paste', _external=True, _scheme="https", paste_id=config["self_paste_id"]),
101 license=url_for('get_paste', _external=True, _scheme="https", paste_id=config["license_paste_id"]),
75 self=os.path.basename(__file__) 102 self=os.path.basename(__file__)
76 ), mimetype="text/html") 103 ), mimetype="text/html")
77 104
diff --git a/flakes/peertube/flake.lock b/flakes/peertube/flake.lock
index 6187115..eeb516a 100644
--- a/flakes/peertube/flake.lock
+++ b/flakes/peertube/flake.lock
@@ -17,19 +17,14 @@
17 }, 17 },
18 "myuids": { 18 "myuids": {
19 "locked": { 19 "locked": {
20 "dir": "flakes/myuids", 20 "lastModified": 1,
21 "lastModified": 1628207001, 21 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
22 "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", 22 "path": "../myuids",
23 "ref": "master", 23 "type": "path"
24 "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3",
25 "revCount": 865,
26 "type": "git",
27 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
28 }, 24 },
29 "original": { 25 "original": {
30 "dir": "flakes/myuids", 26 "path": "../myuids",
31 "type": "git", 27 "type": "path"
32 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
33 } 28 }
34 }, 29 },
35 "nixpkgs": { 30 "nixpkgs": {
diff --git a/flakes/peertube/flake.nix b/flakes/peertube/flake.nix
index 2f9c8c1..e8153eb 100644
--- a/flakes/peertube/flake.nix
+++ b/flakes/peertube/flake.nix
@@ -1,9 +1,7 @@
1{ 1{
2 description = "A free software to take back control of your videos"; 2 description = "A free software to take back control of your videos";
3 inputs.myuids = { 3 inputs.myuids = {
4 url = "https://git.immae.eu/perso/Immae/Config/Nix.git"; 4 url = "path:../myuids";
5 type = "git";
6 dir = "flakes/myuids";
7 }; 5 };
8 inputs.flake-utils.url = "github:numtide/flake-utils"; 6 inputs.flake-utils.url = "github:numtide/flake-utils";
9 inputs.nixpkgs.url = "github:NixOS/nixpkgs"; 7 inputs.nixpkgs.url = "github:NixOS/nixpkgs";
@@ -166,10 +164,10 @@
166 nixosModule = { lib, pkgs, config, ... }: 164 nixosModule = { lib, pkgs, config, ... }:
167 let 165 let
168 name = "peertube"; 166 name = "peertube";
169 cfg = config.services.peertube; 167 cfg = config.immaeServices.peertube;
170 in 168 in
171 { 169 {
172 options.services.peertube = { 170 options.immaeServices.peertube = {
173 enable = lib.mkEnableOption "Enable Peertube’s service"; 171 enable = lib.mkEnableOption "Enable Peertube’s service";
174 user = lib.mkOption { 172 user = lib.mkOption {
175 type = lib.types.str; 173 type = lib.types.str;
@@ -239,6 +237,8 @@
239 237
240 environment.NODE_CONFIG_DIR = "${cfg.dataDir}/config"; 238 environment.NODE_CONFIG_DIR = "${cfg.dataDir}/config";
241 environment.NODE_ENV = "production"; 239 environment.NODE_ENV = "production";
240 environment.NPM_CONFIG_LOGS_DIR = "${cfg.dataDir}/npm_logs";
241 environment.NPM_CONFIG_CACHE = "${cfg.dataDir}/npm_cache";
242 environment.HOME = cfg.package; 242 environment.HOME = cfg.package;
243 243
244 path = [ pkgs.nodejs pkgs.yarn pkgs.bashInteractive pkgs.ffmpeg pkgs.openssl ]; 244 path = [ pkgs.nodejs pkgs.yarn pkgs.bashInteractive pkgs.ffmpeg pkgs.openssl ];
diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/bower.nix b/flakes/private/buildbot/buildslist/bower.nix
index 8b26e0a..8b26e0a 100644
--- a/pkgs/python-packages/buildbot/plugins/buildslist/bower.nix
+++ b/flakes/private/buildbot/buildslist/bower.nix
diff --git a/flakes/private/buildbot/buildslist/default.nix b/flakes/private/buildbot/buildslist/default.nix
new file mode 100644
index 0000000..7f72503
--- /dev/null
+++ b/flakes/private/buildbot/buildslist/default.nix
@@ -0,0 +1,64 @@
1{ stdenv, runCommand, writeScriptBin, buildBowerComponents, pythonPackages, fetchurl, jq, yarn, nodejs-10_x, yarn2nix-moretea, buildslist_src }:
2let
3 yarn2nix-moretea' = yarn2nix-moretea.override({
4 yarn = yarn.override({ nodejs = nodejs-10_x; });
5 nodejs = nodejs-10_x;
6 });
7 packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
8 cat ${buildslist_src}/package.json | jq -r '.version = "${pythonPackages.buildbot-pkg.version}"|.license= "MIT"' > $out
9 '';
10 nodeHeaders = fetchurl {
11 url = "https://nodejs.org/download/release/v${nodejs-10_x.version}/node-v${nodejs-10_x.version}-headers.tar.gz";
12 sha256 = "sha256-LEk6BOW/vwdUXGAialDOoyFIkZ81k6ADy6MhMfRiE5Y=";
13 };
14 buildslist_yarn = yarn2nix-moretea'.mkYarnModules rec {
15 name = "buildslist-yarn-modules";
16 pname = name;
17 inherit (pythonPackages.buildbot-pkg) version;
18 packageJSON = packagejson;
19 yarnLock = "${buildslist_src}/yarn.lock";
20 yarnNix = ./yarn-packages.nix;
21 pkgConfig = {
22 node-sass = {
23 buildInputs = with yarn2nix-moretea'.pkgs; [ libsass python2 ];
24 postInstall =
25 ''
26 node scripts/build.js --tarball=${nodeHeaders}
27 '';
28 };
29 };
30 };
31 buildslist_bower = buildBowerComponents {
32 name = "buildslist";
33 generated = ./bower.nix;
34 src = "${buildslist_src}/guanlecoja/";
35 };
36 # the buildbot-pkg calls yarn and screws up everything...
37 fakeYarn = writeScriptBin "yarn" ''
38 #!${stdenv.shell}
39 if [ "$1" = "--version" ]; then
40 echo "1.17"
41 fi
42 '';
43in
44pythonPackages.buildPythonPackage rec {
45 pname = "buildbot-buildslist";
46 inherit (pythonPackages.buildbot-pkg) version;
47
48 preConfigure = ''
49 export HOME=$PWD
50 ln -s ${buildslist_yarn}/node_modules .
51 cp -a ${buildslist_bower}/bower_components ./libs
52 PATH=${buildslist_yarn}/node_modules/.bin:$PATH
53 chmod -R u+w libs
54 '';
55 propagatedBuildInputs = with pythonPackages; [
56 (klein.overridePythonAttrs(old: { checkPhase = ""; }))
57 buildbot-pkg
58 ];
59 nativeBuildInputs = [ fakeYarn nodejs-10_x ];
60 buildInputs = [ buildslist_yarn buildslist_bower ];
61
62 doCheck = false;
63 src = buildslist_src;
64}
diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix b/flakes/private/buildbot/buildslist/yarn-packages.nix
index 2ade970..2ade970 100644
--- a/pkgs/python-packages/buildbot/plugins/buildslist/yarn-packages.nix
+++ b/flakes/private/buildbot/buildslist/yarn-packages.nix
diff --git a/flakes/private/buildbot/common/build_helpers.py b/flakes/private/buildbot/common/build_helpers.py
new file mode 100644
index 0000000..77e6c07
--- /dev/null
+++ b/flakes/private/buildbot/common/build_helpers.py
@@ -0,0 +1,293 @@
1from buildbot.plugins import util, steps, schedulers
2from buildbot_buildslist import BuildsList
3from shutil import which
4
5__all__ = [
6 "force_scheduler", "deploy_scheduler", "git_hook_scheduler",
7 "clean_branch", "package_and_upload", "AppriseStatusPush",
8 "XMPPStatusPush", "NixShellCommand",
9 "all_builder_names", "compute_build_infos", "deploy_ssh_command",
10 "configure_apprise_push",
11 "configure_xmpp_push", "deploy_hook_scheduler",
12 ]
13
14# Small helpers"
15@util.renderer
16def clean_branch(props):
17 if props.hasProperty("branch") and len(props["branch"]) > 0:
18 return props["branch"].replace("/", "_")
19 else:
20 return "HEAD"
21
22def package_and_upload(package, package_dest, package_url):
23 return [
24 steps.ShellCommand(name="build package",
25 logEnviron=False, haltOnFailure=True,
26 command=["git", "archive", "HEAD", "-o", package]),
27
28 steps.FileUpload(name="upload package", workersrc=package,
29 masterdest=package_dest,
30 url=package_url, mode=0o644),
31
32 steps.ShellCommand(name="cleanup package", logEnviron=False,
33 haltOnFailure=True, alwaysRun=True,
34 command=["rm", "-f", package]),
35 ]
36
37# Steps
38class NixShellCommand(steps.ShellCommand):
39 def __init__(self, command=None, nixPackages=[], pure=True, nixFile=None, nixIncludes={}, nixArgs={}, **kwargs):
40 oldpath = kwargs.get("env", {}).get("PATH", None)
41 if which("nix-shell", path=oldpath) is None:
42 kwargs["env"] = kwargs.get("env", {})
43 if isinstance(oldpath, str):
44 kwargs["env"]["PATH"] = "/run/current-system/sw/bin:" + oldpath
45 elif isinstance(oldpath, list):
46 kwargs["env"]["PATH"] = ["/run/current-system/sw/bin"] + oldpath
47 nixcommand = ["nix-shell"]
48 for k, v in nixArgs.items():
49 nixcommand.append("--arg")
50 nixcommand.append(k)
51 nixcommand.append(v)
52 if pure:
53 nixcommand.append("--pure")
54 for k, v in nixIncludes.items():
55 nixcommand.append("-I")
56 nixcommand.append("{}={}".format(k, v))
57 nixcommand.append("--run")
58 nixcommand.append(command)
59 if len(nixPackages) > 0:
60 nixcommand.append("-p")
61 nixcommand += nixPackages
62 elif nixFile is not None:
63 nixcommand.append(nixFile)
64 super().__init__(command=nixcommand, **kwargs)
65
66# Schedulers
67def force_scheduler(name, builders, nobranch=False):
68 if nobranch:
69 branch = util.FixedParameter(name="branch", default="")
70 else:
71 branch=util.StringParameter(name="branch", label="Git reference (tag, branch)", required=True)
72
73 return schedulers.ForceScheduler(name=name,
74 label="Force build", buttonName="Force build",
75 reason=util.StringParameter(name="reason", label="Reason", default="Force build"),
76 codebases=[
77 util.CodebaseParameter("",
78 branch=branch,
79 revision=util.FixedParameter(name="revision", default=""),
80 repository=util.FixedParameter(name="repository", default=""),
81 project=util.FixedParameter(name="project", default=""),
82 ),
83 ],
84 username=util.FixedParameter(name="username", default="Web button"),
85 builderNames=builders)
86
87def deploy_scheduler(name, builders):
88 return schedulers.ForceScheduler(name=name,
89 builderNames=builders,
90 label="Deploy built package", buttonName="Deploy",
91 username=util.FixedParameter(name="username", default="Web button"),
92 codebases=[
93 util.CodebaseParameter(codebase="",
94 branch=util.FixedParameter(name="branch", default=""),
95 revision=util.FixedParameter(name="revision", default=""),
96 repository=util.FixedParameter(name="repository", default=""),
97 project=util.FixedParameter(name="project", default=""))],
98 reason=util.FixedParameter(name="reason", default="Deploy"),
99 properties=[
100 util.ChoiceStringParameter(label="Environment",
101 name="environment", default="integration",
102 choices=["integration", "production"]),
103 BuildsList(label="Build to deploy", name="build"),
104 ]
105 )
106
107def git_hook_scheduler(project, builders=[], timer=1):
108 if len(builders) == 0:
109 builders = ["{}_build".format(project)]
110 return schedulers.AnyBranchScheduler(
111 change_filter=util.ChangeFilter(category="gitolite-hooks", project=project),
112 name="{}_git_hook".format(project), treeStableTimer=timer, builderNames=builders)
113
114def deploy_hook_scheduler(project, builders, timer=1):
115 return schedulers.AnyBranchScheduler(
116 change_filter=util.ChangeFilter(category="deploy_webhook", project=project),
117 name="{}_deploy".format(project), treeStableTimer=timer, builderNames=builders)
118
119# Builders
120def all_builder_names(c):
121 return [builder.name for builder in c['builders']]
122
123# Apprise/XMPP status push
124from buildbot.reporters.http import HttpStatusPushBase
125from twisted.internet import defer
126from twisted.python import log
127from buildbot.reporters import utils
128from buildbot.process import results
129from twisted.words.protocols.jabber.jid import JID
130from wokkel import client, xmppim
131from functools import partial
132import apprise
133
134class AppriseStatusPush(HttpStatusPushBase):
135 name = "AppriseStatusPush"
136
137 @defer.inlineCallbacks
138 def reconfigService(self, appriseUrls, **kwargs):
139 self.appriseUrls = appriseUrls
140 yield HttpStatusPushBase.reconfigService(self, **kwargs)
141
142 @defer.inlineCallbacks
143 def send(self, build):
144 yield utils.getDetailsForBuild(self.master, build, wantProperties=True)
145 appobject = apprise.Apprise()
146 message = self.format(build)
147 for url in self.appriseUrls:
148 appobject.add(url.format(**message))
149 yield appobject.notify(title=message["title"], body=message["text"])
150
151 def format(self, build):
152 if "environment" in build["properties"]:
153 msg = "{} environment".format(build["properties"]["environment"][0])
154 if "build" in build["properties"]:
155 msg = "of archive {} in ".format(build["properties"]["build"][0]) + msg
156 elif len(build["buildset"]["sourcestamps"][0]["branch"] or []) > 0:
157 msg = "revision {}".format(build["buildset"]["sourcestamps"][0]["branch"])
158 else:
159 msg = "build"
160
161 if build["complete"]:
162 timedelta = int((build["complete_at"] - build["started_at"]).total_seconds())
163 hours, rest = divmod(timedelta, 3600)
164 minutes, seconds = divmod(rest, 60)
165 if hours > 0:
166 duration = "{}h {}min {}s".format(hours, minutes, seconds)
167 elif minutes > 0:
168 duration = "{}min {}s".format(minutes, seconds)
169 else:
170 duration = "{}s".format(seconds)
171
172 text = "Build {} ({}) of {}'s {} was {} in {}.".format(
173 build["number"], build["url"],
174 build["builder"]["name"],
175 msg,
176 results.Results[build["results"]],
177 duration,
178 )
179 else:
180 text = "Build {} ({}) of {}'s {} started.".format(
181 build["number"], build["url"],
182 build["builder"]["name"],
183 msg,
184 )
185 return {
186 "username": "Buildbot",
187 "image_url": "http://docs.buildbot.net/current/_static/icon.png",
188 "text": text,
189 "title": "",
190 }
191
192def configure_apprise_push(c, secrets_file, builders):
193 c['services'].append(AppriseStatusPush(
194 name="apprise_status", builders=builders,
195 appriseUrls=open(secrets_file + "/apprise_webhooks", "r").read().split("\n")))
196
197class XMPPStatusPush(HttpStatusPushBase):
198 name = "XMPPStatusPush"
199
200 @defer.inlineCallbacks
201 def reconfigService(self, password, recipients, **kwargs):
202 yield HttpStatusPushBase.reconfigService(self, **kwargs)
203 self.password = password
204 self.recipients = recipients
205
206 @defer.inlineCallbacks
207 def send(self, build):
208 yield utils.getDetailsForBuild(self.master, build, wantProperties=True)
209 body = self.format(build)
210 factory = client.DeferredClientFactory(JID("notify_bot@immae.fr/buildbot"), self.password)
211 d = client.clientCreator(factory)
212 def send_message(recipient, stream):
213 message = xmppim.Message(recipient=JID(recipient), body=body)
214 message.stanzaType = 'chat'
215 stream.send(message.toElement())
216 # To allow chaining
217 return stream
218 for recipient in self.recipients:
219 d.addCallback(partial(send_message, recipient))
220 d.addCallback(lambda _: factory.streamManager.xmlstream.sendFooter())
221 d.addErrback(log.err)
222
223 def format(self, build):
224 if "environment" in build["properties"]:
225 msg = "{} environment".format(build["properties"]["environment"][0])
226 if "build" in build["properties"]:
227 msg = "of archive {} in ".format(build["properties"]["build"][0]) + msg
228 elif len(build["buildset"]["sourcestamps"][0]["branch"] or []) > 0:
229 msg = "revision {}".format(build["buildset"]["sourcestamps"][0]["branch"])
230 else:
231 msg = "build"
232
233 if build["complete"]:
234 timedelta = int((build["complete_at"] - build["started_at"]).total_seconds())
235 hours, rest = divmod(timedelta, 3600)
236 minutes, seconds = divmod(rest, 60)
237 if hours > 0:
238 duration = "{}h {}min {}s".format(hours, minutes, seconds)
239 elif minutes > 0:
240 duration = "{}min {}s".format(minutes, seconds)
241 else:
242 duration = "{}s".format(seconds)
243
244 text = "Build {} ( {} ) of {}'s {} was {} in {}.".format(
245 build["number"], build["url"],
246 build["builder"]["name"],
247 msg,
248 results.Results[build["results"]],
249 duration,
250 )
251 else:
252 text = "Build {} ( {} ) of {}'s {} started.".format(
253 build["number"], build["url"],
254 build["builder"]["name"],
255 msg,
256 )
257
258 return text
259
260def configure_xmpp_push(c, secrets_file, builders, recipients):
261 c['services'].append(XMPPStatusPush(
262 name="xmpp_status", builders=builders, recipients=recipients,
263 password=open(secrets_file + "/notify_xmpp_password", "r").read().rstrip()))
264
265# LDAP edit
266from buildbot.process.buildstep import FAILURE
267from buildbot.process.buildstep import SUCCESS
268from buildbot.process.buildstep import BuildStep
269
270def compute_build_infos(prefix, release_path):
271 @util.renderer
272 def compute(props):
273 import re, hashlib
274 build_file = props.getProperty("build")
275 package_dest = "{}/{}".format(release_path, build_file)
276 version = re.match(r"{0}_(.*).tar.gz".format(prefix), build_file).group(1)
277 with open(package_dest, "rb") as f:
278 sha = hashlib.sha256(f.read()).hexdigest()
279 return {
280 "build_version": version,
281 "build_hash": sha,
282 }
283 return compute
284
285def deploy_ssh_command(ssh_key_path, deploy_hosts):
286 @util.renderer
287 def compute(props):
288 environment = props["environment"] if props.hasProperty("environment") else "integration"
289 ssh_command = [
290 "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no",
291 "-i", ssh_key_path ]
292 return ssh_command + deploy_hosts.get(environment, ["host.invalid"])
293 return compute
diff --git a/modules/private/buildbot/common/libvirt.py b/flakes/private/buildbot/common/libvirt.py
index e250627..e250627 100644
--- a/modules/private/buildbot/common/libvirt.py
+++ b/flakes/private/buildbot/common/libvirt.py
diff --git a/flakes/private/buildbot/common/master.cfg b/flakes/private/buildbot/common/master.cfg
new file mode 100644
index 0000000..0357f2a
--- /dev/null
+++ b/flakes/private/buildbot/common/master.cfg
@@ -0,0 +1,93 @@
1# -*- python -*-
2# ex: set filetype=python:
3
4from buildbot.plugins import secrets, util, webhooks
5from buildbot.util import bytes2unicode
6import re
7import os
8from buildbot_config import E, configure
9import json
10
11class CustomBase(webhooks.base):
12 def getChanges(self, request):
13 try:
14 content = request.content.read()
15 args = json.loads(bytes2unicode(content))
16 except Exception as e:
17 raise ValueError("Error loading JSON: " + str(e))
18
19 args.setdefault("comments", "")
20 args.setdefault("repository", "")
21 args.setdefault("author", args.get("who"))
22
23 return ([args], None)
24
25class GitoliteHook(webhooks.base):
26 def getChanges(self, request):
27 try:
28 branch = request.args[b"branch"][0].decode("utf-8")
29 project = request.args[b"project"][0].decode("utf-8")
30 repository = request.args[b"repository"][0].decode("utf-8")
31 author = request.args[b"author"][0].decode("utf-8")
32 except Exception as e:
33 raise ValueError("Error missing key in request: " + str(e))
34
35 args = {
36 "author": "gitolite for " + author,
37 "category": "gitolite-hooks",
38 "comments": "gitolite post-receive hook",
39 "branch": branch,
40 "project": project,
41 "repository": repository,
42 }
43
44 return ([args], None)
45
46userInfoProvider = util.LdapUserInfo(
47 uri=E.LDAP_URL,
48 bindUser=E.LDAP_ADMIN_USER,
49 bindPw=open(E.SECRETS_FILE + "/ldap", "r").read().rstrip(),
50 accountBase=E.LDAP_BASE,
51 accountPattern=E.LDAP_PATTERN,
52 accountFullName='cn',
53 accountEmail='mail',
54 avatarData="jpegPhoto",
55 groupBase=E.LDAP_BASE,
56 groupName="cn",
57 groupMemberPattern=E.LDAP_GROUP_PATTERN,
58 )
59
60c = BuildmasterConfig = {
61 "title": E.TITLE,
62 "titleURL": E.TITLE_URL,
63 "db": {
64 "db_url": "sqlite:///state.sqlite"
65 },
66 "protocols": { "pb": { "port": E.PB_SOCKET } },
67 "workers": [],
68 "change_source": [],
69 "schedulers": [],
70 "builders": [],
71 "services": [],
72 "secretsProviders": [
73 secrets.SecretInAFile(E.SECRETS_FILE),
74 ],
75 "www": {
76 "change_hook_dialects": {
77 "base": { "custom_class": CustomBase },
78 "gitolite": { "custom_class": GitoliteHook },
79 },
80 "plugins": {
81 "waterfall_view": {},
82 "console_view": {},
83 "grid_view": {},
84 "buildslist": {},
85 },
86 "auth": util.RemoteUserAuth(
87 header=b"X-Remote-User",
88 userInfoProvider=userInfoProvider,
89 headerRegex=re.compile(br"(?P<username>[^ @]+)")),
90 }
91 }
92
93configure(c)
diff --git a/flakes/private/buildbot/flake.lock b/flakes/private/buildbot/flake.lock
new file mode 100644
index 0000000..8952f75
--- /dev/null
+++ b/flakes/private/buildbot/flake.lock
@@ -0,0 +1,61 @@
1{
2 "nodes": {
3 "buildslist": {
4 "flake": false,
5 "locked": {
6 "lastModified": 1585697026,
7 "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
8 "ref": "master",
9 "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
10 "revCount": 4,
11 "type": "git",
12 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
13 },
14 "original": {
15 "type": "git",
16 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
17 }
18 },
19 "flake-utils": {
20 "locked": {
21 "lastModified": 1648297722,
22 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
23 "owner": "numtide",
24 "repo": "flake-utils",
25 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
26 "type": "github"
27 },
28 "original": {
29 "owner": "numtide",
30 "repo": "flake-utils",
31 "type": "github"
32 }
33 },
34 "nixpkgs": {
35 "flake": false,
36 "locked": {
37 "lastModified": 1596265691,
38 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
39 "owner": "NixOS",
40 "repo": "nixpkgs",
41 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
42 "type": "github"
43 },
44 "original": {
45 "owner": "NixOS",
46 "repo": "nixpkgs",
47 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
48 "type": "github"
49 }
50 },
51 "root": {
52 "inputs": {
53 "buildslist": "buildslist",
54 "flake-utils": "flake-utils",
55 "nixpkgs": "nixpkgs"
56 }
57 }
58 },
59 "root": "root",
60 "version": 7
61}
diff --git a/flakes/private/buildbot/flake.nix b/flakes/private/buildbot/flake.nix
new file mode 100644
index 0000000..8b3c704
--- /dev/null
+++ b/flakes/private/buildbot/flake.nix
@@ -0,0 +1,74 @@
1{
2 description = "The continuous integration framework";
3 inputs.flake-utils.url = "github:numtide/flake-utils";
4 inputs.nixpkgs = {
5 url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
6 flake = false;
7 };
8 inputs.buildslist = {
9 url = "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist";
10 type = "git";
11 flake = false;
12 };
13 outputs = { self, nixpkgs, flake-utils, buildslist }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
14 let
15 pkgs = import nixpkgs { inherit system; overlays = []; };
16 python = pkgs.python38;
17 wokkel = python.pkgs.buildPythonPackage rec {
18 pname = "wokkel";
19 version = "18.0.0";
20 src = python.pkgs.fetchPypi {
21 inherit pname version;
22 sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016";
23 };
24 propagatedBuildInputs = with python.pkgs; [ twisted.extras.tls twisted incremental dateutil ];
25 doCheck = false;
26 };
27 buildbot_common = python.pkgs.buildPythonPackage {
28 name = "buildbot_common";
29 src = ./common;
30 format = "other";
31 installPhase = ''
32 mkdir -p $out/${python.sitePackages}
33 cp -a $src $out/${python.sitePackages}/buildbot_common
34 '';
35 };
36 buildbot-full = python.pkgs.buildbot-full.withPlugins [ buildslist-plugin ] // {
37 inherit buildbot_common;
38 buildbot_config = project: python.pkgs.buildPythonPackage (rec {
39 name = "buildbot_config-${project.name}";
40 src = if project.name == "test" then ./test_project else project.src;
41 format = "other";
42 installPhase = ''
43 mkdir -p $out/${python.sitePackages}
44 cp -a $src $out/${python.sitePackages}/buildbot_config
45 '';
46 });
47 common_packages = pkgs: [
48 (pkgs.apprise.overridePythonAttrs(old: { propagatedBuildInputs = old.propagatedBuildInputs ++ [ pkgs.sleekxmpp ]; })) pkgs.libvirt pkgs.treq pkgs.ldap3
49 buildbot-full pkgs.buildbot-worker pkgs.pip buildbot_common
50 wokkel
51 ];
52 };
53 buildslist-plugin = pkgs.callPackage ./buildslist {
54 pythonPackages = python.pkgs;
55 buildslist_src = buildslist;
56 };
57 in rec {
58 packages = {
59 buildslist = buildslist-plugin;
60 buildbot-full = buildbot-full;
61 buildbot_common = buildbot_common;
62 };
63 defaultPackage = packages.buildbot-full;
64 legacyPackages = packages;
65 checks = packages;
66 }) // rec {
67 overlays = {
68 immae-buildbot = final: prev: {
69 immae-buildbot = self.defaultPackage."${final.system}";
70 };
71 };
72 overlay = overlays.immae-buildbot;
73 };
74}
diff --git a/flakes/private/buildbot/test_project/__init__.py b/flakes/private/buildbot/test_project/__init__.py
new file mode 100644
index 0000000..d5893fd
--- /dev/null
+++ b/flakes/private/buildbot/test_project/__init__.py
@@ -0,0 +1,121 @@
1from buildbot.plugins import *
2from buildbot_common.build_helpers import *
3import buildbot_common.libvirt as ilibvirt
4import os
5from buildbot.util import bytes2unicode
6import json
7
8__all__ = [ "configure", "E" ]
9
10class E():
11 PROJECT = "test"
12 BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
13 SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT)
14 PB_SOCKET = os.environ["BUILDBOT_WORKER_PORT"]
15 WORKER_HOST = "{}:{}".format(os.environ["BUILDBOT_HOST"], PB_SOCKET)
16 RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
17 RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT)
18 GIT_URL = "https://git.immae.eu/perso/Immae/TestProject.git"
19 SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key"
20 LIBVIRT_URL = os.environ["BUILDBOT_VIRT_URL"] + "?keyfile=" + SSH_KEY_PATH
21 XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
22
23 # master.cfg
24 SECRETS_FILE = os.getcwd() + "/secrets"
25 LDAP_URL = "ldaps://ldap.immae.eu:636"
26 LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu"
27 LDAP_BASE = "dc=immae,dc=eu"
28 LDAP_PATTERN = "(uid=%(username)s)"
29 LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=test,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
30 TITLE_URL = "https://git.immae.eu/?p=perso/Immae/TestProject.git;a=summary"
31 TITLE = "Test project"
32
33class CustomBase(webhooks.base):
34 def getChanges(self, request):
35 try:
36 content = request.content.read()
37 args = json.loads(bytes2unicode(content))
38 except Exception as e:
39 raise ValueError("Error loading JSON: " + str(e))
40
41 args.setdefault("comments", "")
42 args.setdefault("repository", "")
43 args.setdefault("author", args.get("who", "unknown"))
44
45 if args["category"] == "deploy_webhook":
46 args = {
47 "category": "deploy_webhook",
48 "comments": "",
49 "repository": "",
50 "author": "unknown",
51 "project": "TestProject",
52 "properties": {
53 "environment": args.get("environment", "integration"),
54 "build": "test_{}.tar.gz".format(args.get("branch", "master"))
55 }
56 }
57
58 return ([args], None)
59
60def configure(c):
61 c["buildbotURL"] = E.BUILDBOT_URL
62 c["www"]["port"] = E.SOCKET
63
64 c["www"]["change_hook_dialects"]["base"] = { "custom_class": CustomBase }
65
66 configure_build(c)
67 configure_deploy(c)
68
69 configure_apprise_push(c, E.SECRETS_FILE, all_builder_names(c))
70 configure_xmpp_push(c, E.SECRETS_FILE, all_builder_names(c), E.XMPP_RECIPIENTS)
71
72def configure_build(c):
73 builder_name = "TestProject_build"
74 worker_name = "test-build"
75 c['schedulers'].append(force_scheduler("force_test", [builder_name]))
76 c['schedulers'].append(git_hook_scheduler("TestProject", [builder_name]))
77 c['workers'].append(libvirt_worker(worker_name))
78 c['builders'].append(util.BuilderConfig(name=builder_name, workernames=[worker_name], factory=build_factory()))
79
80def configure_deploy(c):
81 builder_name = "TestProject_deploy"
82 worker_name = "test-deploy"
83 c['workers'].append(libvirt_worker(worker_name))
84 c['schedulers'].append(deploy_hook_scheduler("TestProject", [builder_name]))
85 c['schedulers'].append(deploy_scheduler("deploy_test", [builder_name]))
86 c['builders'].append(util.BuilderConfig(name=builder_name, workernames=[worker_name], factory=deploy_factory()))
87
88def libvirt_worker(name):
89 return ilibvirt.LibVirtWorker(name,
90 open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(),
91 ilibvirt.Connection(E.LIBVIRT_URL),
92 E.WORKER_HOST)
93
94def build_factory():
95 package = util.Interpolate("test_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch)
96 package_dest = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_PATH), clean_branch=clean_branch)
97 package_url = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_URL), clean_branch=clean_branch)
98
99 factory = util.BuildFactory()
100 factory.addStep(steps.Git(logEnviron=False,
101 repourl=E.GIT_URL, mode="full", method="fresh"))
102 factory.addStep(steps.ShellCommand(name="env",
103 logEnviron=False, command=["env"]))
104 factory.addStep(steps.ShellCommand(name="pwd",
105 logEnviron=False, command=["pwd"]))
106 factory.addStep(steps.ShellCommand(name="true",
107 logEnviron=False, command=["true"]))
108 factory.addStep(steps.ShellCommand(name="echo",
109 logEnviron=False, command=["echo", package]))
110 factory.addSteps(package_and_upload(package, package_dest, package_url))
111
112 return factory
113
114def deploy_factory():
115 package_dest = util.Interpolate("{}/%(prop:build)s".format(E.RELEASE_PATH))
116
117 factory = util.BuildFactory()
118 factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
119 factory.addStep(steps.SetProperties(properties=compute_build_infos("test", E.RELEASE_PATH)))
120 factory.addStep(steps.MasterShellCommand(command=deploy_ssh_command(E.SSH_KEY_PATH, {})))
121 return factory
diff --git a/flakes/private/chatons/flake.lock b/flakes/private/chatons/flake.lock
new file mode 100644
index 0000000..39ed484
--- /dev/null
+++ b/flakes/private/chatons/flake.lock
@@ -0,0 +1,23 @@
1{
2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
15 "root": {
16 "inputs": {
17 "environment": "environment"
18 }
19 }
20 },
21 "root": "root",
22 "version": 7
23}
diff --git a/flakes/private/chatons/flake.nix b/flakes/private/chatons/flake.nix
new file mode 100644
index 0000000..70fb02d
--- /dev/null
+++ b/flakes/private/chatons/flake.nix
@@ -0,0 +1,142 @@
1{
2 inputs.environment.url = "path:../environment";
3 outputs = { self, environment }: {
4 nixosModule = self.nixosModules.chatons;
5 nixosModules.chatons = { config, lib, pkgs, nodes, ... }:
6 let
7 concatValue = value: if lib.isList value then builtins.concatStringsSep "," value else builtins.toString value;
8 toProperties = properties: builtins.concatStringsSep "\n" (
9 lib.collect
10 (p: !(lib.isAttrs p))
11 (lib.mapAttrsRecursive
12 (path: value: builtins.concatStringsSep "." (builtins.filter (f: f != "") path) + " = " + (concatValue value))
13 properties));
14 before = name: {
15 "${name}" = {
16 status.level = "OK";
17 status.description = "OK";
18 install.type = "PACKAGE";
19 registration.load = "OPEN";
20 };
21 host = {
22 name = "Hetzner";
23 server.type = "PHYSICAL";
24 provider.type = "HOSTEDSERVER";
25 server.distribution = "NixOS";
26 country.name = "Allemagne";
27 country.code = "DE";
28 };
29 };
30 after = name: {
31 file = {
32 class = name;
33 protocol = "ChatonsInfos-0.5";
34 generator = "Nix derivation";
35 };
36 "${name}" = {
37 legal.url = "https://www.immae.eu/mentions.html";
38 guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/";
39 contact.url = "https://www.immae.eu/contacts_fr.html";
40 contact.email = config.myEnv.tools.contact;
41 startdate = "01/01/2019";
42 };
43 };
44 organization = {
45 file = {
46 class = "organization";
47 protocol = "ChatonsInfos-0.5";
48 datetime = "2021-01-11T22:23:00";
49 generator = "Nix derivation";
50 };
51 organization = {
52 country.name = "France";
53 country.code = "FR";
54 name = "ImmaeEu";
55 description = "ImmaeEu est un CHATONS des Alpes-Maritimes";
56 website = "https://www.immae.eu";
57 logo = "https://assets.immae.eu/logo.jpg";
58 socialnetworks = {
59 diaspora = "https://diaspora.immae.eu/people/1a185f29cc76cb35";
60 facebook = "https://www.facebook.com/ismael.bouya";
61 mastodon = "https://mastodon.immae.eu/@immae";
62 peertube = "https://peertube.immae.eu/accounts/immae/";
63 twitter = "https://twitter.com/_immae";
64 };
65 chatrooms = {
66 xmpp = "ismael@immae.fr";
67 irc = "immae@freenode";
68 matrix = "#support:immae.eu";
69 };
70 contact.url = "https://www.immae.eu/contacts_fr.html";
71 contact.email = config.myEnv.tools.contact;
72 legal.url = "https://www.immae.eu/mentions.html";
73 guide.technical = "https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/";
74 guide.user = "https://www.immae.eu/docs";
75 status.level = "ACTIVE";
76 status.description = "En activité";
77 startdate = "01/01/2019";
78 type = "COMPANY";
79 owner = {
80 logo = "https://assets.immae.eu/logo.jpg";
81 name = "Ismaël Bouya";
82 website = "https://www.immae.eu";
83 };
84 memberof.chatons = {
85 startdate = "01/07/2019";
86 status.level = "ACTIVE";
87 status.description = "Participe au collectif";
88 };
89 };
90 };
91 subname = v: if v.published or true then "subs" else "subs-hidden";
92 toOrganizationProperties = name: pkgs.writeText name (toProperties organization + "\n" + (
93 builtins.concatStringsSep "\n" (lib.mapAttrsToList
94 (n: v: "${subname v}.${n} = https://www.immae.eu/.well-known/chatonsinfos/service-${n}.properties") mergedServices
95 )) + "\n" + (
96 builtins.concatStringsSep "\n" (lib.mapAttrsToList
97 (n: v: "subs.hosting-${n} = https://www.immae.eu/.well-known/chatonsinfos/hosting-${n}.properties") mergedHostings
98 )));
99 toHostingProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "hosting") (lib.recursiveUpdate content (after "hosting"))));
100 toServiceProperties = name: content: pkgs.writeText name (toProperties (lib.recursiveUpdate (before "service") (lib.recursiveUpdate content (after "service"))));
101
102 cfg = config.myServices.chatonsProperties;
103 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);
104 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);
105 in {
106 imports = [
107 environment.nixosModule
108 ];
109 options.myServices.chatonsProperties.organization = lib.mkOption {
110 type = lib.types.attrsOf lib.types.unspecified;
111 default = {};
112 description = ''
113 nested attrs of strings or arrays of strings
114 '';
115 };
116 options.myServices.chatonsProperties.services = lib.mkOption {
117 type = lib.types.attrsOf lib.types.unspecified;
118 default = {};
119 description = ''
120 nested attrs of strings or arrays of strings
121 '';
122 };
123 options.myServices.chatonsProperties.hostings = lib.mkOption {
124 type = lib.types.attrsOf lib.types.unspecified;
125 default = {};
126 description = ''
127 nested attrs of strings or arrays of strings
128 '';
129 };
130 options.myServices.chatonsProperties.propertiesPath = lib.mkOption {
131 type = lib.types.package;
132 readOnly = true;
133 default = pkgs.runCommand "chatons" {} ''
134 mkdir -p $out
135 cp ${toOrganizationProperties "immae-eu"} $out/immae-eu.properties
136 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toHostingProperties n c} $out/hosting-${n}.properties") mergedHostings)}
137 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: c: "cp ${toServiceProperties n c} $out/service-${n}.properties") mergedServices)}
138 '';
139 };
140 };
141 };
142}
diff --git a/flakes/private/environment-dummy/flake.nix b/flakes/private/environment-dummy/flake.nix
new file mode 100644
index 0000000..5ebc27f
--- /dev/null
+++ b/flakes/private/environment-dummy/flake.nix
@@ -0,0 +1,18 @@
1{
2 description = ''
3 A dummy flake that contains a compatible structure to the one stored at
4 git+ssh://gitolite@git.immae.eu/perso/Immae/Config/Nix/Nixops/Secrets
5 It is used as default value in "public" configurations
6 '';
7 outputs = { self }: {
8 vars-file = ./vars.yml;
9 ldap-conf = ./ldap.conf;
10 environment-file = ./environment.nix;
11 nixosModule = self.nixosModules.my-environment;
12 nixosModules.my-environment = { ... }: {
13 config.myEnv = import self.environment-file;
14 };
15 nixosModules.users-config-eldiron = { ... }: {};
16 };
17}
18
diff --git a/flakes/private/environment-dummy/ldap.conf b/flakes/private/environment-dummy/ldap.conf
new file mode 100644
index 0000000..064a4be
--- /dev/null
+++ b/flakes/private/environment-dummy/ldap.conf
@@ -0,0 +1,13 @@
1# Indices to maintain
2index objectClass eq
3index uid pres,eq
4index mail pres,sub,eq
5index cn pres,sub,eq
6index sn pres,sub,eq
7index dc eq
8index krbPrincipalName eq
9index member eq
10index memberOf eq
11
12access to *
13 by * none
diff --git a/flakes/private/environment-dummy/vars.yml b/flakes/private/environment-dummy/vars.yml
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/flakes/private/environment-dummy/vars.yml
@@ -0,0 +1 @@
{}
diff --git a/flakes/private/environment/flake.nix b/flakes/private/environment/flake.nix
new file mode 100644
index 0000000..15c079a
--- /dev/null
+++ b/flakes/private/environment/flake.nix
@@ -0,0 +1,1135 @@
1{
2 outputs = { self }: {
3 nixosModule = self.nixosModules.environment;
4 nixosModules.environment = { config, lib, name, ... }:
5 with lib;
6 with types;
7 with lists;
8 let
9 ldapOptions = {
10 base = mkOption { description = "Base of the LDAP tree"; type = str; };
11 host = mkOption { description = "Host to access LDAP"; type = str; };
12 root_dn = mkOption { description = "DN of the root user"; type = str; };
13 root_pw = mkOption { description = "Hashed password of the root user"; type = str; };
14 replication_dn = mkOption { description = "DN of the user allowed to replicate the LDAP directory"; type = str; };
15 replication_pw = mkOption { description = "Password of the user allowed to replicate the LDAP directory"; type = str; };
16 };
17 mkLdapOptions = name: more: mkOption {
18 description = "${name} LDAP configuration";
19 type = submodule {
20 options = ldapOptions // {
21 dn = mkOption { description = "DN of the ${name} user"; type = str; };
22 password = mkOption { description = "password of the ${name} user"; type = str; };
23 filter = mkOption { description = "Filter for ${name} users"; type = str; default = ""; };
24 } // more;
25 };
26 };
27 mysqlOptions = {
28 host = mkOption { description = "Host to access Mysql"; type = str; };
29 remoteHost = mkOption { description = "Host to access Mysql from outside"; type = str; };
30 port = mkOption { description = "Port to access Mysql"; type = int; };
31 socket = mkOption { description = "Socket to access Mysql"; type = path; };
32 systemUsers = mkOption {
33 description = "Attrs of user-passwords allowed to access mysql";
34 type = attrsOf str;
35 };
36 pam = mkOption {
37 description = "PAM configuration for mysql";
38 type = submodule {
39 options = {
40 dn = mkOption { description = "DN to connect as to check users"; type = str; };
41 password = mkOption { description = "DN password to connect as to check users"; type = str; };
42 filter = mkOption { description = "filter to match users"; type = str; };
43 };
44 };
45 };
46 };
47 mkMysqlOptions = name: more: mkOption {
48 description = "${name} mysql configuration";
49 type = submodule {
50 options = mysqlOptions // {
51 database = mkOption { description = "${name} database"; type = str; };
52 user = mkOption { description = "${name} user"; type = str; };
53 password = mkOption { description = "mysql password of the ${name} user"; type = str; };
54 } // more;
55 };
56 };
57 psqlOptions = {
58 host = mkOption { description = "Host to access Postgresql"; type = str; };
59 port = mkOption { description = "Port to access Postgresql"; type = str; };
60 socket = mkOption { description = "Socket to access Postgresql"; type = path; };
61 pam = mkOption {
62 description = "PAM configuration for psql";
63 type = submodule {
64 options = {
65 dn = mkOption { description = "DN to connect as to check users"; type = str; };
66 password = mkOption { description = "DN password to connect as to check users"; type = str; };
67 filter = mkOption { description = "filter to match users"; type = str; };
68 };
69 };
70 };
71 };
72 mkPsqlOptions = name: mkOption {
73 description = "${name} psql configuration";
74 type = submodule {
75 options = psqlOptions // {
76 database = mkOption { description = "${name} database"; type = str; };
77 schema = mkOption { description = "${name} schema"; type = nullOr str; default = null; };
78 user = mkOption { description = "${name} user"; type = str; };
79 password = mkOption { description = "psql password of the ${name} user"; type = str; };
80 };
81 };
82 };
83 redisOptions = {
84 host = mkOption { description = "Host to access Redis"; type = str; };
85 port = mkOption { description = "Port to access Redis"; type = str; };
86 socket = mkOption { description = "Socket to access Redis"; type = path; };
87 dbs = mkOption {
88 description = "Attrs of db number. Each number should be unique to avoid collision!";
89 type = attrsOf str;
90 };
91 spiped_key = mkOption {
92 type = str;
93 description = ''
94 Key to use with spiped to make a secure channel to replication
95 '';
96 };
97 predixy = mkOption {
98 description = "Predixy configuration. Unused yet";
99 type = submodule {
100 options = {
101 read = mkOption { type = str; description = "Read password"; };
102 };
103 };
104 };
105 };
106 mkRedisOptions = name: mkOption {
107 description = "${name} redis configuration";
108 type = submodule {
109 options = redisOptions // {
110 db = mkOption { description = "${name} database"; type = str; };
111 };
112 };
113 };
114 smtpOptions = {
115 host = mkOption { description = "Host to access SMTP"; type = str; };
116 port = mkOption { description = "Port to access SMTP"; type = str; };
117 };
118 mkSmtpOptions = name: mkOption {
119 description = "${name} smtp configuration";
120 type = submodule {
121 options = smtpOptions // {
122 email = mkOption { description = "${name} email"; type = str; };
123 password = mkOption { description = "SMTP password of the ${name} user"; type = str; };
124 };
125 };
126 };
127 hostEnv = submodule {
128 options = {
129 fqdn = mkOption {
130 description = "Host FQDN";
131 type = str;
132 };
133 hostKey = mkOption {
134 type = nullOr str;
135 default = null;
136 description = ''
137 ssh host key
138 '';
139 };
140 isVm = mkEnableOption "The host is a vm";
141 users = mkOption {
142 type = unspecified;
143 default = pkgs: [];
144 description = ''
145 Sublist of users from realUsers. Function that takes pkgs as
146 argument and gives an array as a result
147 '';
148 };
149 emails = mkOption {
150 default = [];
151 description = "List of e-mails that the server can be a sender of";
152 type = listOf str;
153 };
154 ldap = mkOption {
155 description = ''
156 LDAP credentials for the host
157 '';
158 type = submodule {
159 options = {
160 password = mkOption { type = str; description = "Password for the LDAP connection"; };
161 dn = mkOption { type = str; description = "DN for the LDAP connection"; };
162 };
163 };
164 };
165 mx = mkOption {
166 description = "subdomain and priority for MX server";
167 default = { enable = false; };
168 type = submodule {
169 options = {
170 enable = mkEnableOption "Enable MX";
171 subdomain = mkOption { type = nullOr str; description = "Subdomain name (mx-*)"; };
172 priority = mkOption { type = nullOr int; description = "Priority"; };
173 };
174 };
175 };
176 ips = mkOption {
177 description = ''
178 attrs of ip4/ip6 grouped by section
179 '';
180 type = attrsOf (submodule {
181 options = {
182 alias = mkOption {
183 type = nullOr str;
184 default = null;
185 description = ''
186 alias to use in DNS for that group
187 '';
188 };
189 ip4 = mkOption {
190 type = listOf str;
191 default = [];
192 description = ''
193 ip4 addresses of the host
194 '';
195 };
196 ip6 = mkOption {
197 type = listOf str;
198 default = [];
199 description = ''
200 ip6 addresses of the host
201 '';
202 };
203 };
204 });
205 };
206 };
207 };
208 in
209 {
210 # Necessary for situations where flake gets included multiple times
211 key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
212
213 options.myEnv = {
214 servers = mkOption {
215 description = ''
216 Attrs of servers information in the cluster (not necessarily handled by nixops)
217 '';
218 default = {};
219 type = attrsOf hostEnv;
220 };
221 hetznerCloud = mkOption {
222 description = ''
223 Hetzner Cloud credential information
224 '';
225 type = submodule {
226 options = {
227 authToken = mkOption {
228 type = str;
229 description = ''
230 The API auth token.
231 '';
232 };
233 };
234 };
235 };
236 hetzner = mkOption {
237 description = ''
238 Hetzner credential information
239 '';
240 type = submodule {
241 options = {
242 user = mkOption { type = str; description = "User"; };
243 pass = mkOption { type = str; description = "Password"; };
244 };
245 };
246 };
247 sshd = mkOption {
248 description = ''
249 sshd service credential information
250 '';
251 type = submodule {
252 options = {
253 rootKeys = mkOption { type = attrsOf str; description = "Keys of root users"; };
254 ldap = mkOption {
255 description = ''
256 LDAP credentials for cn=ssh,ou=services,dc=immae,dc=eu dn
257 '';
258 type = submodule {
259 options = {
260 password = mkOption { description = "Password"; type = str; };
261 };
262 };
263 };
264 psql = mkOption {
265 description = ''
266 PSQL credentials for immae_auth_read
267 '';
268 type = submodule {
269 options = {
270 password = mkOption { description = "Password"; type = str; };
271 };
272 };
273 };
274 };
275 };
276 };
277 ports = mkOption {
278 description = ''
279 non-standard reserved ports. Must be unique!
280 '';
281 type = attrsOf port;
282 default = {};
283 apply = let
284 noDupl = x: builtins.length (builtins.attrValues x) == builtins.length (unique (builtins.attrValues x));
285 in
286 x: if isAttrs x && noDupl x then x else throw "Non unique values for ports";
287 };
288 httpd = mkOption {
289 description = ''
290 httpd service credential information
291 '';
292 type = submodule {
293 options = {
294 ldap = mkOption {
295 description = ''
296 LDAP credentials for cn=httpd,ou=services,dc=immae,dc=eu dn
297 '';
298 type = submodule {
299 options = {
300 password = mkOption { description = "Password"; type = str; };
301 };
302 };
303 };
304 };
305 };
306 };
307 smtp = mkOption {
308 type = submodule { options = smtpOptions; };
309 description = "SMTP configuration";
310 };
311 ldap = mkOption {
312 description = ''
313 LDAP server configuration
314 '';
315 type = submodule {
316 options = ldapOptions;
317 };
318 };
319 databases = mkOption {
320 description = "Databases configuration";
321 type = submodule {
322 options = {
323 mysql = mkOption {
324 type = submodule { options = mysqlOptions; };
325 description = "Mysql configuration";
326 };
327 redis = mkOption {
328 type = submodule { options = redisOptions; };
329 description = "Redis configuration";
330 };
331 postgresql = mkOption {
332 type = submodule { options = psqlOptions; };
333 description = "Postgresql configuration";
334 };
335 };
336 };
337 };
338 jabber = mkOption {
339 description = "Jabber configuration";
340 type = submodule {
341 options = {
342 postfix_user_filter = mkOption { type = str; description = "Postfix filter to get xmpp users"; };
343 ldap = mkLdapOptions "Jabber" {};
344 postgresql = mkPsqlOptions "Jabber";
345 };
346 };
347 };
348 realUsers = mkOption {
349 description = ''
350 Attrset of function taking pkgs as argument.
351 Real users settings, should provide a subattr of users.users.<name>
352 with at least: name, (hashed)Password, shell
353 '';
354 type = attrsOf unspecified;
355 };
356 users = mkOption {
357 description = "System and regular users uid/gid";
358 type = attrsOf (submodule {
359 options = {
360 uid = mkOption {
361 description = "user uid";
362 type = int;
363 };
364 gid = mkOption {
365 description = "user gid";
366 type = int;
367 };
368 };
369 });
370 };
371 dns = mkOption {
372 description = "DNS configuration";
373 type = submodule {
374 options = {
375 ns = mkOption {
376 description = "Attrs of NS servers group";
377 example = {
378 foo = {
379 "ns1.foo.com" = [ "198.51.100.10" "2001:db8:abcd::1" ];
380 "ns2.foo.com" = [ "198.51.100.15" "2001:db8:1234::1" ];
381 };
382 };
383 type = attrsOf (attrsOf (listOf str));
384 };
385 };
386 };
387 };
388 backup = mkOption {
389 description = ''
390 Remote backup with duplicity
391 '';
392 type = submodule {
393 options = {
394 password = mkOption { type = str; description = "Password for encrypting files"; };
395 remotes = mkOption {
396 type = attrsOf (submodule {
397 options = {
398 remote = mkOption {
399 type = functionTo str;
400 example = literalExample ''
401 bucket: "s3://some_host/${bucket}";
402 '';
403 description = ''
404 Function.
405 Takes a bucket name as argument and returns a url
406 '';
407 };
408 accessKeyId = mkOption { type = str; description = "Remote access-key"; };
409 secretAccessKey = mkOption { type = str; description = "Remote access secret"; };
410 };
411 });
412 };
413 };
414 };
415 };
416 zrepl_backup = mkOption {
417 type = submodule {
418 options = {
419 ssh_key = mkOption {
420 description = "SSH key information";
421 type = submodule {
422 options = {
423 public = mkOption { type = str; description = "Public part of the key"; };
424 private = mkOption { type = lines; description = "Private part of the key"; };
425 };
426 };
427 };
428 mysql = mkMysqlOptions "Zrepl" {};
429 certs = mkOption {
430 description = "Certificates";
431 type = attrsOf (submodule {
432 options = {
433 key = mkOption { type = str; description = "Key"; };
434 certificate = mkOption { type = str; description = "Certificate"; };
435 };
436 });
437 };
438 };
439 };
440 };
441 rsync_backup = mkOption {
442 description =''
443 Rsync backup configuration from controlled host
444 '';
445 type = submodule {
446 options = {
447 ssh_key = mkOption {
448 description = "SSH key information";
449 type = submodule {
450 options = {
451 public = mkOption { type = str; description = "Public part of the key"; };
452 private = mkOption { type = lines; description = "Private part of the key"; };
453 };
454 };
455 };
456 profiles = mkOption {
457 description = "Attrs of profiles to backup";
458 default = {};
459 type = attrsOf (submodule {
460 options = {
461 keep = mkOption { type = int; description = "Number of backups to keep"; };
462 check_command = mkOption { type = str; description = "command to check if backup needs to be done"; default = "backup"; };
463 login = mkOption { type = str; description = "Login to connect to host"; };
464 port = mkOption { type = str; default = "22"; description = "Port to connect to host"; };
465 host = mkOption { type = str; description = "Host to connect to"; };
466 host_key = mkOption { type = str; description = "Host key"; };
467 host_key_type = mkOption { type = str; description = "Host key type"; };
468 parts = mkOption {
469 description = "Parts to backup for this host";
470 type = attrsOf (submodule {
471 options = {
472 remote_folder = mkOption { type = path; description = "Remote folder to backup";};
473 exclude_from = mkOption {
474 type = listOf path;
475 default = [];
476 description = "List of folders/files to exclude from the backup";
477 };
478 files_from = mkOption {
479 type = listOf path;
480 default = [];
481 description = "List of folders/files to backup in the base folder";
482 };
483 args = mkOption {
484 type = nullOr str;
485 default = null;
486 description = "Extra arguments to pass to rsync";
487 };
488 };
489 });
490 };
491 };
492 });
493 };
494 };
495 };
496 };
497 monitoring = mkOption {
498 description = "Monitoring configuration";
499 type = submodule {
500 options = {
501 status_url = mkOption { type = str; description = "URL to push status to"; };
502 status_token = mkOption { type = str; description = "Token for the status url"; };
503 http_user_password = mkOption { type = str; description = "HTTP credentials to check services behind wall"; };
504 email = mkOption { type = str; description = "Admin E-mail"; };
505 ssh_public_key = mkOption { type = str; description = "SSH public key"; };
506 ssh_secret_key = mkOption { type = str; description = "SSH secret key"; };
507 imap_login = mkOption { type = str; description = "IMAP login"; };
508 imap_password = mkOption { type = str; description = "IMAP password"; };
509 eriomem_keys = mkOption { type = listOf (listOf str); description = "Eriomem keys"; default = []; };
510 ovh_sms = mkOption {
511 description = "OVH credentials for sms script";
512 type = submodule {
513 options = {
514 endpoint = mkOption { type = str; default = "ovh-eu"; description = "OVH endpoint"; };
515 application_key = mkOption { type = str; description = "Application key"; };
516 application_secret = mkOption { type = str; description = "Application secret"; };
517 consumer_key = mkOption { type = str; description = "Consumer key"; };
518 account = mkOption { type = str; description = "Account"; };
519 };
520 };
521 };
522 nrdp_tokens = mkOption { type = listOf str; description = "Tokens allowed to push status update"; };
523 apprise_urls = mkOption { type = str; description = "Apprise space-separated urls to push status update"; };
524 netdata_aggregator = mkOption { type = str; description = "Url where netdata information should be sent"; };
525 netdata_keys = mkOption { type = attrsOf str; description = "netdata host keys"; };
526 immae_contact = mkOption { type = str; description = "Immae Contact e-mail"; };
527 email_check = mkOption {
528 description = "Emails services to check";
529 type = attrsOf (submodule {
530 options = {
531 local = mkOption { type = bool; default = false; description = "Use local configuration"; };
532 port = mkOption { type = nullOr str; default = null; description = "Port to connect to ssh"; };
533 login = mkOption { type = nullOr str; default = null; description = "Login to connect to ssh"; };
534 targets = mkOption { type = listOf str; description = "Hosts to send E-mails to"; };
535 mail_address = mkOption { type = nullOr str; default = null; description = "E-mail recipient part to send e-mail to"; };
536 mail_domain = mkOption { type = nullOr str; default = null; description = "E-mail domain part to send e-mail to"; };
537 };
538 });
539 };
540 };
541 };
542 };
543 mpd = mkOption {
544 description = "MPD configuration";
545 type = submodule {
546 options = {
547 folder = mkOption { type = str; description = "Folder to serve from the MPD instance"; };
548 password = mkOption { type = str; description = "Password to connect to the MPD instance"; };
549 host = mkOption { type = str; description = "Host to connect to the MPD instance"; };
550 port = mkOption { type = str; description = "Port to connect to the MPD instance"; };
551 };
552 };
553 };
554 ftp = mkOption {
555 description = "FTP configuration";
556 type = submodule {
557 options = {
558 ldap = mkLdapOptions "FTP" {
559 proftpd_filter = mkOption { type = str; description = "Filter for proftpd listing in LDAP"; };
560 pure-ftpd_filter = mkOption { type = str; description = "Filter for pure-ftpd listing in LDAP"; };
561 };
562 };
563 };
564 };
565 vpn = mkOption {
566 description = "VPN configuration";
567 type = attrsOf (submodule {
568 options = {
569 prefix = mkOption { type = str; description = "ipv6 prefix for the vpn subnet"; };
570 privateKey = mkOption { type = str; description = "Private key for the host"; };
571 publicKey = mkOption { type = str; description = "Public key for the host"; };
572 };
573 });
574 };
575 mail = mkOption {
576 description = "Mail configuration";
577 type = submodule {
578 options = {
579 dmarc = mkOption {
580 description = "DMARC configuration";
581 type = submodule {
582 options = {
583 ignore_hosts = mkOption {
584 type = lines;
585 description = ''
586 Hosts to ignore when checking for dmarc
587 '';
588 };
589 };
590 };
591 };
592 dkim = mkOption {
593 description = "DKIM configuration";
594 type = attrsOf (submodule {
595 options = {
596 public = mkOption {
597 type = attrsOf str;
598 example = literalExample ''
599 {
600 v = "DKIM1";
601 k = "rsa";
602 p = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3w1a2aMxWw9+hdcmbqX4UevcVqr204y0K73Wdc7MPZiOOlUJQYsMNSYR1Y/SC7jmPKeitpcJCpQgn/cveJZbuikjjPLsDReHyFEYmC278ZLRTELHx6f1IXM8WE08JIRT69CfZiMi1rVcOh9qRT4F93PyjCauU8Y5hJjtg9ThsWwIDAQAB";
603 }
604 '';
605 description = "Public entry to put in DNS TXT field";
606 };
607 private = mkOption { type = nullOr str; default = null; description = "Private key"; };
608 };
609 });
610 };
611 postfix = mkOption {
612 description = "Postfix configuration";
613 type = submodule {
614 options = {
615 mysql = mkMysqlOptions "Postfix" {
616 password_encrypt = mkOption { type = str; description = "Key to encrypt relay password in database"; };
617 };
618 admins = mkOption {
619 description = ''
620 List of admins meant to receive common aliases
621 '';
622 type = listOf str;
623 };
624 common_aliases = mkOption {
625 description = ''
626 List of aliases common to all hosts, to forward to admins
627 '';
628 type = listOf str;
629 };
630 other_aliases = mkOption {
631 description = ''
632 Other list of aliases, to forward to admins
633 '';
634 type = listOf str;
635 };
636 };
637 };
638 };
639 dovecot = mkOption {
640 description = "Dovecot configuration";
641 type = submodule {
642 options = {
643 ldap = mkLdapOptions "Dovecot" {
644 pass_attrs = mkOption { type = str; description = "Password attribute in LDAP"; };
645 user_attrs = mkOption { type = str; description = "User attribute mapping in LDAP"; };
646 iterate_attrs = mkOption { type = str; description = "User attribute mapping for listing in LDAP"; };
647 iterate_filter = mkOption { type = str; description = "User attribute filter for listing in LDAP"; };
648 postfix_mailbox_filter = mkOption { type = str; description = "Postfix filter to get mailboxes"; };
649 };
650 };
651 };
652 };
653 rspamd = mkOption {
654 description = "rspamd configuration";
655 type = submodule {
656 options = {
657 redis = mkRedisOptions "Redis";
658 read_password_hashed = mkOption { type = str; description = "Hashed read password for rspamd"; };
659 write_password_hashed = mkOption { type = str; description = "Hashed write password for rspamd"; };
660 read_password = mkOption {
661 type = str;
662 description = "Read password for rspamd. Unused";
663 apply = x: "";
664 };
665 write_password = mkOption {
666 type = str;
667 description = "Write password for rspamd. Unused";
668 apply = x: "";
669 };
670 };
671 };
672 };
673 sympa = mkOption {
674 description = "Sympa configuration";
675 type = submodule {
676 options = {
677 listmasters = mkOption {
678 type = listOf str;
679 description = "Listmasters";
680 };
681 postgresql = mkPsqlOptions "Sympa";
682 data_sources = mkOption {
683 type = attrsOf str;
684 default = {};
685 description = "Data sources to make available to sympa";
686 };
687 scenari = mkOption {
688 type = attrsOf str;
689 default = {};
690 description = "Scenari to make available to sympa";
691 };
692 };
693 };
694 };
695 };
696 };
697 };
698 coturn = mkOption {
699 description = "Coturn configuration";
700 type = submodule {
701 options = {
702 auth_access_key = mkOption { type = str; description = "key to access coturn"; };
703 };
704 };
705 };
706 buildbot = mkOption {
707 description = "Buildbot configuration";
708 type = submodule {
709 options = {
710 ssh_key = mkOption {
711 description = "SSH key information";
712 type = submodule {
713 options = {
714 public = mkOption { type = str; description = "Public part of the key"; };
715 private = mkOption { type = lines; description = "Private part of the key"; };
716 };
717 };
718 };
719 workerPassword = mkOption { description = "Buildbot worker password"; type = str; };
720 user = mkOption {
721 description = "Buildbot user";
722 type = submodule {
723 options = {
724 uid = mkOption {
725 description = "user uid";
726 type = int;
727 };
728 gid = mkOption {
729 description = "user gid";
730 type = int;
731 };
732 };
733 };
734 };
735 ldap = mkOption {
736 description = "Ldap configuration for buildbot";
737 type = submodule {
738 options = {
739 password = mkOption { type = str; description = "Buildbot password"; };
740 };
741 };
742 };
743 projects = mkOption {
744 description = "Projects to make a buildbot for";
745 type = attrsOf (submodule {
746 options = {
747 name = mkOption { type = str; description = "Project name"; };
748 src = mkOption { type = path; description = "source of the project configuration"; };
749 packages = mkOption {
750 type = listOf package;
751 example = literalExample ''
752 [ pkgs.bash pkgs.git pkgs.gzip pkgs.openssh ];
753 '';
754 description = ''
755 Builds packages list to make available to buildbot project.
756 '';
757 };
758 pythonPathHome = mkOption { type = bool; description = "Whether to add project’s python home to python path"; };
759 workerPort = mkOption { type = port; description = "Port for the worker"; };
760 secrets = mkOption {
761 type = attrsOf lines;
762 description = "Secrets for the project to dump as files";
763 };
764 secretsDeps = mkOption {
765 type = listOf package;
766 default = [];
767 description = "Dependencies of file that will land in secrets";
768 };
769 environment = mkOption {
770 type = attrsOf str;
771 description = ''
772 Environment variables for the project.
773 BUILDBOT_ is prefixed to the variable names
774 '';
775 };
776 activationScript = mkOption {
777 type = lines;
778 description = ''
779 Activation script to run during deployment
780 '';
781 };
782 webhookTokens = mkOption {
783 type = nullOr (listOf str);
784 default = null;
785 description = ''
786 List of tokens allowed to push to project’s change_hook/base endpoint
787 '';
788 };
789 };
790 });
791 };
792 };
793 };
794 };
795 tools = mkOption {
796 description = "Tools configurations";
797 type = submodule {
798 options = {
799 contact = mkOption { type = str; description = "Contact e-mail address"; };
800 assets = mkOption {
801 default = {};
802 type = attrsOf (submodule {
803 options = {
804 assetType = mkOption { type = enum ["tgz" "url" "googleFont"]; default = "url"; description = "Type of asset"; };
805 tgzRemoveComponents = mkOption { type = int; default = 0; description = "Remove components when extracting"; };
806 url = mkOption { type = str; description = "URL to fetch"; };
807 sha256 = mkOption { type = str; description = "Hash of the url"; };
808 };
809 });
810 description = "Assets to provide on assets.immae.eu";
811 };
812 davical = mkOption {
813 description = "Davical configuration";
814 type = submodule {
815 options = {
816 postgresql = mkPsqlOptions "Davical";
817 ldap = mkLdapOptions "Davical" {};
818 };
819 };
820 };
821 diaspora = mkOption {
822 description = "Diaspora configuration";
823 type = submodule {
824 options = {
825 postgresql = mkPsqlOptions "Diaspora";
826 redis = mkRedisOptions "Diaspora";
827 ldap = mkLdapOptions "Diaspora" {};
828 secret_token = mkOption { type = str; description = "Secret token"; };
829 };
830 };
831 };
832 dmarc_reports = mkOption {
833 description = "DMARC reports configuration";
834 type = submodule {
835 options = {
836 mysql = mkMysqlOptions "DMARC" {};
837 anonymous_key = mkOption { type = str; description = "Anonymous hashing key"; };
838 };
839 };
840 };
841 etherpad-lite = mkOption {
842 description = "Etherpad configuration";
843 type = submodule {
844 options = {
845 postgresql = mkPsqlOptions "Etherpad";
846 ldap = mkLdapOptions "Etherpad" {
847 group_filter = mkOption { type = str; description = "Filter for groups"; };
848 };
849 adminPassword = mkOption { type = str; description = "Admin password for mypads / admin"; };
850 session_key = mkOption { type = str; description = "Session key"; };
851 api_key = mkOption { type = str; description = "API key"; };
852 };
853 };
854 };
855 gitolite = mkOption {
856 description = "Gitolite configuration";
857 type = submodule {
858 options = {
859 ldap = mkLdapOptions "Gitolite" {};
860 ssh_key = mkOption {
861 description = "SSH key information";
862 type = submodule {
863 options = {
864 public = mkOption { type = str; description = "Public part of the key"; };
865 private = mkOption { type = lines; description = "Private part of the key"; };
866 };
867 };
868 };
869 };
870 };
871 };
872 landing = mkOption {
873 description = "Landing configuration";
874 type = submodule {
875 options = {
876 postgresql = mkPsqlOptions "Landing";
877 };
878 };
879 };
880 kanboard = mkOption {
881 description = "Kanboard configuration";
882 type = submodule {
883 options = {
884 postgresql = mkPsqlOptions "Kanboard";
885 ldap = mkLdapOptions "Kanboard" {
886 admin_dn = mkOption { type = str; description = "Admin DN"; };
887 };
888 };
889 };
890 };
891 mantisbt = mkOption {
892 description = "Mantisbt configuration";
893 type = submodule {
894 options = {
895 postgresql = mkPsqlOptions "Mantisbt";
896 ldap = mkLdapOptions "Mantisbt" {};
897 master_salt = mkOption { type = str; description = "Master salt for password hash"; };
898 };
899 };
900 };
901 mastodon = mkOption {
902 description = "Mastodon configuration";
903 type = submodule {
904 options = {
905 postgresql = mkPsqlOptions "Mastodon";
906 redis = mkRedisOptions "Mastodon";
907 ldap = mkLdapOptions "Mastodon" {};
908 paperclip_secret = mkOption { type = str; description = "Paperclip secret"; };
909 otp_secret = mkOption { type = str; description = "OTP secret"; };
910 secret_key_base = mkOption { type = str; description = "Secret key base"; };
911 vapid = mkOption {
912 description = "vapid key";
913 type = submodule {
914 options = {
915 private = mkOption { type = str; description = "Private key"; };
916 public = mkOption { type = str; description = "Public key"; };
917 };
918 };
919 };
920 };
921 };
922 };
923 mediagoblin = mkOption {
924 description = "Mediagoblin configuration";
925 type = submodule {
926 options = {
927 postgresql = mkPsqlOptions "Mediagoblin";
928 redis = mkRedisOptions "Mediagoblin";
929 ldap = mkLdapOptions "Mediagoblin" {};
930 };
931 };
932 };
933 nextcloud = mkOption {
934 description = "Nextcloud configuration";
935 type = submodule {
936 options = {
937 postgresql = mkPsqlOptions "Nextcloud";
938 redis = mkRedisOptions "Nextcloud";
939 password_salt = mkOption { type = str; description = "Password salt"; };
940 instance_id = mkOption { type = str; description = "Instance ID"; };
941 secret = mkOption { type = str; description = "App secret"; };
942 };
943 };
944 };
945 peertube = mkOption {
946 description = "Peertube configuration";
947 type = submodule {
948 options = {
949 listenPort = mkOption { type = port; description = "Port to listen to"; };
950 postgresql = mkPsqlOptions "Peertube";
951 redis = mkRedisOptions "Peertube";
952 ldap = mkLdapOptions "Peertube" {};
953 };
954 };
955 };
956 phpldapadmin = mkOption {
957 description = "phpLdapAdmin configuration";
958 type = submodule {
959 options = {
960 ldap = mkLdapOptions "phpldapadmin" {};
961 };
962 };
963 };
964 rompr = mkOption {
965 description = "Rompr configuration";
966 type = submodule {
967 options = {
968 mpd = mkOption {
969 description = "MPD configuration";
970 type = submodule {
971 options = {
972 host = mkOption { type = str; description = "Host for MPD"; };
973 port = mkOption { type = port; description = "Port to access MPD host"; };
974 };
975 };
976 };
977 };
978 };
979 };
980 roundcubemail = mkOption {
981 description = "Roundcubemail configuration";
982 type = submodule {
983 options = {
984 postgresql = mkPsqlOptions "TT-RSS";
985 secret = mkOption { type = str; description = "Secret"; };
986 };
987 };
988 };
989 shaarli = mkOption {
990 description = "Shaarli configuration";
991 type = submodule {
992 options = {
993 ldap = mkLdapOptions "Shaarli" {};
994 };
995 };
996 };
997 status_engine = mkOption {
998 description = "Status Engine configuration";
999 type = submodule {
1000 options = {
1001 mysql = mkMysqlOptions "StatusEngine" {};
1002 ldap = mkLdapOptions "StatusEngine" {};
1003 };
1004 };
1005 };
1006 task = mkOption {
1007 description = "Taskwarrior configuration";
1008 type = submodule {
1009 options = {
1010 ldap = mkLdapOptions "Taskwarrior" {};
1011 taskwarrior-web = mkOption {
1012 description = "taskwarrior-web profiles";
1013 default = {};
1014 type = attrsOf (submodule {
1015 options = {
1016 uid = mkOption {
1017 type = listOf str;
1018 description = "List of ldap uids having access to this profile";
1019 };
1020 org = mkOption { type = str; description = "Taskd organisation"; };
1021 key = mkOption { type = str; description = "Taskd key"; };
1022 date = mkOption { type = str; description = "Preferred date format"; };
1023 };
1024 });
1025 };
1026 };
1027 };
1028 };
1029 ttrss = mkOption {
1030 description = "TT-RSS configuration";
1031 type = submodule {
1032 options = {
1033 postgresql = mkPsqlOptions "TT-RSS";
1034 ldap = mkLdapOptions "TT-RSS" {};
1035 };
1036 };
1037 };
1038 wallabag = mkOption {
1039 description = "Wallabag configuration";
1040 type = submodule {
1041 options = {
1042 postgresql = mkPsqlOptions "Wallabag";
1043 ldap = mkLdapOptions "Wallabag" {
1044 admin_filter = mkOption { type = str; description = "Admin users filter"; };
1045 };
1046 redis = mkRedisOptions "Wallabag";
1047 secret = mkOption { type = str; description = "App secret"; };
1048 };
1049 };
1050 };
1051 webhooks = mkOption {
1052 type = attrsOf str;
1053 description = "Mapping 'name'.php => script for webhooks";
1054 };
1055 csp_reports = mkOption {
1056 description = "CSP report configuration";
1057 type = submodule {
1058 options = {
1059 report_uri = mkOption { type = str; description = "URI to report CSP violations to"; };
1060 policies = mkOption { type = attrsOf str; description = "CSP policies to apply"; };
1061 };
1062 };
1063 };
1064 commento = mkOption {
1065 description = "Commento configuration";
1066 type = submodule {
1067 options = {
1068 listenPort = mkOption { type = port; description = "Port to listen to"; };
1069 postgresql = mkPsqlOptions "Commento";
1070 smtp = mkSmtpOptions "Commento";
1071 };
1072 };
1073 };
1074 cryptpad = mkOption {
1075 description = "Cryptpad configuration";
1076 type = submodule {
1077 options = {
1078 email = mkOption { type = str; description = "Admin e-mail"; };
1079 admins = mkOption { type = listOf str; description = "Instance admin public keys"; };
1080 port = mkOption { type = port; description = "Port to listen to"; };
1081 };
1082 };
1083 };
1084 ympd = mkOption {
1085 description = "Ympd configuration";
1086 type = submodule {
1087 options = {
1088 listenPort = mkOption { type = port; description = "Port to listen to"; };
1089 mpd = mkOption {
1090 description = "MPD configuration";
1091 type = submodule {
1092 options = {
1093 password = mkOption { type = str; description = "Password to access MPD host"; };
1094 host = mkOption { type = str; description = "Host for MPD"; };
1095 port = mkOption { type = port; description = "Port to access MPD host"; };
1096 };
1097 };
1098 };
1099 };
1100 };
1101 };
1102 umami = mkOption {
1103 description = "Umami configuration";
1104 type = submodule {
1105 options = {
1106 listenPort = mkOption { type = port; description = "Port to listen to"; };
1107 postgresql = mkPsqlOptions "Umami";
1108 hashSalt = mkOption { type = str; description = "Hash salt"; };
1109 };
1110 };
1111 };
1112 yourls = mkOption {
1113 description = "Yourls configuration";
1114 type = submodule {
1115 options = {
1116 mysql = mkMysqlOptions "Yourls" {};
1117 ldap = mkLdapOptions "Yourls" {};
1118 cookieKey = mkOption { type = str; description = "Cookie key"; };
1119 };
1120 };
1121 };
1122 };
1123 };
1124 };
1125 serverSpecific = mkOption { type = attrsOf unspecified; description = "Server specific configuration"; };
1126 };
1127 options.hostEnv = mkOption {
1128 readOnly = true;
1129 type = hostEnv;
1130 default = config.myEnv.servers."${name}";
1131 description = "Host environment";
1132 };
1133 };
1134 };
1135}
diff --git a/modules/private/mail/filter-rewrite-from.py b/flakes/private/mail-relay/filter-rewrite-from.py
index aad9c69..aad9c69 100755
--- a/modules/private/mail/filter-rewrite-from.py
+++ b/flakes/private/mail-relay/filter-rewrite-from.py
diff --git a/flakes/private/mail-relay/flake.lock b/flakes/private/mail-relay/flake.lock
new file mode 100644
index 0000000..bbb2011
--- /dev/null
+++ b/flakes/private/mail-relay/flake.lock
@@ -0,0 +1,36 @@
1{
2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
15 "root": {
16 "inputs": {
17 "environment": "environment",
18 "secrets": "secrets"
19 }
20 },
21 "secrets": {
22 "locked": {
23 "lastModified": 1,
24 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
25 "path": "../../secrets",
26 "type": "path"
27 },
28 "original": {
29 "path": "../../secrets",
30 "type": "path"
31 }
32 }
33 },
34 "root": "root",
35 "version": 7
36}
diff --git a/flakes/private/mail-relay/flake.nix b/flakes/private/mail-relay/flake.nix
new file mode 100644
index 0000000..639bd06
--- /dev/null
+++ b/flakes/private/mail-relay/flake.nix
@@ -0,0 +1,58 @@
1{
2 inputs.environment.url = "path:../environment";
3 inputs.secrets.url = "path:../../secrets";
4
5 outputs = { self, environment, secrets }: {
6 nixosModule = self.nixosModules.mail-relay;
7 nixosModules.mail-relay = { lib, pkgs, config, name, ... }:
8 {
9 imports = [
10 environment.nixosModule
11 secrets.nixosModule
12 ];
13 options.myServices.mailRelay.enable = lib.mkEnableOption "enable Mail relay services";
14 config = lib.mkIf config.myServices.mailRelay.enable {
15 secrets.keys."opensmtpd/creds" = {
16 user = "smtpd";
17 group = "smtpd";
18 permissions = "0400";
19 text = ''
20 eldiron ${name}:${config.hostEnv.ldap.password}
21 '';
22 };
23 users.users.smtpd.extraGroups = [ "keys" ];
24 services.opensmtpd = {
25 enable = true;
26 serverConfiguration = let
27 filter-rewrite-from = pkgs.runCommand "filter-rewrite-from.py" {
28 buildInputs = [ pkgs.python38 ];
29 } ''
30 cp ${./filter-rewrite-from.py} $out
31 patchShebangs $out
32 '';
33 in ''
34 table creds \
35 "${config.secrets.fullPaths."opensmtpd/creds"}"
36 # FIXME: filtering requires 6.6, uncomment following lines when
37 # upgrading
38 # filter "fixfrom" \
39 # proc-exec "${filter-rewrite-from} ${name}@immae.eu"
40 # listen on socket filter "fixfrom"
41 action "relay-rewrite-from" relay \
42 helo ${config.hostEnv.fqdn} \
43 host smtp+tls://eldiron@eldiron.immae.eu:587 \
44 auth <creds> \
45 mail-from ${name}@immae.eu
46 action "relay" relay \
47 helo ${config.hostEnv.fqdn} \
48 host smtp+tls://eldiron@eldiron.immae.eu:587 \
49 auth <creds>
50 match for any !mail-from "@immae.eu" action "relay-rewrite-from"
51 match for any mail-from "@immae.eu" action "relay"
52 '';
53 };
54 environment.systemPackages = [ config.services.opensmtpd.package ];
55 };
56 };
57 };
58}
diff --git a/flakes/private/milters/flake.lock b/flakes/private/milters/flake.lock
new file mode 100644
index 0000000..1a0c138
--- /dev/null
+++ b/flakes/private/milters/flake.lock
@@ -0,0 +1,186 @@
1{
2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
15 "files-watcher": {
16 "locked": {
17 "lastModified": 1,
18 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
19 "path": "../../files-watcher",
20 "type": "path"
21 },
22 "original": {
23 "path": "../../files-watcher",
24 "type": "path"
25 }
26 },
27 "flake-utils": {
28 "locked": {
29 "lastModified": 1609246779,
30 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
31 "owner": "numtide",
32 "repo": "flake-utils",
33 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
34 "type": "github"
35 },
36 "original": {
37 "owner": "numtide",
38 "repo": "flake-utils",
39 "type": "github"
40 }
41 },
42 "flake-utils_2": {
43 "locked": {
44 "lastModified": 1609246779,
45 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
46 "owner": "numtide",
47 "repo": "flake-utils",
48 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
49 "type": "github"
50 },
51 "original": {
52 "owner": "numtide",
53 "repo": "flake-utils",
54 "type": "github"
55 }
56 },
57 "myuids": {
58 "locked": {
59 "lastModified": 1,
60 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
61 "path": "../myuids",
62 "type": "path"
63 },
64 "original": {
65 "path": "../myuids",
66 "type": "path"
67 }
68 },
69 "myuids_2": {
70 "locked": {
71 "lastModified": 1,
72 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
73 "path": "../myuids",
74 "type": "path"
75 },
76 "original": {
77 "path": "../myuids",
78 "type": "path"
79 }
80 },
81 "nixpkgs": {
82 "locked": {
83 "lastModified": 1597943282,
84 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
85 "owner": "NixOS",
86 "repo": "nixpkgs",
87 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
88 "type": "github"
89 },
90 "original": {
91 "owner": "NixOS",
92 "repo": "nixpkgs",
93 "type": "github"
94 }
95 },
96 "nixpkgs_2": {
97 "locked": {
98 "lastModified": 1597943282,
99 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
100 "owner": "NixOS",
101 "repo": "nixpkgs",
102 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
103 "type": "github"
104 },
105 "original": {
106 "owner": "NixOS",
107 "repo": "nixpkgs",
108 "type": "github"
109 }
110 },
111 "openarc": {
112 "inputs": {
113 "flake-utils": "flake-utils",
114 "myuids": "myuids",
115 "nixpkgs": "nixpkgs",
116 "openarc": "openarc_2"
117 },
118 "locked": {
119 "lastModified": 1,
120 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
121 "path": "../../openarc",
122 "type": "path"
123 },
124 "original": {
125 "path": "../../openarc",
126 "type": "path"
127 }
128 },
129 "openarc_2": {
130 "flake": false,
131 "locked": {
132 "lastModified": 1537545083,
133 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
134 "owner": "trusteddomainproject",
135 "repo": "OpenARC",
136 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
137 "type": "github"
138 },
139 "original": {
140 "owner": "trusteddomainproject",
141 "repo": "OpenARC",
142 "type": "github"
143 }
144 },
145 "opendmarc": {
146 "inputs": {
147 "flake-utils": "flake-utils_2",
148 "myuids": "myuids_2",
149 "nixpkgs": "nixpkgs_2"
150 },
151 "locked": {
152 "lastModified": 1,
153 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
154 "path": "../../opendmarc",
155 "type": "path"
156 },
157 "original": {
158 "path": "../../opendmarc",
159 "type": "path"
160 }
161 },
162 "root": {
163 "inputs": {
164 "environment": "environment",
165 "files-watcher": "files-watcher",
166 "openarc": "openarc",
167 "opendmarc": "opendmarc",
168 "secrets": "secrets"
169 }
170 },
171 "secrets": {
172 "locked": {
173 "lastModified": 1,
174 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
175 "path": "../../secrets",
176 "type": "path"
177 },
178 "original": {
179 "path": "../../secrets",
180 "type": "path"
181 }
182 }
183 },
184 "root": "root",
185 "version": 7
186}
diff --git a/flakes/private/milters/flake.nix b/flakes/private/milters/flake.nix
new file mode 100644
index 0000000..c4de5b6
--- /dev/null
+++ b/flakes/private/milters/flake.nix
@@ -0,0 +1,106 @@
1{
2 inputs.secrets.url = "path:../../secrets";
3 inputs.environment.url = "path:../environment";
4 inputs.files-watcher.url = "path:../../files-watcher";
5 inputs.opendmarc.url = "path:../../opendmarc";
6 inputs.openarc.url = "path:../../openarc";
7 outputs = { self, secrets, environment, opendmarc, openarc, files-watcher }: {
8 nixosModule = self.nixosModules.milters;
9 nixosModules.milters = { lib, pkgs, config, nodes, ... }:
10 {
11 imports = [
12 secrets.nixosModule
13 environment.nixosModule
14 files-watcher.nixosModule
15 opendmarc.nixosModule
16 openarc.nixosModule
17 ];
18 options.myServices.mail.milters.enable = lib.mkEnableOption "enable Mail milters";
19 options.myServices.mail.milters.sockets = lib.mkOption {
20 type = lib.types.attrsOf lib.types.path;
21 default = {
22 opendkim = "/run/opendkim/opendkim.sock";
23 opendmarc = config.services.opendmarc.socket;
24 openarc = config.services.openarc.socket;
25 };
26 readOnly = true;
27 description = ''
28 milters sockets
29 '';
30 };
31 config = lib.mkIf config.myServices.mail.milters.enable {
32 secrets.keys = {
33 "opendkim" = {
34 isDir = true;
35 user = config.services.opendkim.user;
36 group = config.services.opendkim.group;
37 permissions = "0550";
38 };
39 "opendkim/eldiron.private" = {
40 user = config.services.opendkim.user;
41 group = config.services.opendkim.group;
42 permissions = "0400";
43 text = config.myEnv.mail.dkim.eldiron.private;
44 };
45 };
46 users.users."${config.services.opendkim.user}".extraGroups = [ "keys" ];
47 services.opendkim = {
48 enable = true;
49 socket = "local:${config.myServices.mail.milters.sockets.opendkim}";
50 domains =
51 let
52 getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) p.emailPolicies;
53 bydomain = builtins.mapAttrs (n: getDomains) nodes.eldiron.config.myServices.dns.zones;
54 domains' = lib.flatten (builtins.attrValues bydomain);
55 in
56 builtins.concatStringsSep "," domains';
57 keyPath = config.secrets.fullPaths."opendkim";
58 selector = "eldiron";
59 configFile = pkgs.writeText "opendkim.conf" ''
60 SubDomains yes
61 UMask 002
62 AlwaysAddARHeader yes
63 '';
64 group = config.services.postfix.group;
65 };
66 systemd.services.opendkim.serviceConfig.Slice = "mail.slice";
67 systemd.services.opendkim.preStart = lib.mkBefore ''
68 # Skip the prestart script as keys are handled in secrets
69 exit 0
70 '';
71 services.filesWatcher.opendkim = {
72 restart = true;
73 paths = [
74 config.secrets.fullPaths."opendkim/eldiron.private"
75 ];
76 };
77
78 systemd.services.milter_verify_from = {
79 description = "Verify from milter";
80 after = [ "network.target" ];
81 wantedBy = [ "multi-user.target" ];
82
83 serviceConfig = {
84 Slice = "mail.slice";
85 User = "postfix";
86 Group = "postfix";
87 ExecStart = let
88 pymilter = with pkgs.python38Packages; buildPythonPackage rec {
89 pname = "pymilter";
90 version = "1.0.4";
91 src = fetchPypi {
92 inherit pname version;
93 sha256 = "1bpcvq7d72q0zi7c8h5knhasywwz9gxc23n9fxmw874n5k8hsn7k";
94 };
95 doCheck = false;
96 buildInputs = [ pkgs.libmilter ];
97 };
98 python = pkgs.python38.withPackages (p: [ pymilter ]);
99 in "${python}/bin/python ${./verify_from.py} -s /run/milter_verify_from/verify_from.sock";
100 RuntimeDirectory = "milter_verify_from";
101 };
102 };
103 };
104 };
105 };
106}
diff --git a/modules/private/mail/verify_from.py b/flakes/private/milters/verify_from.py
index b75001e..b75001e 100755
--- a/modules/private/mail/verify_from.py
+++ b/flakes/private/milters/verify_from.py
diff --git a/flakes/private/monitoring/flake.lock b/flakes/private/monitoring/flake.lock
new file mode 100644
index 0000000..2e156fb
--- /dev/null
+++ b/flakes/private/monitoring/flake.lock
@@ -0,0 +1,67 @@
1{
2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
15 "naemon": {
16 "locked": {
17 "lastModified": 1,
18 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
19 "path": "../../naemon",
20 "type": "path"
21 },
22 "original": {
23 "path": "../../naemon",
24 "type": "path"
25 }
26 },
27 "nixpkgs-lib": {
28 "locked": {
29 "dir": "lib",
30 "lastModified": 1691269286,
31 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
32 "owner": "NixOS",
33 "repo": "nixpkgs",
34 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
35 "type": "github"
36 },
37 "original": {
38 "dir": "lib",
39 "owner": "NixOS",
40 "repo": "nixpkgs",
41 "type": "github"
42 }
43 },
44 "root": {
45 "inputs": {
46 "environment": "environment",
47 "naemon": "naemon",
48 "nixpkgs-lib": "nixpkgs-lib",
49 "secrets": "secrets"
50 }
51 },
52 "secrets": {
53 "locked": {
54 "lastModified": 1,
55 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
56 "path": "../../secrets",
57 "type": "path"
58 },
59 "original": {
60 "path": "../../secrets",
61 "type": "path"
62 }
63 }
64 },
65 "root": "root",
66 "version": 7
67}
diff --git a/flakes/private/monitoring/flake.nix b/flakes/private/monitoring/flake.nix
new file mode 100644
index 0000000..b7c3997
--- /dev/null
+++ b/flakes/private/monitoring/flake.nix
@@ -0,0 +1,267 @@
1{
2 inputs = {
3 environment.url = "path:../environment";
4 secrets.url = "path:../../secrets";
5 naemon.url = "path:../../naemon";
6 nixpkgs-lib.url = "github:NixOS/nixpkgs?dir=lib";
7 };
8 outputs = { self, environment, nixpkgs-lib, secrets, naemon }: {
9 nagios-cli-config = ./nagios-cli.cfg;
10 lib = rec {
11 expandedObject = kind: object: objects:
12 if object ? "use"
13 then expandedObject kind objects.templates.${kind}.${object.use} objects // object
14 else object;
15
16 objectsCommon = import ./objects_common.nix;
17 toObjects = import ./to_objects.nix { inherit (nixpkgs-lib) lib; };
18
19 toMasterPassiveObject = svcTemplate: freshnessThresholdMultiplier: objects:
20 {
21 service = with nixpkgs-lib.lib; map (s:
22 {
23 host_name = (expandedObject "service" s objects).host_name;
24 use = svcTemplate;
25 retry_interval = "1";
26 freshness_threshold = let
27 fs = expandedObject "service" s objects;
28 in if builtins.isInt fs.check_interval
29 then builtins.ceil (freshnessThresholdMultiplier * 60 * fs.check_interval)
30 else fs.check_interval;
31 }
32 // filterAttrs (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_") s
33 // mapAttrs'
34 (n: nameValuePair (removePrefix "__passive_" n))
35 (filterAttrs (k: _: hasPrefix "__passive_" k) s)
36 ) objects.service;
37 host = objects.host;
38 };
39
40 emailCheck = allCfg: host: hostFQDN: let
41 cfg = allCfg."${host}";
42 reverseTargets = builtins.attrNames (nixpkgs-lib.lib.filterAttrs (k: v: builtins.elem host v.targets) allCfg);
43 to_email = cfg': host':
44 let sep = if nixpkgs-lib.lib.hasInfix "+" cfg'.mail_address then "_" else "+";
45 in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}";
46 mails_to_send = builtins.concatStringsSep "," (map (n: to_email allCfg."${n}" host) cfg.targets);
47 mails_to_receive = builtins.concatStringsSep "," (map (n: "${to_email cfg n}:${n}") reverseTargets);
48 command = if cfg.local
49 then
50 [ "check_emails_local" "/var/lib/naemon/checks/email" mails_to_send mails_to_receive ]
51 else
52 [ "check_emails" cfg.login cfg.port mails_to_send mails_to_receive ];
53 in
54 {
55 service_description = "${hostFQDN} email service is active";
56 use = "mail-service";
57 host_name = hostFQDN;
58 servicegroups = "webstatus-email";
59 check_command = command;
60 };
61 };
62 nixosModule = self.nixosModules.monitoring;
63 nixosModules.monitoring = { config, pkgs, lib, ... }:
64 let
65 cfg = config.myServices.monitoring;
66 allPluginsConfig = import ./myplugins.nix {
67 inherit pkgs lib config;
68 sudo = "/run/wrappers/bin/sudo";
69 };
70 mypluginsConfig = lib.mapAttrs (n: v:
71 if builtins.isFunction v
72 then v (cfg.pluginsArgs."${n}" or {})
73 else v
74 ) (lib.getAttrs cfg.activatedPlugins allPluginsConfig);
75 myplugins = let
76 mypluginsChunk = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: v.chunk or "") mypluginsConfig);
77 in pkgs.runCommand "buildplugins" {
78 buildInputs = [ pkgs.makeWrapper pkgs.perl ];
79 } ''
80 mkdir $out
81 ${mypluginsChunk}
82 '';
83 objectsModule = with lib.types; submodule {
84 options = {
85 command = lib.mkOption {
86 type = attrsOf str;
87 default = {};
88 description = "Command definitions";
89 };
90
91 host = lib.mkOption {
92 type = attrsOf (attrsOf str);
93 default = {};
94 description = "Host definitions";
95 };
96 hostgroup = lib.mkOption {
97 type = attrsOf (attrsOf str);
98 default = {};
99 description = "Host group definitions";
100 };
101 hostdependency = lib.mkOption {
102 type = listOf (attrsOf str);
103 default = [];
104 description = "Host dependency definitions";
105 };
106
107 service = lib.mkOption {
108 type = listOf (attrsOf (oneOf [ str (listOf str) int ]));
109 # str -> string
110 # listOf str -> list to be concatenated with "!"
111 # int -> toString
112 default = [];
113 description = "Service definitions";
114 };
115 servicegroup = lib.mkOption {
116 type = attrsOf (attrsOf str);
117 default = {};
118 description = "Service group definitions";
119 };
120 servicedependency = lib.mkOption {
121 type = listOf (attrsOf str);
122 default = [];
123 description = "Service dependency definitions";
124 };
125
126 contact = lib.mkOption {
127 type = attrsOf (attrsOf str);
128 default = {};
129 description = "Contact definitions";
130 };
131 contactgroup = lib.mkOption {
132 type = attrsOf (attrsOf str);
133 default = {};
134 description = "Contact group definitions";
135 };
136
137 timeperiod = lib.mkOption {
138 type = attrsOf (attrsOf str);
139 default = {};
140 description = "Time period definitions";
141 };
142
143 templates = lib.mkOption {
144 description = "Template definitions";
145 default = {};
146 type = submodule {
147 options = {
148 service = lib.mkOption { type = attrsOf (attrsOf (either str int)); default = {}; };
149 contact = lib.mkOption { type = attrsOf (attrsOf str); default = {}; };
150 host = lib.mkOption { type = attrsOf (attrsOf str); default = {}; };
151 };
152 };
153 };
154 };
155 };
156 in
157 {
158 options = {
159 myServices.monitoring = {
160 enable = lib.mkOption {
161 type = lib.types.bool;
162 default = false;
163 description = ''
164 Whether to enable monitoring.
165 '';
166 };
167 master = lib.mkOption {
168 type = lib.types.bool;
169 default = false;
170 description = ''
171 This instance is the master instance
172 '';
173 };
174 pluginsArgs = lib.mkOption {
175 default = {};
176 description = "Arguments to pass to the naemon plugin configuration";
177 type = lib.types.attrsOf (lib.types.attrsOf lib.types.unspecified);
178 };
179 activatedPlugins = lib.mkOption {
180 default = [];
181 description = "List of naemon plugins to activate";
182 type = lib.types.listOf (lib.types.enum (builtins.attrNames allPluginsConfig));
183 };
184 fromMasterActivatedPlugins = lib.mkOption {
185 default = [];
186 description = "List of naemon plugins to activate from master";
187 type = lib.types.listOf (lib.types.str);
188 };
189 resources = lib.mkOption {
190 default = {};
191 description = "List of additionnal resources elements";
192 type = lib.types.attrsOf (lib.types.str);
193 };
194 objects = lib.mkOption {
195 default = {};
196 description = "Object definitions";
197 type = objectsModule;
198 };
199 fromMasterObjects = lib.mkOption {
200 default = {};
201 description = "Object definitions of checks that should be executed from master";
202 type = objectsModule;
203 };
204 };
205 };
206
207 imports = [
208 environment.nixosModule
209 secrets.nixosModule
210 naemon.nixosModule
211 ];
212 config = lib.mkIf cfg.enable {
213 myServices.monitoring.objects.command =
214 lib.foldr (v: o: o // (v.commands or {})) {} (builtins.attrValues mypluginsConfig);
215
216 security.sudo.extraRules = let
217 pluginsSudo = lib.lists.remove null (lib.mapAttrsToList (k: v:
218 if (v ? sudo)
219 then ({ users = [ "naemon" ]; } // (v.sudo myplugins))
220 else null) mypluginsConfig);
221 in pluginsSudo;
222
223 environment.etc.cnagios.source = "${pkgs.cnagios}/share/doc/cnagios";
224 environment.systemPackages = let
225 nagios-cli = pkgs.writeScriptBin "nagios-cli" ''
226 #!${pkgs.stdenv.shell}
227 sudo -u naemon ${pkgs.nagios-cli}/bin/nagios-cli -c ${self.nagios-cli-config}
228 '';
229 in [
230 pkgs.cnagios
231 nagios-cli
232 ];
233 secrets.keys = {
234 "naemon/id_rsa" = {
235 user = "naemon";
236 group = "naemon";
237 permissions = "0400";
238 text = config.myEnv.monitoring.ssh_secret_key;
239 };
240 "naemon/resources.cfg".keyDependencies = [ myplugins ];
241 };
242 services.naemon = {
243 enable = true;
244 extraConfig = ''
245 use_syslog=1
246 log_initial_states=1
247 date_format=iso8601
248 admin_email=${config.myEnv.monitoring.email}
249 '' + lib.optionalString (!cfg.master) ''
250 obsess_over_services=1
251 ocsp_command=notify-master
252 '';
253 extraResource = let
254 resources = [cfg.resources or {}] ++ (lib.mapAttrsToList (k: v: v.resources or {}) mypluginsConfig);
255 joined = lib.zipAttrsWith (n: v: if builtins.length (lib.unique v) == 1 then builtins.head v else abort "Non-unique resources names") resources;
256 joinedStr = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "$" + "${k}$=${v}") joined);
257 in ''
258 $USER2$=${myplugins}
259 ${joinedStr}
260 '';
261 objectDefs =
262 self.lib.toObjects cfg.objects;
263 };
264 };
265 };
266 };
267}
diff --git a/flakes/private/monitoring/myplugins.nix b/flakes/private/monitoring/myplugins.nix
new file mode 100644
index 0000000..35730bb
--- /dev/null
+++ b/flakes/private/monitoring/myplugins.nix
@@ -0,0 +1,400 @@
1{ sudo, pkgs, lib, config }:
2let
3 cfg = config.myServices.monitoring;
4in
5{
6 notify-secondary = {
7 resources = {
8 USER200 = config.myEnv.monitoring.status_url;
9 USER201 = config.myEnv.monitoring.status_token;
10 };
11 commands = {
12 notify-master = "$USER2$/send_nrdp.sh -u \"$USER200$\" -t \"$USER201$\" -H \"$HOSTADDRESS$\" -s \"$SERVICEDESC$\" -S \"$SERVICESTATEID$\" -o \"$SERVICEOUTPUT$ | $SERVICEPERFDATA$\"";
13 };
14 chunk = ''
15 cp ${./plugins}/send_nrdp.sh $out
16 patchShebangs $out/send_nrdp.sh
17 wrapProgram $out/send_nrdp.sh --prefix PATH : ${lib.makeBinPath [
18 pkgs.curl pkgs.jq
19 ]}
20 '';
21 };
22 notify-primary = {
23 resources = {
24 USER210 = config.myEnv.monitoring.apprise_urls;
25 };
26 commands = {
27 # $OVE is to force naemon to run via shell instead of execve which fails here
28 notify-host-by-email = "ADMINEMAIL=\"$ADMINEMAIL$\" SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" HOSTSTATE=\"$HOSTSTATE$\" HOSTOUTPUT=\"$HOSTOUTPUT$\" $USER2$/notify_by_email host \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE";
29 # $OVE is to force naemon to run via shell instead of execve which fails here
30 notify-service-by-email = "ADMINEMAIL=\"$ADMINEMAIL$\" SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_email service \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE";
31 notify-host-by-apprise = "HOST=\"$HOSTALIAS$\" NOTIFICATIONTYPE=\"$NOTIFICATIONTYPE$\" HOSTSTATE=\"$HOSTSTATE$\" HOSTOUTPUT=\"$HOSTOUTPUT$\" $USER2$/notify_by_apprise host \"$ARG1$\"";
32 notify-service-by-apprise = "HOST=\"$HOSTALIAS$\" NOTIFICATIONTYPE=\"$NOTIFICATIONTYPE$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_apprise service \"$ARG1$\"";
33 };
34 chunk = ''
35 cp ${./plugins}/{notify_by_email,notify_by_apprise} $out
36 patchShebangs $out/{notify_by_email,notify_by_apprise}
37 wrapProgram $out/notify_by_email --prefix PATH : ${lib.makeBinPath [
38 pkgs.mailutils
39 ]}
40 wrapProgram $out/notify_by_apprise --prefix PATH : ${lib.makeBinPath [
41 pkgs.apprise
42 ]}
43 '';
44 };
45 bandwidth = {
46 commands = {
47 check_local_bandwidth = "$USER2$/check_bandwidth -i=$ARG1$ -w $ARG2$ -c $ARG3$";
48 };
49 chunk = ''
50 cp ${./plugins}/check_bandwidth $out/
51 patchShebangs $out/check_bandwidth
52 wrapProgram $out/check_bandwidth --prefix PATH : ${lib.makeBinPath [
53 pkgs.iproute pkgs.bc
54 ]}
55 '';
56 };
57 command = {
58 commands = {
59 check_command_match = "$USER2$/check_command -c \"$ARG1$\" -C \"$ARG2$\" $ARG3$";
60 check_command_output = "$USER2$/check_command -c \"$ARG1$\" -s 0 -o \"$ARG2$\" $ARG3$";
61 check_command_status = "$USER2$/check_command -c \"$ARG1$\" -s \"$ARG2$\" $ARG3$";
62 };
63 chunk = ''
64 cp ${./plugins}/check_command $out/
65 patchShebangs $out/check_command
66 wrapProgram $out/check_command --prefix PATH : ${config.security.wrapperDir}
67 '';
68 };
69 dns = {
70 commands = {
71 check_dns = "$USER1$/check_dns -H $ARG1$ -s $HOSTADDRESS$ $ARG2$";
72 check_external_dns = "$USER1$/check_dns -H $ARG2$ -s $ARG1$ $ARG3$";
73 };
74 };
75 mdadm = {
76 commands = {
77 check_mdadm = "$USER2$/check_command -c \"${pkgs.mdadm}/bin/mdadm --monitor --scan -1\" -s 0 -o \"^$\" -r root";
78 };
79 sudo = _: {
80 commands = [
81 { command = "${pkgs.mdadm}/bin/mdadm --monitor --scan -1"; options = [ "NOPASSWD" ]; }
82 ];
83 runAs = "root";
84 };
85 };
86 postfix = {
87 commands = {
88 check_mailq = "$USER1$/check_mailq -s -w 1 -c 2";
89 };
90 sudo = _: {
91 commands = [
92 { command = "${pkgs.postfix}/bin/mailq"; options = [ "NOPASSWD" ]; }
93 ];
94 runAs = "root";
95 };
96 };
97 emails = {
98 resources = {
99 USER203 = config.secrets.fullPaths."naemon/id_rsa";
100 };
101 commands = {
102 check_emails = "$USER2$/check_emails -H $HOSTADDRESS$ -i $USER203$ -l $ARG1$ -p $ARG2$ -s $ARG3$ -f $ARG4$";
103 check_emails_local = "$USER2$/check_emails -H $HOSTADDRESS$ -n $ARG1$ -r $ADMINEMAIL$ -s $ARG2$ -f $ARG3$";
104 };
105 chunk = let
106 send_mails = pkgs.runCommand "send_mails" {
107 buildInputs = [ pkgs.makeWrapper ];
108 } ''
109 mkdir -p $out/bin
110 cp ${./send_mails} $out/bin/send_mails
111 patchShebangs $out
112 wrapProgram $out/bin/send_mails --prefix PATH : ${lib.makeBinPath [
113 pkgs.mailutils
114 ]}
115 '';
116 in ''
117 cp ${./plugins}/check_emails $out/
118 patchShebangs $out/check_emails
119 wrapProgram $out/check_emails --prefix PATH : ${lib.makeBinPath [
120 pkgs.openssh send_mails
121 ]} --prefix PERL5LIB : ${pkgs.perlPackages.makePerlPath [
122 pkgs.perlPackages.TimeDate
123 ]}
124 '';
125 };
126 eriomem = {
127 resources = {
128 USER208 = builtins.concatStringsSep "," (map (builtins.concatStringsSep ":") config.myEnv.monitoring.eriomem_keys);
129 };
130 commands = {
131 check_backup_eriomem = "$USER2$/check_eriomem $USER208$";
132 check_backup_eriomem_age = "$USER2$/check_backup_eriomem_age $ARG1$";
133 };
134 chunk = ''
135 cp ${./plugins}/check_eriomem $out/
136 patchShebangs $out/check_eriomem
137 wrapProgram $out/check_eriomem --prefix PATH : ${lib.makeBinPath [
138 pkgs.s3cmd pkgs.python38
139 ]}
140 cp ${./plugins}/check_backup_age $out/check_backup_eriomem_age
141 patchShebangs $out/check_backup_eriomem_age
142 wrapProgram $out/check_backup_eriomem_age --prefix PATH : ${lib.makeBinPath [
143 pkgs.duplicity
144 ]} --set SECRETS_PATH ${lib.optionalString cfg.master config.secrets.fullPaths."eriomem_access_key"}
145 '';
146 };
147 file_date = {
148 commands = {
149 check_last_file_date = "${sudo} -u \"$ARG3$\" $USER2$/check_last_file_date \"$ARG1$\" \"$ARG2$\"";
150 };
151 chunk = ''
152 cp ${./plugins}/check_last_file_date $out/
153 patchShebangs $out/check_last_file_date
154 '';
155 sudo = myplugins: {
156 commands = [
157 { command = "${myplugins}/check_last_file_date /backup2/*"; options = [ "NOPASSWD" ]; }
158 ];
159 runAs = "ALL";
160 };
161 };
162 ftp = {
163 commands = {
164 check_ftp_database = "$USER2$/check_ftp_database";
165 };
166 chunk = ''
167 cp ${./plugins}/check_ftp_database $out/
168 patchShebangs $out/check_ftp_database
169 wrapProgram $out/check_ftp_database --prefix PATH : ${lib.makeBinPath [
170 pkgs.lftp
171 ]}
172 '';
173 };
174 git = {
175 resources = {
176 USER203 = config.secrets.fullPaths."naemon/id_rsa";
177 };
178 commands = {
179 check_git = "$USER2$/check_git $USER203$";
180 };
181 chunk = ''
182 cp ${./plugins}/check_git $out/
183 patchShebangs $out/check_git
184 wrapProgram $out/check_git --prefix PATH : ${lib.makeBinPath [
185 pkgs.git pkgs.openssh
186 ]}
187 '';
188 };
189 http = {
190 resources = {
191 USER202 = config.myEnv.monitoring.http_user_password;
192 };
193 commands = {
194 check_http = "$USER1$/check_http --sni -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
195 check_https = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
196 check_https_4 = "$USER1$/check_http -4 --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
197 check_https_6 = "$USER1$/check_http -6 --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
198 check_https_auth = "$USER1$/check_http --sni --ssl -a \"$USER202$\" -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
199 check_https_certificate = "$USER1$/check_http --sni --ssl -H \"$ARG1$\" -C 21,15";
200 check_https_code = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -e \"$ARG3$\" -r \"$ARG4$\"";
201 };
202 };
203 imap = {
204 resources = {
205 USER204 = config.myEnv.monitoring.imap_login;
206 USER205 = config.myEnv.monitoring.imap_password;
207 };
208 commands = {
209 check_imap_connection = "$USER2$/check_imap_connection -u \"$USER204$\" -p \"$USER205$\" -H \"imap.immae.eu:143\"";
210 };
211 chunk = ''
212 cp ${./plugins}/check_imap_connection $out/
213 patchShebangs $out/check_imap_connection
214 wrapProgram $out/check_imap_connection --prefix PATH : ${lib.makeBinPath [
215 pkgs.openssl
216 ]}
217 '';
218 };
219 megaraid = let
220 megacli = pkgs.megacli.overrideAttrs(old: { meta = old.meta // { license = null; }; });
221 in {
222 commands = {
223 check_megaraid = "$USER2$/check_megaraid_sas --sudo";
224 };
225 chunk = let
226 megaCliPlugin = pkgs.runCommand "megaCliPlugin" {
227 plugin = pkgs.fetchurl {
228 name = "check_megaraid_sas";
229 url = "https://exchange.nagios.org/components/com_mtree/attachment.php?link_id=6381&cf_id=24";
230 sha256 = "0yf60p4c0hb4q3fng9fc14qc89bqm0f1sijayzygadaqcl44jx4p";
231 };
232 } ''
233 mkdir $out
234 cp $plugin $out/check_megaraid_sas
235 chmod +x $out/check_megaraid_sas
236 patchShebangs $out
237 substituteInPlace $out/check_megaraid_sas --replace /usr/sbin/MegaCli ${megacli}/bin/MegaCli64
238 substituteInPlace $out/check_megaraid_sas --replace 'sudo $megacli' '${sudo} $megacli'
239 sed -i -e "s/use utils qw(%ERRORS);/my %ERRORS = ('OK' => 0, 'WARNING' => 1, 'CRITICAL' => 2, 'UNKNOWN' => 3);/" $out/check_megaraid_sas
240 '';
241 in ''
242 cp ${megaCliPlugin}/check_megaraid_sas $out/
243 patchShebangs $out/check_megaraid_sas
244 '';
245 sudo = _: {
246 commands = [
247 { command = "${megacli}/bin/MegaCli64"; options = [ "NOPASSWD" ]; }
248 ];
249 runAs = "root";
250 };
251 };
252 memory = {
253 commands = {
254 check_memory = "$USER2$/check_mem.sh -w $ARG1$ -c $ARG2$";
255 };
256 chunk = ''
257 cp ${./plugins}/check_mem.sh $out/
258 patchShebangs $out/check_mem.sh
259 wrapProgram $out/check_mem.sh --prefix PATH : ${lib.makeBinPath [
260 pkgs.gnugrep pkgs.gawk pkgs.procps
261 ]}
262 '';
263 };
264 mysql = {
265 commands = {
266 check_mysql_replication = "${sudo} -u mysql $USER2$/check_mysql_replication \"$ARG1$\" \"$ARG2$\"";
267 };
268 chunk = ''
269 cp ${./plugins}/check_mysql_replication $out/
270 patchShebangs $out/check_mysql_replication
271 wrapProgram $out/check_mysql_replication --prefix PATH : ${lib.makeBinPath [
272 pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.mariadb
273 ]}
274 '';
275 sudo = myplugins: {
276 commands = [
277 { command = "${myplugins}/check_mysql_replication *"; options = [ "NOPASSWD" ]; }
278 ];
279 runAs = "mysql";
280 };
281 };
282 openldap = {
283 commands = {
284 check_openldap_replication = "${sudo} -u openldap $USER2$/check_openldap_replication \"$ARG1$\" \"$ARG2$\" \"$ARG3$\" \"$ARG4$\" \"$ARG5$\"";
285 };
286 chunk = ''
287 cp ${./plugins}/check_openldap_replication $out/
288 patchShebangs $out/check_openldap_replication
289 wrapProgram $out/check_openldap_replication --prefix PATH : ${lib.makeBinPath [
290 pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.openldap
291 ]}
292 '';
293 sudo = myplugins: {
294 commands = [
295 { command = "${myplugins}/check_openldap_replication *"; options = [ "NOPASSWD" ]; }
296 ];
297 runAs = "openldap";
298 };
299 };
300 ovh = {
301 resources = {
302 USER209 = builtins.concatStringsSep "," [
303 config.myEnv.monitoring.ovh_sms.endpoint
304 config.myEnv.monitoring.ovh_sms.application_key
305 config.myEnv.monitoring.ovh_sms.application_secret
306 config.myEnv.monitoring.ovh_sms.consumer_key
307 config.myEnv.monitoring.ovh_sms.account
308 ];
309 };
310 commands = {
311 check_backup_ovh_age = "$USER2$/check_backup_ovh_age $ARG1$";
312 check_ovh_sms = "$USER2$/check_ovh_sms \"$USER209$\"";
313 };
314 chunk = ''
315 cp ${./plugins}/check_backup_age $out/check_backup_ovh_age
316 patchShebangs $out/check_backup_ovh_age
317 wrapProgram $out/check_backup_ovh_age --prefix PATH : ${lib.makeBinPath [
318 pkgs.duplicity
319 ]} --set SECRETS_PATH ${lib.optionalString cfg.master config.secrets.fullPaths."ovh_access_key"}
320 cp ${./plugins}/check_ovh_sms $out/
321 patchShebangs $out/check_ovh_sms
322 wrapProgram $out/check_ovh_sms --prefix PATH : ${lib.makeBinPath [
323 (pkgs.python38.withPackages (ps: [ps.ovh]))
324 ]}
325 '';
326 };
327 postgresql = { package }: {
328 commands = {
329 check_postgresql_replication = "${sudo} -u postgres $USER2$/check_postgres_replication \"$ARG1$\" \"$ARG2$\" \"$ARG3$\"";
330 check_postgresql_database_count = "$USER2$/check_postgres_database_count \"$ARG1$\" \"$ARG2$\" \"$ARG3$\"";
331 };
332 chunk = ''
333 cp ${./plugins}/check_postgres_replication $out/
334 patchShebangs $out/check_postgres_replication
335 wrapProgram $out/check_postgres_replication --prefix PATH : ${lib.makeBinPath [
336 package
337 ]}
338 cp ${./plugins}/check_postgres_database_count $out/
339 patchShebangs $out/check_postgres_database_count
340 wrapProgram $out/check_postgres_database_count --prefix PATH : ${lib.makeBinPath [
341 package
342 ]}
343 '';
344
345 sudo = myplugins: {
346 commands = [
347 { command = "${myplugins}/check_postgres_replication *"; options = [ "NOPASSWD" ]; }
348 ];
349 runAs = "postgres";
350 };
351 };
352 redis = {
353 commands = {
354 check_redis_replication = "${sudo} -u redis $USER2$/check_redis_replication \"$ARG1$\"";
355 };
356 chunk = ''
357 cp ${./plugins}/check_redis_replication $out/
358 patchShebangs $out/check_redis_replication
359 wrapProgram $out/check_redis_replication --prefix PATH : ${lib.makeBinPath [
360 pkgs.gnugrep pkgs.coreutils pkgs.redis
361 ]}
362 '';
363 sudo = myplugins: {
364 commands = [
365 { command = "${myplugins}/check_redis_replication *"; options = [ "NOPASSWD" ]; }
366 ];
367 runAs = "redis";
368 };
369 };
370 tcp = {
371 commands = {
372 check_tcp = "$USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$ -e \"$ARG2$\" -Mcrit";
373 check_tcp_ssl = "$USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$ -S -D 21,15";
374 };
375 };
376 zfs = {
377 commands = {
378 check_zfs = "$USER2$/check_zpool.sh -p ALL -w 80 -c 90";
379 check_zfs_snapshot = "$USER2$/check_zfs_snapshot -d $ARG1$ -c 18000 -w 14400";
380 };
381 chunk = let
382 zfsPlugin = pkgs.fetchurl {
383 url = "https://www.claudiokuenzler.com/monitoring-plugins/check_zpools.sh";
384 sha256 = "0p9ms9340in80jkds4kfspw62xnzsv5s7ni9m28kxyd0bnzkbzhf";
385 };
386 in ''
387 cp ${zfsPlugin} $out/check_zpool.sh
388 chmod +x $out/check_zpool.sh
389 patchShebangs $out/check_zpool.sh
390 wrapProgram $out/check_zpool.sh --prefix PATH : ${lib.makeBinPath [
391 pkgs.which pkgs.zfs pkgs.gawk
392 ]}
393 cp ${./plugins}/check_zfs_snapshot $out
394 patchShebangs $out/check_zfs_snapshot
395 wrapProgram $out/check_zfs_snapshot --prefix PATH : ${lib.makeBinPath [
396 pkgs.zfs pkgs.coreutils pkgs.gawk pkgs.gnugrep
397 ]}
398 '';
399 };
400}
diff --git a/modules/private/monitoring/nagios-cli.cfg b/flakes/private/monitoring/nagios-cli.cfg
index 7bd30cb..7bd30cb 100644
--- a/modules/private/monitoring/nagios-cli.cfg
+++ b/flakes/private/monitoring/nagios-cli.cfg
diff --git a/flakes/private/monitoring/objects_common.nix b/flakes/private/monitoring/objects_common.nix
new file mode 100644
index 0000000..1da7764
--- /dev/null
+++ b/flakes/private/monitoring/objects_common.nix
@@ -0,0 +1,227 @@
1{ hostFQDN
2, hostName
3, interface ? "eth0"
4, processWarn ? "250"
5, processAlert ? "400"
6, loadWarn ? "0.9"
7, load5Warn ? loadWarn
8, load15Warn ? load5Warn
9, loadAlert ? "1.0"
10, load5Alert ? loadAlert
11, load15Alert ? load5Alert
12, master
13, ...
14}:
15{
16 host = {
17 "${hostFQDN}" = {
18 alias = hostFQDN;
19 address = hostFQDN;
20 use = "linux-server";
21 hostgroups = "webstatus-hosts";
22 _webstatus_name = hostName;
23 _webstatus_vhost = "status.immae.eu";
24 };
25 };
26 service = [
27 {
28 service_description = "Size on root partition";
29 use = "local-service";
30 check_command = ["check_local_disk" "20%" "10%" "/"];
31 __passive_servicegroups = "webstatus-resources";
32 }
33 {
34 service_description = "Total number of process";
35 use = "local-service";
36 check_command = [
37 "check_local_procs"
38 processWarn
39 processAlert
40 "RSZDT"
41 ];
42 __passive_servicegroups = "webstatus-resources";
43 }
44 {
45 service_description = "Network bandwidth";
46 use = "local-service";
47 check_interval = 2;
48 max_check_attempts = "20";
49 retry_interval = "2";
50 check_command = [
51 "check_local_bandwidth"
52 interface
53 "20480" # kb/s
54 "51200" # kb/s
55 ];
56 __passive_servicegroups = "webstatus-resources";
57 }
58 {
59 service_description = "Average load";
60 use = "local-service";
61 check_command = [
62 "check_local_load"
63 "${loadWarn},${load5Warn},${load15Warn}"
64 "${loadAlert},${load5Alert},${load15Alert}"
65 ];
66 __passive_servicegroups = "webstatus-resources";
67 }
68 {
69 service_description = "Swap usage";
70 use = "local-service";
71 check_command = ["check_local_swap" "20" "10"];
72 __passive_servicegroups = "webstatus-resources";
73 }
74 {
75 service_description = "Memory usage";
76 use = "local-service";
77 check_command = ["check_memory" "80" "90"];
78 __passive_servicegroups = "webstatus-resources";
79 }
80 {
81 service_description = "NTP is activated and working";
82 use = "local-service";
83 check_command = ["check_ntp"];
84 __passive_servicegroups = "webstatus-resources";
85 }
86 ];
87 command = {
88 check_local_disk = "$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$";
89 check_local_procs = "$USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$";
90 check_local_load = "$USER1$/check_load -r -w $ARG1$ -c $ARG2$";
91 check_local_swap = "$USER1$/check_swap -n ok -w $ARG1$ -c $ARG2$";
92 check_ntp = "$USER1$/check_ntp_time -t 30 -q -H 0.arch.pool.ntp.org";
93 check_smtp = "$USER1$/check_smtp -H $HOSTADDRESS$ -p 25 -S -D 21,15";
94
95 check_host_alive = "$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5";
96 check_ok = "$USER1$/check_dummy 0 \"Dummy OK\"";
97 check_critical = "$USER1$/check_dummy 2 \"Dummy CRITICAL\"";
98 };
99 timeperiod = {
100 "24x7" = {
101 alias = "24 Hours A Day, 7 Days A Week";
102 monday = "00:00-24:00";
103 tuesday = "00:00-24:00";
104 wednesday = "00:00-24:00";
105 thursday = "00:00-24:00";
106 friday = "00:00-24:00";
107 saturday = "00:00-24:00";
108 sunday = "00:00-24:00";
109 };
110 };
111 servicegroup = {
112 webstatus-webapps = { alias = "Web applications"; };
113 webstatus-websites = { alias = "Personal websites"; };
114 webstatus-ssl = { alias = "SSL certificates"; };
115 webstatus-dns = { alias = "DNS resolution"; };
116 webstatus-remote-services = { alias = "Other remote services"; };
117 webstatus-local-services = { alias = "Other local services"; };
118 webstatus-email = { alias = "E-mail services"; };
119 webstatus-resources = { alias = "Local resources"; };
120 webstatus-databases = { alias = "Databases resources"; };
121 webstatus-backup = { alias = "Backup resources"; };
122 };
123 hostgroup = {
124 webstatus-hosts = { alias = "Hosts"; };
125 };
126 contactgroup = {
127 admins = { alias = "Naemon Administrators"; };
128 };
129 templates = {
130 service = {
131 generic-service = {
132 active_checks_enabled = "1";
133 check_freshness = "0";
134 check_interval = 10;
135 check_period = "24x7";
136 contact_groups = "admins";
137 event_handler_enabled = "1";
138 flap_detection_enabled = "1";
139 is_volatile = "0";
140 max_check_attempts = "3";
141 notification_interval = "60";
142 notification_options = "w,u,c,r,f,s";
143 notification_period = "24x7";
144 notifications_enabled = if master then "1" else "0";
145 obsess_over_service = "1";
146 passive_checks_enabled = "1";
147 process_perf_data = "1";
148 retain_nonstatus_information = "1";
149 retain_status_information = "1";
150 retry_interval = "2";
151 _webstatus_namespace = "immae";
152 };
153 local-service = {
154 use = "generic-service";
155 host_name = hostFQDN;
156 check_interval = 5;
157 max_check_attempts = "4";
158 retry_interval = "1";
159 servicegroups = "webstatus-resources";
160 };
161 external-service = {
162 use = "generic-service";
163 check_interval = 5;
164 max_check_attempts = "4";
165 retry_interval = "1";
166 };
167 web-service = {
168 use = "generic-service";
169 check_interval = 20;
170 max_check_attempts = "2";
171 retry_interval = "1";
172 };
173 external-web-service = {
174 use = "generic-service";
175 check_interval = 20;
176 max_check_attempts = "2";
177 retry_interval = "1";
178 };
179 mail-service = {
180 use = "generic-service";
181 check_interval = 15;
182 max_check_attempts = "1";
183 retry_interval = "1";
184 };
185 dns-service = {
186 use = "generic-service";
187 check_interval = 120;
188 notification_interval = "120";
189 max_check_attempts = "5";
190 retry_interval = "5";
191 };
192 };
193 # No contact, we go through master
194 contact = {
195 generic-contact = {
196 host_notification_commands = "notify-host-by-email";
197 host_notification_options = "d,u,r,f,s";
198 host_notification_period = "24x7";
199 service_notification_commands = "notify-service-by-email";
200 service_notification_options = "w,u,c,r,f,s";
201 service_notification_period = "24x7";
202 };
203 };
204 host = {
205 generic-host = {
206 event_handler_enabled = "1";
207 flap_detection_enabled = "1";
208 notification_period = "24x7";
209 notifications_enabled = "1";
210 process_perf_data = "1";
211 retain_nonstatus_information = "1";
212 retain_status_information = "1";
213 };
214 linux-server = {
215 check_command = "check_host_alive";
216 check_interval = "5";
217 check_period = "24x7";
218 contact_groups = "admins";
219 max_check_attempts = "10";
220 notification_interval = "120";
221 notification_options = "d,u,r,f";
222 retry_interval = "1";
223 _webstatus_namespace = "immae";
224 };
225 };
226 };
227}
diff --git a/modules/private/monitoring/plugins/check_backup_age b/flakes/private/monitoring/plugins/check_backup_age
index d873bdc..d873bdc 100755
--- a/modules/private/monitoring/plugins/check_backup_age
+++ b/flakes/private/monitoring/plugins/check_backup_age
diff --git a/flakes/private/monitoring/plugins/check_bandwidth b/flakes/private/monitoring/plugins/check_bandwidth
new file mode 100755
index 0000000..21d01f5
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_bandwidth
@@ -0,0 +1,122 @@
1#!/bin/bash
2
3# ============================== SUMMARY =====================================
4#Author : Ken Roulamellah
5#Date : 19/07/2018
6#Version : 1.0
7# Licence : GPL
8# ===================== INFORMATION ABOUT THIS PLUGIN ========================
9#
10# This plugin checks the average RX and TX bandwidth utilisation. It use
11# kbytes as measure unite.
12#
13# ========================== START OF PROGRAM CODE ===========================
14
15STATE_OK=0
16STATE_WARNING=1
17STATE_CRITICAL=2
18STATE_UNKNOWN=3
19
20interface=$( ip route | grep default | awk '{print $5}' | head -n1)
21function print_usage()
22{
23 echo "Usage :"
24 echo "$0 [ -i=INTERFACE] [ -ct=COUNT ] -w WARNING -c CRITICAL"
25 echo "This script calculate the average bandwith usage."
26 echo "Default values | interface: ${interface}, counter: 10"
27}
28
29counter=10
30warning=-1
31critical=-1
32
33sum_rx=0
34sum_tx=0
35avg_rx=
36avg_tx=
37i=
38
39
40if [[ $# -lt 4 ]];
41then
42 echo "Error: Arguments are missing"
43 print_usage
44 exit $STATE_UNKNOWN
45fi
46
47while [[ $# -gt 0 ]]; do
48 case "$1" in
49 -i=*)
50 interface="$(cut -d'=' -f2 <<<"$1")"
51 shift
52 ;;
53 -ct=*)
54 counter="$(cut -d'=' -f2 <<<"$1")"
55 shift
56 ;;
57 -w)
58 warning=$2
59 shift 2
60 ;;
61 -c)
62 critical=$2
63 shift 2
64 ;;
65 *)
66 printf "\nError: Invalid option '$1'"
67 print_usage
68 exit $STATE_UNKNOWN
69 ;;
70 esac
71done
72
73if [ $warning -lt 0 ] || [ $critical -lt 0 ];
74then
75 echo "Error: You need to specify a warning and critical treshold"
76 print_usage
77 exit $STATE_UNKNOWN
78fi
79
80grep -q "up" /sys/class/net/$interface/operstate || exec echo "$interface: no such device or down"
81
82read rx <"/sys/class/net/$interface/statistics/rx_bytes"
83read tx <"/sys/class/net/$interface/statistics/tx_bytes"
84
85i=$counter
86while [ $i -gt 0 ]; do
87 sleep 1
88 read newrx <"/sys/class/net/$interface/statistics/rx_bytes"
89 read newtx <"/sys/class/net/$interface/statistics/tx_bytes"
90
91 #echo "old rx :$rx"
92 #echo "new rx :$newrx"
93 rx_cal=$(bc <<< "scale=2; ($newrx-$rx) / 1000")
94 tx_cal=$(bc <<< "scale=2; ($newtx-$tx) / 1000")
95
96 sum_rx=$(bc <<< "scale=2;$sum_rx+$rx_cal")
97 sum_tx=$(bc <<< "scale=2;$sum_tx+$tx_cal")
98
99 #echo "$interface {rx: $rx_cal ko/s, tx: $tx_cal ko/s}"
100 rx=$newrx
101 tx=$newtx
102 ((i --))
103done
104
105avg_rx=$(bc <<< "scale=2;$sum_rx/$counter")
106avg_tx=$(bc <<< "scale=2;$sum_tx/$counter")
107
108#echo "$avg_rx"
109#echo "$avg_tx"
110
111
112if [ $(bc <<< "$avg_rx > $critical || $avg_tx > $critical") -eq 1 ]; then
113 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;"
114 exit $STATE_CRITICAL
115elif [ $(bc <<< "$avg_rx > $warning || $avg_tx > $warning") -eq 1 ]; then
116 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;"
117 exit $STATE_WARNING
118else
119 echo "$interface - OK 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;"
120 exit $STATE_OK
121fi
122exit 3
diff --git a/modules/private/monitoring/plugins/check_command b/flakes/private/monitoring/plugins/check_command
index 2b546c1..2b546c1 100755
--- a/modules/private/monitoring/plugins/check_command
+++ b/flakes/private/monitoring/plugins/check_command
diff --git a/modules/private/monitoring/plugins/check_emails b/flakes/private/monitoring/plugins/check_emails
index 534e5a5..534e5a5 100755
--- a/modules/private/monitoring/plugins/check_emails
+++ b/flakes/private/monitoring/plugins/check_emails
diff --git a/modules/private/monitoring/plugins/check_eriomem b/flakes/private/monitoring/plugins/check_eriomem
index 880b88a..880b88a 100755
--- a/modules/private/monitoring/plugins/check_eriomem
+++ b/flakes/private/monitoring/plugins/check_eriomem
diff --git a/modules/private/monitoring/plugins/check_ftp_database b/flakes/private/monitoring/plugins/check_ftp_database
index f9cf579..f9cf579 100755
--- a/modules/private/monitoring/plugins/check_ftp_database
+++ b/flakes/private/monitoring/plugins/check_ftp_database
diff --git a/modules/private/monitoring/plugins/check_git b/flakes/private/monitoring/plugins/check_git
index e8fbb29..e8fbb29 100755
--- a/modules/private/monitoring/plugins/check_git
+++ b/flakes/private/monitoring/plugins/check_git
diff --git a/modules/private/monitoring/plugins/check_imap_connection b/flakes/private/monitoring/plugins/check_imap_connection
index c1ab0dd..c1ab0dd 100755
--- a/modules/private/monitoring/plugins/check_imap_connection
+++ b/flakes/private/monitoring/plugins/check_imap_connection
diff --git a/modules/private/monitoring/plugins/check_last_file_date b/flakes/private/monitoring/plugins/check_last_file_date
index f51a258..f51a258 100755
--- a/modules/private/monitoring/plugins/check_last_file_date
+++ b/flakes/private/monitoring/plugins/check_last_file_date
diff --git a/flakes/private/monitoring/plugins/check_mem.sh b/flakes/private/monitoring/plugins/check_mem.sh
new file mode 100755
index 0000000..3a29040
--- /dev/null
+++ b/flakes/private/monitoring/plugins/check_mem.sh
@@ -0,0 +1,31 @@
1#!/usr/bin/env bash
2
3if [ "$1" = "-w" ] && [ "$2" -gt "0" ] && [ "$3" = "-c" ] && [ "$4" -gt "0" ]; then
4 FreeM=`free -m -w`
5 memTotal_m=`echo "$FreeM" |grep Mem |awk '{print $2}'`
6 memUsed_m=`echo "$FreeM" |grep Mem |awk '{print $3}'`
7 memFree_m=`echo "$FreeM" |grep Mem |awk '{print $4}'`
8 memShared_m=`echo "$FreeM" |grep Mem |awk '{print $5}'`
9 memBuffer_m=`echo "$FreeM" |grep Mem |awk '{print $6}'`
10 memCache_m=`echo "$FreeM" |grep Mem |awk '{print $7}'`
11 memAvailable_m=`echo "$FreeM" |grep Mem |awk '{print $8}'`
12 memUsedPrc=`echo $((($memUsed_m-$memBuffer_m-$memCache_m)*100/$memTotal_m))||cut -d. -f1`
13 if [ "$memUsedPrc" -ge "$4" ]; then
14 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;;;;"
15 exit 2
16 elif [ "$memUsedPrc" -ge "$2" ]; then
17 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;;;;"
18 exit 1
19 else
20 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;;;;"
21 exit 0
22 fi
23else # If inputs are not as expected, print help.
24 sName="`echo $0|awk -F '/' '{print $NF}'`"
25 echo -e "\n\n\t\t### $sName Version 2.0###\n"
26 echo -e "# Usage:\t$sName -w <warnlevel> -c <critlevel>"
27 echo -e "\t\t= warnlevel and critlevel is percentage value without %\n"
28 echo "# EXAMPLE:\t/usr/lib64/nagios/plugins/$sName -w 80 -c 90"
29 echo -e "\nCopyright (C) 2012 Lukasz Gogolin (lukasz.gogolin@gmail.com), improved by Nestor 2015\n\n"
30 exit
31fi
diff --git a/modules/private/monitoring/plugins/check_mysql_replication b/flakes/private/monitoring/plugins/check_mysql_replication
index 1ee5de1..1ee5de1 100755
--- a/modules/private/monitoring/plugins/check_mysql_replication
+++ b/flakes/private/monitoring/plugins/check_mysql_replication
diff --git a/modules/private/monitoring/plugins/check_openldap_replication b/flakes/private/monitoring/plugins/check_openldap_replication
index 7136ad5..7136ad5 100755
--- a/modules/private/monitoring/plugins/check_openldap_replication
+++ b/flakes/private/monitoring/plugins/check_openldap_replication
diff --git a/modules/private/monitoring/plugins/check_ovh_sms b/flakes/private/monitoring/plugins/check_ovh_sms
index caf279c..caf279c 100755
--- a/modules/private/monitoring/plugins/check_ovh_sms
+++ b/flakes/private/monitoring/plugins/check_ovh_sms
diff --git a/modules/private/monitoring/plugins/check_postgres_database_count b/flakes/private/monitoring/plugins/check_postgres_database_count
index 43bdd8c..43bdd8c 100755
--- a/modules/private/monitoring/plugins/check_postgres_database_count
+++ b/flakes/private/monitoring/plugins/check_postgres_database_count
diff --git a/modules/private/monitoring/plugins/check_postgres_replication b/flakes/private/monitoring/plugins/check_postgres_replication
index ff257a3..ff257a3 100755
--- a/modules/private/monitoring/plugins/check_postgres_replication
+++ b/flakes/private/monitoring/plugins/check_postgres_replication
diff --git a/modules/private/monitoring/plugins/check_redis_replication b/flakes/private/monitoring/plugins/check_redis_replication
index 6dbe4c4..6dbe4c4 100755
--- a/modules/private/monitoring/plugins/check_redis_replication
+++ b/flakes/private/monitoring/plugins/check_redis_replication
diff --git a/modules/private/monitoring/plugins/check_zfs_snapshot b/flakes/private/monitoring/plugins/check_zfs_snapshot
index 56f8c4f..56f8c4f 100755
--- a/modules/private/monitoring/plugins/check_zfs_snapshot
+++ b/flakes/private/monitoring/plugins/check_zfs_snapshot
diff --git a/flakes/private/monitoring/plugins/notify_by_apprise b/flakes/private/monitoring/plugins/notify_by_apprise
new file mode 100755
index 0000000..82bc5a3
--- /dev/null
+++ b/flakes/private/monitoring/plugins/notify_by_apprise
@@ -0,0 +1,31 @@
1#!/usr/bin/env bash
2
3APPRISE_USERNAME="Naemon"
4APPRISE_USERICON="https://assets.immae.eu/monitoring.png"
5APPRISE_URLS=$(echo "$2" | sed -e "s/{username}/$APPRISE_USERNAME/g" -e "s@{image_url}@$APPRISE_USERICON@g")
6
7if [ "$SERVICESTATE" = "CRITICAL" ]; then
8 ICON="❗"
9elif [ "$SERVICESTATE" = "WARNING" ]; then
10 ICON="⚠️:"
11elif [ "$SERVICESTATE" = "OK" ]; then
12 ICON="✅"
13elif [ "$SERVICESTATE" = "UNKNOWN" ]; then
14 ICON="❓"
15elif [ "$HOSTSTATE" = "UP" ]; then
16 ICON="✅"
17elif [ "$HOSTSTATE" = "DOWN" ]; then
18 ICON="❗"
19elif [ "$HOSTSTATE" = "UNKNOWN" ]; then
20 ICON="❓"
21elif [ "$HOSTSTATE" = "UNREACHABLE" ]; then
22 ICON="❓"
23else
24 ICON="◻"
25fi
26
27if [ "$1" = "host" ]; then
28 apprise --title "${ICON} ${NOTIFICATIONTYPE} ${HOST} is ${HOSTSTATE}" --body "$HOSTOUTPUT" $APPRISE_URLS
29else
30 apprise --title "${ICON} ${NOTIFICATIONTYPE} ${SERVICEDESC} on ${HOST} is ${SERVICESTATE}" --body "$SERVICEOUTPUT" $APPRISE_URLS
31fi
diff --git a/modules/private/monitoring/plugins/notify_by_email b/flakes/private/monitoring/plugins/notify_by_email
index 959db26..959db26 100755
--- a/modules/private/monitoring/plugins/notify_by_email
+++ b/flakes/private/monitoring/plugins/notify_by_email
diff --git a/modules/private/monitoring/plugins/notify_by_slack b/flakes/private/monitoring/plugins/notify_by_slack
index 1b16a0d..1b16a0d 100755
--- a/modules/private/monitoring/plugins/notify_by_slack
+++ b/flakes/private/monitoring/plugins/notify_by_slack
diff --git a/modules/private/monitoring/plugins/send_nrdp.sh b/flakes/private/monitoring/plugins/send_nrdp.sh
index c83c8cb..c83c8cb 100755
--- a/modules/private/monitoring/plugins/send_nrdp.sh
+++ b/flakes/private/monitoring/plugins/send_nrdp.sh
diff --git a/modules/private/monitoring/send_mails b/flakes/private/monitoring/send_mails
index 105c505..105c505 100755
--- a/modules/private/monitoring/send_mails
+++ b/flakes/private/monitoring/send_mails
diff --git a/flakes/private/monitoring/to_objects.nix b/flakes/private/monitoring/to_objects.nix
new file mode 100644
index 0000000..57a71ad
--- /dev/null
+++ b/flakes/private/monitoring/to_objects.nix
@@ -0,0 +1,77 @@
1{ lib }:
2 with lib.attrsets;
3 with lib.strings;
4 with lib.lists;
5 with lib.trivial;
6let
7 pad = width: str: let
8 padWidth = width - stringLength str;
9 padding = concatStrings (genList (const " ") padWidth);
10 in str + optionalString (padWidth > 0) padding;
11 toStr = k: v:
12 if k == "check_command" && builtins.isList v
13 then builtins.concatStringsSep "!" v
14 else builtins.toString v;
15
16 toService = service: ''
17 define service {
18 ${builtins.concatStringsSep "\n" (mapAttrsToList (k: v:
19 " ${pad 30 k} ${toStr k v}"
20 ) (filterAttrs (k: v: ! hasPrefix "__passive_" k) service))}
21 }
22 '';
23 toServices = services: builtins.concatStringsSep "\n" (map toService services);
24
25 toCommand = k: v: ''
26 define command {
27 ${pad 30 "command_name"} ${k}
28 ${pad 30 "command_line"} ${v}
29 }
30 '';
31 toCommands = a: builtins.concatStringsSep "\n" (mapAttrsToList toCommand a);
32
33 toOther = keyname: k: v: ''
34 define ${keyname} {
35 ${pad 30 "${keyname}_name"} ${k}
36 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
37 " ${pad 30 kk} ${vv}"
38 ) v)}
39 }
40 '';
41 toOtherNoName = keyname: v: ''
42 define ${keyname} {
43 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
44 " ${pad 30 kk} ${vv}"
45 ) v)}
46 }
47 '';
48 toOthers = keyname: a: builtins.concatStringsSep "\n" (mapAttrsToList (toOther keyname) a);
49 toOthersArray = keyname: a: builtins.concatStringsSep "\n" (map (toOtherNoName keyname) a);
50
51 toTemplate = keyname: k: v: ''
52 define ${keyname} {
53 ${pad 30 "name"} ${k}
54 ${pad 30 "register"} 0
55 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
56 " ${pad 30 kk} ${builtins.toString vv}"
57 ) v)}
58 }
59 '';
60 toTemplates' = keyname: a: builtins.concatStringsSep "\n" (mapAttrsToList (toTemplate keyname) a);
61 toTemplates = v: builtins.concatStringsSep "\n" (mapAttrsToList toTemplates' v);
62
63 toObjects' = keyname: v:
64 if keyname == "service"
65 then toServices v
66 else if keyname == "command"
67 then toCommands v
68 else if keyname == "templates"
69 then toTemplates v
70 else if builtins.elem keyname ["hostgroup" "host" "contactgroup" "contact" "timeperiod" "servicegroup"]
71 then toOthers keyname v
72 else if builtins.elem keyname ["servicedependency" "hostdependency"]
73 then toOthersArray keyname v
74 else builtins.trace ("Warning: unknown object type " + keyname) "";
75 toObjects = v: builtins.concatStringsSep "\n" (mapAttrsToList toObjects' v);
76in
77 toObjects
diff --git a/flakes/private/openarc/flake.lock b/flakes/private/openarc/flake.lock
index be75993..60b0fdf 100644
--- a/flakes/private/openarc/flake.lock
+++ b/flakes/private/openarc/flake.lock
@@ -2,7 +2,8 @@
2 "nodes": { 2 "nodes": {
3 "files-watcher": { 3 "files-watcher": {
4 "locked": { 4 "locked": {
5 "narHash": "sha256-6urOJuzXsu4HJHyVmrZHd40SMzzTeHiOiDOM40q53Y0=", 5 "lastModified": 1,
6 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
6 "path": "../../files-watcher", 7 "path": "../../files-watcher",
7 "type": "path" 8 "type": "path"
8 }, 9 },
@@ -26,69 +27,20 @@
26 "type": "github" 27 "type": "github"
27 } 28 }
28 }, 29 },
29 "my-lib": { 30 "myuids": {
30 "inputs": {
31 "nixpkgs": "nixpkgs"
32 },
33 "locked": { 31 "locked": {
34 "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=", 32 "lastModified": 1,
35 "path": "../../lib", 33 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
34 "path": "../myuids",
36 "type": "path" 35 "type": "path"
37 }, 36 },
38 "original": { 37 "original": {
39 "path": "../../lib", 38 "path": "../myuids",
40 "type": "path" 39 "type": "path"
41 } 40 }
42 }, 41 },
43 "myuids": {
44 "locked": {
45 "dir": "flakes/myuids",
46 "lastModified": 1628207001,
47 "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=",
48 "ref": "master",
49 "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3",
50 "revCount": 865,
51 "type": "git",
52 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
53 },
54 "original": {
55 "dir": "flakes/myuids",
56 "type": "git",
57 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
58 }
59 },
60 "nix-lib": {
61 "locked": {
62 "lastModified": 1633008342,
63 "narHash": "sha256-wZV5YidnsqV/iufDIhaZip3LzwUGeIt8wtdiGS5+cXc=",
64 "owner": "NixOS",
65 "repo": "nixpkgs",
66 "rev": "6eae8a116011f4db0aa5146f364820024411d6bb",
67 "type": "github"
68 },
69 "original": {
70 "owner": "NixOS",
71 "repo": "nixpkgs",
72 "type": "github"
73 }
74 },
75 "nixpkgs": { 42 "nixpkgs": {
76 "locked": { 43 "locked": {
77 "lastModified": 1631570365,
78 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
79 "owner": "NixOS",
80 "repo": "nixpkgs",
81 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
82 "type": "github"
83 },
84 "original": {
85 "owner": "NixOS",
86 "repo": "nixpkgs",
87 "type": "github"
88 }
89 },
90 "nixpkgs_2": {
91 "locked": {
92 "lastModified": 1597943282, 44 "lastModified": 1597943282,
93 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", 45 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
94 "owner": "NixOS", 46 "owner": "NixOS",
@@ -106,11 +58,12 @@
106 "inputs": { 58 "inputs": {
107 "flake-utils": "flake-utils", 59 "flake-utils": "flake-utils",
108 "myuids": "myuids", 60 "myuids": "myuids",
109 "nixpkgs": "nixpkgs_2", 61 "nixpkgs": "nixpkgs",
110 "openarc": "openarc_2" 62 "openarc": "openarc_2"
111 }, 63 },
112 "locked": { 64 "locked": {
113 "narHash": "sha256-ilrfNs6jpi1OceDE3y1atkovECx6PKNWubwLc0Sjx+s=", 65 "lastModified": 1,
66 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
114 "path": "../../openarc", 67 "path": "../../openarc",
115 "type": "path" 68 "type": "path"
116 }, 69 },
@@ -138,15 +91,14 @@
138 "root": { 91 "root": {
139 "inputs": { 92 "inputs": {
140 "files-watcher": "files-watcher", 93 "files-watcher": "files-watcher",
141 "my-lib": "my-lib",
142 "nix-lib": "nix-lib",
143 "openarc": "openarc", 94 "openarc": "openarc",
144 "secrets": "secrets" 95 "secrets": "secrets"
145 } 96 }
146 }, 97 },
147 "secrets": { 98 "secrets": {
148 "locked": { 99 "locked": {
149 "narHash": "sha256-w3u1bMEJHCg9SqErJ5Qi0sTX2xx7mk+HrHZXzpjQd1w=", 100 "lastModified": 1,
101 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
150 "path": "../../secrets", 102 "path": "../../secrets",
151 "type": "path" 103 "type": "path"
152 }, 104 },
diff --git a/flakes/private/openarc/flake.nix b/flakes/private/openarc/flake.nix
index b4ab4c8..56c3a1a 100644
--- a/flakes/private/openarc/flake.nix
+++ b/flakes/private/openarc/flake.nix
@@ -1,63 +1,47 @@
1{ 1{
2 inputs.openarc = { 2 inputs.openarc.url = "path:../../openarc";
3 path = "../../openarc"; 3 inputs.secrets.url = "path:../../secrets";
4 type = "path"; 4 inputs.files-watcher.url = "path:../../files-watcher";
5 };
6 inputs.secrets = {
7 path = "../../secrets";
8 type = "path";
9 };
10 inputs.files-watcher = {
11 path = "../../files-watcher";
12 type = "path";
13 };
14 inputs.my-lib = {
15 path = "../../lib";
16 type = "path";
17 };
18 inputs.nix-lib.url = "github:NixOS/nixpkgs";
19 5
20 description = "Private configuration for openarc"; 6 description = "Private configuration for openarc";
21 outputs = { self, nix-lib, my-lib, files-watcher, openarc, secrets }: 7 outputs = { self, files-watcher, openarc, secrets }: {
22 let 8 nixosModule = self.nixosModules.openarc;
23 cfg = name': { config, lib, pkgs, name, ... }: { 9 nixosModules.openarc = { config, pkgs, ... }: {
24 imports = [ 10 imports = [
25 (my-lib.lib.withNarKey files-watcher "nixosModule") 11 files-watcher.nixosModule
26 (my-lib.lib.withNarKey openarc "nixosModule") 12 openarc.nixosModule
27 (my-lib.lib.withNarKey secrets "nixosModule") 13 secrets.nixosModule
28 ]; 14 ];
29 config = lib.mkIf (name == name') { 15 config = {
30 services.openarc = { 16 services.openarc = {
31 enable = true; 17 enable = true;
32 user = "opendkim"; 18 user = "opendkim";
33 socket = "/run/openarc/openarc.sock"; 19 socket = "/run/openarc/openarc.sock";
34 group = config.services.postfix.group; 20 group = config.services.postfix.group;
35 configFile = pkgs.writeText "openarc.conf" '' 21 configFile = pkgs.writeText "openarc.conf" ''
36 AuthservID mail.immae.eu 22 AuthservID mail.immae.eu
37 Domain mail.immae.eu 23 Domain mail.immae.eu
38 KeyFile ${config.secrets.fullPaths."opendkim/eldiron.private"} 24 KeyFile ${config.secrets.fullPaths."opendkim/eldiron.private"}
39 Mode sv 25 Mode sv
40 Selector eldiron 26 Selector eldiron
41 SoftwareHeader yes 27 SoftwareHeader yes
42 Syslog Yes 28 Syslog Yes
43 '';
44 };
45 systemd.services.openarc.serviceConfig.Slice = "mail.slice";
46 systemd.services.openarc.postStart = ''
47 while [ ! -S ${config.services.openarc.socket} ]; do
48 sleep 0.5
49 done
50 chmod g+w ${config.services.openarc.socket}
51 ''; 29 '';
52 services.filesWatcher.openarc = { 30 };
53 restart = true; 31 systemd.services.openarc.serviceConfig.Slice = "mail.slice";
54 paths = [ 32 systemd.services.openarc.postStart = ''
55 config.secrets.fullPaths."opendkim/eldiron.private" 33 while [ ! -S ${config.services.openarc.socket} ]; do
56 ]; 34 sleep 0.5
57 }; 35 done
36 chmod g+w ${config.services.openarc.socket}
37 '';
38 services.filesWatcher.openarc = {
39 restart = true;
40 paths = [
41 config.secrets.fullPaths."opendkim/eldiron.private"
42 ];
58 }; 43 };
59 }; 44 };
60 in 45 };
61 openarc.outputs // 46 };
62 { nixosModules = openarc.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron" "backup-2"] cfg; };
63} 47}
diff --git a/flakes/private/opendmarc/flake.lock b/flakes/private/opendmarc/flake.lock
index f40e1a9..fdd4d64 100644
--- a/flakes/private/opendmarc/flake.lock
+++ b/flakes/private/opendmarc/flake.lock
@@ -1,8 +1,21 @@
1{ 1{
2 "nodes": { 2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
3 "files-watcher": { 15 "files-watcher": {
4 "locked": { 16 "locked": {
5 "narHash": "sha256-6urOJuzXsu4HJHyVmrZHd40SMzzTeHiOiDOM40q53Y0=", 17 "lastModified": 1,
18 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
6 "path": "../../files-watcher", 19 "path": "../../files-watcher",
7 "type": "path" 20 "type": "path"
8 }, 21 },
@@ -26,69 +39,20 @@
26 "type": "github" 39 "type": "github"
27 } 40 }
28 }, 41 },
29 "my-lib": { 42 "myuids": {
30 "inputs": {
31 "nixpkgs": "nixpkgs"
32 },
33 "locked": { 43 "locked": {
34 "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=", 44 "lastModified": 1,
35 "path": "../../lib", 45 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
46 "path": "../myuids",
36 "type": "path" 47 "type": "path"
37 }, 48 },
38 "original": { 49 "original": {
39 "path": "../../lib", 50 "path": "../myuids",
40 "type": "path" 51 "type": "path"
41 } 52 }
42 }, 53 },
43 "myuids": {
44 "locked": {
45 "dir": "flakes/myuids",
46 "lastModified": 1628207001,
47 "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=",
48 "ref": "master",
49 "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3",
50 "revCount": 865,
51 "type": "git",
52 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
53 },
54 "original": {
55 "dir": "flakes/myuids",
56 "type": "git",
57 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
58 }
59 },
60 "nix-lib": {
61 "locked": {
62 "lastModified": 1633008342,
63 "narHash": "sha256-wZV5YidnsqV/iufDIhaZip3LzwUGeIt8wtdiGS5+cXc=",
64 "owner": "NixOS",
65 "repo": "nixpkgs",
66 "rev": "6eae8a116011f4db0aa5146f364820024411d6bb",
67 "type": "github"
68 },
69 "original": {
70 "owner": "NixOS",
71 "repo": "nixpkgs",
72 "type": "github"
73 }
74 },
75 "nixpkgs": { 54 "nixpkgs": {
76 "locked": { 55 "locked": {
77 "lastModified": 1631570365,
78 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
79 "owner": "NixOS",
80 "repo": "nixpkgs",
81 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
82 "type": "github"
83 },
84 "original": {
85 "owner": "NixOS",
86 "repo": "nixpkgs",
87 "type": "github"
88 }
89 },
90 "nixpkgs_2": {
91 "locked": {
92 "lastModified": 1597943282, 56 "lastModified": 1597943282,
93 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=", 57 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
94 "owner": "NixOS", 58 "owner": "NixOS",
@@ -106,10 +70,11 @@
106 "inputs": { 70 "inputs": {
107 "flake-utils": "flake-utils", 71 "flake-utils": "flake-utils",
108 "myuids": "myuids", 72 "myuids": "myuids",
109 "nixpkgs": "nixpkgs_2" 73 "nixpkgs": "nixpkgs"
110 }, 74 },
111 "locked": { 75 "locked": {
112 "narHash": "sha256-7jup/d3+WXXWsNMB7Sp5Py4rJQV30Z5+PJITBISbQ9o=", 76 "lastModified": 1,
77 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
113 "path": "../../opendmarc", 78 "path": "../../opendmarc",
114 "type": "path" 79 "type": "path"
115 }, 80 },
@@ -120,16 +85,16 @@
120 }, 85 },
121 "root": { 86 "root": {
122 "inputs": { 87 "inputs": {
88 "environment": "environment",
123 "files-watcher": "files-watcher", 89 "files-watcher": "files-watcher",
124 "my-lib": "my-lib",
125 "nix-lib": "nix-lib",
126 "opendmarc": "opendmarc", 90 "opendmarc": "opendmarc",
127 "secrets": "secrets" 91 "secrets": "secrets"
128 } 92 }
129 }, 93 },
130 "secrets": { 94 "secrets": {
131 "locked": { 95 "locked": {
132 "narHash": "sha256-w3u1bMEJHCg9SqErJ5Qi0sTX2xx7mk+HrHZXzpjQd1w=", 96 "lastModified": 1,
97 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
133 "path": "../../secrets", 98 "path": "../../secrets",
134 "type": "path" 99 "type": "path"
135 }, 100 },
diff --git a/flakes/private/opendmarc/flake.nix b/flakes/private/opendmarc/flake.nix
index e2575e7..7e9e8eb 100644
--- a/flakes/private/opendmarc/flake.nix
+++ b/flakes/private/opendmarc/flake.nix
@@ -1,77 +1,62 @@
1{ 1{
2 inputs.opendmarc = { 2 inputs.opendmarc.url = "path:../../opendmarc";
3 path = "../../opendmarc"; 3 inputs.environment.url = "path:../environment";
4 type = "path"; 4 inputs.secrets.url = "path:../../secrets";
5 }; 5 inputs.files-watcher.url = "path:../../files-watcher";
6 inputs.secrets = {
7 path = "../../secrets";
8 type = "path";
9 };
10 inputs.files-watcher = {
11 path = "../../files-watcher";
12 type = "path";
13 };
14 inputs.my-lib = {
15 path = "../../lib";
16 type = "path";
17 };
18 inputs.nix-lib.url = "github:NixOS/nixpkgs";
19 6
20 description = "Private configuration for opendmarc"; 7 description = "Private configuration for opendmarc";
21 outputs = { self, nix-lib, opendmarc, my-lib, files-watcher, secrets }: 8 outputs = { self, environment, opendmarc, files-watcher, secrets }: {
22 let 9 nixosModule = self.nixosModules.opendmarc;
23 cfg = name': { config, lib, pkgs, name, ... }: { 10 nixosModules.opendmarc = { config, lib, pkgs, ... }: {
24 imports = [ 11 imports = [
25 (my-lib.lib.withNarKey files-watcher "nixosModule") 12 environment.nixosModule
26 (my-lib.lib.withNarKey opendmarc "nixosModule") 13 files-watcher.nixosModule
27 (my-lib.lib.withNarKey secrets "nixosModule") 14 opendmarc.nixosModule
28 ]; 15 secrets.nixosModule
29 config = lib.mkIf (name == name') { 16 ];
30 users.users."${config.services.opendmarc.user}".extraGroups = [ "keys" ]; 17 config = {
31 systemd.services.opendmarc.serviceConfig.Slice = "mail.slice"; 18 users.users."${config.services.opendmarc.user}".extraGroups = [ "keys" ];
32 services.opendmarc = { 19 systemd.services.opendmarc.serviceConfig.Slice = "mail.slice";
33 enable = true; 20 services.opendmarc = {
34 socket = "/run/opendmarc/opendmarc.sock"; 21 enable = true;
35 configFile = pkgs.writeText "opendmarc.conf" '' 22 socket = "/run/opendmarc/opendmarc.sock";
36 AuthservID HOSTNAME 23 configFile = pkgs.writeText "opendmarc.conf" ''
37 FailureReports false 24 AuthservID HOSTNAME
38 FailureReportsBcc postmaster@immae.eu 25 FailureReports false
39 FailureReportsOnNone true 26 FailureReportsBcc postmaster@immae.eu
40 FailureReportsSentBy postmaster@immae.eu 27 FailureReportsOnNone true
41 IgnoreAuthenticatedClients true 28 FailureReportsSentBy postmaster@immae.eu
42 IgnoreHosts ${config.secrets.fullPaths."opendmarc/ignore.hosts"} 29 IgnoreAuthenticatedClients true
43 SoftwareHeader true 30 IgnoreHosts ${config.secrets.fullPaths."opendmarc/ignore.hosts"}
44 SPFIgnoreResults true 31 SoftwareHeader true
45 SPFSelfValidate true 32 SPFIgnoreResults true
46 UMask 002 33 SPFSelfValidate true
47 ''; 34 UMask 002
48 group = config.services.postfix.group; 35 '';
49 }; 36 group = config.services.postfix.group;
50 services.filesWatcher.opendmarc = { 37 };
51 restart = true; 38 services.filesWatcher.opendmarc = {
52 paths = [ 39 restart = true;
53 config.secrets.fullPaths."opendmarc/ignore.hosts" 40 paths = [
54 ]; 41 config.secrets.fullPaths."opendmarc/ignore.hosts"
55 }; 42 ];
56 secrets.keys = { 43 };
57 "opendmarc/ignore.hosts" = { 44 secrets.keys = {
58 user = config.services.opendmarc.user; 45 "opendmarc/ignore.hosts" = {
59 group = config.services.opendmarc.group; 46 user = config.services.opendmarc.user;
60 permissions = "0400"; 47 group = config.services.opendmarc.group;
61 text = let 48 permissions = "0400";
62 mxes = lib.attrsets.filterAttrs 49 text = let
63 (n: v: v.mx.enable) 50 mxes = lib.attrsets.filterAttrs
64 config.myEnv.servers; 51 (n: v: v.mx.enable)
65 in 52 config.myEnv.servers;
66 builtins.concatStringsSep "\n" ([ 53 in
67 config.myEnv.mail.dmarc.ignore_hosts 54 builtins.concatStringsSep "\n" ([
68 ] ++ lib.mapAttrsToList (n: v: v.fqdn) mxes); 55 config.myEnv.mail.dmarc.ignore_hosts
69 }; 56 ] ++ lib.mapAttrsToList (n: v: v.fqdn) mxes);
70 }; 57 };
71 }; 58 };
72 }; 59 };
73 in 60 };
74 opendmarc.outputs // 61 };
75 { nixosModules = opendmarc.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron" "backup-2"] cfg; };
76} 62}
77
diff --git a/flakes/private/openldap/flake.nix b/flakes/private/openldap/flake.nix
new file mode 100644
index 0000000..130312d
--- /dev/null
+++ b/flakes/private/openldap/flake.nix
@@ -0,0 +1,6 @@
1{
2 outputs = { self }: {
3 immae-schema = ./immae.schema;
4 immae-ldif = ./immae.ldif;
5 };
6}
diff --git a/flakes/private/openldap/immae.ldif b/flakes/private/openldap/immae.ldif
new file mode 100644
index 0000000..f1b4cb7
--- /dev/null
+++ b/flakes/private/openldap/immae.ldif
@@ -0,0 +1,83 @@
1# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
2# CRC32 22130f5f
3dn: cn=immae,cn=schema,cn=config
4objectClass: olcSchemaConfig
5cn: immae
6olcObjectIdentifier: {0}Immaeroot 1.3.6.1.4.1.50071
7olcObjectIdentifier: {1}Immae Immaeroot:2
8olcObjectIdentifier: {2}ImmaeattributeType Immae:3
9olcObjectIdentifier: {3}ImmaeobjectClass Immae:4
10olcAttributeTypes: {0}( ImmaeattributeType:1 NAME 'immaeTtrssLogin' DESC 'lo
11 gin for TTRSS' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SY
12 NTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
13olcAttributeTypes: {1}( ImmaeattributeType:2 NAME 'immaeFtpDirectory' DESC '
14 home directory for ftp' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.
15 115.121.1.26 )
16olcAttributeTypes: {2}( ImmaeattributeType:3 NAME 'immaeFtpUid' DESC 'user i
17 d for ftp' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
18olcAttributeTypes: {3}( ImmaeattributeType:4 NAME 'immaeFtpGid' DESC 'group
19 id for ftp' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
20olcAttributeTypes: {4}( ImmaeattributeType:5 NAME 'immaeSshKey' DESC 'OpenSS
21 H Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.4
22 0 )
23olcAttributeTypes: {5}( ImmaeattributeType:6 NAME 'immaeAccessDn' EQUALITY d
24 istinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
25olcAttributeTypes: {6}( ImmaeattributeType:17 NAME 'immaeAccessWriteDn' EQUA
26 LITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
27olcAttributeTypes: {7}( ImmaeattributeType:18 NAME 'immaeAccessReadSubtree'
28 EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
29olcAttributeTypes: {8}( ImmaeattributeType:7 NAME 'immaeXmppUid' DESC 'user
30 part for Xmpp' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SY
31 NTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
32olcAttributeTypes: {9}( ImmaeattributeType:8 NAME 'immaePostfixAddress' DESC
33 'the dovecot address to match as username' EQUALITY caseIgnoreIA5Match SUB
34 STR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256}
35 )
36olcAttributeTypes: {10}( ImmaeattributeType:9 NAME 'immaePostfixHome' DESC '
37 the postfix home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1
38 466.115.121.1.26 SINGLE-VALUE )
39olcAttributeTypes: {11}( ImmaeattributeType:10 NAME 'immaePostfixMail' DESC
40 'the dovecot mail location' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1
41 466.115.121.1.26 SINGLE-VALUE )
42olcAttributeTypes: {12}( ImmaeattributeType:11 NAME 'immaePostfixUid' DESC '
43 the dovecot uid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121
44 .1.26 SINGLE-VALUE )
45olcAttributeTypes: {13}( ImmaeattributeType:12 NAME 'immaePostfixGid' DESC '
46 the dovecot gid' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121
47 .1.26 SINGLE-VALUE )
48olcAttributeTypes: {14}( ImmaeattributeType:16 NAME 'immaePuppetJson' DESC '
49 Puppet hiera json' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.12
50 1.1.40 )
51olcAttributeTypes: {15}( ImmaeattributeType:19 NAME 'immaeTaskId' DESC 'Task
52 warrior server Org:Name:Key' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubs
53 tringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
54olcAttributeTypes: {16}( ImmaeattributeType:20 NAME 'immaePeertubeId' DESC '
55 login for Peertube' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMat
56 ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
57olcObjectClasses: {0}( ImmaeobjectClass:1 NAME 'immaeTtrssClass' DESC 'Expan
58 sion of the existing object classes for ttrss' SUP top AUXILIARY MUST immae
59 TtrssLogin )
60olcObjectClasses: {1}( ImmaeobjectClass:2 NAME 'immaeFtpClass' DESC 'Expansi
61 on of the existing object classes for ftp' SUP top AUXILIARY MUST ( immaeFt
62 pDirectory $ immaeFtpGid $ immaeFtpUid ) )
63olcObjectClasses: {2}( ImmaeobjectClass:3 NAME 'immaeSshClass' DESC 'OpenSSH
64 class' SUP top AUXILIARY MAY immaeSSHKey )
65olcObjectClasses: {3}( ImmaeobjectClass:4 NAME 'immaeAccessClass' DESC 'Acce
66 ss class' SUP top AUXILIARY MAY ( immaeAccessDn $ immaeAccessWriteDn $ imma
67 eAccessReadSubtree ) )
68olcObjectClasses: {4}( ImmaeobjectClass:5 NAME 'immaeXmppClass' DESC 'Expans
69 ion of the existing object classes for XMPP' SUP top AUXILIARY MUST immaeXm
70 ppUid )
71olcObjectClasses: {5}( ImmaeobjectClass:6 NAME 'immaePostfixClass' DESC 'Exp
72 ansion of the existing object classes for Postfix' SUP top AUXILIARY MAY (
73 immaePostfixHome $ immaePostfixMail $ immaePostfixUid $ immaePostfixGid ) M
74 UST ( immaePostfixAddress ) )
75olcObjectClasses: {6}( ImmaeobjectClass:8 NAME 'immaePuppetClass' DESC 'Expa
76 nsion of the existing object classes for Puppet' SUP top AUXILIARY MUST imm
77 aePuppetJson )
78olcObjectClasses: {7}( ImmaeobjectClass:9 NAME 'immaeTaskClass' DESC 'Expans
79 ion of the existing object classes for Task' SUP top AUXILIARY MUST immaeTa
80 skId )
81olcObjectClasses: {8}( ImmaeobjectClass:10 NAME 'immaePeertubeClass' DESC 'E
82 xpansion of the existing object classes for peertube' SUP top AUXILIARY MUS
83 T immaePeertubeId )
diff --git a/flakes/private/openldap/immae.schema b/flakes/private/openldap/immae.schema
new file mode 100644
index 0000000..7b3b587
--- /dev/null
+++ b/flakes/private/openldap/immae.schema
@@ -0,0 +1,179 @@
1# vim: set filetype=slapd:
2objectIdentifier Immaeroot 1.3.6.1.4.1.50071
3
4objectIdentifier Immae Immaeroot:2
5objectIdentifier ImmaeattributeType Immae:3
6objectIdentifier ImmaeobjectClass Immae:4
7
8# TT-RSS
9attributetype ( ImmaeattributeType:1 NAME 'immaeTtrssLogin'
10 DESC 'login for TTRSS'
11 EQUALITY caseIgnoreMatch
12 SUBSTR caseIgnoreSubstringsMatch
13 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
14
15objectclass ( ImmaeobjectClass:1 NAME 'immaeTtrssClass'
16 DESC 'Expansion of the existing object classes for ttrss'
17 SUP top AUXILIARY
18 MUST ( immaeTtrssLogin ) )
19
20# FTP
21attributetype ( ImmaeattributeType:2 NAME 'immaeFtpDirectory'
22 DESC 'home directory for ftp'
23 EQUALITY caseExactIA5Match
24 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
25
26attributetype ( ImmaeattributeType:3 NAME 'immaeFtpUid'
27 DESC 'user id for ftp'
28 EQUALITY integerMatch
29 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
30
31attributetype ( ImmaeattributeType:4 NAME 'immaeFtpGid'
32 DESC 'group id for ftp'
33 EQUALITY integerMatch
34 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
35
36objectclass ( ImmaeobjectClass:2 NAME 'immaeFtpClass'
37 DESC 'Expansion of the existing object classes for ftp'
38 SUP top AUXILIARY
39 MUST ( immaeFtpDirectory $ immaeFtpGid $ immaeFtpUid ) )
40
41
42# SSH keys
43attributetype ( ImmaeattributeType:5 NAME 'immaeSshKey'
44 DESC 'OpenSSH Public key'
45 EQUALITY octetStringMatch
46 SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
47
48objectClass ( ImmaeobjectClass:3 NAME 'immaeSshClass'
49 DESC 'OpenSSH class'
50 SUP top AUXILIARY
51 MAy ( immaeSSHKey ) )
52
53# Specific access
54attributetype (ImmaeattributeType:6 NAME 'immaeAccessDn'
55 EQUALITY distinguishedNameMatch
56 SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
57
58attributetype (ImmaeattributeType:17 NAME 'immaeAccessWriteDn'
59 EQUALITY distinguishedNameMatch
60 SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
61
62attributetype (ImmaeattributeType:18 NAME 'immaeAccessReadSubtree'
63 EQUALITY distinguishedNameMatch
64 SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
65
66objectClass ( ImmaeobjectClass:4 NAME 'immaeAccessClass'
67 DESC 'Access class'
68 SUP top AUXILIARY
69 MAY ( immaeAccessDn $ immaeAccessWriteDn $ immaeAccessReadSubtree ) )
70
71# Xmpp uid
72attributetype ( ImmaeattributeType:7 NAME 'immaeXmppUid'
73 DESC 'user part for Xmpp'
74 EQUALITY caseIgnoreMatch
75 SUBSTR caseIgnoreSubstringsMatch
76 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
77
78objectclass ( ImmaeobjectClass:5 NAME 'immaeXmppClass'
79 DESC 'Expansion of the existing object classes for XMPP'
80 SUP top AUXILIARY
81 MUST ( immaeXmppUid ) )
82
83# Postfix accounts
84attributetype ( ImmaeattributeType:8 NAME 'immaePostfixAddress'
85 DESC 'the dovecot address to match as username'
86 EQUALITY caseIgnoreIA5Match
87 SUBSTR caseIgnoreIA5SubstringsMatch
88 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
89
90attributetype ( ImmaeattributeType:9 NAME 'immaePostfixHome'
91 DESC 'the postfix home directory'
92 EQUALITY caseExactIA5Match
93 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
94
95attributetype ( ImmaeattributeType:10 NAME 'immaePostfixMail'
96 DESC 'the dovecot mail location'
97 EQUALITY caseExactIA5Match
98 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
99
100attributetype ( ImmaeattributeType:11 NAME 'immaePostfixUid'
101 DESC 'the dovecot uid'
102 EQUALITY caseExactIA5Match
103 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
104
105attributetype ( ImmaeattributeType:12 NAME 'immaePostfixGid'
106 DESC 'the dovecot gid'
107 EQUALITY caseExactIA5Match
108 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
109
110objectclass ( ImmaeobjectClass:6 NAME 'immaePostfixClass'
111 DESC 'Expansion of the existing object classes for Postfix'
112 SUP top AUXILIARY
113 MAY ( immaePostfixHome $ immaePostfixMail $ immaePostfixUid $ immaePostfixGid )
114 MUST ( immaePostfixAddress )
115 )
116
117# Tinc informations
118# Domaine = une classe a part ou une partie du dn ?
119# attributetype ( ImmaeattributeType:13 NAME 'immaeTincIpSegment'
120# DESC 'the internal ip segment in tinc'
121# EQUALITY caseIgnoreIA5Match
122# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
123#
124# attributetype ( ImmaeattributeType:14 NAME 'immaeTincSubdomain'
125# DESC 'the host subdomain'
126# EQUALITY caseIgnoreIA5Match
127# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
128#
129# attributetype ( ImmaeattributeType:15 NAME 'immaeTincHostname'
130# DESC 'the host name'
131# EQUALITY caseIgnoreIA5Match
132# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
133#
134# objectclass ( ImmaeobjectClass:7 NAME 'immaeTincHostClass'
135# DESC 'Expansion of the existing object classes for Tinc'
136# SUP top AUXILIARY
137# MUST ( immaeTincInternalIp $ immaeTincSubdomain $
138# immaeTincHostname )
139# )
140
141attributetype (ImmaeattributeType:16 NAME 'immaePuppetJson'
142 DESC 'Puppet hiera json'
143 EQUALITY octetStringMatch
144 SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
145
146objectclass ( ImmaeobjectClass:8 NAME 'immaePuppetClass'
147 DESC 'Expansion of the existing object classes for Puppet'
148 SUP top AUXILIARY
149 MUST ( immaePuppetJson )
150 )
151
152attributetype (ImmaeattributeType:19 NAME 'immaeTaskId'
153 DESC 'Taskwarrior server Org:Name:Key'
154 EQUALITY caseIgnoreMatch
155 SUBSTR caseIgnoreSubstringsMatch
156 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
157
158objectclass ( ImmaeobjectClass:9 NAME 'immaeTaskClass'
159 DESC 'Expansion of the existing object classes for Task'
160 SUP top AUXILIARY
161 MUST ( immaeTaskId )
162 )
163
164# Peertube uid
165attributetype ( ImmaeattributeType:20 NAME 'immaePeertubeId'
166 DESC 'login for Peertube'
167 EQUALITY caseIgnoreMatch
168 SUBSTR caseIgnoreSubstringsMatch
169 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
170
171objectclass ( ImmaeobjectClass:10 NAME 'immaePeertubeClass'
172 DESC 'Expansion of the existing object classes for peertube'
173 SUP top AUXILIARY
174 MUST ( immaePeertubeId ) )
175
176
177# Last:
178# attributetype ( ImmaeattributeType:20 NAME 'immaePeertubeId'
179# objectclass ( ImmaeobjectClass:10 NAME 'immaePeertubeClass'
diff --git a/flakes/private/paste/flake.lock b/flakes/private/paste/flake.lock
index 6ad428c..e81b9ee 100644
--- a/flakes/private/paste/flake.lock
+++ b/flakes/private/paste/flake.lock
@@ -15,35 +15,6 @@
15 "type": "github" 15 "type": "github"
16 } 16 }
17 }, 17 },
18 "my-lib": {
19 "inputs": {
20 "nixpkgs": "nixpkgs"
21 },
22 "locked": {
23 "narHash": "sha256-HGNP1eH7b42BxViYx/F3ZPO9CM1X+5qfA9JoP2ArN+s=",
24 "path": "../../lib",
25 "type": "path"
26 },
27 "original": {
28 "path": "../../lib",
29 "type": "path"
30 }
31 },
32 "nix-lib": {
33 "locked": {
34 "lastModified": 1632955135,
35 "narHash": "sha256-MyOBftnLv5UcPCL4AzvlyNEDwGD2cGGM9HMEOno/MZw=",
36 "owner": "NixOS",
37 "repo": "nixpkgs",
38 "rev": "a4d96cd808f13d924988938ecf9a46b2a2787fa3",
39 "type": "github"
40 },
41 "original": {
42 "owner": "NixOS",
43 "repo": "nixpkgs",
44 "type": "github"
45 }
46 },
47 "nixpkgs": { 18 "nixpkgs": {
48 "locked": { 19 "locked": {
49 "lastModified": 1631570365, 20 "lastModified": 1631570365,
@@ -59,28 +30,14 @@
59 "type": "github" 30 "type": "github"
60 } 31 }
61 }, 32 },
62 "nixpkgs_2": {
63 "locked": {
64 "lastModified": 1631570365,
65 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
66 "owner": "NixOS",
67 "repo": "nixpkgs",
68 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
69 "type": "github"
70 },
71 "original": {
72 "owner": "NixOS",
73 "repo": "nixpkgs",
74 "type": "github"
75 }
76 },
77 "paste": { 33 "paste": {
78 "inputs": { 34 "inputs": {
79 "flake-utils": "flake-utils", 35 "flake-utils": "flake-utils",
80 "nixpkgs": "nixpkgs_2" 36 "nixpkgs": "nixpkgs"
81 }, 37 },
82 "locked": { 38 "locked": {
83 "narHash": "sha256-2ylI42ZHfzW6oCsxfFyHf5zVnDsPMwvJCACtcdErtPg=", 39 "lastModified": 1,
40 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
84 "path": "../../paste", 41 "path": "../../paste",
85 "type": "path" 42 "type": "path"
86 }, 43 },
@@ -91,8 +48,6 @@
91 }, 48 },
92 "root": { 49 "root": {
93 "inputs": { 50 "inputs": {
94 "my-lib": "my-lib",
95 "nix-lib": "nix-lib",
96 "paste": "paste" 51 "paste": "paste"
97 } 52 }
98 } 53 }
diff --git a/flakes/private/paste/flake.nix b/flakes/private/paste/flake.nix
index 23f8cd3..97853ea 100644
--- a/flakes/private/paste/flake.nix
+++ b/flakes/private/paste/flake.nix
@@ -1,30 +1,20 @@
1{ 1{
2 inputs.paste = { 2 inputs.paste.url = "path:../../paste";
3 path = "../../paste";
4 type = "path";
5 };
6 inputs.my-lib = {
7 path = "../../lib";
8 type = "path";
9 };
10 inputs.nix-lib.url = "github:NixOS/nixpkgs";
11 3
12 description = "Private configuration for paste"; 4 description = "Private configuration for paste";
13 outputs = { self, my-lib, nix-lib, paste }: 5 outputs = { self, paste }: {
14 let 6 nixosModule = self.nixosModules.paste;
15 cfg = name': { config, lib, pkgs, name, ... }: { 7 nixosModules.paste = { ... }: {
16 imports = [ 8 imports = [
17 (my-lib.lib.withNarKey paste "nixosModule") 9 paste.nixosModule
18 ]; 10 ];
19 config = lib.mkIf (name == name') { 11 config = {
20 services.paste = { 12 services.paste = {
21 enable = true; 13 enable = true;
22 webDirectory = "/paste"; 14 webDirectory = "/paste";
23 };
24 }; 15 };
25 }; 16 };
26 in 17 };
27 paste.outputs // 18 };
28 { nixosModules = paste.nixosModules or {} // nix-lib.lib.genAttrs ["eldiron"] cfg; };
29} 19}
30 20
diff --git a/flakes/private/peertube/flake.lock b/flakes/private/peertube/flake.lock
index 4944da7..0ecec47 100644
--- a/flakes/private/peertube/flake.lock
+++ b/flakes/private/peertube/flake.lock
@@ -32,36 +32,26 @@
32 }, 32 },
33 "myuids": { 33 "myuids": {
34 "locked": { 34 "locked": {
35 "dir": "flakes/myuids", 35 "lastModified": 1,
36 "lastModified": 1628207001, 36 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
37 "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", 37 "path": "../myuids",
38 "ref": "master", 38 "type": "path"
39 "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3",
40 "revCount": 865,
41 "type": "git",
42 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
43 }, 39 },
44 "original": { 40 "original": {
45 "dir": "flakes/myuids", 41 "path": "../myuids",
46 "type": "git", 42 "type": "path"
47 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
48 } 43 }
49 }, 44 },
50 "myuids_2": { 45 "myuids_2": {
51 "locked": { 46 "locked": {
52 "dir": "flakes/myuids", 47 "lastModified": 1,
53 "lastModified": 1628207001, 48 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
54 "narHash": "sha256-7e12OfDv9zMOfqcAlsk1sZj2l3ZB03kcBdWUqhwVaWo=", 49 "path": "../myuids",
55 "ref": "master", 50 "type": "path"
56 "rev": "dfe02d8fd52e33c7d4e1a209cf486696100b88f3",
57 "revCount": 865,
58 "type": "git",
59 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
60 }, 51 },
61 "original": { 52 "original": {
62 "dir": "flakes/myuids", 53 "path": "../myuids",
63 "type": "git", 54 "type": "path"
64 "url": "https://git.immae.eu/perso/Immae/Config/Nix.git"
65 } 55 }
66 }, 56 },
67 "nixpkgs": { 57 "nixpkgs": {
@@ -97,12 +87,13 @@
97 "peertube": { 87 "peertube": {
98 "flake": false, 88 "flake": false,
99 "locked": { 89 "locked": {
100 "lastModified": 1610436329, 90 "lastModified": 1611184594,
101 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=", 91 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
102 "owner": "Chocobozzz", 92 "ref": "gitolite_local/open_instance",
103 "repo": "PeerTube", 93 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
104 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86", 94 "revCount": 6316,
105 "type": "github" 95 "type": "git",
96 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
106 }, 97 },
107 "original": { 98 "original": {
108 "owner": "Chocobozzz", 99 "owner": "Chocobozzz",
@@ -114,21 +105,21 @@
114 "peertube_2": { 105 "peertube_2": {
115 "flake": false, 106 "flake": false,
116 "locked": { 107 "locked": {
117 "lastModified": 1611184594, 108 "lastModified": 1610436329,
118 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=", 109 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
119 "ref": "gitolite_local/syden", 110 "owner": "Chocobozzz",
120 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3", 111 "repo": "PeerTube",
121 "revCount": 6316, 112 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
122 "type": "git", 113 "type": "github"
123 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
124 }, 114 },
125 "original": { 115 "original": {
126 "ref": "gitolite_local/syden", 116 "owner": "Chocobozzz",
127 "type": "git", 117 "ref": "v3.0.1",
128 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git" 118 "repo": "PeerTube",
119 "type": "github"
129 } 120 }
130 }, 121 },
131 "peertube_origin": { 122 "peertube_open_instance": {
132 "inputs": { 123 "inputs": {
133 "flake-utils": "flake-utils", 124 "flake-utils": "flake-utils",
134 "myuids": "myuids", 125 "myuids": "myuids",
@@ -136,16 +127,17 @@
136 "peertube": "peertube" 127 "peertube": "peertube"
137 }, 128 },
138 "locked": { 129 "locked": {
139 "narHash": "sha256-ESrcCrx7QmNk8MHgws9KrPEZqIxKNQ6bcshbUPj9u88=", 130 "lastModified": 1,
140 "path": "../../peertube", 131 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
132 "path": "./../../peertube",
141 "type": "path" 133 "type": "path"
142 }, 134 },
143 "original": { 135 "original": {
144 "path": "../../peertube", 136 "path": "./../../peertube",
145 "type": "path" 137 "type": "path"
146 } 138 }
147 }, 139 },
148 "peertube_syden": { 140 "peertube_origin": {
149 "inputs": { 141 "inputs": {
150 "flake-utils": "flake-utils_2", 142 "flake-utils": "flake-utils_2",
151 "myuids": "myuids_2", 143 "myuids": "myuids_2",
@@ -153,19 +145,20 @@
153 "peertube": "peertube_2" 145 "peertube": "peertube_2"
154 }, 146 },
155 "locked": { 147 "locked": {
156 "narHash": "sha256-ESrcCrx7QmNk8MHgws9KrPEZqIxKNQ6bcshbUPj9u88=", 148 "lastModified": 1,
157 "path": "../../peertube", 149 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
150 "path": "./../../peertube",
158 "type": "path" 151 "type": "path"
159 }, 152 },
160 "original": { 153 "original": {
161 "path": "../../peertube", 154 "path": "./../../peertube",
162 "type": "path" 155 "type": "path"
163 } 156 }
164 }, 157 },
165 "root": { 158 "root": {
166 "inputs": { 159 "inputs": {
167 "peertube_origin": "peertube_origin", 160 "peertube_open_instance": "peertube_open_instance",
168 "peertube_syden": "peertube_syden" 161 "peertube_origin": "peertube_origin"
169 } 162 }
170 } 163 }
171 }, 164 },
diff --git a/flakes/private/peertube/flake.nix b/flakes/private/peertube/flake.nix
index e0e0d54..8eb81e9 100644
--- a/flakes/private/peertube/flake.nix
+++ b/flakes/private/peertube/flake.nix
@@ -1,27 +1,25 @@
1{ 1{
2 description = "Patched peertube"; 2 description = "Patched peertube";
3 inputs.peertube_origin = { 3 inputs.peertube_origin = {
4 path = "../../peertube"; 4 url = "path:./../../peertube";
5 type = "path";
6 }; 5 };
7 inputs.peertube_syden = { 6 inputs.peertube_open_instance = {
8 path = "../../peertube"; 7 url = "path:./../../peertube";
9 type = "path";
10 inputs.peertube = { 8 inputs.peertube = {
11 url = "https://git.immae.eu/github/Chocobozzz/PeerTube.git"; 9 url = "https://git.immae.eu/github/Chocobozzz/PeerTube.git";
12 ref = "gitolite_local/syden"; 10 ref = "gitolite_local/open_instance";
13 flake = false; 11 flake = false;
14 type = "git"; 12 type = "git";
15 }; 13 };
16 }; 14 };
17 15
18 outputs = { self, peertube_origin, peertube_syden }: { 16 outputs = { self, peertube_origin, peertube_open_instance }: {
19 overlays = { 17 overlays = {
20 peertube_syden = final: prev: { peertube_syden = peertube_syden.defaultPackage."${final.system}"; }; 18 peertube_open_instance = final: prev: { peertube_open_instance = peertube_open_instance.defaultPackage."${final.system}"; };
21 peertube_origin = final: prev: { peertube_origin = peertube_origin.defaultPackage."${final.system}"; }; 19 peertube_origin = final: prev: { peertube_origin = peertube_origin.defaultPackage."${final.system}"; };
22 }; 20 };
23 packages.x86_64-linux.peertube = peertube_origin.packages.x86_64-linux.peertube; 21 packages.x86_64-linux.peertube = peertube_origin.packages.x86_64-linux.peertube;
24 packages.x86_64-linux.peertube_syden = peertube_syden.packages.x86_64-linux.peertube; 22 packages.x86_64-linux.peertube_open_instance = peertube_open_instance.packages.x86_64-linux.peertube;
25 defaultPackage.x86_64-linux = peertube_origin.defaultPackage.x86_64-linux; 23 defaultPackage.x86_64-linux = peertube_origin.defaultPackage.x86_64-linux;
26 nixosModule = peertube_origin.nixosModule; 24 nixosModule = peertube_origin.nixosModule;
27 }; 25 };
diff --git a/flakes/private/php/flake.lock b/flakes/private/php/flake.lock
new file mode 100644
index 0000000..c9af933
--- /dev/null
+++ b/flakes/private/php/flake.lock
@@ -0,0 +1,62 @@
1{
2 "nodes": {
3 "flake-utils": {
4 "locked": {
5 "lastModified": 1648297722,
6 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
7 "owner": "numtide",
8 "repo": "flake-utils",
9 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
10 "type": "github"
11 },
12 "original": {
13 "owner": "numtide",
14 "repo": "flake-utils",
15 "type": "github"
16 }
17 },
18 "nixpkgs": {
19 "flake": false,
20 "locked": {
21 "lastModified": 1596265691,
22 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
23 "owner": "NixOS",
24 "repo": "nixpkgs",
25 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
26 "type": "github"
27 },
28 "original": {
29 "owner": "NixOS",
30 "repo": "nixpkgs",
31 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
32 "type": "github"
33 }
34 },
35 "nixpkgs-4": {
36 "flake": false,
37 "locked": {
38 "lastModified": 1646497237,
39 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
40 "owner": "NixOS",
41 "repo": "nixpkgs",
42 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
43 "type": "github"
44 },
45 "original": {
46 "owner": "NixOS",
47 "repo": "nixpkgs",
48 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
49 "type": "github"
50 }
51 },
52 "root": {
53 "inputs": {
54 "flake-utils": "flake-utils",
55 "nixpkgs": "nixpkgs",
56 "nixpkgs-4": "nixpkgs-4"
57 }
58 }
59 },
60 "root": "root",
61 "version": 7
62}
diff --git a/flakes/private/php/flake.nix b/flakes/private/php/flake.nix
new file mode 100644
index 0000000..a730b68
--- /dev/null
+++ b/flakes/private/php/flake.nix
@@ -0,0 +1,40 @@
1{
2 description = "Php old versions";
3 inputs.flake-utils.url = "github:numtide/flake-utils";
4 inputs.nixpkgs = {
5 url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
6 flake = false;
7 };
8 inputs.nixpkgs-4 = {
9 url = "github:NixOS/nixpkgs/062a0c5437b68f950b081bbfc8a699d57a4ee026";
10 flake = false;
11 };
12 outputs = { self, nixpkgs, nixpkgs-4, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
13 let
14 pkgs = import nixpkgs { inherit system; overlays = []; };
15 in rec {
16 packages = {
17 php72 = pkgs.php72;
18 php73 = pkgs.php73;
19 php74 = (import nixpkgs-4 { inherit system; overlays = []; }).php74;
20 cryptpad = (import nixpkgs-4 { inherit system; overlays = []; }).cryptpad;
21 python37 = (import nixpkgs-4 { inherit system; overlays = []; }).python37;
22 python37Packages = (import nixpkgs-4 { inherit system; overlays = []; }).python37Packages;
23 telegram-purple = (import nixpkgs-4 { inherit system; overlays = []; }).telegram-purple;
24 };
25 defaultPackage = packages.php73;
26 legacyPackages = packages;
27 }) // rec {
28 overlays = {
29 php = final: prev: {
30 php72 = self.packages."${final.system}".php72;
31 php73 = self.packages."${final.system}".php73;
32 php74 = self.packages."${final.system}".php74;
33 cryptpad = self.packages."${final.system}".cryptpad;
34 python37 = self.packages."${final.system}".python37;
35 telegram-purple = self.packages."${final.system}".telegram-purple;
36 };
37 };
38 overlay = overlays.php;
39 };
40}
diff --git a/flakes/private/ssh/flake.lock b/flakes/private/ssh/flake.lock
new file mode 100644
index 0000000..bbb2011
--- /dev/null
+++ b/flakes/private/ssh/flake.lock
@@ -0,0 +1,36 @@
1{
2 "nodes": {
3 "environment": {
4 "locked": {
5 "lastModified": 1,
6 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
7 "path": "../environment",
8 "type": "path"
9 },
10 "original": {
11 "path": "../environment",
12 "type": "path"
13 }
14 },
15 "root": {
16 "inputs": {
17 "environment": "environment",
18 "secrets": "secrets"
19 }
20 },
21 "secrets": {
22 "locked": {
23 "lastModified": 1,
24 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
25 "path": "../../secrets",
26 "type": "path"
27 },
28 "original": {
29 "path": "../../secrets",
30 "type": "path"
31 }
32 }
33 },
34 "root": "root",
35 "version": 7
36}
diff --git a/flakes/private/ssh/flake.nix b/flakes/private/ssh/flake.nix
new file mode 100644
index 0000000..0ca6d67
--- /dev/null
+++ b/flakes/private/ssh/flake.nix
@@ -0,0 +1,107 @@
1{
2 inputs.environment.url = "path:../environment";
3 inputs.secrets.url = "path:../../secrets";
4 outputs = { self, environment, secrets }: {
5 nixosModule = self.nixosModules.ssh;
6 nixosModules.ssh = { lib, pkgs, config, ... }:
7 let
8 cfg = config.myServices.ssh;
9 in
10 {
11 imports = [
12 environment.nixosModule
13 secrets.nixosModule
14 ];
15 options.myServices.ssh = let
16 module = lib.types.submodule {
17 options = {
18 vars = lib.mkOption {
19 type = lib.types.attrsOf lib.types.lines;
20 default = {};
21 description = ''
22 variables to interpolate in the script. A `name_` prefix will be prepended
23 '';
24 };
25 snippet = lib.mkOption {
26 type = lib.types.lines;
27 description = ''
28 Snippet to use
29 '';
30 };
31 dependencies = lib.mkOption {
32 type = lib.types.listOf lib.types.package;
33 default = [];
34 description = ''
35 Dependencies of the package
36 '';
37 };
38 };
39 };
40 in {
41 modules = lib.mkOption {
42 type = lib.types.attrsOf module;
43 default = {};
44 description = ''
45 List of modules to enable
46 '';
47 };
48 };
49 config = lib.mkIf (builtins.length (builtins.attrValues cfg.modules) > 0) {
50
51 services.openssh.extraConfig = ''
52 AuthorizedKeysCommand /etc/ssh/ldap_authorized_keys
53 AuthorizedKeysCommandUser nobody
54 '';
55
56 secrets.keys."ssh-ldap" = {
57 user = "nobody";
58 group = "nogroup";
59 permissions = "0400";
60 text = config.myEnv.sshd.ldap.password;
61 };
62 secrets.keys."ssh-psql" = {
63 user = "nobody";
64 group = "nogroup";
65 permissions = "0400";
66 text = config.myEnv.sshd.psql.password;
67 };
68 system.activationScripts.sshd = {
69 deps = [ "secrets" ];
70 text = ''
71 install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-ldap"} /etc/ssh/ldap_password
72 install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-psql"} /etc/ssh/psql_password
73 '';
74 };
75 # ssh is strict about parent directory having correct rights, don't
76 # move it in the nix store.
77 environment.etc."ssh/ldap_authorized_keys" = let
78 deps = lib.lists.unique (
79 [ pkgs.which pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.postgresql ]
80 ++ lib.flatten (map (v: v.dependencies) (builtins.attrValues cfg.modules))
81 );
82 vars = lib.concatMapAttrs (n: v: (
83 lib.mapAttrs' (n': lib.nameValuePair "${n}_${n'}") v.vars
84 )) cfg.modules;
85 fullScript = pkgs.runCommand "ldap_authorized_keys" (vars // {
86 snippets = builtins.concatStringsSep "\n" (map (v: v.snippet) (builtins.attrValues cfg.modules));
87 }) ''
88 substituteAll ${./ldap_authorized_keys.sh} $out
89 # Second call for the included snippets
90 substituteAllInPlace $out
91 chmod a+x $out
92 '';
93 ldap_authorized_keys = pkgs.runCommand "ldap_authorized_keys" {
94 buildInputs = [ pkgs.makeWrapper ];
95 } ''
96 makeWrapper "${fullScript}" "$out" --prefix PATH : ${lib.makeBinPath deps}
97 '';
98 in {
99 enable = true;
100 mode = "0755";
101 user = "root";
102 source = ldap_authorized_keys;
103 };
104 };
105 };
106 };
107}
diff --git a/flakes/private/ssh/ldap_authorized_keys.sh b/flakes/private/ssh/ldap_authorized_keys.sh
new file mode 100755
index 0000000..f4395be
--- /dev/null
+++ b/flakes/private/ssh/ldap_authorized_keys.sh
@@ -0,0 +1,62 @@
1#!/usr/bin/env bash
2
3LDAPSEARCH=ldapsearch
4KEY="immaeSshKey"
5LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu"
6LDAP_PASS=$(cat /etc/ssh/ldap_password)
7LDAP_HOST="ldap://ldap.immae.eu"
8LDAP_BASE="dc=immae,dc=eu"
9USER_LDAP_BASE="ou=users,dc=immae,dc=eu"
10
11PSQL_BASE="immae"
12PSQL_HOST="localhost"
13PSQL_USER="immae_auth_read"
14PSQL_PASS=$(cat /etc/ssh/psql_password)
15
16suitable_for() {
17 type_for="$1"
18 key="$2"
19
20 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
21 echo "$key"
22 else
23 key_type=$(cut -d " " -f 1 <<< "$key")
24
25 if grep -q "\b-$type_for\b" <<< "$key_type"; then
26 echo ""
27 elif grep -q "\b$type_for\b" <<< "$key_type"; then
28 echo $(sed -e "s/^[^ ]* //g" <<< "$key")
29 else
30 echo ""
31 fi
32 fi
33}
34
35clean_key_line() {
36 type_for="$1"
37 line="$2"
38
39 if [[ "$line" == $KEY::* ]]; then
40 # base64 keys should't happen, unless wrong copy-pasting
41 key=""
42 else
43 key=$(sed -e "s/^$KEY: *//" -e "s/ *$//" <<< "$line")
44 fi
45
46 suitable_for "$type_for" "$key"
47}
48
49ldap_search() {
50 $LDAPSEARCH -H $LDAP_HOST -ZZ -b $LDAP_BASE -D $LDAP_BIND -w "$LDAP_PASS" -x -o ldif-wrap=no -LLL "$@"
51}
52
53psql_search() {
54 PGPASSWORD="$PSQL_PASS" psql -U "$PSQL_USER" -h "$PSQL_HOST" -X -A -t -d "$PSQL_BASE" -c "$@"
55}
56
57ldap_keys() {
58 user=$1;
59 @snippets@
60}
61
62ldap_keys $@
diff --git a/flakes/private/system/flake.lock b/flakes/private/system/flake.lock
new file mode 100644
index 0000000..3602f00
--- /dev/null
+++ b/flakes/private/system/flake.lock
@@ -0,0 +1,185 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils",
6 "nixpkgs": "nixpkgs"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "environment": {
20 "locked": {
21 "lastModified": 1,
22 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
23 "path": "../environment",
24 "type": "path"
25 },
26 "original": {
27 "path": "../environment",
28 "type": "path"
29 }
30 },
31 "flake-parts": {
32 "inputs": {
33 "nixpkgs-lib": "nixpkgs-lib"
34 },
35 "locked": {
36 "lastModified": 1675295133,
37 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
38 "owner": "hercules-ci",
39 "repo": "flake-parts",
40 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
41 "type": "github"
42 },
43 "original": {
44 "owner": "hercules-ci",
45 "repo": "flake-parts",
46 "type": "github"
47 }
48 },
49 "flake-utils": {
50 "locked": {
51 "lastModified": 1667395993,
52 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
53 "owner": "numtide",
54 "repo": "flake-utils",
55 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
56 "type": "github"
57 },
58 "original": {
59 "owner": "numtide",
60 "repo": "flake-utils",
61 "type": "github"
62 }
63 },
64 "mypackages": {
65 "inputs": {
66 "flake-parts": "flake-parts",
67 "nixpkgs": "nixpkgs_2",
68 "webapps-ttrss": "webapps-ttrss"
69 },
70 "locked": {
71 "lastModified": 1,
72 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
73 "path": "../../mypackages",
74 "type": "path"
75 },
76 "original": {
77 "path": "../../mypackages",
78 "type": "path"
79 }
80 },
81 "myuids": {
82 "locked": {
83 "lastModified": 1,
84 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
85 "path": "../../myuids",
86 "type": "path"
87 },
88 "original": {
89 "path": "../../myuids",
90 "type": "path"
91 }
92 },
93 "nixpkgs": {
94 "locked": {
95 "lastModified": 1687502512,
96 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
97 "owner": "NixOS",
98 "repo": "nixpkgs",
99 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
100 "type": "github"
101 },
102 "original": {
103 "owner": "NixOS",
104 "ref": "nixos-unstable",
105 "repo": "nixpkgs",
106 "type": "github"
107 }
108 },
109 "nixpkgs-lib": {
110 "locked": {
111 "dir": "lib",
112 "lastModified": 1675183161,
113 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
114 "owner": "NixOS",
115 "repo": "nixpkgs",
116 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
117 "type": "github"
118 },
119 "original": {
120 "dir": "lib",
121 "owner": "NixOS",
122 "ref": "nixos-unstable",
123 "repo": "nixpkgs",
124 "type": "github"
125 }
126 },
127 "nixpkgs_2": {
128 "locked": {
129 "lastModified": 1646497237,
130 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
131 "owner": "nixos",
132 "repo": "nixpkgs",
133 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
134 "type": "github"
135 },
136 "original": {
137 "owner": "nixos",
138 "repo": "nixpkgs",
139 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
140 "type": "github"
141 }
142 },
143 "root": {
144 "inputs": {
145 "backports": "backports",
146 "environment": "environment",
147 "mypackages": "mypackages",
148 "myuids": "myuids",
149 "secrets-public": "secrets-public"
150 }
151 },
152 "secrets-public": {
153 "locked": {
154 "lastModified": 1,
155 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
156 "path": "../../secrets",
157 "type": "path"
158 },
159 "original": {
160 "path": "../../secrets",
161 "type": "path"
162 }
163 },
164 "webapps-ttrss": {
165 "flake": false,
166 "locked": {
167 "lastModified": 1546759381,
168 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
169 "ref": "master",
170 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
171 "revCount": 9256,
172 "type": "git",
173 "url": "https://git.tt-rss.org/fox/tt-rss.git"
174 },
175 "original": {
176 "ref": "master",
177 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
178 "type": "git",
179 "url": "https://git.tt-rss.org/fox/tt-rss.git"
180 }
181 }
182 },
183 "root": "root",
184 "version": 7
185}
diff --git a/flakes/private/system/flake.nix b/flakes/private/system/flake.nix
new file mode 100644
index 0000000..04ebbc7
--- /dev/null
+++ b/flakes/private/system/flake.nix
@@ -0,0 +1,168 @@
1{
2 inputs.environment.url = "path:../environment";
3 inputs.secrets-public.url = "path:../../secrets";
4 inputs.mypackages.url = "path:../../mypackages";
5 inputs.myuids.url = "path:../../myuids";
6 inputs.backports.url = "path:../../backports";
7 outputs = { self, secrets-public, mypackages, backports, environment, myuids }: {
8 nixosModule = self.nixosModules.system;
9 nixosModules.system = { pkgs, lib, config, name, nodes, secrets, options, ... }:
10 {
11 imports = [
12 secrets.nixosModules.users-config-common
13 environment.nixosModule
14 secrets-public.nixosModule
15 ];
16 config = {
17 myEnv = import secrets.environment-file;
18 networking.hostName = name;
19 deployment.keys."vars.yml" = {
20 keyCommand = [ pkgs.stdenv.shell "-c" "cat ${secrets.vars-file}" ];
21 user = "root";
22 group = "root";
23 permissions = "0400";
24 };
25
26 networking.extraHosts = builtins.concatStringsSep "\n"
27 (lib.mapAttrsToList (n: v: "${lib.head v.config.hostEnv.ips.main.ip4} ${n}") nodes);
28
29 users.extraUsers.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.nix_repository ];
30 secrets.deleteSecretsVars = true;
31 secrets.gpgKeys = [
32 ./public_keys/Immae.pub
33 ];
34 secrets.secretsVars = "/run/keys/vars.yml";
35
36 services.openssh.enable = true;
37
38 nixpkgs.overlays =
39 builtins.attrValues mypackages.overlays ++
40 builtins.attrValues backports.overlays ++
41 [
42 (self: super: {
43 postgresql = self.postgresql_pam;
44 mariadb = self.mariadb_106.overrideAttrs(old: {
45 passthru = old.passthru // { mysqlVersion = "5.7"; };
46 });
47 }) # don’t put them as generic overlay because of home-manager
48 ];
49
50 services.journald.extraConfig = ''
51 #Should be "warning" but disabled for now, it prevents anything from being stored
52 MaxLevelStore=info
53 MaxRetentionSec=1year
54 '';
55
56 users.groups.acme.gid = myuids.lib.gids.acme;
57 users.users =
58 builtins.listToAttrs (map (x: lib.attrsets.nameValuePair x.name ({
59 isNormalUser = true;
60 home = "/home/${x.name}";
61 createHome = true;
62 linger = true;
63 # Enable in latest unstable homeMode = "755";
64 } // x)) (config.hostEnv.users pkgs))
65 // {
66 acme.uid = myuids.lib.uids.acme;
67 };
68 environment.systemPackages = [
69 pkgs.inetutils
70 pkgs.htop
71 pkgs.iftop
72 pkgs.bind.dnsutils
73 pkgs.httpie
74 pkgs.iotop
75 pkgs.whois
76 pkgs.ngrep
77 pkgs.tcpdump
78 pkgs.wireshark-cli
79 pkgs.tcpflow
80 pkgs.mitmproxy
81 pkgs.nmap
82 pkgs.p0f
83 pkgs.socat
84 pkgs.lsof
85 pkgs.psmisc
86 pkgs.openssl
87 pkgs.wget
88
89 pkgs.pv
90 pkgs.smartmontools
91
92 pkgs.git
93 pkgs.vim
94 pkgs.rsync
95 pkgs.strace
96 pkgs.sqlite
97
98 pkgs.jq
99 pkgs.yq
100 ];
101
102 users.mutableUsers = lib.mkDefault false;
103
104 systemd.services."vars.yml-key".enable = lib.mkForce false;
105 systemd.targets.maintenance = {
106 description = "Maintenance target with only sshd";
107 after = [ "network-online.target" "sshd.service" ];
108 requires = [ "network-online.target" "sshd.service" ];
109 unitConfig.AllowIsolate = "yes";
110 };
111
112 security.acme.acceptTerms = true;
113 security.acme.preliminarySelfsigned = true;
114
115 security.acme.certs = {
116 "${name}" = {
117 domain = config.hostEnv.fqdn;
118 };
119 };
120 security.acme.defaults = {
121 email = "ismael@bouya.org";
122 webroot = "/var/lib/acme/acme-challenges";
123 postRun = builtins.concatStringsSep "\n" [
124 (lib.optionalString config.services.nginx.enable "systemctl reload nginx.service")
125 ];
126 extraLegoRenewFlags = [ "--reuse-key" ];
127 keyType = lib.mkDefault "ec256"; # https://github.com/NixOS/nixpkgs/pull/83121
128 #extraLegoRunFlags = [ "--reuse-key" "--preferred-chain" "ISRG Root X1"];
129 #extraLegoRenewFlags = ["--preferred-chain" "ISRG Root X1"];
130 };
131
132 services.nginx = {
133 recommendedTlsSettings = true;
134 virtualHosts = {
135 "${config.hostEnv.fqdn}" = {
136 acmeRoot = config.security.acme.defaults.webroot;
137 useACMEHost = name;
138 forceSSL = true;
139 };
140 };
141 };
142
143 services.fail2ban.jails.DEFAULT = {
144 settings.bantime = "12h";
145 settings.findtime = "12h";
146 };
147 services.fail2ban = {
148 enable = true;
149 #findtime = "12h";
150 #bantime = "12h";
151 bantime-increment = {
152 enable = true; # Enable increment of bantime after each violation
153 formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)";
154 #multipliers = "1 2 4 8 16 32 64";
155 maxtime = "168h"; # Do not ban for more than 1 week
156 overalljails = true; # Calculate the bantime based on all the violations
157 };
158 maxretry = 10;
159 ignoreIP = let
160 ip4s = lib.flatten (lib.mapAttrsToList (n: v: (lib.mapAttrsToList (n: v: v.ip4 or []) v.ips)) (config.myEnv.servers));
161 ip6s = lib.flatten (lib.mapAttrsToList (n: v: (lib.mapAttrsToList (n: v: v.ip6 or []) v.ips)) (config.myEnv.servers));
162 in
163 ip4s ++ ip6s;
164 };
165 };
166 };
167 };
168}
diff --git a/nixops/public_keys/Immae.pub b/flakes/private/system/public_keys/Immae.pub
index dd42b04..dd42b04 100644
--- a/nixops/public_keys/Immae.pub
+++ b/flakes/private/system/public_keys/Immae.pub
diff --git a/flakes/rsync_backup/flake.nix b/flakes/rsync_backup/flake.nix
index 6d359e5..d81d176 100644
--- a/flakes/rsync_backup/flake.nix
+++ b/flakes/rsync_backup/flake.nix
@@ -183,7 +183,7 @@
183 if [ "$skip" != "$DEST" ]; then 183 if [ "$skip" != "$DEST" ]; then
184 ''; 184 '';
185 backup_profile_tail = name: profile: '' 185 backup_profile_tail = name: profile: ''
186 ssh -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -i ${ssh_key} -p $PORT $DEST sh -c "date > .cache/last_backup" 186 ssh -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -i ${ssh_key} -p $PORT $DEST sh -c "date > .cache/last_backup" || true
187 fi # [ "$skip" != "$DEST" ] 187 fi # [ "$skip" != "$DEST" ]
188 ##### End ${name} ##### 188 ##### End ${name} #####
189 ''; 189 '';
@@ -228,7 +228,7 @@
228 ]; 228 ];
229 229
230 programs.ssh.knownHosts = lib.attrsets.mapAttrs' (name: profile: lib.attrsets.nameValuePair name { 230 programs.ssh.knownHosts = lib.attrsets.mapAttrs' (name: profile: lib.attrsets.nameValuePair name {
231 hostNames = [ profile.host ]; 231 extraHostNames = [ profile.host ];
232 publicKey = "${profile.host_key_type} ${profile.host_key}"; 232 publicKey = "${profile.host_key_type} ${profile.host_key}";
233 }) cfg.profiles; 233 }) cfg.profiles;
234 234
diff --git a/flakes/secrets/flake.nix b/flakes/secrets/flake.nix
index ef74a30..7bf04a4 100644
--- a/flakes/secrets/flake.nix
+++ b/flakes/secrets/flake.nix
@@ -3,6 +3,8 @@
3 3
4 outputs = { self }: { 4 outputs = { self }: {
5 nixosModule = { config, lib, pkgs, ... }: { 5 nixosModule = { config, lib, pkgs, ... }: {
6 # Necessary for situations where flake gets included multiple times
7 key = builtins.hashString "sha256" (builtins.path { path = self.sourceInfo.outPath; name = "source"; });
6 options.secrets = with lib; { 8 options.secrets = with lib; {
7 keys = mkOption { 9 keys = mkOption {
8 type = types.attrsOf (types.submodule { 10 type = types.attrsOf (types.submodule {
@@ -36,11 +38,38 @@
36 type = types.str; 38 type = types.str;
37 description = "Content of the entry"; 39 description = "Content of the entry";
38 }; 40 };
41 keyDependencies = mkOption {
42 default = [];
43 type = types.listOf (types.either types.path types.package);
44 description = ''
45 (public) system dependencies that needs to be
46 uploaded with the key.
47
48 keyDependencies + ignoredKeyDependencies should
49 contain the exhaustive list of the text context.
50
51 A warning will be thrown if there are remaning
52 dependencies from the text.
53 '';
54 };
55 ignoredKeyDependencies = mkOption {
56 default = [];
57 type = types.listOf (types.either types.path types.package);
58 description = ''
59 dependencies that must not be sent along with the key.
60
61 keyDependencies + ignoredKeyDependencies should
62 contain the exhaustive list of the text context.
63
64 A warning will be thrown if there are remaning
65 dependencies from the text.
66 '';
67 };
39 }; 68 };
40 }); 69 });
41 default = {}; 70 default = {};
42 description = "Keys attrs to upload to the server"; 71 description = "Keys attrs to upload to the server";
43 apply = lib.mapAttrsToList (dest: v: v // { inherit dest; }); 72 apply = builtins.mapAttrs (dest: v: v // { inherit dest; });
44 }; 73 };
45 gpgKeys = mkOption { 74 gpgKeys = mkOption {
46 type = types.listOf types.path; 75 type = types.listOf types.path;
@@ -74,8 +103,8 @@
74 # Read-only variables 103 # Read-only variables
75 fullPaths = mkOption { 104 fullPaths = mkOption {
76 type = types.attrsOf types.path; 105 type = types.attrsOf types.path;
77 default = builtins.listToAttrs 106 default = builtins.mapAttrs
78 (map (v: { name = v.dest; value = "${config.secrets.location}/${v.dest}"; }) config.secrets.keys); 107 (n: v: "${config.secrets.location}/${n}") config.secrets.keys;
79 readOnly = true; 108 readOnly = true;
80 description = "set of full paths to secrets"; 109 description = "set of full paths to secrets";
81 }; 110 };
@@ -83,7 +112,7 @@
83 112
84 config = let 113 config = let
85 location = config.secrets.location; 114 location = config.secrets.location;
86 keys = config.secrets.keys; 115 keys = builtins.attrValues config.secrets.keys;
87 empty = pkgs.runCommand "empty" { preferLocalBuild = true; } "mkdir -p $out && touch $out/done"; 116 empty = pkgs.runCommand "empty" { preferLocalBuild = true; } "mkdir -p $out && touch $out/done";
88 fpath = v: "secrets/${v.dest}${lib.optionalString v.isTemplated ".gucci.tpl"}"; 117 fpath = v: "secrets/${v.dest}${lib.optionalString v.isTemplated ".gucci.tpl"}";
89 dumpKey = v: 118 dumpKey = v:
@@ -125,7 +154,24 @@
125 exclPath = builtins.concatStringsSep " -o " (map (d: " -path $TMP/${d.dest}") dirs); 154 exclPath = builtins.concatStringsSep " -o " (map (d: " -path $TMP/${d.dest}") dirs);
126 in 155 in
127 lib.optionalString (builtins.length dirs > 0) " -not \\( ${exclPath} \\) "; 156 lib.optionalString (builtins.length dirs > 0) " -not \\( ${exclPath} \\) ";
157
158 checkKeyDependencies = key:
159 let
160 allDeps = builtins.map (n: if builtins.isPath n then "${n}" else n.drvPath) (key.keyDependencies ++ key.ignoredKeyDependencies);
161 context = builtins.attrNames (builtins.getContext key.text);
162 missing = builtins.foldl' (o: n: lib.remove n o) context allDeps;
163 in
164 lib.optional (!key.isDir && builtins.length missing > 0)
165 ''
166 Key ${key.dest} has non declared dependencies in its context: ${builtins.concatStringsSep " " missing}
167 Add them to ignoredKeyDependencies to ignore
168 '';
128 in lib.mkIf (builtins.length keys > 0) { 169 in lib.mkIf (builtins.length keys > 0) {
170 warnings = lib.concatMap checkKeyDependencies keys;
171 # FIXME: Use lib.concatMap (k: k.keyDependencies) keys in latest nixpkgs
172 system.extraDependencies = lib.concatMap (k: builtins.map (dep:
173 if builtins.isPath dep then pkgs.writeText "extra-dep" "${dep}" else dep
174 ) k.keyDependencies) keys;
129 system.activationScripts.secrets = { 175 system.activationScripts.secrets = {
130 deps = [ "users" "wrappers" ]; 176 deps = [ "users" "wrappers" ];
131 text = '' 177 text = ''
@@ -133,13 +179,11 @@
133 TMP=$(${pkgs.coreutils}/bin/mktemp -d) 179 TMP=$(${pkgs.coreutils}/bin/mktemp -d)
134 TMPWORK=$(${pkgs.coreutils}/bin/mktemp -d) 180 TMPWORK=$(${pkgs.coreutils}/bin/mktemp -d)
135 chmod go-rwx $TMPWORK 181 chmod go-rwx $TMPWORK
136 if [ -n "$TMP" -a -n "$TMPWORK" ]; then 182 if [ -n "$TMP" -a -n "$TMPWORK" -a -f ${config.secrets.secretsVars} ]; then
137 install -m0750 -o root -g keys -d $TMP 183 install -m0750 -o root -g keys -d $TMP
138 ${pkgs.ssh-to-age}/bin/ssh-to-age -private-key -i ${config.secrets.decryptKey} -o $TMPWORK/keys.txt 184 ${pkgs.ssh-to-age}/bin/ssh-to-age -private-key -i ${config.secrets.decryptKey} -o $TMPWORK/keys.txt
139 SOPS_AGE_KEY_FILE=$TMPWORK/keys.txt ${pkgs.sops}/bin/sops -d ${secrets} | ${pkgs.gnutar}/bin/tar --strip-components 1 -C $TMP -x 185 SOPS_AGE_KEY_FILE=$TMPWORK/keys.txt ${pkgs.sops}/bin/sops -d ${secrets} | ${pkgs.gnutar}/bin/tar --strip-components 1 -C $TMP -x
140 if [ -f ${config.secrets.secretsVars} ]; then 186 SOPS_AGE_KEY_FILE=$TMPWORK/keys.txt ${pkgs.sops}/bin/sops -d ${config.secrets.secretsVars} > $TMPWORK/vars.yml
141 SOPS_AGE_KEY_FILE=$TMPWORK/keys.txt ${pkgs.sops}/bin/sops -d ${config.secrets.secretsVars} > $TMPWORK/vars.yml
142 fi
143 if [ -f $TMPWORK/vars.yml ]; then 187 if [ -f $TMPWORK/vars.yml ]; then
144 find $TMP -name "*.gucci.tpl" -exec \ 188 find $TMP -name "*.gucci.tpl" -exec \
145 /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}' \; 189 /bin/sh -c 'f="{}"; ${pkgs.gucci}/bin/gucci -f '$TMPWORK'/vars.yml "$f" > "''${f%.gucci.tpl}"; touch --reference "$f" ''${f%.gucci.tpl} ; chmod --reference="$f" ''${f%.gucci.tpl} ; chown --reference="$f" ''${f%.gucci.tpl}' \;
diff --git a/flakes/surfer/default.nix b/flakes/surfer/default.nix
new file mode 100644
index 0000000..7a25199
--- /dev/null
+++ b/flakes/surfer/default.nix
@@ -0,0 +1,12 @@
1{ callPackage, nodeEnv, src }:
2# built using node2nix -l package-lock.json
3# and changing "./." to "src"
4(callPackage ./node-packages.nix {
5 inherit src;
6 nodeEnv = callPackage nodeEnv {};
7}).package.overrideAttrs(old: {
8 postInstall = ''
9 mkdir -p $out/bin
10 ln -s ../cloudron-surfer/server.js $out/lib/node_modules/.bin/surfer-server
11 '';
12})
diff --git a/flakes/surfer/flake.lock b/flakes/surfer/flake.lock
new file mode 100644
index 0000000..66bea60
--- /dev/null
+++ b/flakes/surfer/flake.lock
@@ -0,0 +1,149 @@
1{
2 "nodes": {
3 "flake-parts": {
4 "inputs": {
5 "nixpkgs-lib": "nixpkgs-lib"
6 },
7 "locked": {
8 "lastModified": 1675295133,
9 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
10 "owner": "hercules-ci",
11 "repo": "flake-parts",
12 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
13 "type": "github"
14 },
15 "original": {
16 "owner": "hercules-ci",
17 "repo": "flake-parts",
18 "type": "github"
19 }
20 },
21 "flake-utils": {
22 "locked": {
23 "lastModified": 1648297722,
24 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
25 "owner": "numtide",
26 "repo": "flake-utils",
27 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
28 "type": "github"
29 },
30 "original": {
31 "owner": "numtide",
32 "repo": "flake-utils",
33 "type": "github"
34 }
35 },
36 "mypackages": {
37 "inputs": {
38 "flake-parts": "flake-parts",
39 "nixpkgs": "nixpkgs",
40 "webapps-ttrss": "webapps-ttrss"
41 },
42 "locked": {
43 "lastModified": 1,
44 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
45 "path": "../mypackages",
46 "type": "path"
47 },
48 "original": {
49 "path": "../mypackages",
50 "type": "path"
51 }
52 },
53 "nixpkgs": {
54 "locked": {
55 "lastModified": 1646497237,
56 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
57 "owner": "nixos",
58 "repo": "nixpkgs",
59 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
60 "type": "github"
61 },
62 "original": {
63 "owner": "nixos",
64 "repo": "nixpkgs",
65 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
66 "type": "github"
67 }
68 },
69 "nixpkgs-lib": {
70 "locked": {
71 "dir": "lib",
72 "lastModified": 1675183161,
73 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
74 "owner": "NixOS",
75 "repo": "nixpkgs",
76 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
77 "type": "github"
78 },
79 "original": {
80 "dir": "lib",
81 "owner": "NixOS",
82 "ref": "nixos-unstable",
83 "repo": "nixpkgs",
84 "type": "github"
85 }
86 },
87 "nixpkgs_2": {
88 "flake": false,
89 "locked": {
90 "lastModified": 1596265691,
91 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
92 "owner": "NixOS",
93 "repo": "nixpkgs",
94 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
95 "type": "github"
96 },
97 "original": {
98 "owner": "NixOS",
99 "repo": "nixpkgs",
100 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
101 "type": "github"
102 }
103 },
104 "root": {
105 "inputs": {
106 "flake-utils": "flake-utils",
107 "mypackages": "mypackages",
108 "nixpkgs": "nixpkgs_2",
109 "surfer": "surfer"
110 }
111 },
112 "surfer": {
113 "flake": false,
114 "locked": {
115 "lastModified": 1588637864,
116 "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
117 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
118 "revCount": 318,
119 "type": "git",
120 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
121 },
122 "original": {
123 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
124 "type": "git",
125 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
126 }
127 },
128 "webapps-ttrss": {
129 "flake": false,
130 "locked": {
131 "lastModified": 1546759381,
132 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
133 "ref": "master",
134 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
135 "revCount": 9256,
136 "type": "git",
137 "url": "https://git.tt-rss.org/fox/tt-rss.git"
138 },
139 "original": {
140 "ref": "master",
141 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
142 "type": "git",
143 "url": "https://git.tt-rss.org/fox/tt-rss.git"
144 }
145 }
146 },
147 "root": "root",
148 "version": 7
149}
diff --git a/flakes/surfer/flake.nix b/flakes/surfer/flake.nix
new file mode 100644
index 0000000..996104c
--- /dev/null
+++ b/flakes/surfer/flake.nix
@@ -0,0 +1,36 @@
1{
2 description = "Surfer is a Simple static file server";
3 inputs.flake-utils.url = "github:numtide/flake-utils";
4 inputs.nixpkgs = {
5 url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
6 flake = false;
7 };
8 inputs.surfer = {
9 url = "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git";
10 type = "git";
11 rev = "476177380452c9c7c5b1624805feedc824c5995e";
12 flake = false;
13 };
14 inputs.mypackages.url = "path:../mypackages";
15 outputs = { self, nixpkgs, surfer, flake-utils, mypackages }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
16 let
17 pkgs = import nixpkgs { inherit system; overlays = []; };
18 nodeEnv = mypackages.mylibs.nodeEnv;
19 inherit (pkgs) callPackage;
20 in rec {
21 packages.surfer = callPackage ./. { inherit nodeEnv; src = surfer; };
22 defaultPackage = packages.surfer;
23 legacyPackages.surfer = packages.surfer;
24 checks = {
25 build = defaultPackage;
26 };
27 }
28 ) // rec {
29 overlays = {
30 surfer = final: prev: {
31 surfer = self.defaultPackage."${final.system}";
32 };
33 };
34 overlay = overlays.surfer;
35 };
36}
diff --git a/pkgs/webapps/surfer/node-packages.nix b/flakes/surfer/node-packages.nix
index a1fb5ba..a1fb5ba 100644
--- a/pkgs/webapps/surfer/node-packages.nix
+++ b/flakes/surfer/node-packages.nix
diff --git a/pkgs/webapps/taskwarrior-web/Gemfile.lock b/flakes/taskwarrior-web/Gemfile.lock
index 1b2f5ba..1b2f5ba 100644
--- a/pkgs/webapps/taskwarrior-web/Gemfile.lock
+++ b/flakes/taskwarrior-web/Gemfile.lock
diff --git a/flakes/taskwarrior-web/default.nix b/flakes/taskwarrior-web/default.nix
new file mode 100644
index 0000000..7678b3c
--- /dev/null
+++ b/flakes/taskwarrior-web/default.nix
@@ -0,0 +1,25 @@
1{ ruby_2_6, bundlerEnv, src, stdenv }:
2let
3 gems = bundlerEnv {
4 name = "taskwarrior-web-env";
5 ruby = ruby_2_6;
6 pname = "taskwarrior-web";
7 gemset = ./gemset.nix;
8 gemdir = package.out;
9 groups = [ "default" "local" "development" ];
10 };
11 package = stdenv.mkDerivation {
12 pname = "taskwarrior-web";
13 version = src.shortRev;
14 inherit src;
15 phases = [ "unpackPhase" "patchPhase" "installPhase" ];
16 patches = [ ./fixes.patch ./thin.patch ];
17 installPhase = ''
18 cp -a . $out
19 cp ${./Gemfile.lock} $out/Gemfile.lock
20 '';
21 passthru = {
22 inherit gems;
23 };
24 };
25in package
diff --git a/flakes/taskwarrior-web/fixes.patch b/flakes/taskwarrior-web/fixes.patch
new file mode 100644
index 0000000..c4cea34
--- /dev/null
+++ b/flakes/taskwarrior-web/fixes.patch
@@ -0,0 +1,113 @@
1diff --git a/lib/taskwarrior-web/helpers.rb b/lib/taskwarrior-web/helpers.rb
2index 212aed7..94c57df 100644
3--- a/lib/taskwarrior-web/helpers.rb
4+++ b/lib/taskwarrior-web/helpers.rb
5@@ -1,6 +1,8 @@
6 require 'active_support/core_ext/date/calculations'
7
8 module TaskwarriorWeb::App::Helpers
9+ include ERB::Util
10+
11 def format_date(timestamp)
12 format = TaskwarriorWeb::Config.dateformat || '%-m/%-d/%Y'
13 Time.parse(timestamp).localtime.strftime(format)
14diff --git a/lib/taskwarrior-web/model/task.rb b/lib/taskwarrior-web/model/task.rb
15index 212aed7..94c57df 100644
16--- a/lib/taskwarrior-web/model/task.rb
17+++ b/lib/taskwarrior-web/model/task.rb
18@@ -15,8 +15,14 @@
19
20 def initialize(attributes = {})
21 attributes.each do |attr, value|
22+ if attr == "uuid"
23+ next
24+ end
25 send("#{attr}=", value) if respond_to?(attr.to_sym)
26 end
27+ if attributes.has_key? "uuid"
28+ send("uuid=", attributes["uuid"])
29+ end
30
31 @_errors = []
32 @tags = [] if @tags.nil?
33diff --git a/lib/taskwarrior-web/services/builder/base.rb b/lib/taskwarrior-web/services/builder/base.rb
34index 58d246e..8f716ac 100644
35--- a/lib/taskwarrior-web/services/builder/base.rb
36+++ b/lib/taskwarrior-web/services/builder/base.rb
37@@ -10,7 +10,7 @@ module TaskwarriorWeb::CommandBuilder::Base
38 :complete => ':id done',
39 :annotate => ':id annotate',
40 :denotate => ':id denotate',
41- :projects => '_projects',
42+ :projects => '_unique project',
43 :tags => '_tags',
44 :sync => 'sync'
45 }
46@@ -21,7 +21,7 @@
47 substitute_parts if @command_string =~ /:id/
48 end
49 parse_params
50- @built = "#{@command_string}#{@params}"
51+ @built = "#{@params}#{@command_string}"
52 end
53
54 def task_command
55@@ -43,23 +43,23 @@
56
57 def parse_params
58 string = ''
59- string << %( #{@params.delete(:description).shellescape}) if @params.has_key?(:description)
60+ string << %(#{@params.delete(:description).shellescape} ) if @params.has_key?(:description)
61
62 if tags = @params.delete(:tags)
63 tag_indicator = TaskwarriorWeb::Config.property('tag.indicator') || '+'
64- tags.each { |tag| string << %( #{tag_indicator}#{tag.to_s.shellescape}) }
65+ tags.each { |tag| string << %(#{tag_indicator}#{tag.to_s.shellescape} ) }
66 end
67
68 if tags = @params.delete(:remove_tags)
69- tags.each { |tag| string << %( -#{tag.to_s.shellescape}) }
70+ tags.each { |tag| string << %(-#{tag.to_s.shellescape} ) }
71 end
72
73 @params.each do |attr, value|
74 if @command != :update or attr != :uuid
75 if value.respond_to? :each
76- value.each { |val| string << %( #{attr.to_s}:\\"#{val.to_s.shellescape}\\") }
77+ value.each { |val| string << %(#{attr.to_s}:\\"#{val.to_s.shellescape}\\" ) }
78 else
79- string << %( #{attr.to_s}:\\"#{value.to_s.shellescape}\\")
80+ string << %(#{attr.to_s}:\\"#{value.to_s.shellescape}\\" )
81 end
82 end
83 end
84diff --git a/lib/taskwarrior-web/views/tasks/_form.erb b/lib/taskwarrior-web/views/tasks/_form.erb
85index 789e7a1..fa08698 100644
86--- a/lib/taskwarrior-web/views/tasks/_form.erb
87+++ b/lib/taskwarrior-web/views/tasks/_form.erb
88@@ -1,14 +1,14 @@
89 <div class="control-group">
90 <label for="task-description" class="control-label">Description</label>
91 <div class="controls">
92- <input type="text" required="required" id="task-description" name="task[description]" value="<%= @task.description unless @task.nil? %>" />
93+ <input type="text" required="required" id="task-description" name="task[description]" value="<%=h @task.description unless @task.nil? %>" />
94 </div>
95 </div>
96
97 <div class="control-group">
98 <label for="task-project" class="control-label">Project</label>
99 <div class="controls">
100- <input type="text" id="task-project" name="task[project]" value="<%= @task.project unless @task.nil? %>" autocomplete="off" />
101+ <input type="text" id="task-project" name="task[project]" value="<%=h @task.project unless @task.nil? %>" autocomplete="off" />
102 </div>
103 </div>
104
105@@ -45,7 +45,7 @@
106 <div class="control-group">
107 <label for="task-tags" class="control-label">Tags</label>
108 <div class="controls">
109- <input type="text" id="task-tags" name="task[tags]" value="<%= @task.tags.join(', ') unless @task.nil? %>" autocomplete="off" />
110+ <input type="text" id="task-tags" name="task[tags]" value="<%=h @task.tags.join(', ') unless @task.nil? %>" autocomplete="off" />
111 <span class="help-block">Enter tags separated by commas or spaces (e.g. <em>each, word will,be a tag</em>)</span>
112 </div>
113 </div>
diff --git a/flakes/taskwarrior-web/flake.lock b/flakes/taskwarrior-web/flake.lock
new file mode 100644
index 0000000..ce87931
--- /dev/null
+++ b/flakes/taskwarrior-web/flake.lock
@@ -0,0 +1,62 @@
1{
2 "nodes": {
3 "flake-utils": {
4 "locked": {
5 "lastModified": 1648297722,
6 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
7 "owner": "numtide",
8 "repo": "flake-utils",
9 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
10 "type": "github"
11 },
12 "original": {
13 "owner": "numtide",
14 "repo": "flake-utils",
15 "type": "github"
16 }
17 },
18 "nixpkgs": {
19 "flake": false,
20 "locked": {
21 "lastModified": 1596265691,
22 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
23 "owner": "NixOS",
24 "repo": "nixpkgs",
25 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
26 "type": "github"
27 },
28 "original": {
29 "owner": "NixOS",
30 "repo": "nixpkgs",
31 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
32 "type": "github"
33 }
34 },
35 "root": {
36 "inputs": {
37 "flake-utils": "flake-utils",
38 "nixpkgs": "nixpkgs",
39 "taskwarrior-web": "taskwarrior-web"
40 }
41 },
42 "taskwarrior-web": {
43 "flake": false,
44 "locked": {
45 "lastModified": 1546434241,
46 "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
47 "owner": "theunraveler",
48 "repo": "taskwarrior-web",
49 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
50 "type": "github"
51 },
52 "original": {
53 "owner": "theunraveler",
54 "repo": "taskwarrior-web",
55 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
56 "type": "github"
57 }
58 }
59 },
60 "root": "root",
61 "version": 7
62}
diff --git a/flakes/taskwarrior-web/flake.nix b/flakes/taskwarrior-web/flake.nix
new file mode 100644
index 0000000..b08290a
--- /dev/null
+++ b/flakes/taskwarrior-web/flake.nix
@@ -0,0 +1,33 @@
1{
2 description = "A web interface for the Taskwarrior todo application. Because being a neckbeard is only fun sometimes.";
3 inputs.flake-utils.url = "github:numtide/flake-utils";
4 inputs.nixpkgs = {
5 url = "github:NixOS/nixpkgs/840c782d507d60aaa49aa9e3f6d0b0e780912742";
6 flake = false;
7 };
8 inputs.taskwarrior-web = {
9 url = "github:theunraveler/taskwarrior-web/a79cfe2b42791b62364118e58b21b892fff6ded8";
10 flake = false;
11 };
12
13 outputs = { self, nixpkgs, taskwarrior-web, flake-utils }: flake-utils.lib.eachSystem ["x86_64-linux"] (system:
14 let
15 pkgs = import nixpkgs { inherit system; overlays = []; };
16 inherit (pkgs) callPackage;
17 in rec {
18 packages.taskwarrior-web = callPackage ./. { src = taskwarrior-web; };
19 defaultPackage = packages.taskwarrior-web;
20 legacyPackages.taskwarrior-web = packages.taskwarrior-web;
21 checks = {
22 build = defaultPackage;
23 };
24 }
25 ) // rec {
26 overlays = {
27 taskwarrior-web = final: prev: {
28 taskwarrior-web = self.defaultPackage."${final.system}";
29 };
30 };
31 overlay = overlays.taskwarrior-web;
32 };
33}
diff --git a/pkgs/webapps/taskwarrior-web/gemset.nix b/flakes/taskwarrior-web/gemset.nix
index 35d13c6..35d13c6 100644
--- a/pkgs/webapps/taskwarrior-web/gemset.nix
+++ b/flakes/taskwarrior-web/gemset.nix
diff --git a/pkgs/webapps/taskwarrior-web/thin.patch b/flakes/taskwarrior-web/thin.patch
index a7df3e3..a7df3e3 100644
--- a/pkgs/webapps/taskwarrior-web/thin.patch
+++ b/flakes/taskwarrior-web/thin.patch
diff --git a/lib/default.nix b/lib/default.nix
deleted file mode 100644
index 7b392f1..0000000
--- a/lib/default.nix
+++ /dev/null
@@ -1,16 +0,0 @@
1{ pkgs }:
2with pkgs;
3rec {
4 flakeCompat = import ./flake-compat.nix;
5 nodeEnv = import ./node-env.nix;
6
7 fetchedGithub = path:
8 let
9 json = lib.importJSON path;
10 in rec {
11 version = json.tag;
12 pname = json.meta.name;
13 name = "${pname}-${version}";
14 src = fetchFromGitHub json.github;
15 };
16} // (if builtins.pathExists ./private then callPackage ./private {} else {})
diff --git a/lib/flake-compat-patched.nix b/lib/flake-compat-patched.nix
deleted file mode 100644
index 217a99f..0000000
--- a/lib/flake-compat-patched.nix
+++ /dev/null
@@ -1,190 +0,0 @@
1# Compatibility function to allow flakes to be used by
2# non-flake-enabled Nix versions. Given a source tree containing a
3# 'flake.nix' and 'flake.lock' file, it fetches the flake inputs and
4# calls the flake's 'outputs' function. It then returns an attrset
5# containing 'defaultNix' (to be used in 'default.nix'), 'shellNix'
6# (to be used in 'shell.nix').
7
8{ src, system ? builtins.currentSystem or "unknown-system" }:
9
10let
11
12 lockFilePath = src + "/flake.lock";
13
14 lockFile = builtins.fromJSON (builtins.readFile lockFilePath);
15
16 fetchTree =
17 info:
18 if info.type == "github" then
19 { outPath = fetchTarball "https://api.${info.host or "github.com"}/repos/${info.owner}/${info.repo}/tarball/${info.rev}";
20 rev = info.rev;
21 shortRev = builtins.substring 0 7 info.rev;
22 lastModified = info.lastModified;
23 lastModifiedDate = formatSecondsSinceEpoch info.lastModified;
24 narHash = info.narHash;
25 }
26 else if info.type == "git" then
27 { outPath =
28 builtins.fetchGit
29 ({ url = info.url; }
30 // (if info ? rev then { inherit (info) rev; } else {})
31 // (if info ? ref then { inherit (info) ref; } else {})
32 );
33 lastModified = info.lastModified;
34 lastModifiedDate = formatSecondsSinceEpoch info.lastModified;
35 narHash = info.narHash;
36 } // (if info ? rev then {
37 rev = info.rev;
38 shortRev = builtins.substring 0 7 info.rev;
39 } else {
40 })
41 else if info.type == "path" then
42 { outPath = builtins.path { path =
43 if builtins.substring 0 1 info.path == "."
44 then builtins.toString src + "/" + info.path
45 else info.path;
46 };
47 narHash = info.narHash;
48 }
49 else if info.type == "tarball" then
50 { outPath = fetchTarball info.url;
51 narHash = info.narHash;
52 }
53 else if info.type == "gitlab" then
54 { inherit (info) rev narHash lastModified;
55 outPath = fetchTarball "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}";
56 shortRev = builtins.substring 0 7 info.rev;
57 }
58 else
59 # FIXME: add Mercurial, tarball inputs.
60 throw "flake input has unsupported input type '${info.type}'";
61
62 callFlake4 = flakeSrc: locks:
63 let
64 flake = import (flakeSrc + "/flake.nix");
65
66 inputs = builtins.mapAttrs (n: v:
67 if v.flake or true
68 then callFlake4 (fetchTree (v.locked // v.info)) v.inputs
69 else fetchTree (v.locked // v.info)) locks;
70
71 outputs = flakeSrc // (flake.outputs (inputs // {self = outputs;}));
72 in
73 assert flake.edition == 201909;
74 outputs;
75
76 callLocklessFlake = flakeSrc:
77 let
78 flake = import (flakeSrc + "/flake.nix");
79 outputs = flakeSrc // (flake.outputs ({ self = outputs; }));
80 in outputs;
81
82 rootSrc = let
83 # Try to clean the source tree by using fetchGit, if this source
84 # tree is a valid git repository.
85 tryFetchGit = src:
86 if isGit && !isShallow
87 then
88 let res = builtins.fetchGit src;
89 in if res.rev == "0000000000000000000000000000000000000000" then removeAttrs res ["rev" "shortRev"] else res
90 else { outPath = src; };
91 # NB git worktrees have a file for .git, so we don't check the type of .git
92 isGit = builtins.pathExists (src + "/.git");
93 isShallow = builtins.pathExists (src + "/.git/shallow");
94
95 in
96 { lastModified = 0; lastModifiedDate = formatSecondsSinceEpoch 0; }
97 // (if src ? outPath then src else tryFetchGit src);
98
99 # Format number of seconds in the Unix epoch as %Y%m%d%H%M%S.
100 formatSecondsSinceEpoch = t:
101 let
102 rem = x: y: x - x / y * y;
103 days = t / 86400;
104 secondsInDay = rem t 86400;
105 hours = secondsInDay / 3600;
106 minutes = (rem secondsInDay 3600) / 60;
107 seconds = rem t 60;
108
109 # Courtesy of https://stackoverflow.com/a/32158604.
110 z = days + 719468;
111 era = (if z >= 0 then z else z - 146096) / 146097;
112 doe = z - era * 146097;
113 yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
114 y = yoe + era * 400;
115 doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
116 mp = (5 * doy + 2) / 153;
117 d = doy - (153 * mp + 2) / 5 + 1;
118 m = mp + (if mp < 10 then 3 else -9);
119 y' = y + (if m <= 2 then 1 else 0);
120
121 pad = s: if builtins.stringLength s < 2 then "0" + s else s;
122 in "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}${pad (toString minutes)}${pad (toString seconds)}";
123
124 allNodes =
125 builtins.mapAttrs
126 (key: node:
127 let
128 sourceInfo =
129 if key == lockFile.root
130 then rootSrc
131 else fetchTree (node.info or {} // removeAttrs node.locked ["dir"]);
132
133 subdir = if key == lockFile.root then "" else node.locked.dir or "";
134
135 flake = import (sourceInfo + (if subdir != "" then "/" else "") + subdir + "/flake.nix");
136
137 inputs = builtins.mapAttrs
138 (inputName: inputSpec: allNodes.${resolveInput inputSpec})
139 (node.inputs or {});
140
141 # Resolve a input spec into a node name. An input spec is
142 # either a node name, or a 'follows' path from the root
143 # node.
144 resolveInput = inputSpec:
145 if builtins.isList inputSpec
146 then getInputByPath lockFile.root inputSpec
147 else inputSpec;
148
149 # Follow an input path (e.g. ["dwarffs" "nixpkgs"]) from the
150 # root node, returning the final node.
151 getInputByPath = nodeName: path:
152 if path == []
153 then nodeName
154 else
155 getInputByPath
156 # Since this could be a 'follows' input, call resolveInput.
157 (resolveInput lockFile.nodes.${nodeName}.inputs.${builtins.head path})
158 (builtins.tail path);
159
160 outputs = flake.outputs (inputs // { self = result; });
161
162 result = outputs // sourceInfo // { inherit inputs; inherit outputs; inherit sourceInfo; };
163 in
164 if node.flake or true then
165 assert builtins.isFunction flake.outputs;
166 result
167 else
168 sourceInfo
169 )
170 lockFile.nodes;
171
172 result =
173 if !(builtins.pathExists lockFilePath)
174 then callLocklessFlake rootSrc
175 else if lockFile.version == 4
176 then callFlake4 rootSrc (lockFile.inputs)
177 else if lockFile.version >= 5 && lockFile.version <= 7
178 then allNodes.${lockFile.root}
179 else throw "lock file '${lockFilePath}' has unsupported version ${toString lockFile.version}";
180
181in
182 rec {
183 defaultNix =
184 result
185 // (if result ? defaultPackage.${system} then { default = result.defaultPackage.${system}; } else {});
186
187 shellNix =
188 defaultNix
189 // (if result ? devShell.${system} then { default = result.devShell.${system}; } else {});
190 }
diff --git a/lib/flake-compat.nix b/lib/flake-compat.nix
deleted file mode 100644
index d3daa10..0000000
--- a/lib/flake-compat.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1src:
2(import ./flake-compat-patched.nix { inherit src; }).defaultNix
3# Until https://github.com/edolstra/flake-compat/pull/18 is accepted
4# (import (
5# fetchTarball {
6# url = "https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz";
7# sha256 = "0x2jn3vrawwv9xp15674wjz9pixwjyj3j771izayl962zziivbx2";
8# }) { inherit src; }).defaultNix
diff --git a/lib/node-env.nix b/lib/node-env.nix
deleted file mode 100644
index 720e0cc..0000000
--- a/lib/node-env.nix
+++ /dev/null
@@ -1,542 +0,0 @@
1# This file originates from node2nix
2
3{stdenv, nodejs, python2, utillinux, libtool, runCommand, writeTextFile}:
4
5let
6 python = if nodejs ? python then nodejs.python else python2;
7
8 # Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise
9 tarWrapper = runCommand "tarWrapper" {} ''
10 mkdir -p $out/bin
11
12 cat > $out/bin/tar <<EOF
13 #! ${stdenv.shell} -e
14 $(type -p tar) "\$@" --warning=no-unknown-keyword
15 EOF
16
17 chmod +x $out/bin/tar
18 '';
19
20 # Function that generates a TGZ file from a NPM project
21 buildNodeSourceDist =
22 { name, version, src, ... }:
23
24 stdenv.mkDerivation {
25 name = "node-tarball-${name}-${version}";
26 inherit src;
27 buildInputs = [ nodejs ];
28 buildPhase = ''
29 export HOME=$TMPDIR
30 tgzFile=$(npm pack | tail -n 1) # Hooks to the pack command will add output (https://docs.npmjs.com/misc/scripts)
31 '';
32 installPhase = ''
33 mkdir -p $out/tarballs
34 mv $tgzFile $out/tarballs
35 mkdir -p $out/nix-support
36 echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products
37 '';
38 };
39
40 includeDependencies = {dependencies}:
41 stdenv.lib.optionalString (dependencies != [])
42 (stdenv.lib.concatMapStrings (dependency:
43 ''
44 # Bundle the dependencies of the package
45 mkdir -p node_modules
46 cd node_modules
47
48 # Only include dependencies if they don't exist. They may also be bundled in the package.
49 if [ ! -e "${dependency.name}" ]
50 then
51 ${composePackage dependency}
52 fi
53
54 cd ..
55 ''
56 ) dependencies);
57
58 # Recursively composes the dependencies of a package
59 composePackage = { name, packageName, src, dependencies ? [], ... }@args:
60 ''
61 DIR=$(pwd)
62 cd $TMPDIR
63
64 unpackFile ${src}
65
66 # Make the base dir in which the target dependency resides first
67 mkdir -p "$(dirname "$DIR/${packageName}")"
68
69 if [ -f "${src}" ]
70 then
71 # Figure out what directory has been unpacked
72 packageDir="$(find . -maxdepth 1 -type d | tail -1)"
73
74 # Restore write permissions to make building work
75 find "$packageDir" -type d -print0 | xargs -0 chmod u+x
76 chmod -R u+w "$packageDir"
77
78 # Move the extracted tarball into the output folder
79 mv "$packageDir" "$DIR/${packageName}"
80 elif [ -d "${src}" ]
81 then
82 # Get a stripped name (without hash) of the source directory.
83 # On old nixpkgs it's already set internally.
84 if [ -z "$strippedName" ]
85 then
86 strippedName="$(stripHash ${src})"
87 fi
88
89 # Restore write permissions to make building work
90 chmod -R u+w "$strippedName"
91
92 # Move the extracted directory into the output folder
93 mv "$strippedName" "$DIR/${packageName}"
94 fi
95
96 # Unset the stripped name to not confuse the next unpack step
97 unset strippedName
98
99 # Include the dependencies of the package
100 cd "$DIR/${packageName}"
101 ${includeDependencies { inherit dependencies; }}
102 cd ..
103 ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
104 '';
105
106 pinpointDependencies = {dependencies, production}:
107 let
108 pinpointDependenciesFromPackageJSON = writeTextFile {
109 name = "pinpointDependencies.js";
110 text = ''
111 var fs = require('fs');
112 var path = require('path');
113
114 function resolveDependencyVersion(location, name) {
115 if(location == process.env['NIX_STORE']) {
116 return null;
117 } else {
118 var dependencyPackageJSON = path.join(location, "node_modules", name, "package.json");
119
120 if(fs.existsSync(dependencyPackageJSON)) {
121 var dependencyPackageObj = JSON.parse(fs.readFileSync(dependencyPackageJSON));
122
123 if(dependencyPackageObj.name == name) {
124 return dependencyPackageObj.version;
125 }
126 } else {
127 return resolveDependencyVersion(path.resolve(location, ".."), name);
128 }
129 }
130 }
131
132 function replaceDependencies(dependencies) {
133 if(typeof dependencies == "object" && dependencies !== null) {
134 for(var dependency in dependencies) {
135 var resolvedVersion = resolveDependencyVersion(process.cwd(), dependency);
136
137 if(resolvedVersion === null) {
138 process.stderr.write("WARNING: cannot pinpoint dependency: "+dependency+", context: "+process.cwd()+"\n");
139 } else {
140 dependencies[dependency] = resolvedVersion;
141 }
142 }
143 }
144 }
145
146 /* Read the package.json configuration */
147 var packageObj = JSON.parse(fs.readFileSync('./package.json'));
148
149 /* Pinpoint all dependencies */
150 replaceDependencies(packageObj.dependencies);
151 if(process.argv[2] == "development") {
152 replaceDependencies(packageObj.devDependencies);
153 }
154 replaceDependencies(packageObj.optionalDependencies);
155
156 /* Write the fixed package.json file */
157 fs.writeFileSync("package.json", JSON.stringify(packageObj, null, 2));
158 '';
159 };
160 in
161 ''
162 node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"}
163
164 ${stdenv.lib.optionalString (dependencies != [])
165 ''
166 if [ -d node_modules ]
167 then
168 cd node_modules
169 ${stdenv.lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
170 cd ..
171 fi
172 ''}
173 '';
174
175 # Recursively traverses all dependencies of a package and pinpoints all
176 # dependencies in the package.json file to the versions that are actually
177 # being used.
178
179 pinpointDependenciesOfPackage = { packageName, dependencies ? [], production ? true, ... }@args:
180 ''
181 if [ -d "${packageName}" ]
182 then
183 cd "${packageName}"
184 ${pinpointDependencies { inherit dependencies production; }}
185 cd ..
186 ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
187 fi
188 '';
189
190 # Extract the Node.js source code which is used to compile packages with
191 # native bindings
192 nodeSources = runCommand "node-sources" {} ''
193 tar --no-same-owner --no-same-permissions -xf ${nodejs.src}
194 mv node-* $out
195 '';
196
197 # Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty)
198 addIntegrityFieldsScript = writeTextFile {
199 name = "addintegrityfields.js";
200 text = ''
201 var fs = require('fs');
202 var path = require('path');
203
204 function augmentDependencies(baseDir, dependencies) {
205 for(var dependencyName in dependencies) {
206 var dependency = dependencies[dependencyName];
207
208 // Open package.json and augment metadata fields
209 var packageJSONDir = path.join(baseDir, "node_modules", dependencyName);
210 var packageJSONPath = path.join(packageJSONDir, "package.json");
211
212 if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored
213 console.log("Adding metadata fields to: "+packageJSONPath);
214 var packageObj = JSON.parse(fs.readFileSync(packageJSONPath));
215
216 if(dependency.integrity) {
217 packageObj["_integrity"] = dependency.integrity;
218 } else {
219 packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads.
220 }
221
222 packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories.
223 fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2));
224 }
225
226 // Augment transitive dependencies
227 if(dependency.dependencies !== undefined) {
228 augmentDependencies(packageJSONDir, dependency.dependencies);
229 }
230 }
231 }
232
233 if(fs.existsSync("./package-lock.json")) {
234 var packageLock = JSON.parse(fs.readFileSync("./package-lock.json"));
235
236 if(packageLock.lockfileVersion !== 1) {
237 process.stderr.write("Sorry, I only understand lock file version 1!\n");
238 process.exit(1);
239 }
240
241 if(packageLock.dependencies !== undefined) {
242 augmentDependencies(".", packageLock.dependencies);
243 }
244 }
245 '';
246 };
247
248 # Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes
249 reconstructPackageLock = writeTextFile {
250 name = "addintegrityfields.js";
251 text = ''
252 var fs = require('fs');
253 var path = require('path');
254
255 var packageObj = JSON.parse(fs.readFileSync("package.json"));
256
257 var lockObj = {
258 name: packageObj.name,
259 version: packageObj.version,
260 lockfileVersion: 1,
261 requires: true,
262 dependencies: {}
263 };
264
265 function augmentPackageJSON(filePath, dependencies) {
266 var packageJSON = path.join(filePath, "package.json");
267 if(fs.existsSync(packageJSON)) {
268 var packageObj = JSON.parse(fs.readFileSync(packageJSON));
269 dependencies[packageObj.name] = {
270 version: packageObj.version,
271 integrity: "sha1-000000000000000000000000000=",
272 dependencies: {}
273 };
274 processDependencies(path.join(filePath, "node_modules"), dependencies[packageObj.name].dependencies);
275 }
276 }
277
278 function processDependencies(dir, dependencies) {
279 if(fs.existsSync(dir)) {
280 var files = fs.readdirSync(dir);
281
282 files.forEach(function(entry) {
283 var filePath = path.join(dir, entry);
284 var stats = fs.statSync(filePath);
285
286 if(stats.isDirectory()) {
287 if(entry.substr(0, 1) == "@") {
288 // When we encounter a namespace folder, augment all packages belonging to the scope
289 var pkgFiles = fs.readdirSync(filePath);
290
291 pkgFiles.forEach(function(entry) {
292 if(stats.isDirectory()) {
293 var pkgFilePath = path.join(filePath, entry);
294 augmentPackageJSON(pkgFilePath, dependencies);
295 }
296 });
297 } else {
298 augmentPackageJSON(filePath, dependencies);
299 }
300 }
301 });
302 }
303 }
304
305 processDependencies("node_modules", lockObj.dependencies);
306
307 fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2));
308 '';
309 };
310
311 # Builds and composes an NPM package including all its dependencies
312 buildNodePackage =
313 { name
314 , packageName
315 , version
316 , dependencies ? []
317 , buildInputs ? []
318 , production ? true
319 , npmFlags ? ""
320 , dontNpmInstall ? false
321 , bypassCache ? false
322 , preRebuild ? ""
323 , dontStrip ? true
324 , unpackPhase ? "true"
325 , buildPhase ? "true"
326 , ... }@args:
327
328 let
329 forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
330 extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "preRebuild" "unpackPhase" "buildPhase" ];
331 in
332 stdenv.mkDerivation ({
333 name = "node-${name}-${version}";
334 buildInputs = [ tarWrapper python nodejs ]
335 ++ stdenv.lib.optional (stdenv.isLinux) utillinux
336 ++ stdenv.lib.optional (stdenv.isDarwin) libtool
337 ++ buildInputs;
338
339 inherit dontStrip; # Stripping may fail a build for some package deployments
340 inherit dontNpmInstall preRebuild unpackPhase buildPhase;
341
342 compositionScript = composePackage args;
343 pinpointDependenciesScript = pinpointDependenciesOfPackage args;
344
345 passAsFile = [ "compositionScript" "pinpointDependenciesScript" ];
346
347 installPhase = ''
348 # Create and enter a root node_modules/ folder
349 mkdir -p $out/lib/node_modules
350 cd $out/lib/node_modules
351
352 # Compose the package and all its dependencies
353 source $compositionScriptPath
354
355 # Pinpoint the versions of all dependencies to the ones that are actually being used
356 echo "pinpointing versions of dependencies..."
357 source $pinpointDependenciesScriptPath
358
359 # Patch the shebangs of the bundled modules to prevent them from
360 # calling executables outside the Nix store as much as possible
361 patchShebangs .
362
363 # Deploy the Node.js package by running npm install. Since the
364 # dependencies have been provided already by ourselves, it should not
365 # attempt to install them again, which is good, because we want to make
366 # it Nix's responsibility. If it needs to install any dependencies
367 # anyway (e.g. because the dependency parameters are
368 # incomplete/incorrect), it fails.
369 #
370 # The other responsibilities of NPM are kept -- version checks, build
371 # steps, postprocessing etc.
372
373 export HOME=$TMPDIR
374 cd "${packageName}"
375 runHook preRebuild
376
377 ${stdenv.lib.optionalString bypassCache ''
378 if [ ! -f package-lock.json ]
379 then
380 echo "No package-lock.json file found, reconstructing..."
381 node ${reconstructPackageLock}
382 fi
383
384 node ${addIntegrityFieldsScript}
385 ''}
386
387 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
388
389 if [ "$dontNpmInstall" != "1" ]
390 then
391 # NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
392 rm -f npm-shrinkwrap.json
393
394 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
395 fi
396
397 # Create symlink to the deployed executable folder, if applicable
398 if [ -d "$out/lib/node_modules/.bin" ]
399 then
400 ln -s $out/lib/node_modules/.bin $out/bin
401 fi
402
403 # Create symlinks to the deployed manual page folders, if applicable
404 if [ -d "$out/lib/node_modules/${packageName}/man" ]
405 then
406 mkdir -p $out/share
407 for dir in "$out/lib/node_modules/${packageName}/man/"*
408 do
409 mkdir -p $out/share/man/$(basename "$dir")
410 for page in "$dir"/*
411 do
412 ln -s $page $out/share/man/$(basename "$dir")
413 done
414 done
415 fi
416
417 # Run post install hook, if provided
418 runHook postInstall
419 '';
420 } // extraArgs);
421
422 # Builds a development shell
423 buildNodeShell =
424 { name
425 , packageName
426 , version
427 , src
428 , dependencies ? []
429 , buildInputs ? []
430 , production ? true
431 , npmFlags ? ""
432 , dontNpmInstall ? false
433 , bypassCache ? false
434 , dontStrip ? true
435 , unpackPhase ? "true"
436 , buildPhase ? "true"
437 , ... }@args:
438
439 let
440 forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
441
442 extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" ];
443
444 nodeDependencies = stdenv.mkDerivation ({
445 name = "node-dependencies-${name}-${version}";
446
447 buildInputs = [ tarWrapper python nodejs ]
448 ++ stdenv.lib.optional (stdenv.isLinux) utillinux
449 ++ stdenv.lib.optional (stdenv.isDarwin) libtool
450 ++ buildInputs;
451
452 inherit dontStrip; # Stripping may fail a build for some package deployments
453 inherit dontNpmInstall unpackPhase buildPhase;
454
455 includeScript = includeDependencies { inherit dependencies; };
456 pinpointDependenciesScript = pinpointDependenciesOfPackage args;
457
458 passAsFile = [ "includeScript" "pinpointDependenciesScript" ];
459
460 installPhase = ''
461 mkdir -p $out/${packageName}
462 cd $out/${packageName}
463
464 source $includeScriptPath
465
466 # Create fake package.json to make the npm commands work properly
467 cp ${src}/package.json .
468 chmod 644 package.json
469 ${stdenv.lib.optionalString bypassCache ''
470 if [ -f ${src}/package-lock.json ]
471 then
472 cp ${src}/package-lock.json .
473 fi
474 ''}
475
476 # Pinpoint the versions of all dependencies to the ones that are actually being used
477 echo "pinpointing versions of dependencies..."
478 cd ..
479 ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
480
481 source $pinpointDependenciesScriptPath
482 cd ${packageName}
483
484 # Patch the shebangs of the bundled modules to prevent them from
485 # calling executables outside the Nix store as much as possible
486 patchShebangs .
487
488 export HOME=$PWD
489
490 ${stdenv.lib.optionalString bypassCache ''
491 if [ ! -f package-lock.json ]
492 then
493 echo "No package-lock.json file found, reconstructing..."
494 node ${reconstructPackageLock}
495 fi
496
497 node ${addIntegrityFieldsScript}
498 ''}
499
500 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
501
502 ${stdenv.lib.optionalString (!dontNpmInstall) ''
503 # NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
504 rm -f npm-shrinkwrap.json
505
506 npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
507 ''}
508
509 cd ..
510 ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
511
512 mv ${packageName} lib
513 ln -s $out/lib/node_modules/.bin $out/bin
514 '';
515 } // extraArgs);
516 in
517 stdenv.mkDerivation {
518 name = "node-shell-${name}-${version}";
519
520 buildInputs = [ python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ buildInputs;
521 buildCommand = ''
522 mkdir -p $out/bin
523 cat > $out/bin/shell <<EOF
524 #! ${stdenv.shell} -e
525 $shellHook
526 exec ${stdenv.shell}
527 EOF
528 chmod +x $out/bin/shell
529 '';
530
531 # Provide the dependencies in a development shell through the NODE_PATH environment variable
532 inherit nodeDependencies;
533 shellHook = stdenv.lib.optionalString (dependencies != []) ''
534 export NODE_PATH=$nodeDependencies/lib/node_modules
535 '';
536 };
537in
538{
539 buildNodeSourceDist = stdenv.lib.makeOverridable buildNodeSourceDist;
540 buildNodePackage = stdenv.lib.makeOverridable buildNodePackage;
541 buildNodeShell = stdenv.lib.makeOverridable buildNodeShell;
542}
diff --git a/lib/private/default.nix b/lib/private/default.nix
deleted file mode 100644
index c7d753a..0000000
--- a/lib/private/default.nix
+++ /dev/null
@@ -1,20 +0,0 @@
1{}:
2{
3 # This adds header colors to the builds, but it rebuilds the whole
4 # world from scratch, so only use it to debug!
5 # add it as postHook in derivations
6 immaePostHook = ''
7 header() {
8 echo -ne "\033[1;36m"
9 echo -n "$1"
10 echo -e "\033[0m"
11 }
12
13 echoCmd() {
14 printf "\033[1;34m%s:\033[0m" "$1"
15 shift
16 printf ' %q' "$@"
17 echo
18 }
19 '';
20}
diff --git a/modules/default.nix b/modules/default.nix
deleted file mode 100644
index 2f06eb1..0000000
--- a/modules/default.nix
+++ /dev/null
@@ -1,29 +0,0 @@
1let
2 flakeCompat = import ../lib/flake-compat.nix;
3 flakeLib = (flakeCompat ../flakes/lib).lib;
4in
5{
6 myids = (flakeCompat ../flakes/myuids).nixosModule;
7 secrets = flakeLib.withNarKeyCompat flakeCompat ../flakes/secrets "nixosModule";
8 filesWatcher = flakeLib.withNarKeyCompat flakeCompat ../flakes/files-watcher "nixosModule";
9
10 webstats = ./webapps/webstats;
11 diaspora = ./webapps/diaspora.nix;
12 etherpad-lite = ./webapps/etherpad-lite.nix;
13 mastodon = ./webapps/mastodon.nix;
14 mediagoblin = ./webapps/mediagoblin.nix;
15 peertube = (flakeCompat ../flakes/peertube).nixosModule;
16 fiche = flakeLib.withNarKeyCompat flakeCompat ../flakes/fiche "nixosModule";
17 paste = flakeLib.withNarKeyCompat flakeCompat ../flakes/paste "nixosModule";
18
19 opendmarc = flakeLib.withNarKeyCompat flakeCompat ../flakes/opendmarc "nixosModule";
20 openarc = flakeLib.withNarKeyCompat flakeCompat ../flakes/openarc "nixosModule";
21
22 duplyBackup = ./duply_backup;
23 rsyncBackup = flakeLib.withNarKeyCompat flakeCompat ../flakes/rsync_backup "nixosModule";
24 naemon = ./naemon;
25
26 php-application = ./websites/php-application.nix;
27 zrepl = ./zrepl.nix;
28 websites = ./websites;
29} // (if builtins.pathExists ./private then import ./private else {})
diff --git a/modules/duply_backup/default.nix b/modules/duply_backup/default.nix
deleted file mode 100644
index 846b1d4..0000000
--- a/modules/duply_backup/default.nix
+++ /dev/null
@@ -1,124 +0,0 @@
1{ lib, pkgs, config, name, ... }:
2
3let
4 cfg = config.myEnv.backup;
5 varDir = "/var/lib/duply";
6 duplyProfile = profile: remote: prefix: ''
7 GPG_PW="${cfg.password}"
8 TARGET="${cfg.remotes.${remote}.remote profile.bucket}${prefix}"
9 export AWS_ACCESS_KEY_ID="${cfg.remotes.${remote}.accessKeyId}"
10 export AWS_SECRET_ACCESS_KEY="${cfg.remotes.${remote}.secretAccessKey}"
11 SOURCE="${profile.rootDir}"
12 FILENAME=".duplicity-ignore"
13 DUPL_PARAMS="$DUPL_PARAMS --exclude-if-present '$FILENAME'"
14 VERBOSITY=4
15 ARCH_DIR="${varDir}/caches"
16
17 # Do a full backup after 1 month
18 MAX_FULLBKP_AGE=1M
19 DUPL_PARAMS="$DUPL_PARAMS --allow-source-mismatch --exclude-other-filesystems --full-if-older-than $MAX_FULLBKP_AGE "
20 # Backups older than 2months are deleted
21 MAX_AGE=2M
22 # Keep 2 full backups
23 MAX_FULL_BACKUPS=2
24 MAX_FULLS_WITH_INCRS=2
25 '';
26 action = "bkp_purge_purgeFull_purgeIncr";
27 varName = k: remoteName:
28 if remoteName == "eriomem" then k else remoteName + "_" + k;
29in
30{
31 options = {
32 services.duplyBackup.enable = lib.mkOption {
33 type = lib.types.bool;
34 default = false;
35 description = ''
36 Whether to enable remote backups.
37 '';
38 };
39 services.duplyBackup.profiles = lib.mkOption {
40 type = lib.types.attrsOf (lib.types.submodule {
41 options = {
42 rootDir = lib.mkOption {
43 type = lib.types.path;
44 description = ''
45 Path to backup
46 '';
47 };
48 bucket = lib.mkOption {
49 type = lib.types.str;
50 default = "immae-${name}";
51 description = ''
52 Bucket to use
53 '';
54 };
55 remotes = lib.mkOption {
56 type = lib.types.listOf lib.types.str;
57 default = ["eriomem"];
58 description = ''
59 Remotes to use for backup
60 '';
61 };
62 excludeFile = lib.mkOption {
63 type = lib.types.lines;
64 default = "";
65 description = ''
66 Content to put in exclude file
67 '';
68 };
69 };
70 });
71 };
72 };
73
74 config = lib.mkIf config.services.duplyBackup.enable {
75 system.activationScripts.backup = ''
76 install -m 0700 -o root -g root -d ${varDir} ${varDir}/caches
77 '';
78 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (k: v:
79 map (remote: [
80 (lib.nameValuePair "backup/${varName k remote}/conf" {
81 permissions = "0400";
82 text = duplyProfile v remote "${k}/";
83 })
84 (lib.nameValuePair "backup/${varName k remote}/exclude" {
85 permissions = "0400";
86 text = v.excludeFile;
87 })
88 (lib.nameValuePair "backup/${varName k remote}" {
89 permissions = "0500";
90 isDir = true;
91 })
92 ]) v.remotes) config.services.duplyBackup.profiles));
93
94 services.cron = {
95 enable = true;
96 systemCronJobs = let
97 backups = pkgs.writeScript "backups" ''
98 #!${pkgs.stdenv.shell}
99
100 ${builtins.concatStringsSep "\n" (lib.flatten (lib.mapAttrsToList (k: v:
101 map (remote: [
102 ''
103 touch ${varDir}/${varName k remote}.log
104 ${pkgs.duply}/bin/duply ${config.secrets.fullPaths."backup/${varName k remote}"}/ ${action} --force >> ${varDir}/${varName k remote}.log
105 [[ $? = 0 ]] || echo -e "Error when doing backup for ${varName k remote}, see above\n---------------------------------------" >&2
106 ''
107 ]) v.remotes
108 ) config.services.duplyBackup.profiles))}
109 '';
110 in
111 [
112 "0 2 * * * root ${backups}"
113 ];
114
115 };
116
117 security.pki.certificateFiles = [
118 (pkgs.fetchurl {
119 url = "http://downloads.e.eriomem.net/eriomemca.pem";
120 sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh";
121 })
122 ];
123 };
124}
diff --git a/modules/naemon/default.nix b/modules/naemon/default.nix
deleted file mode 100644
index 60a75b3..0000000
--- a/modules/naemon/default.nix
+++ /dev/null
@@ -1,183 +0,0 @@
1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 cfg = config.services.naemon;
7
8 naemonConfig = pkgs.runCommand "naemon-config" {
9 objectsFile = pkgs.writeText "naemon_objects.cfg" cfg.objectDefs;
10 resourceFile = config.secrets.fullPaths."naemon/resources.cfg";
11 extraConfig = pkgs.writeText "extra.cfg" cfg.extraConfig;
12 inherit (cfg) logDir varDir runDir cacheDir;
13 } ''
14 substituteAll ${./naemon.cfg} $out
15 cat $extraConfig >> $out
16 '';
17in
18{
19 options = {
20 services.naemon = {
21 enable = mkOption {
22 default = false;
23 description = "
24 Whether to use <link
25 xlink:href='http://www.naemon.org/'>Naemon</link> to monitor
26 your system or network.
27 ";
28 };
29
30 objectDefs = mkOption {
31 type = types.lines;
32 default = "";
33 description = "
34 A list of Naemon object configuration that must define
35 the hosts, host groups, services and contacts for the
36 network that you want Naemon to monitor.
37 ";
38 };
39
40 extraResource = mkOption {
41 type = types.lines;
42 default = "";
43 example = ''
44 # Sets $USER2$ to be the path to event handlers
45 #$USER2$=/usr/lib/monitoring-plugins/eventhandlers
46
47 # Store some usernames and passwords (hidden from the CGIs)
48 #$USER3$=someuser
49 #$USER4$=somepassword
50 '';
51 description = "
52 Lines to add to the resource file
53 # You can define $USERx$ macros in this file, which can in turn be used
54 # in command definitions in your host config file(s). $USERx$ macros are
55 # useful for storing sensitive information such as usernames, passwords,
56 # etc. They are also handy for specifying the path to plugins and
57 # event handlers - if you decide to move the plugins or event handlers to
58 # a different directory in the future, you can just update one or two
59 # $USERx$ macros, instead of modifying a lot of command definitions.
60 #
61 # Naemon supports up to 256 $USERx$ macros ($USER1$ through $USER256$)
62 #
63 # Resource files may also be used to store configuration directives for
64 # external data sources like MySQL...
65 #
66 ";
67 };
68
69 extraConfig = mkOption {
70 type = types.lines;
71 default = "";
72 description = "
73 Extra config to append to main config
74 ";
75 };
76
77 user = mkOption {
78 type = types.str;
79 default = "naemon";
80 description = "User for naemon";
81 };
82
83 group = mkOption {
84 type = types.str;
85 default = "naemon";
86 description = "Group for naemon";
87 };
88
89 varDir = mkOption {
90 type = types.path;
91 default = "/var/lib/naemon";
92 description = "The directory where naemon stores its data";
93 };
94
95 cacheDir = mkOption {
96 type = types.path;
97 default = "/var/cache/naemon";
98 description = "The directory where naemon stores its cache";
99 };
100
101 runDir = mkOption {
102 type = types.path;
103 default = "/run/naemon";
104 description = "The directory where naemon stores its runtime files";
105 };
106
107 logDir = mkOption {
108 type = types.path;
109 default = "/var/log/naemon";
110 description = "The directory where naemon stores its log files";
111 };
112
113 package = mkOption {
114 type = types.package;
115 default = pkgs.naemon.override {
116 inherit (cfg) varDir cacheDir logDir runDir user group;
117 };
118 description = ''
119 Naemon package to use
120 '';
121 };
122 };
123 };
124
125
126 config = mkIf cfg.enable {
127 secrets.keys = {
128 "naemon/resources.cfg" = {
129 user = cfg.user;
130 group = cfg.group;
131 permissions = "0400";
132 text = ''
133 $USER1$=${pkgs.monitoring-plugins}/libexec
134 ${cfg.extraResource}
135 '';
136 };
137 };
138
139 users.users = optionalAttrs (cfg.user == "naemon") {
140 naemon = {
141 group = cfg.group;
142 uid = config.ids.uids.nagios;
143 extraGroups = [ "keys" ];
144 };
145 };
146 users.groups = optionalAttrs (cfg.user == "naemon") {
147 naemon = {
148 gid = config.ids.gids.nagios;
149 };
150 };
151
152 services.filesWatcher.naemon = {
153 paths = [ config.secrets.fullPaths."naemon/resources.cfg" ];
154 };
155 systemd.services.naemon = {
156 description = "Naemon monitoring daemon";
157 path = [ cfg.package pkgs.monitoring-plugins ];
158 wantedBy = [ "multi-user.target" ];
159 after = [ "network.target" ];
160
161 preStart = "${cfg.package}/bin/naemon -vp ${naemonConfig}";
162 script = "${cfg.package}/bin/naemon --daemon ${naemonConfig}";
163 reload = "${pkgs.utillinux}/bin/kill -HUP $MAINPID";
164 serviceConfig = {
165 User = cfg.user;
166 Restart = "always";
167 RestartSec = 2;
168 StandardOutput = "journal";
169 StandardError = "inherit";
170 PIDFile = "${cfg.runDir}/naemon.pid";
171 LogsDirectory = assert lib.strings.hasPrefix "/var/log/" cfg.logDir;
172 lib.strings.removePrefix "/var/log/" cfg.logDir;
173 CacheDirectory = assert lib.strings.hasPrefix "/var/cache/" cfg.cacheDir;
174 let unprefixed = lib.strings.removePrefix "/var/cache/" cfg.cacheDir;
175 in [ unprefixed "${unprefixed}/checkresults" ];
176 StateDirectory = assert lib.strings.hasPrefix "/var/lib/" cfg.varDir;
177 lib.strings.removePrefix "/var/lib/" cfg.varDir;
178 RuntimeDirectory = assert lib.strings.hasPrefix "/run/" cfg.runDir;
179 lib.strings.removePrefix "/run/" cfg.runDir;
180 };
181 };
182 };
183}
diff --git a/modules/private/buildbot/common/build_helpers.py b/modules/private/buildbot/common/build_helpers.py
deleted file mode 100644
index acea905..0000000
--- a/modules/private/buildbot/common/build_helpers.py
+++ /dev/null
@@ -1,277 +0,0 @@
1from buildbot.plugins import util, steps, schedulers
2from buildbot_buildslist import BuildsList
3from shutil import which
4
5__all__ = [
6 "force_scheduler", "deploy_scheduler", "hook_scheduler",
7 "clean_branch", "package_and_upload", "SlackStatusPush",
8 "XMPPStatusPush", "NixShellCommand"
9 ]
10
11# Small helpers"
12@util.renderer
13def clean_branch(props):
14 if props.hasProperty("branch") and len(props["branch"]) > 0:
15 return props["branch"].replace("/", "_")
16 else:
17 return "HEAD"
18
19def package_and_upload(package, package_dest, package_url):
20 return [
21 steps.ShellCommand(name="build package",
22 logEnviron=False, haltOnFailure=True, workdir="source",
23 command=["git", "archive", "HEAD", "-o", package]),
24
25 steps.FileUpload(name="upload package", workersrc=package,
26 workdir="source", masterdest=package_dest,
27 url=package_url, mode=0o644),
28
29 steps.ShellCommand(name="cleanup package", logEnviron=False,
30 haltOnFailure=True, workdir="source", alwaysRun=True,
31 command=["rm", "-f", package]),
32 ]
33
34# Steps
35class NixShellCommand(steps.ShellCommand):
36 def __init__(self, command=None, pure=True, nixfile=None, **kwargs):
37 assert(isinstance(command, str))
38 oldpath = kwargs.get("env", {}).get("PATH", None)
39 if which("nix-shell", path=oldpath) is None:
40 kwargs["env"] = kwargs.get("env", {})
41 if isinstance(oldpath, str):
42 kwargs["env"]["PATH"] = "/run/current-system/sw/bin:" + oldpath
43 elif isinstance(oldpath, list):
44 kwargs["env"]["PATH"] = ["/run/current-system/sw/bin"] + oldpath
45 nixcommand = ["nix-shell"]
46 if pure:
47 nixcommand.append("--pure")
48 nixcommand.append("--run")
49 nixcommand.append(command)
50 if nixfile is not None:
51 nixcommand.append(nixfile)
52 super().__init__(command=nixcommand, **kwargs)
53
54# Schedulers
55def force_scheduler(name, builders):
56 return schedulers.ForceScheduler(name=name,
57 label="Force build", buttonName="Force build",
58 reason=util.StringParameter(name="reason", label="Reason", default="Force build"),
59 codebases=[
60 util.CodebaseParameter("",
61 branch=util.StringParameter(
62 name="branch", label="Git reference (tag, branch)", required=True),
63 revision=util.FixedParameter(name="revision", default=""),
64 repository=util.FixedParameter(name="repository", default=""),
65 project=util.FixedParameter(name="project", default=""),
66 ),
67 ],
68 username=util.FixedParameter(name="username", default="Web button"),
69 builderNames=builders)
70
71def deploy_scheduler(name, builders):
72 return schedulers.ForceScheduler(name=name,
73 builderNames=builders,
74 label="Deploy built package", buttonName="Deploy",
75 username=util.FixedParameter(name="username", default="Web button"),
76 codebases=[
77 util.CodebaseParameter(codebase="",
78 branch=util.FixedParameter(name="branch", default=""),
79 revision=util.FixedParameter(name="revision", default=""),
80 repository=util.FixedParameter(name="repository", default=""),
81 project=util.FixedParameter(name="project", default=""))],
82 reason=util.FixedParameter(name="reason", default="Deploy"),
83 properties=[
84 util.ChoiceStringParameter(label="Environment",
85 name="environment", default="integration",
86 choices=["integration", "production"]),
87 BuildsList(label="Build to deploy", name="build"),
88 ]
89 )
90
91def hook_scheduler(project, timer=10):
92 return schedulers.AnyBranchScheduler(
93 change_filter=util.ChangeFilter(category="hooks", project=project),
94 name=project, treeStableTimer=timer, builderNames=["{}_build".format(project)])
95
96# Slack/XMPP status push
97from buildbot.reporters.http import HttpStatusPushBase
98from twisted.internet import defer
99from twisted.python import log
100from buildbot.util import httpclientservice
101from buildbot.reporters import utils
102from buildbot.process import results
103from twisted.words.protocols.jabber.jid import JID
104from wokkel import client, xmppim
105from functools import partial
106
107class SlackStatusPush(HttpStatusPushBase):
108 name = "SlackStatusPush"
109
110 @defer.inlineCallbacks
111 def reconfigService(self, serverUrl, **kwargs):
112 yield HttpStatusPushBase.reconfigService(self, **kwargs)
113 self._http = yield httpclientservice.HTTPClientService.getService(
114 self.master, serverUrl)
115
116 @defer.inlineCallbacks
117 def send(self, build):
118 yield utils.getDetailsForBuild(self.master, build, wantProperties=True)
119 response = yield self._http.post("", json=self.format(build))
120 if response.code != 200:
121 log.msg("%s: unable to upload status: %s" %
122 (response.code, response.content))
123
124 def format(self, build):
125 colors = [
126 "#36A64F", # success
127 "#F1E903", # warnings
128 "#DA0505", # failure
129 "#FFFFFF", # skipped
130 "#000000", # exception
131 "#FFFFFF", # retry
132 "#D02CA9", # cancelled
133 ]
134
135 if "environment" in build["properties"]:
136 msg = "{} environment".format(build["properties"]["environment"][0])
137 if "build" in build["properties"]:
138 msg = "of archive {} in ".format(build["properties"]["build"][0]) + msg
139 elif len(build["buildset"]["sourcestamps"][0]["branch"] or []) > 0:
140 msg = "revision {}".format(build["buildset"]["sourcestamps"][0]["branch"])
141 else:
142 msg = "build"
143
144 if build["complete"]:
145 timedelta = int((build["complete_at"] - build["started_at"]).total_seconds())
146 hours, rest = divmod(timedelta, 3600)
147 minutes, seconds = divmod(rest, 60)
148 if hours > 0:
149 duration = "{}h {}min {}s".format(hours, minutes, seconds)
150 elif minutes > 0:
151 duration = "{}min {}s".format(minutes, seconds)
152 else:
153 duration = "{}s".format(seconds)
154
155 text = "Build <{}|{}> of {}'s {} was {} in {}.".format(
156 build["url"], build["buildid"],
157 build["builder"]["name"],
158 msg,
159 results.Results[build["results"]],
160 duration,
161 )
162 fields = [
163 {
164 "title": "Build",
165 "value": "<{}|{}>".format(build["url"], build["buildid"]),
166 "short": True,
167 },
168 {
169 "title": "Project",
170 "value": build["builder"]["name"],
171 "short": True,
172 },
173 {
174 "title": "Build status",
175 "value": results.Results[build["results"]],
176 "short": True,
177 },
178 {
179 "title": "Build duration",
180 "value": duration,
181 "short": True,
182 },
183 ]
184 if "environment" in build["properties"]:
185 fields.append({
186 "title": "Environment",
187 "value": build["properties"]["environment"][0],
188 "short": True,
189 })
190 if "build" in build["properties"]:
191 fields.append({
192 "title": "Archive",
193 "value": build["properties"]["build"][0],
194 "short": True,
195 })
196 attachments = [{
197 "fallback": "",
198 "color": colors[build["results"]],
199 "fields": fields
200 }]
201 else:
202 text = "Build <{}|{}> of {}'s {} started.".format(
203 build["url"], build["buildid"],
204 build["builder"]["name"],
205 msg,
206 )
207 attachments = []
208
209 return {
210 "username": "Buildbot",
211 "icon_url": "http://docs.buildbot.net/current/_static/icon.png",
212 "text": text,
213 "attachments": attachments,
214 }
215
216class XMPPStatusPush(HttpStatusPushBase):
217 name = "XMPPStatusPush"
218
219 @defer.inlineCallbacks
220 def reconfigService(self, password, recipients, **kwargs):
221 yield HttpStatusPushBase.reconfigService(self, **kwargs)
222 self.password = password
223 self.recipients = recipients
224
225 @defer.inlineCallbacks
226 def send(self, build):
227 yield utils.getDetailsForBuild(self.master, build, wantProperties=True)
228 body = self.format(build)
229 factory = client.DeferredClientFactory(JID("notify_bot@immae.fr/buildbot"), self.password)
230 d = client.clientCreator(factory)
231 def send_message(recipient, stream):
232 message = xmppim.Message(recipient=JID(recipient), body=body)
233 message.stanzaType = 'chat'
234 stream.send(message.toElement())
235 # To allow chaining
236 return stream
237 for recipient in self.recipients:
238 d.addCallback(partial(send_message, recipient))
239 d.addCallback(lambda _: factory.streamManager.xmlstream.sendFooter())
240 d.addErrback(log.err)
241
242 def format(self, build):
243 if "environment" in build["properties"]:
244 msg = "{} environment".format(build["properties"]["environment"][0])
245 if "build" in build["properties"]:
246 msg = "of archive {} in ".format(build["properties"]["build"][0]) + msg
247 elif len(build["buildset"]["sourcestamps"][0]["branch"] or []) > 0:
248 msg = "revision {}".format(build["buildset"]["sourcestamps"][0]["branch"])
249 else:
250 msg = "build"
251
252 if build["complete"]:
253 timedelta = int((build["complete_at"] - build["started_at"]).total_seconds())
254 hours, rest = divmod(timedelta, 3600)
255 minutes, seconds = divmod(rest, 60)
256 if hours > 0:
257 duration = "{}h {}min {}s".format(hours, minutes, seconds)
258 elif minutes > 0:
259 duration = "{}min {}s".format(minutes, seconds)
260 else:
261 duration = "{}s".format(seconds)
262
263 text = "Build {} ( {} ) of {}'s {} was {} in {}.".format(
264 build["buildid"], build["url"],
265 build["builder"]["name"],
266 msg,
267 results.Results[build["results"]],
268 duration,
269 )
270 else:
271 text = "Build {} ( {} ) of {}'s {} started.".format(
272 build["buildid"], build["url"],
273 build["builder"]["name"],
274 msg,
275 )
276
277 return text
diff --git a/modules/private/buildbot/common/master.cfg b/modules/private/buildbot/common/master.cfg
deleted file mode 100644
index abe08e0..0000000
--- a/modules/private/buildbot/common/master.cfg
+++ /dev/null
@@ -1,69 +0,0 @@
1# -*- python -*-
2# ex: set filetype=python:
3
4from buildbot.plugins import secrets, util, webhooks
5from buildbot.util import bytes2unicode
6import re
7import os
8from buildbot_config import E, configure
9import json
10
11class CustomBase(webhooks.base):
12 def getChanges(self, request):
13 try:
14 content = request.content.read()
15 args = json.loads(bytes2unicode(content))
16 except Exception as e:
17 raise ValueError("Error loading JSON: " + str(e))
18
19 args.setdefault("comments", "")
20 args.setdefault("repository", "")
21 args.setdefault("author", args.get("who"))
22
23 return ([args], None)
24
25userInfoProvider = util.LdapUserInfo(
26 uri=E.LDAP_URL,
27 bindUser=E.LDAP_ADMIN_USER,
28 bindPw=open(E.SECRETS_FILE + "/ldap", "r").read().rstrip(),
29 accountBase=E.LDAP_BASE,
30 accountPattern=E.LDAP_PATTERN,
31 accountFullName='cn',
32 accountEmail='mail',
33 avatarData="jpegPhoto",
34 groupBase=E.LDAP_BASE,
35 groupName="cn",
36 groupMemberPattern=E.LDAP_GROUP_PATTERN,
37 )
38
39c = BuildmasterConfig = {
40 "title": E.TITLE,
41 "titleURL": E.TITLE_URL,
42 "db": {
43 "db_url": "sqlite:///state.sqlite"
44 },
45 "protocols": { "pb": { "port": E.PB_SOCKET } },
46 "workers": [],
47 "change_source": [],
48 "schedulers": [],
49 "builders": [],
50 "services": [],
51 "secretsProviders": [
52 secrets.SecretInAFile(E.SECRETS_FILE),
53 ],
54 "www": {
55 "change_hook_dialects": { "base": { "custom_class": CustomBase } },
56 "plugins": {
57 "waterfall_view": {},
58 "console_view": {},
59 "grid_view": {},
60 "buildslist": {},
61 },
62 "auth": util.RemoteUserAuth(
63 header=b"X-Remote-User",
64 userInfoProvider=userInfoProvider,
65 headerRegex=re.compile(br"(?P<username>[^ @]+)")),
66 }
67 }
68
69configure(c)
diff --git a/modules/private/buildbot/default.nix b/modules/private/buildbot/default.nix
deleted file mode 100644
index ec28b63..0000000
--- a/modules/private/buildbot/default.nix
+++ /dev/null
@@ -1,244 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 varDir = "/var/lib/buildbot";
4 buildbot_common = pkgs.python3Packages.buildPythonPackage rec {
5 name = "buildbot_common";
6 src = ./common;
7 format = "other";
8 installPhase = ''
9 mkdir -p $out/${pkgs.python3.pythonForBuild.sitePackages}
10 cp -a $src $out/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_common
11 '';
12 };
13 buildbot = pkgs.python3Packages.buildbot-full;
14in
15{
16 options = {
17 myServices.buildbot.enable = lib.mkOption {
18 type = lib.types.bool;
19 default = false;
20 description = ''
21 Whether to enable buildbot.
22 '';
23 };
24 };
25
26 config = lib.mkIf config.myServices.buildbot.enable {
27 ids.uids.buildbot = config.myEnv.buildbot.user.uid;
28 ids.gids.buildbot = config.myEnv.buildbot.user.gid;
29
30 users.groups.buildbot.gid = config.ids.gids.buildbot;
31 users.users.buildbot = {
32 name = "buildbot";
33 uid = config.ids.uids.buildbot;
34 group = "buildbot";
35 description = "Buildbot user";
36 home = varDir;
37 extraGroups = [ "keys" ];
38 };
39
40 services.websites.env.tools.watchPaths = lib.attrsets.mapAttrsToList
41 (k: project: config.secrets.fullPaths."buildbot/${project.name}/webhook-httpd-include")
42 config.myEnv.buildbot.projects;
43
44 services.websites.env.tools.vhostConfs.git.extraConfig = lib.attrsets.mapAttrsToList (k: project: ''
45 RedirectMatch permanent "^/buildbot/${project.name}$" "/buildbot/${project.name}/"
46 RewriteEngine On
47 RewriteRule ^/buildbot/${project.name}/ws(.*)$ unix:///run/buildbot/${project.name}.sock|ws://git.immae.eu/ws$1 [P,NE,QSA,L]
48 ProxyPass /buildbot/${project.name}/ unix:///run/buildbot/${project.name}.sock|http://${project.name}-git.immae.eu/
49 ProxyPassReverse /buildbot/${project.name}/ unix:///run/buildbot/${project.name}.sock|http://${project.name}-git.immae.eu/
50 <Location /buildbot/${project.name}/>
51 Use LDAPConnect
52 Require ldap-group cn=users,ou=${project.name},cn=buildbot,ou=services,dc=immae,dc=eu
53
54 SetEnvIf X-Url-Scheme https HTTPS=1
55 ProxyPreserveHost On
56 </Location>
57 <Location /buildbot/${project.name}/change_hook/base>
58 <RequireAny>
59 Require local
60 Require ldap-group cn=users,ou=${project.name},cn=buildbot,ou=services,dc=immae,dc=eu
61 Include ${config.secrets.fullPaths."buildbot/${project.name}/webhook-httpd-include"}
62 </RequireAny>
63 </Location>
64 '') config.myEnv.buildbot.projects;
65
66 system.activationScripts = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
67 deps = [ "users" "wrappers" ];
68 text = ''
69 install -m 755 -o buildbot -g buildbot -d ${varDir}/${project.name}
70
71 ${project.activationScript}
72 '';
73 }) config.myEnv.buildbot.projects;
74
75 secrets.keys = lib.listToAttrs (
76 lib.lists.flatten (
77 lib.attrsets.mapAttrsToList (k: project:
78 lib.attrsets.mapAttrsToList (k: v:
79 (lib.nameValuePair "buildbot/${project.name}/${k}" {
80 permissions = "0600";
81 user = "buildbot";
82 group = "buildbot";
83 text = v;
84 })
85 ) project.secrets
86 ++ [
87 (lib.nameValuePair "buildbot/${project.name}/webhook-httpd-include" {
88 permissions = "0600";
89 user = "wwwrun";
90 group = "wwwrun";
91 text = lib.optionalString (project.webhookTokens != null) ''
92 Require expr "req('Access-Key') in { ${builtins.concatStringsSep ", " (map (x: "'${x}'") project.webhookTokens)} }"
93 '';
94 })
95 (lib.nameValuePair "buildbot/${project.name}/environment_file" {
96 permissions = "0600";
97 user = "buildbot";
98 group = "buildbot";
99 text = let
100 project_env = with lib.attrsets;
101 mapAttrs' (k: v: nameValuePair "BUILDBOT_${k}" v) project.environment //
102 mapAttrs' (k: v: nameValuePair "BUILDBOT_PATH_${k}" (v pkgs)) (attrByPath ["builderPaths"] {} project) //
103 {
104 BUILDBOT_PROJECT_DIR = ./projects + "/${project.name}";
105 BUILDBOT_WORKER_PORT = builtins.toString project.workerPort;
106 BUILDBOT_HOST = config.hostEnv.fqdn;
107 BUILDBOT_VIRT_URL = "qemu+ssh://libvirt@dilion.immae.eu/system";
108 };
109 in builtins.concatStringsSep "\n"
110 (lib.mapAttrsToList (envK: envV: "${envK}=${envV}") project_env);
111 })
112 ]
113 ) config.myEnv.buildbot.projects
114 )
115 ) // {
116 "buildbot/ldap" = {
117 permissions = "0600";
118 user = "buildbot";
119 group = "buildbot";
120 text = config.myEnv.buildbot.ldap.password;
121 };
122 "buildbot/worker_password" = {
123 permissions = "0600";
124 user = "buildbot";
125 group = "buildbot";
126 text = config.myEnv.buildbot.workerPassword;
127 };
128 "buildbot/ssh_key" = {
129 permissions = "0600";
130 user = "buildbot";
131 group = "buildbot";
132 text = config.myEnv.buildbot.ssh_key.private;
133 };
134 };
135
136 services.filesWatcher = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
137 restart = true;
138 paths = [
139 config.secrets.fullPaths."buildbot/ldap"
140 config.secrets.fullPaths."buildbot/worker_password"
141 config.secrets.fullPaths."buildbot/ssh_key"
142 config.secrets.fullPaths."buildbot/${project.name}/environment_file"
143 ] ++ lib.attrsets.mapAttrsToList (k: v: config.secrets.fullPaths."buildbot/${project.name}/${k}") project.secrets;
144 }) config.myEnv.buildbot.projects;
145
146 systemd.slices.buildbot = {
147 description = "buildbot slice";
148 };
149
150 networking.firewall.allowedTCPPorts = lib.attrsets.mapAttrsToList (k: v: v.workerPort) config.myEnv.buildbot.projects;
151 systemd.services = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
152 description = "Buildbot Continuous Integration Server ${project.name}.";
153 after = [ "network-online.target" ];
154 wantedBy = [ "multi-user.target" ];
155 path = project.packages pkgs ++ (project.pythonPackages buildbot.pythonModule pkgs);
156 preStart = let
157 master-cfg = "${buildbot_common}/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_common/master.cfg";
158 tac_file = pkgs.writeText "buildbot.tac" ''
159 import os
160
161 from twisted.application import service
162 from buildbot.master import BuildMaster
163
164 basedir = '${varDir}/${project.name}'
165 rotateLength = 10000000
166 maxRotatedFiles = 10
167 configfile = '${master-cfg}'
168
169 # Default umask for server
170 umask = None
171
172 # if this is a relocatable tac file, get the directory containing the TAC
173 if basedir == '.':
174 import os
175 basedir = os.path.abspath(os.path.dirname(__file__))
176
177 # note: this line is matched against to check that this is a buildmaster
178 # directory; do not edit it.
179 application = service.Application('buildmaster')
180 from twisted.python.logfile import LogFile
181 from twisted.python.log import ILogObserver, FileLogObserver
182 logfile = LogFile.fromFullPath(os.path.join(basedir, "twistd.log"), rotateLength=rotateLength,
183 maxRotatedFiles=maxRotatedFiles)
184 application.setComponent(ILogObserver, FileLogObserver(logfile).emit)
185
186 m = BuildMaster(basedir, configfile, umask)
187 m.setServiceParent(application)
188 m.log_rotation.rotateLength = rotateLength
189 m.log_rotation.maxRotatedFiles = maxRotatedFiles
190 '';
191 in ''
192 if [ ! -f ${varDir}/${project.name}/buildbot.tac ]; then
193 ${buildbot}/bin/buildbot create-master -c "${master-cfg}" "${varDir}/${project.name}"
194 rm -f ${varDir}/${project.name}/master.cfg.sample
195 rm -f ${varDir}/${project.name}/buildbot.tac
196 fi
197 ln -sf ${tac_file} ${varDir}/${project.name}/buildbot.tac
198 # different buildbots may be trying that simultaneously, add the || true to avoid complaining in case of race
199 install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ssh_key"} ${varDir}/buildbot_key || true
200 buildbot_secrets=${varDir}/${project.name}/secrets
201 install -m 0700 -o buildbot -g buildbot -d $buildbot_secrets
202 install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ldap"} $buildbot_secrets/ldap
203 install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/worker_password"} $buildbot_secrets/worker_password
204 ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList
205 (k: v: "install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/${project.name}/${k}"} $buildbot_secrets/${k}") project.secrets
206 )}
207 ${buildbot}/bin/buildbot upgrade-master ${varDir}/${project.name}
208 '';
209 environment = let
210 buildbot_config = pkgs.python3Packages.buildPythonPackage (rec {
211 name = "buildbot_config-${project.name}";
212 src = ./projects + "/${project.name}";
213 format = "other";
214 installPhase = ''
215 mkdir -p $out/${pkgs.python3.pythonForBuild.sitePackages}
216 cp -a $src $out/${pkgs.python3.pythonForBuild.sitePackages}/buildbot_config
217 '';
218 });
219 HOME = "${varDir}/${project.name}";
220 PYTHONPATH = "${buildbot.pythonModule.withPackages (self: project.pythonPackages self pkgs ++ [
221 pkgs.python3Packages.libvirt
222 pkgs.python3Packages.wokkel
223 pkgs.python3Packages.treq pkgs.python3Packages.ldap3 buildbot
224 pkgs.python3Packages.buildbot-worker
225 buildbot_common buildbot_config
226 ])}/${buildbot.pythonModule.sitePackages}${if project.pythonPathHome then ":${varDir}/${project.name}/.local/${pkgs.python3.pythonForBuild.sitePackages}" else ""}";
227 in { inherit PYTHONPATH HOME; };
228
229 serviceConfig = {
230 Slice = "buildbot.slice";
231 Type = "forking";
232 User = "buildbot";
233 Group = "buildbot";
234 RuntimeDirectory = "buildbot";
235 RuntimeDirectoryPreserve = "yes";
236 StateDirectory = "buildbot";
237 SupplementaryGroups = "keys";
238 WorkingDirectory = "${varDir}/${project.name}";
239 ExecStart = "${buildbot}/bin/buildbot start";
240 EnvironmentFile = config.secrets.fullPaths."buildbot/${project.name}/environment_file";
241 };
242 }) config.myEnv.buildbot.projects;
243 };
244}
diff --git a/modules/private/buildbot/projects/caldance/__init__.py b/modules/private/buildbot/projects/caldance/__init__.py
deleted file mode 100644
index 2074d9e..0000000
--- a/modules/private/buildbot/projects/caldance/__init__.py
+++ /dev/null
@@ -1,198 +0,0 @@
1from buildbot.plugins import *
2from buildbot_common.build_helpers import *
3import os
4from buildbot.util import bytes2unicode
5import json
6
7__all__ = [ "configure", "E" ]
8
9class E():
10 PROJECT = "caldance"
11 BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
12 SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT)
13 PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT)
14 RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
15 RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT)
16 GIT_URL = "gitolite@git.immae.eu:perso/simon_descarpentries/www.cal-dance.com"
17 SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key"
18 SSH_HOST_KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF"
19 LDAP_HOST = "ldap.immae.eu"
20 LDAP_DN = "cn=buildbot,ou=services,dc=immae,dc=eu"
21 LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu"
22 XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
23
24 PUPPET_HOST = {
25 "integration": [ "-p8022", "root@caldance.cs.immae.dev"],
26 }
27
28 # master.cfg
29 SECRETS_FILE = os.getcwd() + "/secrets"
30 LDAP_URL = "ldaps://ldap.immae.eu:636"
31 LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu"
32 LDAP_BASE = "dc=immae,dc=eu"
33 LDAP_PATTERN = "(uid=%(username)s)"
34 LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=caldance,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
35 TITLE_URL = "https://caldance.cs.immae.dev"
36 TITLE = "Caldance"
37
38class CustomBase(webhooks.base):
39 def getChanges(self, request):
40 try:
41 content = request.content.read()
42 args = json.loads(bytes2unicode(content))
43 except Exception as e:
44 raise ValueError("Error loading JSON: " + str(e))
45
46 args.setdefault("comments", "")
47 args.setdefault("repository", "")
48 args.setdefault("author", args.get("who", "unknown"))
49
50 if args["category"] == "deploy_webhook":
51 args = {
52 "category": "deploy_webhook",
53 "comments": "",
54 "repository": "",
55 "author": "webhook",
56 "project": "Caldance",
57 "properties": {
58 "environment": args.get("environment", "integration"),
59 "build": "caldance_{}.tar.gz".format(args.get("build", "master"))
60 }
61 }
62
63 return ([args], None)
64
65def deploy_hook_scheduler(project, timer=1):
66 return schedulers.AnyBranchScheduler(
67 change_filter=util.ChangeFilter(category="deploy_webhook", project=project),
68 name="{}_deploy".format(project), treeStableTimer=timer, builderNames=["{}_deploy".format(project)])
69
70def configure(c):
71 c["buildbotURL"] = E.BUILDBOT_URL
72 c["www"]["port"] = E.SOCKET
73
74 c["www"]["change_hook_dialects"]["base"] = {
75 "custom_class": CustomBase
76 }
77 c['workers'].append(worker.LocalWorker("generic-worker"))
78 c['workers'].append(worker.LocalWorker("deploy-worker"))
79
80 db_lock = util.MasterLock("deploy_after_build")
81
82 c['schedulers'].append(hook_scheduler("Caldance", timer=1))
83 c['schedulers'].append(force_scheduler("force_caldance", ["Caldance_build"]))
84 c['schedulers'].append(deploy_scheduler("deploy_caldance", ["Caldance_deploy"]))
85 c['schedulers'].append(deploy_hook_scheduler("Caldance", timer=1))
86
87 c['builders'].append(factory("caldance", locks=[db_lock.access('exclusive')]))
88
89 c['builders'].append(deploy_factory("caldance", locks=[db_lock.access('exclusive')]))
90
91 c['services'].append(SlackStatusPush(
92 name="slack_status_caldance",
93 builders=["Caldance_build", "Caldance_deploy"],
94 serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip()))
95 c['services'].append(XMPPStatusPush(
96 name="xmpp_status_caldance",
97 builders=["Caldance_build", "Caldance_deploy"],
98 recipients=E.XMPP_RECIPIENTS,
99 password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip()))
100
101def factory(project, locks=[], ignore_fails=False):
102 release_file = "{1}/{0}_%(kw:clean_branch)s.tar.gz"
103
104 package = util.Interpolate("{0}_%(kw:clean_branch)s.tar.gz".format(project), clean_branch=clean_branch)
105 package_dest = util.Interpolate(release_file.format(project, E.RELEASE_PATH), clean_branch=clean_branch)
106 package_url = util.Interpolate(release_file.format(project, E.RELEASE_URL), clean_branch=clean_branch)
107
108 factory = util.BuildFactory()
109 factory.addStep(steps.Git(logEnviron=False, repourl=E.GIT_URL,
110 sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
111 sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
112 factory.addSteps(package_and_upload(package, package_dest, package_url))
113
114 return util.BuilderConfig(
115 name="{}_build".format(project.capitalize()),
116 locks=locks,
117 workernames=["generic-worker"], factory=factory)
118
119def compute_build_infos(project):
120 @util.renderer
121 def compute(props):
122 import re, hashlib
123 build_file = props.getProperty("build")
124 package_dest = "{1}/{0}".format(build_file, E.RELEASE_PATH)
125 version = re.match(r"{0}_(.*).tar.gz".format(project), build_file).group(1)
126 with open(package_dest, "rb") as f:
127 sha = hashlib.sha256(f.read()).hexdigest()
128 return {
129 "build_version": version,
130 "build_hash": sha,
131 }
132 return compute
133
134@util.renderer
135def puppet_ssh_command(props):
136 environment = props["environment"] if props.hasProperty("environment") else "integration"
137 ssh_command = [
138 "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no",
139 "-i", E.SSH_KEY_PATH ]
140 return ssh_command + E.PUPPET_HOST.get(environment, ["host.invalid"])
141
142def deploy_factory(project, locks=[]):
143 package_dest = util.Interpolate("{0}/%(prop:build)s".format(E.RELEASE_PATH))
144
145 factory = util.BuildFactory()
146 factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
147 factory.addStep(steps.SetProperties(properties=compute_build_infos(project)))
148 factory.addStep(LdapPush(environment=util.Property("environment"),
149 project=project, build_version=util.Property("build_version"),
150 build_hash=util.Property("build_hash"), ldap_password=util.Secret("ldap")))
151 factory.addStep(steps.MasterShellCommand(command=puppet_ssh_command))
152 return util.BuilderConfig(
153 name="{}_deploy".format(project.capitalize()),
154 locks=locks,
155 workernames=["deploy-worker"], factory=factory)
156
157from twisted.internet import defer
158from buildbot.process.buildstep import FAILURE
159from buildbot.process.buildstep import SUCCESS
160from buildbot.process.buildstep import BuildStep
161
162class LdapPush(BuildStep):
163 name = "LdapPush"
164 renderables = ["environment", "project", "build_version", "build_hash", "ldap_password"]
165
166 def __init__(self, **kwargs):
167 self.environment = kwargs.pop("environment")
168 self.project = kwargs.pop("project")
169 self.build_version = kwargs.pop("build_version")
170 self.build_hash = kwargs.pop("build_hash")
171 self.ldap_password = kwargs.pop("ldap_password")
172 self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST)
173 super().__init__(**kwargs)
174
175 def run(self):
176 import json
177 from ldap3 import Reader, Writer, Server, Connection, ObjectDef
178 server = Server(self.ldap_host)
179 conn = Connection(server,
180 user=E.LDAP_DN,
181 password=self.ldap_password)
182 conn.bind()
183 obj = ObjectDef("immaePuppetClass", conn)
184 r = Reader(conn, obj,
185 "cn=caldance.{},{}".format(self.environment, E.LDAP_ROLES_BASE))
186 r.search()
187 if len(r) > 0:
188 w = Writer.from_cursor(r)
189 for value in w[0].immaePuppetJson.values:
190 config = json.loads(value)
191 if "role::caldance::{}_version".format(self.project) in config:
192 config["role::caldance::{}_version".format(self.project)] = self.build_version
193 config["role::caldance::{}_sha256".format(self.project)] = self.build_hash
194 w[0].immaePuppetJson -= value
195 w[0].immaePuppetJson += json.dumps(config, indent=" ")
196 w.commit()
197 return defer.succeed(SUCCESS)
198 return defer.succeed(FAILURE)
diff --git a/modules/private/buildbot/projects/cryptoportfolio/__init__.py b/modules/private/buildbot/projects/cryptoportfolio/__init__.py
deleted file mode 100644
index 5d70f95..0000000
--- a/modules/private/buildbot/projects/cryptoportfolio/__init__.py
+++ /dev/null
@@ -1,169 +0,0 @@
1from buildbot.plugins import *
2from buildbot_common.build_helpers import *
3import os
4
5__all__ = [ "configure", "E" ]
6
7class E():
8 PROJECT = "cryptoportfolio"
9 BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
10 SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT)
11 PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT)
12 RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
13 RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT)
14 GIT_URL = "https://git.immae.eu/perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/{0}.git"
15 SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key"
16 LDAP_HOST = "ldap.immae.eu"
17 LDAP_DN = "cn=buildbot,ou=services,dc=immae,dc=eu"
18 LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu"
19
20 PUPPET_HOST = {
21 "production": "root@cryptoportfolio.immae.eu",
22 "integration": "root@cryptoportfolio-dev.immae.eu"
23 }
24
25 # master.cfg
26 SECRETS_FILE = os.getcwd() + "/secrets"
27 LDAP_URL = "ldaps://ldap.immae.eu:636"
28 LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu"
29 LDAP_BASE = "dc=immae,dc=eu"
30 LDAP_PATTERN = "(uid=%(username)s)"
31 LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=cryptoportfolio,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
32 TITLE_URL = "https://git.immae.eu"
33 TITLE = "Cryptoportfolio"
34
35# eval .. dans .zshrc_local
36# mkdir -p $BUILD/go
37# export GOPATH=$BUILD/go
38# go get -u github.com/golang/dep/cmd/dep
39# export PATH=$PATH:$BUILD/go/bin
40# go get git.immae.eu/Cryptoportfolio/Front.git
41# cd $BUILD/go/src/git.immae.eu/Cryptoportfolio/Front.git
42# git checkout dev
43# dep ensure
44def configure(c):
45 c["buildbotURL"] = E.BUILDBOT_URL
46 c["www"]["port"] = E.SOCKET
47
48 c['workers'].append(worker.LocalWorker("generic-worker"))
49 c['workers'].append(worker.LocalWorker("deploy-worker"))
50
51 c['schedulers'].append(hook_scheduler("Trader"))
52 c['schedulers'].append(hook_scheduler("Front"))
53 c['schedulers'].append(force_scheduler(
54 "force_cryptoportfolio", ["Trader_build", "Front_build"]))
55 c['schedulers'].append(deploy_scheduler("deploy_cryptoportfolio",
56 ["Trader_deploy", "Front_deploy"]))
57
58 c['builders'].append(factory("trader"))
59 c['builders'].append(factory("front", ignore_fails=True))
60
61 c['builders'].append(deploy_factory("trader"))
62 c['builders'].append(deploy_factory("front"))
63
64 c['services'].append(SlackStatusPush(
65 name="slack_status_cryptoportfolio",
66 builders=["Front_build", "Trader_build", "Front_deploy", "Trader_deploy"],
67 serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip()))
68
69def factory(project, ignore_fails=False):
70 release_file = "{1}/{0}/{0}_%(kw:clean_branch)s.tar.gz"
71
72 url = E.GIT_URL.format(project.capitalize())
73
74 package = util.Interpolate("{0}_%(kw:clean_branch)s.tar.gz".format(project), clean_branch=clean_branch)
75 package_dest = util.Interpolate(release_file.format(project, E.RELEASE_PATH), clean_branch=clean_branch)
76 package_url = util.Interpolate(release_file.format(project, E.RELEASE_URL), clean_branch=clean_branch)
77
78 factory = util.BuildFactory()
79 factory.addStep(steps.Git(logEnviron=False, repourl=url,
80 mode="full", method="copy"))
81 factory.addStep(steps.ShellCommand(name="make install",
82 logEnviron=False, haltOnFailure=(not ignore_fails),
83 warnOnFailure=ignore_fails, flunkOnFailure=(not ignore_fails),
84 command=["make", "install"]))
85 factory.addStep(steps.ShellCommand(name="make test",
86 logEnviron=False, haltOnFailure=(not ignore_fails),
87 warnOnFailure=ignore_fails, flunkOnFailure=(not ignore_fails),
88 command=["make", "test"]))
89 factory.addSteps(package_and_upload(package, package_dest, package_url))
90
91 return util.BuilderConfig(
92 name="{}_build".format(project.capitalize()),
93 workernames=["generic-worker"], factory=factory)
94
95def compute_build_infos(project):
96 @util.renderer
97 def compute(props):
98 import re, hashlib
99 build_file = props.getProperty("build")
100 package_dest = "{2}/{0}/{1}".format(project, build_file, E.RELEASE_PATH)
101 version = re.match(r"{0}_(.*).tar.gz".format(project), build_file).group(1)
102 with open(package_dest, "rb") as f:
103 sha = hashlib.sha256(f.read()).hexdigest()
104 return {
105 "build_version": version,
106 "build_hash": sha,
107 }
108 return compute
109
110@util.renderer
111def puppet_host(props):
112 environment = props["environment"] if props.hasProperty("environment") else "integration"
113 return E.PUPPET_HOST.get(environment, "host.invalid")
114
115def deploy_factory(project):
116 package_dest = util.Interpolate("{1}/{0}/%(prop:build)s".format(project, E.RELEASE_PATH))
117
118 factory = util.BuildFactory()
119 factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
120 factory.addStep(steps.SetProperties(properties=compute_build_infos(project)))
121 factory.addStep(LdapPush(environment=util.Property("environment"),
122 project=project, build_version=util.Property("build_version"),
123 build_hash=util.Property("build_hash"), ldap_password=util.Secret("ldap")))
124 factory.addStep(steps.MasterShellCommand(command=[
125 "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", "-i", E.SSH_KEY_PATH, puppet_host]))
126 return util.BuilderConfig(name="{}_deploy".format(project.capitalize()), workernames=["deploy-worker"], factory=factory)
127
128from twisted.internet import defer
129from buildbot.process.buildstep import FAILURE
130from buildbot.process.buildstep import SUCCESS
131from buildbot.process.buildstep import BuildStep
132
133class LdapPush(BuildStep):
134 name = "LdapPush"
135 renderables = ["environment", "project", "build_version", "build_hash", "ldap_password"]
136
137 def __init__(self, **kwargs):
138 self.environment = kwargs.pop("environment")
139 self.project = kwargs.pop("project")
140 self.build_version = kwargs.pop("build_version")
141 self.build_hash = kwargs.pop("build_hash")
142 self.ldap_password = kwargs.pop("ldap_password")
143 self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST)
144 super().__init__(**kwargs)
145
146 def run(self):
147 import json
148 from ldap3 import Reader, Writer, Server, Connection, ObjectDef
149 server = Server(self.ldap_host)
150 conn = Connection(server,
151 user=E.LDAP_DN,
152 password=self.ldap_password)
153 conn.bind()
154 obj = ObjectDef("immaePuppetClass", conn)
155 r = Reader(conn, obj,
156 "cn=cryptoportfolio.{},{}".format(self.environment, E.LDAP_ROLES_BASE))
157 r.search()
158 if len(r) > 0:
159 w = Writer.from_cursor(r)
160 for value in w[0].immaePuppetJson.values:
161 config = json.loads(value)
162 if "role::cryptoportfolio::{}_version".format(self.project) in config:
163 config["role::cryptoportfolio::{}_version".format(self.project)] = self.build_version
164 config["role::cryptoportfolio::{}_sha256".format(self.project)] = self.build_hash
165 w[0].immaePuppetJson -= value
166 w[0].immaePuppetJson += json.dumps(config, indent=" ")
167 w.commit()
168 return defer.succeed(SUCCESS)
169 return defer.succeed(FAILURE)
diff --git a/modules/private/buildbot/projects/denise/__init__.py b/modules/private/buildbot/projects/denise/__init__.py
deleted file mode 100644
index abeba3c..0000000
--- a/modules/private/buildbot/projects/denise/__init__.py
+++ /dev/null
@@ -1,186 +0,0 @@
1from buildbot.plugins import *
2from buildbot_common.build_helpers import *
3import os
4from buildbot.util import bytes2unicode
5import json
6
7__all__ = [ "configure", "E" ]
8
9class E():
10 PROJECT = "denise"
11 BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
12 SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT)
13 PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT)
14 SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key"
15 SSH_HOST_KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF"
16
17 BINGO_RELEASE_PATH = "/var/lib/buildbot/outputs/denise/bingo"
18 BINGO_BETA_PATH = "/var/lib/buildbot/outputs/denise/bingo_beta"
19 BINGO_GIT_URL = "gitolite@git.immae.eu:perso/Denise/bingo"
20
21 OMS_RELEASE_PATH = "/var/lib/buildbot/outputs/denise/oms"
22 OMS_BETA_PATH = "/var/lib/buildbot/outputs/denise/oms_beta"
23 OMS_GIT_URL = "gitolite@git.immae.eu:perso/Denise/oms"
24
25 AVENTURIERS_RELEASE_PATH = "/var/lib/buildbot/outputs/denise/aventuriers"
26 AVENTURIERS_GIT_URL = "https://git.immae.eu/perso/Denise/aventuriers.git"
27
28 # master.cfg
29 SECRETS_FILE = os.getcwd() + "/secrets"
30 LDAP_URL = "ldaps://ldap.immae.eu:636"
31 LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu"
32 LDAP_BASE = "dc=immae,dc=eu"
33 LDAP_PATTERN = "(uid=%(username)s)"
34 LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=denise,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
35 TITLE_URL = "https://oms.syanni.eu"
36 TITLE = "Syanni website"
37
38class CustomBase(webhooks.base):
39 def getChanges(self, request):
40 try:
41 content = request.content.read()
42 args = json.loads(bytes2unicode(content))
43 except Exception as e:
44 raise ValueError("Error loading JSON: " + str(e))
45
46 args.setdefault("comments", "")
47 args.setdefault("repository", "")
48 args.setdefault("author", args.get("who", "unknown"))
49
50 return ([args], None)
51
52def configure(c):
53 c["buildbotURL"] = E.BUILDBOT_URL
54 c["www"]["port"] = E.SOCKET
55
56 c["www"]["change_hook_dialects"]["base"] = {
57 "custom_class": CustomBase
58 }
59 c['workers'].append(worker.LocalWorker("generic-worker-denise"))
60
61 c['schedulers'].append(hook_scheduler("DeniseBingo", timer=1))
62 c['schedulers'].append(hook_scheduler("DeniseOMS", timer=1))
63 c['schedulers'].append(hook_scheduler("DeniseAventuriers", timer=1))
64 c['schedulers'].append(force_scheduler("force_denise", [
65 "DeniseBingo_build", "DeniseOMS_build", "DeniseAventuriers_build"
66 ]))
67
68 c['builders'].append(denise_oms_factory())
69 c['builders'].append(denise_bingo_factory())
70 c['builders'].append(denise_aventuriers_factory())
71
72def denise_bingo_factory():
73 @util.renderer
74 def bingo_run_path(props):
75 if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
76 return "/run/denise_bingo/gunicorn.pid"
77 else:
78 return "/run/denise_bingo_beta/gunicorn.pid"
79
80 @util.renderer
81 def bingo_systemd_service(props):
82 if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
83 return "denise-bingo"
84 else:
85 return "denise-bingo-beta"
86
87 @util.renderer
88 def bingo_url(props):
89 if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
90 return "https://bingo.syanni.eu"
91 else:
92 return "https://beta.bingo.syanni.eu"
93
94 @util.renderer
95 def bingo_path(props):
96 if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
97 return E.BINGO_RELEASE_PATH
98 else:
99 return E.BINGO_BETA_PATH
100
101 factory = util.BuildFactory()
102 factory.addStep(steps.Git(logEnviron=False, repourl=E.BINGO_GIT_URL,
103 submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
104 sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
105 factory.addStep(steps.MasterShellCommand(command=util.Interpolate("rm -rf %(kw:bingo_path)s", bingo_path=bingo_path)))
106 factory.addStep(steps.DirectoryUpload(workersrc="../source",
107 masterdest=bingo_path,
108 url=bingo_url))
109 factory.addStep(steps.MasterShellCommand(command=util.Interpolate("chmod -R a+rX %(kw:bingo_path)s", bingo_path=bingo_path)))
110 factory.addStep(steps.MasterShellCommand(command=util.Interpolate("/run/wrappers/bin/sudo systemctl restart %(kw:bingo_service)s.service", bingo_service=bingo_systemd_service)))
111
112 return util.BuilderConfig(name="DeniseBingo_build", workernames=["generic-worker-denise"], factory=factory)
113
114def denise_oms_factory():
115 @util.renderer
116 def oms_run_path(props):
117 if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
118 return "/run/denise_oms/gunicorn.pid"
119 else:
120 return "/run/denise_oms_beta/gunicorn.pid"
121
122 @util.renderer
123 def oms_systemd_service(props):
124 if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
125 return "denise-oms"
126 else:
127 return "denise-oms-beta"
128
129 @util.renderer
130 def oms_url(props):
131 if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
132 return "https://oms.syanni.eu"
133 else:
134 return "https://beta.oms.syanni.eu"
135
136 @util.renderer
137 def oms_path(props):
138 if props.hasProperty("branch") and len(props["branch"]) > 0 and props["branch"] == "master":
139 return E.OMS_RELEASE_PATH
140 else:
141 return E.OMS_BETA_PATH
142
143 factory = util.BuildFactory()
144 factory.addStep(steps.Git(logEnviron=False, repourl=E.OMS_GIT_URL,
145 submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
146 sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
147 factory.addStep(steps.MasterShellCommand(command=util.Interpolate("rm -rf %(kw:oms_path)s", oms_path=oms_path)))
148 factory.addStep(steps.DirectoryUpload(workersrc="../source",
149 masterdest=oms_path,
150 url=oms_url))
151 factory.addStep(steps.MasterShellCommand(command=util.Interpolate("chmod -R a+rX %(kw:oms_path)s", oms_path=oms_path)))
152 factory.addStep(steps.MasterShellCommand(command=util.Interpolate("/run/wrappers/bin/sudo systemctl restart %(kw:oms_service)s.service", oms_service=oms_systemd_service)))
153
154 return util.BuilderConfig(name="DeniseOMS_build", workernames=["generic-worker-denise"], factory=factory)
155
156def denise_aventuriers_factory():
157 path_env = {
158 "PATH": os.environ["BUILDBOT_PATH_Aventuriers"] + ":${PATH}",
159 "TZ": "Europe/Paris",
160 }
161
162 factory = util.BuildFactory()
163 factory.addStep(steps.Git(logEnviron=False, repourl=E.AVENTURIERS_GIT_URL,
164 submodules=True, mode="full", method="fresh"))
165 factory.addStep(steps.ShellCommand(name="build files",
166 logEnviron=False, haltOnFailure=True, workdir="build",
167 env=path_env, command=["make", "tout", "encyclo"]))
168 factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.AVENTURIERS_RELEASE_PATH)))
169 factory.addStep(steps.DirectoryUpload(workersrc="../build/html",
170 masterdest=E.AVENTURIERS_RELEASE_PATH,
171 url="https://aventuriers.syanni.eu"))
172 factory.addStep(steps.FileUpload(name="upload epub file", workersrc="aventuriers.epub",
173 workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.epub",
174 url="https://aventuriers.syanni.eu/aventuriers.epub", mode=0o644))
175 factory.addStep(steps.FileUpload(name="upload mobi file", workersrc="aventuriers.mobi",
176 workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.mobi",
177 url="https://aventuriers.syanni.eu/aventuriers.mobi", mode=0o644))
178 factory.addStep(steps.FileUpload(name="upload pdf file", workersrc="aventuriers.pdf",
179 workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/aventuriers.pdf",
180 url="https://aventuriers.syanni.eu/aventuriers.pdf", mode=0o644))
181 factory.addStep(steps.FileUpload(name="upload encyclo pdf file", workersrc="encyclo.pdf",
182 workdir="build", masterdest=E.AVENTURIERS_RELEASE_PATH + "/encyclo.pdf",
183 url="https://aventuriers.syanni.eu/encyclo.pdf", mode=0o644))
184 factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.AVENTURIERS_RELEASE_PATH)))
185
186 return util.BuilderConfig(name="DeniseAventuriers_build", workernames=["generic-worker-denise"], factory=factory)
diff --git a/modules/private/buildbot/projects/immaeEu/__init__.py b/modules/private/buildbot/projects/immaeEu/__init__.py
deleted file mode 100644
index 83265cd..0000000
--- a/modules/private/buildbot/projects/immaeEu/__init__.py
+++ /dev/null
@@ -1,314 +0,0 @@
1from buildbot.plugins import *
2from buildbot_common.build_helpers import *
3import os
4from buildbot.util import bytes2unicode
5import json
6
7__all__ = [ "configure", "E" ]
8
9class E():
10 PROJECT = "immaeEu"
11 BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
12 SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT)
13 PB_SOCKET = "unix:address=/run/buildbot/{}_pb.sock".format(PROJECT)
14 SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key"
15 SSH_HOST_KEY = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF"
16 XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
17
18 BIP39_GIT_URL = "https://git.immae.eu/perso/Immae/Projets/Cryptomonnaies/BIP39.git"
19 IMMAE_EU_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Blog"
20 HISTORY_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/History"
21 RECETTES_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Recettes"
22 COURS_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Cours"
23 DOCS_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Sites/Docs"
24 NORMALESUP_GIT_URL = "gitolite@git.immae.eu:perso/Immae/Projets/Sites/Normalesup"
25
26 COURS_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/cours"
27 COURS_TARBALL_PATH = "/var/lib/ftp/release.immae.eu/cours"
28 COURS_TARBALL_URL = "https://release.immae.eu/cours"
29 BIP39_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/bip39"
30 HISTORY_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/history"
31 IMMAE_EU_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/blog"
32 DOCS_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/docs"
33 RECETTES_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/recettes"
34 NORMALESUP_RELEASE_PATH = "/var/lib/buildbot/outputs/immae/recherche"
35 GSMCELLS_RELEASE_PATH = "/var/lib/ftp/release.immae.eu/gsm_cells"
36 GSMCELLS_RELEASE_URL = "https://release.immae.eu/gsm_cells"
37
38 # master.cfg
39 SECRETS_FILE = os.getcwd() + "/secrets"
40 LDAP_URL = "ldaps://ldap.immae.eu:636"
41 LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu"
42 LDAP_BASE = "dc=immae,dc=eu"
43 LDAP_PATTERN = "(uid=%(username)s)"
44 LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=immaeEu,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
45 TITLE_URL = "https://www.immae.eu"
46 TITLE = "Immae website"
47
48class CustomBase(webhooks.base):
49 def getChanges(self, request):
50 try:
51 content = request.content.read()
52 args = json.loads(bytes2unicode(content))
53 except Exception as e:
54 raise ValueError("Error loading JSON: " + str(e))
55
56 args.setdefault("comments", "")
57 args.setdefault("repository", "")
58 args.setdefault("author", args.get("who", "unknown"))
59
60 return ([args], None)
61
62def configure(c):
63 c["buildbotURL"] = E.BUILDBOT_URL
64 c["www"]["port"] = E.SOCKET
65
66 c["www"]["change_hook_dialects"]["base"] = {
67 "custom_class": CustomBase
68 }
69 c['workers'].append(worker.LocalWorker("generic-worker-immae-eu"))
70
71 c['schedulers'].append(hook_scheduler("ImmaeEu", timer=1))
72 c['schedulers'].append(hook_scheduler("Normalesup", timer=1))
73 c['schedulers'].append(hook_scheduler("Cours", timer=1))
74 c['schedulers'].append(hook_scheduler("Recettes", timer=1))
75 c['schedulers'].append(hook_scheduler("Docs", timer=1))
76 c['schedulers'].append(hook_scheduler("History", timer=1))
77 c['schedulers'].append(hook_scheduler("BIP39", timer=1))
78 c['schedulers'].append(schedulers.Nightly(name="GSMCells-weekly",
79 builderNames=["GSMCells_build"], dayOfWeek=6, hour=3))
80 c['schedulers'].append(force_scheduler("force_immae_eu", [
81 "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build",
82 "Recettes_build", "History_build", "BIP39_build"
83 ]))
84 c['schedulers'].append(schedulers.ForceScheduler(
85 name="GSMCells-force", label="Force build",
86 buttonName="Force build",
87 reason=util.StringParameter(name="reason", label="Reason", default="Force build"),
88 codebases=[
89 util.CodebaseParameter("",
90 branch=util.FixedParameter(name="branch", default=""),
91 revision=util.FixedParameter(name="revision", default=""),
92 repository=util.FixedParameter(name="repository", default=""),
93 project=util.FixedParameter(name="project", default=""),
94 ),
95 ],
96 username=util.FixedParameter(name="username", default="Web button"),
97 builderNames=["GSMCells_build"]
98 ))
99
100 c['builders'].append(immae_eu_factory())
101 c['builders'].append(normalesup_factory())
102 c['builders'].append(cours_factory())
103 c['builders'].append(gsm_cells_factory())
104 c['builders'].append(recettes_factory())
105 c['builders'].append(docs_factory())
106 c['builders'].append(history_factory())
107 c['builders'].append(bip39_factory())
108
109 c['services'].append(SlackStatusPush(
110 name="slack_status_immae_eu_project",
111 builders=[
112 "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build",
113 "GSMCells_build", "Recettes_build", "History_build",
114 "BIP39_build"
115 ],
116 serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip()))
117 c['services'].append(XMPPStatusPush(
118 name="xmpp_status_immae_eu_project",
119 builders=[
120 "ImmaeEu_build", "Normalesup_build", "Cours_build", "Docs_build",
121 "GSMCells_build", "Recettes_build", "History_build",
122 "BIP39_build"
123 ],
124 recipients=E.XMPP_RECIPIENTS,
125 password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip()))
126
127def history_factory():
128 path_env = {
129 "PATH": os.environ["BUILDBOT_PATH_History"] + ":${PATH}"
130 }
131 factory = util.BuildFactory()
132 factory.addStep(steps.Git(logEnviron=False, repourl=E.HISTORY_GIT_URL,
133 submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
134 sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
135 factory.addStep(steps.ShellCommand(name="build website",
136 logEnviron=False, haltOnFailure=True, workdir="source",
137 env=path_env, command=["jekyll", "build"]))
138 factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.HISTORY_RELEASE_PATH)))
139 factory.addStep(steps.DirectoryUpload(workersrc="../source/_site",
140 masterdest=E.HISTORY_RELEASE_PATH,
141 url="https://www.immae.eu/history"))
142 factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.HISTORY_RELEASE_PATH)))
143
144 return util.BuilderConfig(name="History_build", workernames=["generic-worker-immae-eu"], factory=factory)
145
146def docs_factory():
147 path_env = {
148 "PATH": os.environ["BUILDBOT_PATH_Docs"] + ":${PATH}"
149 }
150 factory = util.BuildFactory()
151 factory.addStep(steps.Git(logEnviron=False, repourl=E.DOCS_GIT_URL,
152 submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
153 sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
154 factory.addStep(steps.ShellCommand(name="build website",
155 logEnviron=False, haltOnFailure=True, workdir="source",
156 env=path_env, command=["make", "clean", "html"]))
157 factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.DOCS_RELEASE_PATH)))
158 factory.addStep(steps.DirectoryUpload(workersrc="../source/_build/html",
159 masterdest=E.DOCS_RELEASE_PATH,
160 url="https://www.immae.eu/docs"))
161 factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.DOCS_RELEASE_PATH)))
162
163 return util.BuilderConfig(name="Docs_build", workernames=["generic-worker-immae-eu"], factory=factory)
164
165def recettes_factory():
166 path_env = {
167 "PATH": os.environ["BUILDBOT_PATH_Recettes"] + ":${PATH}"
168 }
169 factory = util.BuildFactory()
170 factory.addStep(steps.Git(logEnviron=False, repourl=E.RECETTES_GIT_URL,
171 submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
172 sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
173 factory.addStep(NixShellCommand(name="build website",
174 logEnviron=False, haltOnFailure=True, workdir="source",
175 env=path_env, command="jekyll build --trace --baseurl /recettes"))
176 factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.RECETTES_RELEASE_PATH)))
177 factory.addStep(steps.DirectoryUpload(workersrc="../source/_site",
178 masterdest=E.RECETTES_RELEASE_PATH,
179 url="https://www.immae.eu/recettes"))
180 factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.RECETTES_RELEASE_PATH)))
181
182 return util.BuilderConfig(name="Recettes_build", workernames=["generic-worker-immae-eu"], factory=factory)
183
184def bip39_factory():
185 path_env = {
186 "PATH": os.environ["BUILDBOT_PATH_BIP39"] + ":${PATH}"
187 }
188 factory = util.BuildFactory()
189 factory.addStep(steps.Git(logEnviron=False, repourl=E.BIP39_GIT_URL,
190 submodules=True, mode="full", method="copy"))
191 factory.addStep(steps.ShellCommand(name="build file",
192 logEnviron=False, haltOnFailure=True, workdir="source",
193 env=path_env, command=["python", "compile.py"]))
194 factory.addStep(steps.FileUpload(name="upload file", workersrc="bip39-standalone.html",
195 workdir="source", masterdest=E.BIP39_RELEASE_PATH + "/index.html",
196 url="https://tools.immae.eu/BIP39", mode=0o644))
197 factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.BIP39_RELEASE_PATH)))
198
199 return util.BuilderConfig(name="BIP39_build", workernames=["generic-worker-immae-eu"], factory=factory)
200
201def immae_eu_factory():
202 path_env = {
203 "PATH": os.environ["BUILDBOT_PATH_ImmaeEu"] + ":${PATH}"
204 }
205 factory = util.BuildFactory()
206 factory.addStep(steps.Git(logEnviron=False, repourl=E.IMMAE_EU_GIT_URL,
207 submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
208 sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
209 factory.addStep(steps.ShellCommand(name="build website",
210 logEnviron=False, haltOnFailure=True, workdir="source",
211 env=path_env, command=["make", "html"]))
212 factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.IMMAE_EU_RELEASE_PATH)))
213 factory.addStep(steps.DirectoryUpload(workersrc="../source/output",
214 masterdest=E.IMMAE_EU_RELEASE_PATH,
215 url="https://www.immae.eu"))
216 factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.IMMAE_EU_RELEASE_PATH)))
217
218 return util.BuilderConfig(name="ImmaeEu_build", workernames=["generic-worker-immae-eu"], factory=factory)
219
220def cours_factory():
221 path_env = {
222 "PATH": os.environ["BUILDBOT_PATH_Cours"] + ":${PATH}",
223 "CI": "yes"
224 }
225 factory = util.BuildFactory()
226 factory.addStep(steps.Git(logEnviron=False, repourl=E.COURS_GIT_URL,
227 submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
228 sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
229 factory.addStep(steps.ShellCommand(name="build website",
230 logEnviron=False, haltOnFailure=True, workdir="source",
231 command=["make", "build"], env=path_env))
232 factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.COURS_RELEASE_PATH)))
233 factory.addStep(steps.DirectoryUpload(workersrc="../source/build",
234 masterdest=E.COURS_RELEASE_PATH,
235 url="https://www.immae.eu/cours"))
236 factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.COURS_RELEASE_PATH)))
237
238 factory.addStep(steps.ShellCommand(name="build pdfs",
239 logEnviron=False, haltOnFailure=True, workdir="source",
240 command=["make", "pdfs"], env=path_env))
241
242 package = util.Interpolate("cours_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch)
243 release_file = "{0}/cours_%(kw:clean_branch)s.tar.gz"
244 package_dest = util.Interpolate(release_file.format(E.COURS_TARBALL_PATH), clean_branch=clean_branch)
245 package_url = util.Interpolate(release_file.format(E.COURS_TARBALL_URL), clean_branch=clean_branch)
246 factory.addStep(steps.ShellCommand(name="build pdf tarball",
247 logEnviron=False, haltOnFailure=True, workdir="source",
248 command=["tar", "-cvf", package, "-C", "pdfs", "mp", "mpsi"], env=path_env))
249 factory.addStep(steps.FileUpload(name="upload package", workersrc=package,
250 workdir="source", masterdest=package_dest,
251 url=package_url, mode=0o644))
252
253 return util.BuilderConfig(name="Cours_build", workernames=["generic-worker-immae-eu"], factory=factory)
254
255def normalesup_factory():
256 path_env = {
257 "PATH": os.environ["BUILDBOT_PATH_Normalesup"] + ":${PATH}"
258 }
259 factory = util.BuildFactory()
260 factory.addStep(steps.Git(logEnviron=False, repourl=E.NORMALESUP_GIT_URL,
261 submodules=True, sshPrivateKey=open(E.SSH_KEY_PATH).read().rstrip(),
262 sshHostKey=E.SSH_HOST_KEY, mode="full", method="copy"))
263 factory.addStep(steps.ShellCommand(name="build website",
264 logEnviron=False, haltOnFailure=True, workdir="source",
265 command=["make", "build"], env=path_env))
266 factory.addStep(steps.ShellCommand(name="give read access to all files",
267 logEnviron=False, haltOnFailure=True, workdir="source",
268 command="chmod -R a+rX build", env=path_env))
269 factory.addStep(steps.ShellCommand(name="synchronize with phare",
270 logEnviron=False, haltOnFailure=True, workdir="source",
271 env=path_env, command=[
272 "rsync", "-av", "--delete",
273 "-e", "ssh -i {} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o CheckHostIP=no".format(E.SSH_KEY_PATH),
274 "build/",
275 os.environ["BUILDBOT_NORMALESUP_HOST"]
276 ]))
277 factory.addStep(steps.MasterShellCommand(command="rm -rf {}".format(E.NORMALESUP_RELEASE_PATH)))
278 factory.addStep(steps.DirectoryUpload(workersrc="../source/build", masterdest=E.NORMALESUP_RELEASE_PATH,
279 url="https://www.immae.eu/recherche"))
280 factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.NORMALESUP_RELEASE_PATH)))
281
282 return util.BuilderConfig(name="Normalesup_build", workernames=["generic-worker-immae-eu"], factory=factory)
283
284def gsm_cells_factory():
285 path_env = {
286 "PATH": os.environ["BUILDBOT_PATH_GSMCells"] + ":${PATH}",
287 "IN_BUILDBOT": "yes",
288 }
289 master_env = {
290 "HTACCESS": '''
291 Options +FollowSymLinks
292 IndexIgnore *
293 '''
294 }
295 for k, v in os.environ.items():
296 if k.startswith("BUILDBOT_GSM_CELLS_"):
297 path_env[k[len("BUILDBOT_GSM_CELLS_"):]] = v
298
299 script = os.environ["BUILDBOT_PROJECT_DIR"] + "/scripts/lacells_download"
300 factory = util.BuildFactory()
301 factory.addStep(steps.ShellCommand(name="download files",
302 logEnviron=False, haltOnFailure=True, command=[script], env=path_env))
303 factory.addStep(steps.ShellCommand(name="give read access to all files",
304 logEnviron=False, haltOnFailure=True,
305 command="chmod a+r lacells.db", env=path_env))
306 factory.addStep(steps.FileUpload(workersrc="lacells.db",
307 masterdest=(E.GSMCELLS_RELEASE_PATH+"/lacells.db"), url=(E.GSMCELLS_RELEASE_URL+"/lacells.db")))
308 factory.addStep(steps.MasterShellCommand(command="touch {}/.duplicity-ignore".format(E.GSMCELLS_RELEASE_PATH)))
309 factory.addStep(steps.MasterShellCommand(command='echo "$HTACCESS" > {}/.htaccess'.format(E.GSMCELLS_RELEASE_PATH),
310 env=master_env))
311 factory.addStep(steps.MasterShellCommand(command="ln -sf lacells.db {}/lacells.db.new".format(E.GSMCELLS_RELEASE_PATH)))
312 factory.addStep(steps.MasterShellCommand(command="chmod -R a+rX {}".format(E.GSMCELLS_RELEASE_PATH)))
313
314 return util.BuilderConfig(name="GSMCells_build", workernames=["generic-worker-immae-eu"], factory=factory)
diff --git a/modules/private/buildbot/projects/immaeEu/scripts/lacells_download b/modules/private/buildbot/projects/immaeEu/scripts/lacells_download
deleted file mode 100755
index 1193cf3..0000000
--- a/modules/private/buildbot/projects/immaeEu/scripts/lacells_download
+++ /dev/null
@@ -1,163 +0,0 @@
1#!/usr/bin/env bash
2
3# FLG - Fast Lacells.db Generator
4#
5# Simple script to quickly download and generate lacells.db for LocalGSMBackend by n76
6# https://github.com/n76/Local-GSM-Backend
7# Uses Mozilla Location Service, OpenCellID and radiocells.org databases as source
8# Based on lacells-creator by wvengen and n76
9#
10# Licensed under GPLv3 or later
11# (C)2016 Sebastian Obrusiewicz
12# sobrus@o2.pl
13
14if [ -z "$IN_BUILDBOT" ]; then
15#DEFAULT_CONFIG_BEGIN
16ENABLE_OCI=1 #enable OpenCellID data source
17ENABLE_MOZ=1 #enable Mozilla Location Services (MLS) data source
18ENABLE_RCO=0 #enable radiocells.org data source (it can be quite slow)
19
20# See https://en.wikipedia.org/wiki/Mobile_country_code
21# 208 France
22MCC="" #contry codes separated with "|", for example "260|262". Leave dot+asterisk ".*" for all countries
23RCO_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
24RADIO="" #you can remove LTE if your phone does not support it
25TOKEN="" #your OCID token, required to download from OpenCellID. Get your free token at https://opencellid.org/
26fi
27TMPDIR='.' #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
28KEEP_FILES=1 #whether to keep (1) or delete (0) the CSV files after processing
29
30#do not edit following variables, unless you know what you're doing
31EMPTY=',,,,,,,,,,,,,' #dummy empty file for disabled sources
32OCI_FILE=$TMPDIR"/ocid.csv" #opencellid temporary file
33MOZ_FILE=$TMPDIR"/mozilla.csv" #mozilla temporary file
34RCO_FILE=$TMPDIR"/rco.csv" #radiocells.org temporary file
35#DEFAULT_CONFIG_END
36
37#USER_CONFIG_BEGIN
38BINDIR=$( dirname "$(readlink -f "$0")" ) #"
39if [[ -f "${BINDIR}/config" ]]; then
40 . "${BINDIR}/config"
41fi
42#USER_CONFIG_END
43
44function manage_backup
45{
46 file=$1
47 if [ -s $file ]
48 then
49 if [ $KEEP_FILES == "1" ]
50 then
51 gzip -kf $file
52 fi
53 elif [ -s $file".gz" ] && [ "${file##*.}" == "csv" ]
54 then
55 echo "Using" $file".gz backup file"
56 gzip -dkf $file".gz"
57 fi
58}
59
60
61function download_ocid
62{
63 URL="https://opencellid.org/ocid/downloads?token=${TOKEN}&type=full&file=cell_towers.csv.gz"
64 if [ $ENABLE_OCI == "1" ]
65 then
66 wget -qO- "$URL" | gunzip | egrep "^($RADIO),($MCC)," > $OCI_FILE
67 manage_backup $OCI_FILE
68 else
69 echo $EMPTY > $OCI_FILE
70 fi
71}
72
73function download_mozilla
74{
75 if [ $ENABLE_MOZ == "1" ]
76 then
77 NW=`date -u "+%Y-%m-%d"`
78 wget -qO- "https://d17pt8qph6ncyq.cloudfront.net/export/MLS-full-cell-export-${NW}T000000.csv.gz" | gunzip | egrep "^($RADIO),($MCC)," > $MOZ_FILE
79 manage_backup $MOZ_FILE
80 else
81 echo $EMPTY > $MOZ_FILE
82 fi
83}
84
85function download_radiocells
86{
87 if [ $ENABLE_RCO == "1" ]
88 then
89 RCO_SELECT="SELECT technology, mcc, mnc, area, cid, NULL, longitude, latitude, 1000 accuracy, measurements, NULL, NULL, NULL, NULL FROM cell_zone;"
90 wget -qO- "https://cdn.radiocells.org/"$RCO_SRC_FILE > $TMPDIR"/"$RCO_SRC_FILE
91 sqlite3 -header -csv $TMPDIR"/"$RCO_SRC_FILE "$RCO_SELECT" | egrep "^($RADIO),($MCC)," > $RCO_FILE
92 rm $TMPDIR"/"$RCO_SRC_FILE
93 manage_backup $RCO_FILE
94 else
95 echo $EMPTY > $RCO_FILE
96 fi
97}
98
99echo "Downloading data"
100
101download_ocid &
102OP=$!
103download_mozilla &
104MO=$!
105download_radiocells &
106RO=$!
107
108wait $OP
109wait $MO
110wait $RO
111
112if [ -s $MOZ_FILE ] && [ -s $OCI_FILE ] && [ -s $RCO_FILE ]
113then
114
115manage_backup lacells.db
116rm lacells.db
117
118echo "Generating database"
119
120sqlite3 lacells.db <<-SQL
121PRAGMA synchronous = OFF;
122PRAGMA journal_mode = OFF;
123
124CREATE 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);
125CREATE TABLE cells (mcc INTEGER,mnc INTEGER,lac INTEGER,cid INTEGER,longitude REAL,latitude REAL,altitude REAL,accuracy REAL,samples INTEGER);
126
127.header on
128.mode csv
129
130.import "$OCI_FILE" cells_import
131.import "$MOZ_FILE" cells_import
132.import "$RCO_FILE" cells_import
133
134UPDATE cells_import SET samples=1 WHERE samples IS NULL OR samples < 1;
135
136INSERT INTO cells
137SELECT mcc, mnc, lac, cid,
138 sum(longitude * samples) / sum(samples) as longitude,
139 sum(latitude * samples) / sum(samples) as latitude,
140 -1 as altitude,
141 sum(accuracy * samples) / sum(samples) as accuracy,
142 sum(samples) as samples
143FROM cells_import
144GROUP BY mcc, mnc, lac, cid;
145
146DROP TABLE cells_import;
147
148UPDATE cells SET accuracy=500 WHERE accuracy < 500;
149UPDATE cells SET accuracy=100000 WHERE accuracy > 100000;
150
151CREATE INDEX _idx1 ON cells (mcc, mnc, lac, cid);
152CREATE INDEX _idx2 ON cells (lac, cid);
153
154VACUUM;
155SQL
156
157else
158 echo "Download error"
159fi
160
161rm $OCI_FILE
162rm $MOZ_FILE
163rm $RCO_FILE
diff --git a/modules/private/buildbot/projects/test/__init__.py b/modules/private/buildbot/projects/test/__init__.py
deleted file mode 100644
index e2f6f82..0000000
--- a/modules/private/buildbot/projects/test/__init__.py
+++ /dev/null
@@ -1,197 +0,0 @@
1from buildbot.plugins import *
2from buildbot_common.build_helpers import *
3import buildbot_common.libvirt as ilibvirt
4import os
5from buildbot.util import bytes2unicode
6import json
7
8__all__ = [ "configure", "E" ]
9
10class E():
11 PROJECT = "test"
12 BUILDBOT_URL = "https://git.immae.eu/buildbot/{}/".format(PROJECT)
13 SOCKET = "unix:/run/buildbot/{}.sock".format(PROJECT)
14 PB_SOCKET = os.environ["BUILDBOT_WORKER_PORT"]
15 WORKER_HOST = "{}:{}".format(os.environ["BUILDBOT_HOST"], PB_SOCKET)
16 RELEASE_PATH = "/var/lib/ftp/release.immae.eu/{}".format(PROJECT)
17 RELEASE_URL = "https://release.immae.eu/{}".format(PROJECT)
18 GIT_URL = "https://git.immae.eu/perso/Immae/TestProject.git"
19 SSH_KEY_PATH = "/var/lib/buildbot/buildbot_key"
20 LIBVIRT_URL = os.environ["BUILDBOT_VIRT_URL"] + "?keyfile=" + SSH_KEY_PATH
21 PUPPET_HOST = "root@backup-1.v.immae.eu"
22 LDAP_HOST = "ldap.immae.eu"
23 LDAP_DN = "cn=buildbot,ou=services,dc=immae,dc=eu"
24 LDAP_ROLES_BASE = "ou=roles,ou=hosts,dc=immae,dc=eu"
25 XMPP_RECIPIENTS = os.environ["BUILDBOT_XMPP_RECIPIENTS"].split(" ")
26
27 # master.cfg
28 SECRETS_FILE = os.getcwd() + "/secrets"
29 LDAP_URL = "ldaps://ldap.immae.eu:636"
30 LDAP_ADMIN_USER = "cn=buildbot,ou=services,dc=immae,dc=eu"
31 LDAP_BASE = "dc=immae,dc=eu"
32 LDAP_PATTERN = "(uid=%(username)s)"
33 LDAP_GROUP_PATTERN = "(&(memberOf=cn=groups,ou=test,cn=buildbot,ou=services,dc=immae,dc=eu)(member=%(dn)s))"
34 TITLE_URL = "https://git.immae.eu/?p=perso/Immae/TestProject.git;a=summary"
35 TITLE = "Test project"
36
37class CustomBase(webhooks.base):
38 def getChanges(self, request):
39 try:
40 content = request.content.read()
41 args = json.loads(bytes2unicode(content))
42 except Exception as e:
43 raise ValueError("Error loading JSON: " + str(e))
44
45 args.setdefault("comments", "")
46 args.setdefault("repository", "")
47 args.setdefault("author", args.get("who", "unknown"))
48
49 if args["category"] == "deploy_webhook":
50 args = {
51 "category": "deploy_webhook",
52 "comments": "",
53 "repository": "",
54 "author": "unknown",
55 "project": "TestProject",
56 "properties": {
57 "environment": args.get("environment", "integration"),
58 "build": "test_{}.tar.gz".format(args.get("branch", "master"))
59 }
60 }
61
62 return ([args], None)
63
64def deploy_hook_scheduler(project, timer=1):
65 return schedulers.AnyBranchScheduler(
66 change_filter=util.ChangeFilter(category="deploy_webhook", project=project),
67 name="{}_deploy".format(project), treeStableTimer=timer, builderNames=["{}_deploy".format(project)])
68
69def configure(c):
70 c["buildbotURL"] = E.BUILDBOT_URL
71 c["www"]["port"] = E.SOCKET
72
73 c["www"]["change_hook_dialects"]["base"] = {
74 "custom_class": CustomBase
75 }
76 c['workers'].append(ilibvirt.LibVirtWorker("test-build",
77 open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(),
78 ilibvirt.Connection(E.LIBVIRT_URL),
79 E.WORKER_HOST))
80 c['workers'].append(ilibvirt.LibVirtWorker("test-deploy",
81 open(E.SECRETS_FILE + "/worker_password", "r").read().rstrip(),
82 ilibvirt.Connection(E.LIBVIRT_URL),
83 E.WORKER_HOST))
84
85 c['schedulers'].append(hook_scheduler("TestProject", timer=1))
86 c['schedulers'].append(force_scheduler("force_test", ["TestProject_build"]))
87 c['schedulers'].append(deploy_scheduler("deploy_test", ["TestProject_deploy"]))
88 c['schedulers'].append(deploy_hook_scheduler("TestProject", timer=1))
89
90 c['builders'].append(factory())
91 c['builders'].append(deploy_factory())
92
93 c['services'].append(SlackStatusPush(
94 name="slack_status_test_project",
95 builders=["TestProject_build", "TestProject_deploy"],
96 serverUrl=open(E.SECRETS_FILE + "/slack_webhook", "r").read().rstrip()))
97 c['services'].append(XMPPStatusPush(
98 name="xmpp_status_test_project",
99 builders=["TestProject_build", "TestProject_deploy"],
100 recipients=E.XMPP_RECIPIENTS,
101 password=open(E.SECRETS_FILE + "/notify_xmpp_password", "r").read().rstrip()))
102
103def factory():
104 package = util.Interpolate("test_%(kw:clean_branch)s.tar.gz", clean_branch=clean_branch)
105 package_dest = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_PATH), clean_branch=clean_branch)
106 package_url = util.Interpolate("{}/test_%(kw:clean_branch)s.tar.gz".format(E.RELEASE_URL), clean_branch=clean_branch)
107
108 factory = util.BuildFactory()
109 factory.addStep(steps.Git(logEnviron=False,
110 repourl=E.GIT_URL, mode="full", method="copy"))
111 factory.addStep(steps.ShellCommand(name="env",
112 logEnviron=False, command=["env"]))
113 factory.addStep(steps.ShellCommand(name="pwd",
114 logEnviron=False, command=["pwd"]))
115 factory.addStep(steps.ShellCommand(name="true",
116 logEnviron=False, command=["true"]))
117 factory.addStep(steps.ShellCommand(name="echo",
118 logEnviron=False, command=["echo", package]))
119 factory.addSteps(package_and_upload(package, package_dest, package_url))
120
121 return util.BuilderConfig(name="TestProject_build", workernames=["test-build"], factory=factory)
122
123
124def compute_build_infos():
125 @util.renderer
126 def compute(props):
127 import re, hashlib
128 build_file = props.getProperty("build")
129 package_dest = "{}/{}".format(E.RELEASE_PATH, build_file)
130 version = re.match(r"{0}_(.*).tar.gz".format("test"), build_file).group(1)
131 with open(package_dest, "rb") as f:
132 sha = hashlib.sha256(f.read()).hexdigest()
133 return {
134 "build_version": version,
135 "build_hash": sha,
136 }
137 return compute
138
139@util.renderer
140def puppet_host(props):
141 return E.PUPPET_HOST
142
143def deploy_factory():
144 package_dest = util.Interpolate("{}/%(prop:build)s".format(E.RELEASE_PATH))
145
146 factory = util.BuildFactory()
147 factory.addStep(steps.MasterShellCommand(command=["test", "-f", package_dest]))
148 factory.addStep(steps.SetProperties(properties=compute_build_infos()))
149 factory.addStep(LdapPush(environment=util.Property("environment"),
150 build_version=util.Property("build_version"),
151 build_hash=util.Property("build_hash"),
152 ldap_password=util.Secret("ldap")))
153 factory.addStep(steps.MasterShellCommand(command=[
154 "ssh", "-o", "UserKnownHostsFile=/dev/null", "-o", "StrictHostKeyChecking=no", "-o", "CheckHostIP=no", "-i", E.SSH_KEY_PATH, puppet_host]))
155 return util.BuilderConfig(name="TestProject_deploy", workernames=["test-deploy"], factory=factory)
156
157from twisted.internet import defer
158from buildbot.process.buildstep import FAILURE
159from buildbot.process.buildstep import SUCCESS
160from buildbot.process.buildstep import BuildStep
161
162class LdapPush(BuildStep):
163 name = "LdapPush"
164 renderables = ["environment", "build_version", "build_hash", "ldap_password"]
165
166 def __init__(self, **kwargs):
167 self.environment = kwargs.pop("environment")
168 self.build_version = kwargs.pop("build_version")
169 self.build_hash = kwargs.pop("build_hash")
170 self.ldap_password = kwargs.pop("ldap_password")
171 self.ldap_host = kwargs.pop("ldap_host", E.LDAP_HOST)
172 super().__init__(**kwargs)
173
174 def run(self):
175 import json
176 from ldap3 import Reader, Writer, Server, Connection, ObjectDef
177 server = Server(self.ldap_host)
178 conn = Connection(server,
179 user=E.LDAP_DN,
180 password=self.ldap_password)
181 conn.bind()
182 obj = ObjectDef("immaePuppetClass", conn)
183 r = Reader(conn, obj,
184 "cn=test.{},{}".format(self.environment, E.LDAP_ROLES_BASE))
185 r.search()
186 if len(r) > 0:
187 w = Writer.from_cursor(r)
188 for value in w[0].immaePuppetJson.values:
189 config = json.loads(value)
190 if "test_version" in config:
191 config["test_version"] = self.build_version
192 config["test_sha256"] = self.build_hash
193 w[0].immaePuppetJson -= value
194 w[0].immaePuppetJson += json.dumps(config, indent=" ")
195 w.commit()
196 return defer.succeed(SUCCESS)
197 return defer.succeed(FAILURE)
diff --git a/modules/private/certificates.nix b/modules/private/certificates.nix
deleted file mode 100644
index 9879946..0000000
--- a/modules/private/certificates.nix
+++ /dev/null
@@ -1,199 +0,0 @@
1{ lib, pkgs, config, name, ... }:
2{
3 options.myServices.certificates = {
4 enable = lib.mkEnableOption "enable certificates";
5 webroot = lib.mkOption {
6 readOnly = true;
7 default = "/var/lib/acme/acme-challenges";
8 };
9 certConfig = lib.mkOption {
10 default = {
11 webroot = lib.mkForce null; # avoids creation of tmpfiles
12 email = "ismael@bouya.org";
13 postRun = builtins.concatStringsSep "\n" [
14 (lib.optionalString config.services.httpd.Prod.enable "systemctl reload httpdProd.service")
15 (lib.optionalString config.services.httpd.Tools.enable "systemctl reload httpdTools.service")
16 (lib.optionalString config.services.httpd.Inte.enable "systemctl reload httpdInte.service")
17 (lib.optionalString config.services.nginx.enable "systemctl reload nginx.service")
18 ];
19 extraLegoRenewFlags = [ "--reuse-key" ];
20 keyType = lib.mkDefault "ec256"; # https://github.com/NixOS/nixpkgs/pull/83121
21 };
22 description = "Default configuration for certificates";
23 };
24 };
25
26 config = lib.mkIf config.myServices.certificates.enable {
27 services.nginx = {
28 recommendedTlsSettings = true;
29 virtualHosts = {
30 "${config.hostEnv.fqdn}" = {
31 acmeRoot = config.myServices.certificates.webroot;
32 useACMEHost = name;
33 forceSSL = true;
34 };
35 };
36 };
37 services.websites.certs = config.myServices.certificates.certConfig;
38 myServices.databasesCerts = config.myServices.certificates.certConfig;
39 myServices.ircCerts = config.myServices.certificates.certConfig;
40
41 security.acme.acceptTerms = true;
42 security.acme.preliminarySelfsigned = true;
43
44 security.acme.certs = {
45 "${name}" = config.myServices.certificates.certConfig // {
46 domain = config.hostEnv.fqdn;
47 };
48 };
49
50 users.users.acme = {
51 uid = config.ids.uids.acme;
52 group = "acme";
53 description = "Acme user";
54 };
55 users.groups.acme = {
56 gid = config.ids.gids.acme;
57 };
58
59 systemd.services = lib.attrsets.mapAttrs' (k: v:
60 lib.attrsets.nameValuePair "acme-selfsigned-${k}" {
61 wantedBy = [ "acme-selfsigned-certificates.target" ];
62 script = lib.mkAfter ''
63 cp $workdir/server.crt ${config.security.acme.certs."${k}".directory}/cert.pem
64 chown '${v.user}:${v.group}' ${config.security.acme.certs."${k}".directory}/cert.pem
65 chmod ${if v.allowKeysForGroup then "750" else "700"} ${config.security.acme.certs."${k}".directory}/cert.pem
66
67 cp $workdir/ca.crt ${config.security.acme.certs."${k}".directory}/chain.pem
68 chown '${v.user}:${v.group}' ${config.security.acme.certs."${k}".directory}/chain.pem
69 chmod ${if v.allowKeysForGroup then "750" else "700"} ${config.security.acme.certs."${k}".directory}/chain.pem
70 '';
71 }
72 ) config.security.acme.certs //
73 lib.attrsets.mapAttrs' (k: data:
74 lib.attrsets.nameValuePair "acme-${k}" {
75 after = lib.mkAfter [ "bind.service" ];
76 serviceConfig =
77 let
78 cfg = config.security.acme;
79 hashOptions = let
80 domains = builtins.concatStringsSep "," (
81 [ data.domain ] ++ (builtins.attrNames data.extraDomains)
82 );
83 certOptions = builtins.concatStringsSep "," [
84 (if data.ocspMustStaple then "must-staple" else "no-must-staple")
85 ];
86 in
87 builtins.hashString "sha256" (builtins.concatStringsSep ";" [ data.keyType domains certOptions ]);
88 accountsDir = "accounts-${data.keyType}";
89 lpath = "acme/${k}";
90 apath = "/var/lib/${lpath}";
91 spath = "/var/lib/acme/.lego/${k}";
92 fileMode = if data.allowKeysForGroup then "640" else "600";
93 dirFileMode = if data.allowKeysForGroup then "750" else "700";
94 globalOpts = [ "-d" data.domain "--email" data.email "--path" "." "--key-type" data.keyType ]
95 ++ lib.optionals (cfg.acceptTerms) [ "--accept-tos" ]
96 ++ lib.optionals (data.dnsProvider != null && !data.dnsPropagationCheck) [ "--dns.disable-cp" ]
97 ++ lib.concatLists (lib.mapAttrsToList (name: root: [ "-d" name ]) data.extraDomains)
98 ++ (if data.dnsProvider != null then [ "--dns" data.dnsProvider ] else [ "--http" "--http.webroot" config.myServices.certificates.webroot ])
99 ++ lib.optionals (cfg.server != null || data.server != null) ["--server" (if data.server == null then cfg.server else data.server)];
100 certOpts = lib.optionals data.ocspMustStaple [ "--must-staple" ];
101 runOpts = lib.escapeShellArgs (globalOpts ++ [ "run" ] ++ certOpts);
102 renewOpts = lib.escapeShellArgs (globalOpts ++
103 [ "renew" "--days" (builtins.toString cfg.validMinDays) ] ++
104 certOpts ++ data.extraLegoRenewFlags);
105 forceRenewOpts = lib.escapeShellArgs (globalOpts ++
106 [ "renew" "--days" "999" ] ++
107 certOpts ++ data.extraLegoRenewFlags);
108 keyName = builtins.replaceStrings ["*"] ["_"] data.domain;
109 in {
110 User = lib.mkForce "acme";
111 Group = lib.mkForce "acme";
112 WorkingDirectory = lib.mkForce spath;
113 StateDirectory = lib.mkForce "acme/.lego/${k} acme/.lego/${accountsDir}";
114 ExecStartPre =
115 let
116 script = pkgs.writeScript "acme-prestart" ''
117 #!${pkgs.runtimeShell} -e
118 install -m 0755 -o acme -g acme -d ${config.myServices.certificates.webroot}
119 '';
120 in
121 lib.mkForce "+${script}";
122 ExecStart = lib.mkForce (pkgs.writeScript "acme-start" ''
123 #!${pkgs.runtimeShell} -e
124 # lego doesn't check key type after initial creation, we
125 # need to check for him
126 if [ -L ${spath}/accounts -o -d ${spath}/accounts ]; then
127 if [ -L ${spath}/accounts -a "$(readlink ${spath}/accounts)" != ../${accountsDir} ]; then
128 ln -sfn ../${accountsDir} ${spath}/accounts
129 mv -f ${spath}/certificates/${keyName}.key ${spath}/certificates/${keyName}.key.old
130 fi
131 else
132 ln -s ../${accountsDir} ${spath}/accounts
133 fi
134 # check if domain changed: lego doesn't check by itself
135 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
136 ${pkgs.lego}/bin/lego ${runOpts}
137 elif [ ! -f ${spath}/currentDomains -o "$(cat ${spath}/currentDomains)" != "${hashOptions}" ]; then
138 ${pkgs.lego}/bin/lego ${forceRenewOpts}
139 else
140 ${pkgs.lego}/bin/lego ${renewOpts}
141 fi
142 '');
143 ExecStartPost =
144 let
145 ISRG_Root_X1 = pkgs.fetchurl {
146 url = "https://letsencrypt.org/certs/isrgrootx1.pem";
147 sha256 = "1la36n2f31j9s03v847ig6ny9lr875q3g7smnq33dcsmf2i5gd92";
148 };
149 fix_ISRG_Root_X1 = pkgs.writeScript "fix-pem" ''
150 for file in chain fullchain full; do
151 if grep -q MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA "$file.pem"; then
152 cat ${ISRG_Root_X1} | grep -v " CERTIFICATE" | \
153 sed -i.bak -ne "/MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/ {r /dev/stdin" -e ":a; n; /Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5/ { b }; ba };p" $file.pem
154 fi
155 done
156 '';
157 script = pkgs.writeScript "acme-post-start" ''
158 #!${pkgs.runtimeShell} -e
159 install -m 0755 -o root -g root -d /var/lib/acme
160 install -m 0${dirFileMode} -o ${data.user} -g ${data.group} -d /var/lib/acme/${k}
161 cd /var/lib/acme/${k}
162
163 # Test that existing cert is older than new cert
164 KEY=${spath}/certificates/${keyName}.key
165 KEY_CHANGED=no
166 if [ -e $KEY -a $KEY -nt key.pem ]; then
167 KEY_CHANGED=yes
168 cp -p ${spath}/certificates/${keyName}.key key.pem
169 cp -p ${spath}/certificates/${keyName}.crt fullchain.pem
170 cp -p ${spath}/certificates/${keyName}.issuer.crt chain.pem
171 ln -sf fullchain.pem cert.pem
172 cat key.pem fullchain.pem > full.pem
173 echo -n "${hashOptions}" > ${spath}/currentDomains
174 fi
175
176 ${fix_ISRG_Root_X1}
177 chmod ${fileMode} *.pem
178 chown '${data.user}:${data.group}' *.pem
179
180 if [ "$KEY_CHANGED" = "yes" ]; then
181 : # noop in case postRun is empty
182 ${data.postRun}
183 fi
184 '';
185 in
186 lib.mkForce "+${script}";
187 };
188 }
189 ) config.security.acme.certs //
190 {
191 httpdProd = lib.mkIf config.services.httpd.Prod.enable
192 { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; };
193 httpdTools = lib.mkIf config.services.httpd.Tools.enable
194 { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; };
195 httpdInte = lib.mkIf config.services.httpd.Inte.enable
196 { after = [ "acme-selfsigned-certificates.target" ]; wants = [ "acme-selfsigned-certificates.target" ]; };
197 };
198 };
199}
diff --git a/modules/private/databases/default.nix b/modules/private/databases/default.nix
deleted file mode 100644
index 1241658..0000000
--- a/modules/private/databases/default.nix
+++ /dev/null
@@ -1,57 +0,0 @@
1{ lib, config, nodes, ... }:
2let
3 cfg = config.myServices.databases;
4in
5{
6 options.myServices = {
7 databases.enable = lib.mkEnableOption "my databases service";
8 databasesCerts = lib.mkOption {
9 description = "Default databases configurations for certificates as accepted by acme";
10 };
11 };
12
13 config.myServices.databases = lib.mkIf cfg.enable {
14 mariadb = {
15 enable = true;
16 ldapConfig = {
17 inherit (config.myEnv.ldap) host base;
18 inherit (config.myEnv.databases.mysql.pam) dn filter password;
19 };
20 replicationLdapConfig = {
21 inherit (config.myEnv.ldap) host base;
22 inherit (config.myEnv.servers.eldiron.ldap) dn password;
23 };
24 credentials.root = config.myEnv.databases.mysql.systemUsers.root;
25 };
26
27 openldap = {
28 accessFile = ../../../nixops/secrets/ldap.conf;
29 baseDn = config.myEnv.ldap.base;
30 rootDn = config.myEnv.ldap.root_dn;
31 rootPw = config.myEnv.ldap.root_pw;
32 enable = true;
33 };
34
35 postgresql = {
36 ldapConfig = {
37 inherit (config.myEnv.ldap) host base;
38 inherit (config.myEnv.databases.postgresql.pam) dn filter password;
39 };
40 replicationLdapConfig = {
41 inherit (config.myEnv.ldap) host base;
42 inherit (config.myEnv.servers.eldiron.ldap) dn password;
43 };
44 authorizedHosts = {
45 };
46 replicationHosts = {
47 backup-2 = {
48 ip4 = [config.myEnv.servers.backup-2.ips.main.ip4];
49 ip6 = config.myEnv.servers.backup-2.ips.main.ip6;
50 };
51 };
52 enable = true;
53 };
54
55 redis.enable = true;
56 };
57}
diff --git a/modules/private/databases/mariadb.nix b/modules/private/databases/mariadb.nix
deleted file mode 100644
index 101eb3f..0000000
--- a/modules/private/databases/mariadb.nix
+++ /dev/null
@@ -1,182 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.databases.mariadb;
4in {
5 options.myServices.databases = {
6 mariadb = {
7 enable = lib.mkOption {
8 default = false;
9 example = true;
10 description = "Whether to enable mariadb database";
11 type = lib.types.bool;
12 };
13 package = lib.mkOption {
14 type = lib.types.package;
15 default = pkgs.mariadb;
16 description = ''
17 Mariadb package to use.
18 '';
19 };
20 credentials = lib.mkOption {
21 default = {};
22 description = "Credentials";
23 type = lib.types.attrsOf lib.types.str;
24 };
25 ldapConfig = lib.mkOption {
26 description = "LDAP configuration to allow PAM identification via LDAP";
27 type = lib.types.submodule {
28 options = {
29 host = lib.mkOption { type = lib.types.str; };
30 base = lib.mkOption { type = lib.types.str; };
31 dn = lib.mkOption { type = lib.types.str; };
32 password = lib.mkOption { type = lib.types.str; };
33 filter = lib.mkOption { type = lib.types.str; };
34 };
35 };
36 };
37 replicationLdapConfig = lib.mkOption {
38 description = "LDAP configuration to allow replication";
39 type = lib.types.submodule {
40 options = {
41 host = lib.mkOption { type = lib.types.str; };
42 base = lib.mkOption { type = lib.types.str; };
43 dn = lib.mkOption { type = lib.types.str; };
44 password = lib.mkOption { type = lib.types.str; };
45 };
46 };
47 };
48 dataDir = lib.mkOption {
49 type = lib.types.path;
50 default = "/var/lib/mysql";
51 description = ''
52 The directory where Mariadb stores its data.
53 '';
54 };
55 # Output variables
56 socketsDir = lib.mkOption {
57 type = lib.types.path;
58 default = "/run/mysqld";
59 description = ''
60 The directory where Mariadb puts sockets.
61 '';
62 };
63 sockets = lib.mkOption {
64 type = lib.types.attrsOf lib.types.path;
65 default = {
66 mysqld = "${cfg.socketsDir}/mysqld.sock";
67 };
68 readOnly = true;
69 description = ''
70 Mariadb sockets
71 '';
72 };
73 };
74 };
75
76 config = lib.mkIf cfg.enable {
77 networking.firewall.allowedTCPPorts = [ 3306 ];
78
79 # for adminer, ssl is implemented with mysqli only, which is
80 # currently disabled because it’s not compatible with pam.
81 # Thus we need to generate two users for each 'remote': one remote
82 # with SSL, and one localhost without SSL.
83 # User identified by LDAP:
84 # CREATE USER foo@% IDENTIFIED VIA pam USING 'mysql' REQUIRE SSL;
85 # CREATE USER foo@localhost IDENTIFIED VIA pam USING 'mysql';
86
87 # To create a user (host) for replication:
88 # CREATE USER 'host'@'%' IDENTIFIED VIA pam USING 'mysql_replication' REQUIRE SSL;
89 # GRANT REPLICATION SLAVE, REPLICATION CLIENT, RELOAD, LOCK TABLES, SELECT, SHOW VIEW ON *.* TO 'host'@'%';
90 # (the lock/select grant permits to let the replication host handle
91 # the initial fetch of the database)
92 # % should be valid for both localhost (for cron dumps) and the origin host.
93 services.mysql = {
94 enable = true;
95 package = cfg.package;
96 dataDir = cfg.dataDir;
97 settings = {
98 mysqld = {
99 ssl_ca = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";
100 ssl_key = "${config.security.acme.certs.mysql.directory}/key.pem";
101 ssl_cert = "${config.security.acme.certs.mysql.directory}/fullchain.pem";
102
103 # for replication
104 log-bin = "mariadb-bin";
105 server-id = "1";
106
107 # this introduces a small delay before storing on disk, but
108 # makes it order of magnitudes quicker
109 innodb_flush_log_at_trx_commit = "0";
110 };
111 };
112 };
113
114 users.users.mysql.extraGroups = [ "keys" ];
115 security.acme.certs."mysql" = config.myServices.databasesCerts // {
116 user = "mysql";
117 group = "mysql";
118 domain = "db-1.immae.eu";
119 postRun = ''
120 systemctl restart mysql.service
121 '';
122 };
123
124 secrets.keys = {
125 "mysql/mysqldump" = {
126 permissions = "0400";
127 user = "root";
128 group = "root";
129 text = ''
130 [mysqldump]
131 user = root
132 password = ${cfg.credentials.root}
133 '';
134 };
135 "mysql/pam" = {
136 permissions = "0400";
137 user = "mysql";
138 group = "mysql";
139 text = with cfg.ldapConfig; ''
140 host ${host}
141 base ${base}
142 binddn ${dn}
143 bindpw ${password}
144 pam_filter ${filter}
145 ssl start_tls
146 '';
147 };
148 "mysql/pam_replication" = {
149 permissions = "0400";
150 user = "mysql";
151 group = "mysql";
152 text = with cfg.replicationLdapConfig; ''
153 host ${host}
154 base ${base}
155 binddn ${dn}
156 bindpw ${password}
157 pam_login_attribute cn
158 ssl start_tls
159 '';
160 };
161 };
162
163 security.pam.services = let
164 pam_ldap = "${pkgs.pam_ldap}/lib/security/pam_ldap.so";
165 in {
166 mysql = {
167 text = ''
168 # https://mariadb.com/kb/en/mariadb/pam-authentication-plugin/
169 auth required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam"}
170 account required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam"}
171 '';
172 };
173 mysql_replication = {
174 text = ''
175 auth required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam_replication"}
176 account required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam_replication"}
177 '';
178 };
179 };
180
181 };
182}
diff --git a/modules/private/databases/mariadb_replication.nix b/modules/private/databases/mariadb_replication.nix
deleted file mode 100644
index 68e6f7f..0000000
--- a/modules/private/databases/mariadb_replication.nix
+++ /dev/null
@@ -1,251 +0,0 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.databasesReplication.mariadb;
4in
5{
6 options.myServices.databasesReplication.mariadb = {
7 enable = lib.mkEnableOption "Enable mariadb replication";
8 base = lib.mkOption {
9 type = lib.types.path;
10 description = ''
11 Base path to put the replications
12 '';
13 };
14 hosts = lib.mkOption {
15 default = {};
16 description = ''
17 Hosts to backup
18 '';
19 type = lib.types.attrsOf (lib.types.submodule {
20 options = {
21 package = lib.mkOption {
22 type = lib.types.package;
23 default = pkgs.mariadb;
24 description = ''
25 Mariadb package for this host
26 '';
27 };
28 serverId = lib.mkOption {
29 type = lib.types.int;
30 description = ''
31 Server id to use for replication cluster (must be unique among the cluster!)
32 '';
33 };
34 host = lib.mkOption {
35 type = lib.types.str;
36 description = ''
37 Host to connect to
38 '';
39 };
40 port = lib.mkOption {
41 type = lib.types.str;
42 description = ''
43 Port to connect to
44 '';
45 };
46 user = lib.mkOption {
47 type = lib.types.str;
48 description = ''
49 User to connect as
50 '';
51 };
52 password = lib.mkOption {
53 type = lib.types.str;
54 description = ''
55 Password to use
56 '';
57 };
58 dumpUser = lib.mkOption {
59 type = lib.types.str;
60 description = ''
61 User who can do a dump
62 '';
63 };
64 dumpPassword = lib.mkOption {
65 type = lib.types.str;
66 description = ''
67 Password for the dump user
68 '';
69 };
70 };
71 });
72 };
73 };
74
75 config = lib.mkIf cfg.enable {
76 users.users.mysql = {
77 description = "MySQL server user";
78 group = "mysql";
79 uid = config.ids.uids.mysql;
80 extraGroups = [ "keys" ];
81 };
82 users.groups.mysql.gid = config.ids.gids.mysql;
83
84 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (name: hcfg: [
85 (lib.nameValuePair "mysql_replication/${name}/slave_init_commands" {
86 user = "mysql";
87 group = "mysql";
88 permissions = "0400";
89 text = ''
90 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;
91 START SLAVE;
92 '';
93 })
94 (lib.nameValuePair "mysql_replication/${name}/mysqldump_remote" {
95 permissions = "0400";
96 user = "root";
97 group = "root";
98 text = ''
99 [mysqldump]
100 user = ${hcfg.user}
101 password = ${hcfg.password}
102 '';
103 })
104 (lib.nameValuePair "mysql_replication/${name}/mysqldump" {
105 permissions = "0400";
106 user = "root";
107 group = "root";
108 text = ''
109 [mysqldump]
110 user = ${hcfg.dumpUser}
111 password = ${hcfg.dumpPassword}
112 '';
113 })
114 (lib.nameValuePair "mysql_replication/${name}/client" {
115 permissions = "0400";
116 user = "mysql";
117 group = "mysql";
118 text = ''
119 [client]
120 user = ${hcfg.dumpUser}
121 password = ${hcfg.dumpPassword}
122 '';
123 })
124 ]) cfg.hosts));
125
126 services.cron = {
127 enable = true;
128 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
129 let
130 dataDir = "${cfg.base}/${name}/mysql";
131 backupDir = "${cfg.base}/${name}/mysql_backup";
132 backup_script = pkgs.writeScript "backup_mysql_${name}" ''
133 #!${pkgs.stdenv.shell}
134
135 set -euo pipefail
136
137 filename=${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).sql
138 ${hcfg.package}/bin/mysqldump \
139 --defaults-file=${config.secrets.fullPaths."mysql_replication/${name}/mysqldump"} \
140 -S /run/mysqld_${name}/mysqld.sock \
141 --gtid \
142 --master-data \
143 --flush-privileges \
144 --ignore-database=netdata \
145 --all-databases > $filename
146 ${pkgs.gzip}/bin/gzip $filename
147 '';
148 u = pkgs.callPackage ./utils.nix {};
149 cleanup_script = pkgs.writeScript "cleanup_mysql_${name}" (u.exponentialDumps "sql.gz" backupDir);
150 in [
151 "0 22,4,10,16 * * * root ${backup_script}"
152 "0 3 * * * root ${cleanup_script}"
153 ]) cfg.hosts);
154 };
155
156 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
157 lib.attrsets.nameValuePair "mysql_replication_${name}" {
158 deps = [ "users" "groups" ];
159 text = ''
160 install -m 0700 -o mysql -g mysql -d ${cfg.base}/${name}/mysql
161 install -m 0700 -o mysql -g mysql -d ${cfg.base}/${name}/mysql_backup
162 '';
163 }) cfg.hosts;
164
165 environment.etc = lib.attrsets.mapAttrs' (name: hcfg:
166 lib.attrsets.nameValuePair "mysql/${name}_my.cnf" {
167 text = ''
168 [mysqld]
169 skip-networking
170 socket = /run/mysqld_${name}/mysqld.sock
171 datadir = ${cfg.base}/${name}/mysql/
172 log-bin = mariadb-bin
173 server-id = ${builtins.toString hcfg.serverId}
174 '';
175 }
176 ) cfg.hosts;
177
178 systemd.services = lib.attrsets.mapAttrs' (name: hcfg:
179 let
180 dataDir = "${cfg.base}/${name}/mysql";
181 in
182 lib.attrsets.nameValuePair "mysql_backup_${name}" {
183 description = "Mysql replication for ${name}";
184 wantedBy = [ "multi-user.target" ];
185 after = [ "network.target" ];
186 restartTriggers = [ config.environment.etc."mysql/${name}_my.cnf".source ];
187 unitConfig.RequiresMountsFor = dataDir;
188
189 preStart = ''
190 if ! test -e ${dataDir}/mysql; then
191 if ! test -e ${dataDir}/initial.sql; then
192 ${hcfg.package}/bin/mysqldump \
193 --defaults-file=${config.secrets.fullPaths."mysql_replication/${name}/mysqldump_remote"} \
194 -h ${hcfg.host} \
195 -P ${hcfg.port} \
196 --ssl \
197 --gtid \
198 --flush-privileges \
199 --master-data \
200 --all-databases > ${dataDir}/initial.sql
201 fi
202
203 ${hcfg.package}/bin/mysql_install_db \
204 --defaults-file=/etc/mysql/${name}_my.cnf \
205 --user=mysql \
206 --datadir=${dataDir} \
207 --basedir=${hcfg.package}
208 fi
209 '';
210
211 serviceConfig = {
212 User = "mysql";
213 Group = "mysql";
214 RuntimeDirectory = "mysqld_${name}";
215 RuntimeDirectoryMode = "0755";
216 SupplementaryGroups = "keys";
217 PermissionsStartOnly = true;
218 Type = "notify";
219
220 ExecStart = "${hcfg.package}/bin/mysqld --defaults-file=/etc/mysql/${name}_my.cnf --user=mysql --datadir=${dataDir} --basedir=${hcfg.package}";
221 ExecStartPost =
222 let
223 sql_before = pkgs.writeText "mysql-initial-before" ''
224 DROP DATABASE test;
225 INSTALL SONAME 'auth_pam';
226 '';
227 setupScript = pkgs.writeScript "mysql-setup" ''
228 #!${pkgs.runtimeShell} -e
229
230 if test -e ${dataDir}/initial.sql; then
231 cat \
232 ${sql_before} \
233 ${dataDir}/initial.sql \
234 ${config.secrets.fullPaths."mysql_replication/${name}/slave_init_commands"} \
235 | ${hcfg.package}/bin/mysql \
236 --defaults-file=/etc/mysql/${name}_my.cnf \
237 -S /run/mysqld_${name}/mysqld.sock \
238 --user=root
239 rm -f ${dataDir}/initial.sql
240 fi
241 '';
242 in
243 "+${setupScript}";
244 # initial dump can take a long time
245 TimeoutStartSec="infinity";
246 TimeoutStopSec = 120;
247 };
248 }) cfg.hosts;
249 };
250}
251
diff --git a/modules/private/databases/openldap/default.nix b/modules/private/databases/openldap/default.nix
deleted file mode 100644
index d35aca0..0000000
--- a/modules/private/databases/openldap/default.nix
+++ /dev/null
@@ -1,147 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.databases.openldap;
4 ldapConfig = let
5 eldiron_schemas = pkgs.callPackage ./eldiron_schemas.nix {};
6 in ''
7 ${eldiron_schemas}
8
9 pidfile ${cfg.pids.pid}
10 argsfile ${cfg.pids.args}
11
12 moduleload back_hdb
13 backend hdb
14
15 TLSCertificateFile ${config.security.acme.certs.ldap.directory}/cert.pem
16 TLSCertificateKeyFile ${config.security.acme.certs.ldap.directory}/key.pem
17 TLSCACertificateFile ${config.security.acme.certs.ldap.directory}/fullchain.pem
18 TLSCACertificatePath ${pkgs.cacert.unbundled}/etc/ssl/certs/
19 #This makes openldap crash
20 #TLSCipherSuite DEFAULT
21
22 sasl-host kerberos.immae.eu
23 '';
24in
25{
26 options.myServices.databases = {
27 openldap = {
28 enable = lib.mkOption {
29 default = false;
30 example = true;
31 description = "Whether to enable ldap";
32 type = lib.types.bool;
33 };
34 baseDn = lib.mkOption {
35 type = lib.types.str;
36 description = ''
37 Base DN for LDAP
38 '';
39 };
40 rootDn = lib.mkOption {
41 type = lib.types.str;
42 description = ''
43 Root DN
44 '';
45 };
46 rootPw = lib.mkOption {
47 type = lib.types.str;
48 description = ''
49 Root (Hashed) password
50 '';
51 };
52 accessFile = lib.mkOption {
53 type = lib.types.path;
54 description = ''
55 The file path that defines the access
56 '';
57 };
58 dataDir = lib.mkOption {
59 type = lib.types.path;
60 default = "/var/lib/openldap";
61 description = ''
62 The directory where Openldap stores its data.
63 '';
64 };
65 socketsDir = lib.mkOption {
66 type = lib.types.path;
67 default = "/run/slapd";
68 description = ''
69 The directory where Openldap puts sockets and pid files.
70 '';
71 };
72 # Output variables
73 pids = lib.mkOption {
74 type = lib.types.attrsOf lib.types.path;
75 default = {
76 pid = "${cfg.socketsDir}/slapd.pid";
77 args = "${cfg.socketsDir}/slapd.args";
78 };
79 readOnly = true;
80 description = ''
81 Slapd pid files
82 '';
83 };
84 };
85 };
86
87 config = lib.mkIf cfg.enable {
88 secrets.keys = {
89 "ldap/password" = {
90 permissions = "0400";
91 user = "openldap";
92 group = "openldap";
93 text = "rootpw ${cfg.rootPw}";
94 };
95 "ldap/access" = {
96 permissions = "0400";
97 user = "openldap";
98 group = "openldap";
99 text = builtins.readFile cfg.accessFile;
100 };
101 "ldap" = {
102 permissions = "0500";
103 user = "openldap";
104 group = "openldap";
105 isDir = true;
106 };
107 };
108 users.users.openldap.extraGroups = [ "keys" ];
109 networking.firewall.allowedTCPPorts = [ 636 389 ];
110
111 security.acme.certs."ldap" = config.myServices.databasesCerts // {
112 user = "openldap";
113 group = "openldap";
114 domain = "ldap.immae.eu";
115 postRun = ''
116 systemctl restart openldap.service
117 '';
118 };
119
120 services.filesWatcher.openldap = {
121 restart = true;
122 paths = [ config.secrets.fullPaths."ldap" ];
123 };
124
125 services.openldap = {
126 enable = true;
127 dataDir = cfg.dataDir;
128 urlList = [ "ldap://" "ldaps://" ];
129 logLevel = "none";
130 extraConfig = ldapConfig;
131 extraDatabaseConfig = ''
132 moduleload memberof
133 overlay memberof
134
135 moduleload syncprov
136 overlay syncprov
137 syncprov-checkpoint 100 10
138
139 include ${config.secrets.fullPaths."ldap/access"}
140 '';
141 rootpwFile = config.secrets.fullPaths."ldap/password";
142 suffix = cfg.baseDn;
143 rootdn = cfg.rootDn;
144 database = "hdb";
145 };
146 };
147}
diff --git a/modules/private/databases/openldap/eldiron_schemas.nix b/modules/private/databases/openldap/eldiron_schemas.nix
deleted file mode 100644
index cf45ebe..0000000
--- a/modules/private/databases/openldap/eldiron_schemas.nix
+++ /dev/null
@@ -1,21 +0,0 @@
1{ fetchurl, openldap }:
2let
3 kerberosSchema = fetchurl {
4 url = "https://raw.githubusercontent.com/krb5/krb5/0bdd3b8058ed4ec9acc050e316bea86f6830b15f/src/plugins/kdb/ldap/libkdb_ldap/kerberos.schema";
5 sha256 = "17fnkkf6s3lznsl7wp6914pqsc78d038rh38l638big8z608ksww";
6 };
7 puppetSchema = fetchurl {
8 url = "https://raw.githubusercontent.com/puppetlabs/puppet/bf7c108825ffdb5ea89cf3e500d55d27ab64b8d2/ext/ldap/puppet.schema";
9 sha256 = "11bjf5zfvqlim7p9vddcafs0wiq3v8ys77x8h6fbp9c6bdfh0awh";
10 };
11 schemas = [
12 #"${openldap}/etc/schema/core.schema"
13 #"${openldap}/etc/schema/cosine.schema"
14 #"${openldap}/etc/schema/inetorgperson.schema"
15 #"${openldap}/etc/schema/nis.schema"
16 puppetSchema
17 kerberosSchema
18 ./immae.schema
19 ];
20in
21 builtins.concatStringsSep "\n" (map (v: "include ${v}") schemas)
diff --git a/modules/private/databases/openldap/immae.schema b/modules/private/databases/openldap/immae.schema
deleted file mode 100644
index d2ef972..0000000
--- a/modules/private/databases/openldap/immae.schema
+++ /dev/null
@@ -1,179 +0,0 @@
1# vim: set filetype=slapd:
2objectIdentifier Immaeroot 1.3.6.1.4.1.50071
3
4objectIdentifier Immae Immaeroot:2
5objectIdentifier ImmaeattributeType Immae:3
6objectIdentifier ImmaeobjectClass Immae:4
7
8# TT-RSS
9attributetype ( ImmaeattributeType:1 NAME 'immaeTtrssLogin'
10 DESC 'login for TTRSS'
11 EQUALITY caseIgnoreMatch
12 SUBSTR caseIgnoreSubstringsMatch
13 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
14
15objectclass ( ImmaeobjectClass:1 NAME 'immaeTtrssClass'
16 DESC 'Expansion of the existing object classes for ttrss'
17 SUP top AUXILIARY
18 MUST ( immaeTtrssLogin ) )
19
20# FTP
21attributetype ( ImmaeattributeType:2 NAME 'immaeFtpDirectory'
22 DESC 'home directory for ftp'
23 EQUALITY caseExactIA5Match
24 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
25
26attributetype ( ImmaeattributeType:3 NAME 'immaeFtpUid'
27 DESC 'user id for ftp'
28 EQUALITY integerMatch
29 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
30
31attributetype ( ImmaeattributeType:4 NAME 'immaeFtpGid'
32 DESC 'group id for ftp'
33 EQUALITY integerMatch
34 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
35
36objectclass ( ImmaeobjectClass:2 NAME 'immaeFtpClass'
37 DESC 'Expansion of the existing object classes for ftp'
38 SUP top AUXILIARY
39 MUST ( immaeFtpDirectory $ immaeFtpGid $ immaeFtpUid ) )
40
41
42# SSH keys
43attributetype ( ImmaeattributeType:5 NAME 'immaeSshKey'
44 DESC 'OpenSSH Public key'
45 EQUALITY octetStringMatch
46 SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
47
48objectClass ( ImmaeobjectClass:3 NAME 'immaeSshClass'
49 DESC 'OpenSSH class'
50 SUP top AUXILIARY
51 MAy ( immaeSSHKey ) )
52
53# Specific access
54attributetype (ImmaeattributeType:6 NAME 'immaeAccessDn'
55 EQUALITY distinguishedNameMatch
56 SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
57
58attributetype (ImmaeattributeType:17 NAME 'immaeAccessWriteDn'
59 EQUALITY distinguishedNameMatch
60 SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
61
62attributetype (ImmaeattributeType:18 NAME 'immaeAccessReadSubtree'
63 EQUALITY distinguishedNameMatch
64 SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
65
66objectClass ( ImmaeobjectClass:4 NAME 'immaeAccessClass'
67 DESC 'Access class'
68 SUP top AUXILIARY
69 MAY ( immaeAccessDn $ immaeAccessWriteDn $ immaeAccessReadSubtree ) )
70
71# Xmpp uid
72attributetype ( ImmaeattributeType:7 NAME 'immaeXmppUid'
73 DESC 'user part for Xmpp'
74 EQUALITY caseIgnoreMatch
75 SUBSTR caseIgnoreSubstringsMatch
76 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
77
78objectclass ( ImmaeobjectClass:5 NAME 'immaeXmppClass'
79 DESC 'Expansion of the existing object classes for XMPP'
80 SUP top AUXILIARY
81 MUST ( immaeXmppUid ) )
82
83# Postfix accounts
84attributetype ( ImmaeattributeType:8 NAME 'immaePostfixAddress'
85 DESC 'the dovecot address to match as username'
86 EQUALITY caseIgnoreIA5Match
87 SUBSTR caseIgnoreIA5SubstringsMatch
88 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
89
90attributetype ( ImmaeattributeType:9 NAME 'immaePostfixHome'
91 DESC 'the postfix home directory'
92 EQUALITY caseExactIA5Match
93 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
94
95attributetype ( ImmaeattributeType:10 NAME 'immaePostfixMail'
96 DESC 'the dovecot mail location'
97 EQUALITY caseExactIA5Match
98 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
99
100attributetype ( ImmaeattributeType:11 NAME 'immaePostfixUid'
101 DESC 'the dovecot uid'
102 EQUALITY caseExactIA5Match
103 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
104
105attributetype ( ImmaeattributeType:12 NAME 'immaePostfixGid'
106 DESC 'the dovecot gid'
107 EQUALITY caseExactIA5Match
108 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
109
110objectclass ( ImmaeobjectClass:6 NAME 'immaePostfixClass'
111 DESC 'Expansion of the existing object classes for Postfix'
112 SUP top AUXILIARY
113 MUST ( immaePostfixAddress $ immaePostfixHome $
114 immaePostfixMail $ immaePostfixUid $ immaePostfixGid )
115 )
116
117# Tinc informations
118# Domaine = une classe a part ou une partie du dn ?
119# attributetype ( ImmaeattributeType:13 NAME 'immaeTincIpSegment'
120# DESC 'the internal ip segment in tinc'
121# EQUALITY caseIgnoreIA5Match
122# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
123#
124# attributetype ( ImmaeattributeType:14 NAME 'immaeTincSubdomain'
125# DESC 'the host subdomain'
126# EQUALITY caseIgnoreIA5Match
127# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
128#
129# attributetype ( ImmaeattributeType:15 NAME 'immaeTincHostname'
130# DESC 'the host name'
131# EQUALITY caseIgnoreIA5Match
132# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
133#
134# objectclass ( ImmaeobjectClass:7 NAME 'immaeTincHostClass'
135# DESC 'Expansion of the existing object classes for Tinc'
136# SUP top AUXILIARY
137# MUST ( immaeTincInternalIp $ immaeTincSubdomain $
138# immaeTincHostname )
139# )
140
141attributetype (ImmaeattributeType:16 NAME 'immaePuppetJson'
142 DESC 'Puppet hiera json'
143 EQUALITY octetStringMatch
144 SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
145
146objectclass ( ImmaeobjectClass:8 NAME 'immaePuppetClass'
147 DESC 'Expansion of the existing object classes for Puppet'
148 SUP top AUXILIARY
149 MUST ( immaePuppetJson )
150 )
151
152attributetype (ImmaeattributeType:19 NAME 'immaeTaskId'
153 DESC 'Taskwarrior server Org:Name:Key'
154 EQUALITY caseIgnoreMatch
155 SUBSTR caseIgnoreSubstringsMatch
156 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
157
158objectclass ( ImmaeobjectClass:9 NAME 'immaeTaskClass'
159 DESC 'Expansion of the existing object classes for Task'
160 SUP top AUXILIARY
161 MUST ( immaeTaskId )
162 )
163
164# Peertube uid
165attributetype ( ImmaeattributeType:20 NAME 'immaePeertubeId'
166 DESC 'login for Peertube'
167 EQUALITY caseIgnoreMatch
168 SUBSTR caseIgnoreSubstringsMatch
169 SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
170
171objectclass ( ImmaeobjectClass:10 NAME 'immaePeertubeClass'
172 DESC 'Expansion of the existing object classes for peertube'
173 SUP top AUXILIARY
174 MUST ( immaePeertubeId ) )
175
176
177# Last:
178# attributetype ( ImmaeattributeType:20 NAME 'immaePeertubeId'
179# objectclass ( ImmaeobjectClass:10 NAME 'immaePeertubeClass'
diff --git a/modules/private/databases/openldap_replication.nix b/modules/private/databases/openldap_replication.nix
deleted file mode 100644
index b456323..0000000
--- a/modules/private/databases/openldap_replication.nix
+++ /dev/null
@@ -1,166 +0,0 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.databasesReplication.openldap;
4 eldiron_schemas = pkgs.callPackage ./openldap/eldiron_schemas.nix {};
5 ldapConfig = hcfg: name: pkgs.writeText "slapd.conf" ''
6 include ${pkgs.openldap}/etc/schema/core.schema
7 include ${pkgs.openldap}/etc/schema/cosine.schema
8 include ${pkgs.openldap}/etc/schema/inetorgperson.schema
9 include ${pkgs.openldap}/etc/schema/nis.schema
10 ${eldiron_schemas}
11 pidfile /run/slapd_${name}/slapd.pid
12 argsfile /run/slapd_${name}/slapd.args
13
14 moduleload back_hdb
15 backend hdb
16 database hdb
17
18 suffix "${hcfg.base}"
19 rootdn "cn=root,${hcfg.base}"
20 directory ${cfg.base}/${name}/openldap
21
22 index objectClass eq
23 index uid pres,eq
24 index entryUUID eq
25
26 include ${config.secrets.fullPaths."openldap_replication/${name}/replication_config"}
27 '';
28in
29{
30 options.myServices.databasesReplication.openldap = {
31 enable = lib.mkEnableOption "Enable openldap replication";
32 base = lib.mkOption {
33 type = lib.types.path;
34 description = ''
35 Base path to put the replications
36 '';
37 };
38 hosts = lib.mkOption {
39 default = {};
40 description = ''
41 Hosts to backup
42 '';
43 type = lib.types.attrsOf (lib.types.submodule {
44 options = {
45 package = lib.mkOption {
46 type = lib.types.package;
47 default = pkgs.openldap;
48 description = ''
49 Openldap package for this host
50 '';
51 };
52 url = lib.mkOption {
53 type = lib.types.str;
54 description = ''
55 Host to connect to
56 '';
57 };
58 base = lib.mkOption {
59 type = lib.types.str;
60 description = ''
61 Base DN to replicate
62 '';
63 };
64 dn = lib.mkOption {
65 type = lib.types.str;
66 description = ''
67 DN to use
68 '';
69 };
70 password = lib.mkOption {
71 type = lib.types.str;
72 description = ''
73 Password to use
74 '';
75 };
76 };
77 });
78 };
79 };
80
81 config = lib.mkIf cfg.enable {
82 users.users.openldap = {
83 description = "Openldap database user";
84 group = "openldap";
85 uid = config.ids.uids.openldap;
86 extraGroups = [ "keys" ];
87 };
88 users.groups.openldap.gid = config.ids.gids.openldap;
89
90 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (name: hcfg: [
91 (lib.nameValuePair "openldap_replication/${name}/replication_config" {
92 user = "openldap";
93 group = "openldap";
94 permissions = "0400";
95 text = ''
96 syncrepl rid=000
97 provider=${hcfg.url}
98 type=refreshAndPersist
99 searchbase="${hcfg.base}"
100 retry="5 10 300 +"
101 attrs="*,+"
102 schemachecking=off
103 bindmethod=simple
104 binddn="${hcfg.dn}"
105 credentials="${hcfg.password}"
106 '';
107 })
108 (lib.nameValuePair "openldap_replication/${name}/replication_password" {
109 user = "openldap";
110 group = "openldap";
111 permissions = "0400";
112 text = hcfg.password;
113 })
114 ]) cfg.hosts));
115
116 services.cron = {
117 enable = true;
118 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
119 let
120 dataDir = "${cfg.base}/${name}/openldap";
121 backupDir = "${cfg.base}/${name}/openldap_backup";
122 backup_script = pkgs.writeScript "backup_openldap_${name}" ''
123 #!${pkgs.stdenv.shell}
124
125 ${hcfg.package}/bin/slapcat -b "${hcfg.base}" -f ${ldapConfig hcfg name} -l ${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).ldif
126 '';
127 u = pkgs.callPackage ./utils.nix {};
128 cleanup_script = pkgs.writeScript "cleanup_openldap_${name}" (u.exponentialDumps "ldif" backupDir);
129 in [
130 "0 22,4,10,16 * * * root ${backup_script}"
131 "0 3 * * * root ${cleanup_script}"
132 ]) cfg.hosts);
133 };
134
135 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
136 lib.attrsets.nameValuePair "openldap_replication_${name}" {
137 deps = [ "users" "groups" ];
138 text = ''
139 install -m 0700 -o openldap -g openldap -d ${cfg.base}/${name}/openldap
140 install -m 0700 -o openldap -g openldap -d ${cfg.base}/${name}/openldap_backup
141 '';
142 }) cfg.hosts;
143
144 systemd.services = lib.attrsets.mapAttrs' (name: hcfg:
145 let
146 dataDir = "${cfg.base}/${name}/openldap";
147 in
148 lib.attrsets.nameValuePair "openldap_backup_${name}" {
149 description = "Openldap replication for ${name}";
150 wantedBy = [ "multi-user.target" ];
151 after = [ "network.target" ];
152 unitConfig.RequiresMountsFor = dataDir;
153
154 preStart = ''
155 mkdir -p /run/slapd_${name}
156 chown -R "openldap:openldap" /run/slapd_${name}
157 '';
158
159 serviceConfig = {
160 ExecStart = "${hcfg.package}/libexec/slapd -d 0 -u openldap -g openldap -f ${ldapConfig hcfg name}";
161 };
162 }) cfg.hosts;
163 };
164}
165
166
diff --git a/modules/private/databases/postgresql.nix b/modules/private/databases/postgresql.nix
deleted file mode 100644
index a6c4cc9..0000000
--- a/modules/private/databases/postgresql.nix
+++ /dev/null
@@ -1,228 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.databases.postgresql;
4in {
5 options.myServices.databases = {
6 postgresql = {
7 enable = lib.mkOption {
8 default = false;
9 example = true;
10 description = "Whether to enable postgresql database";
11 type = lib.types.bool;
12 };
13 package = lib.mkOption {
14 type = lib.types.package;
15 default = pkgs.postgresql;
16 description = ''
17 Postgresql package to use.
18 '';
19 };
20 ldapConfig = lib.mkOption {
21 description = "LDAP configuration to allow PAM identification via LDAP";
22 type = lib.types.submodule {
23 options = {
24 host = lib.mkOption { type = lib.types.str; };
25 base = lib.mkOption { type = lib.types.str; };
26 dn = lib.mkOption { type = lib.types.str; };
27 password = lib.mkOption { type = lib.types.str; };
28 filter = lib.mkOption { type = lib.types.str; };
29 };
30 };
31 };
32 replicationLdapConfig = lib.mkOption {
33 description = "LDAP configuration to allow replication";
34 type = lib.types.submodule {
35 options = {
36 host = lib.mkOption { type = lib.types.str; };
37 base = lib.mkOption { type = lib.types.str; };
38 dn = lib.mkOption { type = lib.types.str; };
39 password = lib.mkOption { type = lib.types.str; };
40 };
41 };
42 };
43 authorizedHosts = lib.mkOption {
44 default = {};
45 description = "Hosts to allow connections from";
46 type = lib.types.attrsOf (lib.types.listOf (lib.types.submodule {
47 options = {
48 method = lib.mkOption {
49 default = "md5";
50 type = lib.types.str;
51 };
52 username = lib.mkOption {
53 default = "all";
54 type = lib.types.str;
55 };
56 database = lib.mkOption {
57 default = "all";
58 type = lib.types.str;
59 };
60 ip4 = lib.mkOption {
61 default = [];
62 type = lib.types.listOf lib.types.str;
63 };
64 ip6 = lib.mkOption {
65 default = [];
66 type = lib.types.listOf lib.types.str;
67 };
68 };
69 }));
70 };
71 replicationHosts = lib.mkOption {
72 default = {};
73 description = "Hosts to allow replication from";
74 type = lib.types.attrsOf (lib.types.submodule {
75 options = {
76 ip4 = lib.mkOption {
77 type = lib.types.listOf lib.types.str;
78 };
79 ip6 = lib.mkOption {
80 type = lib.types.listOf lib.types.str;
81 };
82 };
83 });
84 };
85 # Output variables
86 socketsDir = lib.mkOption {
87 type = lib.types.path;
88 default = "/run/postgresql";
89 description = ''
90 The directory where Postgresql puts sockets.
91 '';
92 readOnly = true;
93 };
94 };
95 };
96
97 config = lib.mkIf cfg.enable {
98 networking.firewall.allowedTCPPorts = [ 5432 ];
99
100 security.acme.certs."postgresql" = config.myServices.databasesCerts // {
101 user = "postgres";
102 group = "postgres";
103 domain = "db-1.immae.eu";
104 postRun = ''
105 systemctl reload postgresql.service
106 '';
107 };
108
109 systemd.services.postgresql.serviceConfig = {
110 SupplementaryGroups = "keys";
111 };
112 systemd.services.postgresql.postStart = lib.mkAfter ''
113 # This line is already defined in 19.09
114 PSQL="${pkgs.sudo}/bin/sudo -u postgres psql --port=5432"
115
116 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (role: _: ''
117 $PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='${role}'" \
118 | grep -q 1 \
119 || $PSQL -tAc 'CREATE USER "${role}" WITH REPLICATION'
120 '') cfg.replicationHosts)}
121
122 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (role: _:
123 let
124 sname = builtins.replaceStrings ["-"] ["_"] role;
125 in
126 ''
127 $PSQL -tAc "SELECT 1 FROM pg_replication_slots WHERE slot_name='${sname}'" \
128 | grep -q 1 \
129 || $PSQL -tAc "SELECT * FROM pg_create_physical_replication_slot('${sname}')"
130 '') cfg.replicationHosts)}
131 '';
132
133 services.postgresql = {
134 enable = true;
135 package = cfg.package;
136 enableTCPIP = true;
137 extraConfig = ''
138 max_connections = 100
139 wal_level = logical
140 shared_buffers = 512MB
141 work_mem = 10MB
142 max_wal_size = 1GB
143 min_wal_size = 80MB
144 log_timezone = 'Europe/Paris'
145 datestyle = 'iso, mdy'
146 timezone = 'Europe/Paris'
147 lc_messages = 'en_US.UTF-8'
148 lc_monetary = 'en_US.UTF-8'
149 lc_numeric = 'en_US.UTF-8'
150 lc_time = 'en_US.UTF-8'
151 default_text_search_config = 'pg_catalog.english'
152 # this introduces a small delay before storing on disk, but
153 # makes it order of magnitudes quicker
154 synchronous_commit = off
155 ssl = on
156 ssl_cert_file = '${config.security.acme.certs.postgresql.directory}/fullchain.pem'
157 ssl_key_file = '${config.security.acme.certs.postgresql.directory}/key.pem'
158 '';
159 authentication = let
160 hosts = builtins.concatStringsSep "\n" (
161 lib.lists.flatten (lib.mapAttrsToList (k: vs: map (v:
162 map (ip6: "hostssl ${v.database} ${v.username} ${ip6}/128 ${v.method}") v.ip6
163 ++ map (ip4: "hostssl ${v.database} ${v.username} ${ip4}/32 ${v.method}") v.ip4
164 ) vs) cfg.authorizedHosts
165 ));
166 replication = builtins.concatStringsSep "\n" (
167 lib.lists.flatten (lib.mapAttrsToList (k: v:
168 map (ip6: "hostssl replication ${k} ${ip6}/128 pam pamservice=postgresql_replication") v.ip6
169 ++ map (ip4: "hostssl replication ${k} ${ip4}/32 pam pamservice=postgresql_replication") v.ip4
170 ) cfg.replicationHosts
171 ));
172 in ''
173 local all postgres ident
174 local all all md5
175 ${hosts}
176 hostssl all all all pam
177 ${replication}
178 '';
179 };
180
181 secrets.keys = {
182 "postgresql/pam" = {
183 permissions = "0400";
184 group = "postgres";
185 user = "postgres";
186 text = with cfg.ldapConfig; ''
187 host ${host}
188 base ${base}
189 binddn ${dn}
190 bindpw ${password}
191 pam_filter ${filter}
192 ssl start_tls
193 '';
194 };
195 "postgresql/pam_replication" = {
196 permissions = "0400";
197 group = "postgres";
198 user = "postgres";
199 text = with cfg.replicationLdapConfig; ''
200 host ${host}
201 base ${base}
202 binddn ${dn}
203 bindpw ${password}
204 pam_login_attribute cn
205 ssl start_tls
206 '';
207 };
208 };
209
210 security.pam.services = let
211 pam_ldap = "${pkgs.pam_ldap}/lib/security/pam_ldap.so";
212 in {
213 postgresql = {
214 text = ''
215 auth required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam"}
216 account required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam"}
217 '';
218 };
219 postgresql_replication = {
220 text = ''
221 auth required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam_replication"}
222 account required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam_replication"}
223 '';
224 };
225 };
226 };
227}
228
diff --git a/modules/private/databases/postgresql_replication.nix b/modules/private/databases/postgresql_replication.nix
deleted file mode 100644
index 135bbed..0000000
--- a/modules/private/databases/postgresql_replication.nix
+++ /dev/null
@@ -1,182 +0,0 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.databasesReplication.postgresql;
4in
5{
6 options.myServices.databasesReplication.postgresql = {
7 enable = lib.mkEnableOption "Enable postgresql replication";
8 base = lib.mkOption {
9 type = lib.types.path;
10 description = ''
11 Base path to put the replications
12 '';
13 };
14 mainPackage = lib.mkOption {
15 type = lib.types.package;
16 default = pkgs.postgresql;
17 description = ''
18 Postgresql package available in shell
19 '';
20 };
21 hosts = lib.mkOption {
22 default = {};
23 description = ''
24 Hosts to backup
25 '';
26 type = lib.types.attrsOf (lib.types.submodule {
27 options = {
28 package = lib.mkOption {
29 type = lib.types.package;
30 default = pkgs.postgresql;
31 description = ''
32 Postgresql package for this host
33 '';
34 };
35 slot = lib.mkOption {
36 type = lib.types.str;
37 description = ''
38 Slot to use for replication
39 '';
40 };
41 connection = lib.mkOption {
42 type = lib.types.str;
43 description = ''
44 Connection string to access the psql master
45 '';
46 };
47 };
48 });
49 };
50 };
51
52 config = lib.mkIf cfg.enable {
53 users.users.postgres = {
54 name = "postgres";
55 uid = config.ids.uids.postgres;
56 group = "postgres";
57 description = "PostgreSQL server user";
58 home = "/var/lib/postgresql";
59 useDefaultShell = true;
60 extraGroups = [ "keys" ];
61 };
62 users.groups.postgres.gid = config.ids.gids.postgres;
63 environment.systemPackages = [ cfg.mainPackage ];
64
65 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (name: hcfg: [
66 (lib.nameValuePair "postgresql_replication/${name}/recovery.conf" {
67 user = "postgres";
68 group = "postgres";
69 permissions = "0400";
70 text = ''
71 standby_mode = on
72 primary_conninfo = '${hcfg.connection}?sslmode=require'
73 primary_slot_name = '${hcfg.slot}'
74 '';
75 })
76 (lib.nameValuePair "postgresql_replication/${name}/connection_string" {
77 user = "postgres";
78 group = "postgres";
79 permissions = "0400";
80 text = hcfg.connection;
81 })
82 (lib.nameValuePair "postgresql_replication/${name}/postgresql.conf" {
83 user = "postgres";
84 group = "postgres";
85 permissions = "0400";
86 text = let
87 dataDir = "${cfg.base}/${name}/postgresql";
88 in ''
89 listen_addresses = '''
90 unix_socket_directories = '${dataDir}'
91 data_directory = '${dataDir}'
92 wal_level = logical
93 '';
94 })
95 ]) cfg.hosts));
96
97 services.cron = {
98 enable = true;
99 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
100 let
101 dataDir = "${cfg.base}/${name}/postgresql";
102 backupDir = "${cfg.base}/${name}/postgresql_backup";
103 backup_script = pkgs.writeScript "backup_psql_${name}" ''
104 #!${pkgs.stdenv.shell}
105
106 set -euo pipefail
107
108 resume_replication() {
109 ${hcfg.package}/bin/psql -h ${dataDir} -c "SELECT pg_wal_replay_resume();" >/dev/null || echo "impossible to resume replication"
110 }
111
112 trap resume_replication EXIT
113
114 ${hcfg.package}/bin/psql -h ${dataDir} -c "SELECT pg_wal_replay_pause();" >/dev/null || (echo "impossible to pause replication" && false)
115
116 ${hcfg.package}/bin/pg_dumpall -h ${dataDir} -f ${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).sql
117 '';
118 u = pkgs.callPackage ./utils.nix {};
119 cleanup_script = pkgs.writeScript "cleanup_postgresql_${name}" (u.keepLastNDumps "sql" backupDir 6);
120 in [
121 "0 22,4,10,16 * * * postgres ${backup_script}"
122 "0 3 * * * postgres ${cleanup_script}"
123 ]) cfg.hosts);
124 };
125
126 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
127 lib.attrsets.nameValuePair "psql_replication_${name}" {
128 deps = [ "users" ];
129 text = ''
130 install -m 0700 -o postgres -g postgres -d ${cfg.base}/${name}/postgresql
131 install -m 0700 -o postgres -g postgres -d ${cfg.base}/${name}/postgresql_backup
132 '';
133 }) cfg.hosts;
134
135 systemd.services = lib.attrsets.mapAttrs' (name: hcfg:
136 let
137 dataDir = "${cfg.base}/${name}/postgresql";
138 in
139 lib.attrsets.nameValuePair "postgresql_backup_${name}" {
140 description = "Postgresql replication for ${name}";
141 wantedBy = [ "multi-user.target" ];
142 after = [ "network.target" ];
143
144 environment.PGDATA = dataDir;
145 path = [ hcfg.package ];
146
147 preStart = ''
148 if ! test -e ${dataDir}/PG_VERSION; then
149 mkdir -m 0700 -p ${dataDir}
150 chown -R postgres:postgres ${dataDir}
151 fi
152 '';
153 script = let
154 fp = n: config.secrets.fullPaths."postgresql_replication/${name}/${n}";
155 in ''
156 if ! test -e ${dataDir}/PG_VERSION; then
157 pg_basebackup -d $(cat ${fp "connection_string"}) -D ${dataDir} -S ${hcfg.slot}
158 fi
159 ln -sfn ${fp "recovery.conf"} ${dataDir}/recovery.conf
160 ln -sfn ${fp "postgresql.conf"} ${dataDir}/postgresql.conf
161
162 exec postgres
163 '';
164
165 serviceConfig = {
166 ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
167 User = "postgres";
168 Group = "postgres";
169 PermissionsStartOnly = true;
170 RuntimeDirectory = "postgresql";
171 Type = "notify";
172
173 KillSignal = "SIGINT";
174 KillMode = "mixed";
175 # basebackup can take a long time
176 TimeoutStartSec="infinity";
177 TimeoutStopSec = 120;
178 };
179 unitConfig.RequiresMountsFor = dataDir;
180 }) cfg.hosts;
181 };
182}
diff --git a/modules/private/databases/redis.nix b/modules/private/databases/redis.nix
deleted file mode 100644
index 685fa46..0000000
--- a/modules/private/databases/redis.nix
+++ /dev/null
@@ -1,133 +0,0 @@
1{ lib, config, pkgs, ... }:
2let
3 cfg = config.myServices.databases.redis;
4in {
5 options.myServices.databases.redis = {
6 enable = lib.mkOption {
7 default = false;
8 example = true;
9 description = "Whether to enable redis database";
10 type = lib.types.bool;
11 };
12 socketsDir = lib.mkOption {
13 type = lib.types.path;
14 default = "/run/redis";
15 description = ''
16 The directory where Redis puts sockets.
17 '';
18 };
19 # Output variables
20 sockets = lib.mkOption {
21 type = lib.types.attrsOf lib.types.path;
22 default = {
23 redis = "${cfg.socketsDir}/redis.sock";
24 };
25 readOnly = true;
26 description = ''
27 Redis sockets
28 '';
29 };
30 };
31
32 config = lib.mkIf cfg.enable {
33 users.users.redis.uid = config.ids.uids.redis;
34 users.groups.redis.gid = config.ids.gids.redis;
35 services.redis = rec {
36 enable = true;
37 bind = "127.0.0.1";
38 unixSocket = cfg.sockets.redis;
39 extraConfig = ''
40 unixsocketperm 777
41 maxclients 1024
42 '';
43 };
44 systemd.services.redis.serviceConfig.Slice = "redis.slice";
45
46 services.spiped = {
47 enable = true;
48 config.redis = {
49 decrypt = true;
50 source = "0.0.0.0:16379";
51 target = "/run/redis/redis.sock";
52 keyfile = config.secrets.fullPaths."redis/spiped_keyfile";
53 };
54 };
55 systemd.services.spiped_redis = {
56 description = "Secure pipe 'redis'";
57 after = [ "network.target" ];
58 wantedBy = [ "multi-user.target" ];
59
60 serviceConfig = {
61 Slice = "redis.slice";
62 Restart = "always";
63 User = "spiped";
64 PermissionsStartOnly = true;
65 SupplementaryGroups = "keys";
66 };
67
68 script = "exec ${pkgs.spiped}/bin/spiped -F `cat /etc/spiped/redis.spec`";
69 };
70
71 services.filesWatcher.predixy = {
72 restart = true;
73 paths = [ config.secrets.fullPaths."redis/predixy.conf" ];
74 };
75
76 networking.firewall.allowedTCPPorts = [ 7617 16379 ];
77 secrets.keys = {
78 "redis/predixy.conf" = {
79 user = "redis";
80 group = "redis";
81 permissions = "0400";
82 text = ''
83 Name Predixy
84 Bind 127.0.0.1:7617
85 ClientTimeout 300
86 WorkerThreads 1
87
88 Authority {
89 Auth "${config.myEnv.databases.redis.predixy.read}" {
90 Mode read
91 }
92 }
93
94 StandaloneServerPool {
95 Databases 16
96 RefreshMethod fixed
97 Group shard001 {
98 + ${config.myEnv.databases.redis.socket}
99 }
100 }
101 '';
102 };
103 "redis/spiped_keyfile" = {
104 user = "spiped";
105 group = "spiped";
106 permissions = "0400";
107 text = config.myEnv.databases.redis.spiped_key;
108 };
109 };
110
111 systemd.slices.redis = {
112 description = "Redis slice";
113 };
114
115 systemd.services.predixy = {
116 description = "Redis proxy";
117 wantedBy = [ "multi-user.target" ];
118 after = [ "redis.service" ];
119
120 serviceConfig = {
121 Slice = "redis.slice";
122 User = "redis";
123 Group = "redis";
124 SupplementaryGroups = "keys";
125 Type = "simple";
126
127 ExecStart = "${pkgs.predixy}/bin/predixy ${config.secrets.fullPaths."redis/predixy.conf"}";
128 };
129
130 };
131 };
132}
133
diff --git a/modules/private/databases/redis_replication.nix b/modules/private/databases/redis_replication.nix
deleted file mode 100644
index 9e48939..0000000
--- a/modules/private/databases/redis_replication.nix
+++ /dev/null
@@ -1,171 +0,0 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.databasesReplication.redis;
4in
5{
6 options.myServices.databasesReplication.redis = {
7 enable = lib.mkEnableOption "Enable redis replication";
8 base = lib.mkOption {
9 type = lib.types.path;
10 description = ''
11 Base path to put the replications
12 '';
13 };
14 hosts = lib.mkOption {
15 default = {};
16 description = ''
17 Hosts to backup
18 '';
19 type = lib.types.attrsOf (lib.types.submodule {
20 options = {
21 package = lib.mkOption {
22 type = lib.types.package;
23 default = pkgs.redis;
24 description = ''
25 Redis package for this host
26 '';
27 };
28 host = lib.mkOption {
29 type = lib.types.str;
30 description = ''
31 Host to connect to
32 '';
33 };
34 port = lib.mkOption {
35 type = lib.types.str;
36 description = ''
37 Port to connect to
38 '';
39 };
40 password = lib.mkOption {
41 type = lib.types.nullOr lib.types.str;
42 default = null;
43 description = ''
44 Password to use
45 '';
46 };
47 };
48 });
49 };
50 };
51
52 config = lib.mkIf cfg.enable {
53 users.users.redis = {
54 description = "Redis database user";
55 group = "redis";
56 uid = config.ids.uids.redis;
57 extraGroups = [ "keys" ];
58 };
59 users.groups.redis.gid = config.ids.gids.redis;
60
61 services.spiped = { # sync from eldiron
62 enable = true;
63 config.redis = {
64 encrypt = true;
65 source = "127.0.0.1:16379";
66 target = "${config.myEnv.servers.eldiron.ips.main.ip4}:16379";
67 keyfile = config.secrets.fullPaths."redis/spiped_eldiron_keyfile";
68 };
69 };
70
71 secrets.keys = lib.mapAttrs' (name: hcfg:
72 lib.nameValuePair "redis_replication/${name}/config" {
73 user = "redis";
74 group = "redis";
75 permissions = "0400";
76 text = ''
77 pidfile ${cfg.base}/${name}/redis/redis.pid
78 port 0
79 unixsocket /run/redis_${name}/redis.sock
80 loglevel notice
81 logfile /dev/null
82 syslog-enabled yes
83 databases 16
84 save 900 1
85 save 300 10
86 save 60 10000
87 dbfilename dump.rdb
88 dir ${cfg.base}/${name}/redis/
89 slaveof ${hcfg.host} ${hcfg.port}
90 ${if hcfg.password != null then "masterauth ${hcfg.password}" else ""}
91 appendOnly no
92 appendfsync everysec
93 slowlog-log-slower-than 10000
94 slowlog-max-len 128
95 unixsocketperm 777
96 maxclients 1024
97 '';
98 }
99 ) cfg.hosts // {
100 "redis/spiped_eldiron_keyfile" = { # For eldiron only
101 user = "spiped";
102 group = "spiped";
103 permissions = "0400";
104 text = config.myEnv.databases.redis.spiped_key;
105 };
106 };
107
108 services.cron = {
109 enable = true;
110 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
111 let
112 dataDir = "${cfg.base}/${name}/redis";
113 backupDir = "${cfg.base}/${name}/redis_backup";
114 backup_script = pkgs.writeScript "backup_redis_${name}" ''
115 #!${pkgs.stdenv.shell}
116
117 ${pkgs.coreutils}/bin/cp ${cfg.base}/${name}/redis/dump.rdb \
118 ${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).rdb
119 '';
120 u = pkgs.callPackage ./utils.nix {};
121 cleanup_script = pkgs.writeScript "cleanup_redis_${name}" (u.exponentialDumps "rdb" backupDir);
122 in [
123 "0 22,4,10,16 * * * root ${backup_script}"
124 "0 3 * * * root ${cleanup_script}"
125 ]) cfg.hosts);
126 };
127
128 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
129 lib.attrsets.nameValuePair "redis_replication_${name}" {
130 deps = [ "users" "groups" ];
131 text = ''
132 install -m 0700 -o redis -g redis -d ${cfg.base}/${name}/redis
133 install -m 0700 -o redis -g redis -d ${cfg.base}/${name}/redis_backup
134 '';
135 }) cfg.hosts;
136
137 systemd.services = {
138 spiped_redis = { # For eldiron
139 description = "Secure pipe 'redis'";
140 after = [ "network.target" ];
141 wantedBy = [ "multi-user.target" ];
142
143 serviceConfig = {
144 Restart = "always";
145 User = "spiped";
146 PermissionsStartOnly = true;
147 SupplementaryGroups = "keys";
148 };
149
150 script = "exec ${pkgs.spiped}/bin/spiped -F `cat /etc/spiped/redis.spec`";
151 };
152 } // lib.attrsets.mapAttrs' (name: hcfg:
153 let
154 dataDir = "${cfg.base}/${name}/redis";
155 in
156 lib.attrsets.nameValuePair "redis_backup_${name}" {
157 description = "Redis replication for ${name}";
158 wantedBy = [ "multi-user.target" ];
159 after = [ "network.target" ];
160 unitConfig.RequiresMountsFor = dataDir;
161
162 serviceConfig = {
163 ExecStart = "${hcfg.package}/bin/redis-server ${config.secrets.fullPaths."redis_replication/${name}/config"}";
164 User = "redis";
165 RuntimeDirectory = "redis_${name}";
166 };
167 }) cfg.hosts;
168 };
169}
170
171
diff --git a/modules/private/databases/utils.nix b/modules/private/databases/utils.nix
deleted file mode 100644
index 47988fc..0000000
--- a/modules/private/databases/utils.nix
+++ /dev/null
@@ -1,30 +0,0 @@
1{ pkgs }:
2{
3 keepLastNDumps = ext: backupDir: n: ''
4 #!${pkgs.stdenv.shell}
5
6 cd ${backupDir}
7 ${pkgs.coreutils}/bin/rm -f \
8 $(${pkgs.coreutils}/bin/ls -1 *.${ext} \
9 | ${pkgs.coreutils}/bin/sort -r \
10 | ${pkgs.gnused}/bin/sed -e '1,${builtins.toString n}d')
11 '';
12 exponentialDumps = ext: backupDir: let
13 log2rotateSrc = builtins.fetchGit {
14 url = "https://github.com/avian2/pylog2rotate";
15 ref = "master";
16 rev = "061f0564757289d3bea553b16f8fd5c4a0319c5e";
17 };
18 log2rotate = pkgs.writeScript "log2rotate" ''
19 #!${pkgs.python3}/bin/python
20
21 ${builtins.readFile "${log2rotateSrc}/log2rotate.py"}
22 '';
23 in ''
24 #!${pkgs.stdenv.shell}
25
26 cd ${backupDir}
27 ${pkgs.coreutils}/bin/rm -f $(ls -1 *.${ext} | grep -v 'T22:' | sort -r | sed -e '1,12d')
28 ${pkgs.coreutils}/bin/rm -f $(ls -1 *T22*.${ext} | ${log2rotate} --skip 7 --fuzz 7 --delete --format='%Y-%m-%dT%H:%M+00:00.${ext}')
29 '';
30}
diff --git a/modules/private/default.nix b/modules/private/default.nix
deleted file mode 100644
index 9108a92..0000000
--- a/modules/private/default.nix
+++ /dev/null
@@ -1,136 +0,0 @@
1let
2set = {
3 # adatped from nixpkgs/nixos/modules/services/web-servers/apache-httpd/default.nix
4 httpdInte = import ../websites/httpd-service-builder.nix { httpdName = "Inte"; withUsers = false; };
5 httpdProd = import ../websites/httpd-service-builder.nix { httpdName = "Prod"; withUsers = false; };
6 httpdTools = import ../websites/httpd-service-builder.nix { httpdName = "Tools"; withUsers = true; };
7
8 databases = ./databases;
9 mariadb = ./databases/mariadb.nix;
10 openldap = ./databases/openldap;
11 postgresql = ./databases/postgresql.nix;
12 redis = ./databases/redis.nix;
13 postgresqlReplication = ./databases/postgresql_replication.nix;
14 mariadbReplication = ./databases/mariadb_replication.nix;
15 redisReplication = ./databases/redis_replication.nix;
16 openldapReplication = ./databases/openldap_replication.nix;
17
18 websites = ./websites;
19 gemini = ./gemini;
20
21
22 # Personal websites
23 bakeerCloud = ./websites/bakeer/cloud.nix;
24
25 capitainesLandingPages = ./websites/capitaines/landing_pages.nix;
26
27 chloeInte = ./websites/chloe/integration.nix;
28 chloeProd = ./websites/chloe/production.nix;
29
30 cipcaSympa = ./websites/cip-ca/sympa.nix;
31
32 connexionswingInte = ./websites/connexionswing/integration.nix;
33 connexionswingProd = ./websites/connexionswing/production.nix;
34
35 deniseDenisejeromeProd = ./websites/denise/denisejerome.nix;
36 deniseEvariste = ./websites/denise/evariste.nix;
37 deniseOMS = ./websites/denise/oms.nix;
38 deniseBingo = ./websites/denise/bingo.nix;
39 deniseAventuriers = ./websites/denise/aventuriers.nix;
40 deniseProduction = ./websites/denise/production.nix;
41
42 emiliaMoodle = ./websites/emilia/moodle.nix;
43 emiliaAtelierFringant = ./websites/emilia/atelierfringant.nix;
44
45 florianApp = ./websites/florian/app.nix;
46 florianInte = ./websites/florian/integration.nix;
47 florianProd = ./websites/florian/production.nix;
48
49 immaeProd = ./websites/immae/production.nix;
50 immaeRelease = ./websites/immae/release.nix;
51 immaeTemp = ./websites/immae/temp.nix;
52
53 isabelleAtenInte = ./websites/isabelle/aten_integration.nix;
54 isabelleAtenProd = ./websites/isabelle/aten_production.nix;
55 isabelleIridologie = ./websites/isabelle/iridologie.nix;
56
57 jeromeNaturaloutil = ./websites/jerome/naturaloutil.nix;
58
59 leilaProd = ./websites/leila/production.nix;
60
61 ludivineInte = ./websites/ludivine/integration.nix;
62 ludivineProd = ./websites/ludivine/production.nix;
63
64 nassimeProd = ./websites/nassime/production.nix;
65
66 nathVillon = ./websites/nath/villon.nix;
67
68 papaMaisonBbc = ./websites/papa/maison_bbc.nix;
69 papaSurveillance = ./websites/papa/surveillance.nix;
70
71 patrickFodellaEcolyeu = ./websites/patrick_fodella/ecolyeu.nix;
72 patrickFodellaAltermondia = ./websites/patrick_fodella/altermondia.nix;
73
74 piedsjalouxInte = ./websites/piedsjaloux/integration.nix;
75 piedsjalouxProd = ./websites/piedsjaloux/production.nix;
76
77 ressourcerieBanonProd = ./websites/ressourcerie_banon/production.nix;
78 ressourcerieBanonCloud = ./websites/ressourcerie_banon/cloud.nix;
79 ressourcerieBanonCryptpad = ./websites/ressourcerie_banon/cryptpad.nix;
80
81 richieProd = ./websites/richie/production.nix;
82
83 sydenPeertube = ./websites/syden/peertube.nix;
84
85 teliotortayProd = ./websites/telio_tortay/production.nix;
86
87 # Tools
88 assetsTools = ./websites/tools/assets;
89 cloudTool = ./websites/tools/cloud;
90 cloudFarmTool = ./websites/tools/cloud/farm.nix;
91 cryptpadTool = ./websites/tools/cryptpad;
92 cryptpadFarmTool = ./websites/tools/cryptpad/farm.nix;
93 commentoTool = ./websites/tools/commento;
94 davTool = ./websites/tools/dav;
95 vpnTool = ./websites/tools/vpn;
96 dbTool = ./websites/tools/db;
97 diasporaTool = ./websites/tools/diaspora;
98 etherTool = ./websites/tools/ether;
99 gitTool = ./websites/tools/git;
100 imTool = ./websites/tools/im;
101 mastodonTool = ./websites/tools/mastodon;
102 mgoblinTool = ./websites/tools/mgoblin;
103 peertubeTool = ./websites/tools/peertube;
104 performanceTool = ./websites/tools/performance;
105 toolsTool = ./websites/tools/tools;
106 mailTool = ./websites/tools/mail;
107 statsTool = ./websites/tools/stats;
108
109 # Games
110 codenamesGame = ./websites/tools/games/codenames;
111 terraformingMarsGame = ./websites/tools/games/terraforming-mars;
112
113 mail = ./mail;
114
115 buildbot = ./buildbot;
116 certificates = ./certificates.nix;
117 gitolite = ./gitolite;
118 irc = ./irc.nix;
119 pub = ./pub;
120 tasks = ./tasks;
121 dns = ./dns.nix;
122 ftp = ./ftp.nix;
123 mpd = ./mpd.nix;
124 ejabberd = ./ejabberd;
125 ssh = ./ssh;
126 monitoring = ./monitoring;
127 status = ./monitoring/status.nix;
128 status_engine = ./monitoring/status_engine.nix;
129 vpn = ./vpn;
130
131 environment = ./environment.nix;
132 system = ./system.nix;
133 loginctl-linger = ./loginctl-linger.nix;
134};
135in
136builtins.listToAttrs (map (attr: { name = "priv${attr}"; value = set.${attr}; }) (builtins.attrNames set))
diff --git a/modules/private/dns.nix b/modules/private/dns.nix
deleted file mode 100644
index 1d7fd52..0000000
--- a/modules/private/dns.nix
+++ /dev/null
@@ -1,197 +0,0 @@
1{ lib, pkgs, config, ... }:
2{
3 options.myServices.dns.enable = lib.mkEnableOption "enable DNS resolver";
4 config = let
5 # taken from unstable
6 cartesianProductOfSets = attrsOfLists: with lib;
7 lib.foldl' (listOfAttrs: attrName:
8 concatMap (attrs:
9 map (listValue: attrs // { ${attrName} = listValue; }) attrsOfLists.${attrName}
10 ) listOfAttrs
11 ) [{}] (attrNames attrsOfLists);
12 cfg = config.services.bind;
13 keyIncludes = builtins.concatStringsSep "\n" (map (v: "include \"${config.secrets.fullPaths."bind/${v}.key"}\";") (builtins.attrNames config.myEnv.dns.keys));
14 cartProduct = lib.foldr
15 (s: servers: servers // { ${s.masters} = lib.unique ((servers.${s.masters} or []) ++ [s.keys]); })
16 {}
17 (lib.unique (lib.concatMap (z: cartesianProductOfSets { masters = z.masters or []; keys = z.keys or []; }) config.myEnv.dns.slaveZones));
18 toKeyList = servers: keys: builtins.concatStringsSep "\n" (map (s: ''
19 server ${s} {
20 keys { ${builtins.concatStringsSep ";" keys}; };
21 };
22 '') servers);
23 serverIncludes = builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: toKeyList (lib.flatten (builtins.attrValues config.myEnv.dns.ns."${n}"))) cartProduct);
24 configFile = pkgs.writeText "named.conf" ''
25 include "/etc/bind/rndc.key";
26 controls {
27 inet 127.0.0.1 allow {localhost;} keys {"rndc-key";};
28 };
29
30 acl cachenetworks { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.cacheNetworks} };
31 acl badnetworks { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.blockedNetworks} };
32
33 options {
34 listen-on { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.listenOn} };
35 listen-on-v6 { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.listenOnIpv6} };
36 allow-query { cachenetworks; };
37 blackhole { badnetworks; };
38 forward first;
39 forwarders { ${lib.concatMapStrings (entry: " ${entry}; ") cfg.forwarders} };
40 directory "/var/run/named";
41 pid-file "/var/run/named/named.pid";
42 ${cfg.extraOptions}
43 };
44
45 ${keyIncludes}
46 ${serverIncludes}
47
48 ${cfg.extraConfig}
49
50 ${ lib.concatMapStrings
51 ({ name, file, master ? true, extra ? "", slaves ? [], masters ? [] }:
52 ''
53 zone "${name}" {
54 type ${if master then "master" else "slave"};
55 file "${file}";
56 ${ if lib.lists.length slaves > 0 then
57 ''
58 allow-transfer {
59 ${lib.concatMapStrings (ip: "${ip};\n") slaves}
60 };
61 '' else ""}
62 ${ if lib.lists.length masters > 0 then
63 ''
64 masters {
65 ${lib.concatMapStrings (ip: "${ip};\n") masters}
66 };
67 '' else ""}
68 allow-query { any; };
69 ${extra}
70 };
71 '')
72 cfg.zones }
73 '';
74 mxes = lib.attrsets.filterAttrs
75 (n: v: v.mx.enable)
76 config.myEnv.servers;
77 ip4mxes = builtins.concatStringsSep "\n" (lib.mapAttrsToList
78 (n: v: "${v.mx.subdomain} IN A ${v.ips.main.ip4}")
79 mxes);
80 ip6mxes = builtins.concatStringsSep "\n" (lib.mapAttrsToList
81 (n: v: builtins.concatStringsSep "\n" (map (i: "${v.mx.subdomain} IN AAAA ${i}") v.ips.main.ip6))
82 mxes);
83 mxmxes = n: conf: builtins.concatStringsSep "\n" (lib.mapAttrsToList
84 (_: v: "${n} IN MX ${v.mx.priority} ${v.mx.subdomain}.${conf.name}.")
85 mxes);
86 in lib.mkIf config.myServices.dns.enable {
87 networking.firewall.allowedUDPPorts = [ 53 ];
88 networking.firewall.allowedTCPPorts = [ 53 ];
89 users.users.named.extraGroups = [ "keys" ];
90 secrets.keys = lib.mapAttrs' (k: v:
91 lib.nameValuePair "bind/${k}.key" {
92 permissions = "0400";
93 user = "named";
94 text = ''
95 key "${k}"
96 {
97 algorithm ${v.algorithm};
98 secret "${v.secret}";
99 };
100 '';
101 }
102 ) config.myEnv.dns.keys;
103 services.bind = {
104 enable = true;
105 cacheNetworks = ["any"];
106 configFile = configFile;
107 extraOptions = ''
108 allow-recursion { 127.0.0.1; };
109 allow-transfer { none; };
110
111 notify-source ${config.myEnv.servers.eldiron.ips.main.ip4};
112 notify-source-v6 ${lib.head config.myEnv.servers.eldiron.ips.main.ip6};
113 version none;
114 hostname none;
115 server-id none;
116 '';
117 zones = with config.myEnv.dns;
118 assert (builtins.substring ((builtins.stringLength soa.email)-1) 1 soa.email) != ".";
119 assert (builtins.substring ((builtins.stringLength soa.primary)-1) 1 soa.primary) != ".";
120 (map (conf: {
121 name = conf.name;
122 master = false;
123 file = "/var/run/named/${conf.name}.zone";
124 masters = if lib.attrsets.hasAttr "masters" conf
125 then lib.lists.flatten (map (n: lib.attrsets.attrValues ns.${n}) conf.masters)
126 else [];
127 }) slaveZones)
128 ++ (map (conf: {
129 name = conf.name;
130 master = true;
131 extra = if lib.attrsets.hasAttr "extra" conf then conf.extra else "";
132 slaves = if lib.attrsets.hasAttr "slaves" conf
133 then lib.lists.flatten (map (n: lib.attrsets.attrValues ns.${n}) conf.slaves)
134 else [];
135 file = pkgs.writeText "${conf.name}.zone" ''
136 $TTL 10800
137 @ IN SOA ${soa.primary}. ${builtins.replaceStrings ["@"] ["."] soa.email}. ${soa.serial} ${soa.refresh} ${soa.retry} ${soa.expire} ${soa.ttl}
138
139 ${lib.concatStringsSep "\n" (map (x: "@ IN NS ${x}.") (lib.concatMap (n: lib.attrsets.mapAttrsToList (k: v: k) ns.${n}) conf.ns))}
140 ${lib.optionalString (conf.withCAA != null) ''
141 ${conf.name}. IN CAA 0 issue "${conf.withCAA}"
142 ''}
143
144 ${conf.entries}
145
146 ${if lib.attrsets.hasAttr "withEmail" conf && lib.lists.length conf.withEmail > 0 then ''
147 ${ip4mxes}
148 ${ip6mxes}
149 ${lib.concatStringsSep "\n\n" (map (e:
150 let
151 n = if e.domain == "" then "@" else "${e.domain} ";
152 suffix = if e.domain == "" then "" else ".${e.domain}";
153 in
154 ''
155 ; ------------------ mail: ${n} ---------------------------
156 ${mxmxes n conf}
157
158 ; https://tools.ietf.org/html/rfc6186
159 _submission._tcp${suffix} SRV 0 1 587 smtp.immae.eu.
160 _submissions._tcp${suffix} SRV 0 1 465 smtp.immae.eu.
161 _imap._tcp${suffix} SRV 0 1 143 imap.immae.eu.
162 _imaps._tcp${suffix} SRV 0 1 993 imap.immae.eu.
163 _pop3._tcp${suffix} SRV 10 1 110 pop3.immae.eu.
164 _pop3s._tcp${suffix} SRV 10 1 995 pop3.immae.eu.
165 _sieve._tcp${suffix} SRV 0 1 4190 imap.immae.eu.
166
167 ; MTA-STS
168 ; https://blog.delouw.ch/2018/12/16/using-mta-sts-to-enhance-email-transport-security-and-privacy/
169 ; https://support.google.com/a/answer/9261504
170 _mta-sts${suffix} IN TXT "v=STSv1;id=20200109150200Z"
171 _smtp._tls${suffix} IN TXT "v=TLSRPTv1;rua=mailto:postmaster+mta-sts@immae.eu"
172 mta-sts${suffix} IN A ${config.myEnv.servers.eldiron.ips.main.ip4}
173 ${builtins.concatStringsSep "\n" (map (i: "mta-sts${suffix} IN AAAA ${i}") config.myEnv.servers.eldiron.ips.main.ip6)}
174
175 ; Mail sender authentications
176 ${n} IN TXT "v=spf1 mx ~all"
177 _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;"
178 ${if e.send then ''
179 immae_eu._domainkey${suffix} IN TXT ( "v=DKIM1; k=rsa; s=email; "
180 "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzl3vLd8W5YAuumC5+ZT9OV7/14Pmh5JYtwyqKI3cfe9NnAqInt3xO4bZ7oqIxRKWN4SD39vm7O/QOvFdBt00ENOOzdP90s5gKw6eIP/4+vPTh0IWltAsmu9B2agzdtWUE7t2xFKIzEn8l9niRE2QYbVaqZv4sub98vY55fIgFoHtjkmNC7325S8fjDJGp6OPbyhAs6Xl5/adjF"
181 "0ko4Y2p6RaxLQfjlS0bxmK4Qg6C14pIXHtzVeqOuWrwApqt5+AULSn97iUtqV/IJlEEjC6DUR44t3C/G0G/k46iFclCqRRi0hdPrOHCtZDbtMubnTN9eaUiNpkXh1WnCflHwtjQwIDAQAB" )
182 eldiron._domainkey${suffix} IN TXT ${config.myEnv.mail.dkim.eldiron.public}
183 '' else ""}
184 '') conf.withEmail)}
185 '' + (if conf.name == "immae.eu" then ''
186 ; ----------------- Accept DMARC reports -------------------
187 ${lib.concatStringsSep "\n" (
188 lib.flatten (
189 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
190 )
191 )}
192 '' else "") else ""}
193 '';
194 }) masterZones);
195 };
196 };
197}
diff --git a/modules/private/ejabberd/default.nix b/modules/private/ejabberd/default.nix
deleted file mode 100644
index 4d86a64..0000000
--- a/modules/private/ejabberd/default.nix
+++ /dev/null
@@ -1,92 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.ejabberd;
4in
5{
6 options.myServices = {
7 ejabberd.enable = lib.mkOption {
8 type = lib.types.bool;
9 default = false;
10 description = ''
11 Whether to enable ejabberd service.
12 '';
13 };
14 };
15
16 config = lib.mkIf cfg.enable {
17 security.acme.certs = {
18 "ejabberd" = config.myServices.certificates.certConfig // {
19 user = "ejabberd";
20 group = "ejabberd";
21 domain = "eldiron.immae.eu";
22 keyType = "rsa4096";
23 postRun = ''
24 systemctl restart ejabberd.service
25 '';
26 extraDomains = {
27 "immae.fr" = null;
28 "conference.immae.fr" = null;
29 "proxy.immae.fr" = null;
30 "pubsub.immae.fr" = null;
31 "upload.immae.fr" = null;
32 };
33 };
34 };
35 networking.firewall.allowedTCPPorts = [ 5222 5269 ];
36 myServices.websites.tools.im.enable = true;
37 systemd.services.ejabberd.postStop = ''
38 rm /var/log/ejabberd/erl_crash*.dump
39 '';
40 secrets.keys = {
41 "ejabberd/psql.yml" = {
42 permissions = "0400";
43 user = "ejabberd";
44 group = "ejabberd";
45 text = ''
46 sql_type: pgsql
47 sql_server: "localhost"
48 sql_database: "${config.myEnv.jabber.postgresql.database}"
49 sql_username: "${config.myEnv.jabber.postgresql.user}"
50 sql_password: "${config.myEnv.jabber.postgresql.password}"
51 '';
52 };
53 "ejabberd/host.yml" = {
54 permissions = "0400";
55 user = "ejabberd";
56 group = "ejabberd";
57 text = ''
58 host_config:
59 "immae.fr":
60 domain_certfile: "${config.security.acme.certs.ejabberd.directory}/full.pem"
61 auth_method: [ldap]
62 ldap_servers: ["${config.myEnv.jabber.ldap.host}"]
63 ldap_encrypt: tls
64 ldap_rootdn: "${config.myEnv.jabber.ldap.dn}"
65 ldap_password: "${config.myEnv.jabber.ldap.password}"
66 ldap_base: "${config.myEnv.jabber.ldap.base}"
67 ldap_uids:
68 uid: "%u"
69 immaeXmppUid: "%u"
70 ldap_filter: "${config.myEnv.jabber.ldap.filter}"
71 '';
72 };
73 };
74 users.users.ejabberd.extraGroups = [ "keys" ];
75 services.ejabberd = {
76 package = pkgs.ejabberd.override { withPgsql = true; };
77 imagemagick = true;
78 enable = true;
79 ctlConfig = ''
80 ERLANG_NODE=ejabberd@localhost
81 '';
82 configFile = pkgs.runCommand "ejabberd.yml" {
83 certificatePrivateKeyAndFullChain = "${config.security.acme.certs.ejabberd.directory}/full.pem";
84 certificateCA = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";
85 sql_config_file = config.secrets.fullPaths."ejabberd/psql.yml";
86 host_config_file = config.secrets.fullPaths."ejabberd/host.yml";
87 } ''
88 substituteAll ${./ejabberd.yml} $out
89 '';
90 };
91 };
92}
diff --git a/modules/private/environment.nix b/modules/private/environment.nix
deleted file mode 100644
index 837d24b..0000000
--- a/modules/private/environment.nix
+++ /dev/null
@@ -1,1492 +0,0 @@
1{ config, lib, name, ... }:
2with lib;
3with types;
4with lists;
5let
6 ldapOptions = {
7 base = mkOption { description = "Base of the LDAP tree"; type = str; };
8 host = mkOption { description = "Host to access LDAP"; type = str; };
9 root_dn = mkOption { description = "DN of the root user"; type = str; };
10 root_pw = mkOption { description = "Hashed password of the root user"; type = str; };
11 replication_dn = mkOption { description = "DN of the user allowed to replicate the LDAP directory"; type = str; };
12 replication_pw = mkOption { description = "Password of the user allowed to replicate the LDAP directory"; type = str; };
13 };
14 mkLdapOptions = name: more: mkOption {
15 description = "${name} LDAP configuration";
16 type = submodule {
17 options = ldapOptions // {
18 dn = mkOption { description = "DN of the ${name} user"; type = str; };
19 password = mkOption { description = "password of the ${name} user"; type = str; };
20 filter = mkOption { description = "Filter for ${name} users"; type = str; default = ""; };
21 } // more;
22 };
23 };
24 mysqlOptions = {
25 host = mkOption { description = "Host to access Mysql"; type = str; };
26 remoteHost = mkOption { description = "Host to access Mysql from outside"; type = str; };
27 port = mkOption { description = "Port to access Mysql"; type = str; };
28 socket = mkOption { description = "Socket to access Mysql"; type = path; };
29 systemUsers = mkOption {
30 description = "Attrs of user-passwords allowed to access mysql";
31 type = attrsOf str;
32 };
33 pam = mkOption {
34 description = "PAM configuration for mysql";
35 type = submodule {
36 options = {
37 dn = mkOption { description = "DN to connect as to check users"; type = str; };
38 password = mkOption { description = "DN password to connect as to check users"; type = str; };
39 filter = mkOption { description = "filter to match users"; type = str; };
40 };
41 };
42 };
43 };
44 mkMysqlOptions = name: more: mkOption {
45 description = "${name} mysql configuration";
46 type = submodule {
47 options = mysqlOptions // {
48 database = mkOption { description = "${name} database"; type = str; };
49 user = mkOption { description = "${name} user"; type = str; };
50 password = mkOption { description = "mysql password of the ${name} user"; type = str; };
51 } // more;
52 };
53 };
54 psqlOptions = {
55 host = mkOption { description = "Host to access Postgresql"; type = str; };
56 port = mkOption { description = "Port to access Postgresql"; type = str; };
57 socket = mkOption { description = "Socket to access Postgresql"; type = path; };
58 pam = mkOption {
59 description = "PAM configuration for psql";
60 type = submodule {
61 options = {
62 dn = mkOption { description = "DN to connect as to check users"; type = str; };
63 password = mkOption { description = "DN password to connect as to check users"; type = str; };
64 filter = mkOption { description = "filter to match users"; type = str; };
65 };
66 };
67 };
68 };
69 mkPsqlOptions = name: mkOption {
70 description = "${name} psql configuration";
71 type = submodule {
72 options = psqlOptions // {
73 database = mkOption { description = "${name} database"; type = str; };
74 schema = mkOption { description = "${name} schema"; type = nullOr str; default = null; };
75 user = mkOption { description = "${name} user"; type = str; };
76 password = mkOption { description = "psql password of the ${name} user"; type = str; };
77 };
78 };
79 };
80 redisOptions = {
81 host = mkOption { description = "Host to access Redis"; type = str; };
82 port = mkOption { description = "Port to access Redis"; type = str; };
83 socket = mkOption { description = "Socket to access Redis"; type = path; };
84 dbs = mkOption {
85 description = "Attrs of db number. Each number should be unique to avoid collision!";
86 type = attrsOf str;
87 };
88 spiped_key = mkOption {
89 type = str;
90 description = ''
91 Key to use with spiped to make a secure channel to replication
92 '';
93 };
94 predixy = mkOption {
95 description = "Predixy configuration. Unused yet";
96 type = submodule {
97 options = {
98 read = mkOption { type = str; description = "Read password"; };
99 };
100 };
101 };
102 };
103 mkRedisOptions = name: mkOption {
104 description = "${name} redis configuration";
105 type = submodule {
106 options = redisOptions // {
107 db = mkOption { description = "${name} database"; type = str; };
108 };
109 };
110 };
111 smtpOptions = {
112 host = mkOption { description = "Host to access SMTP"; type = str; };
113 port = mkOption { description = "Port to access SMTP"; type = str; };
114 };
115 mkSmtpOptions = name: mkOption {
116 description = "${name} smtp configuration";
117 type = submodule {
118 options = smtpOptions // {
119 email = mkOption { description = "${name} email"; type = str; };
120 password = mkOption { description = "SMTP password of the ${name} user"; type = str; };
121 };
122 };
123 };
124 hostEnv = submodule {
125 options = {
126 fqdn = mkOption {
127 description = "Host FQDN";
128 type = str;
129 };
130 users = mkOption {
131 type = unspecified;
132 default = pkgs: [];
133 description = ''
134 Sublist of users from realUsers. Function that takes pkgs as
135 argument and gives an array as a result
136 '';
137 };
138 emails = mkOption {
139 default = [];
140 description = "List of e-mails that the server can be a sender of";
141 type = listOf str;
142 };
143 ldap = mkOption {
144 description = ''
145 LDAP credentials for the host
146 '';
147 type = submodule {
148 options = {
149 password = mkOption { type = str; description = "Password for the LDAP connection"; };
150 dn = mkOption { type = str; description = "DN for the LDAP connection"; };
151 };
152 };
153 };
154 mx = mkOption {
155 description = "subdomain and priority for MX server";
156 default = { enable = false; };
157 type = submodule {
158 options = {
159 enable = mkEnableOption "Enable MX";
160 subdomain = mkOption { type = nullOr str; description = "Subdomain name (mx-*)"; };
161 priority = mkOption { type = nullOr str; description = "Priority"; };
162 };
163 };
164 };
165 ips = mkOption {
166 description = ''
167 attrs of ip4/ip6 grouped by section
168 '';
169 type = attrsOf (submodule {
170 options = {
171 ip4 = mkOption {
172 type = str;
173 description = ''
174 ip4 address of the host
175 '';
176 };
177 ip6 = mkOption {
178 type = listOf str;
179 default = [];
180 description = ''
181 ip6 addresses of the host
182 '';
183 };
184 };
185 });
186 };
187 };
188 };
189in
190{
191 options.myEnv = {
192 servers = mkOption {
193 description = ''
194 Attrs of servers information in the cluster (not necessarily handled by nixops)
195 '';
196 default = {};
197 type = attrsOf hostEnv;
198 };
199 hetznerCloud = mkOption {
200 description = ''
201 Hetzner Cloud credential information
202 '';
203 type = submodule {
204 options = {
205 authToken = mkOption {
206 type = str;
207 description = ''
208 The API auth token.
209 '';
210 };
211 };
212 };
213 };
214 hetzner = mkOption {
215 description = ''
216 Hetzner credential information
217 '';
218 type = submodule {
219 options = {
220 user = mkOption { type = str; description = "User"; };
221 pass = mkOption { type = str; description = "Password"; };
222 };
223 };
224 };
225 sshd = mkOption {
226 description = ''
227 sshd service credential information
228 '';
229 type = submodule {
230 options = {
231 rootKeys = mkOption { type = attrsOf str; description = "Keys of root users"; };
232 ldap = mkOption {
233 description = ''
234 LDAP credentials for cn=ssh,ou=services,dc=immae,dc=eu dn
235 '';
236 type = submodule {
237 options = {
238 password = mkOption { description = "Password"; type = str; };
239 };
240 };
241 };
242 };
243 };
244 };
245 ports = mkOption {
246 description = ''
247 non-standard reserved ports. Must be unique!
248 '';
249 type = attrsOf port;
250 default = {};
251 apply = let
252 noDupl = x: builtins.length (builtins.attrValues x) == builtins.length (unique (builtins.attrValues x));
253 in
254 x: if isAttrs x && noDupl x then x else throw "Non unique values for ports";
255 };
256 httpd = mkOption {
257 description = ''
258 httpd service credential information
259 '';
260 type = submodule {
261 options = {
262 ldap = mkOption {
263 description = ''
264 LDAP credentials for cn=httpd,ou=services,dc=immae,dc=eu dn
265 '';
266 type = submodule {
267 options = {
268 password = mkOption { description = "Password"; type = str; };
269 };
270 };
271 };
272 };
273 };
274 };
275 smtp = mkOption {
276 type = submodule { options = smtpOptions; };
277 description = "SMTP configuration";
278 };
279 ldap = mkOption {
280 description = ''
281 LDAP server configuration
282 '';
283 type = submodule {
284 options = ldapOptions;
285 };
286 };
287 databases = mkOption {
288 description = "Databases configuration";
289 type = submodule {
290 options = {
291 mysql = mkOption {
292 type = submodule { options = mysqlOptions; };
293 description = "Mysql configuration";
294 };
295 redis = mkOption {
296 type = submodule { options = redisOptions; };
297 description = "Redis configuration";
298 };
299 postgresql = mkOption {
300 type = submodule { options = psqlOptions; };
301 description = "Postgresql configuration";
302 };
303 };
304 };
305 };
306 jabber = mkOption {
307 description = "Jabber configuration";
308 type = submodule {
309 options = {
310 postfix_user_filter = mkOption { type = str; description = "Postfix filter to get xmpp users"; };
311 ldap = mkLdapOptions "Jabber" {};
312 postgresql = mkPsqlOptions "Jabber";
313 };
314 };
315 };
316 realUsers = mkOption {
317 description = ''
318 Attrset of function taking pkgs as argument.
319 Real users settings, should provide a subattr of users.users.<name>
320 with at least: name, (hashed)Password, shell
321 '';
322 type = attrsOf unspecified;
323 };
324 users = mkOption {
325 description = "System and regular users uid/gid";
326 type = attrsOf (submodule {
327 options = {
328 uid = mkOption {
329 description = "user uid";
330 type = int;
331 };
332 gid = mkOption {
333 description = "user gid";
334 type = int;
335 };
336 };
337 });
338 };
339 dns = mkOption {
340 description = "DNS configuration";
341 type = submodule {
342 options = {
343 soa = mkOption {
344 description = "SOA information";
345 type = submodule {
346 options = {
347 serial = mkOption {
348 description = "Serial number. Should be incremented at each change and unique";
349 type = str;
350 };
351 refresh = mkOption {
352 description = "Refresh time";
353 type = str;
354 };
355 retry = mkOption {
356 description = "Retry time";
357 type = str;
358 };
359 expire = mkOption {
360 description = "Expire time";
361 type = str;
362 };
363 ttl = mkOption {
364 description = "Default TTL time";
365 type = str;
366 };
367 email = mkOption {
368 description = "hostmaster e-mail";
369 type = str;
370 };
371 primary = mkOption {
372 description = "Primary NS";
373 type = str;
374 };
375 };
376 };
377 };
378 ns = mkOption {
379 description = "Attrs of NS servers group";
380 example = {
381 foo = {
382 "ns1.foo.com" = [ "198.51.100.10" "2001:db8:abcd::1" ];
383 "ns2.foo.com" = [ "198.51.100.15" "2001:db8:1234::1" ];
384 };
385 };
386 type = attrsOf (attrsOf (listOf str));
387 };
388 keys = mkOption {
389 default = {};
390 description = "DNS keys";
391 type = attrsOf (submodule {
392 options = {
393 algorithm = mkOption { type = str; description = "Algorithm"; };
394 secret = mkOption { type = str; description = "Secret"; };
395 };
396 });
397 };
398 slaveZones = mkOption {
399 description = "List of slave zones";
400 type = listOf (submodule {
401 options = {
402 name = mkOption { type = str; description = "zone name"; };
403 masters = mkOption {
404 description = "NS master groups of this zone";
405 type = listOf str;
406 };
407 keys = mkOption {
408 default = [];
409 description = "Keys associated to the server";
410 type = listOf str;
411 };
412 };
413 });
414 };
415 masterZones = mkOption {
416 description = "List of master zones";
417 type = listOf (submodule {
418 options = {
419 name = mkOption { type = str; description = "zone name"; };
420 withCAA = mkOption { type = nullOr str; description = "CAA entry"; default = null; };
421 slaves = mkOption {
422 description = "NS slave groups of this zone";
423 type = listOf str;
424 };
425 ns = mkOption {
426 description = "groups names that should have their NS entries listed here";
427 type = listOf str;
428 };
429 extra = mkOption {
430 description = "Extra zone configuration for bind";
431 example = ''
432 notify yes;
433 '';
434 type = lines;
435 };
436 entries = mkOption { type = lines; description = "Regular entries of the NS zone"; };
437 withEmail = mkOption {
438 description = "List of domains that should have mail entries (MX, dkim, SPF, ...)";
439 default = [];
440 type = listOf (submodule {
441 options = {
442 domain = mkOption { type = str; description = "Which subdomain is concerned"; };
443 send = mkOption { type = bool; description = "Whether there can be e-mails originating from the subdomain"; };
444 receive = mkOption { type = bool; description = "Whether there can be e-mails arriving to the subdomain"; };
445 };
446 });
447 };
448 };
449 });
450 };
451 };
452 };
453 };
454 backup = mkOption {
455 description = ''
456 Remote backup with duplicity
457 '';
458 type = submodule {
459 options = {
460 password = mkOption { type = str; description = "Password for encrypting files"; };
461 remotes = mkOption {
462 type = attrsOf (submodule {
463 options = {
464 remote = mkOption {
465 type = unspecified;
466 example = literalExample ''
467 bucket: "s3://some_host/${bucket}";
468 '';
469 description = ''
470 Function.
471 Takes a bucket name as argument and returns a url
472 '';
473 };
474 accessKeyId = mkOption { type = str; description = "Remote access-key"; };
475 secretAccessKey = mkOption { type = str; description = "Remote access secret"; };
476 };
477 });
478 };
479 };
480 };
481 };
482 zrepl_backup = mkOption {
483 type = submodule {
484 options = {
485 ssh_key = mkOption {
486 description = "SSH key information";
487 type = submodule {
488 options = {
489 public = mkOption { type = str; description = "Public part of the key"; };
490 private = mkOption { type = lines; description = "Private part of the key"; };
491 };
492 };
493 };
494 mysql = mkMysqlOptions "Zrepl" {};
495 };
496 };
497 };
498 rsync_backup = mkOption {
499 description =''
500 Rsync backup configuration from controlled host
501 '';
502 type = submodule {
503 options = {
504 ssh_key = mkOption {
505 description = "SSH key information";
506 type = submodule {
507 options = {
508 public = mkOption { type = str; description = "Public part of the key"; };
509 private = mkOption { type = lines; description = "Private part of the key"; };
510 };
511 };
512 };
513 profiles = mkOption {
514 description = "Attrs of profiles to backup";
515 type = attrsOf (submodule {
516 options = {
517 keep = mkOption { type = int; description = "Number of backups to keep"; };
518 check_command = mkOption { type = str; description = "command to check if backup needs to be done"; default = "backup"; };
519 login = mkOption { type = str; description = "Login to connect to host"; };
520 port = mkOption { type = str; default = "22"; description = "Port to connect to host"; };
521 host = mkOption { type = str; description = "Host to connect to"; };
522 host_key = mkOption { type = str; description = "Host key"; };
523 host_key_type = mkOption { type = str; description = "Host key type"; };
524 parts = mkOption {
525 description = "Parts to backup for this host";
526 type = attrsOf (submodule {
527 options = {
528 remote_folder = mkOption { type = path; description = "Remote folder to backup";};
529 exclude_from = mkOption {
530 type = listOf path;
531 default = [];
532 description = "List of folders/files to exclude from the backup";
533 };
534 files_from = mkOption {
535 type = listOf path;
536 default = [];
537 description = "List of folders/files to backup in the base folder";
538 };
539 args = mkOption {
540 type = nullOr str;
541 default = null;
542 description = "Extra arguments to pass to rsync";
543 };
544 };
545 });
546 };
547 };
548 });
549 };
550 };
551 };
552 };
553 monitoring = mkOption {
554 description = "Monitoring configuration";
555 type = submodule {
556 options = {
557 status_url = mkOption { type = str; description = "URL to push status to"; };
558 status_token = mkOption { type = str; description = "Token for the status url"; };
559 http_user_password = mkOption { type = str; description = "HTTP credentials to check services behind wall"; };
560 email = mkOption { type = str; description = "Admin E-mail"; };
561 ssh_public_key = mkOption { type = str; description = "SSH public key"; };
562 ssh_secret_key = mkOption { type = str; description = "SSH secret key"; };
563 imap_login = mkOption { type = str; description = "IMAP login"; };
564 imap_password = mkOption { type = str; description = "IMAP password"; };
565 eriomem_keys = mkOption { type = listOf (listOf str); description = "Eriomem keys"; default = []; };
566 ovh_sms = mkOption {
567 description = "OVH credentials for sms script";
568 type = submodule {
569 options = {
570 endpoint = mkOption { type = str; default = "ovh-eu"; description = "OVH endpoint"; };
571 application_key = mkOption { type = str; description = "Application key"; };
572 application_secret = mkOption { type = str; description = "Application secret"; };
573 consumer_key = mkOption { type = str; description = "Consumer key"; };
574 account = mkOption { type = str; description = "Account"; };
575 };
576 };
577 };
578 eban = mkOption {
579 description = "Eban credentials for webhook";
580 type = submodule {
581 options = {
582 user = mkOption { type = str; description = "User"; };
583 password = mkOption { type = str; description = "Password"; };
584 };
585 };
586 };
587 nrdp_tokens = mkOption { type = listOf str; description = "Tokens allowed to push status update"; };
588 slack_url = mkOption { type = str; description = "Slack webhook url to push status update"; };
589 slack_channel = mkOption { type = str; description = "Slack channel to push status update"; };
590 netdata_aggregator = mkOption { type = str; description = "Url where netdata information should be sent"; };
591 netdata_keys = mkOption { type = attrsOf str; description = "netdata host keys"; };
592 contacts = mkOption { type = attrsOf unspecified; description = "Contact dicts to fill naemon objects"; };
593 email_check = mkOption {
594 description = "Emails services to check";
595 type = attrsOf (submodule {
596 options = {
597 local = mkOption { type = bool; default = false; description = "Use local configuration"; };
598 port = mkOption { type = nullOr str; default = null; description = "Port to connect to ssh"; };
599 login = mkOption { type = nullOr str; default = null; description = "Login to connect to ssh"; };
600 targets = mkOption { type = listOf str; description = "Hosts to send E-mails to"; };
601 mail_address = mkOption { type = nullOr str; default = null; description = "E-mail recipient part to send e-mail to"; };
602 mail_domain = mkOption { type = nullOr str; default = null; description = "E-mail domain part to send e-mail to"; };
603 };
604 });
605 };
606 };
607 };
608 };
609 mpd = mkOption {
610 description = "MPD configuration";
611 type = submodule {
612 options = {
613 folder = mkOption { type = str; description = "Folder to serve from the MPD instance"; };
614 password = mkOption { type = str; description = "Password to connect to the MPD instance"; };
615 host = mkOption { type = str; description = "Host to connect to the MPD instance"; };
616 port = mkOption { type = str; description = "Port to connect to the MPD instance"; };
617 };
618 };
619 };
620 ftp = mkOption {
621 description = "FTP configuration";
622 type = submodule {
623 options = {
624 ldap = mkLdapOptions "FTP" {
625 proftpd_filter = mkOption { type = str; description = "Filter for proftpd listing in LDAP"; };
626 pure-ftpd_filter = mkOption { type = str; description = "Filter for pure-ftpd listing in LDAP"; };
627 };
628 };
629 };
630 };
631 vpn = mkOption {
632 description = "VPN configuration";
633 type = attrsOf (submodule {
634 options = {
635 prefix = mkOption { type = str; description = "ipv6 prefix for the vpn subnet"; };
636 privateKey = mkOption { type = str; description = "Private key for the host"; };
637 publicKey = mkOption { type = str; description = "Public key for the host"; };
638 };
639 });
640 };
641 mail = mkOption {
642 description = "Mail configuration";
643 type = submodule {
644 options = {
645 dmarc = mkOption {
646 description = "DMARC configuration";
647 type = submodule {
648 options = {
649 ignore_hosts = mkOption {
650 type = lines;
651 description = ''
652 Hosts to ignore when checking for dmarc
653 '';
654 };
655 };
656 };
657 };
658 dkim = mkOption {
659 description = "DKIM configuration";
660 type = attrsOf (submodule {
661 options = {
662 public = mkOption {
663 type = str;
664 example = ''
665 ( "v=DKIM1; k=rsa; "
666 "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3w1a2aMxWw9+hdcmbqX4UevcVqr204y0K73Wdc7MPZiOOlUJQYsMNSYR1Y/SC7jmPKeitpcJCpQgn/cveJZbuikjjPLsDReHyFEYmC278ZLRTELHx6f1IXM8WE08JIRT69CfZiMi1rVcOh9qRT4F93PyjCauU8Y5hJjtg9ThsWwIDAQAB" )
667 '';
668 description = "Public entry to put in DNS TXT field";
669 };
670 private = mkOption { type = str; description = "Private key"; };
671 };
672 });
673 };
674 postfix = mkOption {
675 description = "Postfix configuration";
676 type = submodule {
677 options = {
678 additional_mailbox_domains = mkOption {
679 description = ''
680 List of domains that are used as mailbox final destination, in addition to those defined in the DNS records
681 '';
682 type = listOf str;
683 };
684 mysql = mkMysqlOptions "Postfix" {
685 password_encrypt = mkOption { type = str; description = "Key to encrypt relay password in database"; };
686 };
687 backup_domains = mkOption {
688 description = ''
689 Domains that are accepted for relay as backup domain
690 '';
691 type = attrsOf (submodule {
692 options = {
693 domains = mkOption { type = listOf str; description = "Domains list"; };
694 relay_restrictions = mkOption {
695 type = lines;
696 description = ''
697 Restrictions for relaying the e-mails from the domains
698 '';
699 };
700 recipient_maps = mkOption {
701 description = ''
702 Recipient map to accept relay for.
703 Must be specified for domain, the rules apply to everyone!
704 '';
705 type = listOf (submodule {
706 options = {
707 type = mkOption {
708 type = enum [ "hash" ];
709 description = "Map type";
710 };
711 content = mkOption {
712 type = str;
713 description = "Map content";
714 };
715 };
716 });
717 };
718 };
719 });
720 };
721 };
722 };
723 };
724 dovecot = mkOption {
725 description = "Dovecot configuration";
726 type = submodule {
727 options = {
728 ldap = mkLdapOptions "Dovecot" {
729 pass_attrs = mkOption { type = str; description = "Password attribute in LDAP"; };
730 user_attrs = mkOption { type = str; description = "User attribute mapping in LDAP"; };
731 iterate_attrs = mkOption { type = str; description = "User attribute mapping for listing in LDAP"; };
732 iterate_filter = mkOption { type = str; description = "User attribute filter for listing in LDAP"; };
733 postfix_mailbox_filter = mkOption { type = str; description = "Postfix filter to get mailboxes"; };
734 };
735 };
736 };
737 };
738 rspamd = mkOption {
739 description = "rspamd configuration";
740 type = submodule {
741 options = {
742 redis = mkRedisOptions "Redis";
743 read_password_hashed = mkOption { type = str; description = "Hashed read password for rspamd"; };
744 write_password_hashed = mkOption { type = str; description = "Hashed write password for rspamd"; };
745 read_password = mkOption {
746 type = str;
747 description = "Read password for rspamd. Unused";
748 apply = x: "";
749 };
750 write_password = mkOption {
751 type = str;
752 description = "Write password for rspamd. Unused";
753 apply = x: "";
754 };
755 };
756 };
757 };
758 scripts = mkOption {
759 description = "Mail script recipients";
760 type = attrsOf (submodule {
761 options = {
762 external = mkEnableOption "Create a script_<name>@mail.immae.eu external address";
763 src = mkOption {
764 description = ''
765 git source to fetch the script from.
766 It must have a default.nix file as its root accepting a scriptEnv parameter
767 '';
768 type = submodule {
769 options = {
770 url = mkOption { type = str; description = "git url to fetch"; };
771 rev = mkOption { type = str; description = "git reference to fetch"; };
772 };
773 };
774 };
775 env = mkOption {
776 description = "Variables to pass to the script";
777 type = unspecified;
778 };
779 };
780 });
781 };
782 sympa = mkOption {
783 description = "Sympa configuration";
784 type = submodule {
785 options = {
786 listmasters = mkOption {
787 type = listOf str;
788 description = "Listmasters";
789 };
790 postgresql = mkPsqlOptions "Sympa";
791 data_sources = mkOption {
792 type = attrsOf str;
793 default = {};
794 description = "Data sources to make available to sympa";
795 };
796 scenari = mkOption {
797 type = attrsOf str;
798 default = {};
799 description = "Scenari to make available to sympa";
800 };
801 };
802 };
803 };
804 };
805 };
806 };
807 buildbot = mkOption {
808 description = "Buildbot configuration";
809 type = submodule {
810 options = {
811 ssh_key = mkOption {
812 description = "SSH key information";
813 type = submodule {
814 options = {
815 public = mkOption { type = str; description = "Public part of the key"; };
816 private = mkOption { type = lines; description = "Private part of the key"; };
817 };
818 };
819 };
820 workerPassword = mkOption { description = "Buildbot worker password"; type = str; };
821 user = mkOption {
822 description = "Buildbot user";
823 type = submodule {
824 options = {
825 uid = mkOption {
826 description = "user uid";
827 type = int;
828 };
829 gid = mkOption {
830 description = "user gid";
831 type = int;
832 };
833 };
834 };
835 };
836 ldap = mkOption {
837 description = "Ldap configuration for buildbot";
838 type = submodule {
839 options = {
840 password = mkOption { type = str; description = "Buildbot password"; };
841 };
842 };
843 };
844 projects = mkOption {
845 description = "Projects to make a buildbot for";
846 type = attrsOf (submodule {
847 options = {
848 name = mkOption { type = str; description = "Project name"; };
849 packages = mkOption {
850 type = unspecified;
851 example = literalExample ''
852 pkgs: [ pkgs.bash pkgs.git pkgs.gzip pkgs.openssh ];
853 '';
854 description = ''
855 Function.
856 Builds packages list to make available to buildbot project.
857 Takes pkgs as argument.
858 '';
859 };
860 pythonPackages = mkOption {
861 type = unspecified;
862 example = literalExample ''
863 p: pkgs: [ pkgs.python3Packages.pip ];
864 '';
865 description = ''
866 Function.
867 Builds python packages list to make available to buildbot project.
868 Takes buildbot python module as first argument and pkgs as second argument in order to augment the python modules list.
869 '';
870 };
871 pythonPathHome = mkOption { type = bool; description = "Whether to add project’s python home to python path"; };
872 workerPort = mkOption { type = port; description = "Port for the worker"; };
873 secrets = mkOption {
874 type = attrsOf str;
875 description = "Secrets for the project to dump as files";
876 };
877 environment = mkOption {
878 type = attrsOf str;
879 description = ''
880 Environment variables for the project.
881 BUILDBOT_ is prefixed to the variable names
882 '';
883 };
884 activationScript = mkOption {
885 type = lines;
886 description = ''
887 Activation script to run during deployment
888 '';
889 };
890 builderPaths = mkOption {
891 type = attrsOf unspecified;
892 default = {};
893 description = ''
894 Attrs of functions to make accessible specifically per builder.
895 Takes pkgs as argument and should return a single path containing binaries.
896 This path will be accessible as BUILDBOT_PATH_<attrskey>
897 '';
898 };
899 webhookTokens = mkOption {
900 type = nullOr (listOf str);
901 default = null;
902 description = ''
903 List of tokens allowed to push to project’s change_hook/base endpoint
904 '';
905 };
906 };
907 });
908 };
909 };
910 };
911 };
912 tools = mkOption {
913 description = "Tools configurations";
914 type = submodule {
915 options = {
916 contact = mkOption { type = str; description = "Contact e-mail address"; };
917 assets = mkOption {
918 default = {};
919 type = attrsOf (submodule {
920 options = {
921 url = mkOption { type = str; description = "URL to fetch"; };
922 sha256 = mkOption { type = str; description = "Hash of the url"; };
923 };
924 });
925 description = "Assets to provide on assets.immae.eu";
926 };
927 davical = mkOption {
928 description = "Davical configuration";
929 type = submodule {
930 options = {
931 postgresql = mkPsqlOptions "Davical";
932 ldap = mkLdapOptions "Davical" {};
933 };
934 };
935 };
936 diaspora = mkOption {
937 description = "Diaspora configuration";
938 type = submodule {
939 options = {
940 postgresql = mkPsqlOptions "Diaspora";
941 redis = mkRedisOptions "Diaspora";
942 ldap = mkLdapOptions "Diaspora" {};
943 secret_token = mkOption { type = str; description = "Secret token"; };
944 };
945 };
946 };
947 dmarc_reports = mkOption {
948 description = "DMARC reports configuration";
949 type = submodule {
950 options = {
951 mysql = mkMysqlOptions "DMARC" {};
952 anonymous_key = mkOption { type = str; description = "Anonymous hashing key"; };
953 };
954 };
955 };
956 etherpad-lite = mkOption {
957 description = "Etherpad configuration";
958 type = submodule {
959 options = {
960 postgresql = mkPsqlOptions "Etherpad";
961 ldap = mkLdapOptions "Etherpad" {
962 group_filter = mkOption { type = str; description = "Filter for groups"; };
963 };
964 adminPassword = mkOption { type = str; description = "Admin password for mypads / admin"; };
965 session_key = mkOption { type = str; description = "Session key"; };
966 api_key = mkOption { type = str; description = "API key"; };
967 redirects = mkOption { type = str; description = "Redirects for apache"; };
968 };
969 };
970 };
971 gitolite = mkOption {
972 description = "Gitolite configuration";
973 type = submodule {
974 options = {
975 ldap = mkLdapOptions "Gitolite" {};
976 ssh_key = mkOption {
977 description = "SSH key information";
978 type = submodule {
979 options = {
980 public = mkOption { type = str; description = "Public part of the key"; };
981 private = mkOption { type = lines; description = "Private part of the key"; };
982 };
983 };
984 };
985 };
986 };
987 };
988 kanboard = mkOption {
989 description = "Kanboard configuration";
990 type = submodule {
991 options = {
992 postgresql = mkPsqlOptions "Kanboard";
993 ldap = mkLdapOptions "Kanboard" {
994 admin_dn = mkOption { type = str; description = "Admin DN"; };
995 };
996 };
997 };
998 };
999 mantisbt = mkOption {
1000 description = "Mantisbt configuration";
1001 type = submodule {
1002 options = {
1003 postgresql = mkPsqlOptions "Mantisbt";
1004 ldap = mkLdapOptions "Mantisbt" {};
1005 master_salt = mkOption { type = str; description = "Master salt for password hash"; };
1006 };
1007 };
1008 };
1009 mastodon = mkOption {
1010 description = "Mastodon configuration";
1011 type = submodule {
1012 options = {
1013 postgresql = mkPsqlOptions "Mastodon";
1014 redis = mkRedisOptions "Mastodon";
1015 ldap = mkLdapOptions "Mastodon" {};
1016 paperclip_secret = mkOption { type = str; description = "Paperclip secret"; };
1017 otp_secret = mkOption { type = str; description = "OTP secret"; };
1018 secret_key_base = mkOption { type = str; description = "Secret key base"; };
1019 vapid = mkOption {
1020 description = "vapid key";
1021 type = submodule {
1022 options = {
1023 private = mkOption { type = str; description = "Private key"; };
1024 public = mkOption { type = str; description = "Public key"; };
1025 };
1026 };
1027 };
1028 };
1029 };
1030 };
1031 mediagoblin = mkOption {
1032 description = "Mediagoblin configuration";
1033 type = submodule {
1034 options = {
1035 postgresql = mkPsqlOptions "Mediagoblin";
1036 redis = mkRedisOptions "Mediagoblin";
1037 ldap = mkLdapOptions "Mediagoblin" {};
1038 };
1039 };
1040 };
1041 nextcloud = mkOption {
1042 description = "Nextcloud configuration";
1043 type = submodule {
1044 options = {
1045 postgresql = mkPsqlOptions "Peertube";
1046 redis = mkRedisOptions "Peertube";
1047 password_salt = mkOption { type = str; description = "Password salt"; };
1048 instance_id = mkOption { type = str; description = "Instance ID"; };
1049 secret = mkOption { type = str; description = "App secret"; };
1050 };
1051 };
1052 };
1053 peertube = mkOption {
1054 description = "Peertube configuration";
1055 type = submodule {
1056 options = {
1057 listenPort = mkOption { type = port; description = "Port to listen to"; };
1058 postgresql = mkPsqlOptions "Peertube";
1059 redis = mkRedisOptions "Peertube";
1060 ldap = mkLdapOptions "Peertube" {};
1061 };
1062 };
1063 };
1064 syden_peertube = mkOption {
1065 description = "Peertube Syden configuration";
1066 type = submodule {
1067 options = {
1068 listenPort = mkOption { type = port; description = "Port to listen to"; };
1069 postgresql = mkPsqlOptions "Peertube";
1070 redis = mkRedisOptions "Peertube";
1071 };
1072 };
1073 };
1074 phpldapadmin = mkOption {
1075 description = "phpLdapAdmin configuration";
1076 type = submodule {
1077 options = {
1078 ldap = mkLdapOptions "phpldapadmin" {};
1079 };
1080 };
1081 };
1082 rompr = mkOption {
1083 description = "Rompr configuration";
1084 type = submodule {
1085 options = {
1086 mpd = mkOption {
1087 description = "MPD configuration";
1088 type = submodule {
1089 options = {
1090 host = mkOption { type = str; description = "Host for MPD"; };
1091 port = mkOption { type = port; description = "Port to access MPD host"; };
1092 };
1093 };
1094 };
1095 };
1096 };
1097 };
1098 roundcubemail = mkOption {
1099 description = "Roundcubemail configuration";
1100 type = submodule {
1101 options = {
1102 postgresql = mkPsqlOptions "TT-RSS";
1103 secret = mkOption { type = str; description = "Secret"; };
1104 };
1105 };
1106 };
1107 shaarli = mkOption {
1108 description = "Shaarli configuration";
1109 type = submodule {
1110 options = {
1111 ldap = mkLdapOptions "Shaarli" {};
1112 };
1113 };
1114 };
1115 status_engine = mkOption {
1116 description = "Status Engine configuration";
1117 type = submodule {
1118 options = {
1119 mysql = mkMysqlOptions "StatusEngine" {};
1120 ldap = mkLdapOptions "StatusEngine" {};
1121 };
1122 };
1123 };
1124 task = mkOption {
1125 description = "Taskwarrior configuration";
1126 type = submodule {
1127 options = {
1128 ldap = mkLdapOptions "Taskwarrior" {};
1129 taskwarrior-web = mkOption {
1130 description = "taskwarrior-web profiles";
1131 type = attrsOf (submodule {
1132 options = {
1133 uid = mkOption {
1134 type = listOf str;
1135 description = "List of ldap uids having access to this profile";
1136 };
1137 org = mkOption { type = str; description = "Taskd organisation"; };
1138 key = mkOption { type = str; description = "Taskd key"; };
1139 date = mkOption { type = str; description = "Preferred date format"; };
1140 };
1141 });
1142 };
1143 };
1144 };
1145 };
1146 ttrss = mkOption {
1147 description = "TT-RSS configuration";
1148 type = submodule {
1149 options = {
1150 postgresql = mkPsqlOptions "TT-RSS";
1151 ldap = mkLdapOptions "TT-RSS" {};
1152 };
1153 };
1154 };
1155 wallabag = mkOption {
1156 description = "Wallabag configuration";
1157 type = submodule {
1158 options = {
1159 postgresql = mkPsqlOptions "Wallabag";
1160 ldap = mkLdapOptions "Wallabag" {
1161 admin_filter = mkOption { type = str; description = "Admin users filter"; };
1162 };
1163 redis = mkRedisOptions "Wallabag";
1164 secret = mkOption { type = str; description = "App secret"; };
1165 };
1166 };
1167 };
1168 webhooks = mkOption {
1169 type = attrsOf str;
1170 description = "Mapping 'name'.php => script for webhooks";
1171 };
1172 csp_reports = mkOption {
1173 description = "CSP report configuration";
1174 type = submodule {
1175 options = {
1176 report_uri = mkOption { type = str; description = "URI to report CSP violations to"; };
1177 policies = mkOption { type = attrsOf str; description = "CSP policies to apply"; };
1178 postgresql = mkPsqlOptions "CSP reports";
1179 };
1180 };
1181 };
1182 commento = mkOption {
1183 description = "Commento configuration";
1184 type = submodule {
1185 options = {
1186 listenPort = mkOption { type = port; description = "Port to listen to"; };
1187 postgresql = mkPsqlOptions "Commento";
1188 smtp = mkSmtpOptions "Commento";
1189 };
1190 };
1191 };
1192 cryptpad = mkOption {
1193 description = "Cryptpad configuration";
1194 type = attrsOf (submodule {
1195 options = {
1196 email = mkOption { type = str; description = "Admin e-mail"; };
1197 admins = mkOption { type = listOf str; description = "Instance admin public keys"; };
1198 port = mkOption { type = port; description = "Port to listen to"; };
1199 };
1200 });
1201 };
1202 ympd = mkOption {
1203 description = "Ympd configuration";
1204 type = submodule {
1205 options = {
1206 listenPort = mkOption { type = port; description = "Port to listen to"; };
1207 mpd = mkOption {
1208 description = "MPD configuration";
1209 type = submodule {
1210 options = {
1211 password = mkOption { type = str; description = "Password to access MPD host"; };
1212 host = mkOption { type = str; description = "Host for MPD"; };
1213 port = mkOption { type = port; description = "Port to access MPD host"; };
1214 };
1215 };
1216 };
1217 };
1218 };
1219 };
1220 umami = mkOption {
1221 description = "Umami configuration";
1222 type = submodule {
1223 options = {
1224 listenPort = mkOption { type = port; description = "Port to listen to"; };
1225 postgresql = mkPsqlOptions "Umami";
1226 hashSalt = mkOption { type = str; description = "Hash salt"; };
1227 };
1228 };
1229 };
1230 yourls = mkOption {
1231 description = "Yourls configuration";
1232 type = submodule {
1233 options = {
1234 mysql = mkMysqlOptions "Yourls" {};
1235 ldap = mkLdapOptions "Yourls" {};
1236 cookieKey = mkOption { type = str; description = "Cookie key"; };
1237 };
1238 };
1239 };
1240 };
1241 };
1242 };
1243 serverSpecific = mkOption { type = attrsOf unspecified; description = "Server specific configuration"; };
1244 websites = mkOption {
1245 description = "Websites configurations";
1246 type = submodule {
1247 options = {
1248 immae = mkOption {
1249 description = "Immae configuration by environment";
1250 type = submodule {
1251 options = {
1252 temp = mkOption {
1253 description = "Temp configuration";
1254 type = submodule {
1255 options = {
1256 ldap = mkLdapOptions "Immae temp" {
1257 filter = mkOption { type = str; description = "Filter for user access"; };
1258 };
1259 };
1260 };
1261 };
1262 };
1263 };
1264 };
1265 isabelle = mkOption {
1266 description = "Isabelle configurations by environment";
1267 type =
1268 let
1269 atenSubmodule = mkOption {
1270 description = "environment configuration";
1271 type = submodule {
1272 options = {
1273 environment = mkOption { type = str; description = "Symfony environment"; };
1274 secret = mkOption { type = str; description = "Symfony App secret"; };
1275 postgresql = mkPsqlOptions "Aten";
1276 };
1277 };
1278 };
1279 in
1280 submodule {
1281 options = {
1282 aten_production = atenSubmodule;
1283 aten_integration = atenSubmodule;
1284 iridologie = mkOption {
1285 description = "environment configuration";
1286 type = submodule {
1287 options = {
1288 environment = mkOption { type = str; description = "SPIP environment"; };
1289 mysql = mkMysqlOptions "Iridologie" {};
1290 ldap = mkLdapOptions "Iridologie" {};
1291 };
1292 };
1293 };
1294 };
1295 };
1296 };
1297 chloe = mkOption {
1298 description = "Chloe configurations by environment";
1299 type =
1300 let
1301 chloeSubmodule = mkOption {
1302 description = "environment configuration";
1303 type = submodule {
1304 options = {
1305 environment = mkOption { type = str; description = "SPIP environment"; };
1306 mysql = mkMysqlOptions "Chloe" {};
1307 ldap = mkLdapOptions "Chloe" {};
1308 };
1309 };
1310 };
1311 in
1312 submodule {
1313 options = {
1314 production = chloeSubmodule;
1315 integration = chloeSubmodule;
1316 };
1317 };
1318 };
1319 connexionswing = mkOption {
1320 description = "Connexionswing configurations by environment";
1321 type =
1322 let
1323 csSubmodule = mkOption {
1324 description = "environment configuration";
1325 type = submodule {
1326 options = {
1327 environment = mkOption { type = str; description = "Symfony environment"; };
1328 mysql = mkMysqlOptions "Connexionswing" {};
1329 secret = mkOption { type = str; description = "Symfony App secret"; };
1330 email = mkOption { type = str; description = "Symfony email notification"; };
1331 };
1332 };
1333 };
1334 in
1335 submodule {
1336 options = {
1337 production = csSubmodule;
1338 integration = csSubmodule;
1339 };
1340 };
1341 };
1342 jerome = mkOption {
1343 description = "Naturaloutil configuration";
1344 type = submodule {
1345 options = {
1346 mysql = mkMysqlOptions "Naturaloutil" {};
1347 server_admin = mkOption { type = str; description = "Server admin e-mail"; };
1348 };
1349 };
1350 };
1351 telio_tortay = mkOption {
1352 description = "Telio Tortay configuration";
1353 type = submodule {
1354 options = {
1355 server_admin = mkOption { type = str; description = "Server admin e-mail"; };
1356 };
1357 };
1358 };
1359 ludivine = mkOption {
1360 description = "Ludivinecassal configurations by environment";
1361 type =
1362 let
1363 lcSubmodule = mkOption {
1364 description = "environment configuration";
1365 type = submodule {
1366 options = {
1367 environment = mkOption { type = str; description = "Symfony environment"; };
1368 mysql = mkMysqlOptions "LudivineCassal" {};
1369 ldap = mkLdapOptions "LudivineCassal" {};
1370 secret = mkOption { type = str; description = "Symfony App secret"; };
1371 };
1372 };
1373 };
1374 in
1375 submodule {
1376 options = {
1377 production = lcSubmodule;
1378 integration = lcSubmodule;
1379 };
1380 };
1381 };
1382 emilia = mkOption {
1383 description = "Emilia configuration";
1384 type = submodule {
1385 options = {
1386 postgresql = mkPsqlOptions "Emilia";
1387 };
1388 };
1389 };
1390 florian = mkOption {
1391 description = "Florian configuration";
1392 type = submodule {
1393 options = {
1394 server_admin = mkOption { type = str; description = "Server admin e-mail"; };
1395 };
1396 };
1397 };
1398 nassime = mkOption {
1399 description = "Nassime configuration";
1400 type = submodule {
1401 options = {
1402 server_admin = mkOption { type = str; description = "Server admin e-mail"; };
1403 };
1404 };
1405 };
1406 piedsjaloux = mkOption {
1407 description = "Piedsjaloux configurations by environment";
1408 type =
1409 let
1410 pjSubmodule = mkOption {
1411 description = "environment configuration";
1412 type = submodule {
1413 options = {
1414 environment = mkOption { type = str; description = "Symfony environment"; };
1415 mysql = mkMysqlOptions "Piedsjaloux" {};
1416 secret = mkOption { type = str; description = "Symfony App secret"; };
1417 };
1418 };
1419 };
1420 in
1421 submodule {
1422 options = {
1423 production = pjSubmodule;
1424 integration = pjSubmodule;
1425 };
1426 };
1427 };
1428 richie = mkOption {
1429 description = "Europe Richie configurations by environment";
1430 type = submodule {
1431 options = {
1432 mysql = mkMysqlOptions "Richie" {};
1433 smtp_mailer = mkOption {
1434 description = "SMTP mailer configuration";
1435 type = submodule {
1436 options = {
1437 user = mkOption { type = str; description = "Username"; };
1438 password = mkOption { type = str; description = "Password"; };
1439 };
1440 };
1441 };
1442 };
1443 };
1444 };
1445 caldance = mkOption {
1446 description = "Caldance configurations by environment";
1447 type = submodule {
1448 options = {
1449 integration = mkOption {
1450 description = "environment configuration";
1451 type = submodule {
1452 options = {
1453 password = mkOption { type = str; description = "Password file content for basic auth"; };
1454 };
1455 };
1456 };
1457 };
1458 };
1459 };
1460 tellesflorian = mkOption {
1461 description = "Tellesflorian configurations by environment";
1462 type =
1463 let
1464 tfSubmodule = mkOption {
1465 description = "environment configuration";
1466 type = submodule {
1467 options = {
1468 environment = mkOption { type = str; description = "Symfony environment"; };
1469 mysql = mkMysqlOptions "Tellesflorian" {};
1470 secret = mkOption { type = str; description = "Symfony App secret"; };
1471 invite_passwords = mkOption { type = str; description = "Password basic auth"; };
1472 };
1473 };
1474 };
1475 in
1476 submodule {
1477 options = {
1478 integration = tfSubmodule;
1479 };
1480 };
1481 };
1482 };
1483 };
1484 };
1485 };
1486 options.hostEnv = mkOption {
1487 readOnly = true;
1488 type = hostEnv;
1489 default = config.myEnv.servers."${name}";
1490 description = "Host environment";
1491 };
1492}
diff --git a/modules/private/ftp.nix b/modules/private/ftp.nix
deleted file mode 100644
index cae25c1..0000000
--- a/modules/private/ftp.nix
+++ /dev/null
@@ -1,248 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 package = pkgs.pure-ftpd.override { ldapFtpId = "immaeFtp"; };
4 pure-ftpd-enabled = config.myServices.ftp.pure-ftpd.enable;
5 proftpd-enabled = config.myServices.ftp.proftpd.enable;
6in
7{
8 options = {
9 myServices.ftp.enable = lib.mkOption {
10 type = lib.types.bool;
11 default = false;
12 description = ''
13 Whether to enable ftp.
14 '';
15 };
16 myServices.ftp.pure-ftpd.enable = lib.mkOption {
17 type = lib.types.bool;
18 default = false;
19 description = ''
20 Whether to enable pure-ftpd.
21 '';
22 };
23 myServices.ftp.proftpd.enable = lib.mkOption {
24 type = lib.types.bool;
25 default = true;
26 description = ''
27 Whether to enable proftpd.
28 '';
29 };
30 };
31
32 config = lib.mkIf config.myServices.ftp.enable {
33 security.acme.certs."ftp" = config.myServices.certificates.certConfig // {
34 domain = "eldiron.immae.eu";
35 postRun = (lib.optionalString pure-ftpd-enabled ''
36 systemctl restart pure-ftpd.service
37 '') + (lib.optionalString proftpd-enabled ''
38 systemctl restart proftpd.service
39 '');
40 extraDomains = { "ftp.immae.eu" = null; };
41 };
42
43 networking = {
44 firewall = {
45 allowedTCPPorts = [ 21 115 ];
46 allowedTCPPortRanges = [ { from = 40000; to = 50000; } ];
47 };
48 };
49
50 users.users.ftp = {
51 uid = config.ids.uids.ftp; # 8
52 group = "ftp";
53 description = "Anonymous FTP user";
54 home = "/homeless-shelter";
55 extraGroups = [ "keys" ];
56 };
57
58 users.groups.ftp.gid = config.ids.gids.ftp;
59
60 system.activationScripts.ftp = ''
61 install -m 0755 -o ftp -g ftp -d /var/lib/ftp
62 '' + (lib.optionalString proftpd-enabled ''
63 install -m 0755 -o nobody -g nogroup -d /var/lib/proftpd/authorized_keys
64 '');
65
66 secrets.keys."pure-ftpd-ldap" = lib.mkIf pure-ftpd-enabled {
67 permissions = "0400";
68 user = "ftp";
69 group = "ftp";
70 text = ''
71 LDAPServer ${config.myEnv.ftp.ldap.host}
72 LDAPPort 389
73 LDAPUseTLS True
74 LDAPBaseDN ${config.myEnv.ftp.ldap.base}
75 LDAPBindDN ${config.myEnv.ftp.ldap.dn}
76 LDAPBindPW ${config.myEnv.ftp.ldap.password}
77 LDAPDefaultUID 500
78 LDAPForceDefaultUID False
79 LDAPDefaultGID 100
80 LDAPForceDefaultGID False
81 LDAPFilter ${config.myEnv.ftp.ldap.pure-ftpd_filter}
82
83 LDAPAuthMethod BIND
84
85 # Pas de possibilite de donner l'Uid/Gid !
86 # Compile dans pure-ftpd directement avec immaeFtpUid / immaeFtpGid
87 LDAPHomeDir immaeFtpDirectory
88 '';
89 };
90 secrets.keys."proftpd-ldap.conf" = lib.mkIf proftpd-enabled {
91 permissions = "0400";
92 user = "ftp";
93 group = "ftp";
94 text = ''
95 LDAPServer ldaps://${config.myEnv.ftp.ldap.host}:636/??sub
96 LDAPUseTLS on
97 LDAPAuthBinds on
98 LDAPBindDN "${config.myEnv.ftp.ldap.dn}" "${config.myEnv.ftp.ldap.password}"
99 LDAPSearchScope subtree
100 LDAPAuthBinds on
101 LDAPDefaultGID 100
102 LDAPDefaultUID 500
103 LDAPForceDefaultUID off
104 LDAPForceDefaultGID off
105 LDAPAttr gidNumber immaeFtpGid
106 LDAPAttr uidNumber immaeFtpUid
107 LDAPAttr homeDirectory immaeFtpDirectory
108 LDAPUsers "${config.myEnv.ftp.ldap.base}" "${config.myEnv.ftp.ldap.proftpd_filter}"
109 LDAPGroups "${config.myEnv.ftp.ldap.base}"
110 '';
111 };
112
113 services.filesWatcher.pure-ftpd = lib.mkIf pure-ftpd-enabled {
114 restart = true;
115 paths = [ config.secrets.fullPaths."pure-ftpd-ldap" ];
116 };
117 services.filesWatcher.proftpd = lib.mkIf proftpd-enabled {
118 restart = true;
119 paths = [ config.secrets.fullPaths."proftpd-ldap.conf" ];
120 };
121
122 systemd.services.pure-ftpd = let
123 configFile = pkgs.writeText "pure-ftpd.conf" ''
124 PassivePortRange 40000 50000
125 Bind 42
126 ChrootEveryone yes
127 CreateHomeDir yes
128 BrokenClientsCompatibility yes
129 MaxClientsNumber 50
130 Daemonize yes
131 MaxClientsPerIP 8
132 VerboseLog no
133 DisplayDotFiles yes
134 AnonymousOnly no
135 NoAnonymous no
136 SyslogFacility ftp
137 DontResolve yes
138 MaxIdleTime 15
139 LDAPConfigFile ${config.secrets.fullPaths."pure-ftpd-ldap"}
140 LimitRecursion 10000 8
141 AnonymousCanCreateDirs no
142 MaxLoad 4
143 AntiWarez yes
144 Umask 133:022
145 # ftp
146 MinUID 8
147 AllowUserFXP no
148 AllowAnonymousFXP no
149 ProhibitDotFilesWrite no
150 ProhibitDotFilesRead no
151 AutoRename no
152 AnonymousCantUpload no
153 MaxDiskUsage 99
154 CustomerProof yes
155 TLS 1
156 CertFile ${config.security.acme.certs.ftp.directory}/full.pem
157 '';
158 in lib.mkIf pure-ftpd-enabled {
159 description = "Pure-FTPd server";
160 wantedBy = [ "multi-user.target" ];
161 after = [ "network.target" ];
162
163 serviceConfig.ExecStart = "${package}/bin/pure-ftpd ${configFile}";
164 serviceConfig.Type = "forking";
165 serviceConfig.PIDFile = "/run/pure-ftpd.pid";
166 };
167
168 systemd.services.proftpd = let
169 configFile = pkgs.writeText "proftpd.conf" ''
170 ServerName "ProFTPD"
171 ServerType standalone
172 DefaultServer on
173
174 Port 21
175 UseIPv6 on
176 Umask 022
177 MaxInstances 30
178 MaxClients 50
179 MaxClientsPerHost 8
180
181 # Set the user and group under which the server will run.
182 User ftp
183 Group ftp
184
185 CreateHome on
186 DefaultRoot ~
187
188 AllowOverwrite on
189
190 TLSEngine on
191 TLSRequired off
192 TLSProtocol TLSv1.1 TLSv1.2 TLSv1.3
193
194 TLSCertificateChainFile ${config.security.acme.certs.ftp.directory}/fullchain.pem
195 TLSECCertificateFile ${config.security.acme.certs.ftp.directory}/cert.pem
196 TLSECCertificateKeyFile ${config.security.acme.certs.ftp.directory}/key.pem
197 TLSRenegotiate none
198 PidFile /run/proftpd/proftpd.pid
199
200 ScoreboardFile /run/proftpd/proftpd.scoreboard
201
202 PassivePorts 40000 50000
203 #DebugLevel 10
204 Include ${config.secrets.fullPaths."proftpd-ldap.conf"}
205
206 RequireValidShell off
207
208 # Bar use of SITE CHMOD by default
209 <Limit SITE_CHMOD>
210 DenyAll
211 </Limit>
212
213 <VirtualHost 0.0.0.0>
214 Umask 022
215 Port 115
216 SFTPEngine on
217 CreateHome on
218 DefaultRoot ~
219
220 AllowOverwrite on
221
222 SFTPHostKey /etc/ssh/ssh_host_ed25519_key
223 SFTPHostKey /etc/ssh/ssh_host_rsa_key
224 Include ${config.secrets.fullPaths."proftpd-ldap.conf"}
225 RequireValidShell off
226 SFTPAuthorizedUserKeys file:/var/lib/proftpd/authorized_keys/%u
227 SFTPAuthMethods password publickey
228
229 SFTPOptions IgnoreSFTPSetOwners
230 </VirtualHost>
231 '';
232 in lib.mkIf proftpd-enabled {
233 description = "ProFTPD server";
234 wantedBy = [ "multi-user.target" ];
235 after = [ "network.target" ];
236
237 serviceConfig.ExecStart = "${pkgs.proftpd}/bin/proftpd -c ${configFile}";
238 serviceConfig.Type = "forking";
239 serviceConfig.PIDFile = "/run/proftpd/proftpd.pid";
240 serviceConfig.RuntimeDirectory = "proftpd";
241 };
242
243 services.cron.systemCronJobs = lib.mkIf proftpd-enabled [
244 "*/2 * * * * nobody ${./ftp_sync.sh}"
245 ];
246 };
247
248}
diff --git a/modules/private/ftp_sync.sh b/modules/private/ftp_sync.sh
deleted file mode 100755
index 8b0d9c5..0000000
--- a/modules/private/ftp_sync.sh
+++ /dev/null
@@ -1,47 +0,0 @@
1#!/usr/bin/env bash
2
3LDAPSEARCH=ldapsearch
4
5LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu"
6LDAP_PASS=$(cat /etc/ssh/ldap_password)
7LDAP_HOST="ldap.immae.eu"
8LDAP_BASE="dc=immae,dc=eu"
9LDAP_FILTER="(memberOf=cn=users,cn=ftp,ou=services,dc=immae,dc=eu)"
10
11handle_keys() {
12 uids="$1"
13 keys="$2"
14 if [ -n "$uids" ]; then
15 for uid in $uids; do
16 echo "$keys" | while read key; do
17 if [ -n "$key" ]; then
18 ssh-keygen -e -f <(echo "$key")
19 fi
20 done > /var/lib/proftpd/authorized_keys/$uid
21 done
22 fi
23}
24
25mkdir -p /var/lib/proftpd/authorized_keys
26
27while read i; do
28 if [[ "$i" =~ ^dn: ]]; then
29 handle_keys "$uids" "$keys"
30 uids=""
31 keys=""
32 fi;
33 if [[ "$i" =~ ^uid: ]]; then
34 uids="$uids ${i#uid: }"
35 fi
36 if [[ "$i" =~ ^immaeSshKey: ]]; then
37 key="${i#immaeSshKey: }"
38 if [[ "$key" =~ ^ssh- ]]; then
39 keys="$keys
40$key"
41 elif echo "$key" | cut -d" " -f1 | grep -q "\bftp\b"; then
42 keys="$keys
43$(echo "$key" | cut -d" " -f2-)"
44 fi
45 fi
46done < <(ldapsearch -h "$LDAP_HOST" -ZZ -LLL -D "$LDAP_BIND" -w "$LDAP_PASS" -b "$LDAP_BASE" -x -o ldif-wrap=no "$LDAP_FILTER" uid immaeSshKey)
47handle_keys "$uids" "$keys"
diff --git a/modules/private/gemini/default.nix b/modules/private/gemini/default.nix
deleted file mode 100644
index ffe8a12..0000000
--- a/modules/private/gemini/default.nix
+++ /dev/null
@@ -1,26 +0,0 @@
1{ lib, config, pkgs, ... }:
2let
3 configFile = pkgs.writeText "config.yaml" ''
4 listen: ":1965"
5 hosts:
6 immae.eu:
7 cert: /var/lib/acme/immae/full.pem
8 key: /var/lib/acme/immae/key.pem
9 paths:
10 - path: /
11 root: ${./public}
12 '';
13in
14{
15 options.myServices.gemini.enable = lib.mkEnableOption "enable Gemini capsule";
16 config = lib.mkIf config.myServices.gemini.enable {
17 networking.firewall.allowedTCPPorts = [ 1965 ];
18 systemd.services.gemini = {
19 description = "Gemini capsule server";
20 wantedBy = [ "multi-user.target" ];
21 after = [ "network.target" ];
22 serviceConfig.ExecStart = "${pkgs.twins}/bin/twins -config ${configFile}";
23 serviceConfig.Type = "simple";
24 };
25 };
26}
diff --git a/modules/private/gitolite/default.nix b/modules/private/gitolite/default.nix
deleted file mode 100644
index 6a74734..0000000
--- a/modules/private/gitolite/default.nix
+++ /dev/null
@@ -1,77 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.gitolite;
4in {
5 options.myServices.gitolite = {
6 enable = lib.mkEnableOption "my gitolite service";
7 gitoliteDir = lib.mkOption {
8 type = lib.types.str;
9 default = "/var/lib/gitolite";
10 };
11 };
12
13 config = lib.mkIf cfg.enable {
14 myServices.ssh.modules = [{
15 snippet = builtins.readFile ./ldap_gitolite.sh;
16 dependencies = [ pkgs.gitolite ];
17 }];
18 networking.firewall.allowedTCPPorts = [ 9418 ];
19
20 secrets.keys."gitolite/ldap_password" = {
21 user = "gitolite";
22 group = "gitolite";
23 permissions = "0400";
24 text = config.myEnv.tools.gitolite.ldap.password;
25 };
26
27 services.gitDaemon = {
28 enable = true;
29 user = "gitolite";
30 group = "gitolite";
31 basePath = "${cfg.gitoliteDir}/repositories";
32 };
33
34 system.activationScripts.gitolite = let
35 deps = [ pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.coreutils ];
36 gitolite_ldap_groups = pkgs.runCommand "gitolite_ldap_groups.sh" {
37 buildInputs = [ pkgs.makeWrapper ];
38 } ''
39 makeWrapper "${./gitolite_ldap_groups.sh}" "$out" \
40 --prefix PATH : ${lib.makeBinPath deps} \
41 --set LDAP_PASS_PATH ${config.secrets.fullPaths."gitolite/ldap_password"}
42 '';
43 in {
44 deps = [ "users" ];
45 text = ''
46 if [ -d ${cfg.gitoliteDir} ]; then
47 ln -sf ${gitolite_ldap_groups} ${cfg.gitoliteDir}/gitolite_ldap_groups.sh
48 chmod g+rx ${cfg.gitoliteDir}
49 fi
50 if [ -f ${cfg.gitoliteDir}/projects.list ]; then
51 chmod g+r ${cfg.gitoliteDir}/projects.list
52 fi
53 '';
54 };
55
56 users.users.wwwrun.extraGroups = [ "gitolite" ];
57 users.users.gitolite.extraGroups = [ "keys" ];
58
59 users.users.gitolite.packages = let
60 python-packages = python-packages: with python-packages; [
61 simplejson
62 urllib3
63 sleekxmpp
64 ];
65 in
66 [
67 (pkgs.python3.withPackages python-packages)
68 pkgs.nettools
69 pkgs.findutils
70 ];
71 # Installation: https://git.immae.eu/mantisbt/view.php?id=93
72 services.gitolite = {
73 enable = true;
74 adminPubkey = config.myEnv.sshd.rootKeys.immae_dilion;
75 };
76 };
77}
diff --git a/modules/private/gitolite/gitolite_ldap_groups.sh b/modules/private/gitolite/gitolite_ldap_groups.sh
deleted file mode 100755
index 3d7117e..0000000
--- a/modules/private/gitolite/gitolite_ldap_groups.sh
+++ /dev/null
@@ -1,15 +0,0 @@
1#!/usr/bin/env bash
2
3uid_param="$1"
4ldap_host="ldap.immae.eu"
5ldap_binddn="cn=gitolite,ou=services,dc=immae,dc=eu"
6ldap_bindpw="$(cat $LDAP_PASS_PATH)"
7ldap_searchbase="dc=immae,dc=eu"
8ldap_scope="subtree"
9
10ldap_options="-h ${ldap_host} -ZZ -x -D ${ldap_binddn} -w ${ldap_bindpw} -b ${ldap_searchbase} -s ${ldap_scope}"
11
12ldap_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)))"
13ldap_result=$(ldapsearch ${ldap_options} -LLL "${ldap_filter}" cn | grep 'cn:' | cut -d' ' -f2)
14
15echo "$ldap_result"
diff --git a/modules/private/gitolite/ldap_gitolite.sh b/modules/private/gitolite/ldap_gitolite.sh
deleted file mode 100644
index 23cb2bf..0000000
--- a/modules/private/gitolite/ldap_gitolite.sh
+++ /dev/null
@@ -1,33 +0,0 @@
1### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh
2LDAP_GITOLITE_MEMBER="cn=users,cn=gitolite,ou=services,dc=immae,dc=eu"
3GITOLITE_SHELL=$(which gitolite-shell)
4
5if [[ $user == gitolite ]]; then
6 ldap_search '(&(memberOf='$LDAP_GITOLITE_MEMBER')('$KEY'=*))' $KEY | \
7 while read line ;
8 do
9 if [ ! -z "$line" ]; then
10 if [[ $line == dn* ]]; then
11 user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line")
12 if [ -n "$user" ]; then
13 if [[ $user == "immae" ]] || [[ $user == "denise" ]]; then
14 # Capitalize first letter (backward compatibility)
15 user=$(sed -r 's/^([a-z])/\U\1/' <<< "$user")
16 fi
17 else
18 # Service fake user
19 user=$(sed -n 's/.*cn=\([^,]*\).*/\1/p' <<< "$line")
20 fi
21 elif [[ $line == $KEY* ]]; then
22 key=$(clean_key_line git "$line")
23 if [ ! -z "$key" ]; then
24 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
25 echo -n 'command="'$GITOLITE_SHELL' '$user'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty '
26 echo $key
27 fi
28 fi
29 fi
30 fi
31 done
32 exit 0
33fi
diff --git a/modules/private/irc.nix b/modules/private/irc.nix
deleted file mode 100644
index bc0bfb4..0000000
--- a/modules/private/irc.nix
+++ /dev/null
@@ -1,54 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.irc;
4in
5{
6 options.myServices = {
7 ircCerts = lib.mkOption {
8 description = "Default ircconfigurations for certificates as accepted by acme";
9 };
10 irc.enable = lib.mkOption {
11 type = lib.types.bool;
12 default = false;
13 description = ''
14 Whether to enable irc stuff.
15 '';
16 };
17 };
18
19 config = lib.mkIf cfg.enable {
20 security.acme.certs."irc" = config.myServices.ircCerts // {
21 domain = "irc.immae.eu";
22 postRun = ''
23 systemctl restart stunnel.service
24 '';
25 };
26
27 networking.firewall.allowedTCPPorts = [ 6697 ];
28 services.bitlbee = with pkgs; {
29 enable = true;
30 authMode = "Registered";
31 libpurple_plugins = [
32 purple-hangouts
33 purple-matrix
34 ];
35 plugins = [
36 bitlbee-mastodon
37 bitlbee-facebook
38 bitlbee-discord
39 bitlbee-steam
40 ];
41 };
42
43 services.stunnel = {
44 enable = true;
45 servers = {
46 bitlbee = {
47 accept = 6697;
48 connect = 6667;
49 cert = "${config.security.acme.certs.irc.directory}/full.pem";
50 };
51 };
52 };
53 };
54}
diff --git a/modules/private/loginctl-linger.nix b/modules/private/loginctl-linger.nix
deleted file mode 100644
index e6b9f23..0000000
--- a/modules/private/loginctl-linger.nix
+++ /dev/null
@@ -1,47 +0,0 @@
1{ config, lib, pkgs, ... }:
2
3# https://github.com/michalrus/dotfiles/commit/ebd5fa9583f82589f23531647aa677feb3f8d344#diff-4d353005ef5b3e37f33c07332b8523edR1
4# A temporary hack to `loginctl enable-linger $somebody` (for
5# multiplexer sessions to last), until this one is unresolved:
6# https://github.com/NixOS/nixpkgs/issues/3702
7#
8# Usage: `users.extraUsers.somebody.linger = true` or slt.
9
10with lib;
11
12let
13
14 dataDir = "/var/lib/systemd/linger";
15
16 lingeringUsers = map (u: u.name) (attrValues (flip filterAttrs config.users.users (n: u: u.linger)));
17
18 lingeringUsersFile = builtins.toFile "lingering-users"
19 (concatStrings (map (s: "${s}\n")
20 (sort (a: b: a < b) lingeringUsers))); # this sorting is important for `comm` to work correctly
21
22 updateLingering = pkgs.writeScript "update-lingering" ''
23 if [ ! -e ${dataDir} ]; then
24 install -m 0755 -o root -g root -d ${dataDir}
25 fi
26 if [ -e ${dataDir} ] ; then
27 ls ${dataDir} | sort | comm -3 -1 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl disable-linger
28 ls ${dataDir} | sort | comm -3 -2 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl enable-linger
29 fi
30 '';
31
32in
33
34{
35 options = {
36 users.users = mkOption {
37 options = [{
38 linger = mkEnableOption "lingering for the user";
39 }];
40 };
41 };
42
43 config = {
44 system.activationScripts.update-lingering =
45 stringAfter [ "users" ] updateLingering;
46 };
47}
diff --git a/modules/private/mail/default.nix b/modules/private/mail/default.nix
deleted file mode 100644
index 2d405c6..0000000
--- a/modules/private/mail/default.nix
+++ /dev/null
@@ -1,42 +0,0 @@
1{ lib, pkgs, config, ... }:
2{
3 imports = [
4 ./milters.nix
5 ./postfix.nix
6 ./dovecot.nix
7 ./relay.nix
8 ./rspamd.nix
9 ./opensmtpd.nix
10 ./sympa.nix
11 ];
12 options.myServices.mail.enable = lib.mkEnableOption "enable Mail services";
13 options.myServices.mailRelay.enable = lib.mkEnableOption "enable Mail relay services";
14 options.myServices.mailBackup.enable = lib.mkEnableOption "enable MX backup services";
15
16 config = lib.mkIf config.myServices.mail.enable {
17 security.acme.certs."mail" = config.myServices.certificates.certConfig // {
18 domain = config.hostEnv.fqdn;
19 extraDomains = let
20 zonesWithMx = builtins.filter (zone:
21 lib.attrsets.hasAttr "withEmail" zone && lib.lists.length zone.withEmail > 0
22 ) config.myEnv.dns.masterZones;
23 mxs = map (zone: "${config.hostEnv.mx.subdomain}.${zone.name}") zonesWithMx;
24 in builtins.listToAttrs (map (mx: lib.attrsets.nameValuePair mx null) mxs);
25 };
26 # This is for clients that don’t support elliptic curves (e.g.
27 # printer)
28 security.acme.certs."mail-rsa" = config.myServices.certificates.certConfig // {
29 domain = config.hostEnv.fqdn;
30 keyType = "rsa4096";
31 extraDomains = let
32 zonesWithMx = builtins.filter (zone:
33 lib.attrsets.hasAttr "withEmail" zone && lib.lists.length zone.withEmail > 0
34 ) config.myEnv.dns.masterZones;
35 mxs = map (zone: "${config.hostEnv.mx.subdomain}.${zone.name}") zonesWithMx;
36 in builtins.listToAttrs (map (mx: lib.attrsets.nameValuePair mx null) mxs);
37 };
38 systemd.slices.mail = {
39 description = "Mail slice";
40 };
41 };
42}
diff --git a/modules/private/mail/dovecot.nix b/modules/private/mail/dovecot.nix
deleted file mode 100644
index b6fdc02..0000000
--- a/modules/private/mail/dovecot.nix
+++ /dev/null
@@ -1,292 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 sieve_bin = pkgs.runCommand "sieve_bin" {
4 buildInputs = [ pkgs.makeWrapper ];
5 } ''
6 cp -a ${./sieve_bin} $out
7 chmod -R u+w $out
8 patchShebangs $out
9 for i in $out/*; do
10 wrapProgram "$i" --prefix PATH : ${lib.makeBinPath [ pkgs.coreutils ]}
11 done
12 '';
13in
14{
15 config = lib.mkIf config.myServices.mail.enable {
16 systemd.services.dovecot2.serviceConfig.Slice = "mail.slice";
17 secrets.keys."dovecot/ldap" = {
18 user = config.services.dovecot2.user;
19 group = config.services.dovecot2.group;
20 permissions = "0400";
21 text = ''
22 hosts = ${config.myEnv.mail.dovecot.ldap.host}
23 tls = yes
24
25 dn = ${config.myEnv.mail.dovecot.ldap.dn}
26 dnpass = ${config.myEnv.mail.dovecot.ldap.password}
27
28 auth_bind = yes
29
30 ldap_version = 3
31
32 base = ${config.myEnv.mail.dovecot.ldap.base}
33 scope = subtree
34
35 pass_filter = ${config.myEnv.mail.dovecot.ldap.filter}
36 pass_attrs = ${config.myEnv.mail.dovecot.ldap.pass_attrs}
37
38 user_attrs = ${config.myEnv.mail.dovecot.ldap.user_attrs}
39 user_filter = ${config.myEnv.mail.dovecot.ldap.filter}
40 iterate_attrs = ${config.myEnv.mail.dovecot.ldap.iterate_attrs}
41 iterate_filter = ${config.myEnv.mail.dovecot.ldap.iterate_filter}
42 '';
43 };
44
45 users.users.vhost = {
46 group = "vhost";
47 uid = config.ids.uids.vhost;
48 };
49 users.groups.vhost.gid = config.ids.gids.vhost;
50
51 # https://blog.zeninc.net/index.php?post/2018/04/01/Un-annuaire-pour-les-gouverner-tous.......
52 services.dovecot2 = {
53 enable = true;
54 enablePAM = false;
55 enablePop3 = true;
56 enableImap = true;
57 enableLmtp = true;
58 protocols = [ "sieve" ];
59 modules = [
60 pkgs.dovecot_pigeonhole
61 pkgs.dovecot_fts-xapian
62 ];
63 mailUser = "vhost";
64 mailGroup = "vhost";
65 createMailUser = false;
66 mailboxes = {
67 Trash = { auto = "subscribe"; specialUse = "Trash"; };
68 Junk = { auto = "subscribe"; specialUse = "Junk"; };
69 Sent = { auto = "subscribe"; specialUse = "Sent"; };
70 Drafts = { auto = "subscribe"; specialUse = "Drafts"; };
71 };
72 mailLocation = "mbox:~/Mail:INBOX=~/Mail/Inbox:INDEX=~/.imap";
73 sslServerCert = "/var/lib/acme/mail/fullchain.pem";
74 sslServerKey = "/var/lib/acme/mail/key.pem";
75 sslCACert = "/var/lib/acme/mail/fullchain.pem";
76 extraConfig = builtins.concatStringsSep "\n" [
77 # For printer which doesn’t support elliptic curve
78 ''
79 ssl_alt_cert = </var/lib/acme/mail-rsa/fullchain.pem
80 ssl_alt_key = </var/lib/acme/mail-rsa/key.pem
81 ''
82
83 ''
84 postmaster_address = postmaster@immae.eu
85 mail_attribute_dict = file:%h/dovecot-attributes
86 imap_idle_notify_interval = 20 mins
87 namespace inbox {
88 type = private
89 separator = /
90 inbox = yes
91 list = yes
92 }
93 ''
94
95 # ACL
96 ''
97 mail_plugins = $mail_plugins acl
98 plugin {
99 acl = vfile:${pkgs.writeText "dovecot-acl" ''
100 Backup/* owner lrp
101 ''}
102 acl_globals_only = yes
103 }
104 ''
105
106 # Full text search
107 ''
108 # needs to be bigger than any mailbox size
109 default_vsz_limit = 2GB
110 mail_plugins = $mail_plugins fts fts_xapian
111 plugin {
112 plugin = fts fts_xapian
113 fts = xapian
114 fts_xapian = partial=2 full=20
115 fts_autoindex = yes
116 fts_autoindex_exclude = \Junk
117 fts_autoindex_exclude2 = \Trash
118 fts_autoindex_exclude3 = Virtual/*
119 }
120 ''
121
122 # Antispam
123 # https://docs.iredmail.org/dovecot.imapsieve.html
124 ''
125 # imap_sieve plugin added below
126
127 plugin {
128 sieve_plugins = sieve_imapsieve sieve_extprograms
129 imapsieve_url = sieve://127.0.0.1:4190
130
131 sieve_before = file:${./sieve_scripts}/backup.sieve;bindir=/var/lib/vhost/.sieve_bin
132
133 # From elsewhere to Junk folder
134 imapsieve_mailbox1_name = Junk
135 imapsieve_mailbox1_causes = COPY APPEND
136 imapsieve_mailbox1_before = file:${./sieve_scripts}/report_spam.sieve;bindir=/var/lib/vhost/.imapsieve_bin
137
138 # From Junk folder to elsewhere
139 imapsieve_mailbox2_name = *
140 imapsieve_mailbox2_from = Junk
141 imapsieve_mailbox2_causes = COPY
142 imapsieve_mailbox2_before = file:${./sieve_scripts}/report_ham.sieve;bindir=/var/lib/vhost/.imapsieve_bin
143
144 # From anywhere to NoJunk folder
145 imapsieve_mailbox3_name = NoJunk
146 imapsieve_mailbox3_causes = COPY APPEND
147 imapsieve_mailbox3_before = file:${./sieve_scripts}/report_ham.sieve;bindir=/var/lib/vhost/.imapsieve_bin
148
149 sieve_pipe_bin_dir = ${sieve_bin}
150
151 sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
152 }
153 ''
154 # Services to listen
155 ''
156 service imap-login {
157 inet_listener imap {
158 }
159 inet_listener imaps {
160 }
161 }
162 service pop3-login {
163 inet_listener pop3 {
164 }
165 inet_listener pop3s {
166 }
167 }
168 service imap {
169 }
170 service pop3 {
171 }
172 service auth {
173 unix_listener auth-userdb {
174 }
175 unix_listener ${config.services.postfix.config.queue_directory}/private/auth {
176 mode = 0666
177 }
178 }
179 service auth-worker {
180 }
181 service dict {
182 unix_listener dict {
183 }
184 }
185 service stats {
186 unix_listener stats-reader {
187 user = vhost
188 group = vhost
189 mode = 0660
190 }
191 unix_listener stats-writer {
192 user = vhost
193 group = vhost
194 mode = 0660
195 }
196 }
197 ''
198
199 # Authentification
200 ''
201 first_valid_uid = ${toString config.ids.uids.vhost}
202 disable_plaintext_auth = yes
203 passdb {
204 driver = ldap
205 args = ${config.secrets.fullPaths."dovecot/ldap"}
206 }
207 userdb {
208 driver = ldap
209 args = ${config.secrets.fullPaths."dovecot/ldap"}
210 }
211 ''
212
213 # Zlib
214 ''
215 mail_plugins = $mail_plugins zlib
216 plugin {
217 zlib_save_level = 6
218 zlib_save = gz
219 }
220 ''
221
222 # Sieve
223 ''
224 plugin {
225 sieve = file:~/sieve;bindir=~/.sieve-bin;active=~/.dovecot.sieve
226 }
227 service managesieve-login {
228 }
229 service managesieve {
230 }
231 ''
232
233 # Virtual mailboxes
234 ''
235 mail_plugins = $mail_plugins virtual
236 namespace Virtual {
237 prefix = Virtual/
238 location = virtual:~/Virtual
239 }
240 ''
241
242 # Protocol specific configuration
243 # Needs to come last if there are mail_plugins entries
244 ''
245 protocol imap {
246 mail_plugins = $mail_plugins imap_sieve imap_acl
247 }
248 protocol lda {
249 mail_plugins = $mail_plugins sieve
250 }
251 ''
252 ];
253 };
254 networking.firewall.allowedTCPPorts = [ 110 143 993 995 4190 ];
255 system.activationScripts.dovecot = {
256 deps = [ "users" ];
257 text =''
258 install -m 0755 -o vhost -g vhost -d /var/lib/vhost
259 '';
260 };
261
262 services.cron.systemCronJobs = let
263 cron_script = pkgs.writeScriptBin "cleanup-imap-folders" ''
264 ${pkgs.dovecot}/bin/doveadm expunge -A MAILBOX "Backup/*" NOT FLAGGED BEFORE 8w 2>&1 > /dev/null | grep -v "Mailbox doesn't exist:" | grep -v "Info: Opening DB"
265 ${pkgs.dovecot}/bin/doveadm expunge -A MAILBOX Junk SEEN NOT FLAGGED BEFORE 4w 2>&1 > /dev/null | grep -v "Mailbox doesn't exist:" | grep -v "Info: Opening DB"
266 ${pkgs.dovecot}/bin/doveadm expunge -A MAILBOX Trash NOT FLAGGED BEFORE 4w 2>&1 > /dev/null | grep -v "Mailbox doesn't exist:" | grep -v "Info: Opening DB"
267 '';
268 in
269 [
270 "0 2 * * * root ${cron_script}/bin/cleanup-imap-folders"
271 ];
272 security.acme.certs."mail-rsa" = {
273 postRun = ''
274 systemctl restart dovecot2.service
275 '';
276 extraDomains = {
277 "imap.immae.eu" = null;
278 "pop3.immae.eu" = null;
279 };
280 };
281 security.acme.certs."mail" = {
282 postRun = ''
283 systemctl restart dovecot2.service
284 '';
285 extraDomains = {
286 "imap.immae.eu" = null;
287 "pop3.immae.eu" = null;
288 };
289 };
290 };
291}
292
diff --git a/modules/private/mail/milters.nix b/modules/private/mail/milters.nix
deleted file mode 100644
index 4b93a7a..0000000
--- a/modules/private/mail/milters.nix
+++ /dev/null
@@ -1,88 +0,0 @@
1{ lib, pkgs, config, name, ... }:
2{
3 imports =
4 builtins.attrValues (import ../../../lib/flake-compat.nix ../../../flakes/private/openarc).nixosModules
5 ++ builtins.attrValues (import ../../../lib/flake-compat.nix ../../../flakes/private/opendmarc).nixosModules;
6
7 options.myServices.mail.milters.sockets = lib.mkOption {
8 type = lib.types.attrsOf lib.types.path;
9 default = {
10 opendkim = "/run/opendkim/opendkim.sock";
11 opendmarc = config.services.opendmarc.socket;
12 openarc = config.services.openarc.socket;
13 };
14 readOnly = true;
15 description = ''
16 milters sockets
17 '';
18 };
19 config = lib.mkIf (config.myServices.mail.enable || config.myServices.mailBackup.enable) {
20 secrets.keys = {
21 "opendkim" = {
22 isDir = true;
23 user = config.services.opendkim.user;
24 group = config.services.opendkim.group;
25 permissions = "0550";
26 };
27 "opendkim/eldiron.private" = {
28 user = config.services.opendkim.user;
29 group = config.services.opendkim.group;
30 permissions = "0400";
31 text = config.myEnv.mail.dkim.eldiron.private;
32 };
33 "opendkim/eldiron.txt" = {
34 user = config.services.opendkim.user;
35 group = config.services.opendkim.group;
36 permissions = "0444";
37 text = ''
38 eldiron._domainkey IN TXT ${config.myEnv.mail.dkim.eldiron.public}'';
39 };
40 };
41 users.users."${config.services.opendkim.user}".extraGroups = [ "keys" ];
42 services.opendkim = {
43 enable = true;
44 socket = "local:${config.myServices.mail.milters.sockets.opendkim}";
45 domains = builtins.concatStringsSep "," (lib.flatten (map
46 (zone: map
47 (e: "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}")
48 (zone.withEmail or [])
49 )
50 config.myEnv.dns.masterZones
51 ));
52 keyPath = config.secrets.fullPaths."opendkim";
53 selector = "eldiron";
54 configFile = pkgs.writeText "opendkim.conf" ''
55 SubDomains yes
56 UMask 002
57 AlwaysAddARHeader yes
58 '';
59 group = config.services.postfix.group;
60 };
61 systemd.services.opendkim.serviceConfig.Slice = "mail.slice";
62 systemd.services.opendkim.preStart = lib.mkBefore ''
63 # Skip the prestart script as keys are handled in secrets
64 exit 0
65 '';
66 services.filesWatcher.opendkim = {
67 restart = true;
68 paths = [
69 config.secrets.fullPaths."opendkim/eldiron.private"
70 ];
71 };
72
73 systemd.services.milter_verify_from = {
74 description = "Verify from milter";
75 after = [ "network.target" ];
76 wantedBy = [ "multi-user.target" ];
77
78 serviceConfig = {
79 Slice = "mail.slice";
80 User = "postfix";
81 Group = "postfix";
82 ExecStart = let python = pkgs.python3.withPackages (p: [ p.pymilter ]);
83 in "${python}/bin/python ${./verify_from.py} -s /run/milter_verify_from/verify_from.sock";
84 RuntimeDirectory = "milter_verify_from";
85 };
86 };
87 };
88}
diff --git a/modules/private/mail/opensmtpd.nix b/modules/private/mail/opensmtpd.nix
deleted file mode 100644
index e05bba9..0000000
--- a/modules/private/mail/opensmtpd.nix
+++ /dev/null
@@ -1,57 +0,0 @@
1{ lib, pkgs, config, name, ... }:
2{
3 config = lib.mkIf config.myServices.mailRelay.enable {
4 secrets.keys."opensmtpd/creds" = {
5 user = "smtpd";
6 group = "smtpd";
7 permissions = "0400";
8 text = ''
9 eldiron ${name}:${config.hostEnv.ldap.password}
10 '';
11 };
12 users.users.smtpd.extraGroups = [ "keys" ];
13 services.opensmtpd = {
14 enable = true;
15 serverConfiguration = let
16 filter-rewrite-from = pkgs.runCommand "filter-rewrite-from.py" {
17 buildInputs = [ pkgs.python3 ];
18 } ''
19 cp ${./filter-rewrite-from.py} $out
20 patchShebangs $out
21 '';
22 in ''
23 table creds \
24 "${config.secrets.fullPaths."opensmtpd/creds"}"
25 # FIXME: filtering requires 6.6, uncomment following lines when
26 # upgrading
27 # filter "fixfrom" \
28 # proc-exec "${filter-rewrite-from} ${name}@immae.eu"
29 # listen on socket filter "fixfrom"
30 action "relay-rewrite-from" relay \
31 helo ${config.hostEnv.fqdn} \
32 host smtp+tls://eldiron@eldiron.immae.eu:587 \
33 auth <creds> \
34 mail-from ${name}@immae.eu
35 action "relay" relay \
36 helo ${config.hostEnv.fqdn} \
37 host smtp+tls://eldiron@eldiron.immae.eu:587 \
38 auth <creds>
39 match for any !mail-from "@immae.eu" action "relay-rewrite-from"
40 match for any mail-from "@immae.eu" action "relay"
41 '';
42 };
43 environment.systemPackages = [ config.services.opensmtpd.package ];
44 services.mail.sendmailSetuidWrapper = {
45 program = "sendmail";
46 source = "${config.services.opensmtpd.package}/bin/smtpctl";
47 setuid = false;
48 setgid = false;
49 };
50 security.wrappers.mailq = {
51 program = "mailq";
52 source = "${config.services.opensmtpd.package}/bin/smtpctl";
53 setuid = false;
54 setgid = false;
55 };
56 };
57}
diff --git a/modules/private/mail/postfix.nix b/modules/private/mail/postfix.nix
deleted file mode 100644
index ae98a8a..0000000
--- a/modules/private/mail/postfix.nix
+++ /dev/null
@@ -1,471 +0,0 @@
1{ lib, pkgs, config, nodes, ... }:
2{
3 config = lib.mkIf config.myServices.mail.enable {
4 secrets.keys = {
5 "postfix/mysql_alias_maps" = {
6 user = config.services.postfix.user;
7 group = config.services.postfix.group;
8 permissions = "0440";
9 text = ''
10 # We need to specify that option to trigger ssl connection
11 tls_ciphers = TLSv1.2
12 user = ${config.myEnv.mail.postfix.mysql.user}
13 password = ${config.myEnv.mail.postfix.mysql.password}
14 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
15 dbname = ${config.myEnv.mail.postfix.mysql.database}
16 query = SELECT DISTINCT destination
17 FROM forwardings
18 WHERE
19 ((regex = 1 AND '%s' REGEXP CONCAT('^',source,'$') ) OR (regex = 0 AND source = '%s'))
20 AND active = 1
21 AND '%s' NOT IN
22 (
23 SELECT source
24 FROM forwardings_blacklisted
25 WHERE source = '%s'
26 ) UNION
27 SELECT 'devnull@immae.eu'
28 FROM forwardings_blacklisted
29 WHERE source = '%s'
30 '';
31 };
32 "postfix/ldap_mailboxes" = {
33 user = config.services.postfix.user;
34 group = config.services.postfix.group;
35 permissions = "0440";
36 text = ''
37 server_host = ldaps://${config.myEnv.mail.dovecot.ldap.host}:636
38 search_base = ${config.myEnv.mail.dovecot.ldap.base}
39 query_filter = ${config.myEnv.mail.dovecot.ldap.postfix_mailbox_filter}
40 bind_dn = ${config.myEnv.mail.dovecot.ldap.dn}
41 bind_pw = ${config.myEnv.mail.dovecot.ldap.password}
42 result_attribute = immaePostfixAddress
43 result_format = dummy
44 version = 3
45 '';
46 };
47 "postfix/mysql_sender_login_maps" = {
48 user = config.services.postfix.user;
49 group = config.services.postfix.group;
50 permissions = "0440";
51 text = ''
52 # We need to specify that option to trigger ssl connection
53 tls_ciphers = TLSv1.2
54 user = ${config.myEnv.mail.postfix.mysql.user}
55 password = ${config.myEnv.mail.postfix.mysql.password}
56 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
57 dbname = ${config.myEnv.mail.postfix.mysql.database}
58 query = SELECT DISTINCT destination
59 FROM forwardings
60 WHERE
61 (
62 (regex = 1 AND CONCAT(SUBSTRING_INDEX('%u', '+', 1), '@%d') REGEXP CONCAT('^',source,'$') )
63 OR
64 (regex = 0 AND source = CONCAT(SUBSTRING_INDEX('%u', '+', 1), '@%d'))
65 )
66 AND active = 1
67 UNION SELECT CONCAT(SUBSTRING_INDEX('%u', '+', 1), '@%d') AS destination
68 '';
69 };
70 "postfix/mysql_sender_relays_maps" = {
71 user = config.services.postfix.user;
72 group = config.services.postfix.group;
73 permissions = "0440";
74 text = ''
75 # We need to specify that option to trigger ssl connection
76 tls_ciphers = TLSv1.2
77 user = ${config.myEnv.mail.postfix.mysql.user}
78 password = ${config.myEnv.mail.postfix.mysql.password}
79 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
80 dbname = ${config.myEnv.mail.postfix.mysql.database}
81 # INSERT INTO sender_relays
82 # (`from`, owner, relay, login, password, regex, active)
83 # VALUES
84 # ( 'sender@otherhost.org'
85 # , 'me@mail.immae.eu'
86 # , '[otherhost.org]:587'
87 # , 'otherhostlogin'
88 # , AES_ENCRYPT('otherhostpassword', '${config.myEnv.mail.postfix.mysql.password_encrypt}')
89 # , '0'
90 # , '1');
91
92 query = SELECT DISTINCT `owner`
93 FROM sender_relays
94 WHERE
95 ((regex = 1 AND '%s' REGEXP CONCAT('^',`from`,'$') ) OR (regex = 0 AND `from` = '%s'))
96 AND active = 1
97 '';
98 };
99 "postfix/mysql_sender_relays_hosts" = {
100 user = config.services.postfix.user;
101 group = config.services.postfix.group;
102 permissions = "0440";
103 text = ''
104 # We need to specify that option to trigger ssl connection
105 tls_ciphers = TLSv1.2
106 user = ${config.myEnv.mail.postfix.mysql.user}
107 password = ${config.myEnv.mail.postfix.mysql.password}
108 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
109 dbname = ${config.myEnv.mail.postfix.mysql.database}
110
111 query = SELECT DISTINCT relay
112 FROM sender_relays
113 WHERE
114 ((regex = 1 AND '%s' REGEXP CONCAT('^',`from`,'$') ) OR (regex = 0 AND `from` = '%s'))
115 AND active = 1
116 '';
117 };
118 "postfix/mysql_sender_relays_creds" = {
119 user = config.services.postfix.user;
120 group = config.services.postfix.group;
121 permissions = "0440";
122 text = ''
123 # We need to specify that option to trigger ssl connection
124 tls_ciphers = TLSv1.2
125 user = ${config.myEnv.mail.postfix.mysql.user}
126 password = ${config.myEnv.mail.postfix.mysql.password}
127 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
128 dbname = ${config.myEnv.mail.postfix.mysql.database}
129
130 query = SELECT DISTINCT CONCAT(`login`, ':', AES_DECRYPT(`password`, '${config.myEnv.mail.postfix.mysql.password_encrypt}'))
131 FROM sender_relays
132 WHERE
133 ((regex = 1 AND '%s' REGEXP CONCAT('^',`from`,'$') ) OR (regex = 0 AND `from` = '%s'))
134 AND active = 1
135 '';
136 };
137 "postfix/ldap_ejabberd_users_immae_fr" = {
138 user = config.services.postfix.user;
139 group = config.services.postfix.group;
140 permissions = "0440";
141 text = ''
142 server_host = ldaps://${config.myEnv.jabber.ldap.host}:636
143 search_base = ${config.myEnv.jabber.ldap.base}
144 query_filter = ${config.myEnv.jabber.postfix_user_filter}
145 domain = immae.fr
146 bind_dn = ${config.myEnv.jabber.ldap.dn}
147 bind_pw = ${config.myEnv.jabber.ldap.password}
148 result_attribute = immaeXmppUid
149 result_format = ejabberd@localhost
150 version = 3
151 '';
152 };
153 } // lib.mapAttrs' (name: v: lib.nameValuePair "postfix/scripts/${name}-env" {
154 user = "postfixscripts";
155 group = "root";
156 permissions = "0400";
157 text = builtins.toJSON v.env;
158 }) config.myEnv.mail.scripts;
159
160 networking.firewall.allowedTCPPorts = [ 25 465 587 ];
161
162 users.users.postfixscripts = {
163 group = "keys";
164 uid = config.ids.uids.postfixscripts;
165 description = "Postfix scripts user";
166 };
167 users.users."${config.services.postfix.user}".extraGroups = [ "keys" ];
168 services.filesWatcher.postfix = {
169 restart = true;
170 paths = [
171 config.secrets.fullPaths."postfix/mysql_alias_maps"
172 config.secrets.fullPaths."postfix/ldap_mailboxes"
173 config.secrets.fullPaths."postfix/mysql_sender_login_maps"
174 config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"
175 ];
176 };
177 services.postfix = {
178 extraAliases = let
179 toScript = name: script: pkgs.writeScript name ''
180 #! ${pkgs.stdenv.shell}
181 mail=$(${pkgs.coreutils}/bin/cat -)
182 output=$(echo "$mail" | ${script} 2>&1)
183 ret=$?
184
185 if [ "$ret" != "0" ]; then
186 echo "$mail" \
187 | ${pkgs.procmail}/bin/formail -i "X-Return-Code: $ret" \
188 | /run/wrappers/bin/sendmail -i scripts_error+${name}@mail.immae.eu
189
190 messageId=$(echo "$mail" | ${pkgs.procmail}/bin/formail -x "Message-Id:")
191 repeat=$(echo "$mail" | ${pkgs.procmail}/bin/formail -X "From:" -X "Received:")
192
193 ${pkgs.coreutils}/bin/cat <<EOF | /run/wrappers/bin/sendmail -i scripts_error+${name}@mail.immae.eu
194 $repeat
195 To: scripts_error+${name}@mail.immae.eu
196 Subject: Log from script error
197 Content-Type: text/plain; charset="UTF-8"
198 Content-Transfer-Encoding: 8bit
199 References:$messageId
200 MIME-Version: 1.0
201 X-Return-Code: $ret
202
203 Error code: $ret
204 Output of message:
205 --------------
206 $output
207 --------------
208 EOF
209 fi
210 '';
211 scripts = lib.attrsets.mapAttrs (n: v:
212 toScript n (pkgs.callPackage (builtins.fetchGit { url = v.src.url; ref = "master"; rev = v.src.rev; }) { scriptEnv = config.secrets.fullPaths."postfix/scripts/${n}-env"; })
213 ) config.myEnv.mail.scripts // {
214 testmail = pkgs.writeScript "testmail" ''
215 #! ${pkgs.stdenv.shell}
216 ${pkgs.coreutils}/bin/touch \
217 "/var/lib/naemon/checks/email/$(${pkgs.procmail}/bin/formail -x To: | ${pkgs.coreutils}/bin/tr -d ' <>')"
218 '';
219 };
220 in builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v: ''${n}: "|${v}"'') scripts);
221 mapFiles = let
222 recipient_maps = let
223 name = n: i: "relay_${n}_${toString i}";
224 pair = n: i: m: lib.attrsets.nameValuePair (name n i) (
225 if m.type == "hash"
226 then pkgs.writeText (name n i) m.content
227 else null
228 );
229 pairs = n: v: lib.imap1 (i: m: pair n i m) v.recipient_maps;
230 in lib.attrsets.filterAttrs (k: v: v != null) (
231 lib.attrsets.listToAttrs (lib.flatten (
232 lib.attrsets.mapAttrsToList pairs config.myEnv.mail.postfix.backup_domains
233 ))
234 );
235 relay_restrictions = lib.attrsets.filterAttrs (k: v: v != null) (
236 lib.attrsets.mapAttrs' (n: v:
237 lib.attrsets.nameValuePair "recipient_access_${n}" (
238 if lib.attrsets.hasAttr "relay_restrictions" v
239 then pkgs.writeText "recipient_access_${n}" v.relay_restrictions
240 else null
241 )
242 ) config.myEnv.mail.postfix.backup_domains
243 );
244 virtual_map = {
245 virtual = let
246 cfg = config.myEnv.monitoring.email_check.eldiron;
247 address = "${cfg.mail_address}@${cfg.mail_domain}";
248 in pkgs.writeText "postfix-virtual" (
249 builtins.concatStringsSep "\n" (
250 ["${address} testmail@localhost"] ++
251 lib.attrsets.mapAttrsToList (
252 n: v: lib.optionalString v.external ''
253 script_${n}@mail.immae.eu ${n}@localhost, scripts@mail.immae.eu
254 ''
255 ) config.myEnv.mail.scripts
256 )
257 );
258 };
259 sasl_access = {
260 host_sender_login = with lib.attrsets; let
261 addresses = zipAttrs (lib.flatten (mapAttrsToList
262 (n: v: (map (e: { "${e}" = "${n}@immae.eu"; }) v.emails)) config.myEnv.servers));
263 joined = builtins.concatStringsSep ",";
264 in pkgs.writeText "host-sender-login"
265 (builtins.concatStringsSep "\n" (mapAttrsToList (n: v: "${n} ${joined v}") addresses));
266 };
267 in
268 recipient_maps // relay_restrictions // virtual_map // sasl_access;
269 config = {
270 ### postfix module overrides
271 readme_directory = "${pkgs.postfix}/share/postfix/doc";
272 smtp_tls_CAfile = lib.mkForce "";
273 smtp_tls_cert_file = lib.mkForce "";
274 smtp_tls_key_file = lib.mkForce "";
275
276 message_size_limit = "1073741824"; # Don't put 0 here, it's not equivalent to "unlimited"
277 mailbox_size_limit = "1073741825"; # Workaround, local delivered mails should all go through scripts
278 alias_database = "\$alias_maps";
279
280 ### Aliases scripts user
281 default_privs = "postfixscripts";
282
283 ### Virtual mailboxes config
284 virtual_alias_maps = [
285 "hash:/etc/postfix/virtual"
286 "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}"
287 "ldap:${config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"}"
288 ];
289 virtual_mailbox_domains = config.myEnv.mail.postfix.additional_mailbox_domains
290 ++ lib.remove null (lib.flatten (map
291 (zone: map
292 (e: if e.receive
293 then "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}"
294 else null
295 )
296 (zone.withEmail or [])
297 )
298 config.myEnv.dns.masterZones
299 ));
300 virtual_mailbox_maps = [
301 "ldap:${config.secrets.fullPaths."postfix/ldap_mailboxes"}"
302 ];
303 dovecot_destination_recipient_limit = "1";
304 virtual_transport = "dovecot";
305
306 ### Relay domains
307 relay_domains = lib.flatten (lib.attrsets.mapAttrsToList (n: v: v.domains or []) config.myEnv.mail.postfix.backup_domains);
308 relay_recipient_maps = lib.flatten (lib.attrsets.mapAttrsToList (n: v:
309 lib.imap1 (i: m: "${m.type}:/etc/postfix/relay_${n}_${toString i}") v.recipient_maps
310 ) config.myEnv.mail.postfix.backup_domains);
311 smtpd_relay_restrictions = [
312 "defer_unauth_destination"
313 ] ++ lib.flatten (lib.attrsets.mapAttrsToList (n: v:
314 if lib.attrsets.hasAttr "relay_restrictions" v
315 then [ "check_recipient_access hash:/etc/postfix/recipient_access_${n}" ]
316 else []
317 ) config.myEnv.mail.postfix.backup_domains);
318
319 ### Additional smtpd configuration
320 smtpd_tls_received_header = "yes";
321 smtpd_tls_loglevel = "1";
322
323 ### Email sending configuration
324 smtp_tls_security_level = "may";
325 smtp_tls_loglevel = "1";
326
327 ### Force ip bind for smtp
328 smtp_bind_address = config.hostEnv.ips.main.ip4;
329 smtp_bind_address6 = builtins.head config.hostEnv.ips.main.ip6;
330
331 # Use some relays when authorized senders are not myself
332 smtp_sasl_mechanism_filter = "plain,login"; # GSSAPI Not correctly supported by postfix
333 smtp_sasl_auth_enable = "yes";
334 smtp_sasl_password_maps =
335 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_creds"}";
336 smtp_sasl_security_options = "noanonymous";
337 smtp_sender_dependent_authentication = "yes";
338 sender_dependent_relayhost_maps =
339 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_hosts"}";
340
341 ### opendkim, opendmarc, openarc milters
342 non_smtpd_milters = [
343 "unix:${config.myServices.mail.milters.sockets.opendkim}"
344 ];
345 smtpd_milters = [
346 "unix:${config.myServices.mail.milters.sockets.opendkim}"
347 "unix:${config.myServices.mail.milters.sockets.openarc}"
348 "unix:${config.myServices.mail.milters.sockets.opendmarc}"
349 ];
350
351 smtp_use_tls = true;
352 smtpd_use_tls = true;
353 smtpd_tls_chain_files = builtins.concatStringsSep "," [ "/var/lib/acme/mail/full.pem" "/var/lib/acme/mail-rsa/full.pem" ];
354
355 maximal_queue_lifetime = "6w";
356 bounce_queue_lifetime = "6w";
357 };
358 enable = true;
359 enableSmtp = true;
360 enableSubmission = true;
361 submissionOptions = {
362 # Don’t use "long form", only commas (cf
363 # http://www.postfix.org/master.5.html long form is not handled
364 # well by the submission function)
365 smtpd_tls_security_level = "encrypt";
366 smtpd_sasl_auth_enable = "yes";
367 smtpd_tls_auth_only = "yes";
368 smtpd_sasl_tls_security_options = "noanonymous";
369 smtpd_sasl_type = "dovecot";
370 smtpd_sasl_path = "private/auth";
371 smtpd_reject_unlisted_recipient = "no";
372 smtpd_client_restrictions = "permit_sasl_authenticated,reject";
373 smtpd_relay_restrictions = "permit_sasl_authenticated,reject";
374 # Refuse to send e-mails with a From that is not handled
375 smtpd_sender_restrictions =
376 "reject_sender_login_mismatch,reject_unlisted_sender,permit_sasl_authenticated,reject";
377 smtpd_sender_login_maps = builtins.concatStringsSep "," [
378 "hash:/etc/postfix/host_sender_login"
379 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_maps"}"
380 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_login_maps"}"
381 ];
382 smtpd_recipient_restrictions = "permit_sasl_authenticated,reject";
383 milter_macro_daemon_name = "ORIGINATING";
384 smtpd_milters = builtins.concatStringsSep "," [
385 # FIXME: put it back when opensmtpd is upgraded and able to
386 # rewrite the from header
387 #"unix:/run/milter_verify_from/verify_from.sock"
388 "unix:${config.myServices.mail.milters.sockets.opendkim}"
389 ];
390 };
391 destination = ["localhost"];
392 # This needs to reverse DNS
393 hostname = config.hostEnv.fqdn;
394 setSendmail = true;
395 recipientDelimiter = "+";
396 masterConfig = {
397 submissions = {
398 type = "inet";
399 private = false;
400 command = "smtpd";
401 args = ["-o" "smtpd_tls_wrappermode=yes" ] ++ (let
402 mkKeyVal = opt: val: [ "-o" (opt + "=" + val) ];
403 in lib.concatLists (lib.mapAttrsToList mkKeyVal config.services.postfix.submissionOptions)
404 );
405 };
406 dovecot = {
407 type = "unix";
408 privileged = true;
409 chroot = false;
410 command = "pipe";
411 args = let
412 # rspamd could be used as a milter, but then it cannot apply
413 # its checks "per user" (milter is not yet dispatched to
414 # users), so we wrap dovecot-lda inside rspamc per recipient
415 # here.
416 rspamc_dovecot = pkgs.writeScriptBin "rspamc_dovecot" ''
417 #! ${pkgs.stdenv.shell}
418 sender="$1"
419 original_recipient="$2"
420 user="$3"
421
422 ${pkgs.coreutils}/bin/cat - | \
423 (${pkgs.rspamd}/bin/rspamc -h ${config.myServices.mail.rspamd.sockets.worker-controller} -c bayes -d "$user" --mime || true) | \
424 ${pkgs.dovecot}/libexec/dovecot/dovecot-lda -f "$sender" -a "$original_recipient" -d "$user"
425 '';
426 in [
427 "flags=ODRhu" "user=vhost:vhost"
428 "argv=${rspamc_dovecot}/bin/rspamc_dovecot \${sender} \${original_recipient} \${user}@\${nexthop}"
429 ];
430 };
431 };
432 };
433 security.acme.certs."mail" = {
434 postRun = ''
435 systemctl restart postfix.service
436 '';
437 extraDomains = {
438 "smtp.immae.eu" = null;
439 };
440 };
441 security.acme.certs."mail-rsa" = {
442 postRun = ''
443 systemctl restart postfix.service
444 '';
445 extraDomains = {
446 "smtp.immae.eu" = null;
447 };
448 };
449 system.activationScripts.testmail = {
450 deps = [ "users" ];
451 text = let
452 allCfg = config.myEnv.monitoring.email_check;
453 cfg = allCfg.eldiron;
454 reverseTargets = builtins.attrNames (lib.attrsets.filterAttrs (k: v: builtins.elem "eldiron" v.targets) allCfg);
455 to_email = cfg': host':
456 let sep = if lib.strings.hasInfix "+" cfg'.mail_address then "_" else "+";
457 in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}";
458 mails_to_receive = builtins.concatStringsSep " " (map (to_email cfg) reverseTargets);
459 in ''
460 install -m 0555 -o postfixscripts -g keys -d /var/lib/naemon/checks/email
461 for f in ${mails_to_receive}; do
462 if [ ! -f /var/lib/naemon/checks/email/$f ]; then
463 install -m 0644 -o postfixscripts -g keys /dev/null -T /var/lib/naemon/checks/email/$f
464 touch -m -d @0 /var/lib/naemon/checks/email/$f
465 fi
466 done
467 '';
468 };
469 systemd.services.postfix.serviceConfig.Slice = "mail.slice";
470 };
471}
diff --git a/modules/private/mail/relay.nix b/modules/private/mail/relay.nix
deleted file mode 100644
index 668d365..0000000
--- a/modules/private/mail/relay.nix
+++ /dev/null
@@ -1,235 +0,0 @@
1{ lib, pkgs, config, nodes, name, ... }:
2{
3 config = lib.mkIf config.myServices.mailBackup.enable {
4 security.acme.certs."mail" = config.myServices.certificates.certConfig // {
5 postRun = ''
6 systemctl restart postfix.service
7 '';
8 domain = config.hostEnv.fqdn;
9 extraDomains = let
10 zonesWithMx = builtins.filter (zone:
11 lib.attrsets.hasAttr "withEmail" zone && lib.lists.length zone.withEmail > 0
12 ) config.myEnv.dns.masterZones;
13 mxs = map (zone: "${config.myEnv.servers."${name}".mx.subdomain}.${zone.name}") zonesWithMx;
14 in builtins.listToAttrs (map (mx: lib.attrsets.nameValuePair mx null) mxs);
15 };
16 secrets.keys = {
17 "postfix/mysql_alias_maps" = {
18 user = config.services.postfix.user;
19 group = config.services.postfix.group;
20 permissions = "0440";
21 text = ''
22 # We need to specify that option to trigger ssl connection
23 tls_ciphers = TLSv1.2
24 user = ${config.myEnv.mail.postfix.mysql.user}
25 password = ${config.myEnv.mail.postfix.mysql.password}
26 hosts = ${config.myEnv.mail.postfix.mysql.remoteHost}
27 dbname = ${config.myEnv.mail.postfix.mysql.database}
28 query = SELECT DISTINCT 1
29 FROM forwardings
30 WHERE
31 ((regex = 1 AND '%s' REGEXP CONCAT('^',source,'$') ) OR (regex = 0 AND source = '%s'))
32 AND active = 1
33 AND '%s' NOT IN
34 (
35 SELECT source
36 FROM forwardings_blacklisted
37 WHERE source = '%s'
38 ) UNION
39 SELECT 'devnull@immae.eu'
40 FROM forwardings_blacklisted
41 WHERE source = '%s'
42 '';
43 };
44 "postfix/ldap_mailboxes" = {
45 user = config.services.postfix.user;
46 group = config.services.postfix.group;
47 permissions = "0440";
48 text = ''
49 server_host = ldaps://${config.myEnv.mail.dovecot.ldap.host}:636
50 search_base = ${config.myEnv.mail.dovecot.ldap.base}
51 query_filter = ${config.myEnv.mail.dovecot.ldap.postfix_mailbox_filter}
52 bind_dn = ${config.myEnv.mail.dovecot.ldap.dn}
53 bind_pw = ${config.myEnv.mail.dovecot.ldap.password}
54 result_attribute = immaePostfixAddress
55 result_format = dummy
56 version = 3
57 '';
58 };
59 "postfix/sympa_mailbox_maps" = {
60 user = config.services.postfix.user;
61 group = config.services.postfix.group;
62 permissions = "0440";
63 text = ''
64 hosts = ${config.myEnv.mail.sympa.postgresql.host}
65 user = ${config.myEnv.mail.sympa.postgresql.user}
66 password = ${config.myEnv.mail.sympa.postgresql.password}
67 dbname = ${config.myEnv.mail.sympa.postgresql.database}
68 query = SELECT DISTINCT 1 FROM list_table WHERE '%s' IN (
69 CONCAT(name_list, '@', robot_list),
70 CONCAT(name_list, '-request@', robot_list),
71 CONCAT(name_list, '-editor@', robot_list),
72 CONCAT(name_list, '-unsubscribe@', robot_list),
73 CONCAT(name_list, '-owner@', robot_list),
74 CONCAT('sympa-request@', robot_list),
75 CONCAT('sympa-owner@', robot_list),
76 CONCAT('sympa@', robot_list),
77 CONCAT('listmaster@', robot_list),
78 CONCAT('bounce@', robot_list),
79 CONCAT('abuse-feedback-report@', robot_list)
80 )
81 '';
82 };
83 "postfix/ldap_ejabberd_users_immae_fr" = {
84 user = config.services.postfix.user;
85 group = config.services.postfix.group;
86 permissions = "0440";
87 text = ''
88 server_host = ldaps://${config.myEnv.jabber.ldap.host}:636
89 search_base = ${config.myEnv.jabber.ldap.base}
90 query_filter = ${config.myEnv.jabber.postfix_user_filter}
91 domain = immae.fr
92 bind_dn = ${config.myEnv.jabber.ldap.dn}
93 bind_pw = ${config.myEnv.jabber.ldap.password}
94 result_attribute = immaeXmppUid
95 result_format = ejabberd@localhost
96 version = 3
97 '';
98 };
99 };
100
101 networking.firewall.allowedTCPPorts = [ 25 ];
102
103 users.users."${config.services.postfix.user}".extraGroups = [ "keys" ];
104 services.filesWatcher.postfix = {
105 restart = true;
106 paths = [
107 config.secrets.fullPaths."postfix/mysql_alias_maps"
108 config.secrets.fullPaths."postfix/sympa_mailbox_maps"
109 config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"
110 config.secrets.fullPaths."postfix/ldap_mailboxes"
111 ];
112 };
113 services.postfix = {
114 mapFiles = let
115 recipient_maps = let
116 name = n: i: "relay_${n}_${toString i}";
117 pair = n: i: m: lib.attrsets.nameValuePair (name n i) (
118 if m.type == "hash"
119 then pkgs.writeText (name n i) m.content
120 else null
121 );
122 pairs = n: v: lib.imap1 (i: m: pair n i m) v.recipient_maps;
123 in lib.attrsets.filterAttrs (k: v: v != null) (
124 lib.attrsets.listToAttrs (lib.flatten (
125 lib.attrsets.mapAttrsToList pairs config.myEnv.mail.postfix.backup_domains
126 ))
127 );
128 relay_restrictions = lib.attrsets.filterAttrs (k: v: v != null) (
129 lib.attrsets.mapAttrs' (n: v:
130 lib.attrsets.nameValuePair "recipient_access_${n}" (
131 if lib.attrsets.hasAttr "relay_restrictions" v
132 then pkgs.writeText "recipient_access_${n}" v.relay_restrictions
133 else null
134 )
135 ) config.myEnv.mail.postfix.backup_domains
136 );
137 virtual_map = {
138 virtual = let
139 cfg = config.myEnv.monitoring.email_check.eldiron;
140 address = "${cfg.mail_address}@${cfg.mail_domain}";
141 in pkgs.writeText "postfix-virtual" (
142 builtins.concatStringsSep "\n" (
143 ["${address} 1"] ++
144 lib.attrsets.mapAttrsToList (
145 n: v: lib.optionalString v.external ''
146 script_${n}@mail.immae.eu 1
147 ''
148 ) config.myEnv.mail.scripts
149 )
150 );
151 };
152 in
153 recipient_maps // relay_restrictions // virtual_map;
154 config = {
155 ### postfix module overrides
156 readme_directory = "${pkgs.postfix}/share/postfix/doc";
157 smtp_tls_CAfile = lib.mkForce "";
158 smtp_tls_cert_file = lib.mkForce "";
159 smtp_tls_key_file = lib.mkForce "";
160
161 message_size_limit = "1073741824"; # Don't put 0 here, it's not equivalent to "unlimited"
162 mailbox_size_limit = "1073741825"; # Workaround, local delivered mails should all go through scripts
163 alias_database = "\$alias_maps";
164
165 ### Relay domains
166 relay_domains = let
167 backups = lib.flatten (lib.attrsets.mapAttrsToList (n: v: v.domains or []) config.myEnv.mail.postfix.backup_domains);
168 virtual_domains = config.myEnv.mail.postfix.additional_mailbox_domains
169 ++ lib.remove null (lib.flatten (map
170 (zone: map
171 (e: if e.receive
172 then "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}"
173 else null
174 )
175 (zone.withEmail or [])
176 )
177 config.myEnv.dns.masterZones
178 ));
179 in
180 backups ++ virtual_domains;
181 relay_recipient_maps = let
182 backup_recipients = lib.flatten (lib.attrsets.mapAttrsToList (n: v:
183 lib.imap1 (i: m: "${m.type}:/etc/postfix/relay_${n}_${toString i}") v.recipient_maps
184 ) config.myEnv.mail.postfix.backup_domains);
185 virtual_alias_maps = [
186 "hash:/etc/postfix/virtual"
187 "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}"
188 "ldap:${config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"}"
189 ];
190 virtual_mailbox_maps = [
191 "ldap:${config.secrets.fullPaths."postfix/ldap_mailboxes"}"
192 "pgsql:${config.secrets.fullPaths."postfix/sympa_mailbox_maps"}"
193 ];
194 in
195 backup_recipients ++ virtual_alias_maps ++ virtual_mailbox_maps;
196 smtpd_relay_restrictions = [
197 "defer_unauth_destination"
198 ] ++ lib.flatten (lib.attrsets.mapAttrsToList (n: v:
199 if lib.attrsets.hasAttr "relay_restrictions" v
200 then [ "check_recipient_access hash:/etc/postfix/recipient_access_${n}" ]
201 else []
202 ) config.myEnv.mail.postfix.backup_domains);
203
204 ### Additional smtpd configuration
205 smtpd_tls_received_header = "yes";
206 smtpd_tls_loglevel = "1";
207
208 ### Email sending configuration
209 smtp_tls_security_level = "may";
210 smtp_tls_loglevel = "1";
211
212 ### Force ip bind for smtp
213 smtp_bind_address = config.myEnv.servers."${name}".ips.main.ip4;
214 smtp_bind_address6 = builtins.head config.myEnv.servers."${name}".ips.main.ip6;
215
216 smtpd_milters = [
217 "unix:${config.myServices.mail.milters.sockets.opendkim}"
218 "unix:${config.myServices.mail.milters.sockets.openarc}"
219 "unix:${config.myServices.mail.milters.sockets.opendmarc}"
220 ];
221 };
222 enable = true;
223 enableSmtp = true;
224 enableSubmission = false;
225 destination = ["localhost"];
226 # This needs to reverse DNS
227 hostname = config.hostEnv.fqdn;
228 setSendmail = false;
229 sslCert = "/var/lib/acme/mail/fullchain.pem";
230 sslKey = "/var/lib/acme/mail/key.pem";
231 recipientDelimiter = "+";
232 };
233 };
234}
235
diff --git a/modules/private/mail/rspamd.nix b/modules/private/mail/rspamd.nix
deleted file mode 100644
index 05f1300..0000000
--- a/modules/private/mail/rspamd.nix
+++ /dev/null
@@ -1,87 +0,0 @@
1{ lib, pkgs, config, ... }:
2{
3 options.myServices.mail.rspamd.sockets = lib.mkOption {
4 type = lib.types.attrsOf lib.types.path;
5 default = {
6 worker-controller = "/run/rspamd/worker-controller.sock";
7 };
8 readOnly = true;
9 description = ''
10 rspamd sockets
11 '';
12 };
13 config = lib.mkIf config.myServices.mail.enable {
14 services.cron.systemCronJobs = let
15 cron_script = pkgs.runCommand "cron_script" {
16 buildInputs = [ pkgs.makeWrapper ];
17 } ''
18 mkdir -p $out
19 cp ${./scan_reported_mails} $out/scan_reported_mails
20 patchShebangs $out
21 for i in $out/*; do
22 wrapProgram "$i" --prefix PATH : ${lib.makeBinPath [ pkgs.coreutils pkgs.rspamd pkgs.flock ]}
23 done
24 '';
25 in
26 [ "*/20 * * * * vhost ${cron_script}/scan_reported_mails" ];
27
28 systemd.services.rspamd.serviceConfig.Slice = "mail.slice";
29 services.rspamd = {
30 enable = true;
31 debug = false;
32 overrides = {
33 "actions.conf".text = ''
34 reject = null;
35 add_header = 6;
36 greylist = null;
37 '';
38 "milter_headers.conf".text = ''
39 extended_spam_headers = true;
40 '';
41 };
42 locals = {
43 "redis.conf".text = ''
44 servers = "${config.myEnv.mail.rspamd.redis.socket}";
45 db = "${config.myEnv.mail.rspamd.redis.db}";
46 '';
47 "classifier-bayes.conf".text = ''
48 users_enabled = true;
49 backend = "redis";
50 servers = "${config.myEnv.mail.rspamd.redis.socket}";
51 database = "${config.myEnv.mail.rspamd.redis.db}";
52 autolearn = true;
53 cache {
54 backend = "redis";
55 }
56 new_schema = true;
57 statfile {
58 BAYES_HAM {
59 spam = false;
60 }
61 BAYES_SPAM {
62 spam = true;
63 }
64 }
65 '';
66 };
67 workers = {
68 controller = {
69 extraConfig = ''
70 enable_password = "${config.myEnv.mail.rspamd.write_password_hashed}";
71 password = "${config.myEnv.mail.rspamd.read_password_hashed}";
72 '';
73 bindSockets = [ {
74 socket = config.myServices.mail.rspamd.sockets.worker-controller;
75 mode = "0660";
76 owner = config.services.rspamd.user;
77 group = "vhost";
78 } ];
79 };
80 };
81 postfix = {
82 enable = true;
83 config = {};
84 };
85 };
86 };
87}
diff --git a/modules/private/mail/sympa.nix b/modules/private/mail/sympa.nix
deleted file mode 100644
index 0626ac0..0000000
--- a/modules/private/mail/sympa.nix
+++ /dev/null
@@ -1,213 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 domain = "lists.immae.eu";
4 sympaConfig = config.myEnv.mail.sympa;
5in
6{
7 config = lib.mkIf config.myServices.mail.enable {
8 myServices.databases.postgresql.authorizedHosts = {
9 backup-2 = [
10 {
11 username = "sympa";
12 database = "sympa";
13 ip4 = [config.myEnv.servers.backup-2.ips.main.ip4];
14 ip6 = config.myEnv.servers.backup-2.ips.main.ip6;
15 }
16 ];
17 };
18 services.websites.env.tools.vhostConfs.mail = {
19 extraConfig = lib.mkAfter [
20 ''
21 Alias /static-sympa/ /var/lib/sympa/static_content/
22 <Directory /var/lib/sympa/static_content/>
23 Require all granted
24 AllowOverride none
25 </Directory>
26 <Location /sympa>
27 SetHandler "proxy:unix:/run/sympa/wwsympa.socket|fcgi://"
28 Require all granted
29 </Location>
30 ''
31 ];
32 };
33
34 secrets.keys = {
35 "sympa/db_password" = {
36 permissions = "0400";
37 group = "sympa";
38 user = "sympa";
39 text = sympaConfig.postgresql.password;
40 };
41 }
42 // lib.mapAttrs' (n: v: lib.nameValuePair "sympa/data_sources/${n}.incl" {
43 permissions = "0400"; group = "sympa"; user = "sympa"; text = v;
44 }) sympaConfig.data_sources
45 // lib.mapAttrs' (n: v: lib.nameValuePair "sympa/scenari/${n}" {
46 permissions = "0400"; group = "sympa"; user = "sympa"; text = v;
47 }) sympaConfig.scenari;
48 users.users.sympa.extraGroups = [ "keys" ];
49 systemd.slices.mail-sympa = {
50 description = "Sympa slice";
51 };
52
53 systemd.services.sympa.serviceConfig.SupplementaryGroups = [ "keys" ];
54 systemd.services.sympa-archive.serviceConfig.SupplementaryGroups = [ "keys" ];
55 systemd.services.sympa-bounce.serviceConfig.SupplementaryGroups = [ "keys" ];
56 systemd.services.sympa-bulk.serviceConfig.SupplementaryGroups = [ "keys" ];
57 systemd.services.sympa-task.serviceConfig.SupplementaryGroups = [ "keys" ];
58
59 systemd.services.sympa.serviceConfig.Slice = "mail-sympa.slice";
60 systemd.services.sympa-archive.serviceConfig.Slice = "mail-sympa.slice";
61 systemd.services.sympa-bounce.serviceConfig.Slice = "mail-sympa.slice";
62 systemd.services.sympa-bulk.serviceConfig.Slice = "mail-sympa.slice";
63 systemd.services.sympa-task.serviceConfig.Slice = "mail-sympa.slice";
64
65 # https://github.com/NixOS/nixpkgs/pull/84202
66 systemd.services.sympa.serviceConfig.ProtectKernelModules = lib.mkForce false;
67 systemd.services.sympa-archive.serviceConfig.ProtectKernelModules = lib.mkForce false;
68 systemd.services.sympa-bounce.serviceConfig.ProtectKernelModules = lib.mkForce false;
69 systemd.services.sympa-bulk.serviceConfig.ProtectKernelModules = lib.mkForce false;
70 systemd.services.sympa-task.serviceConfig.ProtectKernelModules = lib.mkForce false;
71 systemd.services.sympa.serviceConfig.ProtectKernelTunables = lib.mkForce false;
72 systemd.services.sympa-archive.serviceConfig.ProtectKernelTunables = lib.mkForce false;
73 systemd.services.sympa-bounce.serviceConfig.ProtectKernelTunables = lib.mkForce false;
74 systemd.services.sympa-bulk.serviceConfig.ProtectKernelTunables = lib.mkForce false;
75 systemd.services.sympa-task.serviceConfig.ProtectKernelTunables = lib.mkForce false;
76
77 systemd.services.wwsympa = {
78 wantedBy = [ "multi-user.target" ];
79 after = [ "sympa.service" ];
80 serviceConfig = {
81 Slice = "mail-sympa.slice";
82 Type = "forking";
83 PIDFile = "/run/sympa/wwsympa.pid";
84 Restart = "always";
85 ExecStart = ''${pkgs.spawn_fcgi}/bin/spawn-fcgi \
86 -u sympa \
87 -g sympa \
88 -U wwwrun \
89 -M 0600 \
90 -F 2 \
91 -P /run/sympa/wwsympa.pid \
92 -s /run/sympa/wwsympa.socket \
93 -- ${pkgs.sympa}/lib/sympa/cgi/wwsympa.fcgi
94 '';
95 StateDirectory = "sympa";
96 ProtectHome = true;
97 ProtectSystem = "full";
98 ProtectControlGroups = true;
99 };
100 };
101
102 services.postfix = {
103 mapFiles = {
104 # Update relay list when changing one of those
105 sympa_virtual = pkgs.writeText "virtual.sympa" ''
106 sympa-request@${domain} postmaster@immae.eu
107 sympa-owner@${domain} postmaster@immae.eu
108
109 sympa-request@cip-ca.fr postmaster@immae.eu
110 sympa-owner@cip-ca.fr postmaster@immae.eu
111 '';
112 sympa_transport = pkgs.writeText "transport.sympa" ''
113 ${domain} error:User unknown in recipient table
114 sympa@${domain} sympa:sympa@${domain}
115 listmaster@${domain} sympa:listmaster@${domain}
116 bounce@${domain} sympabounce:sympa@${domain}
117 abuse-feedback-report@${domain} sympabounce:sympa@${domain}
118
119 sympa@cip-ca.fr sympa:sympa@cip-ca.fr
120 listmaster@cip-ca.fr sympa:listmaster@cip-ca.fr
121 bounce@cip-ca.fr sympabounce:sympa@cip-ca.fr
122 abuse-feedback-report@cip-ca.fr sympabounce:sympa@cip-ca.fr
123 '';
124 };
125 config = {
126 transport_maps = lib.mkAfter [
127 "hash:/etc/postfix/sympa_transport"
128 "hash:/var/lib/sympa/sympa_transport"
129 ];
130 virtual_alias_maps = lib.mkAfter [
131 "hash:/etc/postfix/sympa_virtual"
132 ];
133 virtual_mailbox_maps = lib.mkAfter [
134 "hash:/etc/postfix/sympa_transport"
135 "hash:/var/lib/sympa/sympa_transport"
136 "hash:/etc/postfix/sympa_virtual"
137 ];
138 };
139 masterConfig = {
140 sympa = {
141 type = "unix";
142 privileged = true;
143 chroot = false;
144 command = "pipe";
145 args = [
146 "flags=hqRu"
147 "user=sympa"
148 "argv=${pkgs.sympa}/libexec/queue"
149 "\${nexthop}"
150 ];
151 };
152 sympabounce = {
153 type = "unix";
154 privileged = true;
155 chroot = false;
156 command = "pipe";
157 args = [
158 "flags=hqRu"
159 "user=sympa"
160 "argv=${pkgs.sympa}/libexec/bouncequeue"
161 "\${nexthop}"
162 ];
163 };
164 };
165 };
166 services.sympa = {
167 enable = true;
168 listMasters = sympaConfig.listmasters;
169 mainDomain = domain;
170 domains = {
171 "${domain}" = {
172 webHost = "mail.immae.eu";
173 webLocation = "/sympa";
174 };
175 "cip-ca.fr" = {
176 webHost = "mail.cip-ca.fr";
177 webLocation = "/sympa";
178 };
179 };
180
181 database = {
182 type = "PostgreSQL";
183 user = sympaConfig.postgresql.user;
184 host = sympaConfig.postgresql.socket;
185 name = sympaConfig.postgresql.database;
186 passwordFile = config.secrets.fullPaths."sympa/db_password";
187 createLocally = false;
188 };
189 settings = {
190 sendmail = "/run/wrappers/bin/sendmail";
191 log_smtp = "on";
192 sendmail_aliases = "/var/lib/sympa/sympa_transport";
193 aliases_program = "${pkgs.postfix}/bin/postmap";
194 };
195 settingsFile = {
196 "virtual.sympa".enable = false;
197 "transport.sympa".enable = false;
198 } // lib.mapAttrs' (n: v: lib.nameValuePair
199 "etc/${domain}/data_sources/${n}.incl"
200 { source = config.secrets.fullPaths."sympa/data_sources/${n}.incl"; }) sympaConfig.data_sources
201 // lib.mapAttrs' (n: v: lib.nameValuePair
202 "etc/${domain}/scenari/${n}"
203 { source = config.secrets.fullPaths."sympa/scenari/${n}"; }) sympaConfig.scenari;
204 web = {
205 server = "none";
206 };
207
208 mta = {
209 type = "none";
210 };
211 };
212 };
213}
diff --git a/modules/private/monitoring/default.nix b/modules/private/monitoring/default.nix
deleted file mode 100644
index 0783c2f..0000000
--- a/modules/private/monitoring/default.nix
+++ /dev/null
@@ -1,249 +0,0 @@
1{ config, pkgs, lib, name, nodes, ... }:
2let
3 cfg = config.myServices.monitoring;
4 activatedPlugins = [ "memory" "command" "bandwidth" ]
5 ++ (if cfg.master then (masterObjects.activatedPlugins or []) else [])
6 ++ (if cfg.master then (lib.flatten (map (v: v.activatedPlugins or []) otherObjects)) else [])
7 ++ (hostObjects.activatedPlugins or [])
8 ++ (if cfg.master then ["notify-primary"] else ["notify-secondary"]);
9 allPluginsConfig = import ./myplugins.nix {
10 inherit pkgs lib config;
11 sudo = "/run/wrappers/bin/sudo";
12 };
13 mypluginsConfig = lib.getAttrs activatedPlugins allPluginsConfig;
14 myplugins = let
15 mypluginsChunk = builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (k: v: v.chunk or "") mypluginsConfig);
16 in pkgs.runCommand "buildplugins" {
17 buildInputs = [ pkgs.makeWrapper pkgs.perl ];
18 } ''
19 mkdir $out
20 ${mypluginsChunk}
21 '';
22 toObjects = pkgs.callPackage ./to_objects.nix {};
23 commonConfig = {
24 dilion = {
25 processWarn = "250"; processAlert = "400";
26 loadWarn = "1.0"; loadAlert = "1.2";
27 interface = "eth0";
28 };
29 eldiron = {
30 processWarn = "550"; processAlert = "650";
31 loadWarn = "1.0"; loadAlert = "1.2";
32 interface = "eth0";
33 };
34 backup-2 = {
35 processWarn = "60"; processAlert = "70";
36 loadWarn = "1.0"; loadAlert = "2.0";
37 interface = "ens3";
38 };
39 monitoring-1 = {
40 processWarn = "50"; processAlert = "60";
41 loadWarn = "4.0"; loadAlert = "6.0";
42 load15Warn = "1.0"; load15Alert = "2.0";
43 interface = "ens3";
44 };
45 quatresaisons = {
46 processWarn = "250"; processAlert = "400";
47 loadWarn = "1.0"; loadAlert = "1.2";
48 interface = "eth0";
49 };
50 };
51 externalObjects = lib.genAttrs [ "tiboqorl-fr" ]
52 (n: pkgs.callPackage (./. + "/objects_" + n + ".nix") { inherit emailCheck; });
53 masterPassiveObjects = let
54 passiveNodes = lib.attrsets.filterAttrs (n: _: builtins.elem n ["backup-2" "eldiron" "quatresaisons" "dilion"]) nodes;
55 toPassiveServices = map (s: s.passiveInfo.filter s // s.passiveInfo);
56 passiveServices = lib.flatten (lib.attrsets.mapAttrsToList
57 (_: n: toPassiveServices n.config.myServices.monitoring.services)
58 passiveNodes
59 ) ++ lib.flatten (lib.attrsets.mapAttrsToList
60 (_: n: toPassiveServices n.service)
61 externalObjects);
62 in {
63 service = passiveServices;
64 host = lib.lists.foldr
65 (a: b: a//b)
66 {}
67 (lib.attrsets.mapAttrsToList (_: h: h.config.myServices.monitoring.hosts) passiveNodes
68 ++ lib.attrsets.mapAttrsToList (_: n: n.host) externalObjects);
69 };
70 emailCheck = host: hostFQDN: let
71 allCfg = config.myEnv.monitoring.email_check;
72 cfg = allCfg."${host}";
73 reverseTargets = builtins.attrNames (lib.attrsets.filterAttrs (k: v: builtins.elem host v.targets) allCfg);
74 to_email = cfg': host':
75 let sep = if lib.strings.hasInfix "+" cfg'.mail_address then "_" else "+";
76 in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}";
77 mails_to_send = builtins.concatStringsSep "," (map (n: to_email allCfg."${n}" host) cfg.targets);
78 mails_to_receive = builtins.concatStringsSep "," (map (n: "${to_email cfg n}:${n}") reverseTargets);
79 command = if cfg.local
80 then
81 [ "check_emails_local" "/var/lib/naemon/checks/email" mails_to_send mails_to_receive ]
82 else
83 [ "check_emails" cfg.login cfg.port mails_to_send mails_to_receive ];
84 in
85 {
86 service_description = "${hostFQDN} email service is active";
87 use = "mail-service";
88 host_name = hostFQDN;
89 servicegroups = "webstatus-email";
90 check_command = command;
91 };
92 otherObjects = map
93 (n: (pkgs.callPackage (./. + "/objects_" + n + ".nix") { inherit emailCheck; }))
94 [ "ulminfo-fr" "phare" "eban" ];
95 masterObjects = pkgs.callPackage ./objects_master.nix { inherit config; };
96 commonObjects = pkgs.callPackage ./objects_common.nix ({
97 master = cfg.master;
98 hostFQDN = config.hostEnv.fqdn;
99 hostName = name;
100 inherit mypluginsConfig;
101 } // builtins.getAttr name commonConfig);
102 hostObjects =
103 let
104 specific_file = ./. + "/objects_" + name + ".nix";
105 in
106 lib.attrsets.optionalAttrs
107 (builtins.pathExists specific_file)
108 (pkgs.callPackage specific_file {
109 inherit config nodes emailCheck;
110 hostFQDN = config.hostEnv.fqdn;
111 hostName = name;
112 });
113 objectsFiles = lib.mapAttrs' (name: value: lib.nameValuePair
114 "=/${name}/objects.conf" { alias = pkgs.writeText "objects.conf" (toObjects value); }
115 ) externalObjects;
116in
117{
118 options = {
119 myServices.monitoring = {
120 enable = lib.mkOption {
121 type = lib.types.bool;
122 default = false;
123 description = ''
124 Whether to enable monitoring.
125 '';
126 };
127 master = lib.mkOption {
128 type = lib.types.bool;
129 default = false;
130 description = ''
131 This instance is the master instance
132 '';
133 };
134 hosts = lib.mkOption {
135 readOnly = true;
136 description = "Hosts list for this host";
137 default = (commonObjects.host or {}) // (hostObjects.host or {});
138 };
139 services = lib.mkOption {
140 readOnly = true;
141 description = "Services list for this host";
142 default = commonObjects.service ++ hostObjects.service;
143 };
144 };
145 };
146
147 config = lib.mkIf cfg.enable {
148 services.nginx = lib.mkIf config.myServices.status.enable {
149 virtualHosts."status.immae.eu".locations = objectsFiles // {
150 "=/common/immae.cfg" = {
151 alias = pkgs.writeText "immae.cfg" ''
152 # put me for instance in /etc/naemon/module-conf.d/immae.cfg
153 # Make sure that you have include_dir=module-conf.d in
154 # naemon.cfg
155 log_initial_states=1
156 date_format=iso8601
157 admin_email=${config.myEnv.monitoring.email}
158 obsess_over_services=1
159 ocsp_command=notify-master
160 '';
161 };
162 "=/common/resource.cfg" = {
163 alias = pkgs.writeText "resource.cfg" ''
164 # Resource.cfg file
165 # Replace this with path to monitoring plugins
166 $USER1$=@@COMMON_PLUGINS@@
167 # Replace this with a path to scripts from
168 # https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/tree/modules/private/monitoring/plugins
169 $USER2$=@@IMMAE_PLUGINS@@
170 $USER200$=https://status.immae.eu/
171 $USER201$=@@TOKEN@@
172 '';
173 };
174 };
175 };
176
177 security.sudo.extraRules = let
178 pluginsSudo = lib.lists.remove null (lib.attrsets.mapAttrsToList (k: v:
179 if (v ? sudo)
180 then ({ users = [ "naemon" ]; } // (v.sudo myplugins))
181 else null) mypluginsConfig);
182 in [
183 {
184 commands = [
185 { command = "${pkgs.mdadm}/bin/mdadm --monitor --scan -1"; options = [ "NOPASSWD" ]; }
186 { command = "${pkgs.postfix}/bin/mailq"; options = [ "NOPASSWD" ]; }
187 ];
188 users = [ "naemon" ];
189 runAs = "root";
190 }
191 ] ++ pluginsSudo;
192 environment.etc."mdadm.conf" = {
193 enable = true;
194 mode = "0644";
195 user = "root";
196 text = "MAILADDR ${config.myEnv.monitoring.email}";
197 };
198
199 secrets.keys = {
200 "naemon/id_rsa" = {
201 user = "naemon";
202 group = "naemon";
203 permissions = "0400";
204 text = config.myEnv.monitoring.ssh_secret_key;
205 };
206 } // lib.optionalAttrs cfg.master (
207 lib.mapAttrs' (k: v: lib.nameValuePair "${k}_access_key" {
208 user = "naemon";
209 group = "naemon";
210 permissions = "0400";
211 text = ''
212 export AWS_ACCESS_KEY_ID="${v.accessKeyId}"
213 export AWS_SECRET_ACCESS_KEY="${v.secretAccessKey}"
214 export BASE_URL="${v.remote "immae-eldiron"}"
215 '';
216 }) config.myEnv.backup.remotes
217 );
218 # needed since extraResource is not in the closure
219 systemd.services.naemon.path = [ myplugins ];
220 services.naemon = {
221 enable = true;
222 extraConfig = ''
223 use_syslog=1
224 log_initial_states=1
225 date_format=iso8601
226 admin_email=${config.myEnv.monitoring.email}
227 '' + lib.optionalString (!cfg.master) ''
228 obsess_over_services=1
229 ocsp_command=notify-master
230 '' + lib.optionalString (cfg.master) ''
231 broker_module=${pkgs.naemon-livestatus}/lib/naemon-livestatus/livestatus.so ${config.services.naemon.runDir}/live
232 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
233 '';
234 extraResource = let
235 resources = [hostObjects.resources or {}] ++ (lib.mapAttrsToList (k: v: v.resources or {}) mypluginsConfig);
236 joined = lib.zipAttrsWith (n: v: if builtins.length (lib.unique v) == 1 then builtins.head v else abort "Non-unique resources names") resources;
237 joinedStr = builtins.concatStringsSep "\n" (lib.mapAttrsToList (k: v: "$" + "${k}$=${v}") joined);
238 in ''
239 $USER2$=${myplugins}
240 ${joinedStr}
241 '';
242 objectDefs = toObjects commonObjects
243 + toObjects hostObjects
244 + lib.optionalString cfg.master (toObjects masterObjects)
245 + lib.optionalString cfg.master (toObjects masterPassiveObjects)
246 + lib.optionalString cfg.master (builtins.concatStringsSep "\n" (map toObjects otherObjects));
247 };
248 };
249}
diff --git a/modules/private/monitoring/myplugins.nix b/modules/private/monitoring/myplugins.nix
deleted file mode 100644
index e59ddc4..0000000
--- a/modules/private/monitoring/myplugins.nix
+++ /dev/null
@@ -1,389 +0,0 @@
1{ sudo, pkgs, lib, config }:
2let
3 cfg = config.myServices.monitoring;
4in
5{
6 notify-secondary = {
7 resources = {
8 USER200 = config.myEnv.monitoring.status_url;
9 USER201 = config.myEnv.monitoring.status_token;
10 };
11 commands = {
12 notify-master = "$USER2$/send_nrdp.sh -u \"$USER200$\" -t \"$USER201$\" -H \"$HOSTADDRESS$\" -s \"$SERVICEDESC$\" -S \"$SERVICESTATEID$\" -o \"$SERVICEOUTPUT$ | $SERVICEPERFDATA$\"";
13 };
14 chunk = ''
15 cp ${./plugins}/send_nrdp.sh $out
16 patchShebangs $out/send_nrdp.sh
17 wrapProgram $out/send_nrdp.sh --prefix PATH : ${lib.makeBinPath [
18 pkgs.curl pkgs.jq
19 ]}
20 '';
21 };
22 notify-primary = {
23 resources = {
24 USER206 = config.myEnv.monitoring.slack_channel;
25 USER207 = config.myEnv.monitoring.slack_url;
26 USER210 = config.myEnv.monitoring.eban.user;
27 USER211 = config.myEnv.monitoring.eban.password;
28 };
29 commands = {
30 # $OVE is to force naemon to run via shell instead of execve which fails here
31 notify-host-by-email = "ADMINEMAIL=\"$ADMINEMAIL$\" SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" HOSTSTATE=\"$HOSTSTATE$\" HOSTOUTPUT=\"$HOSTOUTPUT$\" $USER2$/notify_by_email host \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE";
32 # $OVE is to force naemon to run via shell instead of execve which fails here
33 notify-service-by-email = "ADMINEMAIL=\"$ADMINEMAIL$\" SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_email service \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE";
34 notify-by-slack = "HOST=\"$HOSTALIAS$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_slack \"$ARG1$\" \"$ARG2$\"";
35 notify-host-eban-url = "STATUS_NAME=\"Server\" USER=\"$USER210$\" PASSWORD=\"$USER211$\" HOSTSTATE=\"$HOSTSTATE$\" $USER2$/notify_eban_url";
36 notify-service-eban-url = "STATUS_NAME=\"$_SERVICEWEBSTATUS_NAME$\" USER=\"$USER210$\" PASSWORD=\"$USER211$\" SERVICESTATE=\"$SERVICESTATE$\" $USER2$/notify_eban_url";
37 };
38 chunk = ''
39 cp ${./plugins}/{notify_by_email,notify_by_slack,notify_eban_url} $out
40 patchShebangs $out/{notify_by_email,notify_by_slack,notify_eban_url}
41 wrapProgram $out/notify_by_email --prefix PATH : ${lib.makeBinPath [
42 pkgs.mailutils
43 ]}
44 wrapProgram $out/notify_by_slack --prefix PATH : ${lib.makeBinPath [
45 pkgs.curl pkgs.jq
46 ]}
47 wrapProgram $out/notify_eban_url --prefix PATH : ${lib.makeBinPath [
48 pkgs.curl
49 ]}
50 '';
51 };
52 bandwidth = {
53 commands = {
54 check_local_bandwidth = "$USER2$/check_bandwidth -i=$ARG1$ -w $ARG2$ -c $ARG3$";
55 };
56 chunk = ''
57 cp ${./plugins}/check_bandwidth $out/
58 patchShebangs $out/check_bandwidth
59 wrapProgram $out/check_bandwidth --prefix PATH : ${lib.makeBinPath [
60 pkgs.iproute pkgs.bc
61 ]}
62 '';
63 };
64 command = {
65 commands = {
66 check_command_match = "$USER2$/check_command -c \"$ARG1$\" -C \"$ARG2$\" $ARG3$";
67 check_command_output = "$USER2$/check_command -c \"$ARG1$\" -s 0 -o \"$ARG2$\" $ARG3$";
68 check_command_status = "$USER2$/check_command -c \"$ARG1$\" -s \"$ARG2$\" $ARG3$";
69 };
70 chunk = ''
71 cp ${./plugins}/check_command $out/
72 patchShebangs $out/check_command
73 wrapProgram $out/check_command --prefix PATH : ${config.security.wrapperDir}
74 '';
75 };
76 dns = {
77 commands = {
78 check_dns = "$USER1$/check_dns -H $ARG1$ -s $HOSTADDRESS$ $ARG2$";
79 check_external_dns = "$USER1$/check_dns -H $ARG2$ -s $ARG1$ $ARG3$";
80 };
81 };
82 emails = {
83 resources = {
84 USER203 = config.secrets.fullPaths."naemon/id_rsa";
85 };
86 commands = {
87 check_emails = "$USER2$/check_emails -H $HOSTADDRESS$ -i $USER203$ -l $ARG1$ -p $ARG2$ -s $ARG3$ -f $ARG4$";
88 check_emails_local = "$USER2$/check_emails -H $HOSTADDRESS$ -n $ARG1$ -r $ADMINEMAIL$ -s $ARG2$ -f $ARG3$";
89 };
90 chunk = let
91 send_mails = pkgs.runCommand "send_mails" {
92 buildInputs = [ pkgs.makeWrapper ];
93 } ''
94 mkdir -p $out/bin
95 cp ${./send_mails} $out/bin/send_mails
96 patchShebangs $out
97 wrapProgram $out/bin/send_mails --prefix PATH : ${lib.makeBinPath [
98 pkgs.mailutils
99 ]}
100 '';
101 in ''
102 cp ${./plugins}/check_emails $out/
103 patchShebangs $out/check_emails
104 wrapProgram $out/check_emails --prefix PATH : ${lib.makeBinPath [
105 pkgs.openssh send_mails
106 ]} --prefix PERL5LIB : ${pkgs.perlPackages.makePerlPath [
107 pkgs.perlPackages.TimeDate
108 ]}
109 '';
110 };
111 eriomem = {
112 resources = {
113 USER208 = builtins.concatStringsSep "," (map (builtins.concatStringsSep ":") config.myEnv.monitoring.eriomem_keys);
114 };
115 commands = {
116 check_backup_eriomem = "$USER2$/check_eriomem $USER208$";
117 check_backup_eriomem_age = "$USER2$/check_backup_eriomem_age $ARG1$";
118 };
119 chunk = ''
120 cp ${./plugins}/check_eriomem $out/
121 patchShebangs $out/check_eriomem
122 wrapProgram $out/check_eriomem --prefix PATH : ${lib.makeBinPath [
123 pkgs.s3cmd pkgs.python3
124 ]}
125 cp ${./plugins}/check_backup_age $out/check_backup_eriomem_age
126 patchShebangs $out/check_backup_eriomem_age
127 wrapProgram $out/check_backup_eriomem_age --prefix PATH : ${lib.makeBinPath [
128 pkgs.duplicity
129 ]} --set SECRETS_PATH ${lib.optionalString cfg.master config.secrets.fullPaths."eriomem_access_key"}
130 '';
131 };
132 file_date = {
133 commands = {
134 check_last_file_date = "${sudo} -u \"$ARG3$\" $USER2$/check_last_file_date \"$ARG1$\" \"$ARG2$\"";
135 };
136 chunk = ''
137 cp ${./plugins}/check_last_file_date $out/
138 patchShebangs $out/check_last_file_date
139 '';
140 sudo = myplugins: {
141 commands = [
142 { command = "${myplugins}/check_last_file_date /backup2/*"; options = [ "NOPASSWD" ]; }
143 ];
144 runAs = "ALL";
145 };
146 };
147 ftp = {
148 commands = {
149 check_ftp_database = "$USER2$/check_ftp_database";
150 };
151 chunk = ''
152 cp ${./plugins}/check_ftp_database $out/
153 patchShebangs $out/check_ftp_database
154 wrapProgram $out/check_ftp_database --prefix PATH : ${lib.makeBinPath [
155 pkgs.lftp
156 ]}
157 '';
158 };
159 git = {
160 resources = {
161 USER203 = config.secrets.fullPaths."naemon/id_rsa";
162 };
163 commands = {
164 check_git = "$USER2$/check_git $USER203$";
165 };
166 chunk = ''
167 cp ${./plugins}/check_git $out/
168 patchShebangs $out/check_git
169 wrapProgram $out/check_git --prefix PATH : ${lib.makeBinPath [
170 pkgs.git pkgs.openssh
171 ]}
172 '';
173 };
174 http = {
175 resources = {
176 USER202 = config.myEnv.monitoring.http_user_password;
177 };
178 commands = {
179 check_http = "$USER1$/check_http --sni -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
180 check_https = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
181 check_https_auth = "$USER1$/check_http --sni --ssl -a \"$USER202$\" -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -r \"$ARG3$\"";
182 check_https_certificate = "$USER1$/check_http --sni --ssl -H \"$ARG1$\" -C 21,15";
183 check_https_code = "$USER1$/check_http --sni --ssl -f stickyport -H \"$ARG1$\" -u \"$ARG2$\" -e \"$ARG3$\" -r \"$ARG4$\"";
184 };
185 };
186 imap = {
187 resources = {
188 USER204 = config.myEnv.monitoring.imap_login;
189 USER205 = config.myEnv.monitoring.imap_password;
190 };
191 commands = {
192 check_imap_connection = "$USER2$/check_imap_connection -u \"$USER204$\" -p \"$USER205$\" -H \"imap.immae.eu:143\"";
193 };
194 chunk = ''
195 cp ${./plugins}/check_imap_connection $out/
196 patchShebangs $out/check_imap_connection
197 wrapProgram $out/check_imap_connection --prefix PATH : ${lib.makeBinPath [
198 pkgs.openssl
199 ]}
200 '';
201 };
202 megaraid = let
203 megacli = pkgs.megacli.overrideAttrs(old: { meta = old.meta // { license = null; }; });
204 in {
205 commands = {
206 check_megaraid = "$USER2$/check_megaraid_sas --sudo";
207 };
208 chunk = let
209 megaCliPlugin = pkgs.runCommand "megaCliPlugin" {
210 plugin = pkgs.fetchurl {
211 name = "check_megaraid_sas";
212 url = "https://exchange.nagios.org/components/com_mtree/attachment.php?link_id=6381&cf_id=24";
213 sha256 = "0yf60p4c0hb4q3fng9fc14qc89bqm0f1sijayzygadaqcl44jx4p";
214 };
215 } ''
216 mkdir $out
217 cp $plugin $out/check_megaraid_sas
218 chmod +x $out/check_megaraid_sas
219 patchShebangs $out
220 substituteInPlace $out/check_megaraid_sas --replace /usr/sbin/MegaCli ${megacli}/bin/MegaCli64
221 substituteInPlace $out/check_megaraid_sas --replace 'sudo $megacli' '${sudo} $megacli'
222 sed -i -e "s/use utils qw(%ERRORS);/my %ERRORS = ('OK' => 0, 'WARNING' => 1, 'CRITICAL' => 2, 'UNKNOWN' => 3);/" $out/check_megaraid_sas
223 '';
224 in ''
225 cp ${megaCliPlugin}/check_megaraid_sas $out/
226 patchShebangs $out/check_megaraid_sas
227 '';
228 sudo = _: {
229 commands = [
230 { command = "${megacli}/bin/MegaCli64"; options = [ "NOPASSWD" ]; }
231 ];
232 runAs = "root";
233 };
234 };
235 memory = {
236 commands = {
237 check_memory = "$USER2$/check_mem.sh -w $ARG1$ -c $ARG2$";
238 };
239 chunk = ''
240 cp ${./plugins}/check_mem.sh $out/
241 patchShebangs $out/check_mem.sh
242 wrapProgram $out/check_mem.sh --prefix PATH : ${lib.makeBinPath [
243 pkgs.gnugrep pkgs.gawk pkgs.procps-ng
244 ]}
245 '';
246 };
247 mysql = {
248 commands = {
249 check_mysql_replication = "${sudo} -u mysql $USER2$/check_mysql_replication \"$ARG1$\" \"$ARG2$\"";
250 };
251 chunk = ''
252 cp ${./plugins}/check_mysql_replication $out/
253 patchShebangs $out/check_mysql_replication
254 wrapProgram $out/check_mysql_replication --prefix PATH : ${lib.makeBinPath [
255 pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.mariadb
256 ]}
257 '';
258 sudo = myplugins: {
259 commands = [
260 { command = "${myplugins}/check_mysql_replication *"; options = [ "NOPASSWD" ]; }
261 ];
262 runAs = "mysql";
263 };
264 };
265 openldap = {
266 commands = {
267 check_openldap_replication = "${sudo} -u openldap $USER2$/check_openldap_replication \"$ARG1$\" \"$ARG2$\" \"$ARG3$\" \"$ARG4$\" \"$ARG5$\"";
268 };
269 chunk = ''
270 cp ${./plugins}/check_openldap_replication $out/
271 patchShebangs $out/check_openldap_replication
272 wrapProgram $out/check_openldap_replication --prefix PATH : ${lib.makeBinPath [
273 pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.openldap
274 ]}
275 '';
276 sudo = myplugins: {
277 commands = [
278 { command = "${myplugins}/check_openldap_replication *"; options = [ "NOPASSWD" ]; }
279 ];
280 runAs = "openldap";
281 };
282 };
283 ovh = {
284 resources = {
285 USER209 = builtins.concatStringsSep "," [
286 config.myEnv.monitoring.ovh_sms.endpoint
287 config.myEnv.monitoring.ovh_sms.application_key
288 config.myEnv.monitoring.ovh_sms.application_secret
289 config.myEnv.monitoring.ovh_sms.consumer_key
290 config.myEnv.monitoring.ovh_sms.account
291 ];
292 };
293 commands = {
294 check_backup_ovh_age = "$USER2$/check_backup_ovh_age $ARG1$";
295 check_ovh_sms = "$USER2$/check_ovh_sms \"$USER209$\"";
296 };
297 chunk = ''
298 cp ${./plugins}/check_backup_age $out/check_backup_ovh_age
299 patchShebangs $out/check_backup_ovh_age
300 wrapProgram $out/check_backup_ovh_age --prefix PATH : ${lib.makeBinPath [
301 pkgs.duplicity
302 ]} --set SECRETS_PATH ${lib.optionalString cfg.master config.secrets.fullPaths."ovh_access_key"}
303 cp ${./plugins}/check_ovh_sms $out/
304 patchShebangs $out/check_ovh_sms
305 wrapProgram $out/check_ovh_sms --prefix PATH : ${lib.makeBinPath [
306 (pkgs.python3.withPackages (ps: [ps.ovh]))
307 ]}
308 '';
309 };
310 postgresql = {
311 commands = {
312 check_postgresql_replication = "${sudo} -u postgres $USER2$/check_postgres_replication \"$ARG1$\" \"$ARG2$\" \"$ARG3$\"";
313 check_postgresql_database_count = "$USER2$/check_postgres_database_count \"$ARG1$\" \"$ARG2$\" \"$ARG3$\"";
314 };
315 chunk = let
316 postgresqlBinary = if config.myServices.databasesReplication.postgresql.enable
317 then config.myServices.databasesReplication.postgresql.mainPackage
318 else if config.myServices.databases.enable
319 then config.myServices.databases.postgresql.package
320 else pkgs.postgresql;
321 in ''
322 cp ${./plugins}/check_postgres_replication $out/
323 patchShebangs $out/check_postgres_replication
324 wrapProgram $out/check_postgres_replication --prefix PATH : ${lib.makeBinPath [
325 postgresqlBinary
326 ]}
327 cp ${./plugins}/check_postgres_database_count $out/
328 patchShebangs $out/check_postgres_database_count
329 wrapProgram $out/check_postgres_database_count --prefix PATH : ${lib.makeBinPath [
330 postgresqlBinary
331 ]}
332 '';
333
334 sudo = myplugins: {
335 commands = [
336 { command = "${myplugins}/check_postgres_replication *"; options = [ "NOPASSWD" ]; }
337 ];
338 runAs = "postgres";
339 };
340 };
341 redis = {
342 commands = {
343 check_redis_replication = "${sudo} -u redis $USER2$/check_redis_replication \"$ARG1$\"";
344 };
345 chunk = ''
346 cp ${./plugins}/check_redis_replication $out/
347 patchShebangs $out/check_redis_replication
348 wrapProgram $out/check_redis_replication --prefix PATH : ${lib.makeBinPath [
349 pkgs.gnugrep pkgs.coreutils pkgs.redis
350 ]}
351 '';
352 sudo = myplugins: {
353 commands = [
354 { command = "${myplugins}/check_redis_replication *"; options = [ "NOPASSWD" ]; }
355 ];
356 runAs = "redis";
357 };
358 };
359 tcp = {
360 commands = {
361 check_tcp = "$USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$ -e \"$ARG2$\" -Mcrit";
362 check_tcp_ssl = "$USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$ -S -D 21,15";
363 };
364 };
365 zfs = {
366 commands = {
367 check_zfs = "$USER2$/check_zpool.sh -p ALL -w 80 -c 90";
368 check_zfs_snapshot = "$USER2$/check_zfs_snapshot -d $ARG1$ -c 18000 -w 14400";
369 };
370 chunk = let
371 zfsPlugin = pkgs.fetchurl {
372 url = "https://www.claudiokuenzler.com/monitoring-plugins/check_zpools.sh";
373 sha256 = "0p9ms9340in80jkds4kfspw62xnzsv5s7ni9m28kxyd0bnzkbzhf";
374 };
375 in ''
376 cp ${zfsPlugin} $out/check_zpool.sh
377 chmod +x $out/check_zpool.sh
378 patchShebangs $out/check_zpool.sh
379 wrapProgram $out/check_zpool.sh --prefix PATH : ${lib.makeBinPath [
380 pkgs.which pkgs.zfs pkgs.gawk
381 ]}
382 cp ${./plugins}/check_zfs_snapshot $out
383 patchShebangs $out/check_zfs_snapshot
384 wrapProgram $out/check_zfs_snapshot --prefix PATH : ${lib.makeBinPath [
385 pkgs.zfs pkgs.coreutils pkgs.gawk pkgs.gnugrep
386 ]}
387 '';
388 };
389}
diff --git a/modules/private/monitoring/objects_backup-2.nix b/modules/private/monitoring/objects_backup-2.nix
deleted file mode 100644
index 28032a4..0000000
--- a/modules/private/monitoring/objects_backup-2.nix
+++ /dev/null
@@ -1,111 +0,0 @@
1{ config, pkgs, lib, hostFQDN, emailCheck, ... }:
2let
3 defaultPassiveInfo = {
4 filter = lib.attrsets.filterAttrs
5 (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_");
6 use = "external-passive-service";
7 freshness_threshold = "450";
8 retry_interval = "1";
9 servicegroups = "webstatus-resources";
10 host_name = hostFQDN;
11 };
12in
13{
14 activatedPlugins = [ "file_date" "mysql" "openldap" "redis" "emails" ];
15 service = [
16 (emailCheck "backup-2" hostFQDN // {
17 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; freshness_threshold = "1350"; };
18 })
19 {
20 passiveInfo = defaultPassiveInfo;
21 service_description = "Size on /backup2 partition";
22 use = "local-service";
23 check_command = ["check_local_disk" "10%" "5%" "/backup2"];
24 }
25 {
26 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; };
27 service_description = "Last backup in /backup2/phare is not too old";
28 use = "local-service";
29 check_command = ["check_last_file_date" "/backup2/phare" "14" "backup"];
30 }
31 {
32 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; };
33 service_description = "Last backup in /backup2/dilion is not too old";
34 use = "local-service";
35 check_command = ["check_last_file_date" "/backup2/dilion" "14" "backup"];
36 }
37 {
38 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-backup"; };
39 service_description = "Last backup in /backup2/ulminfo is not too old";
40 use = "local-service";
41 check_command = ["check_last_file_date" "/backup2/ulminfo" "14" "backup"];
42 }
43 {
44 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; };
45 service_description = "Last postgresql dump in /backup2/eldiron/postgresql_backup is not too old";
46 use = "local-service";
47 check_command = ["check_last_file_date" "/backup2/eldiron/postgresql_backup" "7" "postgres"];
48 }
49 {
50 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; };
51 service_description = "Redis replication for eldiron is up to date";
52 use = "local-service";
53 check_command = ["check_redis_replication" "/run/redis_eldiron/redis.sock"];
54 }
55 {
56 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; };
57 service_description = "Last redis dump in /backup2/eldiron/redis_backup is not too old";
58 use = "local-service";
59 check_command = ["check_last_file_date" "/backup2/eldiron/redis_backup" "7" "redis"];
60 }
61 {
62 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; };
63 service_description = "Mysql replication for eldiron is up to date";
64 use = "local-service";
65 check_command = ["check_mysql_replication" "/run/mysqld_eldiron/mysqld.sock" config.secrets.fullPaths."mysql_replication/eldiron/client"];
66 }
67 {
68 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; };
69 service_description = "Last mysql dump in /backup2/eldiron/mysql_backup is not too old";
70 use = "local-service";
71 check_command = ["check_last_file_date" "/backup2/eldiron/mysql_backup" "7" "mysql"];
72 }
73 {
74 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; };
75 service_description = "Openldap replication for eldiron is up to date";
76 use = "local-service";
77 check_command = let
78 name = "eldiron";
79 hcfg = config.myServices.databasesReplication.openldap.hosts.eldiron;
80 base = config.myServices.databasesReplication.openldap.base;
81 eldiron_schemas = pkgs.callPackage ../databases/openldap/eldiron_schemas.nix {};
82 ldapConfig = pkgs.writeText "slapd.conf" ''
83 include ${pkgs.openldap}/etc/schema/core.schema
84 include ${pkgs.openldap}/etc/schema/cosine.schema
85 include ${pkgs.openldap}/etc/schema/inetorgperson.schema
86 include ${pkgs.openldap}/etc/schema/nis.schema
87 ${eldiron_schemas}
88 moduleload back_hdb
89 backend hdb
90 database hdb
91
92 suffix "${hcfg.base}"
93 directory ${base}/${name}/openldap
94 '';
95 in [
96 "check_openldap_replication"
97 hcfg.url
98 hcfg.dn
99 config.secrets.fullPaths."openldap_replication/eldiron/replication_password"
100 hcfg.base
101 ldapConfig
102 ];
103 }
104 {
105 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases,webstatus-backup"; };
106 service_description = "Last openldap dump in /backup2/eldiron/openldap_backup is not too old";
107 use = "local-service";
108 check_command = ["check_last_file_date" "/backup2/eldiron/openldap_backup" "7" "openldap"];
109 }
110 ];
111}
diff --git a/modules/private/monitoring/objects_common.nix b/modules/private/monitoring/objects_common.nix
deleted file mode 100644
index 7c9f642..0000000
--- a/modules/private/monitoring/objects_common.nix
+++ /dev/null
@@ -1,253 +0,0 @@
1{ hostFQDN
2, hostName
3, interface ? "eth0"
4, processWarn ? "250"
5, processAlert ? "400"
6, loadWarn ? "0.9"
7, load5Warn ? loadWarn
8, load15Warn ? load5Warn
9, loadAlert ? "1.0"
10, load5Alert ? loadAlert
11, load15Alert ? load5Alert
12, mdadm
13, master
14, lib
15, mypluginsConfig
16, ...
17}:
18let
19 defaultPassiveInfo = {
20 filter = lib.attrsets.filterAttrs
21 (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_");
22 use = "external-passive-service";
23 freshness_threshold = "450";
24 retry_interval = "1";
25 servicegroups = "webstatus-resources";
26 host_name = hostFQDN;
27 };
28in
29{
30 host = {
31 "${hostFQDN}" = {
32 alias = hostFQDN;
33 address = hostFQDN;
34 use = "linux-server";
35 hostgroups = "webstatus-hosts";
36 _webstatus_name = hostName;
37 _webstatus_vhost = "status.immae.eu";
38 };
39 };
40 service = [
41 {
42 passiveInfo = defaultPassiveInfo;
43 service_description = "Size on root partition";
44 use = "local-service";
45 check_command = ["check_local_disk" "20%" "10%" "/"];
46 }
47 {
48 passiveInfo = defaultPassiveInfo;
49 service_description = "Total number of process";
50 use = "local-service";
51 check_command = [
52 "check_local_procs"
53 processWarn
54 processAlert
55 "RSZDT"
56 ];
57 }
58 {
59 passiveInfo = defaultPassiveInfo;
60 service_description = "Network bandwidth";
61 use = "local-service";
62 check_interval = "2";
63 max_check_attempts = "20";
64 retry_interval = "2";
65 check_command = [
66 "check_local_bandwidth"
67 interface
68 "20480" # kb/s
69 "51200" # kb/s
70 ];
71 }
72 {
73 passiveInfo = defaultPassiveInfo;
74 service_description = "Average load";
75 use = "local-service";
76 check_command = [
77 "check_local_load"
78 "${loadWarn},${load5Warn},${load15Warn}"
79 "${loadAlert},${load5Alert},${load15Alert}"
80 ];
81 }
82 {
83 passiveInfo = defaultPassiveInfo;
84 service_description = "Swap usage";
85 use = "local-service";
86 check_command = ["check_local_swap" "20" "10"];
87 }
88 {
89 passiveInfo = defaultPassiveInfo;
90 service_description = "Memory usage";
91 use = "local-service";
92 check_command = ["check_memory" "80" "90"];
93 }
94 {
95 passiveInfo = defaultPassiveInfo;
96 service_description = "NTP is activated and working";
97 use = "local-service";
98 check_command = ["check_ntp"];
99 }
100 {
101 passiveInfo = defaultPassiveInfo;
102 service_description = "No mdadm array is degraded";
103 use = "local-service";
104 check_command = [
105 "check_command_output"
106 "${mdadm}/bin/mdadm --monitor --scan -1"
107 "^$"
108 "-s 0 -r root"
109 ];
110 }
111 ];
112 command = lib.foldr (v: o: o // (v.commands or {})) {} (builtins.attrValues mypluginsConfig) // {
113 check_local_disk = "$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$";
114 check_local_procs = "$USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$";
115 check_local_load = "$USER1$/check_load -r -w $ARG1$ -c $ARG2$";
116 check_local_swap = "$USER1$/check_swap -n ok -w $ARG1$ -c $ARG2$";
117 check_ntp = "$USER1$/check_ntp_time -t 30 -q -H 0.arch.pool.ntp.org";
118 check_mailq = "$USER1$/check_mailq -s -w 1 -c 2";
119 check_smtp = "$USER1$/check_smtp -H $HOSTADDRESS$ -p 25 -S -D 21,15";
120
121 check_host_alive = "$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5";
122 check_ok = "$USER1$/check_dummy 0 \"Dummy OK\"";
123 check_critical = "$USER1$/check_dummy 2 \"Dummy CRITICAL\"";
124 };
125 timeperiod = {
126 "24x7" = {
127 alias = "24 Hours A Day, 7 Days A Week";
128 monday = "00:00-24:00";
129 tuesday = "00:00-24:00";
130 wednesday = "00:00-24:00";
131 thursday = "00:00-24:00";
132 friday = "00:00-24:00";
133 saturday = "00:00-24:00";
134 sunday = "00:00-24:00";
135 };
136 };
137 servicegroup = {
138 webstatus-webapps = { alias = "Web applications"; };
139 webstatus-websites = { alias = "Personal websites"; };
140 webstatus-ssl = { alias = "SSL certificates"; };
141 webstatus-dns = { alias = "DNS resolution"; };
142 webstatus-remote-services = { alias = "Other remote services"; };
143 webstatus-local-services = { alias = "Other local services"; };
144 webstatus-email = { alias = "E-mail services"; };
145 webstatus-resources = { alias = "Local resources"; };
146 webstatus-databases = { alias = "Databases resources"; };
147 webstatus-backup = { alias = "Backup resources"; };
148 };
149 hostgroup = {
150 webstatus-hosts = { alias = "Hosts"; };
151 };
152 contactgroup = {
153 admins = { alias = "Naemon Administrators"; };
154 };
155 templates = {
156 service = {
157 generic-service = {
158 active_checks_enabled = "1";
159 check_freshness = "0";
160 check_interval = "10";
161 check_period = "24x7";
162 contact_groups = "admins";
163 event_handler_enabled = "1";
164 flap_detection_enabled = "1";
165 is_volatile = "0";
166 max_check_attempts = "3";
167 notification_interval = "60";
168 notification_options = "w,u,c,r,f,s";
169 notification_period = "24x7";
170 notifications_enabled = if master then "1" else "0";
171 obsess_over_service = "1";
172 passive_checks_enabled = "1";
173 process_perf_data = "1";
174 retain_nonstatus_information = "1";
175 retain_status_information = "1";
176 retry_interval = "2";
177 _webstatus_namespace = "immae";
178 };
179 local-service = {
180 use = "generic-service";
181 host_name = hostFQDN;
182 check_interval = "5";
183 max_check_attempts = "4";
184 retry_interval = "1";
185 servicegroups = "webstatus-resources";
186 };
187 external-service = {
188 use = "generic-service";
189 check_interval = "5";
190 max_check_attempts = "4";
191 retry_interval = "1";
192 };
193 web-service = {
194 use = "generic-service";
195 check_interval = "20";
196 max_check_attempts = "2";
197 retry_interval = "1";
198 };
199 external-web-service = {
200 use = "generic-service";
201 check_interval = "20";
202 max_check_attempts = "2";
203 retry_interval = "1";
204 };
205 mail-service = {
206 use = "generic-service";
207 check_interval = "15";
208 max_check_attempts = "1";
209 retry_interval = "1";
210 };
211 dns-service = {
212 use = "generic-service";
213 check_interval = "120";
214 notification_interval = "120";
215 max_check_attempts = "5";
216 retry_interval = "5";
217 };
218 };
219 # No contact, we go through master
220 contact = {
221 generic-contact = {
222 host_notification_commands = "notify-host-by-email";
223 host_notification_options = "d,u,r,f,s";
224 host_notification_period = "24x7";
225 service_notification_commands = "notify-service-by-email";
226 service_notification_options = "w,u,c,r,f,s";
227 service_notification_period = "24x7";
228 };
229 };
230 host = {
231 generic-host = {
232 event_handler_enabled = "1";
233 flap_detection_enabled = "1";
234 notification_period = "24x7";
235 notifications_enabled = "1";
236 process_perf_data = "1";
237 retain_nonstatus_information = "1";
238 retain_status_information = "1";
239 };
240 linux-server = {
241 check_command = "check_host_alive";
242 check_interval = "5";
243 check_period = "24x7";
244 contact_groups = "admins";
245 max_check_attempts = "10";
246 notification_interval = "120";
247 notification_options = "d,u,r,f";
248 retry_interval = "1";
249 _webstatus_namespace = "immae";
250 };
251 };
252 };
253}
diff --git a/modules/private/monitoring/objects_dilion.nix b/modules/private/monitoring/objects_dilion.nix
deleted file mode 100644
index 16b3c64..0000000
--- a/modules/private/monitoring/objects_dilion.nix
+++ /dev/null
@@ -1,32 +0,0 @@
1{ lib, hostFQDN, emailCheck, ... }:
2let
3 defaultPassiveInfo = {
4 filter = lib.attrsets.filterAttrs
5 (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_");
6 use = "external-passive-service";
7 freshness_threshold = "450";
8 retry_interval = "1";
9 servicegroups = "webstatus-resources";
10 host_name = hostFQDN;
11 };
12 zfs_snapshot = name: {
13 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
14 service_description = "ZFS snapshot ${name} happened not too long ago";
15 use = "local-service";
16 check_command = ["check_zfs_snapshot" name];
17 };
18in
19{
20 activatedPlugins = [ "zfs" ];
21 service = [
22 {
23 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
24 service_description = "No ZFS pool is degraded";
25 use = "local-service";
26 check_command = ["check_zfs"];
27 }
28 (zfs_snapshot "zpool/backup/eldiron/zpool/root")
29 (zfs_snapshot "zpool/backup/eldiron/zpool/root/etc")
30 (zfs_snapshot "zpool/backup/eldiron/zpool/root/var")
31 ];
32}
diff --git a/modules/private/monitoring/objects_eban.nix b/modules/private/monitoring/objects_eban.nix
deleted file mode 100644
index df54f6a..0000000
--- a/modules/private/monitoring/objects_eban.nix
+++ /dev/null
@@ -1,70 +0,0 @@
1{ ... }:
2let
3 serviceTemplate = rest: {
4 host_name = "eban.bzh";
5 use = "external-web-service";
6 contacts = "eban";
7 contact_groups = "null";
8 check_interval = "15";
9
10 servicegroups = "webstatus-resources";
11 _webstatus_namespace = "eban";
12 } // rest;
13in
14{
15 activatedPlugins = [ "http" ];
16 contact = {
17 eban = {
18 use = "generic-contact";
19 host_notification_commands = "notify-host-eban-url";
20 service_notification_commands = "notify-service-eban-url";
21 };
22 };
23 host = {
24 "eban.bzh" = {
25 alias = "eban.bzh";
26 address = "eban.bzh";
27 use = "linux-server";
28 hostgroups = "webstatus-hosts";
29 contacts = "eban";
30 contact_groups = "null";
31 _webstatus_name = "Eban";
32 _webstatus_vhost = "status.eban.bzh";
33 _webstatus_namespace = "eban";
34 };
35 };
36 service = [
37 (serviceTemplate {
38 service_description = "Eban website is up and running";
39 check_command = ["check_https" "eban.bzh" "/" "<title>"];
40 _webstatus_name = "Main Website";
41 _webstatus_url = "https://eban.bzh/";
42 })
43 (serviceTemplate {
44 service_description = "Eban blog is up and running";
45 check_command = ["check_https" "blog.eban.bzh" "/" "<title>"];
46 _webstatus_name = "Blog";
47 _webstatus_url = "https://blog.eban.bzh/";
48 })
49 (serviceTemplate {
50 service_description = "Eban gitea is up and running";
51 check_command = ["check_https" "git.eban.bzh" "/" "<title>"];
52 _webstatus_name = "Git";
53 _webstatus_url = "https://git.eban.bzh/";
54 })
55 (serviceTemplate {
56 service_description = "I Learned website is up and running";
57 check_command = [ "check_https" "ilearned.eu.org" "/" "<title" ];
58
59 _webstatus_name = "I Learned website";
60 _webstatus_url = "https://ilearned.eu.org/";
61 })
62 (serviceTemplate {
63 service_description = "I Learned gitea is up and running";
64 check_command = [ "check_https" "git.ilearned.eu.org" "/" "<title" ];
65
66 _webstatus_name = "I Learned Git";
67 _webstatus_url = "https://git.ilearned.eu.org/";
68 })
69 ];
70}
diff --git a/modules/private/monitoring/objects_eldiron.nix b/modules/private/monitoring/objects_eldiron.nix
deleted file mode 100644
index 75e7b0e..0000000
--- a/modules/private/monitoring/objects_eldiron.nix
+++ /dev/null
@@ -1,38 +0,0 @@
1{ lib, hostFQDN, emailCheck, ... }:
2let
3 defaultPassiveInfo = {
4 filter = lib.attrsets.filterAttrs
5 (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_");
6 use = "external-passive-service";
7 freshness_threshold = "450";
8 retry_interval = "1";
9 servicegroups = "webstatus-resources";
10 host_name = hostFQDN;
11 };
12in
13{
14 activatedPlugins = [ "emails" "postgresql" "zfs" ];
15 service = [
16 {
17 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-databases"; };
18 service_description = "Postgresql replication for backup-2 is up to date";
19 use = "local-service";
20 check_command = ["check_postgresql_replication" "backup-2" "/run/postgresql" "5432"];
21 }
22 {
23 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
24 service_description = "No ZFS pool is degraded";
25 use = "local-service";
26 check_command = ["check_zfs"];
27 }
28 {
29 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; };
30 service_description = "mailq is empty";
31 use = "local-service";
32 check_command = ["check_mailq"];
33 }
34 (emailCheck "eldiron" hostFQDN // {
35 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-email"; freshness_threshold = "1350"; };
36 })
37 ];
38}
diff --git a/modules/private/monitoring/objects_master.nix b/modules/private/monitoring/objects_master.nix
deleted file mode 100644
index 30bfe73..0000000
--- a/modules/private/monitoring/objects_master.nix
+++ /dev/null
@@ -1,39 +0,0 @@
1{ config, ... }:
2{
3 contact = {
4 immae = config.myEnv.monitoring.contacts.immae // {
5 use = "generic-contact";
6 contactgroups = "admins";
7 host_notification_commands = "notify-host-by-email,notify-by-slack!$USER206$!$USER207$";
8 service_notification_commands = "notify-service-by-email,notify-by-slack!$USER206$!$USER207$";
9 };
10 };
11 command = {
12 check_passive = "$USER1$/check_dummy 3 \"Service result are stale\"";
13 };
14 templates = {
15 service = {
16 external-passive-service = {
17 active_checks_enabled = "0";
18 check_freshness = "1";
19 check_period = "24x7";
20 contact_groups = "admins";
21 event_handler_enabled = "1";
22 flap_detection_enabled = "1";
23 is_volatile = "0";
24 max_check_attempts = "3";
25 notification_interval = "60";
26 notification_options = "w,u,c,r,f,s";
27 notification_period = "24x7";
28 notifications_enabled = "1";
29 passive_checks_enabled = "1";
30 process_perf_data = "1";
31 retain_nonstatus_information = "1";
32 retain_status_information = "1";
33 retry_interval = "2";
34 check_command = "check_passive";
35 _webstatus_namespace = "immae";
36 };
37 };
38 };
39}
diff --git a/modules/private/monitoring/objects_monitoring-1.nix b/modules/private/monitoring/objects_monitoring-1.nix
deleted file mode 100644
index 563be16..0000000
--- a/modules/private/monitoring/objects_monitoring-1.nix
+++ /dev/null
@@ -1,714 +0,0 @@
1{ config, pkgs, nodes, hostFQDN, emailCheck, lib, ... }:
2{
3 activatedPlugins = [ "dns" "ftp" "git" "http" "imap" "ovh" "tcp" ];
4 host = {
5 # Dummy host for testing
6 # "dummy-host" = {
7 # alias = "dummy.host";
8 # address = "dummy.host";
9 # use = "linux-server";
10 # check_command = "check_ok";
11 # };
12 };
13 service = [
14 # Dummy service for testing
15 # {
16 # service_description = "Dummy failing test";
17 # host_name = "dummy-host";
18 # use = "local-service";
19 # check_interval = "0.3";
20 # max_check_attempts = "1";
21 # flap_detection_enabled = "0";
22 # notification_interval = "0.1";
23 # check_command = "check_critical";
24 # }
25
26 (emailCheck "monitoring-1" hostFQDN)
27
28 {
29 service_description = "ftp has access to database for authentication";
30 host_name = "eldiron.immae.eu";
31 use = "external-service";
32 check_command = "check_ftp_database";
33
34 servicegroups = "webstatus-remote-services";
35 _webstatus_name = "FTP";
36 _webstatus_url = "ftp.immae.eu";
37 }
38
39 {
40 service_description = "gitolite is working";
41 host_name = "eldiron.immae.eu";
42 use = "external-web-service";
43 check_command = "check_git";
44
45 servicegroups = "webstatus-remote-services";
46 _webstatus_name = "Git";
47 _webstatus_url = "git.immae.eu";
48 }
49
50 {
51 service_description = "postfix SSL is up to date";
52 host_name = "eldiron.immae.eu";
53 use = "external-service";
54 check_command = "check_smtp";
55
56 servicegroups = "webstatus-ssl";
57 _webstatus_name = "SMTP";
58 _webstatus_url = "smtp.immae.eu";
59 }
60
61 {
62 service_description = "imap SSL is up to date";
63 host_name = "eldiron.immae.eu";
64 use = "external-service";
65 check_command = ["check_tcp_ssl" "993"];
66
67 servicegroups = "webstatus-ssl";
68 _webstatus_name = "IMAP";
69 _webstatus_url = "imap.immae.eu";
70 }
71
72 {
73 service_description = "imap connection works";
74 host_name = "eldiron.immae.eu";
75 use = "external-service";
76 check_command = "check_imap_connection";
77
78 servicegroups = "webstatus-remote-services,webstatus-email";
79 _webstatus_name = "IMAP";
80 _webstatus_url = "imap.immae.eu";
81 }
82
83 # Third party services
84 {
85 service_description = "OVH account has enough sms";
86 host_name = "eldiron.immae.eu";
87 use = "external-service";
88 check_command = "check_ovh_sms";
89
90 check_interval = "120";
91 notification_interval = "1440";
92 }
93
94 # Backup services
95 # {
96 # service_description = "eriomem backup is up and not full";
97 # host_name = "eldiron.immae.eu";
98 # use = "external-service";
99 # check_command = "check_backup_eriomem";
100
101 # check_interval = "120";
102 # notification_interval = "1440";
103
104 # servicegroups = "webstatus-backup";
105 # }
106 {
107 service_description = "ovh backup is up and not full";
108 host_name = "eldiron.immae.eu";
109 use = "external-service";
110 check_command = "check_ok";
111
112 check_interval = "120";
113 notification_interval = "1440";
114
115 servicegroups = "webstatus-backup";
116 }
117
118 # DNS services
119 {
120 service_description = "eldiron dns is active and authoritative for aten.pro";
121 host_name = "eldiron.immae.eu";
122 use = "dns-service";
123 check_command = ["check_dns" "aten.pro" "-A"];
124
125 servicegroups = "webstatus-dns";
126 _webstatus_name = "aten.pro";
127 }
128
129 {
130 service_description = "eldiron dns is active and authoritative for bouya.org";
131 host_name = "eldiron.immae.eu";
132 use = "dns-service";
133 check_command = ["check_dns" "bouya.org" "-A"];
134
135 servicegroups = "webstatus-dns";
136 _webstatus_name = "bouya.org";
137 }
138
139 {
140 service_description = "eldiron dns is active and authoritative for filedesreves.fr";
141 host_name = "eldiron.immae.eu";
142 use = "dns-service";
143 check_command = ["check_dns" "filedesreves.fr" "-A"];
144
145 servicegroups = "webstatus-dns";
146 _webstatus_name = "filedesreves.fr";
147 }
148
149 {
150 service_description = "eldiron dns is active and authoritative for ludivinecassal.com";
151 host_name = "eldiron.immae.eu";
152 use = "dns-service";
153 check_command = ["check_dns" "ludivinecassal.com" "-A"];
154
155 servicegroups = "webstatus-dns";
156 _webstatus_name = "ludivinecassal.com";
157 }
158
159 {
160 service_description = "eldiron dns is active and authoritative for icommandeur.org";
161 host_name = "eldiron.immae.eu";
162 use = "dns-service";
163 check_command = ["check_dns" "icommandeur.org" "-A"];
164
165 servicegroups = "webstatus-dns";
166 _webstatus_name = "icommandeur.org";
167 }
168
169 {
170 service_description = "eldiron dns is active and authoritative for immae.eu";
171 host_name = "eldiron.immae.eu";
172 use = "dns-service";
173 check_command = ["check_dns" "immae.eu" "-A"];
174
175 servicegroups = "webstatus-dns";
176 _webstatus_name = "immae.eu";
177 }
178
179 {
180 service_description = "eldiron dns is active and authoritative for immae.fr";
181 host_name = "eldiron.immae.eu";
182 use = "dns-service";
183 check_command = ["check_dns" "immae.fr" "-A"];
184
185 servicegroups = "webstatus-dns";
186 _webstatus_name = "immae.fr";
187 }
188
189 {
190 service_description = "eldiron dns is active and authoritative for piedsjaloux.fr";
191 host_name = "eldiron.immae.eu";
192 use = "dns-service";
193 check_command = ["check_dns" "piedsjaloux.fr" "-A"];
194
195 servicegroups = "webstatus-dns";
196 _webstatus_name = "piedsjaloux.fr";
197 }
198
199 {
200 service_description = "eldiron dns is active and authoritative for saison-photo.org";
201 host_name = "eldiron.immae.eu";
202 use = "dns-service";
203 check_command = ["check_dns" "saison-photo.org" "-A"];
204
205 servicegroups = "webstatus-dns";
206 _webstatus_name = "saison-photo.org";
207 }
208
209 {
210 service_description = "eldiron dns is active and authoritative for tellesflorian.com";
211 host_name = "eldiron.immae.eu";
212 use = "dns-service";
213 check_command = ["check_dns" "tellesflorian.com" "-A"];
214
215 servicegroups = "webstatus-dns";
216 _webstatus_name = "tellesflorian.com";
217 }
218
219 {
220 service_description = "eldiron dns is active and authoritative for capitaines.fr";
221 host_name = "eldiron.immae.eu";
222 use = "dns-service";
223 check_command = ["check_dns" "capitaines.fr" "-A"];
224
225 servicegroups = "webstatus-dns";
226 _webstatus_name = "capitaines.fr";
227 }
228
229 {
230 service_description = "cloudns dns is active and authoritative for aten.pro";
231 host_name = "eldiron.immae.eu";
232 use = "dns-service";
233 check_command = ["check_external_dns" "pns1.cloudns.net" "aten.pro" "-A"];
234
235 servicegroups = "webstatus-dns";
236 _webstatus_name = "aten.pro (Secondary DNS ClouDNS)";
237 }
238
239 {
240 service_description = "cloudns dns is active and authoritative for bouya.org";
241 host_name = "eldiron.immae.eu";
242 use = "dns-service";
243 check_command = ["check_external_dns" "pns1.cloudns.net" "bouya.org" "-A"];
244
245 servicegroups = "webstatus-dns";
246 _webstatus_name = "bouya.org (Secondary DNS ClouDNS)";
247 }
248
249 {
250 service_description = "cloudns dns is active and authoritative for filedesreves.fr";
251 host_name = "eldiron.immae.eu";
252 use = "dns-service";
253 check_command = ["check_external_dns" "pns1.cloudns.net" "filedesreves.fr" "-A"];
254
255 servicegroups = "webstatus-dns";
256 _webstatus_name = "filedesreves.fr (Secondary DNS ClouDNS)";
257 }
258
259 {
260 service_description = "cloudns dns is active and authoritative for ludivinecassal.com";
261 host_name = "eldiron.immae.eu";
262 use = "dns-service";
263 check_command = ["check_external_dns" "pns1.cloudns.net" "ludivinecassal.com" "-A"];
264
265 servicegroups = "webstatus-dns";
266 _webstatus_name = "ludivinecassal.com (Secondary DNS ClouDNS)";
267 }
268
269 {
270 service_description = "cloudns dns is active and authoritative for icommandeur.org";
271 host_name = "eldiron.immae.eu";
272 use = "dns-service";
273 check_command = ["check_external_dns" "pns1.cloudns.net" "icommandeur.org" "-A"];
274
275 servicegroups = "webstatus-dns";
276 _webstatus_name = "icommandeur.org (Secondary DNS ClouDNS)";
277 }
278
279 {
280 service_description = "cloudns dns is active and authoritative for immae.eu";
281 host_name = "eldiron.immae.eu";
282 use = "dns-service";
283 check_command = ["check_external_dns" "pns1.cloudns.net" "immae.eu" "-A"];
284
285 servicegroups = "webstatus-dns";
286 _webstatus_name = "immae.eu (Secondary DNS ClouDNS)";
287 }
288
289 {
290 service_description = "cloudns dns is active and authoritative for immae.fr";
291 host_name = "eldiron.immae.eu";
292 use = "dns-service";
293 check_command = ["check_external_dns" "pns1.cloudns.net" "immae.fr" "-A"];
294
295 servicegroups = "webstatus-dns";
296 _webstatus_name = "immae.fr (Secondary DNS ClouDNS)";
297 }
298
299 {
300 service_description = "cloudns dns is active and authoritative for piedsjaloux.fr";
301 host_name = "eldiron.immae.eu";
302 use = "dns-service";
303 check_command = ["check_external_dns" "pns1.cloudns.net" "piedsjaloux.fr" "-A"];
304
305 servicegroups = "webstatus-dns";
306 _webstatus_name = "piedsjaloux.fr (Secondary DNS ClouDNS)";
307 }
308
309 {
310 service_description = "cloudns dns is active and authoritative for tellesflorian.com";
311 host_name = "eldiron.immae.eu";
312 use = "dns-service";
313 check_command = ["check_external_dns" "pns1.cloudns.net" "tellesflorian.com" "-A"];
314
315 servicegroups = "webstatus-dns";
316 _webstatus_name = "tellesflorian.com (Secondary DNS ClouDNS)";
317 }
318
319 {
320 service_description = "cloudns dns is active and authoritative for saison-photo.org";
321 host_name = "eldiron.immae.eu";
322 use = "dns-service";
323 check_command = ["check_external_dns" "pns1.cloudns.net" "saison-photo.org" "-A"];
324
325 servicegroups = "webstatus-dns";
326 _webstatus_name = "saison-photo.org (Secondary DNS ClouDNS)";
327 }
328
329 #### Web scenarios
330 {
331 service_description = "blog website is running on immae.eu";
332 host_name = "eldiron.immae.eu";
333 use = "external-web-service";
334 check_command = ["check_https" "www.immae.eu" "/blog/" "egrep -ri TODO /etc"];
335
336 servicegroups = "webstatus-websites";
337 _webstatus_name = "Immae’s Blog";
338 _webstatus_url = "https://www.immae.eu/blog";
339 }
340
341 {
342 service_description = "owncloud website is running on cloud.immae.eu";
343 host_name = "eldiron.immae.eu";
344 use = "external-web-service";
345 check_command = ["check_https" "cloud.immae.eu" "/" "a safe home for all your data"];
346
347 servicegroups = "webstatus-webapps";
348 _webstatus_name = "Nextcloud";
349 _webstatus_url = "https://cloud.immae.eu";
350 }
351
352 {
353 service_description = "nextcloud website is running on nextcloud.4c.salle-s.org";
354 host_name = "quatresaisons.immae.eu";
355 use = "external-web-service";
356 check_command = ["check_https" "nextcloud.4c.salle-s.org" "/" "a safe home for all your data"];
357
358 servicegroups = "webstatus-webapps";
359 _webstatus_name = "Nextcloud";
360 _webstatus_url = "https://nextcloud.4c.salle-s.org";
361 }
362
363 {
364 service_description = "davical website is running on dav.immae.eu";
365 host_name = "eldiron.immae.eu";
366 use = "external-web-service";
367 check_command = ["check_https" "dav.immae.eu" "/davical/" "Log On Please"];
368
369 servicegroups = "webstatus-webapps";
370 _webstatus_name = "Davical";
371 _webstatus_url = "https://dav.immae.eu/davical";
372 }
373
374 {
375 service_description = "adminer website is running on tools.immae.eu";
376 host_name = "eldiron.immae.eu";
377 use = "external-web-service";
378 check_command = ["check_https_auth" "tools.immae.eu" "/adminer/" "www.adminer.org"];
379
380 servicegroups = "webstatus-webapps";
381 _webstatus_name = "Adminer";
382 _webstatus_url = "https://tools.immae.eu/adminer/";
383 }
384
385 {
386 service_description = "ttrss website is running on tools.immae.eu";
387 host_name = "eldiron.immae.eu";
388 use = "external-web-service";
389 check_command = ["check_https" "tools.immae.eu" "/ttrss/" "<title>Tiny Tiny RSS"];
390
391 servicegroups = "webstatus-webapps";
392 _webstatus_name = "TT-RSS";
393 _webstatus_url = "https://tools.immae.eu/ttrss/";
394 }
395
396 {
397 service_description = "mpd website is running on tools.immae.eu";
398 host_name = "eldiron.immae.eu";
399 use = "external-web-service";
400 check_command = ["check_https_auth" "tools.immae.eu" "/mpd/" "<title>ympd"];
401
402 servicegroups = "webstatus-webapps";
403 _webstatus_name = "MPD (YMPD)";
404 _webstatus_url = "https://tools.immae.eu/mpd/";
405 }
406
407 {
408 service_description = "rompr mpd website is running on tools.immae.eu";
409 host_name = "eldiron.immae.eu";
410 use = "external-web-service";
411 check_command = ["check_https_auth" "tools.immae.eu" "/rompr/" "<title>RompЯ"];
412
413 servicegroups = "webstatus-webapps";
414 _webstatus_name = "MPD (ROMPR)";
415 _webstatus_url = "https://tools.immae.eu/rompr/";
416 }
417
418 {
419 service_description = "wallabag website is running on tools.immae.eu";
420 host_name = "eldiron.immae.eu";
421 use = "external-web-service";
422 check_command = ["check_https" "tools.immae.eu" "/wallabag/" "<title>Bienvenue sur wallabag"];
423
424 servicegroups = "webstatus-webapps";
425 _webstatus_name = "Wallabag";
426 _webstatus_url = "https://tools.immae.eu/wallabag/";
427 }
428
429 {
430 service_description = "yourl website is running on tools.immae.eu";
431 host_name = "eldiron.immae.eu";
432 use = "external-web-service";
433 check_command = ["check_https" "tools.immae.eu" "/url/admin/" "<title>YOURLS"];
434
435 servicegroups = "webstatus-webapps";
436 _webstatus_name = "YOURLS";
437 _webstatus_url = "https://tools.immae.eu/url/admin/";
438 }
439
440 {
441 service_description = "roundcube website is running on mail.immae.eu";
442 host_name = "eldiron.immae.eu";
443 use = "external-web-service";
444 check_command = ["check_https" "mail.immae.eu" "/roundcube/" "<title>Roundcube"];
445
446 servicegroups = "webstatus-webapps,webstatus-email";
447 _webstatus_name = "Roundcube";
448 _webstatus_url = "https://mail.immae.eu/roundcube/";
449 }
450
451 {
452 service_description = "dokuwiki website is running on tools.immae.eu";
453 host_name = "eldiron.immae.eu";
454 use = "external-web-service";
455 check_command = ["check_https" "tools.immae.eu" "/dokuwiki/" "<title>start"];
456
457 servicegroups = "webstatus-webapps";
458 _webstatus_name = "Dokuwiki";
459 _webstatus_url = "https://tools.immae.eu/dokuwiki/";
460 }
461
462 {
463 service_description = "shaarli website is running on tools.immae.eu";
464 host_name = "eldiron.immae.eu";
465 use = "external-web-service";
466 check_command = ["check_https" "tools.immae.eu" "/Shaarli/immae" "<title>Immae"];
467
468 servicegroups = "webstatus-webapps";
469 _webstatus_name = "Shaarli";
470 _webstatus_url = "https://tools.immae.eu/Shaarli/";
471 }
472
473 {
474 service_description = "ldap website is running on tools.immae.eu";
475 host_name = "eldiron.immae.eu";
476 use = "external-web-service";
477 check_command = ["check_https" "tools.immae.eu" "/ldap/" "<title>phpLDAPadmin"];
478
479 servicegroups = "webstatus-webapps";
480 _webstatus_name = "LDAP";
481 _webstatus_url = "https://tools.immae.eu/ldap/";
482 }
483
484 {
485 service_description = "gitweb website is running on git.immae.eu";
486 host_name = "eldiron.immae.eu";
487 use = "external-web-service";
488 check_command = ["check_https" "git.immae.eu" "/cgit" "<title>Immae’s git"];
489
490 servicegroups = "webstatus-webapps";
491 _webstatus_name = "Git";
492 _webstatus_url = "https://git.immae.eu/";
493 }
494
495 {
496 service_description = "mantisbt website is running on git.immae.eu";
497 host_name = "eldiron.immae.eu";
498 use = "external-web-service";
499 check_command = ["check_https" "git.immae.eu" "/mantisbt/" "<title>My View - MantisBT"];
500
501 servicegroups = "webstatus-webapps";
502 _webstatus_name = "Mantisbt";
503 _webstatus_url = "https://git.immae.eu/mantisbt";
504 }
505
506 {
507 service_description = "diaspora website is running on diaspora.immae.eu";
508 host_name = "eldiron.immae.eu";
509 use = "external-web-service";
510 check_command = ["check_https" "diaspora.immae.eu" "/" "is the online social world where you are in control"];
511
512 servicegroups = "webstatus-webapps";
513 _webstatus_name = "Diaspora";
514 _webstatus_url = "https://diaspora.immae.eu/";
515 }
516
517 {
518 service_description = "peertube website is running on peertube.immae.eu";
519 host_name = "eldiron.immae.eu";
520 use = "external-web-service";
521 check_command = ["check_https" "peertube.immae.eu" "/" "<title>Immae’s PeerTube"];
522
523 servicegroups = "webstatus-webapps";
524 _webstatus_name = "Peertube";
525 _webstatus_url = "https://peertube.immae.eu/";
526 }
527
528 {
529 service_description = "etherpad website is running on ether.immae.eu";
530 host_name = "eldiron.immae.eu";
531 use = "external-web-service";
532 check_command = ["check_https" "ether.immae.eu" "/" "<title>Etherpad"];
533
534 servicegroups = "webstatus-webapps";
535 _webstatus_name = "Etherpad";
536 _webstatus_url = "https://ether.immae.eu/";
537 }
538
539 {
540 service_description = "mediagoblin website is running on mgoblin.immae.eu";
541 host_name = "eldiron.immae.eu";
542 use = "external-web-service";
543 check_command = ["check_https" "mgoblin.immae.eu" "/" "<title>GNU MediaGoblin"];
544
545 servicegroups = "webstatus-webapps";
546 _webstatus_name = "Mediagoblin";
547 _webstatus_url = "https://mgoblin.immae.eu/";
548 }
549
550 {
551 service_description = "mastodon website is running on mastodon.immae.eu";
552 host_name = "eldiron.immae.eu";
553 use = "external-web-service";
554 check_command = ["check_https" "mastodon.immae.eu" "/" "Mastodon</title>"];
555
556 servicegroups = "webstatus-webapps";
557 _webstatus_name = "Mastodon";
558 _webstatus_url = "https://mastodon.immae.eu/";
559 }
560
561 # Other web pages
562 {
563 service_description = "Jerome website is running on naturaloutil.immae.eu";
564 host_name = "eldiron.immae.eu";
565 use = "external-web-service";
566 check_command = ["check_https" "naturaloutil.immae.eu" "/ping.php" "YES"];
567
568 servicegroups = "webstatus-websites";
569 _webstatus_name = "naturaloutil.immae.eu";
570 _webstatus_url = "https://naturaloutil.immae.eu/";
571 }
572
573 {
574 service_description = "Telio website is running on realistesmedia.fr";
575 host_name = "eldiron.immae.eu";
576 use = "external-web-service";
577 check_command = ["check_https" "realistesmedia.fr" "/" "doctype html"];
578 contact_groups = "telio-tortay";
579 }
580
581 {
582 service_description = "Chloe website site is running on osteopathe-cc.fr";
583 host_name = "eldiron.immae.eu";
584 use = "external-web-service";
585 check_command = ["check_https" "www.osteopathe-cc.fr" "/" "<title>Chloé Condamin ostéopathe D.O."];
586
587 servicegroups = "webstatus-websites";
588 _webstatus_name = "osteopathe-cc.fr";
589 _webstatus_url = "https://www.osteopathe-cc.fr/";
590 }
591
592 {
593 service_description = "Richie website is running on europe-richie.org";
594 host_name = "eldiron.immae.eu";
595 use = "external-web-service";
596 check_command = ["check_https" "www.europe-richie.org" "/" "<title>.Europe Richie]"];
597
598 servicegroups = "webstatus-websites";
599 _webstatus_name = "europe-richie.org";
600 _webstatus_url = "https://www.europe-richie.org/";
601 }
602
603 {
604 service_description = "Ludivine website site is running on ludivinecassal.com";
605 host_name = "eldiron.immae.eu";
606 use = "external-web-service";
607 check_command = ["check_https" "www.ludivinecassal.com" "/" "<title>Ludivine Cassal"];
608
609 servicegroups = "webstatus-websites";
610 _webstatus_name = "ludivinecassal.com";
611 _webstatus_url = "https://www.ludivinecassal.com/";
612 }
613
614 {
615 service_description = "Aten website site is running on aten.pro";
616 host_name = "eldiron.immae.eu";
617 use = "external-web-service";
618 check_command = ["check_https" "aten.pro" "/" "<title>ATEN"];
619
620 servicegroups = "webstatus-websites";
621 _webstatus_name = "aten.pro";
622 _webstatus_url = "https://aten.pro/";
623 }
624
625 {
626 service_description = "PiedsJaloux website site is running on piedsjaloux.fr";
627 host_name = "eldiron.immae.eu";
628 use = "external-web-service";
629 check_command = ["check_https" "www.piedsjaloux.fr" "/" "<title>Les Pieds Jaloux"];
630
631 servicegroups = "webstatus-websites";
632 _webstatus_name = "piedsjaloux.fr";
633 _webstatus_url = "https://www.piedsjaloux.fr/";
634 }
635
636 {
637 service_description = "Denise and Jerome website site is running on denisejerome.piedsjaloux.fr";
638 host_name = "eldiron.immae.eu";
639 use = "external-web-service";
640 check_command = ["check_https" "denisejerome.piedsjaloux.fr" "/" "<title>Accueil - Mariage"];
641
642 servicegroups = "webstatus-websites";
643 _webstatus_name = "denisejerome.piedsjaloux.fr";
644 _webstatus_url = "https://denisejerome.piedsjaloux.fr/";
645 }
646
647 {
648 service_description = "Connexionswing website site is running on connexionswing.com";
649 host_name = "eldiron.immae.eu";
650 use = "external-web-service";
651 check_command = ["check_https" "www.connexionswing.com" "/" "<title>Cours, stages"];
652
653 servicegroups = "webstatus-websites";
654 _webstatus_name = "connexionswing.com";
655 _webstatus_url = "https://www.connexionswing.com/";
656 }
657
658 {
659 service_description = "Sandetludo website site is running on sandetludo.com";
660 host_name = "eldiron.immae.eu";
661 use = "external-web-service";
662 check_command = ["check_https" "www.sandetludo.com" "/" "<title>Cours de West Coast"];
663
664 servicegroups = "webstatus-websites";
665 _webstatus_name = "sandetludo.com";
666 _webstatus_url = "https://www.sandetludo.com/";
667 }
668
669 # SSL
670 {
671 service_description = "ldap SSL is up to date";
672 host_name = "eldiron.immae.eu";
673 use = "external-service";
674 check_command = ["check_tcp_ssl" "636"];
675
676 servicegroups = "webstatus-ssl";
677 _webstatus_name = "LDAP";
678 _webstatus_url = "ldap.immae.eu";
679 }
680
681 # Tiboqorl
682 {
683 service_description = "Cyllene support page is running";
684 host_name = "tiboqorl.fr";
685 use = "external-web-service";
686 contact_groups = "tiboqorl";
687 check_command = [ "check_https" "sc.groupe-cyllene.com" "/" "<title>Support Client Cyllene" ];
688 _webstatus_namespace = "tiboqorl";
689 }
690
691 {
692 service_description = "Origny page is running";
693 host_name = "tiboqorl.fr";
694 use = "external-web-service";
695 contact_groups = "tiboqorl";
696 check_command = [ "check_https" "origny.tiboqorl.fr" "/" "<title>Home Assistant" ];
697 _webstatus_namespace = "tiboqorl";
698 }
699 ];
700 contact = {
701 telio-tortay = config.myEnv.monitoring.contacts.telio-tortay // {
702 use = "generic-contact";
703 contactgroups = "telio-tortay";
704 };
705 thibault = config.myEnv.monitoring.contacts.thibault // {
706 use = "generic-contact";
707 contactgroups = "tiboqorl";
708 };
709 };
710 contactgroup = {
711 telio-tortay = { alias = "Telio Tortay"; members = "immae"; };
712 tiboqorl = { alias = "Tiboqorl"; members = "immae"; };
713 };
714}
diff --git a/modules/private/monitoring/objects_phare.nix b/modules/private/monitoring/objects_phare.nix
deleted file mode 100644
index 082e7e3..0000000
--- a/modules/private/monitoring/objects_phare.nix
+++ /dev/null
@@ -1,17 +0,0 @@
1{ emailCheck, ... }:
2{
3 activatedPlugins = [ "emails" ];
4 host = {
5 "phare.normalesup.org" = {
6 alias = "phare.normalesup.org";
7 address = "phare.normalesup.org";
8 use = "linux-server";
9 hostgroups = "webstatus-hosts";
10 _webstatus_name = "phare";
11 _webstatus_vhost = "status.immae.eu";
12 };
13 };
14 service = [
15 (emailCheck "phare" "phare.normalesup.org")
16 ];
17}
diff --git a/modules/private/monitoring/objects_quatresaisons.nix b/modules/private/monitoring/objects_quatresaisons.nix
deleted file mode 100644
index f30cf81..0000000
--- a/modules/private/monitoring/objects_quatresaisons.nix
+++ /dev/null
@@ -1,38 +0,0 @@
1{ lib, hostFQDN, emailCheck, openldap, ... }:
2let
3 defaultPassiveInfo = {
4 filter = lib.attrsets.filterAttrs
5 (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_");
6 use = "external-passive-service";
7 freshness_threshold = "450";
8 retry_interval = "1";
9 servicegroups = "webstatus-resources";
10 host_name = hostFQDN;
11 };
12in
13{
14 resources = {
15 USER212 = "{{ .monitoring.quatresaisons.naemon_ldap }}";
16 };
17 activatedPlugins = [ "megaraid" "command" "postgresql" ];
18 service = [
19 {
20 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
21 service_description = "No RAID device is degraded";
22 use = "local-service";
23 check_command = ["check_megaraid"];
24 }
25 {
26 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
27 service_description = "LDAP is running";
28 use = "local-service";
29 check_command = [ "check_command_status" "${openldap}/bin/ldapwhoami -D uid=naemon,ou=services,dc=salle-s,dc=org -w $USER212$" "0" ""];
30 }
31 {
32 passiveInfo = defaultPassiveInfo // { servicegroups = "webstatus-resources"; };
33 service_description = "Postgresql is running";
34 use = "local-service";
35 check_command = [ "check_postgresql_database_count" "/run/postgresql" "5432" "3" ];
36 }
37 ];
38}
diff --git a/modules/private/monitoring/objects_tiboqorl-fr.nix b/modules/private/monitoring/objects_tiboqorl-fr.nix
deleted file mode 100644
index b49a1d8..0000000
--- a/modules/private/monitoring/objects_tiboqorl-fr.nix
+++ /dev/null
@@ -1,174 +0,0 @@
1{ lib, ... }:
2let
3 hostFQDN = "tiboqorl.fr";
4 defaultPassiveInfo = {
5 filter = lib.attrsets.filterAttrs
6 (k: v: builtins.elem k ["service_description"] || builtins.substring 0 1 k == "_");
7 use = "external-passive-service";
8 contact_groups = "tiboqorl";
9 freshness_threshold = "450";
10 notification_interval = "240";
11 retry_interval = "1";
12 servicegroups = "webstatus-resources";
13 _webstatus_namespace = "tiboqorl";
14 host_name = hostFQDN;
15 };
16in
17{
18 host = {
19 "tiboqorl.fr" = {
20 alias = "tiboqorl.fr";
21 address = "tiboqorl.fr";
22 use = "linux-server";
23 contact_groups = "tiboqorl";
24 hostgroups = "webstatus-hosts";
25 _webstatus_name = "tiboqorl";
26 _webstatus_vhost = "status.immae.eu";
27 _webstatus_namespace = "tiboqorl";
28 };
29 };
30 service = [
31 {
32 passiveInfo = defaultPassiveInfo;
33 service_description = "Size on root partition";
34 use = "local-service";
35 check_command = ["check_local_disk" "20%" "10%" "/"];
36 }
37 {
38 passiveInfo = defaultPassiveInfo;
39 service_description = "Total number of process";
40 use = "local-service";
41 check_command = [ "check_local_procs" "250" "400" "RSZDT" ];
42 }
43 {
44 passiveInfo = defaultPassiveInfo;
45 service_description = "Network bandwidth";
46 use = "local-service";
47 check_interval = "2";
48 max_check_attempts = "20";
49 retry_interval = "2";
50 check_command = [
51 "check_local_bandwidth"
52 "eth0"
53 "20480" # kb/s
54 "51200" # kb/s
55 ];
56 }
57 {
58 passiveInfo = defaultPassiveInfo;
59 service_description = "Average load";
60 use = "local-service";
61 check_command = [
62 "check_local_load"
63 "0.75,0.75,0.75" # warn
64 "1.0,1.0,1.0" # alert
65 ];
66 }
67 {
68 passiveInfo = defaultPassiveInfo;
69 service_description = "Swap usage";
70 use = "local-service";
71 check_command = ["check_local_swap" "20" "10"];
72 }
73 {
74 passiveInfo = defaultPassiveInfo;
75 service_description = "Memory usage";
76 use = "local-service";
77 check_command = ["check_memory" "80" "90"];
78 }
79 {
80 passiveInfo = defaultPassiveInfo;
81 service_description = "NTP is activated and working";
82 use = "local-service";
83 check_command = ["check_ntp"];
84 }
85 ];
86 command = {
87 check_local_disk = "$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$";
88 check_local_procs = "$USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$";
89 check_local_load = "$USER1$/check_load -w $ARG1$ -c $ARG2$";
90 check_local_swap = "$USER1$/check_swap -n ok -w $ARG1$ -c $ARG2$";
91 check_local_bandwidth = "$USER2$/check_bandwidth -i=$ARG1$ -w $ARG2$ -c $ARG3$";
92 check_memory = "$USER2$/check_mem.sh -w $ARG1$ -c $ARG2$";
93 check_ntp = "$USER1$/check_ntp_time -t 30 -q -H 0.arch.pool.ntp.org";
94
95 check_host_alive = "$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5";
96
97 notify-master = "$USER2$/send_nrdp.sh -u \"$USER200$\" -t \"$USER201$\" -H \"$HOSTADDRESS$\" -s \"$SERVICEDESC$\" -S \"$SERVICESTATEID$\" -o \"$SERVICEOUTPUT$ | $SERVICEPERFDATA$\"";
98 };
99 timeperiod = {
100 "24x7" = {
101 alias = "24 Hours A Day, 7 Days A Week";
102 monday = "00:00-24:00";
103 tuesday = "00:00-24:00";
104 wednesday = "00:00-24:00";
105 thursday = "00:00-24:00";
106 friday = "00:00-24:00";
107 saturday = "00:00-24:00";
108 sunday = "00:00-24:00";
109 };
110 };
111 servicegroup = {
112 webstatus-resources = { alias = "Local resources"; };
113 };
114 hostgroup = {
115 webstatus-hosts = { alias = "Hosts"; };
116 };
117 contactgroup = {
118 tiboqorl = { alias = "Naemon Administrators"; };
119 };
120 templates = {
121 service = {
122 generic-service = {
123 active_checks_enabled = "1";
124 check_freshness = "0";
125 check_interval = "10";
126 check_period = "24x7";
127 contact_groups = "tiboqorl";
128 event_handler_enabled = "1";
129 flap_detection_enabled = "1";
130 is_volatile = "0";
131 max_check_attempts = "3";
132 notification_interval = "60";
133 notification_options = "w,u,c,r,f,s";
134 notification_period = "24x7";
135 notifications_enabled = "0";
136 obsess_over_service = "1";
137 passive_checks_enabled = "1";
138 process_perf_data = "1";
139 retain_nonstatus_information = "1";
140 retain_status_information = "1";
141 retry_interval = "2";
142 };
143 local-service = {
144 use = "generic-service";
145 host_name = hostFQDN;
146 check_interval = "5";
147 max_check_attempts = "4";
148 retry_interval = "1";
149 servicegroups = "webstatus-resources";
150 };
151 };
152 host = {
153 generic-host = {
154 event_handler_enabled = "1";
155 flap_detection_enabled = "1";
156 notification_period = "24x7";
157 notifications_enabled = "1";
158 process_perf_data = "1";
159 retain_nonstatus_information = "1";
160 retain_status_information = "1";
161 };
162 linux-server = {
163 check_command = "check_host_alive";
164 check_interval = "5";
165 check_period = "24x7";
166 contact_groups = "tiboqorl";
167 max_check_attempts = "10";
168 notification_interval = "120";
169 notification_options = "d,u,r,f";
170 retry_interval = "1";
171 };
172 };
173 };
174}
diff --git a/modules/private/monitoring/objects_ulminfo-fr.nix b/modules/private/monitoring/objects_ulminfo-fr.nix
deleted file mode 100644
index bd2804b..0000000
--- a/modules/private/monitoring/objects_ulminfo-fr.nix
+++ /dev/null
@@ -1,17 +0,0 @@
1{ emailCheck, ... }:
2{
3 activatedPlugins = [ "emails" ];
4 host = {
5 "ulminfo.fr" = {
6 alias = "ulminfo.fr";
7 address = "ulminfo.fr";
8 use = "linux-server";
9 hostgroups = "webstatus-hosts";
10 _webstatus_name = "ulminfo";
11 _webstatus_vhost = "status.immae.eu";
12 };
13 };
14 service = [
15 (emailCheck "ulminfo" "ulminfo.fr")
16 ];
17}
diff --git a/modules/private/monitoring/plugins/check_bandwidth b/modules/private/monitoring/plugins/check_bandwidth
deleted file mode 100755
index 53c5d85..0000000
--- a/modules/private/monitoring/plugins/check_bandwidth
+++ /dev/null
@@ -1,123 +0,0 @@
1#!/bin/bash
2
3# ============================== SUMMARY =====================================
4#Author : Ken Roulamellah
5#Date : 19/07/2018
6#Version : 1.0
7# Licence : GPL
8# ===================== INFORMATION ABOUT THIS PLUGIN ========================
9#
10# This plugin checks the average RX and TX bandwidth utilisation. It use
11# kbytes as measure unite.
12#
13# ========================== START OF PROGRAM CODE ===========================
14
15STATE_OK=0
16STATE_WARNING=1
17STATE_CRITICAL=2
18STATE_UNKNOWN=3
19
20interface=$( ip route | grep default | awk '{print $5}' | head -n1)
21function print_usage()
22{
23 echo "Usage :"
24 echo "$0 [ -i=INTERFACE] [ -ct=COUNT ] -w WARNING -c CRITICAL"
25 echo "This script calculate the average bandwith usage."
26 echo "Default values | interface: ${interface}, counter: 10"
27}
28
29counter=10
30warning=-1
31critical=-1
32
33sum_rx=0
34sum_tx=0
35avg_rx=
36avg_tx=
37i=
38
39
40if [[ $# -lt 4 ]];
41then
42 echo "Error: Arguments are missing"
43 print_usage
44 exit $STATE_UNKNOWN
45fi
46
47while [[ $# -gt 0 ]]; do
48 case "$1" in
49 -i=*)
50 interface="$(cut -d'=' -f2 <<<"$1")"
51 shift
52 ;;
53 -ct=*)
54 counter="$(cut -d'=' -f2 <<<"$1")"
55 shift
56 ;;
57 -w)
58 warning=$2
59 shift 2
60 ;;
61 -c)
62 critical=$2
63 shift 2
64 ;;
65 *)
66 printf "\nError: Invalid option '$1'"
67 print_usage
68 exit $STATE_UNKNOWN
69 ;;
70 esac
71done
72
73if [ $warning -lt 0 ] || [ $critical -lt 0 ];
74then
75 echo "Error: You need to specify a warning and critical treshold"
76 print_usage
77 exit $STATE_UNKNOWN
78fi
79
80grep -q "up" /sys/class/net/$interface/operstate || exec echo "$interface: no such device or down"
81
82read rx <"/sys/class/net/$interface/statistics/rx_bytes"
83read tx <"/sys/class/net/$interface/statistics/tx_bytes"
84
85i=$counter
86while [ $i -gt 0 ]; do
87 sleep 1
88 read newrx <"/sys/class/net/$interface/statistics/rx_bytes"
89 read newtx <"/sys/class/net/$interface/statistics/tx_bytes"
90
91 #echo "old rx :$rx"
92 #echo "new rx :$newrx"
93 rx_cal=$(bc <<< "scale=2; ($newrx-$rx) / 1000")
94 tx_cal=$(bc <<< "scale=2; ($newtx-$tx) / 1000")
95
96 sum_rx=$(bc <<< "scale=2;$sum_rx+$rx_cal")
97 sum_tx=$(bc <<< "scale=2;$sum_tx+$tx_cal")
98
99 #echo "$interface {rx: $rx_cal ko/s, tx: $tx_cal ko/s}"
100 rx=$newrx
101 tx=$newtx
102 ((i --))
103done
104
105avg_rx=$(bc <<< "scale=2;$sum_rx/$counter")
106avg_tx=$(bc <<< "scale=2;$sum_tx/$counter")
107
108#echo "$avg_rx"
109#echo "$avg_tx"
110
111
112if [ $(bc <<< "$avg_rx > $critical || $avg_tx > $critical") -eq 1 ]; then
113 echo "$interface CRITICAL - AVG_RX: $avg_rx kb/s, AVG_TX:
114 $avg_tx kb/s | RX="$avg_rx"kbps;0;0;0; TX="$avg_tx"kbps;0;0;0;"
115 exit $STATE_CRITICAL
116elif [ $(bc <<< "$avg_rx > $warning || $avg_tx > $warning") -eq 1 ]; then
117 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;"
118 exit $STATE_WARNING
119else
120 echo "$interface - OK 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;"
121 exit $STATE_OK
122fi
123exit 3
diff --git a/modules/private/monitoring/plugins/check_mem.sh b/modules/private/monitoring/plugins/check_mem.sh
deleted file mode 100755
index cc97ae2..0000000
--- a/modules/private/monitoring/plugins/check_mem.sh
+++ /dev/null
@@ -1,29 +0,0 @@
1#!/bin/bash
2
3if [ "$1" = "-w" ] && [ "$2" -gt "0" ] && [ "$3" = "-c" ] && [ "$4" -gt "0" ]; then
4 FreeM=`free -m`
5 memTotal_m=`echo "$FreeM" |grep Mem |awk '{print $2}'`
6 memUsed_m=`echo "$FreeM" |grep Mem |awk '{print $3}'`
7 memFree_m=`echo "$FreeM" |grep Mem |awk '{print $4}'`
8 memBuffer_m=`echo "$FreeM" |grep Mem |awk '{print $6}'`
9 memCache_m=`echo "$FreeM" |grep Mem |awk '{print $7}'`
10 memUsedPrc=`echo $((($memUsed_m*100)/$memTotal_m))||cut -d. -f1`
11 if [ "$memUsedPrc" -ge "$4" ]; then
12 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;;;;"
13 exit 2
14 elif [ "$memUsedPrc" -ge "$2" ]; then
15 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;;;;"
16 exit 1
17 else
18 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;;;;"
19 exit 0
20 fi
21else # If inputs are not as expected, print help.
22 sName="`echo $0|awk -F '/' '{print $NF}'`"
23 echo -e "\n\n\t\t### $sName Version 2.0###\n"
24 echo -e "# Usage:\t$sName -w <warnlevel> -c <critlevel>"
25 echo -e "\t\t= warnlevel and critlevel is percentage value without %\n"
26 echo "# EXAMPLE:\t/usr/lib64/nagios/plugins/$sName -w 80 -c 90"
27 echo -e "\nCopyright (C) 2012 Lukasz Gogolin (lukasz.gogolin@gmail.com), improved by Nestor 2015\n\n"
28 exit
29fi
diff --git a/modules/private/monitoring/plugins/notify_eban_url b/modules/private/monitoring/plugins/notify_eban_url
deleted file mode 100755
index 107b5de..0000000
--- a/modules/private/monitoring/plugins/notify_eban_url
+++ /dev/null
@@ -1,6 +0,0 @@
1#!/usr/bin/env bash
2
3if [ "$SERVICESTATE" = "CRITICAL" -o "$SERVICESTATE" = "UNKNOWN" -o "$HOSTSTATE" = "DOWN" -o "$HOSTSTATE" = "UNREACHABLE" ]; then
4 MESSAGE="$STATUS_NAME seems down!"
5 curl -X GET -G --data-urlencode "user=$USER" --data-urlencode "pass=$PASSWORD" --data-urlencode "msg=$MESSAGE" https://smsapi.free-mobile.fr/sendmsg
6fi
diff --git a/modules/private/monitoring/status.nix b/modules/private/monitoring/status.nix
deleted file mode 100644
index ab0290c..0000000
--- a/modules/private/monitoring/status.nix
+++ /dev/null
@@ -1,93 +0,0 @@
1{ config, pkgs, lib, name, ... }:
2{
3 options = {
4 myServices.status = {
5 enable = lib.mkOption {
6 type = lib.types.bool;
7 default = false;
8 description = ''
9 Whether to enable status app.
10 '';
11 };
12 };
13 };
14 config = lib.mkIf config.myServices.status.enable {
15 secrets.keys."naemon-status/environment" = {
16 user = "naemon";
17 group = "naemon";
18 permissions = "0400";
19 text = ''
20 TOKENS=${builtins.concatStringsSep " " config.myEnv.monitoring.nrdp_tokens}
21 '';
22 };
23 services.nginx = {
24 enable = true;
25 recommendedOptimisation = true;
26 recommendedGzipSettings = true;
27 recommendedProxySettings = true;
28 upstreams."netdata".servers = { "127.0.0.1:19999" = {}; };
29 upstreams."netdata".extraConfig = ''
30 keepalive 64;
31 '';
32 virtualHosts."status.eban.bzh" = {
33 acmeRoot = config.myServices.certificates.webroot;
34 useACMEHost = name;
35 forceSSL = true;
36 locations."/".proxyPass = "http://unix:/run/naemon-status/socket.sock:/";
37 };
38 virtualHosts."status.immae.eu" = {
39 acmeRoot = config.myServices.certificates.webroot;
40 useACMEHost = name;
41 forceSSL = true;
42 locations."/".proxyPass = "http://unix:/run/naemon-status/socket.sock:/";
43
44 locations."= /netdata".return = "301 /netdata/";
45 locations."~ /netdata/(?<ndpath>.*)".extraConfig = ''
46 proxy_redirect off;
47 proxy_set_header Host $host;
48
49 proxy_set_header X-Forwarded-Host $host;
50 proxy_set_header X-Forwarded-Server $host;
51 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
52 proxy_http_version 1.1;
53 proxy_pass_request_headers on;
54 proxy_set_header Connection "keep-alive";
55 proxy_store off;
56 proxy_pass http://netdata/$ndpath$is_args$args;
57
58 gzip on;
59 gzip_proxied any;
60 gzip_types *;
61 '';
62 };
63 };
64 security.acme.certs."${name}" = {
65 extraDomains."status.immae.eu" = null;
66 extraDomains."status.eban.bzh" = null;
67 user = config.services.nginx.user;
68 group = config.services.nginx.group;
69 };
70
71 myServices.certificates.enable = true;
72 networking.firewall.allowedTCPPorts = [ 80 443 ];
73 systemd.services.naemon-status = {
74 description = "Naemon status";
75 after = [ "network.target" ];
76 wantedBy = [ "multi-user.target" ];
77
78 serviceConfig = {
79 EnvironmentFile = config.secrets.fullPaths."naemon-status/environment";
80 Type = "simple";
81 WorkingDirectory = "${./status}";
82 ExecStart = let
83 python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.flask_login ]);
84 in
85 "${python}/bin/gunicorn -w4 --bind unix:/run/naemon-status/socket.sock app:app";
86 User = "naemon";
87 RuntimeDirectory = "naemon-status";
88 StandardOutput = "journal";
89 StandardError = "inherit";
90 };
91 };
92 };
93}
diff --git a/modules/private/monitoring/status_engine.nix b/modules/private/monitoring/status_engine.nix
deleted file mode 100644
index 39a753a..0000000
--- a/modules/private/monitoring/status_engine.nix
+++ /dev/null
@@ -1,115 +0,0 @@
1{ config, pkgs, lib, name, ... }:
2let
3 package = pkgs.status_engine.worker.override { config_file = config.secrets.fullPaths."status_engine"; };
4 env = config.myEnv.tools.status_engine;
5in
6{
7 config = lib.mkIf config.myServices.status.enable {
8 systemd.services.gearmand = {
9 description = "Gearman daemon";
10 after = [ "network.target" ];
11 wantedBy = [ "multi-user.target" ];
12 serviceConfig = {
13 DynamicUser = true;
14 User = "gearmand";
15 Type = "simple";
16 ExecStart = "${pkgs.gearmand}/bin/gearmand --syslog -L 127.0.0.1 -q libsqlite3 --libsqlite3-db /var/lib/gearmand/gearmand.db --store-queue-on-shutdown -l stderr -P /run/gearmand/gearmand.pid";
17 RuntimeDirectory = "gearmand";
18 StateDirectory = "gearmand";
19 };
20 };
21
22 secrets.keys."status_engine" = {
23 permissions = "0400";
24 user = "naemon";
25 group = "naemon";
26 text = ''
27 node_name: ${name}
28 use_gearman: 1
29 gearman:
30 address: 127.0.0.1
31 port: 4730
32 timeout: 1000
33 use_rabbitmq: 0
34 use_redis: 1
35 redis:
36 address: 127.0.0.1
37 port: 6379
38 db: 0
39 store_live_data_in_archive_backend: 1
40 use_mysql: 1
41 mysql:
42 host: ${env.mysql.remoteHost}
43 port: ${env.mysql.port}
44 username: ${env.mysql.user}
45 password: ${env.mysql.password}
46 database: ${env.mysql.database}
47 use_crate: 0
48 number_of_bulk_records: 100
49 max_bulk_delay: 5
50 number_servicestatus_worker: 1
51 number_hoststatus_worker: 1
52 number_logentry_worker: 1
53 number_statechange_worker: 1
54 number_hostcheck_worker: 1
55 number_servicecheck_worker: 1
56 number_misc_worker: 1
57
58 process_perfdata: 1
59 number_perfdata_worker: 1
60 perfdata_backend:
61 - mysql
62
63 check_for_commands: 1
64 command_check_interval: 15
65 external_command_file: /run/naemon/naemon.cmd
66 query_handler: /run/naemon/naemon.qh
67 submit_method: qh
68
69 syslog_enabled: 1
70 syslog_tag: statusengine-worker
71
72 # Archive age
73 age_hostchecks: 5
74 age_host_acknowledgements: 60
75 age_host_notifications: 60
76 age_host_statehistory: 365
77 age_host_downtimes: 60
78 age_servicechecks: 5
79 age_service_acknowledgements: 60
80 age_service_notifications: 60
81 age_service_statehistory: 365
82 age_service_downtimes: 60
83 age_logentries: 5
84 age_tasks: 1
85 age_perfdata: 90
86
87 disable_http_proxy: 1
88 '';
89 };
90
91 services.redis = rec {
92 enable = true;
93 bind = "127.0.0.1";
94 };
95
96 services.cron = {
97 mailto = "cron@immae.eu";
98 systemCronJobs = [
99 "0 0 * * * naemon cd ${package} && ./bin/Console.php cleanup"
100 ];
101 };
102
103 systemd.services.status_engine_worker = {
104 description = "Status engine worker";
105 after = [ "network.target" ];
106 wantedBy = [ "multi-user.target" ];
107 serviceConfig = {
108 Type = "simple";
109 Restart = "on-failure";
110 User = "naemon";
111 ExecStart = "${package}/bin/StatusengineWorker.php";
112 };
113 };
114 };
115}
diff --git a/modules/private/monitoring/to_objects.nix b/modules/private/monitoring/to_objects.nix
deleted file mode 100644
index 12721d2..0000000
--- a/modules/private/monitoring/to_objects.nix
+++ /dev/null
@@ -1,77 +0,0 @@
1{ lib }:
2 with lib.attrsets;
3 with lib.strings;
4 with lib.lists;
5 with lib.trivial;
6let
7 pad = width: str: let
8 padWidth = width - stringLength str;
9 padding = concatStrings (genList (const " ") padWidth);
10 in str + optionalString (padWidth > 0) padding;
11 toStr = k: v:
12 if k == "check_command" && builtins.isList v
13 then builtins.concatStringsSep "!" v
14 else v;
15
16 toService = service: ''
17 define service {
18 ${builtins.concatStringsSep "\n" (mapAttrsToList (k: v:
19 " ${pad 30 k} ${toStr k v}"
20 ) (filterAttrs (k: v: ! builtins.elem k ["passiveInfo" "filter"]) service))}
21 }
22 '';
23 toServices = services: builtins.concatStringsSep "\n" (map toService services);
24
25 toCommand = k: v: ''
26 define command {
27 ${pad 30 "command_name"} ${k}
28 ${pad 30 "command_line"} ${v}
29 }
30 '';
31 toCommands = a: builtins.concatStringsSep "\n" (mapAttrsToList toCommand a);
32
33 toOther = keyname: k: v: ''
34 define ${keyname} {
35 ${pad 30 "${keyname}_name"} ${k}
36 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
37 " ${pad 30 kk} ${vv}"
38 ) v)}
39 }
40 '';
41 toOtherNoName = keyname: v: ''
42 define ${keyname} {
43 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
44 " ${pad 30 kk} ${vv}"
45 ) v)}
46 }
47 '';
48 toOthers = keyname: a: builtins.concatStringsSep "\n" (mapAttrsToList (toOther keyname) a);
49 toOthersArray = keyname: a: builtins.concatStringsSep "\n" (map (toOtherNoName keyname) a);
50
51 toTemplate = keyname: k: v: ''
52 define ${keyname} {
53 ${pad 30 "name"} ${k}
54 ${pad 30 "register"} 0
55 ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
56 " ${pad 30 kk} ${vv}"
57 ) v)}
58 }
59 '';
60 toTemplates' = keyname: a: builtins.concatStringsSep "\n" (mapAttrsToList (toTemplate keyname) a);
61 toTemplates = v: builtins.concatStringsSep "\n" (mapAttrsToList toTemplates' v);
62
63 toObjects' = keyname: v:
64 if keyname == "service"
65 then toServices v
66 else if keyname == "command"
67 then toCommands v
68 else if keyname == "templates"
69 then toTemplates v
70 else if builtins.elem keyname ["hostgroup" "host" "contactgroup" "contact" "timeperiod" "servicegroup"]
71 then toOthers keyname v
72 else if builtins.elem keyname ["servicedependency"]
73 then toOthersArray keyname v
74 else "";
75 toObjects = v: builtins.concatStringsSep "\n" (mapAttrsToList toObjects' v);
76in
77 toObjects
diff --git a/modules/private/pub/default.nix b/modules/private/pub/default.nix
deleted file mode 100644
index c419530..0000000
--- a/modules/private/pub/default.nix
+++ /dev/null
@@ -1,56 +0,0 @@
1{ lib, pkgs, config, ... }:
2{
3 options = {
4 myServices.pub.enable = lib.mkOption {
5 type = lib.types.bool;
6 default = false;
7 description = ''
8 Whether to enable pub user.
9 '';
10 };
11 };
12
13 config = lib.mkIf config.myServices.pub.enable {
14 myServices.ssh.modules = [{
15 snippet = builtins.readFile ./ldap_pub.sh;
16 dependencies = [ pkgs.coreutils ];
17 }];
18 users.users.pub = let
19 restrict = pkgs.runCommand "restrict" {
20 file = ./restrict;
21 buildInputs = [ pkgs.makeWrapper ];
22 } ''
23 mkdir -p $out/bin
24 cp $file $out/bin/restrict
25 chmod a+x $out/bin/restrict
26 patchShebangs $out/bin/restrict
27 wrapProgram $out/bin/restrict \
28 --prefix PATH : ${lib.makeBinPath [ pkgs.bubblewrap pkgs.rrsync ]} \
29 --set TMUX_RESTRICT ${./tmux.restrict.conf}
30 '';
31 purple-hangouts = pkgs.purple-hangouts.overrideAttrs(old: {
32 installPhase = ''
33 install -Dm755 -t $out/lib/purple-2/ libhangouts.so
34 for size in 16 22 24 48; do
35 install -TDm644 hangouts$size.png $out/share/pixmaps/pidgin/protocols/$size/hangouts.png
36 done
37 '';
38 });
39 in {
40 createHome = true;
41 description = "Restricted shell user";
42 home = "/var/lib/pub";
43 uid = config.myEnv.users.pub.uid;
44 useDefaultShell = true;
45 packages = [
46 restrict
47 pkgs.tmux
48 (pkgs.pidgin.override { plugins = [
49 pkgs.purple-plugin-pack purple-hangouts
50 pkgs.purple-discord pkgs.purple-facebook
51 pkgs.telegram-purple
52 ]; })
53 ];
54 };
55 };
56}
diff --git a/modules/private/pub/ldap_pub.sh b/modules/private/pub/ldap_pub.sh
deleted file mode 100644
index bbbefdc..0000000
--- a/modules/private/pub/ldap_pub.sh
+++ /dev/null
@@ -1,56 +0,0 @@
1### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh
2LDAP_PUB_RESTRICT_MEMBER="cn=restrict,cn=pub,ou=services,dc=immae,dc=eu"
3LDAP_PUB_FORWARD_MEMBER="cn=forward,cn=pub,ou=services,dc=immae,dc=eu"
4ECHO=$(which echo)
5
6if [[ $user == pub ]]; then
7 ldap_search '(&(memberOf='$LDAP_PUB_RESTRICT_MEMBER')('$KEY'=*))' $KEY | \
8 while read line ;
9 do
10 if [ ! -z "$line" ]; then
11 if [[ $line == dn* ]]; then
12 echo ""
13 user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line")
14 echo "# $user"
15 elif [[ $line == $KEY* ]]; then
16 key=$(clean_key_line pub "$line")
17 key_forward=$(clean_key_line forward "$line")
18 if [ ! -z "$key" ]; then
19 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
20 echo -n 'command="/etc/profiles/per-user/pub/bin/restrict '$user'" '
21 echo $key
22 fi
23 elif [ ! -z "$key_forward" ]; then
24 if [[ $key_forward != *$'\n'* ]] && [[ $key_forward == ssh-* ]]; then
25 echo "# forward only"
26 echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" '
27 echo $key_forward
28 fi
29 fi
30 fi
31 fi
32 done
33
34 echo ""
35 ldap_search '(&(memberOf='$LDAP_PUB_FORWARD_MEMBER')('$KEY'=*))' $KEY | \
36 while read line ;
37 do
38 if [ ! -z "$line" ]; then
39 if [[ $line == dn* ]]; then
40 echo ""
41 user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line")
42 echo "# $user"
43 elif [[ $line == $KEY* ]]; then
44 key=$(clean_key_line forward "$line")
45 if [ ! -z "$key" ]; then
46 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
47 echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" '
48 echo $key
49 fi
50 fi
51 fi
52 fi
53 done
54 exit 0
55fi
56
diff --git a/modules/private/pub/restrict b/modules/private/pub/restrict
deleted file mode 100644
index b2f3be3..0000000
--- a/modules/private/pub/restrict
+++ /dev/null
@@ -1,64 +0,0 @@
1#!/usr/bin/env bash
2user="$1"
3rootuser="$HOME/$user/"
4mkdir -p $rootuser
5
6orig="$SSH_ORIGINAL_COMMAND"
7if [ -z "$orig" ]; then
8 orig="/bin/bash -l"
9fi
10if [ "${orig:0:7}" = "command" ]; then
11 orig="${orig:8}"
12fi
13
14case "$orig" in
15rsync*)
16 rrsync $HOME/$user/
17 ;;
18*)
19 nix_store_paths() {
20 nix-store -q -R \
21 /run/current-system/sw \
22 /etc/profiles/per-user/pub \
23 /etc/ssl/certs/ca-bundle.crt \
24 | while read i; do
25 printf '%s--ro-bind\0'$i'\0'$i'\0' ''
26 done
27 }
28
29 set -euo pipefail
30 (exec -c bwrap --ro-bind /usr /usr \
31 --args 10 \
32 --dir /tmp \
33 --dir /var \
34 --symlink ../tmp var/tmp \
35 --proc /proc \
36 --dev /dev \
37 --ro-bind /etc/resolv.conf /etc/resolv.conf \
38 --ro-bind /etc/zoneinfo /etc/zoneinfo \
39 --ro-bind /etc/ssl /etc/ssl \
40 --ro-bind /etc/static/ssl/certs /etc/static/ssl/certs \
41 --ro-bind /run/current-system/sw/lib/locale/locale-archive /etc/locale-archive \
42 --ro-bind /run/current-system/sw/bin /bin \
43 --ro-bind /etc/profiles/per-user/pub/bin /bin-pub \
44 --bind /var/lib/pub/$user /var/lib/pub \
45 --dir /var/lib/commons \
46 --ro-bind $TMUX_RESTRICT /var/lib/commons/tmux.restrict.conf \
47 --chdir /var/lib/pub \
48 --unshare-all \
49 --share-net \
50 --dir /run/user/$(id -u) \
51 --setenv TERM "$TERM" \
52 --setenv LOCALE_ARCHIVE "/etc/locale-archive" \
53 --setenv XDG_RUNTIME_DIR "/run/user/`id -u`" \
54 --setenv PS1 "$user@pub $ " \
55 --setenv PATH "/bin:/bin-pub" \
56 --setenv HOME "/var/lib/pub" \
57 --file 11 /etc/passwd \
58 --file 12 /etc/group \
59 -- $orig) \
60 10< <(nix_store_paths) \
61 11< <(getent passwd $UID 65534) \
62 12< <(getent group $(id -g) 65534)
63 ;;
64esac
diff --git a/modules/private/ssh/default.nix b/modules/private/ssh/default.nix
deleted file mode 100644
index ee5dda5..0000000
--- a/modules/private/ssh/default.nix
+++ /dev/null
@@ -1,91 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.ssh;
4in
5{
6 options.myServices.ssh = let
7 module = lib.types.submodule {
8 options = {
9 snippet = lib.mkOption {
10 type = lib.types.lines;
11 description = ''
12 Snippet to use
13 '';
14 };
15 dependencies = lib.mkOption {
16 type = lib.types.listOf lib.types.package;
17 default = [];
18 description = ''
19 Dependencies of the package
20 '';
21 };
22 };
23 };
24 in {
25 predefinedModules = lib.mkOption {
26 type = lib.types.attrsOf module;
27 default = {
28 regular = {
29 snippet = builtins.readFile ./ldap_regular.sh;
30 };
31 };
32 readOnly = true;
33 description = ''
34 Predefined modules
35 '';
36 };
37 modules = lib.mkOption {
38 type = lib.types.listOf module;
39 default = [];
40 description = ''
41 List of modules to enable
42 '';
43 };
44 };
45 config = {
46 networking.firewall.allowedTCPPorts = [ 22 ];
47 } // (lib.mkIf (builtins.length cfg.modules > 0) {
48
49 services.openssh.extraConfig = ''
50 AuthorizedKeysCommand /etc/ssh/ldap_authorized_keys
51 AuthorizedKeysCommandUser nobody
52 '';
53
54 secrets.keys."ssh-ldap" = {
55 user = "nobody";
56 group = "nogroup";
57 permissions = "0400";
58 text = config.myEnv.sshd.ldap.password;
59 };
60 system.activationScripts.sshd = {
61 deps = [ "secrets" ];
62 text = ''
63 install -Dm400 -o nobody -g nogroup -T ${config.secrets.fullPaths."ssh-ldap"} /etc/ssh/ldap_password
64 '';
65 };
66 # ssh is strict about parent directory having correct rights, don't
67 # move it in the nix store.
68 environment.etc."ssh/ldap_authorized_keys" = let
69 deps = lib.lists.unique (
70 [ pkgs.which pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.gnused pkgs.coreutils ]
71 ++ lib.flatten (map (v: v.dependencies) cfg.modules)
72 );
73 fullScript = pkgs.runCommand "ldap_authorized_keys" {
74 snippets = builtins.concatStringsSep "\n" (map (v: v.snippet) cfg.modules);
75 } ''
76 substituteAll ${./ldap_authorized_keys.sh} $out
77 chmod a+x $out
78 '';
79 ldap_authorized_keys = pkgs.runCommand "ldap_authorized_keys" {
80 buildInputs = [ pkgs.makeWrapper ];
81 } ''
82 makeWrapper "${fullScript}" "$out" --prefix PATH : ${lib.makeBinPath deps}
83 '';
84 in {
85 enable = true;
86 mode = "0755";
87 user = "root";
88 source = ldap_authorized_keys;
89 };
90 });
91}
diff --git a/modules/private/ssh/ldap_authorized_keys.sh b/modules/private/ssh/ldap_authorized_keys.sh
deleted file mode 100755
index 402f283..0000000
--- a/modules/private/ssh/ldap_authorized_keys.sh
+++ /dev/null
@@ -1,52 +0,0 @@
1#!/usr/bin/env bash
2
3LDAPSEARCH=ldapsearch
4KEY="immaeSshKey"
5LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu"
6LDAP_PASS=$(cat /etc/ssh/ldap_password)
7LDAP_HOST="ldap.immae.eu"
8LDAP_BASE="dc=immae,dc=eu"
9
10suitable_for() {
11 type_for="$1"
12 key="$2"
13
14 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
15 echo "$key"
16 else
17 key_type=$(cut -d " " -f 1 <<< "$key")
18
19 if grep -q "\b-$type_for\b" <<< "$key_type"; then
20 echo ""
21 elif grep -q "\b$type_for\b" <<< "$key_type"; then
22 echo $(sed -e "s/^[^ ]* //g" <<< "$key")
23 else
24 echo ""
25 fi
26 fi
27}
28
29clean_key_line() {
30 type_for="$1"
31 line="$2"
32
33 if [[ "$line" == $KEY::* ]]; then
34 # base64 keys should't happen, unless wrong copy-pasting
35 key=""
36 else
37 key=$(sed -e "s/^$KEY: *//" -e "s/ *$//" <<< "$line")
38 fi
39
40 suitable_for "$type_for" "$key"
41}
42
43ldap_search() {
44 $LDAPSEARCH -h $LDAP_HOST -ZZ -b $LDAP_BASE -D $LDAP_BIND -w "$LDAP_PASS" -x -o ldif-wrap=no -LLL "$@"
45}
46
47ldap_keys() {
48 user=$1;
49 @snippets@
50}
51
52ldap_keys $@
diff --git a/modules/private/system.nix b/modules/private/system.nix
deleted file mode 100644
index 5f3d79e..0000000
--- a/modules/private/system.nix
+++ /dev/null
@@ -1,98 +0,0 @@
1{ pkgs, lib, config, name, nodes, ... }:
2{
3 config = {
4 deployment.secrets."secret_vars.yml" = {
5 source = builtins.toString ../../nixops/secrets/vars.yml;
6 destination = config.secrets.secretsVars;
7 owner.user = "root";
8 owner.group = "root";
9 permissions = "0400";
10 };
11
12 networking.extraHosts = builtins.concatStringsSep "\n"
13 (lib.mapAttrsToList (n: v: "${v.config.hostEnv.ips.main.ip4} ${n}") nodes);
14
15 users.extraUsers.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.nix_repository ];
16 secrets.deleteSecretsVars = true;
17 secrets.gpgKeys = [
18 ../../nixops/public_keys/Immae.pub
19 ];
20 secrets.secretsVars = "/run/keys/vars.yml";
21
22 services.openssh.enable = true;
23
24 nixpkgs.overlays = builtins.attrValues (import ../../overlays) ++ [
25 (self: super: {
26 postgresql = self.postgresql_pam;
27 mariadb = self.mariadb_pam;
28 }) # don’t put them as generic overlay because of home-manager
29 ];
30
31 services.journald.extraConfig = ''
32 #Should be "warning" but disabled for now, it prevents anything from being stored
33 MaxLevelStore=info
34 MaxRetentionSec=1year
35 '';
36
37 users.users =
38 builtins.listToAttrs (map (x: lib.attrsets.nameValuePair x.name ({
39 isNormalUser = true;
40 home = "/home/${x.name}";
41 createHome = true;
42 linger = true;
43 } // x)) (config.hostEnv.users pkgs))
44 // {
45 root.packages = let
46 nagios-cli = pkgs.writeScriptBin "nagios-cli" ''
47 #!${pkgs.stdenv.shell}
48 sudo -u naemon ${pkgs.nagios-cli}/bin/nagios-cli -c ${./monitoring/nagios-cli.cfg}
49 '';
50 in
51 [
52 pkgs.telnet
53 pkgs.htop
54 pkgs.iftop
55 pkgs.bind.dnsutils
56 pkgs.httpie
57 pkgs.iotop
58 pkgs.whois
59 pkgs.ngrep
60 pkgs.tcpdump
61 pkgs.tshark
62 pkgs.tcpflow
63 # pkgs.mitmproxy # failing
64 pkgs.nmap
65 pkgs.p0f
66 pkgs.socat
67 pkgs.lsof
68 pkgs.psmisc
69 pkgs.openssl
70 pkgs.wget
71
72 pkgs.cnagios
73 nagios-cli
74
75 pkgs.pv
76 pkgs.smartmontools
77 ];
78 };
79
80 users.mutableUsers = lib.mkDefault false;
81
82 environment.etc.cnagios.source = "${pkgs.cnagios}/share/doc/cnagios";
83 environment.systemPackages = [
84 pkgs.git
85 pkgs.vim
86 pkgs.rsync
87 pkgs.strace
88 ] ++
89 (lib.optional (builtins.length (config.hostEnv.users pkgs) > 0) pkgs.home-manager);
90
91 systemd.targets.maintenance = {
92 description = "Maintenance target with only sshd";
93 after = [ "network-online.target" "sshd.service" ];
94 requires = [ "network-online.target" "sshd.service" ];
95 unitConfig.AllowIsolate = "yes";
96 };
97 };
98}
diff --git a/modules/private/system/backup-2.nix b/modules/private/system/backup-2.nix
deleted file mode 100644
index c01a666..0000000
--- a/modules/private/system/backup-2.nix
+++ /dev/null
@@ -1,137 +0,0 @@
1{ config, pkgs, resources, name, ... }:
2{
3 deployment = {
4 targetUser = "root";
5 targetHost = config.hostEnv.ips.main.ip4;
6 substituteOnDestination = true;
7 };
8 # ssh-keyscan backup-2 | nix-shell -p ssh-to-age --run ssh-to-age
9 secrets.ageKeys = [ "age1kk3nr27qu42j28mcfdag5lhq0zu2pky7gfanvne8l4z2ctevjpgskmw0sr" ];
10 secrets.keys = {
11 "rsync_backup/identity" = {
12 user = "backup";
13 group = "backup";
14 permissions = "0400";
15 text = config.myEnv.rsync_backup.ssh_key.private;
16 };
17 "rsync_backup/identity.pub" = {
18 user = "backup";
19 group = "backup";
20 permissions = "0444";
21 text = config.myEnv.rsync_backup.ssh_key.public;
22 };
23 };
24 boot.kernelPackages = pkgs.linuxPackages_latest;
25 myEnv = import ../../../nixops/secrets/environment.nix;
26
27 imports = [ <nixpkgs/nixos/modules/profiles/qemu-guest.nix> ] ++ builtins.attrValues (import ../..);
28
29 fileSystems = {
30 "/backup2" = {
31 fsType = "ext4";
32 device = "UUID=b9425333-f567-435d-94d8-b26c22d93426";
33 };
34 "/" = { device = "/dev/sda1"; fsType = "ext4"; };
35 };
36
37 networking = {
38 firewall.enable = true;
39 interfaces."ens3".ipv4.addresses = pkgs.lib.attrsets.mapAttrsToList
40 (n: ips: { address = ips.ip4; prefixLength = 32; })
41 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips);
42 interfaces."ens3".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
43 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
44 config.hostEnv.ips);
45 defaultGateway6 = { address = "fe80::1"; interface = "ens3"; };
46 };
47
48 boot.loader.grub.device = "nodev";
49
50 myServices.certificates.enable = true;
51 security.acme.certs."${name}" = {
52 user = config.services.nginx.user;
53 group = config.services.nginx.group;
54 };
55 services.nginx = {
56 enable = true;
57 recommendedOptimisation = true;
58 recommendedGzipSettings = true;
59 recommendedProxySettings = true;
60 };
61 networking.firewall.allowedTCPPorts = [ 80 443 ];
62
63 services.cron = {
64 mailto = "cron@immae.eu";
65 enable = true;
66 };
67
68 services.rsyncBackup = {
69 mountpoint = "/backup2";
70 profiles = config.myEnv.rsync_backup.profiles;
71 ssh_key_public = config.secrets.fullPaths."rsync_backup/identity.pub";
72 ssh_key_private = config.secrets.fullPaths."rsync_backup/identity";
73 };
74
75 myServices.mailRelay.enable = true;
76 myServices.mailBackup.enable = true;
77 myServices.monitoring.enable = true;
78 myServices.databasesReplication = {
79 postgresql = {
80 enable = true;
81 base = "/backup2";
82 mainPackage = pkgs.postgresql;
83 hosts = {
84 eldiron = {
85 slot = "backup_2";
86 connection = "postgresql://backup-2:${config.hostEnv.ldap.password}@eldiron.immae.eu";
87 package = pkgs.postgresql;
88 };
89 };
90 };
91 mariadb = {
92 enable = true;
93 base = "/backup2";
94 hosts = {
95 eldiron = {
96 serverId = 2;
97 # mysql resolves "backup-2" host and checks the ip, but uses /etc/hosts which only contains ip4
98 host = config.myEnv.servers.eldiron.ips.main.ip4;
99 port = "3306";
100 user = "backup-2";
101 password = config.hostEnv.ldap.password;
102 dumpUser = "root";
103 dumpPassword = config.myEnv.databases.mysql.systemUsers.root;
104 };
105 };
106 };
107 redis = {
108 enable = true;
109 base = "/backup2";
110 hosts = {
111 eldiron = {
112 host = "127.0.0.1";
113 port = "16379";
114 };
115 };
116 };
117 openldap = {
118 enable = true;
119 base = "/backup2";
120 hosts = {
121 eldiron = {
122 url = "ldaps://${config.myEnv.ldap.host}:636";
123 dn = config.myEnv.ldap.replication_dn;
124 password = config.myEnv.ldap.replication_pw;
125 base = config.myEnv.ldap.base;
126 };
127 };
128 };
129 };
130
131 # This value determines the NixOS release with which your system is
132 # to be compatible, in order to avoid breaking some software such as
133 # database servers. You should change this only after NixOS release
134 # notes say you should.
135 # https://nixos.org/nixos/manual/release-notes.html
136 system.stateVersion = "20.03"; # Did you read the comment?
137}
diff --git a/modules/private/system/dilion.nix b/modules/private/system/dilion.nix
deleted file mode 100644
index fa92cd9..0000000
--- a/modules/private/system/dilion.nix
+++ /dev/null
@@ -1,242 +0,0 @@
1{ config, pkgs, name, lib, ... }:
2{
3 deployment = {
4 targetUser = "root";
5 targetHost = config.hostEnv.ips.main.ip4;
6 substituteOnDestination = true;
7 };
8 # ssh-keyscan dilion | nix-shell -p ssh-to-age --run ssh-to-age
9 secrets.ageKeys = [ "age1x49n6qa0arkdpq8530s7umgm0gqkq90exv4jep97q30rfnzknpaqate06a" ];
10 nixpkgs.system = lib.mkOverride 900 "x86_64-linux";
11 boot = {
12 loader = {
13 grub = {
14 version = 2;
15 devices = [ "/dev/sda" "/dev/sdb" "/dev/sdc" "/dev/sdd" ];
16 };
17 timeout = 1;
18 };
19 blacklistedKernelModules = [ "nvidiafb" ];
20 supportedFilesystems = [ "zfs" ];
21 kernelPackages = pkgs.linuxPackages_latest;
22 kernelModules = [ "kvm-intel" ];
23 initrd.availableKernelModules = [ "ahci" "sd_mod" ];
24 initrd.secrets = {
25 "/boot/pass.key" = "/boot/pass.key";
26 };
27 kernel.sysctl."vm.nr_hugepages" = 256; # for xmr-stak
28 # available in nixos-20.09
29 #zfs.requestEncryptionCredentials = [ "zpool/root" ];
30 };
31 nix.maxJobs = 8;
32 powerManagement.cpuFreqGovernor = "powersave";
33 hardware.enableRedistributableFirmware = true;
34
35 myEnv = import ../../../nixops/secrets/environment.nix;
36
37 swapDevices = [ { label = "swap"; } ];
38 fileSystems = {
39 "/" = { fsType = "zfs"; device = "zpool/root"; };
40 "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/fd1c511e-2bc0-49d5-b8bb-95e7e8c8c816"; };
41 "/etc" = { fsType = "zfs"; device = "zpool/root/etc"; };
42 "/home" = { fsType = "zfs"; device = "zpool/root/home"; };
43 "/home/immae" = { fsType = "zfs"; device = "zpool/root/home/immae"; };
44 "/tmp" = { fsType = "zfs"; device = "zpool/root/tmp"; };
45 "/var" = { fsType = "zfs"; device = "zpool/root/var"; };
46 "/data" = { fsType = "ext4"; label = "data"; };
47 "/nix" = { fsType = "ext4"; label = "nix"; };
48 };
49
50 services.udev.extraRules = ''
51 ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="10:bf:48:7f:e6:3b", NAME="eth0"
52 '';
53
54 networking = {
55 hostId = "27c3048d"; # generated with head -c4 /dev/urandom | od -A none -t x4
56 firewall.enable = false;
57 interfaces."eth0".ipv4.addresses =
58 [ { address = config.hostEnv.ips.main.ip4; prefixLength = 27; } ]
59 ++ pkgs.lib.attrsets.mapAttrsToList
60 (n: ips: { address = ips.ip4; prefixLength = 32; })
61 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips);
62 interfaces."eth0".ipv6.addresses =
63 [ { address = "2a01:4f8:141:53e7::"; prefixLength = 64; } ]
64 ++ pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
65 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
66 config.hostEnv.ips);
67 defaultGateway = { address = "176.9.10.225"; interface = "eth0"; };
68 defaultGateway6 = { address = "fe80::1"; interface = "eth0"; };
69 nameservers = [
70 "213.133.98.98"
71 "213.133.99.99"
72 "213.133.100.100"
73 "2a01:4f8:0:a0a1::add:1010"
74 "2a01:4f8:0:a102::add:9999"
75 "2a01:4f8:0:a111::add:9898"
76 ];
77 };
78
79 myServices.ssh.modules = [ config.myServices.ssh.predefinedModules.regular ];
80 imports = builtins.attrValues (import ../..) ++ [ ./dilion/vms.nix ];
81
82 system.nssModules = [ pkgs.libvirt ];
83 system.nssDatabases.hosts = lib.mkForce [ "files" "libvirt_guest" "mymachines" "dns" "myhostname" ];
84 programs.zsh.enable = true;
85
86 users.users.libvirt = {
87 hashedPassword = "!";
88 shell = pkgs.bashInteractive;
89 isSystemUser = true;
90 group = "libvirtd";
91 packages = [ pkgs.netcat-openbsd ];
92 openssh.authorizedKeys.keys = [
93 config.myEnv.buildbot.ssh_key.public
94 config.myEnv.sshd.rootKeys.ismael_flony
95 ];
96 };
97
98 users.users.backup = {
99 hashedPassword = "!";
100 isSystemUser = true;
101 extraGroups = [ "keys" ];
102 shell = pkgs.bashInteractive;
103 openssh.authorizedKeys.keys = let
104 zreplConfig = config.secrets.fullPaths."zrepl/zrepl.yml";
105 in
106 ["command=\"${pkgs.zrepl}/bin/zrepl stdinserver --config ${zreplConfig} eldiron\",restrict ${config.myEnv.zrepl_backup.ssh_key.public}"];
107 };
108 security.sudo.extraRules = pkgs.lib.mkAfter [
109 {
110 commands = [
111 { command = "/home/immae/.nix-profile/root_scripts/*"; options = [ "NOPASSWD" ]; }
112 ];
113 users = [ "immae" ];
114 runAs = "root";
115 }
116 ];
117
118 system.activationScripts.libvirtd_exports = ''
119 install -m 0755 -o root -g root -d /var/lib/caldance
120 '';
121 virtualisation.docker.enable = true;
122 virtualisation.docker.storageDriver = "zfs";
123 virtualisation.libvirtd.enable = true;
124 users.extraUsers.immae.extraGroups = [ "libvirtd" "docker" ];
125 systemd.services.libvirtd.postStart = ''
126 install -m 0770 -g libvirtd -d /var/lib/libvirt/images
127 '';
128 systemd.services.socat-caldance = {
129 description = "Forward ssh port to caldance";
130 wantedBy = [ "multi-user.target" ];
131 after = [ "network.target" ];
132
133 serviceConfig = {
134 ExecStart = "${pkgs.socat}/bin/socat TCP-LISTEN:8022,fork TCP:caldance:22";
135 };
136 };
137
138 time.timeZone = "Europe/Paris";
139 nix = {
140 useSandbox = "relaxed";
141 extraOptions = ''
142 keep-outputs = true
143 keep-derivations = true
144 allow-unsafe-native-code-during-evaluation = true
145 experimental-features = nix-command flakes
146 #Assumed in NUR
147 allow-import-from-derivation = true
148 '';
149 };
150
151 security.pki.certificateFiles = [
152 (pkgs.fetchurl {
153 url = "http://downloads.e.eriomem.net/eriomemca.pem";
154 sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh";
155 })
156 ];
157
158 # This is equivalent to setting environment.sessionVariables.NIX_PATH
159 nix.nixPath = [
160 "home-manager=${pkgs.sources.home-manager.url}"
161 "nixpkgs=${pkgs.sources.nixpkgs-home-manager.url}"
162 ];
163 nix.binaryCaches = [ "https://hydra.iohk.io" "https://cache.nixos.org" ];
164 nix.binaryCachePublicKeys = [ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" ];
165
166 myServices.monitoring.enable = true;
167 myServices.certificates.enable = true;
168 security.acme.certs."${name}-immae" = config.myServices.certificates.certConfig // {
169 user = "immae";
170 domain = "dilion.immae.eu";
171 };
172 security.acme.certs."${name}" = {
173 user = config.services.nginx.user;
174 group = config.services.nginx.group;
175 extraDomains = {
176 "dilion.immae.dev" = null;
177 "caldance.cs.immae.dev" = null;
178 };
179 };
180 services.nginx = {
181 enable = true;
182 recommendedOptimisation = true;
183 recommendedGzipSettings = true;
184 recommendedProxySettings = true;
185 upstreams = {
186 caldance.servers."caldance:3031" = {};
187 };
188 virtualHosts = {
189 "dilion.immae.dev" = {
190 acmeRoot = config.myServices.certificates.webroot;
191 useACMEHost = name;
192 forceSSL = true;
193 root = "/home/immae/www";
194 };
195 "caldance.cs.immae.dev" = {
196 acmeRoot = config.myServices.certificates.webroot;
197 useACMEHost = name;
198 forceSSL = true;
199 locations."/".extraConfig = ''
200 uwsgi_pass caldance;
201 '';
202 locations."/static/".alias = "/var/lib/caldance/caldance/app/www/static/";
203 locations."/media/".alias = "/var/lib/caldance/caldance/media/";
204 extraConfig = ''
205 auth_basic "Authentification requise";
206 auth_basic_user_file ${pkgs.writeText "htpasswd" config.myEnv.websites.caldance.integration.password};
207 '';
208 };
209 };
210 };
211
212 systemd.services.zrepl.serviceConfig.RuntimeDirectory = lib.mkForce "zrepl zrepl/stdinserver";
213 systemd.services.zrepl.serviceConfig.User = "backup";
214 # zfs allow backup create,mount,receive,destroy,rename,snapshot,hold,bookmark,release zpool/backup
215 services.zrepl = {
216 enable = true;
217 config = ''
218 global:
219 control:
220 sockpath: /run/zrepl/control
221 serve:
222 stdinserver:
223 sockdir: /run/zrepl/stdinserver
224 jobs:
225 - type: sink
226 # must not change
227 name: "backup-from-eldiron"
228 root_fs: "zpool/backup"
229 serve:
230 type: stdinserver
231 client_identities:
232 - eldiron
233 '';
234 };
235 # This value determines the NixOS release with which your system is
236 # to be compatible, in order to avoid breaking some software such as
237 # database servers. You should change this only after NixOS release
238 # notes say you should.
239 # https://nixos.org/nixos/manual/release-notes.html
240 system.stateVersion = "20.03"; # Did you read the comment?
241}
242
diff --git a/modules/private/system/dilion/vms.nix b/modules/private/system/dilion/vms.nix
deleted file mode 100644
index af96622..0000000
--- a/modules/private/system/dilion/vms.nix
+++ /dev/null
@@ -1,185 +0,0 @@
1# inspired from https://nixos.wiki/wiki/Virtualization_in_NixOS
2{ config, pkgs, lib, ... }@args:
3let
4 pools = {
5 niximages = {
6 type = "dir";
7 target = "/etc/libvirtd/base-images";
8 };
9 buildbot-disks = rec {
10 preStart = ''
11 mkdir -p ${target}
12 '';
13 type = "dir";
14 target = "/var/lib/libvirt/images/buildbot-disks";
15 };
16 zfspool = {
17 # pool-define-as --name zfspool --source-name zpool/libvirt --type zfs
18 type = "zfs";
19 xml = ''
20 <source>
21 <name>zpool/libvirt</name>
22 </source>
23 '';
24 };
25 };
26 networks = {
27 immae = {
28 bridgeNumber = "1";
29 ipRange = "192.168.100";
30 };
31 };
32 guests = {
33 caldance = {
34 pool = "zfspool";
35 cpus = "1";
36 memory = "2";
37 network = "immae";
38 diskSize = "10GiB";
39 extraDevicesXML = ''
40 <filesystem type="mount">
41 <source dir="/var/lib/caldance"/>
42 <target dir="home"/>
43 </filesystem>
44 '';
45 };
46 buildbot = {
47 pool = "zfspool";
48 cpus = "1";
49 memory = "3";
50 network = "immae";
51 diskSize = "10GiB";
52 destroyVolumeOnExit = true;
53 };
54 };
55 toImage = f: "${import ./vms/base_image.nix f (args // { myEnv = config.myEnv; })}/nixos.qcow2";
56in
57{
58 environment.etc."libvirtd/base-images/nixos.qcow2".source = toImage ./vms/base_configuration.nix;
59 environment.etc."libvirtd/base-images/buildbot.qcow2".source = toImage ./vms/buildbot_configuration.nix;
60 systemd.services = lib.mapAttrs' (name: guest: lib.nameValuePair "libvirtd-guest-${name}" {
61 after = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ];
62 requires = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ];
63 wantedBy = [ "multi-user.target" ];
64 serviceConfig = {
65 Type = "oneshot";
66 RemainAfterExit = "yes";
67 };
68 script =
69 let
70 xml = pkgs.writeText "libvirt-guest-${name}.xml"
71 ''
72 <domain type="kvm">
73 <name>${name}</name>
74 <uuid>UUID</uuid>
75 <memory unit="GiB">${guest.memory}</memory>
76 <vcpu>${guest.cpus}</vcpu>
77 <os>
78 <type arch="x86_64">hvm</type>
79 </os>
80 <devices>
81 <emulator>/run/current-system/sw/bin/qemu-system-x86_64</emulator>
82 <disk type="volume">
83 <source pool="${guest.pool}" volume="guest-${name}" />
84 <target dev="vda" bus="virtio"/>
85 </disk>
86 ${guest.extraDevicesXML or ""}
87 <input type="keyboard" bus="usb"/>
88 <graphics type="vnc" port="-1" autoport="yes"/>
89 <interface type="network">
90 <source network="${guest.network}" />
91 </interface>
92 </devices>
93 <features>
94 <acpi/>
95 </features>
96 </domain>
97 '';
98 in
99 guest.preStart or "" + ''
100 if ! ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then
101 ${pkgs.libvirt}/bin/virsh vol-create-as --pool ${guest.pool} --name 'guest-${name}' --capacity '${guest.diskSize}'
102 volume_path=$(${pkgs.libvirt}/bin/virsh vol-path --pool ${guest.pool} --vol 'guest-${name}')
103 ${pkgs.qemu}/bin/qemu-img convert /etc/libvirtd/base-images/nixos.qcow2 $volume_path
104 fi
105 uuid="$(${pkgs.libvirt}/bin/virsh domuuid '${name}' || true)"
106 ${pkgs.libvirt}/bin/virsh define <(sed "s/UUID/$uuid/" '${xml}')
107 ${pkgs.libvirt}/bin/virsh start '${name}'
108 '';
109 preStop = ''
110 ${pkgs.libvirt}/bin/virsh shutdown '${name}'
111 let "timeout = $(date +%s) + 10"
112 while [ "$(${pkgs.libvirt}/bin/virsh list --name | grep --count '^${name}$')" -gt 0 ]; do
113 if [ "$(date +%s)" -ge "$timeout" ]; then
114 # Meh, we warned it...
115 ${pkgs.libvirt}/bin/virsh destroy '${name}'
116 else
117 # The machine is still running, let's give it some time to shut down
118 sleep 0.5
119 fi
120 done
121 '' + lib.optionalString (guest.destroyVolumeOnExit or false) ''
122 if ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then
123 ${pkgs.libvirt}/bin/virsh vol-wipe --pool ${guest.pool} --vol 'guest-${name}' || true
124 ${pkgs.libvirt}/bin/virsh vol-delete --pool ${guest.pool} --vol 'guest-${name}'
125 fi
126 '';
127 }) guests // (lib.mapAttrs' (name: network: lib.nameValuePair "libvirtd-network-${name}" {
128 after = [ "libvirtd.service" ];
129 requires = [ "libvirtd.service" ];
130 wantedBy = [ "multi-user.target" ];
131 serviceConfig = {
132 Type = "oneshot";
133 RemainAfterExit = "yes";
134 };
135 script = let
136 xml = pkgs.writeText "libvirt-network-${name}.xml" ''
137 <network>
138 <name>${name}</name>
139 <uuid>UUID</uuid>
140 <forward mode='nat' />
141 <bridge name='virbr${network.bridgeNumber}' />
142 <domain name='${name}' localOnly='yes'/>
143 <ip address='${network.ipRange}.1' netmask='255.255.255.0'>
144 <dhcp>
145 <range start='${network.ipRange}.2' end='${network.ipRange}.254'/>
146 </dhcp>
147 </ip>
148 </network>
149 '';
150 in ''
151 uuid="$(${pkgs.libvirt}/bin/virsh net-uuid '${name}' || true)"
152 ${pkgs.libvirt}/bin/virsh net-define <(sed "s/UUID/$uuid/" '${xml}')
153 ${pkgs.libvirt}/bin/virsh net-start '${name}'
154 '';
155 preStop = ''
156 ${pkgs.libvirt}/bin/virsh net-destroy '${name}'
157 '';
158 }) networks) // (lib.mapAttrs' (name: pool: lib.nameValuePair "libvirtd-pool-${name}" {
159 after = [ "libvirtd.service" ];
160 requires = [ "libvirtd.service" ];
161 wantedBy = [ "multi-user.target" ];
162 serviceConfig = {
163 Type = "oneshot";
164 RemainAfterExit = "yes";
165 };
166 script = let
167 xml = pkgs.writeText "libvirt-pool-${name}.xml" ''
168 <pool type="${pool.type}">
169 <name>${name}</name>
170 <uuid>UUID</uuid>
171 ${pool.xml or ""}
172 ${if pool ? target then ''
173 <target>
174 <path>${pool.target}</path>
175 </target>
176 '' else ""}
177 </pool>
178 '';
179 in pool.preStart or "" + ''
180 uuid="$(${pkgs.libvirt}/bin/virsh pool-uuid '${name}' || true)"
181 ${pkgs.libvirt}/bin/virsh pool-define <(sed "s/UUID/$uuid/" '${xml}')
182 ${pkgs.libvirt}/bin/virsh pool-start '${name}' || true
183 '';
184 }) pools);
185}
diff --git a/modules/private/system/dilion/vms/base_configuration.nix b/modules/private/system/dilion/vms/base_configuration.nix
deleted file mode 100644
index e2caba2..0000000
--- a/modules/private/system/dilion/vms/base_configuration.nix
+++ /dev/null
@@ -1,21 +0,0 @@
1{ lib, config, ... }@args:
2{
3 options.myEnv = (import ../../../environment.nix (args // { name = "dummy"; })).options.myEnv;
4 config = {
5 fileSystems."/".device = "/dev/disk/by-label/nixos";
6 boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" "virtio_balloon" "virtio_blk" "virtio_pci" "virtio_ring" ];
7 boot.loader = {
8 grub = {
9 version = 2;
10 device = "/dev/vda";
11 };
12 timeout = 0;
13 };
14 services.openssh.enable = true;
15 networking.firewall.allowedTCPPorts = [ 22 ];
16 users = {
17 mutableUsers = false;
18 users.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.immae_dilion ];
19 };
20 };
21}
diff --git a/modules/private/system/dilion/vms/base_image.nix b/modules/private/system/dilion/vms/base_image.nix
deleted file mode 100644
index 8de8560..0000000
--- a/modules/private/system/dilion/vms/base_image.nix
+++ /dev/null
@@ -1,94 +0,0 @@
1configuration_file: { pkgs ? import <nixpkgs> {}, system ? builtins.currentSystem, myEnv, ... }:
2let
3 config = (import <nixpkgs/nixos/lib/eval-config.nix> {
4 inherit system;
5 modules = [ {
6 myEnv = myEnv;
7 imports = [ configuration_file ];
8
9 # We want our template image to be as small as possible, but the deployed image should be able to be
10 # of any size. Hence we resize on the first boot.
11 systemd.services.resize-main-fs = {
12 wantedBy = [ "multi-user.target" ];
13 serviceConfig.Type = "oneshot";
14 script =
15 ''
16 # Resize main partition to fill whole disk
17 echo ", +" | ${pkgs.utillinux}/bin/sfdisk /dev/vda --no-reread -N 1
18 ${pkgs.parted}/bin/partprobe
19 # Resize filesystem
20 ${pkgs.e2fsprogs}/bin/resize2fs /dev/vda1
21 '';
22 };
23 } ];
24 }).config;
25in pkgs.vmTools.runInLinuxVM (
26 pkgs.runCommand "nixos-base-image"
27 {
28 memSize = 768;
29 preVM =
30 ''
31 mkdir $out
32 diskImage=image.qcow2
33 ${pkgs.vmTools.qemu}/bin/qemu-img create -f qcow2 $diskImage 2G
34 mv closure xchg/
35 '';
36 postVM =
37 ''
38 echo compressing VM image...
39 ${pkgs.vmTools.qemu}/bin/qemu-img convert -c $diskImage -O qcow2 $out/nixos.qcow2
40 '';
41 buildInputs = [ pkgs.utillinux pkgs.perl pkgs.parted pkgs.e2fsprogs ];
42 exportReferencesGraph =
43 [ "closure" config.system.build.toplevel ];
44 }
45 ''
46 # Create the partition
47 parted /dev/vda mklabel msdos
48 parted /dev/vda -- mkpart primary ext4 1M -1s
49
50 # Format the partition
51 mkfs.ext4 -L nixos /dev/vda1
52 mkdir /mnt
53 mount /dev/vda1 /mnt
54
55 for dir in dev proc sys; do
56 mkdir /mnt/$dir
57 mount --bind /$dir /mnt/$dir
58 done
59
60 storePaths=$(perl ${pkgs.pathsFromGraph} /tmp/xchg/closure)
61 echo filling Nix store...
62 mkdir -p /mnt/nix/store
63 set -f
64 cp -prd $storePaths /mnt/nix/store
65 # The permissions will be set up incorrectly if the host machine is not running NixOS
66 chown -R 0:30000 /mnt/nix/store
67
68 mkdir -p /mnt/etc/nix
69 echo 'build-users-group = ' > /mnt/etc/nix/nix.conf
70
71 # Register the paths in the Nix database.
72 export USER=root
73 printRegistration=1 perl ${pkgs.pathsFromGraph} /tmp/xchg/closure | \
74 chroot /mnt ${config.nix.package.out}/bin/nix-store --load-db
75
76 # Create the system profile to allow nixos-rebuild to work.
77 chroot /mnt ${config.nix.package.out}/bin/nix-env \
78 -p /nix/var/nix/profiles/system --set ${config.system.build.toplevel}
79
80 # `nixos-rebuild' requires an /etc/NIXOS.
81 mkdir -p /mnt/etc/nixos
82 touch /mnt/etc/NIXOS
83
84 # `switch-to-configuration' requires a /bin/sh
85 mkdir -p /mnt/bin
86 ln -s ${config.system.build.binsh}/bin/sh /mnt/bin/sh
87
88 # Generate the GRUB menu.
89 chroot /mnt ${config.system.build.toplevel}/bin/switch-to-configuration boot
90
91 umount /mnt/{proc,dev,sys}
92 umount /mnt
93 ''
94)
diff --git a/modules/private/system/dilion/vms/buildbot_configuration.nix b/modules/private/system/dilion/vms/buildbot_configuration.nix
deleted file mode 100644
index 05b02d4..0000000
--- a/modules/private/system/dilion/vms/buildbot_configuration.nix
+++ /dev/null
@@ -1,67 +0,0 @@
1{ pkgs, config, lib, ... }:
2{
3 imports = [
4 <nixpkgs/nixos/modules/profiles/qemu-guest.nix>
5 ./base_configuration.nix
6 ];
7 systemd.services.buildbot-worker.serviceConfig.ExecStartPre = let
8 cfg = config.services.buildbot-worker;
9 script = pkgs.writeScript "decode-dmi" ''
10 #!${pkgs.stdenv.shell}
11
12 mkdir -vp "${cfg.buildbotDir}"
13 varfile=${cfg.buildbotDir}/variables
14 rm $varfile || true
15 echo "[DEFAULT]" > $varfile
16 strings=$(${pkgs.dmidecode}/bin/dmidecode --oem-string count)
17 for i in $(seq 1 $strings); do
18 ${pkgs.dmidecode}/bin/dmidecode --oem-string $i >> $varfile
19 done
20 chown -R ${cfg.user}:${cfg.group} ${cfg.buildbotDir}
21 '';
22 in
23 lib.mkForce ["+${script}"];
24 systemd.services.buildbot-worker.serviceConfig.ExecStart = let
25 cfg = config.services.buildbot-worker;
26 tacFile = pkgs.writeText "buildbot-worker.tac" ''
27 import os
28 from io import open
29
30 from buildbot_worker.bot import Worker
31 from twisted.application import service
32
33 basedir = '${cfg.buildbotDir}'
34
35 # note: this line is matched against to check that this is a worker
36 # directory; do not edit it.
37 application = service.Application('buildbot-worker')
38
39 import configparser
40 config = config = configparser.ConfigParser()
41 config.read("${cfg.buildbotDir}/variables")
42 master_url_split = config["DEFAULT"]["buildbot_master_url"].split(':')
43 buildmaster_host = master_url_split[0]
44 port = int(master_url_split[1])
45 workername = config["DEFAULT"]["buildbot_worker_name"]
46
47 with open('${cfg.workerPassFile}', 'r', encoding='utf-8') as passwd_file:
48 passwd = passwd_file.read().strip('\r\n')
49 keepalive = ${toString cfg.keepalive}
50 umask = None
51 maxdelay = 300
52 numcpus = None
53 allow_shutdown = None
54
55 s = Worker(buildmaster_host, port, workername, passwd, basedir,
56 keepalive, umask=umask, maxdelay=maxdelay,
57 numcpus=numcpus, allow_shutdown=allow_shutdown)
58 s.setServiceParent(application)
59 '';
60 in
61 lib.mkForce "${cfg.package.pythonModule.pkgs.twisted}/bin/twistd --nodaemon --pidfile= --logfile - --python ${tacFile}";
62 services.buildbot-worker = {
63 enable = true;
64 workerPass = config.myEnv.buildbot.workerPassword;
65 packages = [ pkgs.git pkgs.gzip pkgs.openssh ];
66 };
67}
diff --git a/modules/private/system/eldiron.nix b/modules/private/system/eldiron.nix
deleted file mode 100644
index 8b2784d..0000000
--- a/modules/private/system/eldiron.nix
+++ /dev/null
@@ -1,228 +0,0 @@
1{ config, pkgs, lib, ... }:
2{
3 deployment = {
4 targetUser = "root";
5 targetHost = config.hostEnv.ips.main.ip4;
6 substituteOnDestination = true;
7 };
8 # ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age
9 secrets.ageKeys = [ "age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj" ];
10 boot = {
11 kernelModules = [ "kvm-intel" ];
12 blacklistedKernelModules = [ "nvidiafb" ];
13 loader.timeout = 1;
14 loader.grub.devices = [ "/dev/sda" "/dev/sdb" ];
15 kernel.sysctl = {
16 # https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md
17 "net.ipv4.tcp_sack" = 0;
18 };
19 supportedFilesystems = [ "zfs" ];
20 kernelParams = ["zfs.zfs_arc_max=6442450944"];
21 kernelPackages = pkgs.linuxPackages_latest;
22 initrd.availableKernelModules = [ "ahci" "sd_mod" ];
23 initrd.secrets = {
24 "/boot/pass.key" = "/boot/pass.key";
25 };
26 };
27 services.udev.extraRules = ''
28 ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:56:a0:88", NAME="eth0"
29 '';
30 nix.maxJobs = 8;
31 powerManagement.cpuFreqGovernor = "powersave";
32 myEnv = import ../../../nixops/secrets/environment.nix;
33
34 fileSystems = {
35 # pools:
36 # zpool: ashift=12
37 # zfast: ashift=12
38 # zfs:
39 # zpool/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy
40 # zpool/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key
41 # zpool/root/var: atime=on
42 # zfast/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy
43 # zfast/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key
44 # zfast/root/etc: ø
45 # zfast/root/nix: ø
46 # zfast/root/tmp: async=disabled
47 # zfast/root/var: atime=on
48 # zfast/root/var/lib: ø
49 # zfast/root/var/lib/mysql: logbias=throughput ; atime=off ; primarycache=metadata
50 # zfast/root/var/lib/postgresql: recordsize=8K ; atime=off ; logbias=throughput
51 # zfast/root/var/lib/postgresql/11.0: ø
52 # zfast/root/var/lib/postgresql/11.0/pg_wal: ø
53 "/" = { fsType = "zfs"; device = "zpool/root"; };
54 "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/e6bb18fb-ff56-4b5f-ae9f-e60d40dc0622"; };
55 "/etc" = { fsType = "zfs"; device = "zpool/root/etc"; };
56 "/nix" = { fsType = "zfs"; device = "zfast/root/nix"; };
57 "/tmp" = { fsType = "zfs"; device = "zfast/root/tmp"; };
58 "/var" = { fsType = "zfs"; device = "zpool/root/var"; };
59 "/var/lib/mysql" = { fsType = "zfs"; device = "zfast/root/var/lib/mysql"; };
60 "/var/lib/postgresql" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql"; };
61 "/var/lib/postgresql/11.0" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0"; };
62 "/var/lib/postgresql/11.0/pg_wal" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0/pg_wal"; };
63 };
64 swapDevices = [ { label = "swap1"; } { label = "swap2"; } ];
65 hardware.enableRedistributableFirmware = true;
66
67 services.zfs = {
68 autoScrub = {
69 enable = false;
70 };
71 };
72 networking = {
73 hostId = "8262ca33"; # generated with head -c4 /dev/urandom | od -A none -t x4
74 firewall.enable = true;
75 # FIXME: on next reboot, remove the /27 and the localCommands
76 interfaces."eth0".ipv4.addresses =
77 pkgs.lib.attrsets.mapAttrsToList
78 (n: ips: { address = ips.ip4; prefixLength = 32; })
79 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips)
80 ++ [ { address = config.hostEnv.ips.main.ip4; prefixLength = 27; } ];
81 interfaces."eth0".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
82 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
83 config.hostEnv.ips);
84 defaultGateway = "176.9.151.65";
85 localCommands = ''
86 # FIXME: Those commands were added by nixops and may not be
87 # actually needed
88 ip -6 addr add '2a01:4f8:160:3445::/64' dev 'eth0' || true
89 ip -4 route change '176.9.151.64/27' via '176.9.151.65' dev 'eth0' || true
90 ip -6 route add default via 'fe80::1' dev eth0 || true
91 '';
92 nameservers = [
93 "213.133.98.98"
94 "213.133.99.99"
95 "213.133.100.100"
96 "2a01:4f8:0:a0a1::add:1010"
97 "2a01:4f8:0:a102::add:9999"
98 "2a01:4f8:0:a111::add:9898"
99 ];
100 };
101
102 imports = builtins.attrValues (import ../..);
103
104 myServices.buildbot.enable = true;
105 myServices.databases.enable = true;
106 myServices.gitolite.enable = true;
107 myServices.monitoring.enable = true;
108 myServices.irc.enable = true;
109 myServices.pub.enable = true;
110 myServices.tasks.enable = true;
111 myServices.mpd.enable = true;
112 myServices.dns.enable = true;
113 myServices.certificates.enable = true;
114 myServices.websites.enable = true;
115 myServices.gemini.enable = true;
116 myServices.mail.enable = true;
117 myServices.ejabberd.enable = true;
118 myServices.vpn.enable = true;
119 myServices.ftp.enable = true;
120
121 services.netdata.enable = true;
122 services.netdata.config.global."memory mode" = "none";
123 services.netdata.config.health."enabled" = "no";
124 services.netdata.config.web.mode = "none";
125 users.users."${config.services.netdata.user}".extraGroups = [ "keys" ];
126 environment.etc."netdata/stream.conf".source = config.secrets.fullPaths."netdata-stream.conf";
127 secrets.keys = {
128 "netdata-stream.conf" = {
129 user = config.services.netdata.user;
130 group = config.services.netdata.group;
131 permissions = "0400";
132 text = ''
133 [stream]
134 enabled = yes
135 destination = ${config.myEnv.monitoring.netdata_aggregator}
136 api key = ${config.myEnv.monitoring.netdata_keys.eldiron}
137 '';
138 };
139 "zrepl_backup/identity" = {
140 user = "root";
141 group = "root";
142 permissions = "0400";
143 text = config.myEnv.zrepl_backup.ssh_key.private;
144 };
145 };
146 programs.ssh.knownHosts.dilion = {
147 hostNames = ["dilion.immae.eu"];
148 publicKey = let
149 profile = config.myEnv.rsync_backup.profiles.dilion;
150 in
151 "${profile.host_key_type} ${profile.host_key}";
152 };
153
154 services.cron = {
155 enable = true;
156 mailto = "cron@immae.eu";
157 systemCronJobs = [
158 ''
159 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "immae.eu.*Recipient address rejected"
160 # Need a way to blacklist properly
161 # 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "NOQUEUE:"
162 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtp -g "status=bounced"
163 ''
164 ];
165 };
166
167 environment.systemPackages = [ pkgs.bindfs ];
168
169 services.zrepl = {
170 enable = true;
171 config = let
172 redis_dump = pkgs.writeScript "redis-dump" ''
173 #! ${pkgs.stdenv.shell}
174 ${pkgs.redis}/bin/redis-cli bgsave
175 '';
176 in ''
177 jobs:
178 - type: push
179 # must not change
180 name: "backup-to-dilion"
181 filesystems:
182 "zpool/root": true
183 "zpool/root/etc": true
184 "zpool/root/var<": true
185 connect:
186 type: ssh+stdinserver
187 host: dilion.immae.eu
188 user: backup
189 port: 22
190 identity_file: ${config.secrets.fullPaths."zrepl_backup/identity"}
191 snapshotting:
192 type: periodic
193 prefix: zrepl_
194 interval: 1h
195 #hooks:
196 # - type: mysql-lock-tables
197 # dsn: "${config.myEnv.zrepl_backup.mysql.user}:${config.myEnv.zrepl_backup.mysql.password}@tcp(localhost)/"
198 # filesystems:
199 # "zpool/root/var": true
200 # - type: command
201 # path: ${redis_dump}
202 # err_is_fatal: false
203 # filesystems:
204 # "zpool/root/var": true
205 send:
206 encrypted: true
207 pruning:
208 keep_sender:
209 - type: regex
210 regex: "^manual_.*"
211 - type: grid
212 grid: 24x1h | 7x1d | 4x7d | 6x30d
213 regex: "^zrepl_.*"
214 keep_receiver:
215 - type: regex
216 regex: "^manual_.*"
217 - type: grid
218 grid: 6x4h | 7x1d | 4x7d | 6x30d
219 regex: "^zrepl_.*"
220 '';
221 };
222 # This value determines the NixOS release with which your system is
223 # to be compatible, in order to avoid breaking some software such as
224 # database servers. You should change this only after NixOS release
225 # notes say you should.
226 # https://nixos.org/nixos/manual/release-notes.html
227 system.stateVersion = "20.03"; # Did you read the comment?
228}
diff --git a/modules/private/system/monitoring-1.nix b/modules/private/system/monitoring-1.nix
deleted file mode 100644
index dea5f45..0000000
--- a/modules/private/system/monitoring-1.nix
+++ /dev/null
@@ -1,69 +0,0 @@
1{ config, pkgs, resources, ... }:
2{
3 deployment = {
4 targetUser = "root";
5 targetHost = config.hostEnv.ips.main.ip4;
6 substituteOnDestination = true;
7 };
8 # ssh-keyscan monitoring-1 | nix-shell -p ssh-to-age --run ssh-to-age
9 secrets.ageKeys = [ "age1dn4lzhgxusqrpjjnzm7w8ml39ptf326htuzmpqdqs2gg3wq7cqzqxuvx8k" ];
10 boot.kernelPackages = pkgs.linuxPackages_latest;
11 myEnv = import ../../../nixops/secrets/environment.nix;
12
13 imports = [ <nixpkgs/nixos/modules/profiles/qemu-guest.nix> ] ++ builtins.attrValues (import ../..);
14
15 myServices.monitoring.enable = true;
16 myServices.monitoring.master = true;
17 myServices.status.enable = true;
18 networking = {
19 firewall.enable = true;
20 interfaces."ens3".ipv4.addresses = pkgs.lib.attrsets.mapAttrsToList
21 (n: ips: { address = ips.ip4; prefixLength = 32; })
22 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips);
23 interfaces."ens3".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
24 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
25 config.hostEnv.ips);
26 defaultGateway6 = { address = "fe80::1"; interface = "ens3"; };
27 };
28 boot.loader.grub.device = "nodev";
29 fileSystems."/" = { device = "/dev/sda1"; fsType = "ext4"; };
30 myServices.mailRelay.enable = true;
31
32 security.pki.certificateFiles = [
33 (pkgs.fetchurl {
34 url = "http://downloads.e.eriomem.net/eriomemca.pem";
35 sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh";
36 })
37 ];
38
39 services.netdata.enable = true;
40 services.netdata.config.web."allow dashboard from" = "localhost";
41 services.netdata.config.web."allow badges from" = "*";
42 services.netdata.config.web."allow streaming from" = "*";
43 services.netdata.config.web."allow netdata.conf from" = "fd*";
44 services.netdata.config.web."allow management from" = "fd*";
45 networking.firewall.allowedTCPPorts = [ 19999 ];
46 environment.etc."netdata/stream.conf".source = config.secrets.fullPaths."netdata-stream.conf";
47
48 secrets.keys = {
49 "netdata-stream.conf" = {
50 user = config.services.netdata.user;
51 group = config.services.netdata.group;
52 permissions = "0400";
53 text = builtins.concatStringsSep "\n" (pkgs.lib.mapAttrsToList (_: key: ''
54 [${key}]
55 enabled = yes
56 default history = 3600
57 default memory = ram
58 health enabled by default = auto
59 '') config.myEnv.monitoring.netdata_keys);
60 };
61 };
62 users.users."${config.services.netdata.user}".extraGroups = [ "keys" ];
63 # This value determines the NixOS release with which your system is
64 # to be compatible, in order to avoid breaking some software such as
65 # database servers. You should change this only after NixOS release
66 # notes say you should.
67 # https://nixos.org/nixos/manual/release-notes.html
68 system.stateVersion = "20.03"; # Did you read the comment?
69}
diff --git a/modules/private/system/quatresaisons.nix b/modules/private/system/quatresaisons.nix
deleted file mode 100644
index 82db70f..0000000
--- a/modules/private/system/quatresaisons.nix
+++ /dev/null
@@ -1,436 +0,0 @@
1{ config, pkgs, lib, ... }:
2let
3 serverSpecificConfig = config.myEnv.serverSpecific.quatresaisons;
4 yarnModules = pkgs.yarn2nix-moretea.mkYarnModules rec {
5 name = "landing";
6 pname = name;
7 version = "v1.0.0";
8 packageJSON = "${pkgs.sources.webapps-landing}/package.json";
9 yarnLock = "${pkgs.sources.webapps-landing}/yarn.lock";
10 yarnNix = ../websites/tools/tools/landing/yarn-packages.nix;
11 };
12 toLanding = landingConfig: pkgs.stdenv.mkDerivation rec {
13 pname = "landing";
14 version = "v1.0.0";
15 src = pkgs.sources.webapps-landing;
16
17 buildInputs = [ yarnModules pkgs.yarn2nix-moretea.yarn ];
18 configurePhase = ''
19 ln -s ${yarnModules}/node_modules .
20 '';
21 buildPhase = ''
22 yarn build
23 '';
24 installPhase = ''
25 cp -a dist $out
26 cp -f ${landingConfig} $out/config.yml
27 ln -s service-worker.js $out/worker.js
28 '';
29 };
30 normalUsers = serverSpecificConfig.users;
31 sponsoredUser = pkgs.writeScriptBin "sponsored_user" ''
32 #!/usr/bin/env bash
33
34 set -euo pipefail
35 [ -z "''${SUDO_USER+x}" ] && echo "Must be run with sudo" && exit 1
36
37 mygroup=$(id -ng $SUDO_USER)
38
39 sponsored=$(getent group $mygroup | cut -d':' -f4)
40
41 echo "Sponsored users: ''${sponsored:-<none>}"
42
43 log () {
44 touch /var/log/sponsored_users
45 chmod go-rwx /var/log/sponsored_users
46 echo "`date` $mygroup $1" | LANG=C cat -v | tr '\012' ' ' | sed 's:$:\x0a:' >> /var/log/sponsored_users
47 }
48
49 create_user () {
50 log "creates $1: $2"
51 useradd -m -G users,$mygroup -g $mygroup -p '!' "$1"
52 touch /var/lib/nixos/sponsored_users
53 chmod go-rwx /var/lib/nixos/sponsored_users
54 echo "$mygroup $1 $2" >> /var/lib/nixos/sponsored_users
55 (${pkgs.openldap}/bin/ldapadd -c -D cn=root,dc=salle-s,dc=org \
56 -y ${config.secrets.fullPaths."ldap/sync_password"} 2>/dev/null >/dev/null || true) <<EOF
57 dn: uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org
58 objectClass: inetOrgPerson
59 cn: $1
60 description:: $(echo -n "$2" | base64)
61 sn: $1
62 uid: $1
63 EOF
64 while ! passwd "$1"; do
65 echo "please give an initial password"
66 done
67 }
68
69 delete_user () {
70 IFS=",";
71 for u in $sponsored; do
72 if [ "$u" = "$1" ]; then
73 log "deletes $1"
74 userdel -r "$1"
75 sed -i -e "/^$mygroup $1/d" /var/lib/nixos/sponsored_users
76 ${pkgs.openldap}/bin/ldapdelete -D cn=root,dc=salle-s,dc=org \
77 -y ${config.secrets.fullPaths."ldap/sync_password"} \
78 "uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org"
79 echo "deleted"
80 exit 0
81 fi
82 done
83
84 echo "User does not exist or does not belong to you";
85 exit 1
86 }
87
88 reset_password () {
89 IFS=",";
90 for u in $sponsored; do
91 if [ "$u" = "$1" ]; then
92 log "resets password for $1"
93 passwd "$1"
94 exit 0
95 fi
96 done
97
98 echo "User does not exist or does not belong to you";
99 exit 1
100 }
101
102 reset_ldap_password () {
103 if [ "$1" = "$mygroup" ]; then
104 log "resets web password"
105 ${pkgs.openldap}/bin/ldappasswd -D cn=root,dc=salle-s,dc=org \
106 -y ${config.secrets.fullPaths."ldap/sync_password"} \
107 -S "uid=$mygroup,ou=users,dc=salle-s,dc=org"
108 else
109 IFS=",";
110 for u in $sponsored; do
111 if [ "$u" = "$1" ]; then
112 log "resets web password of $1"
113 ${pkgs.openldap}/bin/ldappasswd -D cn=root,dc=salle-s,dc=org \
114 -y ${config.secrets.fullPaths."ldap/sync_password"} \
115 -S "uid=$1,uid=$mygroup,ou=users,dc=salle-s,dc=org"
116 exit 0
117 fi
118 done
119
120 echo "User does not exist or does not belong to you";
121 exit 1
122 fi
123 }
124
125 show_help () {
126 echo "sponsored_users create username realname"
127 echo " create a new sub-user attached to your account"
128 echo "sponsored_users (delete|reset_password) username"
129 echo " delete a sub-user attached to your account or reset his password"
130 echo "sponsored_users reset_ldap_password username"
131 echo " reset the web password of a sub-user or yourself"
132 }
133
134 [ -z "''${1+x}" -o -z "''${2+x}" ] && { show_help ; exit 0; }
135 action="$1"
136 username="$2"
137 shift
138 shift
139
140 case "$action" in
141 create)
142 [ -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; }
143 create_user "$username" "$*";
144 ;;
145 delete)
146 delete_user "$username";
147 ;;
148 reset_password)
149 reset_password "$username";
150 ;;
151 reset_ldap_password)
152 reset_ldap_password "$username";
153 ;;
154 *)
155 show_help
156 ;;
157 esac
158 '';
159in
160{
161 deployment = {
162 targetUser = "root";
163 targetHost = config.hostEnv.ips.main.ip4;
164 substituteOnDestination = true;
165 };
166 # ssh-keyscan quatresaison | nix-shell -p ssh-to-age --run ssh-to-age
167 secrets.ageKeys = [ "age1yz8u6xvh2fltvyp96ep8crce3qx4tuceyhun6pwddfe0uvcrkarscxl7e7" ];
168
169 programs.ssh.package = pkgs.openssh.overrideAttrs(old: {
170 PATH_PASSWD_PROG = "/run/wrappers/bin/passwd";
171 buildFlags = [ "SSH_KEYSIGN=/run/wrappers/bin/ssh-keysign" ];
172 });
173
174 imports = builtins.attrValues (import ../..) ++
175 [ ./quatresaisons/nextcloud.nix ./quatresaisons/databases.nix ];
176
177 myEnv = import ../../../nixops/secrets/environment.nix;
178
179 fileSystems = {
180 "/" = { device = "/dev/disk/by-uuid/865931b4-c5cc-439f-8e42-8072c7a30634"; fsType = "ext4"; };
181 "/home" = { device = "/dev/disk/by-uuid/76020bc4-5b88-464c-8952-9a59072c597f"; fsType = "ext4"; neededForBoot = true; };
182 "/boot" = { device = "/dev/disk/by-uuid/0fb8421a-61e5-4ed5-a795-4dd3a9b2152a"; fsType = "ext4"; };
183 "/var/lib" = { device = "/home/var_lib"; fsType = "none"; options = [ "defaults,bind" ]; };
184 };
185 powerManagement.cpuFreqGovernor = "powersave";
186 hardware.enableRedistributableFirmware = true;
187
188 boot.initrd.availableKernelModules = [ "ahci" "megaraid_sas" "sd_mod" ];
189 boot.initrd.kernelModules = [ "dm-snapshot" ];
190 boot.kernelModules = [ "kvm-intel" ];
191
192 boot.loader.grub.enable = true;
193 boot.loader.grub.version = 2;
194 boot.loader.grub.device = "/dev/sda";
195
196 networking.firewall.enable = false;
197 networking.firewall.allowedTCPPorts = [ 80 443 ];
198 networking.useDHCP = false;
199 networking.interfaces.eth0.useDHCP = true;
200 networking.interfaces.eth0.ipv6.addresses = [
201 { address = pkgs.lib.head config.hostEnv.ips.main.ip6; prefixLength = 64; }
202 ];
203 networking.defaultGateway6 = { address = "fe80::1"; interface = "eth0"; };
204 services.udev.extraRules = ''
205 ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:8b:2f:f0", NAME="eth0"
206 '';
207 security.pam.services.chage.text = ''
208 auth sufficient pam_rootok.so
209 auth required pam_unix.so
210 account required pam_unix.so
211 session required pam_unix.so
212 password required pam_permit.so
213 '';
214 security.pam.services.sshd.makeHomeDir = true;
215 security.pam.services.passwd_default = {};
216 security.pam.services.passwd.text = ''
217 password required pam_cracklib.so enforce_for_root difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
218 '' + config.security.pam.services.passwd_default.text;
219
220 system.activationScripts.ldapSync = {
221 deps = [ "secrets" "users" ];
222 text =
223 let
224 com = "-D cn=root,dc=salle-s,dc=org -y ${config.secrets.fullPaths."ldap/sync_password"}";
225 in ''
226 # Add users
227 ${pkgs.openldap}/bin/ldapadd -c ${com} -f ${config.secrets.fullPaths."ldap/ldaptree.ldif"} 2>/dev/null >/dev/null || true
228
229 # Remove obsolete users
230 ${pkgs.openldap}/bin/ldapsearch -LLL ${com} -s one -b "ou=users,dc=salle-s,dc=org" "uid" |\
231 grep "^uid" | ${pkgs.gnused}/bin/sed -e "s/uid: //" | while read ldapuser; do
232
233 for user in ${builtins.concatStringsSep " " (builtins.attrNames normalUsers)}; do
234 if [ "$user" = "$ldapuser" ]; then
235 continue 2
236 fi
237 done
238 ${pkgs.openldap}/bin/ldapdelete -r ${com} uid=$ldapuser,ou=users,dc=salle-s,dc=org
239 done
240
241 # Subusers
242 if [ -f /var/lib/nixos/sponsored_users ]; then
243 cat /var/lib/nixos/sponsored_users | while read mainUser subUser name; do
244 (${pkgs.openldap}/bin/ldapadd -c ${com} 2>/dev/null >/dev/null || true) <<EOF
245 dn: uid=$subUser,uid=$mainUser,ou=users,dc=salle-s,dc=org
246 objectClass: inetOrgPerson
247 cn: $subUser
248 description:: $(echo -n "$name" | base64)
249 sn: $subUser
250 uid: $subUser
251 EOF
252 done
253 fi
254 '';
255 };
256
257 secrets.keys = {
258 "ldap/sync_password" = {
259 permissions = "0400";
260 text = serverSpecificConfig.ldap_sync_password;
261 };
262 "ldap/ldaptree.ldif" = {
263 permissions = "0400";
264 text = serverSpecificConfig.ldap_service_users
265 + (builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: v: ''
266 dn: uid=${n},ou=users,dc=salle-s,dc=org
267 objectClass: inetOrgPerson
268 cn: ${n}
269 description: ${v._meta.name or n} ${v._meta.email}
270 sn: ${n}
271 uid: ${n}
272 '') normalUsers));
273 };
274 };
275
276 myServices.monitoring.enable = true;
277 myServices.certificates.enable = true;
278 users.mutableUsers = true;
279 system.stateVersion = "21.03";
280 programs.zsh.enable = true;
281
282 users.motd = ''
283 Bienvenue sur quatresaisons.salle-s.org !
284
285 * Charte :
286 https://4c.salle-s.org/charte
287 * Gérer les utilisateurs unix additionnels :
288 sudo sponsored_user -h
289 * Applications web :
290 * tableau de bord : https://4c.salle-s.org/
291 * nextcloud : https://nextcloud.4c.salle-s.org/
292 '';
293
294 users.groups =
295 lib.mapAttrs (n: v: { gid = v.uid; }) normalUsers
296 // { wwwrun = { gid = config.ids.gids.wwwrun; }; };
297 users.users =
298 let
299 defaultNormal = n: {
300 group = n;
301 extraGroups = [ "users" ];
302 isNormalUser = true;
303 };
304 in
305 lib.mapAttrs (n: v: defaultNormal n // (lib.filterAttrs (k: _: k != "_meta") v)) normalUsers
306 // {
307 sponsored-separator = {
308 uid = 10000;
309 group = "users";
310 home = "/var/empty";
311 extraGroups = [];
312 isNormalUser = true;
313 createHome = false;
314 };
315 wwwrun = {
316 group = "wwwrun";
317 description = "Apache httpd user";
318 uid = config.ids.uids.wwwrun;
319 extraGroups = [ "keys" ];
320 };
321 };
322
323 system.activationScripts.usersPost = {
324 deps = [ "users" "groups" ];
325 text = builtins.concatStringsSep "\n" (lib.mapAttrsToList (n: v: ''
326 if getent shadow "${n}" | grep -q '^${n}:${v.initialHashedPassword or "!"}:1'; then
327 chage -d 0 "${n}"
328 [ '${v.initialHashedPassword or "!"}' = '!' ] && passwd -d "${n}"
329 fi
330 '') normalUsers);
331 };
332 security.sudo.extraRules = [
333 {
334 commands = [
335 { command = "${sponsoredUser}/bin/sponsored_user"; options = [ "NOPASSWD" ]; }
336 { command = "/run/current-system/sw/bin/sponsored_user"; options = [ "NOPASSWD" ]; }
337 ];
338 users = builtins.attrNames normalUsers;
339 runAs = "root";
340 }
341 ];
342
343 environment.systemPackages = [
344 sponsoredUser
345 pkgs.git pkgs.vim pkgs.rsync pkgs.strace pkgs.home-manager
346 pkgs.telnet pkgs.htop pkgs.iftop pkgs.bind.dnsutils pkgs.httpie
347 pkgs.iotop pkgs.whois pkgs.ngrep pkgs.tcpdump pkgs.tshark
348 pkgs.tcpflow pkgs.nmap pkgs.p0f pkgs.socat pkgs.lsof pkgs.psmisc
349 pkgs.openssl pkgs.wget pkgs.pv pkgs.smartmontools pkgs.youtube-dl
350 pkgs.unzip pkgs.octave pkgs.feh pkgs.xv pkgs.sshfs pkgs.gdb
351 pkgs.file pkgs.lynx pkgs.tmux pkgs.awesome pkgs.libreoffice
352 pkgs.evince pkgs.firefox pkgs.xcalib pkgs.python3 pkgs.python2
353 pkgs.xorg.xkbcomp pkgs.subversion pkgs.xclip pkgs.imagemagick
354 pkgs.bc pkgs.sox pkgs.zip pkgs.gnome3.gnome-screenshot
355 pkgs.datadog-process-agent
356 ];
357
358 services.websites.env.production = {
359 enable = true;
360 adminAddr = "httpd@immae.eu";
361 httpdName = "Prod";
362 modules = [ "http2" "deflate" "filter" ];
363 extraConfig = [
364 ''
365 LogFormat "%{Host}i:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedVhost
366 Protocols h2 http/1.1
367 AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
368 '' ];
369 ips =
370 let ips = config.hostEnv.ips.main;
371 in [ips.ip4] ++ (ips.ip6 or []);
372
373 fallbackVhost = {
374 certName = "quatresaisons";
375 hosts = [ "quatresaisons.immae.eu" ];
376 root = pkgs.runCommand "empty" {} "mkdir $out && touch $out/index.html";
377 extraConfig = [ "DirectoryIndex index.html" ];
378 };
379 vhostConfs.salle-s = {
380 certName = "quatresaisons";
381 addToCerts = true;
382 hosts = [ "salle-s.org" ];
383 root = toLanding ./quatresaisons/landing.yml;
384 extraConfig = [
385 ''
386 <Directory ${toLanding ./quatresaisons/landing.yml}>
387 AllowOverride None
388 Require all granted
389 DirectoryIndex index.html
390 </Directory>
391 ''
392 ];
393 };
394 vhostConfs.tools = {
395 certName = "quatresaisons";
396 addToCerts = true;
397 hosts = [ "4c.salle-s.org" "quatresaisons.salle-s.org" "quatre-saisons.salle-s.org" ];
398 root = toLanding ./quatresaisons/landing_4c.yml;
399 extraConfig = [
400 ''
401 Alias /charte ${serverSpecificConfig.charte_path}
402 <Directory ${serverSpecificConfig.charte_path}>
403 AllowOverride None
404 Require all granted
405 DirectoryIndex index.html index.txt
406 </Directory>
407
408 <Directory ${toLanding ./quatresaisons/landing_4c.yml}>
409 AllowOverride None
410 Require all granted
411 DirectoryIndex index.html
412 </Directory>
413 ''
414 ];
415 };
416 };
417 system.activationScripts.httpd = ''
418 install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php
419 install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php/sessions
420 '';
421
422 services.phpfpm = {
423 phpOptions = ''
424 session.save_path = "/var/lib/php/sessions"
425 post_max_size = 20M
426 ; 15 days (seconds)
427 session.gc_maxlifetime = 1296000
428 ; 30 days (minutes)
429 session.cache_expire = 43200
430 '';
431 settings = {
432 log_level = "notice";
433 };
434 };
435
436}
diff --git a/modules/private/system/quatresaisons/databases.nix b/modules/private/system/quatresaisons/databases.nix
deleted file mode 100644
index f7b27e0..0000000
--- a/modules/private/system/quatresaisons/databases.nix
+++ /dev/null
@@ -1,147 +0,0 @@
1{ pkgs, config, lib, ... }:
2{
3 config = let
4 serverSpecificConfig = config.myEnv.serverSpecific.quatresaisons;
5 phpLdapAdmin = pkgs.webapps.phpldapadmin.override { config = config.secrets.fullPaths."webapps/tools-ldap"; };
6 in {
7 services.postgresql.enable = true;
8 services.postgresql.package = pkgs.postgresql_12;
9 services.postgresql.ensureUsers = [
10 { name = "naemon"; }
11 ];
12 secrets.keys = {
13 "ldap/password" = {
14 permissions = "0400";
15 user = "openldap";
16 group = "openldap";
17 text = "rootpw ${serverSpecificConfig.ldap_root_pw}";
18 };
19 "webapps/tools-ldap" = {
20 user = "wwwrun";
21 group = "wwwrun";
22 permissions = "0400";
23 text = ''
24 <?php
25 $config->custom->appearance['show_clear_password'] = true;
26 $config->custom->appearance['hide_template_warning'] = true;
27 $config->custom->appearance['theme'] = "tango";
28 $config->custom->appearance['minimalMode'] = false;
29 $config->custom->appearance['tree'] = 'AJAXTree';
30
31 $servers = new Datastore();
32
33 $servers->newServer('ldap_pla');
34 $servers->setValue('server','name','LDAP');
35 $servers->setValue('server','host','ldap://localhost');
36 $servers->setValue('login','auth_type','cookie');
37 $servers->setValue('login','bind_id','${serverSpecificConfig.ldap_phpldapadmin_dn}');
38 $servers->setValue('login','bind_pass','${serverSpecificConfig.ldap_phpldapadmin_password}');
39 $servers->setValue('appearance','pla_password_hash','ssha');
40 $servers->setValue('login','attr','uid');
41 $servers->setValue('login','fallback_dn',true);
42 '';
43 };
44 };
45
46 users.users.openldap.extraGroups = [ "keys" ];
47 services.openldap = {
48 enable = true;
49 dataDir = "/var/lib/openldap";
50 urlList = [ "ldap://localhost" ];
51 logLevel = "none";
52 extraConfig = ''
53 pidfile /run/slapd/slapd.pid
54 argsfile /run/slapd/slapd.args
55
56 moduleload back_hdb
57 backend hdb
58 '';
59
60 extraDatabaseConfig = ''
61 moduleload memberof
62 overlay memberof
63
64 moduleload syncprov
65 overlay syncprov
66 syncprov-checkpoint 100 10
67
68 index objectClass eq
69 index uid pres,eq
70 #index uidMember pres,eq
71 index mail pres,sub,eq
72 index cn pres,sub,eq
73 index sn pres,sub,eq
74 index dc eq
75 index member eq
76 index memberOf eq
77
78 # No one must access that information except root
79 access to attrs=description
80 by * none
81
82 access to attrs=entry,uid filter="(uid=*)"
83 by dn.exact="${serverSpecificConfig.ldap_phpldapadmin_dn}" read
84 by * break
85
86 access to dn.subtree="ou=users,dc=salle-s,dc=org"
87 by dn.subtree="ou=services,dc=salle-s,dc=org" read
88 by * break
89
90 access to *
91 by self read
92 by anonymous auth
93 by * break
94 '';
95 rootpwFile = config.secrets.fullPaths."ldap/password";
96 suffix = "dc=salle-s,dc=org";
97 rootdn = "cn=root,dc=salle-s,dc=org";
98 database = "hdb";
99 };
100
101 services.websites.env.production.modules = [ "proxy_fcgi" ];
102 services.websites.env.production.vhostConfs.tools.extraConfig = [
103 ''
104 Alias /ldap "${phpLdapAdmin}/htdocs"
105 <Directory "${phpLdapAdmin}/htdocs">
106 DirectoryIndex index.php
107 <FilesMatch "\.php$">
108 SetHandler "proxy:unix:${config.services.phpfpm.pools.ldap.socket}|fcgi://localhost"
109 </FilesMatch>
110
111 AllowOverride None
112 Require all granted
113 </Directory>
114 ''
115 ];
116 services.phpfpm.pools.ldap = {
117 user = "wwwrun";
118 group = "wwwrun";
119 settings =
120 let
121 basedir = builtins.concatStringsSep ":" [ phpLdapAdmin config.secrets.fullPaths."webapps/tools-ldap" ];
122 in {
123 "listen.owner" = "wwwrun";
124 "listen.group" = "wwwrun";
125 "pm" = "ondemand";
126 "pm.max_children" = "60";
127 "pm.process_idle_timeout" = "60";
128
129 # Needed to avoid clashes in browser cookies (same domain)
130 "php_value[session.name]" = "LdapPHPSESSID";
131 "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/phpldapadmin";
132 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/phpldapadmin";
133 };
134 phpPackage = pkgs.php72;
135 };
136 system.activationScripts.ldap = {
137 deps = [ "users" ];
138 text = ''
139 install -m 0755 -o wwwrun -g wwwrun -d /var/lib/php/sessions/phpldapadmin
140 '';
141 };
142 systemd.services.phpfpm-ldap = {
143 after = lib.mkAfter [ "openldap.service" ];
144 wants = [ "openldap.service" ];
145 };
146 };
147}
diff --git a/modules/private/system/quatresaisons/landing.yml b/modules/private/system/quatresaisons/landing.yml
deleted file mode 100644
index cf4ba87..0000000
--- a/modules/private/system/quatresaisons/landing.yml
+++ /dev/null
@@ -1,32 +0,0 @@
1---
2# Homepage configuration
3# See https://fontawesome.com/icons for icons options
4
5title: "Websites dashboard"
6subtitle: "Salle-S"
7footer: false
8#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.
9
10# Optional navbar
11# links: [] # Allows for navbar (dark mode, layout, and search) without any links
12links: []
13
14# Services
15# First level array represent a group.
16# Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed).
17services:
18 - name: "Quatramaran"
19 items:
20 - name: "Roundcube"
21 logo: "assets/tools/roundcube.svg"
22 url: "https://quatramaran.salle-s.org/roundcube/"
23 - name: "Les dessous de paillasse"
24 url: "https://dessous-de-paillasse.salle-s.org"
25 - name: "Quatre Saisons"
26 items:
27 - name: "Charte d’utilisation"
28 icon: "fas fa-scroll"
29 url: "https://4c.salle-s.org/charte/"
30 - name: "Nextcloud"
31 logo: "assets/tools/nextcloud.png"
32 url: "https://nextcloud.4c.salle-s.org"
diff --git a/modules/private/system/quatresaisons/landing_4c.yml b/modules/private/system/quatresaisons/landing_4c.yml
deleted file mode 100644
index 0b9f6b6..0000000
--- a/modules/private/system/quatresaisons/landing_4c.yml
+++ /dev/null
@@ -1,24 +0,0 @@
1---
2# Homepage configuration
3# See https://fontawesome.com/icons for icons options
4
5title: "Websites dashboard"
6subtitle: "Quatre saisons"
7footer: false
8#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.
9
10# Optional navbar
11# links: [] # Allows for navbar (dark mode, layout, and search) without any links
12links: []
13
14# Services
15# First level array represent a group.
16# Leave only a "items" key if not using group (group name, icon & tagstyle are optional, section separation will not be displayed).
17services:
18 - items:
19 - name: "Charte d’utilisation"
20 icon: "fas fa-scroll"
21 url: "https://4c.salle-s.org/charte/"
22 - name: "Nextcloud"
23 logo: "assets/tools/nextcloud.png"
24 url: "https://nextcloud.4c.salle-s.org"
diff --git a/modules/private/system/quatresaisons/nextcloud.nix b/modules/private/system/quatresaisons/nextcloud.nix
deleted file mode 100644
index 89d69d5..0000000
--- a/modules/private/system/quatresaisons/nextcloud.nix
+++ /dev/null
@@ -1,141 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 nextcloud = pkgs.webapps.nextcloud.withApps (a: [
4 a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.circles
5 a.contacts a.cookbook a.deck a.extract a.files_markdown
6 a.files_readmemd a.flowupload a.gpxedit a.gpxpod a.keeweb a.maps
7 a.metadata a.music a.notes a.ocsms a.passman a.polls a.spreed
8 a.social a.tasks
9 ]);
10 varDir = "/var/lib/nextcloud";
11 phpFpm = rec {
12 basedir = builtins.concatStringsSep ":" ([ nextcloud varDir ] ++ nextcloud.apps);
13 pool = {
14 "listen.owner" = "wwwrun";
15 "listen.group" = "wwwrun";
16 "pm" = "ondemand";
17 "pm.max_children" = "60";
18 "pm.process_idle_timeout" = "60";
19
20 "php_admin_value[output_buffering]" = "0";
21 "php_admin_value[max_execution_time]" = "1800";
22 "php_admin_value[zend_extension]" = "opcache";
23 #already enabled by default?
24 #"php_value[opcache.enable]" = "1";
25 "php_value[opcache.enable_cli]" = "1";
26 "php_value[opcache.interned_strings_buffer]" = "8";
27 "php_value[opcache.max_accelerated_files]" = "10000";
28 "php_value[opcache.memory_consumption]" = "128";
29 "php_value[opcache.save_comments]" = "1";
30 "php_value[opcache.revalidate_freq]" = "1";
31 "php_admin_value[memory_limit]" = "512M";
32
33 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp";
34 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
35 };
36 };
37in {
38 config = {
39 services.postgresql.ensureDatabases = [ "nextcloud" ];
40 services.postgresql.ensureUsers = [
41 { name = "nextcloud"; ensurePermissions = { "DATABASE nextcloud" = "ALL PRIVILEGES"; }; }
42 ];
43 services.websites.env.production.modules = [ "proxy_fcgi" ];
44
45 services.websites.env.production.vhostConfs.cloud = {
46 certName = "quatresaisons";
47 addToCerts = true;
48 hosts = ["nextcloud.4c.salle-s.org" ];
49 root = nextcloud;
50 extraConfig =
51 [
52 ''
53 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
54 <Directory ${nextcloud}>
55 AcceptPathInfo On
56 DirectoryIndex index.php
57 Options FollowSymlinks
58 Require all granted
59 AllowOverride all
60
61 <IfModule mod_headers.c>
62 Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
63 </IfModule>
64 <FilesMatch "\.php$">
65 CGIPassAuth on
66 SetHandler "proxy:unix:${config.services.phpfpm.pools.nextcloud.socket}|fcgi://localhost"
67 </FilesMatch>
68
69 </Directory>
70 ''
71 ];
72 };
73 services.websites.env.production.vhostConfs.cloud_wait = let
74 content = pkgs.writeText "contenu" ''
75 nextcloud est un service qui a besoin de pérennité du nom
76 "nextcloud.salle-s.org", on va peut-etre y arriver, c'est une
77 question de jours, voir le message informatique.internet:8017
78 '';
79 in {
80 certName = "quatresaisons";
81 addToCerts = true;
82 hosts = ["nextcloud.salle-s.org" ];
83 root = content;
84 extraConfig =
85 [
86 ''
87 Alias / ${content}
88 ''
89 ];
90 };
91
92 users.users.root.packages = let
93 occ = pkgs.writeScriptBin "nextcloud-occ" ''
94 #! ${pkgs.stdenv.shell}
95 cd ${nextcloud}
96 NEXTCLOUD_CONFIG_DIR="${nextcloud}/config" \
97 exec \
98 sudo -E -u wwwrun ${pkgs.php74}/bin/php \
99 -c ${pkgs.php74}/etc/php.ini \
100 occ $*
101 '';
102 in [ occ ];
103
104 system.activationScripts.nextcloud = {
105 deps = [ "users" ];
106 text = let
107 confs = lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) nextcloud.otherConfig;
108 in
109 ''
110 install -m 0755 -o wwwrun -g wwwrun -d ${varDir}
111 install -m 0755 -o wwwrun -g wwwrun -d ${varDir}/config
112 install -m 0750 -o wwwrun -g wwwrun -d ${varDir}/phpSessions
113 ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v:
114 "install -D -m 0644 -o wwwrun -g wwwrun -T ${v} ${varDir}/config/${n}.json"
115 ) confs)}
116 '';
117 };
118 services.phpfpm.pools.nextcloud = {
119 user = "wwwrun";
120 group = "wwwrun";
121 settings = phpFpm.pool;
122 phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache all.imagick ]);
123 };
124
125 services.cron = {
126 enable = true;
127 systemCronJobs = let
128 script = pkgs.writeScriptBin "nextcloud-cron" ''
129 #! ${pkgs.stdenv.shell}
130 export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive
131 export PATH=/run/wrappers/bin:$PATH
132 ${pkgs.php74}/bin/php -d memory_limit=512M -f ${nextcloud}/cron.php
133 '';
134 in [
135 ''
136 */15 * * * * wwwrun ${script}/bin/nextcloud-cron
137 ''
138 ];
139 };
140 };
141}
diff --git a/modules/private/tasks/default.nix b/modules/private/tasks/default.nix
deleted file mode 100644
index 6480255..0000000
--- a/modules/private/tasks/default.nix
+++ /dev/null
@@ -1,355 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.tasks;
4 server_vardir = config.services.taskserver.dataDir;
5 fqdn = "task.immae.eu";
6 user = config.services.taskserver.user;
7 env = config.myEnv.tools.task;
8 group = config.services.taskserver.group;
9 taskserver-user-certs = pkgs.runCommand "taskserver-user-certs" {} ''
10 mkdir -p $out/bin
11 cat > $out/bin/taskserver-user-certs <<"EOF"
12 #!/usr/bin/env bash
13
14 user=$1
15
16 silent_certtool() {
17 if ! output="$("${pkgs.gnutls.bin}/bin/certtool" "$@" 2>&1)"; then
18 echo "GNUTLS certtool invocation failed with output:" >&2
19 echo "$output" >&2
20 fi
21 }
22
23 silent_certtool -p \
24 --bits 4096 \
25 --outfile "${server_vardir}/userkeys/$user.key.pem"
26 ${pkgs.gnused}/bin/sed -i -n -e '/^-----BEGIN RSA PRIVATE KEY-----$/,$p' "${server_vardir}/userkeys/$user.key.pem"
27
28 silent_certtool -c \
29 --template "${pkgs.writeText "taskserver-ca.template" ''
30 tls_www_client
31 encryption_key
32 signing_key
33 expiration_days = 3650
34 ''}" \
35 --load-ca-certificate "${server_vardir}/keys/ca.cert" \
36 --load-ca-privkey "${server_vardir}/keys/ca.key" \
37 --load-privkey "${server_vardir}/userkeys/$user.key.pem" \
38 --outfile "${server_vardir}/userkeys/$user.cert.pem"
39 EOF
40 chmod a+x $out/bin/taskserver-user-certs
41 patchShebangs $out/bin/taskserver-user-certs
42 '';
43 taskwarrior-web = pkgs.webapps.taskwarrior-web;
44 socketsDir = "/run/taskwarrior-web";
45 varDir = "/var/lib/taskwarrior-web";
46 taskwebPages = let
47 uidPages = lib.attrsets.zipAttrs (
48 lib.lists.flatten
49 (lib.attrsets.mapAttrsToList (k: c: map (v: { "${v}" = k; }) c.uid) env.taskwarrior-web)
50 );
51 pages = lib.attrsets.mapAttrs (uid: items:
52 if lib.lists.length items == 1 then
53 ''
54 <html>
55 <head>
56 <meta http-equiv="refresh" content="0; url=/taskweb/${lib.lists.head items}/" />
57 </head>
58 <body></body>
59 </html>
60 ''
61 else
62 ''
63 <html>
64 <head>
65 <title>To-do list disponibles</title>
66 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
67 <meta name="viewport" content="width=device-width, initial-scale=1" />
68 </head>
69 <body>
70 <ul>
71 ${builtins.concatStringsSep "\n" (map (item: "<li><a href='/taskweb/${item}'>${item}</a></li>") items)}
72 </ul>
73 </body>
74 </html>
75 ''
76 ) uidPages;
77 in
78 pkgs.runCommand "taskwerver-pages" {} ''
79 mkdir -p $out/
80 ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (k: v: "cp ${pkgs.writeText k v} $out/${k}.html") pages)}
81 echo "Please login" > $out/index.html
82 '';
83in {
84 options.myServices.tasks = {
85 enable = lib.mkEnableOption "my tasks service";
86 };
87
88 config = lib.mkIf cfg.enable {
89 secrets.keys = {
90 "webapps/tools-taskwarrior-web" = {
91 user = "wwwrun";
92 group = "wwwrun";
93 permissions = "0400";
94 text = ''
95 SetEnv TASKD_HOST "${fqdn}:${toString config.services.taskserver.listenPort}"
96 SetEnv TASKD_VARDIR "${server_vardir}"
97 SetEnv TASKD_LDAP_HOST "ldaps://${env.ldap.host}"
98 SetEnv TASKD_LDAP_DN "${env.ldap.dn}"
99 SetEnv TASKD_LDAP_PASSWORD "${env.ldap.password}"
100 SetEnv TASKD_LDAP_BASE "${env.ldap.base}"
101 SetEnv TASKD_LDAP_FILTER "${env.ldap.filter}"
102 '';
103 };
104 } // (lib.mapAttrs' (name: userConfig: lib.nameValuePair "webapps/tools-taskwarrior/${name}-taskrc" {
105 inherit user group;
106 permissions = "0400";
107 text = let
108 credentials = "${userConfig.org}/${name}/${userConfig.key}";
109 dateFormat = userConfig.date;
110 in ''
111 data.location=${varDir}/${name}
112 taskd.certificate=${server_vardir}/userkeys/taskwarrior-web.cert.pem
113 taskd.key=${server_vardir}/userkeys/taskwarrior-web.key.pem
114 # IdenTrust DST Root CA X3
115 # obtained here: https://letsencrypt.org/fr/certificates/
116 taskd.ca=${pkgs.writeText "ca.cert" ''
117 -----BEGIN CERTIFICATE-----
118 MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
119 TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
120 cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
121 WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
122 ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
123 MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
124 h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
125 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
126 A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
127 T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
128 B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
129 B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
130 KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
131 OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
132 jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
133 qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
134 rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
135 HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
136 hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
137 ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
138 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
139 NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
140 ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
141 TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
142 jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
143 oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
144 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
145 mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
146 emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
147 -----END CERTIFICATE-----''}
148 taskd.server=${fqdn}:${toString config.services.taskserver.listenPort}
149 taskd.credentials=${credentials}
150 dateformat=${dateFormat}
151 '';
152 }) env.taskwarrior-web);
153 services.websites.env.tools.watchPaths = [ config.secrets.fullPaths."webapps/tools-taskwarrior-web" ];
154 services.websites.env.tools.modules = [ "proxy_fcgi" "sed" ];
155 services.websites.env.tools.vhostConfs.task = {
156 certName = "eldiron";
157 addToCerts = true;
158 hosts = [ "task.immae.eu" ];
159 root = ./www;
160 extraConfig = [ ''
161 <Directory ${./www}>
162 DirectoryIndex index.php
163 Use LDAPConnect
164 Require ldap-group cn=users,cn=taskwarrior,ou=services,dc=immae,dc=eu
165 <FilesMatch "\.php$">
166 SetHandler "proxy:unix:${config.services.phpfpm.pools.tasks.socket}|fcgi://localhost"
167 </FilesMatch>
168 Include ${config.secrets.fullPaths."webapps/tools-taskwarrior-web"}
169 </Directory>
170 ''
171 ''
172 <Macro Taskwarrior %{folderName}>
173 ProxyPass "unix://${socketsDir}/%{folderName}.sock|http://localhost-%{folderName}/"
174 ProxyPassReverse "unix://${socketsDir}/%{folderName}.sock|http://localhost-%{folderName}/"
175 ProxyPassReverse http://${fqdn}/
176
177 SetOutputFilter Sed
178 OutputSed "s|/ajax|/taskweb/%{folderName}/ajax|g"
179 OutputSed "s|\([^x]\)/tasks|\1/taskweb/%{folderName}/tasks|g"
180 OutputSed "s|\([^x]\)/projects|\1/taskweb/%{folderName}/projects|g"
181 OutputSed "s|http://${fqdn}/|/taskweb/%{folderName}/|g"
182 OutputSed "s|/img/relax.jpg|/taskweb/%{folderName}/img/relax.jpg|g"
183 </Macro>
184 ''
185 ''
186 Alias /taskweb ${taskwebPages}
187 <Directory "${taskwebPages}">
188 DirectoryIndex index.html
189 Require all granted
190 </Directory>
191
192 RewriteEngine on
193 RewriteRule ^/taskweb$ /taskweb/ [R=301,L]
194 RedirectMatch permanent ^/taskweb/([^/]+)$ /taskweb/$1/
195
196 RewriteCond %{LA-U:REMOTE_USER} !=""
197 RewriteCond ${taskwebPages}/%{LA-U:REMOTE_USER}.html -f
198 RewriteRule ^/taskweb/?$ ${taskwebPages}/%{LA-U:REMOTE_USER}.html [L]
199
200 <Location /taskweb/>
201 Use LDAPConnect
202 Require ldap-group cn=users,cn=taskwarrior,ou=services,dc=immae,dc=eu
203 </Location>
204 ''
205 ] ++ (lib.attrsets.mapAttrsToList (k: v: ''
206 <Location /taskweb/${k}/>
207 ${builtins.concatStringsSep "\n" (map (uid: "Require ldap-attribute uid=${uid}") v.uid)}
208
209 Use Taskwarrior ${k}
210 </Location>
211 '') env.taskwarrior-web);
212 };
213 services.phpfpm.pools = {
214 tasks = {
215 user = user;
216 group = group;
217 settings = {
218 "listen.owner" = "wwwrun";
219 "listen.group" = "wwwrun";
220 "pm" = "dynamic";
221 "pm.max_children" = "60";
222 "pm.start_servers" = "2";
223 "pm.min_spare_servers" = "1";
224 "pm.max_spare_servers" = "10";
225
226 # Needed to avoid clashes in browser cookies (same domain)
227 "php_value[session.name]" = "TaskPHPSESSID";
228 "php_admin_value[open_basedir]" = "${./www}:/tmp:${server_vardir}:/etc/profiles/per-user/${user}/bin/";
229 };
230 phpEnv = {
231 PATH = "/etc/profiles/per-user/${user}/bin";
232 };
233 phpPackage = pkgs.php72;
234 };
235 };
236
237 security.acme.certs."task" = config.myServices.certificates.certConfig // {
238 inherit user group;
239 domain = fqdn;
240 postRun = ''
241 systemctl restart taskserver.service
242 '';
243 };
244
245 users.users.${user} = {
246 extraGroups = [ "keys" ];
247 packages = [ taskserver-user-certs ];
248 };
249
250 system.activationScripts.taskserver = {
251 deps = [ "users" ];
252 text = ''
253 install -m 0750 -o ${user} -g ${group} -d ${server_vardir}
254 install -m 0750 -o ${user} -g ${group} -d ${server_vardir}/userkeys
255 install -m 0750 -o ${user} -g ${group} -d ${server_vardir}/keys
256
257 if [ ! -e "${server_vardir}/keys/ca.key" ]; then
258 silent_certtool() {
259 if ! output="$("${pkgs.gnutls.bin}/bin/certtool" "$@" 2>&1)"; then
260 echo "GNUTLS certtool invocation failed with output:" >&2
261 echo "$output" >&2
262 fi
263 }
264
265 silent_certtool -p \
266 --bits 4096 \
267 --outfile "${server_vardir}/keys/ca.key"
268
269 silent_certtool -s \
270 --template "${pkgs.writeText "taskserver-ca.template" ''
271 cn = ${fqdn}
272 expiration_days = -1
273 cert_signing_key
274 ca
275 ''}" \
276 --load-privkey "${server_vardir}/keys/ca.key" \
277 --outfile "${server_vardir}/keys/ca.cert"
278
279 chown :${group} "${server_vardir}/keys/ca.key"
280 chmod g+r "${server_vardir}/keys/ca.key"
281 fi
282 '';
283 };
284
285 services.taskserver = {
286 enable = true;
287 allowedClientIDs = [ "^task [2-9]" "^Mirakel [1-9]" ];
288 inherit fqdn;
289 listenHost = "::";
290 pki.manual.ca.cert = "${server_vardir}/keys/ca.cert";
291 pki.manual.server.cert = "${config.security.acme.certs.task.directory}/fullchain.pem";
292 pki.manual.server.crl = "${config.security.acme.certs.task.directory}/invalid.crl";
293 pki.manual.server.key = "${config.security.acme.certs.task.directory}/key.pem";
294 requestLimit = 104857600;
295 };
296
297 system.activationScripts.taskwarrior-web = {
298 deps = [ "users" ];
299 text = ''
300 if [ ! -f ${server_vardir}/userkeys/taskwarrior-web.cert.pem ]; then
301 ${taskserver-user-certs}/bin/taskserver-user-certs taskwarrior-web
302 chown taskd:taskd ${server_vardir}/userkeys/taskwarrior-web.cert.pem ${server_vardir}/userkeys/taskwarrior-web.key.pem
303 fi
304 '';
305 };
306
307 systemd.slices.taskwarrior = {
308 description = "Taskwarrior slice";
309 };
310
311 systemd.services = (lib.attrsets.mapAttrs' (name: userConfig:
312 lib.attrsets.nameValuePair "taskwarrior-web-${name}" {
313 description = "Taskwarrior webapp for ${name}";
314 wantedBy = [ "multi-user.target" ];
315 after = [ "network.target" ];
316 path = [ pkgs.taskwarrior ];
317
318 environment.TASKRC = config.secrets.fullPaths."webapps/tools-taskwarrior/${name}-taskrc";
319 environment.BUNDLE_PATH = "${taskwarrior-web.gems}/${taskwarrior-web.gems.ruby.gemPath}";
320 environment.BUNDLE_GEMFILE = "${taskwarrior-web.gems.confFiles}/Gemfile";
321 environment.LC_ALL = "fr_FR.UTF-8";
322
323 script = ''
324 exec ${taskwarrior-web.gems}/${taskwarrior-web.gems.ruby.gemPath}/bin/bundle exec thin start -R config.ru -S ${socketsDir}/${name}.sock
325 '';
326
327 serviceConfig = {
328 Slice = "taskwarrior.slice";
329 User = user;
330 PrivateTmp = true;
331 Restart = "always";
332 TimeoutSec = 60;
333 Type = "simple";
334 WorkingDirectory = taskwarrior-web;
335 StateDirectoryMode = 0750;
336 StateDirectory = assert lib.strings.hasPrefix "/var/lib/" varDir;
337 (lib.strings.removePrefix "/var/lib/" varDir + "/${name}");
338 RuntimeDirectoryPreserve = "yes";
339 RuntimeDirectory = assert lib.strings.hasPrefix "/run/" socketsDir;
340 lib.strings.removePrefix "/run/" socketsDir;
341 };
342
343 unitConfig.RequiresMountsFor = varDir;
344 }) env.taskwarrior-web) // {
345 taskserver-ca.postStart = ''
346 chown :${group} "${server_vardir}/keys/ca.key"
347 chmod g+r "${server_vardir}/keys/ca.key"
348 '';
349 taskserver-ca.serviceConfig.Slice = "taskwarrior.slice";
350 taskserver-init.serviceConfig.Slice = "taskwarrior.slice";
351 taskserver.serviceConfig.Slice = "taskwarrior.slice";
352 };
353
354 };
355}
diff --git a/modules/private/tasks/www/index.php b/modules/private/tasks/www/index.php
deleted file mode 100644
index 49ccd24..0000000
--- a/modules/private/tasks/www/index.php
+++ /dev/null
@@ -1,168 +0,0 @@
1<?php
2if (!isset($_SERVER["REMOTE_USER"])) {
3 die("please login");
4}
5$ldap_user = $_SERVER["REMOTE_USER"];
6$ldap_host = getenv("TASKD_LDAP_HOST");
7$ldap_dn = getenv('TASKD_LDAP_DN');
8$ldap_password = getenv('TASKD_LDAP_PASSWORD');
9$ldap_base = getenv('TASKD_LDAP_BASE');
10$ldap_filter = getenv('TASKD_LDAP_FILTER');
11$host = getenv('TASKD_HOST');
12$vardir = getenv('TASKD_VARDIR');
13
14$connect = ldap_connect($ldap_host);
15ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
16if (!$connect || !ldap_bind($connect, $ldap_dn, $ldap_password)) {
17 die("impossible to connect to LDAP");
18}
19
20$search_query = str_replace('%login%', ldap_escape($ldap_user), $ldap_filter);
21
22$search = ldap_search($connect, $ldap_base, $search_query);
23$info = ldap_get_entries($connect, $search);
24
25if (ldap_count_entries($connect, $search) != 1) {
26 die("Impossible to find user in LDAP");
27}
28
29$entries = [];
30foreach($info[0]["immaetaskid"] as $key => $value) {
31 if ($key !== "count") {
32 $entries[] = explode(":", $value);
33 }
34}
35
36if (isset($_GET["file"])) {
37 $basecert = $vardir . "/userkeys/" . $ldap_user;
38 if (!file_exists($basecert . ".cert.pem")) {
39 exec("taskserver-user-certs $ldap_user");
40 }
41 $certificate = file_get_contents($basecert . ".cert.pem");
42 $cert_key = file_get_contents($basecert . ".key.pem");
43
44 // IdenTrust DST Root CA X3
45 // obtained here: https://letsencrypt.org/fr/certificates/
46 $server_cert = "-----BEGIN CERTIFICATE-----
47MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
48TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
49cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
50WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
51ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
52MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
53h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
540TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
55A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
56T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
57B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
58B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
59KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
60OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
61jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
62qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
63rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
64HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
65hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
66ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
673BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
68NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
69ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
70TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
71jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
72oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
734RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
74mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
75emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
76-----END CERTIFICATE-----";
77
78 $file = $_GET["file"];
79 switch($file) {
80 case "ca.cert.pem":
81 $content = $server_cert;
82 $name = "ca.cert.pem";
83 $type = "application/x-x509-ca-cert";
84 break;
85 case "cert.pem":
86 $content = $certificate;
87 $name = $ldap_user . ".cert.pem";
88 $type = "application/x-x509-ca-cert";
89 break;
90 case "key.pem":
91 $content = $cert_key;
92 $name = $ldap_user . ".key.pem";
93 $type = "application/x-x509-ca-cert";
94 break;
95 case "mirakel";
96 foreach ($entries as $entry) {
97 list($org, $user, $key) = $entry;
98 if ($key == $_GET["key"]) { break; }
99 }
100 $name = $user . ".mirakel";
101 $type = "text/plain";
102 $content = "username: $user
103org: $org
104user key: $key
105server: $host
106client.cert:
107$certificate
108Client.key:
109$cert_key
110ca.cert:
111$server_cert
112";
113 break;
114 default:
115 die("invalid file name");
116 break;
117 }
118
119 header("Content-Type: $type");
120 header('Content-Disposition: attachment; filename="' . $name . '"');
121 header('Content-Transfer-Encoding: binary');
122 header('Accept-Ranges: bytes');
123 header('Cache-Control: private');
124 header('Pragma: private');
125 echo $content;
126 exit;
127}
128?>
129<html>
130<header>
131 <title>Taskwarrior configuration</title>
132</header>
133<body>
134<ul>
135 <li><a href="?file=ca.cert.pem">ca.cert.pem</a></li>
136 <li><a href="?file=cert.pem"><?php echo $ldap_user; ?>.cert.pem</a></li>
137 <li><a href="?file=key.pem"><?php echo $ldap_user; ?>.key.pem</a></li>
138</ul>
139For command line interface, download the files, put them near your Taskwarrior
140configuration files, and add that to your Taskwarrior configuration:
141<pre>
142taskd.certificate=/path/to/<?php echo $ldap_user; ?>.cert.pem
143taskd.key=/path/to/<?php echo $ldap_user; ?>.key.pem
144taskd.server=<?php echo $host ."\n"; ?>
145<?php if (count($entries) > 1) {
146 echo "# Chose one of them\n";
147 foreach($entries as $entry) {
148 list($org, $user, $key) = $entry;
149 echo "# taskd.credentials=$org/$user/$key\n";
150 }
151} else { ?>
152taskd.credentials=<?php echo $entries[0][0]; ?>/<?php echo $entries[0][1]; ?>/<?php echo $entries[0][2]; ?>
153<?php } ?>
154taskd.ca=/path/to/ca.cert.pem
155</pre>
156For Mirakel, download and import the file:
157<ul>
158<?php
159foreach ($entries as $entry) {
160 list($org, $user, $key) = $entry;
161 echo '<li><a href="?file=mirakel&key='.$key.'">' . $user . '.mirakel</a></li>';
162}
163?>
164</ul>
165For Android Taskwarrior app, see instructions <a href="https://bitbucket.org/kvorobyev/taskwarriorandroid/wiki/Configuration">here</a>.
166</body>
167</html>
168
diff --git a/modules/private/vpn/default.nix b/modules/private/vpn/default.nix
deleted file mode 100644
index d4b197d..0000000
--- a/modules/private/vpn/default.nix
+++ /dev/null
@@ -1,65 +0,0 @@
1{ config, pkgs, lib, ... }:
2let
3 cfg = config.myServices.vpn;
4in
5{
6 options.myServices = {
7 vpn.enable = lib.mkEnableOption "Enable vpn service";
8 };
9
10 config = lib.mkIf cfg.enable {
11 secrets.keys = {
12 "tinc/key.priv" = {
13 user = "root";
14 group = "root";
15 permissions = "0400";
16 text = config.myEnv.vpn.eldiron.privateKey;
17 };
18 "tinc/key.pub" = {
19 user = "root";
20 group = "root";
21 permissions = "0400";
22 text = config.myEnv.vpn.eldiron.publicKey;
23 };
24 };
25 networking.firewall.allowedTCPPorts = [ 655 1194 ];
26 system.activationScripts.tinc = let
27 configFiles = pkgs.runCommand "tinc-files" {
28 mainInterface = "eth0";
29 hostName = "ImmaeEu";
30 network = "Immae";
31 keyFile = config.secrets.fullPaths."tinc/key.priv";
32 } ''
33 mkdir -p $out
34 for i in ${./tinc}/*; do
35 substituteAll $i $out/$(basename $i)
36 done
37 '';
38 in ''
39 install -m750 -o root -g root -d /var/lib/tinc/ /var/lib/tinc/Immae
40 install -m700 -o root -g root -t /var/lib/tinc/Immae ${configFiles}/{host-*,tinc-*}
41 install -m400 -o root -g root -t /var/lib/tinc/Immae ${configFiles}/tinc.conf
42 if [ ! -d /var/lib/tinc/Immae/hosts ]; then
43 ${pkgs.git}/bin/git clone -b master https://git.immae.eu/perso/Immae/Config/tinc/hosts /var/lib/tinc/Immae/hosts
44 fi
45 '';
46
47 systemd.slices.tinc = {
48 description = "Tinc slice";
49 };
50
51 systemd.services.tinc-Immae = {
52 description = "Tinc Daemon - Immae";
53 wantedBy = [ "multi-user.target" ];
54 after = [ "network.target" ];
55 path = [ pkgs.tinc pkgs.bashInteractive pkgs.iproute pkgs.gnused pkgs.gawk pkgs.git pkgs.glibc ];
56 serviceConfig = {
57 Slice = "tinc.slice";
58 Type = "simple";
59 Restart = "always";
60 RestartSec = "3";
61 ExecStart = "${pkgs.tinc}/bin/tincd -d1 -D -c /var/lib/tinc/Immae --pidfile /run/tinc.Immae.pid";
62 };
63 };
64 };
65}
diff --git a/modules/private/websites/bakeer/cloud.nix b/modules/private/websites/bakeer/cloud.nix
deleted file mode 100644
index bf78317..0000000
--- a/modules/private/websites/bakeer/cloud.nix
+++ /dev/null
@@ -1,23 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.bakeer.cloud;
4 nextcloud = config.myServices.tools.cloud.farm.package;
5in {
6 options.myServices.websites.bakeer.cloud.enable = lib.mkEnableOption "enable Bakeer’s cloud";
7
8 config = lib.mkIf cfg.enable {
9 myServices.tools.cloud.farm.instances = [ "bakeer" ];
10 services.websites.env.production.modules = [ "proxy_fcgi" ];
11 services.websites.env.production.vhostConfs.bakeer = {
12 certName = "bakeer";
13 certMainHost = "bakeer.immae.eu";
14 addToCerts = true;
15 hosts = ["bakeer.immae.eu" "baxsolution.immae.eu"];
16 root = nextcloud;
17 extraConfig = [
18 config.myServices.tools.cloud.farm.vhosts.bakeer
19 ];
20 };
21 };
22}
23
diff --git a/modules/private/websites/capitaines/discourse_static/discourse.png b/modules/private/websites/capitaines/discourse_static/discourse.png
deleted file mode 100644
index 91ce42d..0000000
--- a/modules/private/websites/capitaines/discourse_static/discourse.png
+++ /dev/null
Binary files differ
diff --git a/modules/private/websites/capitaines/discourse_static/index.html b/modules/private/websites/capitaines/discourse_static/index.html
deleted file mode 100644
index 4c2ead0..0000000
--- a/modules/private/websites/capitaines/discourse_static/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
1<!DOCTYPE html>
2<html lang='en'>
3 <head>
4 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
5 <title>This instance is now closed - Discourse</title>
6 <style>
7 body {
8 text-align: center;
9 background: #f9f9f9;
10 font-family: sans-serif;
11 }
12 img {
13 max-width: 235px;
14 width: 100%;
15 }
16 h1 {
17 font-size: 20px;
18 font-weight: 400;
19 }
20 </style>
21 </head>
22 <body>
23 <div>
24 <img alt='Discourse capitaines' src='/discourse.png'>
25 <h1>Sorry, this instance is closed now.</h1>
26 </div>
27 </body>
28</html>
diff --git a/modules/private/websites/capitaines/landing_pages.nix b/modules/private/websites/capitaines/landing_pages.nix
deleted file mode 100644
index edba8b9..0000000
--- a/modules/private/websites/capitaines/landing_pages.nix
+++ /dev/null
@@ -1,57 +0,0 @@
1{ lib, config, ... }:
2let
3 cfg = config.myServices.websites.capitaines.landing_pages;
4 certName = "capitaines";
5 domain = "capitaines.fr";
6in {
7 options.myServices.websites.capitaines.landing_pages.enable = lib.mkEnableOption "enable Capitaines's landing pages";
8
9 config = lib.mkIf cfg.enable {
10 services.websites.env.production.vhostConfs.capitaines_mastodon = rec {
11 inherit certName;
12 certMainHost = "mastodon.${domain}";
13 hosts = [ certMainHost ];
14 root = ./mastodon_static;
15 extraConfig = [
16 ''
17 ErrorDocument 404 /index.html
18 <Directory ${./mastodon_static}>
19 DirectoryIndex index.html
20 Options Indexes FollowSymLinks MultiViews Includes
21 Require all granted
22 </Directory>
23 ''
24 ];
25 };
26
27 services.websites.env.production.vhostConfs.capitaines_discourse = {
28 inherit certName;
29 addToCerts = true;
30 hosts = [ "discourse.${domain}" ];
31 root = ./discourse_static;
32 extraConfig = [
33 ''
34 ErrorDocument 404 /index.html
35 <Directory ${./discourse_static}>
36 DirectoryIndex index.html
37 Options Indexes FollowSymLinks MultiViews Includes
38 Require all granted
39 </Directory>
40 ''
41 ];
42 };
43
44 services.websites.env.production.vhostConfs.capitaines = {
45 inherit certName;
46 addToCerts = true;
47 hosts = [ domain ];
48 root = ../_www;
49 extraConfig = [ ''
50 <Directory ${../_www}>
51 DirectoryIndex index.htm
52 Require all granted
53 </Directory>
54 '' ];
55 };
56 };
57}
diff --git a/modules/private/websites/capitaines/mastodon_static/index.html b/modules/private/websites/capitaines/mastodon_static/index.html
deleted file mode 100644
index fae4152..0000000
--- a/modules/private/websites/capitaines/mastodon_static/index.html
+++ /dev/null
@@ -1,29 +0,0 @@
1<!DOCTYPE html>
2<html lang='en'>
3 <head>
4 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
5 <title>This instance is now closed - Mastodon</title>
6 <style>
7 body {
8 text-align: center;
9 background: #282c37;
10 font-family: sans-serif;
11 }
12 img {
13 max-width: 470px;
14 width: 100%;
15 }
16 h1 {
17 font-size: 20px;
18 font-weight: 400;
19 color: #9baec8;
20 }
21 </style>
22 </head>
23 <body>
24 <div>
25 <img alt='Mastodon' src='/oops.png'>
26 <h1>Sorry, this instance is closed now.</h1>
27 </div>
28 </body>
29</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
index 0abddad..0000000
--- a/modules/private/websites/capitaines/mastodon_static/oops.png
+++ /dev/null
Binary files differ
diff --git a/modules/private/websites/chloe/app/default.nix b/modules/private/websites/chloe/app/default.nix
deleted file mode 100644
index d23e3e0..0000000
--- a/modules/private/websites/chloe/app/default.nix
+++ /dev/null
@@ -1,22 +0,0 @@
1{ environment ? "prod"
2, varDir ? "/var/lib/chloe_${environment}"
3, spip, stdenv, sassc, sources }:
4let
5 siteDir = stdenv.mkDerivation {
6 version = sources.websites-chloe-app.version;
7 pname = "chloe";
8 src = sources.websites-chloe-app;
9 buildPhase = ''
10 make
11 '';
12 installPhase = ''
13 cp -a . $out
14 '';
15 buildInputs = [ sassc ];
16 };
17in
18spip.override {
19 ldap = true;
20 siteName = "chloe";
21 inherit environment siteDir varDir;
22}
diff --git a/modules/private/websites/chloe/config/chmod.php b/modules/private/websites/chloe/config/chmod.php
deleted file mode 100644
index aae16cd..0000000
--- a/modules/private/websites/chloe/config/chmod.php
+++ /dev/null
@@ -1,4 +0,0 @@
1<?php
2if (!defined("_ECRIRE_INC_VERSION")) return;
3if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', 0777);
4?> \ No newline at end of file
diff --git a/modules/private/websites/chloe/config/connect.php b/modules/private/websites/chloe/config/connect.php
deleted file mode 100644
index 18b0933..0000000
--- a/modules/private/websites/chloe/config/connect.php
+++ /dev/null
@@ -1,15 +0,0 @@
1<?php
2if (!defined("_ECRIRE_INC_VERSION")) return;
3define('_MYSQL_SET_SQL_MODE',true);
4$GLOBALS['spip_connect_version'] = 0.7;
5spip_connect_db(
6 getenv("SPIP_MYSQL_HOST"),
7 getenv("SPIP_MYSQL_PORT"),
8 getenv("SPIP_MYSQL_USER"),
9 getenv("SPIP_MYSQL_PASSWORD"),
10 getenv("SPIP_MYSQL_DB"),
11 'mysql',
12 'spip',
13 'ldap.php'
14);
15?>
diff --git a/modules/private/websites/chloe/config/ldap.php b/modules/private/websites/chloe/config/ldap.php
deleted file mode 100644
index 825b7ed..0000000
--- a/modules/private/websites/chloe/config/ldap.php
+++ /dev/null
@@ -1,9 +0,0 @@
1<?php
2if (!defined("_ECRIRE_INC_VERSION")) return;
3$GLOBALS['ldap_base'] = getenv("SPIP_LDAP_BASE");
4$GLOBALS['ldap_link'] = @ldap_connect(getenv("SPIP_LDAP_HOST"));
5@ldap_set_option($GLOBALS['ldap_link'],LDAP_OPT_PROTOCOL_VERSION,'3');
6@ldap_bind($GLOBALS['ldap_link'],getenv("SPIP_LDAP_SEARCH_DN"), getenv("SPIP_LDAP_SEARCH_PW"));
7$GLOBALS['ldap_champs'] = array('login' => array('sAMAccountName','uid','login','userid','cn','sn'),'nom' => 'cn','email' => 'mail','bio' => 'description',);
8$GLOBALS['ldap_search'] = getenv("SPIP_LDAP_SEARCH");
9?>
diff --git a/modules/private/websites/chloe/integration.nix b/modules/private/websites/chloe/integration.nix
deleted file mode 100644
index 533568e..0000000
--- a/modules/private/websites/chloe/integration.nix
+++ /dev/null
@@ -1,104 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 apacheUser = config.services.httpd.Inte.user;
4 apacheGroup = config.services.httpd.Inte.group;
5 ccfg = config.myEnv.websites.chloe.integration;
6 webRoot = "/var/lib/ftp/immae/chloe";
7 varDir = "/var/lib/ftp/immae/chloe_var";
8 cfg = config.myServices.websites.chloe.integration;
9in {
10 options.myServices.websites.chloe.integration.enable = lib.mkEnableOption "enable Chloe's website in integration";
11
12 config = lib.mkIf cfg.enable {
13 secrets.keys."websites/chloe/integration" = {
14 user = apacheUser;
15 group = apacheGroup;
16 permissions = "0400";
17 text = ''
18 SetEnv SPIP_CONFIG_DIR "${./config}"
19 SetEnv SPIP_VAR_DIR "${varDir}"
20 SetEnv SPIP_SITE "chloe-dev"
21 SetEnv SPIP_LDAP_BASE "dc=immae,dc=eu"
22 SetEnv SPIP_LDAP_HOST "ldaps://ldap.immae.eu"
23 SetEnv SPIP_LDAP_SEARCH_DN "${ccfg.ldap.dn}"
24 SetEnv SPIP_LDAP_SEARCH_PW "${ccfg.ldap.password}"
25 SetEnv SPIP_LDAP_SEARCH "${ccfg.ldap.filter}"
26 SetEnv SPIP_MYSQL_HOST "${ccfg.mysql.host}"
27 SetEnv SPIP_MYSQL_PORT "${ccfg.mysql.port}"
28 SetEnv SPIP_MYSQL_DB "${ccfg.mysql.database}"
29 SetEnv SPIP_MYSQL_USER "${ccfg.mysql.user}"
30 SetEnv SPIP_MYSQL_PASSWORD "${ccfg.mysql.password}"
31 '';
32 };
33 systemd.services.phpfpm-chloe_integration.after = lib.mkAfter [ "mysql.service" ];
34 systemd.services.phpfpm-chloe_integration.wants = [ "mysql.service" ];
35 services.phpfpm.pools.chloe_integration = {
36 user = config.services.httpd.Inte.user;
37 group = config.services.httpd.Inte.group;
38 settings = {
39 "listen.owner" = apacheUser;
40 "listen.group" = apacheGroup;
41 "php_admin_value[upload_max_filesize]" = "20M";
42 "php_admin_value[post_max_size]" = "20M";
43 # "php_admin_flag[log_errors]" = "on";
44 "php_admin_value[open_basedir]" = "${../../../../pkgs/webapps/spip/spip_mes_options.php}:${./config}:${webRoot}:${varDir}:/tmp";
45 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
46 "pm" = "ondemand";
47 "pm.max_children" = "5";
48 "pm.process_idle_timeout" = "60";
49 };
50 phpPackage = pkgs.php72;
51 };
52 system.activationScripts.chloe_integration = {
53 deps = [ "wrappers" ];
54 text = ''
55 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${varDir} ${varDir}/IMG ${varDir}/tmp ${varDir}/local
56 install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${varDir}/phpSessions
57 '';
58 };
59 services.websites.env.integration.modules = [ "proxy_fcgi" ];
60 services.websites.env.integration.vhostConfs.chloe_integration = {
61 certName = "integration";
62 addToCerts = true;
63 hosts = ["test.chc.immae.dev" ];
64 root = webRoot;
65 extraConfig = [
66 ''
67 Include ${config.secrets.fullPaths."websites/chloe/integration"}
68
69 RewriteEngine On
70
71 <FilesMatch "\.php$">
72 SetHandler "proxy:unix:${config.services.phpfpm.pools.chloe_integration.socket}|fcgi://localhost"
73 </FilesMatch>
74
75 <Directory ${webRoot}>
76 DirectoryIndex index.php index.htm index.html
77 Options -Indexes +FollowSymLinks +MultiViews +Includes
78 Include ${webRoot}/htaccess.txt
79
80 AllowOverride AuthConfig FileInfo Limit
81 Require all granted
82 </Directory>
83
84 <DirectoryMatch "${webRoot}/squelettes">
85 Require all denied
86 </DirectoryMatch>
87
88 <FilesMatch "(.htaccess|rewrite-rules|.gitignore)$">
89 Require all denied
90 </FilesMatch>
91
92 <Location />
93 Use LDAPConnect
94 Require ldap-group cn=chc.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
95 ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://osteopathe-cc.fr\"></html>"
96 </Location>
97 ''
98 ];
99 };
100 services.websites.env.integration.watchPaths = [
101 config.secrets.fullPaths."websites/chloe/integration"
102 ];
103 };
104}
diff --git a/modules/private/websites/chloe/production.nix b/modules/private/websites/chloe/production.nix
deleted file mode 100644
index 211232c..0000000
--- a/modules/private/websites/chloe/production.nix
+++ /dev/null
@@ -1,112 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 apacheUser = config.services.httpd.Prod.user;
4 apacheGroup = config.services.httpd.Prod.group;
5 ccfg = config.myEnv.websites.chloe.production;
6 app = pkgs.callPackage ./app {
7 inherit (ccfg) environment;
8 inherit (pkgs.webapps) spip;
9 varDir = "/var/lib/chloe_production";
10 };
11 cfg = config.myServices.websites.chloe.production;
12in {
13 options.myServices.websites.chloe.production.enable = lib.mkEnableOption "enable Chloe's website in production";
14
15 config = lib.mkIf cfg.enable {
16 secrets.keys."websites/chloe/production" = {
17 user = apacheUser;
18 group = apacheGroup;
19 permissions = "0400";
20 text = ''
21 SetEnv SPIP_CONFIG_DIR "${./config}"
22 SetEnv SPIP_VAR_DIR "${app.varDir}"
23 SetEnv SPIP_SITE "chloe-${app.environment}"
24 SetEnv SPIP_LDAP_BASE "dc=immae,dc=eu"
25 SetEnv SPIP_LDAP_HOST "ldaps://ldap.immae.eu"
26 SetEnv SPIP_LDAP_SEARCH_DN "${ccfg.ldap.dn}"
27 SetEnv SPIP_LDAP_SEARCH_PW "${ccfg.ldap.password}"
28 SetEnv SPIP_LDAP_SEARCH "${ccfg.ldap.filter}"
29 SetEnv SPIP_MYSQL_HOST "${ccfg.mysql.host}"
30 SetEnv SPIP_MYSQL_PORT "${ccfg.mysql.port}"
31 SetEnv SPIP_MYSQL_DB "${ccfg.mysql.database}"
32 SetEnv SPIP_MYSQL_USER "${ccfg.mysql.user}"
33 SetEnv SPIP_MYSQL_PASSWORD "${ccfg.mysql.password}"
34 '';
35 };
36 services.webstats.sites = [ { name = "osteopathe-cc.fr"; } ];
37
38 systemd.services.phpfpm-chloe_production.after = lib.mkAfter [ "mysql.service" ];
39 systemd.services.phpfpm-chloe_production.wants = [ "mysql.service" ];
40 services.phpfpm.pools.chloe_production = {
41 user = config.services.httpd.Prod.user;
42 group = config.services.httpd.Prod.group;
43 settings = {
44 "listen.owner" = apacheUser;
45 "listen.group" = apacheGroup;
46 "php_admin_value[upload_max_filesize]" = "20M";
47 "php_admin_value[post_max_size]" = "20M";
48 # "php_admin_flag[log_errors]" = "on";
49 "php_admin_value[open_basedir]" = "${app.spipConfig}:${./config}:${app}:${app.varDir}:/tmp";
50 "php_admin_value[session.save_path]" = "${app.varDir}/phpSessions";
51 "pm" = "dynamic";
52 "pm.max_children" = "20";
53 "pm.start_servers" = "2";
54 "pm.min_spare_servers" = "1";
55 "pm.max_spare_servers" = "3";
56 };
57 phpPackage = pkgs.php72;
58 };
59 system.activationScripts.chloe_production = {
60 deps = [ "wrappers" ];
61 text = ''
62 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir} ${app.varDir}/IMG ${app.varDir}/tmp ${app.varDir}/local
63 install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions
64 '';
65 };
66 services.websites.env.production.modules = [ "proxy_fcgi" ];
67 services.websites.env.production.vhostConfs.chloe = {
68 certName = "chloe";
69 certMainHost = "osteopathe-cc.fr";
70 hosts = ["osteopathe-cc.fr" "www.osteopathe-cc.fr" ];
71 root = app.webRoot;
72 extraConfig = [
73 ''
74 Use Stats osteopathe-cc.fr
75
76 RewriteEngine On
77 RewriteCond "%{HTTP_HOST}" "!^www\.osteopathe-cc\.fr$" [NC]
78 RewriteRule ^(.+)$ https://www.osteopathe-cc.fr$1 [R=302,L]
79
80 Include ${config.secrets.fullPaths."websites/chloe/production"}
81
82 RewriteEngine On
83 RewriteRule ^/news.rss /spip.php?page=backend&id_rubrique=1
84
85 <FilesMatch "\.php$">
86 SetHandler "proxy:unix:${config.services.phpfpm.pools.chloe_production.socket}|fcgi://localhost"
87 </FilesMatch>
88
89 <Directory ${app.webRoot}>
90 DirectoryIndex index.php index.htm index.html
91 Options -Indexes +FollowSymLinks +MultiViews +Includes
92 Include ${app.webRoot}/htaccess.txt
93
94 AllowOverride AuthConfig FileInfo Limit
95 Require all granted
96 </Directory>
97
98 <DirectoryMatch "${app.webRoot}/squelettes">
99 Require all denied
100 </DirectoryMatch>
101
102 <FilesMatch "(.htaccess|rewrite-rules|.gitignore)$">
103 Require all denied
104 </FilesMatch>
105 ''
106 ];
107 };
108 services.websites.env.production.watchPaths = [
109 config.secrets.fullPaths."websites/chloe/production"
110 ];
111 };
112}
diff --git a/modules/private/websites/cip-ca/sympa.nix b/modules/private/websites/cip-ca/sympa.nix
deleted file mode 100644
index bb66fc6..0000000
--- a/modules/private/websites/cip-ca/sympa.nix
+++ /dev/null
@@ -1,28 +0,0 @@
1{ lib, config, ... }:
2let
3 cfg = config.myServices.websites.cip-ca.sympa;
4in
5{
6 options.myServices.websites.cip-ca.sympa.enable = lib.mkEnableOption "enable cip-ca’s sympa website";
7 config = lib.mkIf cfg.enable {
8 services.websites.env.tools.vhostConfs.cipca_sympa = {
9 certName = "cip-ca";
10 certMainHost = "mail.cip-ca.fr";
11 hosts = [ "mail.cip-ca.fr" ];
12 root = null;
13 extraConfig = [
14 ''
15 Alias /static-sympa/ /var/lib/sympa/static_content/
16 <Directory /var/lib/sympa/static_content/>
17 Require all granted
18 AllowOverride none
19 </Directory>
20 <Location /sympa>
21 SetHandler "proxy:unix:/run/sympa/wwsympa.socket|fcgi://"
22 Require all granted
23 </Location>
24 ''
25 ];
26 };
27 };
28}
diff --git a/modules/private/websites/commons/adminer.nix b/modules/private/websites/commons/adminer.nix
deleted file mode 100644
index eae6a9a..0000000
--- a/modules/private/websites/commons/adminer.nix
+++ /dev/null
@@ -1,4 +0,0 @@
1{ config, callPackage }:
2callPackage ../tools/tools/adminer.nix {
3 forcePhpSocket = config.services.phpfpm.pools.adminer.socket;
4}
diff --git a/modules/private/websites/connexionswing/app/default.nix b/modules/private/websites/connexionswing/app/default.nix
deleted file mode 100644
index b14b03b..0000000
--- a/modules/private/websites/connexionswing/app/default.nix
+++ /dev/null
@@ -1,29 +0,0 @@
1{ environment, varDir, secretsPath
2, composerEnv, fetchurl, fetchgit, sources }:
3let
4 app = composerEnv.buildPackage (
5 import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
6 rec {
7 pname = "connexionswing";
8 name = "${pname}-${version}";
9 version = sources.websites-connexionswing-app.version;
10 src = sources.websites-connexionswing-app;
11 noDev = (environment == "prod");
12 preInstall = ''
13 export SYMFONY_ENV="${environment}"
14 '';
15 postInstall = ''
16 cd $out
17 ${if environment == "prod" then "php ./bin/console assetic:dump --env=prod --no-debug" else ""}
18 rm app/config/parameters.yml
19 ln -sf ${secretsPath} app/config/parameters.yml
20 rm -rf var/{logs,cache}
21 ln -sf ${varDir}/var/{logs,cache} var/
22 ln -sf ${varDir}/{medias,uploads} web/images/
23 '';
24 passthru = {
25 inherit varDir environment;
26 webRoot = "${app}/web";
27 };
28 });
29in app
diff --git a/modules/private/websites/connexionswing/app/php-packages.nix b/modules/private/websites/connexionswing/app/php-packages.nix
deleted file mode 100644
index 10bb737..0000000
--- a/modules/private/websites/connexionswing/app/php-packages.nix
+++ /dev/null
@@ -1,597 +0,0 @@
1# Generated with composer2nix and adapted to return only the list of
2# packages
3{ composerEnv, fetchurl, fetchgit ? null }:
4{
5 packages = {
6 "behat/transliterator" = {
7 targetDir = "";
8 src = composerEnv.buildZipPackage {
9 name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
10 src = fetchurl {
11 url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
12 sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
13 };
14 };
15 };
16 "components/bootstrap" = {
17 targetDir = "";
18 src = composerEnv.buildZipPackage {
19 name = "components-bootstrap-670295b9d6170a79acc8586a15e729bf24128275";
20 src = fetchurl {
21 url = https://api.github.com/repos/components/bootstrap/zipball/670295b9d6170a79acc8586a15e729bf24128275;
22 sha256 = "0lcq9cjnywvf1nd8k99flgcf2dmfgyyxzsvcpip8xiibmh5x04p9";
23 };
24 };
25 };
26 "components/jquery" = {
27 targetDir = "";
28 src = composerEnv.buildZipPackage {
29 name = "components-jquery-5dd7297d7603e11e53bdcca2a71074d92de37b8f";
30 src = fetchurl {
31 url = https://api.github.com/repos/components/jquery/zipball/5dd7297d7603e11e53bdcca2a71074d92de37b8f;
32 sha256 = "1maplw3yic1pzbwwl2amjlivipsi1w0r8bq7i0mmjaqf7wij506i";
33 };
34 };
35 };
36 "components/jqueryui" = {
37 targetDir = "";
38 src = composerEnv.buildZipPackage {
39 name = "components-jqueryui-44ecf3794cc56b65954cc19737234a3119d036cc";
40 src = fetchurl {
41 url = https://api.github.com/repos/components/jqueryui/zipball/44ecf3794cc56b65954cc19737234a3119d036cc;
42 sha256 = "1y0ppxk44jkxbh38i05sg0zcgk927s5wy6sjngwr5qifibqbcbhk";
43 };
44 };
45 };
46 "composer/ca-bundle" = {
47 targetDir = "";
48 src = composerEnv.buildZipPackage {
49 name = "composer-ca-bundle-d2c0a83b7533d6912e8d516756ebd34f893e9169";
50 src = fetchurl {
51 url = https://api.github.com/repos/composer/ca-bundle/zipball/d2c0a83b7533d6912e8d516756ebd34f893e9169;
52 sha256 = "1as399dzrfbjnifb87j1g5cvrbacyddbay8fv59i56xx1bdq7lwc";
53 };
54 };
55 };
56 "doctrine/annotations" = {
57 targetDir = "";
58 src = composerEnv.buildZipPackage {
59 name = "doctrine-annotations-54cacc9b81758b14e3ce750f205a393d52339e97";
60 src = fetchurl {
61 url = https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97;
62 sha256 = "1wi5skihqbcinlkrkr15nmmvqkn2gydqib8xl232abdvfq1q0w24";
63 };
64 };
65 };
66 "doctrine/cache" = {
67 targetDir = "";
68 src = composerEnv.buildZipPackage {
69 name = "doctrine-cache-eb152c5100571c7a45470ff2a35095ab3f3b900b";
70 src = fetchurl {
71 url = https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b;
72 sha256 = "0iq0qqv1smlqz63jhj2fpjy54c5dwfwxyf5c89iky6i0yb81gwyd";
73 };
74 };
75 };
76 "doctrine/collections" = {
77 targetDir = "";
78 src = composerEnv.buildZipPackage {
79 name = "doctrine-collections-1a4fb7e902202c33cce8c55989b945612943c2ba";
80 src = fetchurl {
81 url = https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba;
82 sha256 = "0fkiwkx7zbmfnh4p21za807lh1n7g1f4lpgy8y59g4r5krvpl90w";
83 };
84 };
85 };
86 "doctrine/common" = {
87 targetDir = "";
88 src = composerEnv.buildZipPackage {
89 name = "doctrine-common-4acb8f89626baafede6ee5475bc5844096eba8a9";
90 src = fetchurl {
91 url = https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9;
92 sha256 = "0qjqframvg81z3lwqaj5haanqj9v3dfbj170pxmwlgmrfsbr16zh";
93 };
94 };
95 };
96 "doctrine/dbal" = {
97 targetDir = "";
98 src = composerEnv.buildZipPackage {
99 name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873";
100 src = fetchurl {
101 url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873;
102 sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3";
103 };
104 };
105 };
106 "doctrine/doctrine-bundle" = {
107 targetDir = "";
108 src = composerEnv.buildZipPackage {
109 name = "doctrine-doctrine-bundle-703fad32e4c8cbe609caf45a71a1d4266c830f0f";
110 src = fetchurl {
111 url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/703fad32e4c8cbe609caf45a71a1d4266c830f0f;
112 sha256 = "0v2f63j22i3im8jbmv7spi8j42fay6dnxjvbxnbwj190ajxl6sdp";
113 };
114 };
115 };
116 "doctrine/doctrine-cache-bundle" = {
117 targetDir = "";
118 src = composerEnv.buildZipPackage {
119 name = "doctrine-doctrine-cache-bundle-4c8e363f96427924e7e519c5b5119b4f54512697";
120 src = fetchurl {
121 url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/4c8e363f96427924e7e519c5b5119b4f54512697;
122 sha256 = "1irm04iijzq6gziknwyb10a9s0xbzh04xs5i2d6aac86cc29187c";
123 };
124 };
125 };
126 "doctrine/doctrine-migrations-bundle" = {
127 targetDir = "";
128 src = composerEnv.buildZipPackage {
129 name = "doctrine-doctrine-migrations-bundle-a9e506369f931351a2a6dd2aef588a822802b1b7";
130 src = fetchurl {
131 url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/a9e506369f931351a2a6dd2aef588a822802b1b7;
132 sha256 = "1jgrqsgdwcm2g8rml76qr6b19s1vxfbnrp43qr6n1g9kbx7y9wg9";
133 };
134 };
135 };
136 "doctrine/inflector" = {
137 targetDir = "";
138 src = composerEnv.buildZipPackage {
139 name = "doctrine-inflector-90b2128806bfde671b6952ab8bea493942c1fdae";
140 src = fetchurl {
141 url = https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae;
142 sha256 = "01vmclj3k7xil51jg329fznshh8d07pvm4mr89lvfn1d7fyrq6qw";
143 };
144 };
145 };
146 "doctrine/instantiator" = {
147 targetDir = "";
148 src = composerEnv.buildZipPackage {
149 name = "doctrine-instantiator-8e884e78f9f0eb1329e445619e04456e64d8051d";
150 src = fetchurl {
151 url = https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d;
152 sha256 = "15dcja45rnwya431pcm826l68k1g8f1fabl7rih69alcdyvdlln4";
153 };
154 };
155 };
156 "doctrine/lexer" = {
157 targetDir = "";
158 src = composerEnv.buildZipPackage {
159 name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
160 src = fetchurl {
161 url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
162 sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
163 };
164 };
165 };
166 "doctrine/migrations" = {
167 targetDir = "";
168 src = composerEnv.buildZipPackage {
169 name = "doctrine-migrations-c81147c0f2938a6566594455367e095150547f72";
170 src = fetchurl {
171 url = https://api.github.com/repos/doctrine/migrations/zipball/c81147c0f2938a6566594455367e095150547f72;
172 sha256 = "0x8hvxbm3f40sx25nq8zlh1kr936pagghzp89l0gdy5bar7cdzi5";
173 };
174 };
175 };
176 "doctrine/orm" = {
177 targetDir = "";
178 src = composerEnv.buildZipPackage {
179 name = "doctrine-orm-810a7baf81462a5ddf10e8baa8cb94b6eec02754";
180 src = fetchurl {
181 url = https://api.github.com/repos/doctrine/doctrine2/zipball/810a7baf81462a5ddf10e8baa8cb94b6eec02754;
182 sha256 = "1hmkc7917kgnav9hmlgvlp7qwm3zjj910ci71g9yqwjh6s28wrf1";
183 };
184 };
185 };
186 "fig/link-util" = {
187 targetDir = "";
188 src = composerEnv.buildZipPackage {
189 name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac";
190 src = fetchurl {
191 url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac;
192 sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64";
193 };
194 };
195 };
196 "friendsofsymfony/jsrouting-bundle" = {
197 targetDir = "";
198 src = composerEnv.buildZipPackage {
199 name = "friendsofsymfony-jsrouting-bundle-49c1069132dcef371fb526351569deabeb6f0d8e";
200 src = fetchurl {
201 url = https://api.github.com/repos/FriendsOfSymfony/FOSJsRoutingBundle/zipball/49c1069132dcef371fb526351569deabeb6f0d8e;
202 sha256 = "0ymmxhxbjnzj8bk3zq55vq0xvsaq82348v321gy2jyi90d19p5j7";
203 };
204 };
205 };
206 "gedmo/doctrine-extensions" = {
207 targetDir = "";
208 src = composerEnv.buildZipPackage {
209 name = "gedmo-doctrine-extensions-1e400fbd05b7e5f912f55fe95805450f7d3bed60";
210 src = fetchurl {
211 url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/1e400fbd05b7e5f912f55fe95805450f7d3bed60;
212 sha256 = "14hmivynyzc1c9l5kxj9gbwjrkv9m9lrjjx2r1m74wdhi5p0p20v";
213 };
214 };
215 };
216 "immae/connexionswing-ckeditor-component" = {
217 targetDir = "";
218 src = fetchgit {
219 name = "immae-connexionswing-ckeditor-component-3b35bd273a79f6b01fda7a246aed64aca147ea7a";
220 url = "https://git.immae.eu/perso/Immae/Projets/packagist/connexionswing-ckeditor-component.git";
221 rev = "3b35bd273a79f6b01fda7a246aed64aca147ea7a";
222 sha256 = "1w0y6k28ci73n0db9gwvqg7grzvh1z718ys9v1ik8cla7zw83bni";
223 };
224 };
225 "immae/jquery-touchswipe" = {
226 targetDir = "";
227 src = fetchgit {
228 name = "immae-jquery-touchswipe-3e15949df974d6612d76dc9ee75cd976dbcc2114";
229 url = "https://git.immae.eu/perso/Immae/Projets/packagist/jquery-touchswipe.git";
230 rev = "3e15949df974d6612d76dc9ee75cd976dbcc2114";
231 sha256 = "1pnvki1j3a65cdwwqs0id790ni813lh3r0m7556gdn0hsqa1cc4d";
232 };
233 };
234 "incenteev/composer-parameter-handler" = {
235 targetDir = "";
236 src = composerEnv.buildZipPackage {
237 name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550";
238 src = fetchurl {
239 url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550;
240 sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm";
241 };
242 };
243 };
244 "jdorn/sql-formatter" = {
245 targetDir = "";
246 src = composerEnv.buildZipPackage {
247 name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
248 src = fetchurl {
249 url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
250 sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
251 };
252 };
253 };
254 "kriswallsmith/assetic" = {
255 targetDir = "";
256 src = composerEnv.buildZipPackage {
257 name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1";
258 src = fetchurl {
259 url = https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1;
260 sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8";
261 };
262 };
263 };
264 "monolog/monolog" = {
265 targetDir = "";
266 src = composerEnv.buildZipPackage {
267 name = "monolog-monolog-fd8c787753b3a2ad11bc60c063cff1358a32a3b4";
268 src = fetchurl {
269 url = https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4;
270 sha256 = "0avf3y8raw23krwdb7kw9qb5bsr5ls4i7qd2vh7hcds3qjixg3h9";
271 };
272 };
273 };
274 "ocramius/proxy-manager" = {
275 targetDir = "";
276 src = composerEnv.buildZipPackage {
277 name = "ocramius-proxy-manager-57e9272ec0e8deccf09421596e0e2252df440e11";
278 src = fetchurl {
279 url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/57e9272ec0e8deccf09421596e0e2252df440e11;
280 sha256 = "10crhcnhz42b01i6lv6ysgc7awp7yw82p4i2a4sg6bjihw677yps";
281 };
282 };
283 };
284 "paragonie/random_compat" = {
285 targetDir = "";
286 src = composerEnv.buildZipPackage {
287 name = "paragonie-random_compat-258c89a6b97de7dfaf5b8c7607d0478e236b04fb";
288 src = fetchurl {
289 url = https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb;
290 sha256 = "11arrici2mgfj7r847wm423pqrvfj9wn9jcgyxnq4rzyahaxz5l1";
291 };
292 };
293 };
294 "psr/cache" = {
295 targetDir = "";
296 src = composerEnv.buildZipPackage {
297 name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
298 src = fetchurl {
299 url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
300 sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
301 };
302 };
303 };
304 "psr/container" = {
305 targetDir = "";
306 src = composerEnv.buildZipPackage {
307 name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
308 src = fetchurl {
309 url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
310 sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
311 };
312 };
313 };
314 "psr/link" = {
315 targetDir = "";
316 src = composerEnv.buildZipPackage {
317 name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562";
318 src = fetchurl {
319 url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562;
320 sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13";
321 };
322 };
323 };
324 "psr/log" = {
325 targetDir = "";
326 src = composerEnv.buildZipPackage {
327 name = "psr-log-4ebe3a8bf773a19edfe0a84b6585ba3d401b724d";
328 src = fetchurl {
329 url = https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d;
330 sha256 = "1mlcv17fjw39bjpck176ah1z393b6pnbw3jqhhrblj27c70785md";
331 };
332 };
333 };
334 "psr/simple-cache" = {
335 targetDir = "";
336 src = composerEnv.buildZipPackage {
337 name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
338 src = fetchurl {
339 url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
340 sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
341 };
342 };
343 };
344 "ricbra/robots-txt-bundle" = {
345 targetDir = "Ricbra/Bundle/RobotsTxtBundle";
346 src = composerEnv.buildZipPackage {
347 name = "ricbra-robots-txt-bundle-80d122a708893a762041464890e59a76babd6c22";
348 src = fetchurl {
349 url = https://api.github.com/repos/ricbra/robots-txt-bundle/zipball/80d122a708893a762041464890e59a76babd6c22;
350 sha256 = "0w3lfzy1ys0bwl3shy4ychldfd711w1p2y13i1az2z2gh731d0ad";
351 };
352 };
353 };
354 "robloach/component-installer" = {
355 targetDir = "";
356 src = composerEnv.buildZipPackage {
357 name = "robloach-component-installer-908a859aa7c4949ba9ad67091e67bac10b66d3d7";
358 src = fetchurl {
359 url = https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7;
360 sha256 = "19y5sv4k338bihzmm8iac6q43r18vxhmbpvrdhz8jn39r51ampq9";
361 };
362 };
363 };
364 "sensio/distribution-bundle" = {
365 targetDir = "";
366 src = composerEnv.buildZipPackage {
367 name = "sensio-distribution-bundle-eb6266b3b472e4002538610b28a0a04bcf94891a";
368 src = fetchurl {
369 url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/eb6266b3b472e4002538610b28a0a04bcf94891a;
370 sha256 = "0wyffqj924lz9cv0vbahyngjw1g850v0p34swygzzgp3cr0ank13";
371 };
372 };
373 };
374 "sensio/framework-extra-bundle" = {
375 targetDir = "";
376 src = composerEnv.buildZipPackage {
377 name = "sensio-framework-extra-bundle-bb907234df776b68922eb4b25bfa061683597b6a";
378 src = fetchurl {
379 url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a;
380 sha256 = "011hcljjcfq5qy4a7mlf0hwqxyb58yci40ini0n5rqandcyk2nck";
381 };
382 };
383 };
384 "sensiolabs/security-checker" = {
385 targetDir = "";
386 src = composerEnv.buildZipPackage {
387 name = "sensiolabs-security-checker-dc270d5fec418cc6ac983671dba5d80ffaffb142";
388 src = fetchurl {
389 url = https://api.github.com/repos/sensiolabs/security-checker/zipball/dc270d5fec418cc6ac983671dba5d80ffaffb142;
390 sha256 = "0fnshyd6f8j91a7y604nh6sqgscjl48mfa0727g2r4hkdfz8hpd1";
391 };
392 };
393 };
394 "swiftmailer/swiftmailer" = {
395 targetDir = "";
396 src = composerEnv.buildZipPackage {
397 name = "swiftmailer-swiftmailer-7ffc1ea296ed14bf8260b6ef11b80208dbadba91";
398 src = fetchurl {
399 url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91;
400 sha256 = "1vl5pzgvr2yfrj1yfs02mi917b0gr56v76ibi40r51a3346zhp6v";
401 };
402 };
403 };
404 "symfony/assetic-bundle" = {
405 targetDir = "";
406 src = composerEnv.buildZipPackage {
407 name = "symfony-assetic-bundle-2e0a23a4874838e26de6f025e02fc63328921a4c";
408 src = fetchurl {
409 url = https://api.github.com/repos/symfony/assetic-bundle/zipball/2e0a23a4874838e26de6f025e02fc63328921a4c;
410 sha256 = "17rxrkyzxa6x5nn7qhhhdgx4z0nlznnq5fifza4wv9znca8bbwyc";
411 };
412 };
413 };
414 "symfony/monolog-bundle" = {
415 targetDir = "";
416 src = composerEnv.buildZipPackage {
417 name = "symfony-monolog-bundle-8781649349fe418d51d194f8c9d212c0b97c40dd";
418 src = fetchurl {
419 url = https://api.github.com/repos/symfony/monolog-bundle/zipball/8781649349fe418d51d194f8c9d212c0b97c40dd;
420 sha256 = "0wcqhg1vfdj3mxacr3fxpgqwy1rk9znjg9bmzx4jymk8l16i7bq8";
421 };
422 };
423 };
424 "symfony/polyfill-apcu" = {
425 targetDir = "";
426 src = composerEnv.buildZipPackage {
427 name = "symfony-polyfill-apcu-9b83bd010112ec196410849e840d9b9fefcb15ad";
428 src = fetchurl {
429 url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/9b83bd010112ec196410849e840d9b9fefcb15ad;
430 sha256 = "0iiiqbn0bs0zqc95nz8l1qa5ysy0iifx4f27r9wnhzsh6f1h02mv";
431 };
432 };
433 };
434 "symfony/polyfill-intl-icu" = {
435 targetDir = "";
436 src = composerEnv.buildZipPackage {
437 name = "symfony-polyfill-intl-icu-80ee17ae83c10cd513e5144f91a73607a21edb4e";
438 src = fetchurl {
439 url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/80ee17ae83c10cd513e5144f91a73607a21edb4e;
440 sha256 = "1hck9bn8zfb1pmx2yccf4w5dd9rbmvwii7hncin6px6nasi6wzvv";
441 };
442 };
443 };
444 "symfony/polyfill-mbstring" = {
445 targetDir = "";
446 src = composerEnv.buildZipPackage {
447 name = "symfony-polyfill-mbstring-3296adf6a6454a050679cde90f95350ad604b171";
448 src = fetchurl {
449 url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171;
450 sha256 = "02wyx9fjx9lyc5q5d3bnn8aw9xag8im2wqanmbkljwd5vmx9k9b2";
451 };
452 };
453 };
454 "symfony/polyfill-php56" = {
455 targetDir = "";
456 src = composerEnv.buildZipPackage {
457 name = "symfony-polyfill-php56-af98553c84912459db3f636329567809d639a8f6";
458 src = fetchurl {
459 url = https://api.github.com/repos/symfony/polyfill-php56/zipball/af98553c84912459db3f636329567809d639a8f6;
460 sha256 = "1l1ydsd7cq3s97cpgl4fw1qxc2wmv27yfxa3q8ng9p66ypzvkw42";
461 };
462 };
463 };
464 "symfony/polyfill-php70" = {
465 targetDir = "";
466 src = composerEnv.buildZipPackage {
467 name = "symfony-polyfill-php70-77454693d8f10dd23bb24955cffd2d82db1007a6";
468 src = fetchurl {
469 url = https://api.github.com/repos/symfony/polyfill-php70/zipball/77454693d8f10dd23bb24955cffd2d82db1007a6;
470 sha256 = "146d620ca725iqdh7j0dqb99h20d4vs641c9vjy9x4jws3rgj905";
471 };
472 };
473 };
474 "symfony/polyfill-util" = {
475 targetDir = "";
476 src = composerEnv.buildZipPackage {
477 name = "symfony-polyfill-util-1a5ad95d9436cbff3296034fe9f8d586dce3fb3a";
478 src = fetchurl {
479 url = https://api.github.com/repos/symfony/polyfill-util/zipball/1a5ad95d9436cbff3296034fe9f8d586dce3fb3a;
480 sha256 = "0l7w4dlr7y3qijpaiq7hfhbhv1qqz9jjknr1n6k4vrss2a8d1sxk";
481 };
482 };
483 };
484 "symfony/swiftmailer-bundle" = {
485 targetDir = "";
486 src = composerEnv.buildZipPackage {
487 name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec";
488 src = fetchurl {
489 url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec;
490 sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01";
491 };
492 };
493 };
494 "symfony/symfony" = {
495 targetDir = "";
496 src = composerEnv.buildZipPackage {
497 name = "symfony-symfony-4babd75194d45f7a4412560038924f3008c67ef2";
498 src = fetchurl {
499 url = https://api.github.com/repos/symfony/symfony/zipball/4babd75194d45f7a4412560038924f3008c67ef2;
500 sha256 = "1347qp994yg6k91v5gwdwnn202bz92m0pj4090b59z5nqxh7463d";
501 };
502 };
503 };
504 "twig/extensions" = {
505 targetDir = "";
506 src = composerEnv.buildZipPackage {
507 name = "twig-extensions-d188c76168b853481cc75879ea045bf93d718e9c";
508 src = fetchurl {
509 url = https://api.github.com/repos/twigphp/Twig-extensions/zipball/d188c76168b853481cc75879ea045bf93d718e9c;
510 sha256 = "0d6wywys5fqzi3m8g8h3sb5phl5y3a7vfc95n214mqp0iwrcmzwm";
511 };
512 };
513 };
514 "twig/twig" = {
515 targetDir = "";
516 src = composerEnv.buildZipPackage {
517 name = "twig-twig-b48680b6eb7d16b5025b9bfc4108d86f6b8af86f";
518 src = fetchurl {
519 url = https://api.github.com/repos/twigphp/Twig/zipball/b48680b6eb7d16b5025b9bfc4108d86f6b8af86f;
520 sha256 = "1q82f246wq7whl11lx00n0skwmllppvpzg20x6q4frmw44dc6v9a";
521 };
522 };
523 };
524 "willdurand/jsonp-callback-validator" = {
525 targetDir = "";
526 src = composerEnv.buildZipPackage {
527 name = "willdurand-jsonp-callback-validator-1a7d388bb521959e612ef50c5c7b1691b097e909";
528 src = fetchurl {
529 url = https://api.github.com/repos/willdurand/JsonpCallbackValidator/zipball/1a7d388bb521959e612ef50c5c7b1691b097e909;
530 sha256 = "19ds8f3nbss4b2xvqkcjkcvz0l4c5nhrm8w8yxc8a508r0jmd9in";
531 };
532 };
533 };
534 "zendframework/zend-code" = {
535 targetDir = "";
536 src = composerEnv.buildZipPackage {
537 name = "zendframework-zend-code-95033f061b083e16cdee60530ec260d7d628b887";
538 src = fetchurl {
539 url = https://api.github.com/repos/zendframework/zend-code/zipball/95033f061b083e16cdee60530ec260d7d628b887;
540 sha256 = "0h77qf267l2sp9wg3n61dpgpf6wh6p5jssy8mrg7vlns2j03f9f5";
541 };
542 };
543 };
544 "zendframework/zend-eventmanager" = {
545 targetDir = "";
546 src = composerEnv.buildZipPackage {
547 name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd";
548 src = fetchurl {
549 url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd;
550 sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n";
551 };
552 };
553 };
554 };
555 devPackages = {
556 "doctrine/data-fixtures" = {
557 targetDir = "";
558 src = composerEnv.buildZipPackage {
559 name = "doctrine-data-fixtures-17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e";
560 src = fetchurl {
561 url = https://api.github.com/repos/doctrine/data-fixtures/zipball/17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e;
562 sha256 = "15k7vl58kwh02g0a93rab82ifbgmc91srgminzlkjq5kx8agh7ab";
563 };
564 };
565 };
566 "doctrine/doctrine-fixtures-bundle" = {
567 targetDir = "";
568 src = composerEnv.buildZipPackage {
569 name = "doctrine-doctrine-fixtures-bundle-74b8cc70a4a25b774628ee59f4cdf3623a146273";
570 src = fetchurl {
571 url = https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273;
572 sha256 = "1bbflq8k6izwqgp9ka2gyb5y96a80b4lnlc5wrgc5gnih7hqidlf";
573 };
574 };
575 };
576 "sensio/generator-bundle" = {
577 targetDir = "";
578 src = composerEnv.buildZipPackage {
579 name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65";
580 src = fetchurl {
581 url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65;
582 sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3";
583 };
584 };
585 };
586 "symfony/phpunit-bridge" = {
587 targetDir = "";
588 src = composerEnv.buildZipPackage {
589 name = "symfony-phpunit-bridge-7470518370113785f67a7fd8e6e1667661e88805";
590 src = fetchurl {
591 url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/7470518370113785f67a7fd8e6e1667661e88805;
592 sha256 = "0jd28ag0wks9sv62rkwsbx68csvdl5gabbz2h01hkqpa23gdkhs9";
593 };
594 };
595 };
596 };
597}
diff --git a/modules/private/websites/connexionswing/integration.nix b/modules/private/websites/connexionswing/integration.nix
deleted file mode 100644
index 9cf2b94..0000000
--- a/modules/private/websites/connexionswing/integration.nix
+++ /dev/null
@@ -1,141 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 secrets = config.myEnv.websites.connexionswing.integration;
4 webRoot = "/var/lib/ftp/immae/connexionswing/web";
5 varDir = "/var/lib/ftp/immae/connexionswing_var";
6 cfg = config.myServices.websites.connexionswing.integration;
7 pcfg = config.services.phpApplication;
8in {
9 options.myServices.websites.connexionswing.integration.enable = lib.mkEnableOption "enable Connexionswing's website in integration";
10
11 config = lib.mkIf cfg.enable {
12 services.phpApplication.apps.connexionswing_integration = {
13 websiteEnv = "integration";
14 httpdUser = config.services.httpd.Inte.user;
15 httpdGroup = config.services.httpd.Inte.group;
16 inherit webRoot varDir;
17 varDirPaths = {
18 "medias" = "0700";
19 "uploads" = "0700";
20 "var" = "0700";
21 };
22 app = "/var/lib/ftp/immae/connexionswing";
23 serviceDeps = [ "mysql.service" ];
24 preStartActions = [
25 "./bin/console --env=dev cache:clear --no-warmup"
26 ];
27 phpOpenbasedir = [ "/tmp" "/run/wrappers/bin/sendmail" ];
28 phpPool = {
29 "php_admin_value[upload_max_filesize]" = "20M";
30 "php_admin_value[post_max_size]" = "20M";
31 #"php_admin_flag[log_errors]" = "on";
32 "pm" = "ondemand";
33 "pm.max_children" = "5";
34 "pm.process_idle_timeout" = "60";
35 };
36 phpEnv = {
37 SYMFONY_DEBUG_MODE = "\"yes\"";
38 };
39 phpWatchFiles = [
40 config.secrets.fullPaths."websites/connexionswing/integration"
41 ];
42 phpPackage = pkgs.php72;
43 };
44
45 secrets.keys."websites/connexionswing/integration" = {
46 user = config.services.httpd.Inte.user;
47 group = config.services.httpd.Inte.group;
48 permissions = "0400";
49 text = ''
50 # This file is auto-generated during the composer install
51 parameters:
52 database_host: ${secrets.mysql.host}
53 database_port: ${secrets.mysql.port}
54 database_name: ${secrets.mysql.database}
55 database_user: ${secrets.mysql.user}
56 database_password: ${secrets.mysql.password}
57 database_server_version: ${pkgs.mariadb.mysqlVersion}
58 mailer_transport: sendmail
59 mailer_host: null
60 mailer_user: null
61 mailer_password: null
62 subscription_email: ${secrets.email}
63 allow_robots: true
64 secret: ${secrets.secret}
65 '';
66 };
67
68 services.websites.env.integration.vhostConfs.connexionswing_integration = {
69 certName = "integration";
70 addToCerts = true;
71 hosts = ["connexionswing.cs.immae.dev" "sandetludo.cs.immae.dev" ];
72 root = webRoot;
73 extraConfig = [
74 ''
75 <FilesMatch "\.php$">
76 SetHandler "proxy:unix:${pcfg.phpListenPaths.connexionswing_integration}|fcgi://localhost"
77 </FilesMatch>
78
79 <Directory ${varDir}/medias>
80 Options FollowSymLinks
81 AllowOverride None
82 Require all granted
83 </Directory>
84
85 <Directory ${varDir}/uploads>
86 Options FollowSymLinks
87 AllowOverride None
88 Require all granted
89 </Directory>
90
91 <Location />
92 Use LDAPConnect
93 Require ldap-group cn=cs.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
94 ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://connexionswing.com\"></html>"
95 </Location>
96
97 <Directory ${webRoot}>
98 Options Indexes FollowSymLinks MultiViews Includes
99 AllowOverride None
100 Require all granted
101
102 DirectoryIndex app_dev.php
103
104 <IfModule mod_negotiation.c>
105 Options -MultiViews
106 </IfModule>
107
108 <IfModule mod_rewrite.c>
109 RewriteEngine On
110
111 RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
112 RewriteRule ^(.*) - [E=BASE:%1]
113
114 # Maintenance script
115 RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f
116 RewriteCond %{SCRIPT_FILENAME} !maintenance.php
117 RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L]
118 ErrorDocument 503 /maintenance.php
119
120 # Sets the HTTP_AUTHORIZATION header removed by Apache
121 RewriteCond %{HTTP:Authorization} .
122 RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
123
124 RewriteCond %{ENV:REDIRECT_STATUS} ^$
125 RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
126
127 # If the requested filename exists, simply serve it.
128 # We only want to let Apache serve files and not directories.
129 RewriteCond %{REQUEST_FILENAME} -f
130 RewriteRule ^ - [L]
131
132 # Rewrite all other queries to the front controller.
133 RewriteRule ^ %{ENV:BASE}/app_dev.php [L]
134 </IfModule>
135
136 </Directory>
137 ''
138 ];
139 };
140 };
141}
diff --git a/modules/private/websites/connexionswing/production.nix b/modules/private/websites/connexionswing/production.nix
deleted file mode 100644
index 4b0407f..0000000
--- a/modules/private/websites/connexionswing/production.nix
+++ /dev/null
@@ -1,110 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 secrets = config.myEnv.websites.connexionswing.production;
4 app = pkgs.callPackage ./app {
5 composerEnv = pkgs.composerEnv.override { php = pkgs.php72; };
6 environment = secrets.environment;
7 varDir = "/var/lib/connexionswing_production";
8 secretsPath = config.secrets.fullPaths."websites/connexionswing/production";
9 };
10 cfg = config.myServices.websites.connexionswing.production;
11 pcfg = config.services.phpApplication;
12in {
13 options.myServices.websites.connexionswing.production.enable = lib.mkEnableOption "enable Connexionswing's website in production";
14
15 config = lib.mkIf cfg.enable {
16 services.webstats.sites = [ { name = "connexionswing.com"; } ];
17 services.phpApplication.apps.connexionswing_production = {
18 websiteEnv = "production";
19 httpdUser = config.services.httpd.Prod.user;
20 httpdGroup = config.services.httpd.Prod.group;
21 inherit (app) webRoot varDir;
22 varDirPaths = {
23 "medias" = "0700";
24 "uploads" = "0700";
25 "var" = "0700";
26 };
27 inherit app;
28 serviceDeps = [ "mysql.service" ];
29 preStartActions = [
30 "./bin/console --env=${app.environment} cache:clear --no-warmup"
31 ];
32 phpOpenbasedir = [ "/tmp" "/run/wrappers/bin/sendmail" ];
33 phpPool = {
34 "php_admin_value[upload_max_filesize]" = "20M";
35 "php_admin_value[post_max_size]" = "20M";
36 #"php_admin_flag[log_errors]" = "on";
37 "pm" = "dynamic";
38 "pm.max_children" = "20";
39 "pm.start_servers" = "2";
40 "pm.min_spare_servers" = "1";
41 "pm.max_spare_servers" = "3";
42 };
43 phpWatchFiles = [
44 config.secrets.fullPaths."websites/connexionswing/production"
45 ];
46 phpPackage = pkgs.php72;
47 };
48
49 secrets.keys."websites/connexionswing/production" = {
50 user = config.services.httpd.Prod.user;
51 group = config.services.httpd.Prod.group;
52 permissions = "0400";
53 text = ''
54 # This file is auto-generated during the composer install
55 parameters:
56 database_host: ${secrets.mysql.host}
57 database_port: ${secrets.mysql.port}
58 database_name: ${secrets.mysql.database}
59 database_user: ${secrets.mysql.user}
60 database_password: ${secrets.mysql.password}
61 database_server_version: ${pkgs.mariadb.mysqlVersion}
62 mailer_transport: sendmail
63 mailer_host: null
64 mailer_user: null
65 mailer_password: null
66 subscription_email: ${secrets.email}
67 allow_robots: true
68 secret: ${secrets.secret}
69 services:
70 swiftmailer.mailer.default.transport:
71 class: Swift_SendmailTransport
72 arguments: ['/run/wrappers/bin/sendmail -bs']
73 '';
74 };
75
76 services.websites.env.production.vhostConfs.connexionswing_production = {
77 certName = "connexionswing";
78 certMainHost = "connexionswing.com";
79 hosts = ["connexionswing.com" "sandetludo.com" "www.connexionswing.com" "www.sandetludo.com" ];
80 root = app.webRoot;
81 extraConfig = [
82 ''
83 <FilesMatch "\.php$">
84 SetHandler "proxy:unix:${pcfg.phpListenPaths.connexionswing_production}|fcgi://localhost"
85 </FilesMatch>
86
87 <Directory ${app.varDir}/medias>
88 Options FollowSymLinks
89 AllowOverride None
90 Require all granted
91 </Directory>
92
93 <Directory ${app.varDir}/uploads>
94 Options FollowSymLinks
95 AllowOverride None
96 Require all granted
97 </Directory>
98
99 Use Stats connexionswing.com
100
101 <Directory ${app.webRoot}>
102 Options Indexes FollowSymLinks MultiViews Includes
103 AllowOverride All
104 Require all granted
105 </Directory>
106 ''
107 ];
108 };
109 };
110}
diff --git a/modules/private/websites/default.nix b/modules/private/websites/default.nix
deleted file mode 100644
index 4864034..0000000
--- a/modules/private/websites/default.nix
+++ /dev/null
@@ -1,324 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 www_root = ./_www;
4 theme_root = pkgs.webapps.apache-theme.theme;
5 apacheConfig = {
6 cache = {
7 # This setting permits to ignore time-based cache for files in the
8 # nix store:
9 # If a client requires an If-Modified-Since from timestamp 1, then
10 # this header is removed, and if the response contains a
11 # too old Last-Modified tag, then it is removed too
12 extraConfig = ''
13 <If "%{HTTP:If-Modified-Since} =~ /01 Jan 1970 00:00:01/" >
14 RequestHeader unset If-Modified-Since
15 </If>
16 Header unset Last-Modified "expr=%{LAST_MODIFIED} < 19991231235959"
17 '';
18 };
19 gzip = {
20 modules = [ "deflate" "filter" ];
21 extraConfig = ''
22 AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
23 '';
24 };
25 macros = {
26 modules = [ "macro" ];
27 };
28 stats = {
29 extraConfig = ''
30 <Macro Stats %{domain}>
31 Alias /webstats ${config.services.webstats.dataDir}/%{domain}
32 <Directory ${config.services.webstats.dataDir}/%{domain}>
33 DirectoryIndex index.html
34 AllowOverride None
35 Require all granted
36 </Directory>
37 <Location /webstats>
38 Use LDAPConnect
39 Require ldap-group cn=%{domain},ou=stats,cn=httpd,ou=services,dc=immae,dc=eu
40 </Location>
41 </Macro>
42 '';
43 };
44 ldap = {
45 modules = [ "ldap" "authnz_ldap" ];
46 extraConfig = ''
47 <IfModule ldap_module>
48 LDAPSharedCacheSize 500000
49 LDAPCacheEntries 1024
50 LDAPCacheTTL 600
51 LDAPOpCacheEntries 1024
52 LDAPOpCacheTTL 600
53 </IfModule>
54
55 Include ${config.secrets.fullPaths."apache-ldap"}
56 '';
57 };
58 global = {
59 extraConfig = ''
60 ErrorDocument 500 /maintenance_immae.html
61 ErrorDocument 501 /maintenance_immae.html
62 ErrorDocument 502 /maintenance_immae.html
63 ErrorDocument 503 /maintenance_immae.html
64 ErrorDocument 504 /maintenance_immae.html
65 Alias /maintenance_immae.html ${www_root}/maintenance_immae.html
66 ProxyPass /maintenance_immae.html !
67
68 AliasMatch "(.*)/googleb6d69446ff4ca3e5.html" ${www_root}/googleb6d69446ff4ca3e5.html
69 <Directory ${www_root}>
70 AllowOverride None
71 Require all granted
72 </Directory>
73 '';
74 };
75 apaxy = {
76 extraConfig = (pkgs.webapps.apache-theme.override { inherit theme_root; }).apacheConfig;
77 };
78 http2 = {
79 modules = [ "http2" ];
80 extraConfig = ''
81 Protocols h2 http/1.1
82 '';
83 };
84 customLog = {
85 extraConfig = ''
86 LogFormat "%{Host}i:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedVhost
87 '';
88 };
89 };
90 makeModules = lib.lists.flatten (lib.attrsets.mapAttrsToList (n: v: v.modules or []) apacheConfig);
91 makeExtraConfig = (builtins.filter (x: x != null) (lib.attrsets.mapAttrsToList (n: v: v.extraConfig or null) apacheConfig));
92 moomin = let
93 lines = lib.splitString "\n" (lib.fileContents ./moomin.txt);
94 pad = width: str: let
95 padWidth = width - lib.stringLength str;
96 padding = lib.concatStrings (lib.genList (lib.const "0") padWidth);
97 in lib.optionalString (padWidth > 0) padding + str;
98 in
99 lib.imap0 (i: e: ''Header always set "X-Moomin-${pad 2 (builtins.toString i)}" "${e}"'') lines;
100in
101{
102 options.myServices.websites.enable = lib.mkEnableOption "enable websites";
103
104 config = lib.mkIf config.myServices.websites.enable {
105 users.users.wwwrun.extraGroups = [ "keys" ];
106 networking.firewall.allowedTCPPorts = [ 80 443 ];
107
108 secrets.keys."apache-ldap" = {
109 user = "wwwrun";
110 group = "wwwrun";
111 permissions = "0400";
112 text = ''
113 <Macro LDAPConnect>
114 <IfModule authnz_ldap_module>
115 AuthLDAPURL ldap://ldap.immae.eu:389/dc=immae,dc=eu STARTTLS
116 AuthLDAPBindDN cn=httpd,ou=services,dc=immae,dc=eu
117 AuthLDAPBindPassword "${config.myEnv.httpd.ldap.password}"
118 AuthType Basic
119 AuthName "Authentification requise (Acces LDAP)"
120 AuthBasicProvider ldap
121 </IfModule>
122 </Macro>
123 '';
124 };
125
126 system.activationScripts = {
127 httpd = ''
128 install -d -m 0755 /var/lib/acme/acme-challenges
129 install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php/sessions
130 '';
131 };
132
133 services.phpfpm = {
134 phpOptions = ''
135 session.save_path = "/var/lib/php/sessions"
136 post_max_size = 20M
137 ; 15 days (seconds)
138 session.gc_maxlifetime = 1296000
139 ; 30 days (minutes)
140 session.cache_expire = 43200
141 '';
142 settings = {
143 log_level = "notice";
144 };
145 };
146
147 services.filesWatcher.httpdProd.paths = [ config.secrets.fullPaths."apache-ldap" ];
148 services.filesWatcher.httpdInte.paths = [ config.secrets.fullPaths."apache-ldap" ];
149 services.filesWatcher.httpdTools.paths = [ config.secrets.fullPaths."apache-ldap" ];
150
151 services.websites.env.production = {
152 enable = true;
153 adminAddr = "httpd@immae.eu";
154 httpdName = "Prod";
155 ips =
156 let ips = config.myEnv.servers.eldiron.ips.production;
157 in [ips.ip4] ++ (ips.ip6 or []);
158 modules = makeModules;
159 extraConfig = makeExtraConfig;
160 fallbackVhost = {
161 certName = "eldiron";
162 hosts = ["eldiron.immae.eu" ];
163 root = www_root;
164 extraConfig = [ "DirectoryIndex index.htm" ];
165 };
166 };
167
168 services.websites.env.integration = {
169 enable = true;
170 adminAddr = "httpd@immae.eu";
171 httpdName = "Inte";
172 ips =
173 let ips = config.myEnv.servers.eldiron.ips.integration;
174 in [ips.ip4] ++ (ips.ip6 or []);
175 modules = makeModules;
176 extraConfig = makeExtraConfig ++ moomin;
177 fallbackVhost = {
178 certName = "eldiron";
179 hosts = ["eldiron.immae.eu" ];
180 root = www_root;
181 extraConfig = [ "DirectoryIndex index.htm" ];
182 };
183 };
184
185 services.websites.env.tools = {
186 enable = true;
187 adminAddr = "httpd@immae.eu";
188 httpdName = "Tools";
189 ips =
190 let ips = config.myEnv.servers.eldiron.ips.main;
191 in [ips.ip4] ++ (ips.ip6 or []);
192 modules = makeModules;
193 extraConfig = makeExtraConfig ++
194 [ ''
195 RedirectMatch ^/licen[cs]es?_et_tip(ping)?$ https://www.immae.eu/licences_et_tip.html
196 RedirectMatch ^/licen[cs]es?_and_tip(ping)?$ https://www.immae.eu/licenses_and_tipping.html
197 RedirectMatch ^/licen[cs]es?$ https://www.immae.eu/licenses_and_tipping.html
198 RedirectMatch ^/tip(ping)?$ https://www.immae.eu/licenses_and_tipping.html
199 RedirectMatch ^/(mentions|mentions_legales|legal)$ https://www.immae.eu/mentions.html
200 RedirectMatch ^/CGU$ https://www.immae.eu/CGU
201 ''
202 ];
203 nosslVhost = {
204 enable = true;
205 host = "nossl.immae.eu";
206 };
207 fallbackVhost = {
208 certName = "eldiron";
209 hosts = ["eldiron.immae.eu" ];
210 root = www_root;
211 extraConfig = [ "DirectoryIndex index.htm" ];
212 };
213 };
214
215 myServices.websites = {
216 bakeer.cloud.enable = true;
217 capitaines.landing_pages.enable = true;
218
219 chloe = {
220 integration.enable = true;
221 production.enable = true;
222 };
223
224 cip-ca = {
225 sympa.enable = true;
226 };
227
228 connexionswing = {
229 integration.enable = true;
230 production.enable = true;
231 };
232
233 denise = {
234 evariste.enable = true;
235 denisejerome.enable = true;
236 oms.enable = true;
237 bingo.enable = true;
238 aventuriers.enable = true;
239 production.enable = true;
240 };
241
242 emilia = {
243 moodle.enable = false;
244 atelierfringant.enable = true;
245 };
246
247 florian = {
248 app.enable = true;
249 integration.enable = true;
250 production.enable = true;
251 };
252
253 immae = {
254 production.enable = true;
255 release.enable = true;
256 temp.enable = true;
257 };
258
259 isabelle = {
260 aten_integration.enable = true;
261 aten_production.enable = true;
262 iridologie.enable = true;
263 };
264
265 jerome.naturaloutil.enable = true;
266
267 leila.production.enable = true;
268
269 ludivine = {
270 integration.enable = true;
271 production.enable = true;
272 };
273
274 nassime.production.enable = true;
275
276 nath.villon.enable = true;
277
278 papa = {
279 surveillance.enable = true;
280 maison_bbc.enable = true;
281 };
282
283 patrick_fodella = {
284 ecolyeu.enable = true;
285 altermondia.enable = true;
286 };
287
288 piedsjaloux = {
289 integration.enable = true;
290 production.enable = true;
291 };
292
293 ressourcerie_banon.production.enable = true;
294 ressourcerie_banon.cryptpad.enable = true;
295 ressourcerie_banon.cloud.enable = true;
296
297 richie.production.enable = true;
298
299 syden.peertube.enable = true;
300
301 telio_tortay.production.enable = true;
302
303 tools.assets.enable = true;
304 tools.cloud.enable = true;
305 tools.commento.enable = true;
306 tools.cryptpad.enable = true;
307 tools.dav.enable = true;
308 tools.db.enable = true;
309 tools.diaspora.enable = true;
310 tools.etherpad-lite.enable = true;
311 tools.git.enable = true;
312 tools.mastodon.enable = true;
313 tools.mediagoblin.enable = true;
314 tools.peertube.enable = true;
315 tools.performance.enable = true;
316 tools.tools.enable = true;
317 tools.email.enable = true;
318 tools.stats.enable = false;
319
320 games.codenames.enable = true;
321 games.terraforming-mars.enable = true;
322 };
323 };
324}
diff --git a/modules/private/websites/denise/aventuriers.nix b/modules/private/websites/denise/aventuriers.nix
deleted file mode 100644
index 2bbf7bf..0000000
--- a/modules/private/websites/denise/aventuriers.nix
+++ /dev/null
@@ -1,26 +0,0 @@
1{ lib, config, pkgs, ... }:
2let
3 cfg = config.myServices.websites.denise.aventuriers;
4 varDir = "/var/lib/buildbot/outputs/denise/aventuriers";
5in {
6 options.myServices.websites.denise.aventuriers.enable = lib.mkEnableOption "enable Denise's Aventuriers website";
7
8 config = lib.mkIf cfg.enable {
9 services.websites.env.production.vhostConfs.denise_aventuriers = {
10 certName = "denise";
11 addToCerts = true;
12 hosts = [ "aventuriers.syanni.eu" ];
13 root = varDir;
14 extraConfig = [
15 ''
16 <Directory ${varDir}>
17 DirectoryIndex aventuriers.html
18 Options Indexes FollowSymLinks MultiViews Includes
19 AllowOverride None
20 Require all granted
21 </Directory>
22 ''
23 ];
24 };
25 };
26}
diff --git a/modules/private/websites/denise/bingo.nix b/modules/private/websites/denise/bingo.nix
deleted file mode 100644
index 9130462..0000000
--- a/modules/private/websites/denise/bingo.nix
+++ /dev/null
@@ -1,100 +0,0 @@
1{ lib, config, pkgs, ... }:
2let
3 cfg = config.myServices.websites.denise.bingo;
4 varDir = "/var/lib/buildbot/outputs/denise/bingo";
5 varDirBeta = "/var/lib/buildbot/outputs/denise/bingo_beta";
6 socket = "/run/denise_bingo/socket.sock";
7 socket_beta = "/run/denise_bingo_beta/socket.sock";
8in {
9 options.myServices.websites.denise.bingo.enable = lib.mkEnableOption "enable Denise's bingo website";
10
11 config = lib.mkIf cfg.enable {
12 services.websites.env.production.vhostConfs.denise_bingo = {
13 certName = "denise";
14 addToCerts = true;
15 hosts = [ "bingo.syanni.eu" ];
16 root = null;
17 extraConfig = [
18 ''
19 ProxyPreserveHost on
20 ProxyVia On
21 ProxyRequests Off
22 ProxyPassMatch ^/.well-known/acme-challenge !
23 ProxyPass / unix://${socket}|http://bingo.syanni.eu/
24 ProxyPassReverse / unix://${socket}|http://bingo.syanni.eu/
25 ''
26 ];
27 };
28
29 systemd.services.denise-bingo = {
30 description = "Denise bingo website";
31 after = [ "network.target" ];
32 wantedBy = [ "multi-user.target" ];
33
34 serviceConfig = {
35 Type = "simple";
36 WorkingDirectory = varDir;
37 ExecStart = let
38 python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.matplotlib p.unidecode ]);
39 in
40 "${python}/bin/gunicorn -w4 -p /run/denise_bingo/gunicorn.pid --bind unix:${socket} app:app";
41 User = "wwwrun";
42 Restart = "always";
43 RestartSec = "5s";
44 PIDFile = "/run/denise_bingo/gunicorn.pid";
45 RuntimeDirectory = "denise_bingo";
46 StandardOutput = "journal";
47 StandardError = "inherit";
48 };
49 };
50
51 security.sudo.extraRules = [
52 {
53 commands = [
54 { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-bingo-beta.service"; }
55 { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-bingo.service"; }
56 ];
57 users = ["buildbot"];
58 runAs = "root";
59 }
60 ];
61 services.websites.env.integration.vhostConfs.denise_bingo_beta = {
62 certName = "denise";
63 addToCerts = true;
64 hosts = [ "beta.bingo.syanni.eu" ];
65 root = null;
66 extraConfig = [
67 ''
68 ProxyPreserveHost on
69 ProxyVia On
70 ProxyRequests Off
71 ProxyPassMatch ^/.well-known/acme-challenge !
72 ProxyPass / unix://${socket_beta}|http://beta.bingo.syanni.eu/
73 ProxyPassReverse / unix://${socket_beta}|http://beta.bingo.syanni.eu/
74 ''
75 ];
76 };
77
78 systemd.services.denise-bingo-beta = {
79 description = "Denise bingo beta website";
80 after = [ "network.target" ];
81 wantedBy = [ "multi-user.target" ];
82
83 serviceConfig = {
84 Type = "simple";
85 WorkingDirectory = varDirBeta;
86 ExecStart = let
87 python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask ]);
88 in
89 "${python}/bin/gunicorn -w4 -p /run/denise_bingo_beta/gunicorn.pid --bind unix:${socket_beta} app:app";
90 User = "wwwrun";
91 Restart = "always";
92 RestartSec = "5s";
93 PIDFile = "/run/denise_bingo_beta/gunicorn.pid";
94 RuntimeDirectory = "denise_bingo_beta";
95 StandardOutput = "journal";
96 StandardError = "inherit";
97 };
98 };
99 };
100}
diff --git a/modules/private/websites/denise/denisejerome.nix b/modules/private/websites/denise/denisejerome.nix
deleted file mode 100644
index a75e591..0000000
--- a/modules/private/websites/denise/denisejerome.nix
+++ /dev/null
@@ -1,31 +0,0 @@
1{ lib, config, ... }:
2let
3 cfg = config.myServices.websites.denise.denisejerome;
4 varDir = "/var/lib/ftp/denise/denisejerome";
5 env = config.myEnv.websites.denisejerome;
6in {
7 options.myServices.websites.denise.denisejerome.enable = lib.mkEnableOption "enable Denise Jerome's website";
8
9 config = lib.mkIf cfg.enable {
10 services.webstats.sites = [ { name = "denisejerome.piedsjaloux.fr"; } ];
11
12 services.websites.env.production.vhostConfs.denise_denisejerome = {
13 certName = "denise";
14 certMainHost = "denisejerome.piedsjaloux.fr";
15 hosts = ["denisejerome.piedsjaloux.fr" ];
16 root = varDir;
17 extraConfig = [
18 ''
19 Use Stats denisejerome.piedsjaloux.fr
20
21 <Directory ${varDir}>
22 DirectoryIndex index.htm index.html
23 Options Indexes FollowSymLinks MultiViews Includes
24 AllowOverride AuthConfig
25 Require all granted
26 </Directory>
27 ''
28 ];
29 };
30 };
31}
diff --git a/modules/private/websites/denise/evariste.nix b/modules/private/websites/denise/evariste.nix
deleted file mode 100644
index 42f9b2e..0000000
--- a/modules/private/websites/denise/evariste.nix
+++ /dev/null
@@ -1,104 +0,0 @@
1{ lib, config, pkgs, ... }:
2let
3 cfg = config.myServices.websites.denise.evariste;
4 nsiVarDir = "/var/lib/ftp/denise/nsievariste";
5 stmgVarDir = "/var/lib/ftp/denise/stmgevariste";
6 apacheUser = config.services.httpd.Prod.user;
7 apacheGroup = config.services.httpd.Prod.group;
8in {
9 options.myServices.websites.denise.evariste.enable = lib.mkEnableOption "enable NSI/STMG Evariste website";
10
11 config = lib.mkIf cfg.enable {
12 services.webstats.sites = [
13 { name = "nsievariste.immae.eu"; }
14 { name = "stmgevariste.immae.eu"; }
15 ];
16
17 services.websites.env.production.modules = [ "proxy_fcgi" ];
18 system.activationScripts.denise_evariste = {
19 deps = [ "httpd" ];
20 text = ''
21 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/denise_nsievariste
22 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/denise_stmgevariste
23 '';
24 };
25 services.phpfpm.pools.denise_nsievariste = {
26 user = apacheUser;
27 group = apacheGroup;
28 settings = {
29 "listen.owner" = apacheUser;
30 "listen.group" = apacheGroup;
31
32 "pm" = "ondemand";
33 "pm.max_children" = "5";
34 "pm.process_idle_timeout" = "60";
35
36 "php_admin_value[open_basedir]" = "/var/lib/php/sessions/denise_nsievariste:${nsiVarDir}:/tmp";
37 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/denise_nsievariste";
38 };
39 phpPackage = pkgs.php72;
40 };
41 services.websites.env.production.vhostConfs.denise_nsievariste = {
42 certName = "denise_evariste";
43 addToCerts = true;
44 certMainHost = "nsievariste.immae.eu";
45 hosts = ["nsievariste.immae.eu" ];
46 root = nsiVarDir;
47 extraConfig = [
48 ''
49 Use Stats nsievariste.immae.eu
50
51 <FilesMatch "\.php$">
52 SetHandler "proxy:unix:${config.services.phpfpm.pools.denise_nsievariste.socket}|fcgi://localhost"
53 </FilesMatch>
54
55 <Directory ${nsiVarDir}>
56 DirectoryIndex index.php index.htm index.html
57 Options Indexes FollowSymLinks MultiViews Includes
58 AllowOverride None
59 Require all granted
60 </Directory>
61 ''
62 ];
63 };
64
65 services.phpfpm.pools.denise_stmgevariste = {
66 user = apacheUser;
67 group = apacheGroup;
68 settings = {
69 "listen.owner" = apacheUser;
70 "listen.group" = apacheGroup;
71
72 "pm" = "ondemand";
73 "pm.max_children" = "5";
74 "pm.process_idle_timeout" = "60";
75
76 "php_admin_value[open_basedir]" = "/var/lib/php/sessions/denise_stmgevariste:${stmgVarDir}:/tmp";
77 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/denise_stmgevariste";
78 };
79 phpPackage = pkgs.php72;
80 };
81 services.websites.env.production.vhostConfs.denise_stmgevariste = {
82 certName = "denise_evariste";
83 addToCerts = true;
84 hosts = ["stmgevariste.immae.eu" ];
85 root = stmgVarDir;
86 extraConfig = [
87 ''
88 Use Stats stmgevariste.immae.eu
89
90 <FilesMatch "\.php$">
91 SetHandler "proxy:unix:${config.services.phpfpm.pools.denise_stmgevariste.socket}|fcgi://localhost"
92 </FilesMatch>
93
94 <Directory ${stmgVarDir}>
95 DirectoryIndex index.php index.htm index.html
96 Options Indexes FollowSymLinks MultiViews Includes
97 AllowOverride None
98 Require all granted
99 </Directory>
100 ''
101 ];
102 };
103 };
104}
diff --git a/modules/private/websites/denise/oms.nix b/modules/private/websites/denise/oms.nix
deleted file mode 100644
index 2f18037..0000000
--- a/modules/private/websites/denise/oms.nix
+++ /dev/null
@@ -1,100 +0,0 @@
1{ lib, config, pkgs, ... }:
2let
3 cfg = config.myServices.websites.denise.oms;
4 varDir = "/var/lib/buildbot/outputs/denise/oms";
5 varDirBeta = "/var/lib/buildbot/outputs/denise/oms_beta";
6 socket = "/run/denise_oms/socket.sock";
7 socket_beta = "/run/denise_oms_beta/socket.sock";
8in {
9 options.myServices.websites.denise.oms.enable = lib.mkEnableOption "enable Denise's OMS website";
10
11 config = lib.mkIf cfg.enable {
12 services.websites.env.production.vhostConfs.denise_oms = {
13 certName = "denise";
14 addToCerts = true;
15 hosts = [ "oms.syanni.eu" ];
16 root = null;
17 extraConfig = [
18 ''
19 ProxyPreserveHost on
20 ProxyVia On
21 ProxyRequests Off
22 ProxyPassMatch ^/.well-known/acme-challenge !
23 ProxyPass / unix://${socket}|http://oms.syanni.eu/
24 ProxyPassReverse / unix://${socket}|http://oms.syanni.eu/
25 ''
26 ];
27 };
28
29 systemd.services.denise-oms = {
30 description = "Denise OMS website";
31 after = [ "network.target" ];
32 wantedBy = [ "multi-user.target" ];
33
34 serviceConfig = {
35 Type = "simple";
36 WorkingDirectory = varDir;
37 ExecStart = let
38 python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.matplotlib p.unidecode ]);
39 in
40 "${python}/bin/gunicorn -w4 -p /run/denise_oms/gunicorn.pid --bind unix:${socket} app:app";
41 User = "wwwrun";
42 Restart = "always";
43 RestartSec = "5s";
44 PIDFile = "/run/denise_oms/gunicorn.pid";
45 RuntimeDirectory = "denise_oms";
46 StandardOutput = "journal";
47 StandardError = "inherit";
48 };
49 };
50
51 security.sudo.extraRules = [
52 {
53 commands = [
54 { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-oms-beta.service"; }
55 { options = [ "NOPASSWD" ]; command = "${pkgs.systemd}/bin/systemctl restart denise-oms.service"; }
56 ];
57 users = ["buildbot"];
58 runAs = "root";
59 }
60 ];
61 services.websites.env.integration.vhostConfs.denise_oms_beta = {
62 certName = "denise";
63 addToCerts = true;
64 hosts = [ "beta.oms.syanni.eu" ];
65 root = null;
66 extraConfig = [
67 ''
68 ProxyPreserveHost on
69 ProxyVia On
70 ProxyRequests Off
71 ProxyPassMatch ^/.well-known/acme-challenge !
72 ProxyPass / unix://${socket_beta}|http://beta.oms.syanni.eu/
73 ProxyPassReverse / unix://${socket_beta}|http://beta.oms.syanni.eu/
74 ''
75 ];
76 };
77
78 systemd.services.denise-oms-beta = {
79 description = "Denise OMS beta website";
80 after = [ "network.target" ];
81 wantedBy = [ "multi-user.target" ];
82
83 serviceConfig = {
84 Type = "simple";
85 WorkingDirectory = varDirBeta;
86 ExecStart = let
87 python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.matplotlib p.unidecode ]);
88 in
89 "${python}/bin/gunicorn -w4 -p /run/denise_oms_beta/gunicorn.pid --bind unix:${socket_beta} app:app";
90 User = "wwwrun";
91 Restart = "always";
92 RestartSec = "5s";
93 PIDFile = "/run/denise_oms_beta/gunicorn.pid";
94 RuntimeDirectory = "denise_oms_beta";
95 StandardOutput = "journal";
96 StandardError = "inherit";
97 };
98 };
99 };
100}
diff --git a/modules/private/websites/denise/production.nix b/modules/private/websites/denise/production.nix
deleted file mode 100644
index 9b28e9e..0000000
--- a/modules/private/websites/denise/production.nix
+++ /dev/null
@@ -1,25 +0,0 @@
1{ lib, config, pkgs, ... }:
2let
3 cfg = config.myServices.websites.denise.production;
4in {
5 options.myServices.websites.denise.production.enable = lib.mkEnableOption "enable Denise's website";
6
7 config = lib.mkIf cfg.enable {
8 services.websites.env.production.vhostConfs.denise_production = {
9 certName = "denise";
10 addToCerts = true;
11 hosts = [ "syanni.eu" "www.syanni.eu" ];
12 root = ../_www;
13 extraConfig = [
14 ''
15 <Directory ${../_www}>
16 DirectoryIndex index.htm index.html
17 Options Indexes FollowSymLinks MultiViews Includes
18 AllowOverride AuthConfig
19 Require all granted
20 </Directory>
21 ''
22 ];
23 };
24 };
25}
diff --git a/modules/private/websites/emilia/atelierfringant.nix b/modules/private/websites/emilia/atelierfringant.nix
deleted file mode 100644
index b47452f..0000000
--- a/modules/private/websites/emilia/atelierfringant.nix
+++ /dev/null
@@ -1,65 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.emilia.atelierfringant;
4 varDir = "/var/lib/ftp/emilia/atelierfringant";
5 apacheUser = config.services.httpd.Prod.user;
6 apacheGroup = config.services.httpd.Prod.group;
7in {
8 options.myServices.websites.emilia.atelierfringant.enable = lib.mkEnableOption "enable Émilia's website";
9
10 config = lib.mkIf cfg.enable {
11 system.activationScripts.emilia_atelierfringant = {
12 deps = [ "httpd" ];
13 text = ''
14 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/ftp/emilia/atelierfringant
15 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/emilia
16 '';
17 };
18 systemd.services.phpfpm-emilia_atelierfringant.after = lib.mkAfter [ "mysql.service" ];
19 systemd.services.phpfpm-emilia_atelierfringant.wants = [ "mysql.service" ];
20 services.phpfpm.pools.emilia_atelierfringant = {
21 user = apacheUser;
22 group = apacheGroup;
23 settings = {
24 "listen.owner" = apacheUser;
25 "listen.group" = apacheGroup;
26
27 "pm" = "ondemand";
28 "pm.max_children" = "5";
29 "pm.process_idle_timeout" = "60";
30
31 "php_admin_value[open_basedir]" = "/var/lib/php/sessions/emilia:${varDir}:/tmp";
32 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/emilia";
33 };
34 phpOptions = config.services.phpfpm.phpOptions + ''
35 disable_functions = "mail"
36 '';
37 phpPackage = pkgs.php72;
38 };
39 services.websites.env.production.modules = [ "proxy_fcgi" ];
40 services.websites.env.production.vhostConfs.emilia_atelierfringant = {
41 certName = "emilia";
42 certMainHost = "atelierfringant.org";
43 hosts = ["atelierfringant.org" "www.atelierfringant.org" ];
44 root = varDir;
45 extraConfig = [
46 ''
47 <FilesMatch "\.php$">
48 SetHandler "proxy:unix:${config.services.phpfpm.pools.emilia_atelierfringant.socket}|fcgi://localhost"
49 </FilesMatch>
50
51 <Location /xmlrpc.php>
52 AllowOverride None
53 Require all denied
54 </Location>
55 <Directory ${varDir}>
56 DirectoryIndex index.php index.htm index.html
57 Options Indexes FollowSymLinks MultiViews Includes
58 AllowOverride all
59 Require all granted
60 </Directory>
61 ''
62 ];
63 };
64 };
65}
diff --git a/modules/private/websites/emilia/moodle.nix b/modules/private/websites/emilia/moodle.nix
deleted file mode 100644
index 779c460..0000000
--- a/modules/private/websites/emilia/moodle.nix
+++ /dev/null
@@ -1,65 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.emilia.moodle;
4 env = config.myEnv.websites.emilia;
5 varDir = "/var/lib/emilia_moodle";
6 siteDir = ./moodle;
7 # php_admin_value[upload_max_filesize] = 50000000
8 # php_admin_value[post_max_size] = 50000000
9 configFile = ''
10 <?php // Moodle configuration file
11
12 unset($CFG);
13 global $CFG;
14 $CFG = new stdClass();
15
16 $CFG->dbtype = 'pgsql';
17 $CFG->dblibrary = 'native';
18 $CFG->dbhost = '${env.postgresql.host}';
19 $CFG->dbname = '${env.postgresql.database}';
20 $CFG->dbuser = '${env.postgresql.user}';
21 $CFG->dbpass = '${env.postgresql.password}';
22 $CFG->prefix = 'mdl_';
23 $CFG->dboptions = array (
24 'dbpersist' => 0,
25 'dbport' => '${env.postgreesql.port}',
26 'dbsocket' => '${env.postgresql.password}',
27 );
28
29 $CFG->wwwroot = 'https://www.saison-photo.org';
30 $CFG->dataroot = '${varDir}';
31 $CFG->admin = 'admin';
32
33 $CFG->directorypermissions = 02777;
34
35 require_once(__DIR__ . '/lib/setup.php');
36
37 // There is no php closing tag in this file,
38 // it is intentional because it prevents trailing whitespace problems!
39 '';
40 apacheUser = config.services.httpd.Prod.user;
41 apacheGroup = config.services.httpd.Prod.group;
42in {
43 options.myServices.websites.emilia.moodle.enable = lib.mkEnableOption "enable Emilia's website";
44
45 config = lib.mkIf cfg.enable {
46 system.activationScripts.emilia_moodle = ''
47 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${varDir}
48 '';
49 services.websites.env.production.vhostConfs.emilia_moodle = {
50 certName = "emilia";
51 certMainHost = "saison-photo.org";
52 hosts = [ "saison-photo.org" "www.saison-photo.org" ];
53 root = siteDir;
54 extraConfig = [
55 ''
56 <Directory ${siteDir}>
57 DirectoryIndex pause.html
58 Options Indexes FollowSymLinks MultiViews Includes
59 Require all granted
60 </Directory>
61 ''
62 ];
63 };
64 };
65}
diff --git a/modules/private/websites/emilia/moodle/pause.html b/modules/private/websites/emilia/moodle/pause.html
deleted file mode 100644
index 8b99c59..0000000
--- a/modules/private/websites/emilia/moodle/pause.html
+++ /dev/null
@@ -1,48 +0,0 @@
1<!doctype html>
2<html>
3 <head>
4 <title>Pause</title>
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6 <style>
7 body {
8 padding-left: 5px;
9 padding-right: 5px;
10 text-align: center;
11 margin: auto;
12 font: 20px Helvetica, sans-serif;
13 color: #333;
14 }
15 h1 {
16 margin: 0px;
17 font-size: 40px;
18 }
19 article {
20 display: block;
21 max-width: 650px;
22 margin: 0 auto;
23 padding-top: 30px;
24 }
25 article + article {
26 border-top: 1px solid lightgrey;
27 }
28 article div {
29 text-align: justify;
30 }
31 a {
32 color: #dc8100;
33 text-decoration: none;
34 }
35 a:hover {
36 color: #333;
37 }
38 </style>
39 </head>
40 <body>
41 <article>
42 <h1>Site web en pause&nbsp;!</h1>
43 <div>
44 <p>Le site et les cours de photographie sont actuellement en pause.</p>
45 </div>
46 </article>
47 </body>
48</html>
diff --git a/modules/private/websites/florian/app.nix b/modules/private/websites/florian/app.nix
deleted file mode 100644
index 2df344f..0000000
--- a/modules/private/websites/florian/app.nix
+++ /dev/null
@@ -1,142 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; };
4 secrets = config.myEnv.websites.tellesflorian.integration;
5 webRoot = "/var/lib/ftp/immae/florian/web";
6 cfg = config.myServices.websites.florian.app;
7 pcfg = config.services.phpApplication;
8in {
9 options.myServices.websites.florian.app.enable = lib.mkEnableOption "enable Florian's app in integration";
10
11 config = lib.mkIf cfg.enable {
12 services.phpApplication.apps.florian_app = {
13 websiteEnv = "integration";
14 httpdUser = config.services.httpd.Inte.user;
15 httpdGroup = config.services.httpd.Inte.group;
16 inherit webRoot;
17 varDir = "/var/lib/ftp/immae/florian_var";
18 varDirPaths = {
19 "var" = "0700";
20 };
21 app = "/var/lib/ftp/immae/florian";
22 serviceDeps = [ "mysql.service" ];
23 preStartActions = [
24 "./bin/console --env=dev cache:clear --no-warmup"
25 ];
26 phpOpenbasedir = [ "/tmp" ];
27 phpPool = {
28 "php_admin_value[upload_max_filesize]" = "20M";
29 "php_admin_value[post_max_size]" = "20M";
30 #"php_admin_flag[log_errors]" = "on";
31 "pm" = "ondemand";
32 "pm.max_children" = "5";
33 "pm.process_idle_timeout" = "60";
34 };
35 phpEnv = {
36 SYMFONY_DEBUG_MODE = "\"yes\"";
37 };
38 phpWatchFiles = [
39 config.secrets.fullPaths."websites/florian/app"
40 ];
41 phpPackage = pkgs.php72;
42 };
43
44 secrets.keys = {
45 "websites/florian/app_passwords" = {
46 user = config.services.httpd.Inte.user;
47 group = config.services.httpd.Inte.group;
48 permissions = "0400";
49 text = ''
50 invite:${secrets.invite_passwords}
51 '';
52 };
53 "websites/florian/app" = {
54 user = config.services.httpd.Inte.user;
55 group = config.services.httpd.Inte.group;
56 permissions = "0400";
57 text = ''
58 # This file is auto-generated during the composer install
59 parameters:
60 database_host: ${secrets.mysql.host}
61 database_port: ${secrets.mysql.port}
62 database_name: ${secrets.mysql.database}
63 database_user: ${secrets.mysql.user}
64 database_password: ${secrets.mysql.password}
65 mailer_transport: smtp
66 mailer_host: 127.0.0.1
67 mailer_user: null
68 mailer_password: null
69 secret: ${secrets.secret}
70 '';
71 };
72 };
73
74 services.websites.env.integration.modules = adminer.apache.modules;
75 services.websites.env.integration.vhostConfs.florian_app = {
76 certName = "integration";
77 addToCerts = true;
78 hosts = [ "app.tellesflorian.com" ];
79 root = webRoot;
80 extraConfig = [
81 ''
82 <FilesMatch "\.php$">
83 SetHandler "proxy:unix:${pcfg.phpListenPaths.florian_app}|fcgi://localhost"
84 </FilesMatch>
85
86 <Location />
87 AuthBasicProvider file ldap
88 Use LDAPConnect
89 Require ldap-group cn=app.tellesflorian.com,cn=httpd,ou=services,dc=immae,dc=eu
90
91 AuthUserFile "${config.secrets.fullPaths."websites/florian/app_passwords"}"
92 Require user "invite"
93
94 ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://tellesflorian.com\"></html>"
95 </Location>
96
97 <Directory ${webRoot}>
98 Options Indexes FollowSymLinks MultiViews Includes
99 AllowOverride None
100 Require all granted
101
102 DirectoryIndex app_dev.php
103
104 <IfModule mod_negotiation.c>
105 Options -MultiViews
106 </IfModule>
107
108 <IfModule mod_rewrite.c>
109 RewriteEngine On
110
111 RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
112 RewriteRule ^(.*) - [E=BASE:%1]
113
114 # Maintenance script
115 RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f
116 RewriteCond %{SCRIPT_FILENAME} !maintenance.php
117 RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L]
118 ErrorDocument 503 /maintenance.php
119
120 # Sets the HTTP_AUTHORIZATION header removed by Apache
121 RewriteCond %{HTTP:Authorization} .
122 RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
123
124 RewriteCond %{ENV:REDIRECT_STATUS} ^$
125 RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
126
127 # If the requested filename exists, simply serve it.
128 # We only want to let Apache serve files and not directories.
129 RewriteCond %{REQUEST_FILENAME} -f
130 RewriteRule ^ - [L]
131
132 # Rewrite all other queries to the front controller.
133 RewriteRule ^ %{ENV:BASE}/app_dev.php [L]
134 </IfModule>
135
136 </Directory>
137 ''
138 (adminer.apache.vhostConf null)
139 ];
140 };
141 };
142}
diff --git a/modules/private/websites/florian/app/default.nix b/modules/private/websites/florian/app/default.nix
deleted file mode 100644
index 28a7ec1..0000000
--- a/modules/private/websites/florian/app/default.nix
+++ /dev/null
@@ -1,27 +0,0 @@
1{ environment, varDir, secretsPath
2, composerEnv, fetchurl, sources }:
3let
4 app = composerEnv.buildPackage (
5 import ./php-packages.nix { inherit composerEnv fetchurl; } //
6 rec {
7 version = sources.websites-florian-app.version;
8 pname = "tellesflorian";
9 name = "${pname}-${version}";
10 src = sources.websites-florian-app;
11 noDev = (environment == "prod");
12 preInstall = ''
13 export SYMFONY_ENV="${environment}"
14 '';
15 postInstall = ''
16 cd $out
17 rm app/config/parameters.yml
18 ln -sf ${secretsPath} app/config/parameters.yml
19 rm -rf var/{logs,cache}
20 ln -sf ${varDir}/var/{logs,cache,sessions} var/
21 '';
22 passthru = {
23 inherit varDir environment;
24 webRoot = "${app}/web";
25 };
26 });
27in app
diff --git a/modules/private/websites/florian/app/php-packages.nix b/modules/private/websites/florian/app/php-packages.nix
deleted file mode 100644
index 0c7e00c..0000000
--- a/modules/private/websites/florian/app/php-packages.nix
+++ /dev/null
@@ -1,389 +0,0 @@
1# Generated with composer2nix and adapted to return only the list of
2# packages
3{ composerEnv, fetchurl }:
4{
5 packages = {
6 "composer/ca-bundle" = {
7 targetDir = "";
8 src = composerEnv.buildZipPackage {
9 name = "composer-ca-bundle-943b2c4fcad1ef178d16a713c2468bf7e579c288";
10 src = fetchurl {
11 url = https://api.github.com/repos/composer/ca-bundle/zipball/943b2c4fcad1ef178d16a713c2468bf7e579c288;
12 sha256 = "1gljia7akifp57w4rjzyh1km23kwymmvglz0mgafdgqzczcw0m6w";
13 };
14 };
15 };
16 "doctrine/annotations" = {
17 targetDir = "";
18 src = composerEnv.buildZipPackage {
19 name = "doctrine-annotations-f25c8aab83e0c3e976fd7d19875f198ccf2f7535";
20 src = fetchurl {
21 url = https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535;
22 sha256 = "08vm22fqq8r4bg2fk06y4inqnc8x0yfmsss28w5ra2011x2phq4z";
23 };
24 };
25 };
26 "doctrine/cache" = {
27 targetDir = "";
28 src = composerEnv.buildZipPackage {
29 name = "doctrine-cache-eb152c5100571c7a45470ff2a35095ab3f3b900b";
30 src = fetchurl {
31 url = https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b;
32 sha256 = "0iq0qqv1smlqz63jhj2fpjy54c5dwfwxyf5c89iky6i0yb81gwyd";
33 };
34 };
35 };
36 "doctrine/collections" = {
37 targetDir = "";
38 src = composerEnv.buildZipPackage {
39 name = "doctrine-collections-6c1e4eef75f310ea1b3e30945e9f06e652128b8a";
40 src = fetchurl {
41 url = https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a;
42 sha256 = "1dkxr2vjycykpcnnmq68rcnn1ww0kbpizd5pxxm6x9i2ilj8cbn7";
43 };
44 };
45 };
46 "doctrine/common" = {
47 targetDir = "";
48 src = composerEnv.buildZipPackage {
49 name = "doctrine-common-7bce00698899aa2c06fe7365c76e4d78ddb15fa3";
50 src = fetchurl {
51 url = https://api.github.com/repos/doctrine/common/zipball/7bce00698899aa2c06fe7365c76e4d78ddb15fa3;
52 sha256 = "12yizcsxsbhhi8hwaik4zalr12n5nxbpld05zygqhx6miyr92jyd";
53 };
54 };
55 };
56 "doctrine/dbal" = {
57 targetDir = "";
58 src = composerEnv.buildZipPackage {
59 name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873";
60 src = fetchurl {
61 url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873;
62 sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3";
63 };
64 };
65 };
66 "doctrine/doctrine-bundle" = {
67 targetDir = "";
68 src = composerEnv.buildZipPackage {
69 name = "doctrine-doctrine-bundle-eb6e4fb904a459be28872765ab6e2d246aac7c87";
70 src = fetchurl {
71 url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/eb6e4fb904a459be28872765ab6e2d246aac7c87;
72 sha256 = "0kkisgyblc9hf9x3zpbb1wif51fa8mi6svyd44nls38k9k93dp17";
73 };
74 };
75 };
76 "doctrine/doctrine-cache-bundle" = {
77 targetDir = "";
78 src = composerEnv.buildZipPackage {
79 name = "doctrine-doctrine-cache-bundle-9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1";
80 src = fetchurl {
81 url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1;
82 sha256 = "08bqz18vk4673pnm2r2pcph6pdchc36zajnma1p9c6dp21sv7iki";
83 };
84 };
85 };
86 "doctrine/inflector" = {
87 targetDir = "";
88 src = composerEnv.buildZipPackage {
89 name = "doctrine-inflector-90b2128806bfde671b6952ab8bea493942c1fdae";
90 src = fetchurl {
91 url = https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae;
92 sha256 = "01vmclj3k7xil51jg329fznshh8d07pvm4mr89lvfn1d7fyrq6qw";
93 };
94 };
95 };
96 "doctrine/instantiator" = {
97 targetDir = "";
98 src = composerEnv.buildZipPackage {
99 name = "doctrine-instantiator-8e884e78f9f0eb1329e445619e04456e64d8051d";
100 src = fetchurl {
101 url = https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d;
102 sha256 = "15dcja45rnwya431pcm826l68k1g8f1fabl7rih69alcdyvdlln4";
103 };
104 };
105 };
106 "doctrine/lexer" = {
107 targetDir = "";
108 src = composerEnv.buildZipPackage {
109 name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
110 src = fetchurl {
111 url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
112 sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
113 };
114 };
115 };
116 "doctrine/orm" = {
117 targetDir = "";
118 src = composerEnv.buildZipPackage {
119 name = "doctrine-orm-810a7baf81462a5ddf10e8baa8cb94b6eec02754";
120 src = fetchurl {
121 url = https://api.github.com/repos/doctrine/doctrine2/zipball/810a7baf81462a5ddf10e8baa8cb94b6eec02754;
122 sha256 = "1hmkc7917kgnav9hmlgvlp7qwm3zjj910ci71g9yqwjh6s28wrf1";
123 };
124 };
125 };
126 "fig/link-util" = {
127 targetDir = "";
128 src = composerEnv.buildZipPackage {
129 name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac";
130 src = fetchurl {
131 url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac;
132 sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64";
133 };
134 };
135 };
136 "incenteev/composer-parameter-handler" = {
137 targetDir = "";
138 src = composerEnv.buildZipPackage {
139 name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550";
140 src = fetchurl {
141 url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550;
142 sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm";
143 };
144 };
145 };
146 "jdorn/sql-formatter" = {
147 targetDir = "";
148 src = composerEnv.buildZipPackage {
149 name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
150 src = fetchurl {
151 url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
152 sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
153 };
154 };
155 };
156 "monolog/monolog" = {
157 targetDir = "";
158 src = composerEnv.buildZipPackage {
159 name = "monolog-monolog-fd8c787753b3a2ad11bc60c063cff1358a32a3b4";
160 src = fetchurl {
161 url = https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4;
162 sha256 = "0avf3y8raw23krwdb7kw9qb5bsr5ls4i7qd2vh7hcds3qjixg3h9";
163 };
164 };
165 };
166 "paragonie/random_compat" = {
167 targetDir = "";
168 src = composerEnv.buildZipPackage {
169 name = "paragonie-random_compat-5da4d3c796c275c55f057af5a643ae297d96b4d8";
170 src = fetchurl {
171 url = https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8;
172 sha256 = "1hp6pin4923c300yi85m7qk04gsrbygv52wv5zm7giyyf0k0g073";
173 };
174 };
175 };
176 "psr/cache" = {
177 targetDir = "";
178 src = composerEnv.buildZipPackage {
179 name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
180 src = fetchurl {
181 url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
182 sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
183 };
184 };
185 };
186 "psr/container" = {
187 targetDir = "";
188 src = composerEnv.buildZipPackage {
189 name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
190 src = fetchurl {
191 url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
192 sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
193 };
194 };
195 };
196 "psr/link" = {
197 targetDir = "";
198 src = composerEnv.buildZipPackage {
199 name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562";
200 src = fetchurl {
201 url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562;
202 sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13";
203 };
204 };
205 };
206 "psr/log" = {
207 targetDir = "";
208 src = composerEnv.buildZipPackage {
209 name = "psr-log-4ebe3a8bf773a19edfe0a84b6585ba3d401b724d";
210 src = fetchurl {
211 url = https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d;
212 sha256 = "1mlcv17fjw39bjpck176ah1z393b6pnbw3jqhhrblj27c70785md";
213 };
214 };
215 };
216 "psr/simple-cache" = {
217 targetDir = "";
218 src = composerEnv.buildZipPackage {
219 name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
220 src = fetchurl {
221 url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
222 sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
223 };
224 };
225 };
226 "sensio/distribution-bundle" = {
227 targetDir = "";
228 src = composerEnv.buildZipPackage {
229 name = "sensio-distribution-bundle-eb6266b3b472e4002538610b28a0a04bcf94891a";
230 src = fetchurl {
231 url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/eb6266b3b472e4002538610b28a0a04bcf94891a;
232 sha256 = "0wyffqj924lz9cv0vbahyngjw1g850v0p34swygzzgp3cr0ank13";
233 };
234 };
235 };
236 "sensio/framework-extra-bundle" = {
237 targetDir = "";
238 src = composerEnv.buildZipPackage {
239 name = "sensio-framework-extra-bundle-bf4940572e43af679aaa13be98f3446a1c237bd8";
240 src = fetchurl {
241 url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bf4940572e43af679aaa13be98f3446a1c237bd8;
242 sha256 = "1kb1n5w3kfc0kf4pslqdx5pgp0g4hmaag0i00wvjj2n3pjfm5lhf";
243 };
244 };
245 };
246 "sensiolabs/security-checker" = {
247 targetDir = "";
248 src = composerEnv.buildZipPackage {
249 name = "sensiolabs-security-checker-dc270d5fec418cc6ac983671dba5d80ffaffb142";
250 src = fetchurl {
251 url = https://api.github.com/repos/sensiolabs/security-checker/zipball/dc270d5fec418cc6ac983671dba5d80ffaffb142;
252 sha256 = "0fnshyd6f8j91a7y604nh6sqgscjl48mfa0727g2r4hkdfz8hpd1";
253 };
254 };
255 };
256 "swiftmailer/swiftmailer" = {
257 targetDir = "";
258 src = composerEnv.buildZipPackage {
259 name = "swiftmailer-swiftmailer-7ffc1ea296ed14bf8260b6ef11b80208dbadba91";
260 src = fetchurl {
261 url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91;
262 sha256 = "1vl5pzgvr2yfrj1yfs02mi917b0gr56v76ibi40r51a3346zhp6v";
263 };
264 };
265 };
266 "symfony/monolog-bundle" = {
267 targetDir = "";
268 src = composerEnv.buildZipPackage {
269 name = "symfony-monolog-bundle-8781649349fe418d51d194f8c9d212c0b97c40dd";
270 src = fetchurl {
271 url = https://api.github.com/repos/symfony/monolog-bundle/zipball/8781649349fe418d51d194f8c9d212c0b97c40dd;
272 sha256 = "0wcqhg1vfdj3mxacr3fxpgqwy1rk9znjg9bmzx4jymk8l16i7bq8";
273 };
274 };
275 };
276 "symfony/polyfill-apcu" = {
277 targetDir = "";
278 src = composerEnv.buildZipPackage {
279 name = "symfony-polyfill-apcu-e8ae2136ddb53dea314df56fcd88e318ab936c00";
280 src = fetchurl {
281 url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/e8ae2136ddb53dea314df56fcd88e318ab936c00;
282 sha256 = "07wdszb9ircnidjk3fp3cvcrggxv3sfm996jzd0a9pm6vfz9hymv";
283 };
284 };
285 };
286 "symfony/polyfill-intl-icu" = {
287 targetDir = "";
288 src = composerEnv.buildZipPackage {
289 name = "symfony-polyfill-intl-icu-254919c03761d46c29291616576ed003f10e91c1";
290 src = fetchurl {
291 url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/254919c03761d46c29291616576ed003f10e91c1;
292 sha256 = "01yivzv7p55fzrkkyvgd57zpyz82zn1qp0h6nzr77k01rkv3w0ds";
293 };
294 };
295 };
296 "symfony/polyfill-mbstring" = {
297 targetDir = "";
298 src = composerEnv.buildZipPackage {
299 name = "symfony-polyfill-mbstring-78be803ce01e55d3491c1397cf1c64beb9c1b63b";
300 src = fetchurl {
301 url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/78be803ce01e55d3491c1397cf1c64beb9c1b63b;
302 sha256 = "0cqr8ni6wpbaxa9gyr40y5bsv54pa2g8kdarlfw3qg2rgzmk0yz1";
303 };
304 };
305 };
306 "symfony/polyfill-php56" = {
307 targetDir = "";
308 src = composerEnv.buildZipPackage {
309 name = "symfony-polyfill-php56-ebc999ce5f14204c5150b9bd15f8f04e621409d8";
310 src = fetchurl {
311 url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ebc999ce5f14204c5150b9bd15f8f04e621409d8;
312 sha256 = "0b2j56l6d6rdggx7vr20d527df4pjfp4lgxpglsgbf5912rcyf83";
313 };
314 };
315 };
316 "symfony/polyfill-php70" = {
317 targetDir = "";
318 src = composerEnv.buildZipPackage {
319 name = "symfony-polyfill-php70-3532bfcd8f933a7816f3a0a59682fc404776600f";
320 src = fetchurl {
321 url = https://api.github.com/repos/symfony/polyfill-php70/zipball/3532bfcd8f933a7816f3a0a59682fc404776600f;
322 sha256 = "151m76lc9w0kxnnwk4zdcjlmj7fppibnp8jisgpvvq32ml3fizdi";
323 };
324 };
325 };
326 "symfony/polyfill-util" = {
327 targetDir = "";
328 src = composerEnv.buildZipPackage {
329 name = "symfony-polyfill-util-e17c808ec4228026d4f5a8832afa19be85979563";
330 src = fetchurl {
331 url = https://api.github.com/repos/symfony/polyfill-util/zipball/e17c808ec4228026d4f5a8832afa19be85979563;
332 sha256 = "17sdpdidc0b701f9rippjv1grfci7wrdpy2i1inlwwpr6zy782cq";
333 };
334 };
335 };
336 "symfony/swiftmailer-bundle" = {
337 targetDir = "";
338 src = composerEnv.buildZipPackage {
339 name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec";
340 src = fetchurl {
341 url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec;
342 sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01";
343 };
344 };
345 };
346 "symfony/symfony" = {
347 targetDir = "";
348 src = composerEnv.buildZipPackage {
349 name = "symfony-symfony-874d4d659774d7bab90538072c83ed532dd17dc5";
350 src = fetchurl {
351 url = https://api.github.com/repos/symfony/symfony/zipball/874d4d659774d7bab90538072c83ed532dd17dc5;
352 sha256 = "02rsn3sc34jh107n576jfbh666k06y44yr7hw61nir0d864k8api";
353 };
354 };
355 };
356 "twig/twig" = {
357 targetDir = "";
358 src = composerEnv.buildZipPackage {
359 name = "twig-twig-9c24f2cd39dc1906b76879e099970b7e53724601";
360 src = fetchurl {
361 url = https://api.github.com/repos/twigphp/Twig/zipball/9c24f2cd39dc1906b76879e099970b7e53724601;
362 sha256 = "0brfj2lahrrw1322zy6jyd380hjks1ynzzkmq3875a282gzrfkdz";
363 };
364 };
365 };
366 };
367 devPackages = {
368 "sensio/generator-bundle" = {
369 targetDir = "";
370 src = composerEnv.buildZipPackage {
371 name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65";
372 src = fetchurl {
373 url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65;
374 sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3";
375 };
376 };
377 };
378 "symfony/phpunit-bridge" = {
379 targetDir = "";
380 src = composerEnv.buildZipPackage {
381 name = "symfony-phpunit-bridge-32b06d2b0babf3216e55acfce42249321a304f03";
382 src = fetchurl {
383 url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/32b06d2b0babf3216e55acfce42249321a304f03;
384 sha256 = "0vw4q3lvz8gfs0r93ds8yymz8586k0czwa01c7d172rc8x02v0qq";
385 };
386 };
387 };
388 };
389}
diff --git a/modules/private/websites/florian/integration.nix b/modules/private/websites/florian/integration.nix
deleted file mode 100644
index 8ac1f46..0000000
--- a/modules/private/websites/florian/integration.nix
+++ /dev/null
@@ -1,34 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; };
4 cfg = config.myServices.websites.florian.integration;
5 varDir = "/var/lib/ftp/florian/www.ft.immae.dev";
6 env = config.myEnv.websites.florian;
7in {
8 options.myServices.websites.florian.integration.enable = lib.mkEnableOption "enable Florian's website integration";
9
10 config = lib.mkIf cfg.enable {
11 security.acme.certs."ftp".extraDomains."ft.immae.dev" = null;
12
13 services.websites.env.integration.modules = adminer.apache.modules;
14 services.websites.env.integration.vhostConfs.florian_integration = {
15 certName = "integration";
16 addToCerts = true;
17 hosts = [ "www.ft.immae.dev" ];
18 root = varDir;
19 extraConfig = [
20 (adminer.apache.vhostConf null)
21 ''
22 ServerAdmin ${env.server_admin}
23
24 <Directory ${varDir}>
25 DirectoryIndex index.php index.htm index.html
26 Options Indexes FollowSymLinks MultiViews Includes
27 AllowOverride None
28 Require all granted
29 </Directory>
30 ''
31 ];
32 };
33 };
34}
diff --git a/modules/private/websites/florian/production.nix b/modules/private/websites/florian/production.nix
deleted file mode 100644
index 1c5ffa6..0000000
--- a/modules/private/websites/florian/production.nix
+++ /dev/null
@@ -1,34 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; };
4 cfg = config.myServices.websites.florian.production;
5 varDir = "/var/lib/ftp/florian/tellesflorian.com";
6 env = config.myEnv.websites.florian;
7in {
8 options.myServices.websites.florian.production.enable = lib.mkEnableOption "enable Florian's website production";
9
10 config = lib.mkIf cfg.enable {
11 security.acme.certs."ftp".extraDomains."tellesflorian.com" = null;
12
13 services.websites.env.production.modules = adminer.apache.modules;
14 services.websites.env.production.vhostConfs.florian_production = {
15 certName = "florian";
16 certMainHost = "tellesflorian.com";
17 hosts = [ "tellesflorian.com" "www.tellesflorian.com" ];
18 root = varDir;
19 extraConfig = [
20 (adminer.apache.vhostConf null)
21 ''
22 ServerAdmin ${env.server_admin}
23
24 <Directory ${varDir}>
25 DirectoryIndex index.php index.htm index.html
26 Options Indexes FollowSymLinks MultiViews Includes
27 AllowOverride None
28 Require all granted
29 </Directory>
30 ''
31 ];
32 };
33 };
34}
diff --git a/modules/private/websites/immae/chatons/immae-eu.properties b/modules/private/websites/immae/chatons/immae-eu.properties
deleted file mode 100644
index 32b2d47..0000000
--- a/modules/private/websites/immae/chatons/immae-eu.properties
+++ /dev/null
@@ -1,46 +0,0 @@
1# https://framagit.org/chatons/chatonsinfos/-/blob/master/MODELES/organization.properties
2
3# [File]
4file.class = organization
5file.protocol = ChatonsInfos-0.1
6file.datetime = 2021-01-11T22:23:00
7file.generator = Immae avec ses doigts
8
9# [Organisation]
10organization.country.name = France
11organization.country.code = FR
12organization.name = ImmaeEu
13organization.description = ImmaeEu est un CHATONS des Alpes Maritimes
14organization.website = https://www.immae.eu
15organization.logo = https://assets.immae.eu/logo.jpg
16organization.socialnetworks.diaspora = https://diaspora.immae.eu/people/1a185f29cc76cb35
17organization.socialnetworks.facebook = https://www.facebook.com/ismael.bouya
18organization.socialnetworks.mastodon = https://mastodon.immae.eu/@immae
19organization.socialnetworks.peertube = https://peertube.immae.eu/accounts/immae/
20organization.socialnetworks.twitter = https://twitter.com/_immae
21organization.chatrooms.xmpp = ismael@immae.fr
22organization.chatrooms.irc = immae@freenode
23organization.chatrooms.matrix = @immae:matrix.org
24organization.owner.name = Ismaël Bouya
25organization.owner.website = https://www.immae.eu
26organization.owner.logo = https://assets.immae.eu/logo.jpg
27organization.contact.url = https://www.immae.eu/contacts_fr.html
28organization.contact.email = contact@mail.immae.eu
29organization.legal.url = https://www.immae.eu/mentions.html
30organization.guide.technical = https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/
31organization.status.level = ACTIVE
32organization.status.description = En activité
33organization.startdate = 01/01/2019
34
35organization.memberof.chatons.startdate = 01/07/2019
36organization.memberof.chatons.status.level = ACTIVE
37organization.memberof.chatons.status.description = Participe au collectif
38
39# [Subs]
40# Un lien vers un fichier properties complémentaire (type URL, optionnel, ex. https://www.chapril.org/.well-known/chapril.properties).
41subs.etherpad = https://www.immae.eu/.well-known/chatonsinfos/service-etherpad.properties
42
43
44# [Metrics]
45#metrics.http.total.2020 =
46
diff --git a/modules/private/websites/immae/chatons/service-etherpad.properties b/modules/private/websites/immae/chatons/service-etherpad.properties
deleted file mode 100644
index cfcab1d..0000000
--- a/modules/private/websites/immae/chatons/service-etherpad.properties
+++ /dev/null
@@ -1,164 +0,0 @@
1# service.properties
2
3# [File]
4# Classe du fichier (valeur parmi Federation/Organization/Service/Device, obligatoire).
5file.class = service
6
7# Version de l'ontologie utilisée utilisé (type STRING, recommandé).
8file.protocol = ChatonsInfos-0.1
9
10# Date et horaire de génération du fichier (type DATETIME, recommandé).
11file.datetime = 2021-01-04T00:01:00
12
13# Nom du générateur du fichier (type STRING, recommandé). Exemple : Florian avec ses doigts
14file.generator = Immae avec ses doigts
15
16
17# [Service]
18# Nom du service (type STRING, obligatoire). Exemple : Pad Exemple
19service.name = Etherpard
20
21# Description du service (type STRING, recommandé).
22service.description = Éditeur de texte collaboratif en temps réel. on peut y écrire simultanément.
23
24# Lien du site web du service (type URL, recommandé). Exemple : https://pad.exemple.ext
25service.website = https://ether.immae.eu
26
27# Lien du logo du service (type URL, recommandé, ex. https://www.chapril.org/.well-known/statoolinfos/chapril-logo-mini.png.
28service.logo = https://ether.immae.eu/favicon.ico
29
30# Lien de la page web des mentions légales du service (type URL, recommandé). Exemple : https://pad.exemple.ext/cgu.html
31service.legal.url = https://www.immae.eu/mentions.html
32
33# Lien de la documentation web du service (type URL, recommandé).
34service.guide.technical = https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/
35
36# Lien des aides web pour le service (type URL, recommandé).
37service.guide.user =
38
39# Lien de la page de support du service (type URL, recommandé). Exemple : https://exemple.ext/contact.html
40service.contact.url = https://www.immae.eu/contacts_fr.html
41
42# Courriel du support du service (type EMAIL, recommandé). Exemple : contact@exemple.ext
43service.contact.email = contact@mail.immae.eu
44
45# Date d'ouverture du service (type DATE, recommandé). Exemple : 20/03/2020
46service.startdate = 01/01/2019
47
48# Date de fermeture du service (type DATE, optionnel).
49service.enddate =
50
51# Statut du service (un parmi {OK,WARNING,ALERT,ERROR,OVER,VOID}, obligatoire).
52service.status.level = OK
53
54# Description du statut du service (type STRING, optionnel, exemple : mise à jour en cours)
55service.status.description = OK
56
57# Inscriptions requises pour utiliser le service (parmi None;Free;Member;Client, obligatoire).
58service.registration = None
59
60# [Software]
61# Nom du logiciel (type STRING, obligatoire).
62software.name = Etherpad
63
64# Lien du site web du logiciel (type URL, recommandé).
65software.website = https://etherpad.org/
66
67# Lien web vers la licence du logiciel (type URL, obligatoire).
68software.license.url = https://github.com/ether/etherpad-lite/blob/develop/LICENSE
69
70# Nom de la licence du logiciel (type STRING, obligatoire).
71software.license.name = Apache License Version 2.0
72
73# Version du logiciel (type STRING, recommandé).
74software.version = 1.8.3
75
76# Lien web vers les sources du logiciel (type URL, recommandé).
77software.source.url = https://github.com/ether/etherpad-lite
78
79# Liste de modules optionnels installés (type VALUES, optionnel, ex. Nextcloud-Calendar,Nextcloud-Talk).
80software.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
81
82
83# [Host]
84# 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.
85host.name = Hetzner
86
87# Description de l'hébergeur (type STRING, optionnel).
88host.description =
89
90# Type de serveur (un parmi NANO, PHYSICAL, VIRTUAL, SHARED, CLOUD, obligatoire, ex. PHYSICAL).
91# NANO : nano-ordinateur (Raspberry Pi, Olimex…)
92# PHYSICAL : machine physique
93# VIRTUAL : machine virtuelle
94# SHARED : hébergement mutualisé
95# CLOUD : infrastructure multi-serveurs
96host.server.type = PHYSICAL
97
98# Type d'hébergement (un parmi HOME, HOSTEDBAY, HOSTEDSERVER, OUTSOURCED, obligatoire, ex. HOSTEDSERVER).
99# HOME : hébergement à domicile
100# HOSTEDBAY : serveur personnel hébergé dans une baie d'un fournisseur
101# HOSTEDSERVER : serveur d'un fournisseur
102# OUTSOURCED : infrastructure totalement sous-traitée
103host.provider.type = HOSTEDSERVER
104
105# Si vous avez du mal à remplir les champs précédents, ce tableau pourra vous aider :
106# NANO PHYSICAL VIRTUAL SHARED CLOUD
107# HOME pm pm vm shared cloud
108# HOSTEDBAY -- pm vm shared cloud
109# HOSTEDSERVER -- pm vm shared cloud
110# OUTSOURCED -- -- vps shared cloud
111# Légendes : pm : physical machine ; vm : virtual machine ; vps : virtual private server.
112
113# Pays de l'hébergeur (type STRING, recommandé). Exemple : France
114host.country.name = Allemagne
115
116# Code pays de l'hébergeur (type STRING, recommandé). Exemple : FR
117host.country.code = DE
118
119
120
121# [Subs]
122# Un lien vers un fichier properties complémentaire (type URL, optionnel). Exemple : https://
123subs.foo =
124
125# [Metrics]
126# Nom du métrique (type STRING, recommandé).
127metrics.http.total.name = Nombre total de requêtes HTTP
128
129# Description du métrique (type STRING, recommandé).
130metrics.http.total.description = Somme des requêtes HTTP ipv4 et ipv6.
131
132# Métrique à valeur anuelle (type NUMERIC, optionnel).
133metrics.http.total.2020 =
134
135# Métrique à valeur mensuelle (type MONTHS, optionnel).
136metrics.http.total.2020.months=
137
138# Métrique à valeur hebdomadaire (type WEEKS, optionnel).
139metrics.http.total.2020.weeks=
140
141# Métrique à valeur quotidienne (type DAYS, optionnel).
142metrics.http.total.2020.days=
143
144
145# Nom du métrique (type STRING, recommandé).
146metrics.visitors.total.name = Nombre total de visiteurs
147
148# Description du métrique (type STRING, recommandé).
149metrics.visitors.total.description =
150
151# Métrique à valeur anuelle (type NUMERIC, optionnel).
152metrics.visitors.total.2020 =
153
154# Métrique à valeur mensuelle (type MONTHS, optionnel).
155metrics.visitors.total.2020.months=
156
157# Métrique à valeur hebdomadaire (type WEEKS, optionnel).
158metrics.visitors.total.2020.weeks=
159
160# Métrique à valeur quotidienne (type DAYS, optionnel).
161metrics.visitors.total.2020.days=
162
163
164# [Metrics spécifiques au service]
diff --git a/modules/private/websites/immae/matrix/client b/modules/private/websites/immae/matrix/client
deleted file mode 100644
index 2769de5..0000000
--- a/modules/private/websites/immae/matrix/client
+++ /dev/null
@@ -1,8 +0,0 @@
1{
2 "m.homeserver": {
3 "base_url": "https://immae.ems.host"
4 },
5 "m.identity_server": {
6 "base_url": "https://vector.im"
7 }
8}
diff --git a/modules/private/websites/immae/production.nix b/modules/private/websites/immae/production.nix
deleted file mode 100644
index 8b4998f..0000000
--- a/modules/private/websites/immae/production.nix
+++ /dev/null
@@ -1,137 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.immae.production;
4 varDir = "/var/lib/buildbot/outputs/immae/blog";
5 coursDir = "/var/lib/buildbot/outputs/immae/cours";
6 rechercheDir = "/var/lib/buildbot/outputs/immae/recherche";
7 recettesDir = "/var/lib/buildbot/outputs/immae/recettes";
8 historyDir = "/var/lib/buildbot/outputs/immae/history";
9 docsDir = "/var/lib/buildbot/outputs/immae/docs/";
10 env = config.myEnv.websites.immae;
11in {
12 options.myServices.websites.immae.production.enable = lib.mkEnableOption "enable Immae's website";
13
14 config = lib.mkIf cfg.enable {
15 services.webstats.sites = [ { name = "www.immae.eu"; } ];
16
17 services.websites.env.production.vhostConfs.immae_production = {
18 certName = "immae";
19 addToCerts = true;
20 certMainHost = "www.immae.eu";
21 hosts = [ "www.immae.eu" "immae.eu" ];
22 root = varDir;
23 extraConfig = [
24 ''
25 Use Stats www.immae.eu
26 Header always set Strict-Transport-Security "max-age=31536000"
27
28 <LocationMatch /.well-known/(webfinger|host-meta)>
29 Header always set Referrer-Policy "strict-origin-when-cross-origin"
30 RequestHeader set X-Forwarded-Proto "https"
31
32 RewriteRule ^(.*)$ https://mastodon.immae.eu%{REQUEST_URI} [QSA,L]
33 </LocationMatch>
34
35 RewriteEngine On
36 RewriteCond "%{REQUEST_URI}" "!^/.well-known/(webfinger|host-meta)"
37 RewriteCond "%{HTTP_HOST}" "!^www\.immae\.eu$" [NC]
38 RewriteRule ^(.+)$ https://www.immae.eu$1 [R=302,L]
39
40 <Directory ${varDir}>
41 DirectoryIndex index.htm index.html
42 Options Indexes FollowSymLinks MultiViews Includes
43 AllowOverride All
44 Require all granted
45 </Directory>
46
47 Alias /.well-known/chatonsinfos ${./chatons}
48 <Directory ${./chatons}>
49 Options Indexes FollowSymLinks MultiViews Includes
50 AllowOverride None
51 Require all granted
52 </Directory>
53
54 Alias /.well-known/matrix ${./matrix}
55 <Directory ${./matrix}>
56 Options Indexes FollowSymLinks MultiViews Includes
57 AllowOverride None
58 Require all granted
59 Header always set Access-Control-Allow-Origin "*"
60 </Directory>
61
62 Alias /cours ${coursDir}
63 <Directory ${coursDir}>
64 DirectoryIndex index.htm index.html
65 Options Indexes FollowSymLinks MultiViews Includes
66 AllowOverride All
67 Require all granted
68 </Directory>
69
70 Alias /docs ${docsDir}
71 <Directory ${docsDir}>
72 DirectoryIndex index.htm index.html
73 Options Indexes FollowSymLinks MultiViews Includes
74 AllowOverride All
75 Require all granted
76 </Directory>
77
78 Alias /eurl ${./eurl}
79 <Directory ${./eurl}>
80 DirectoryIndex index.htm index.html
81 Options Indexes FollowSymLinks MultiViews Includes
82 AllowOverride None
83 Require all granted
84 </Directory>
85
86 Alias /recherche ${rechercheDir}
87 <Directory ${rechercheDir}>
88 DirectoryIndex index.htm index.html
89 Options Indexes FollowSymLinks MultiViews Includes
90 AllowOverride All
91 Require all granted
92 </Directory>
93
94 Alias /recettes ${recettesDir}
95 <Directory ${recettesDir}>
96 DirectoryIndex index.htm index.html
97 Options Indexes FollowSymLinks MultiViews Includes
98 AllowOverride All
99 Require all granted
100 </Directory>
101
102 Alias /history ${historyDir}
103 <Directory ${historyDir}>
104 DirectoryIndex index.html
105 AllowOverride None
106 Require all granted
107 </Directory>
108 ''
109 ];
110 };
111
112 services.websites.env.production.vhostConfs.immae_fr = {
113 certName = "immae";
114 addToCerts = true;
115 hosts = [ "www.immae.fr" "immae.fr" ];
116 root = null;
117 extraConfig = [ ''
118 RedirectMatch 301 ^/((?!\.well-known.*$).*)$ https://www.immae.eu/chapeaux/
119 '' ];
120 };
121
122 services.websites.env.production.vhostConfs.immae_bouya = {
123 certName = "immae";
124 addToCerts = true;
125 hosts = [ "bouya.org" "www.bouya.org" ];
126 root = rechercheDir;
127 extraConfig = [ ''
128 <Directory ${rechercheDir}>
129 DirectoryIndex index.htm index.html
130 Options Indexes FollowSymLinks MultiViews Includes
131 AllowOverride All
132 Require all granted
133 </Directory>
134 '' ];
135 };
136 };
137}
diff --git a/modules/private/websites/immae/release.nix b/modules/private/websites/immae/release.nix
deleted file mode 100644
index d06af87..0000000
--- a/modules/private/websites/immae/release.nix
+++ /dev/null
@@ -1,39 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.immae.release;
4 varDir = "/var/lib/ftp/release.immae.eu";
5 env = config.myEnv.websites.release;
6in {
7 options.myServices.websites.immae.release.enable = lib.mkEnableOption "enable Release' website";
8
9 config = lib.mkIf cfg.enable {
10 services.webstats.sites = [ { name = "release.immae.eu"; } ];
11
12 services.websites.env.production.vhostConfs.immae_release = {
13 certName = "immae";
14 addToCerts = true;
15 hosts = [ "release.immae.eu" ];
16 root = varDir;
17 extraConfig = [
18 ''
19 Use Stats release.immae.eu
20
21 Use Apaxy "${varDir}" "title .duplicity-ignore"
22 <Directory "${varDir}">
23 Use LDAPConnect
24 Options Indexes
25 AllowOverride All
26 Require all granted
27 </Directory>
28
29 <Directory "${varDir}/packages">
30 Use LDAPConnect
31 Options Indexes FollowSymlinks
32 AllowOverride None
33 Require all granted
34 </Directory>
35 ''
36 ];
37 };
38 };
39}
diff --git a/modules/private/websites/immae/temp.nix b/modules/private/websites/immae/temp.nix
deleted file mode 100644
index 19aef1a..0000000
--- a/modules/private/websites/immae/temp.nix
+++ /dev/null
@@ -1,64 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.immae.temp;
4 varDir = "/var/lib/immae_temp";
5 env = config.myEnv.websites.immae.temp;
6in {
7 options.myServices.websites.immae.temp.enable = lib.mkEnableOption "enable Temp' website";
8
9 config = lib.mkIf cfg.enable {
10 services.websites.env.production.vhostConfs.immae_temp = {
11 certName = "immae";
12 addToCerts = true;
13 hosts = [ "temp.immae.eu" ];
14 root = null;
15 extraConfig = [ ''
16 ProxyVia On
17 ProxyRequests Off
18 ProxyPreserveHost On
19 ProxyPass / unix:///run/surfer/listen.sock|http://temp.immae.eu/
20 ProxyPassReverse / unix:///run/surfer/listen.sock|http://temp.immae.eu/
21 <Proxy *>
22 Options FollowSymLinks MultiViews
23 AllowOverride None
24 Require all granted
25 </Proxy>
26 '' ];
27 };
28
29 secrets.keys."webapps/surfer" = {
30 permissions = "0400";
31 user = "wwwrun";
32 group = "wwwrun";
33 text = ''
34 CLOUDRON_LDAP_URL=ldaps://${env.ldap.host}
35 CLOUDRON_LDAP_USERS_BASE_DN=${env.ldap.base}
36 TOKENSTORE_FILE=/var/lib/surfer/tokens.json
37 CLOUDRON_LDAP_BIND_DN=${env.ldap.dn}
38 CLOUDRON_LDAP_BIND_PASSWORD=${env.ldap.password}
39 CLOUDRON_LDAP_USERS_BASE_DN=${env.ldap.base}
40 CLOUDRON_LDAP_FILTER="${env.ldap.filter}"
41 LISTEN=/run/surfer/listen.sock
42 '';
43 };
44
45 systemd.services.surfer = {
46 description = "Surfer";
47 wantedBy = [ "multi-user.target" ];
48 after = [ "network.target" ];
49
50 script = ''
51 exec ${pkgs.webapps.surfer}/bin/surfer-server ${varDir}
52 '';
53 serviceConfig = {
54 EnvironmentFile = config.secrets.fullPaths."webapps/surfer";
55 User = "wwwrun";
56 Group = "wwwrun";
57 StateDirectory = "surfer";
58 RuntimeDirectory = "surfer";
59 Type = "simple";
60 };
61 };
62 };
63}
64
diff --git a/modules/private/websites/isabelle/aten_app/default.nix b/modules/private/websites/isabelle/aten_app/default.nix
deleted file mode 100644
index f967b9a..0000000
--- a/modules/private/websites/isabelle/aten_app/default.nix
+++ /dev/null
@@ -1,61 +0,0 @@
1{ environment ? "prod"
2, varDir ? "/var/lib/aten_${environment}"
3, composerEnv, fetchgit, runCommand, nodejs-10_x, jq, libsass, python, fetchurl, yarn2nix-moretea, yarn, sources }:
4let
5 yarn2nix-moretea' = yarn2nix-moretea.override({
6 yarn = yarn.override({ nodejs = nodejs-10_x; });
7 nodejs = nodejs-10_x;
8 });
9 packagesource = sources.websites-isabelle-aten;
10 packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
11 cat ${packagesource}/package.json | jq -r '.version = "v1.0.0"|.name="aten"' > $out
12 '';
13 yarnModules = yarn2nix-moretea'.mkYarnModules rec {
14 name = "aten-yarn";
15 pname = name;
16 version = "v1.0.0";
17 packageJSON = packagejson;
18 yarnLock = "${packagesource}/yarn.lock";
19 yarnNix = ./yarn-packages.nix;
20 pkgConfig = {
21 node-sass = {
22 buildInputs = [ libsass python ];
23 postInstall = let
24 nodeHeaders = fetchurl {
25 url = "https://nodejs.org/download/release/v${nodejs-10_x.version}/node-v${nodejs-10_x.version}-headers.tar.gz";
26 sha256 = "15hkcbs328d3rc1s14rmky8lh8d3rr86l8k0bia0ggxzwl23lj9c";
27 };
28 in
29 ''
30 node scripts/build.js --tarball=${nodeHeaders}
31 '';
32 };
33 };
34 };
35 app = composerEnv.buildPackage (
36 import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
37 rec {
38 version = packagesource.version;
39 pname = "aten";
40 name = "${pname}-${version}";
41 src = packagesource;
42 noDev = (environment == "prod");
43 preInstall = ''
44 export SYMFONY_ENV="${environment}"
45 export APP_ENV="${environment}"
46 '';
47 postInstall = ''
48 ln -sf ${yarnModules}/node_modules .
49 yarn run --offline encore production
50 rm -rf var/{log,cache}
51 ln -sf ${varDir}/{log,cache} var/
52 '';
53 buildInputs = [ yarnModules yarn2nix-moretea'.yarn ];
54 passthru = {
55 inherit varDir;
56 inherit environment;
57 webRoot = "${app}/public";
58 };
59 }
60 );
61in app
diff --git a/modules/private/websites/isabelle/aten_app/php-packages.nix b/modules/private/websites/isabelle/aten_app/php-packages.nix
deleted file mode 100644
index 3647938..0000000
--- a/modules/private/websites/isabelle/aten_app/php-packages.nix
+++ /dev/null
@@ -1,740 +0,0 @@
1# Generated with composer2nix and adapted to return only the list of
2# packages
3{ composerEnv, fetchurl, fetchgit ? null }:
4{
5 packages = {
6 "behat/transliterator" = {
7 targetDir = "";
8 src = composerEnv.buildZipPackage {
9 name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
10 src = fetchurl {
11 url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
12 sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
13 };
14 };
15 };
16 "doctrine/annotations" = {
17 targetDir = "";
18 src = composerEnv.buildZipPackage {
19 name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5";
20 src = fetchurl {
21 url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5;
22 sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7";
23 };
24 };
25 };
26 "doctrine/cache" = {
27 targetDir = "";
28 src = composerEnv.buildZipPackage {
29 name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57";
30 src = fetchurl {
31 url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57;
32 sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i";
33 };
34 };
35 };
36 "doctrine/collections" = {
37 targetDir = "";
38 src = composerEnv.buildZipPackage {
39 name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf";
40 src = fetchurl {
41 url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf;
42 sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis";
43 };
44 };
45 };
46 "doctrine/common" = {
47 targetDir = "";
48 src = composerEnv.buildZipPackage {
49 name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d";
50 src = fetchurl {
51 url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d;
52 sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na";
53 };
54 };
55 };
56 "doctrine/dbal" = {
57 targetDir = "";
58 src = composerEnv.buildZipPackage {
59 name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9";
60 src = fetchurl {
61 url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9;
62 sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj";
63 };
64 };
65 };
66 "doctrine/doctrine-bundle" = {
67 targetDir = "";
68 src = composerEnv.buildZipPackage {
69 name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d";
70 src = fetchurl {
71 url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d;
72 sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3";
73 };
74 };
75 };
76 "doctrine/doctrine-cache-bundle" = {
77 targetDir = "";
78 src = composerEnv.buildZipPackage {
79 name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927";
80 src = fetchurl {
81 url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927;
82 sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa";
83 };
84 };
85 };
86 "doctrine/doctrine-migrations-bundle" = {
87 targetDir = "";
88 src = composerEnv.buildZipPackage {
89 name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce";
90 src = fetchurl {
91 url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce;
92 sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn";
93 };
94 };
95 };
96 "doctrine/event-manager" = {
97 targetDir = "";
98 src = composerEnv.buildZipPackage {
99 name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3";
100 src = fetchurl {
101 url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3;
102 sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88";
103 };
104 };
105 };
106 "doctrine/inflector" = {
107 targetDir = "";
108 src = composerEnv.buildZipPackage {
109 name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a";
110 src = fetchurl {
111 url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a;
112 sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5";
113 };
114 };
115 };
116 "doctrine/instantiator" = {
117 targetDir = "";
118 src = composerEnv.buildZipPackage {
119 name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda";
120 src = fetchurl {
121 url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda;
122 sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy";
123 };
124 };
125 };
126 "doctrine/lexer" = {
127 targetDir = "";
128 src = composerEnv.buildZipPackage {
129 name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
130 src = fetchurl {
131 url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
132 sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
133 };
134 };
135 };
136 "doctrine/migrations" = {
137 targetDir = "";
138 src = composerEnv.buildZipPackage {
139 name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6";
140 src = fetchurl {
141 url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6;
142 sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld";
143 };
144 };
145 };
146 "doctrine/orm" = {
147 targetDir = "";
148 src = composerEnv.buildZipPackage {
149 name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8";
150 src = fetchurl {
151 url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8;
152 sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls";
153 };
154 };
155 };
156 "doctrine/persistence" = {
157 targetDir = "";
158 src = composerEnv.buildZipPackage {
159 name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38";
160 src = fetchurl {
161 url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38;
162 sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7";
163 };
164 };
165 };
166 "doctrine/reflection" = {
167 targetDir = "";
168 src = composerEnv.buildZipPackage {
169 name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6";
170 src = fetchurl {
171 url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6;
172 sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy";
173 };
174 };
175 };
176 "gedmo/doctrine-extensions" = {
177 targetDir = "";
178 src = composerEnv.buildZipPackage {
179 name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27";
180 src = fetchurl {
181 url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27;
182 sha256 = "1i33xy9s18rncc1fllwi2qi7hrxj8g762fvgl9np7xndxa7kclyb";
183 };
184 };
185 };
186 "giggsey/libphonenumber-for-php" = {
187 targetDir = "";
188 src = composerEnv.buildZipPackage {
189 name = "giggsey-libphonenumber-for-php-a71f260c2efce10ded8af030a20fa13edfb0e9be";
190 src = fetchurl {
191 url = https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/a71f260c2efce10ded8af030a20fa13edfb0e9be;
192 sha256 = "15id03c1msyhri7j4i63r535g3g56n3x99i8301as63w7m1ybfj5";
193 };
194 };
195 };
196 "giggsey/locale" = {
197 targetDir = "";
198 src = composerEnv.buildZipPackage {
199 name = "giggsey-locale-da6845720b5d104d319d7e84576f54e44dd9e4f5";
200 src = fetchurl {
201 url = https://api.github.com/repos/giggsey/Locale/zipball/da6845720b5d104d319d7e84576f54e44dd9e4f5;
202 sha256 = "0gc8im06h5l794a0drd74s3inps22jr1zr5wnw0b89m06d4nw42j";
203 };
204 };
205 };
206 "jdorn/sql-formatter" = {
207 targetDir = "";
208 src = composerEnv.buildZipPackage {
209 name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
210 src = fetchurl {
211 url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
212 sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
213 };
214 };
215 };
216 "ocramius/package-versions" = {
217 targetDir = "";
218 needsModifyRights = true;
219 src = composerEnv.buildZipPackage {
220 name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f";
221 src = fetchurl {
222 url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f;
223 sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881";
224 };
225 };
226 };
227 "ocramius/proxy-manager" = {
228 targetDir = "";
229 src = composerEnv.buildZipPackage {
230 name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1";
231 src = fetchurl {
232 url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1;
233 sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn";
234 };
235 };
236 };
237 "opensoft/doctrine-postgres-types" = {
238 targetDir = "";
239 src = composerEnv.buildZipPackage {
240 name = "opensoft-doctrine-postgres-types-7e69bdfeb2ae61c2f1e90872370cdf0135fb3006";
241 src = fetchurl {
242 url = https://api.github.com/repos/opensoft/doctrine-postgres-types/zipball/7e69bdfeb2ae61c2f1e90872370cdf0135fb3006;
243 sha256 = "1v9rjq82dxnpnb6bir6irkj54324a02qlybayvq2gf2807241bjj";
244 };
245 };
246 };
247 "presta/sitemap-bundle" = {
248 targetDir = "";
249 src = composerEnv.buildZipPackage {
250 name = "presta-sitemap-bundle-16a2c0eae7320e3647013e48026a6a6bd14f75df";
251 src = fetchurl {
252 url = https://api.github.com/repos/prestaconcept/PrestaSitemapBundle/zipball/16a2c0eae7320e3647013e48026a6a6bd14f75df;
253 sha256 = "1hqh144awazafa2vpv091h9pyqrppbalcvzf9c1n6h387jwwj5l8";
254 };
255 };
256 };
257 "psr/cache" = {
258 targetDir = "";
259 src = composerEnv.buildZipPackage {
260 name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
261 src = fetchurl {
262 url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
263 sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
264 };
265 };
266 };
267 "psr/container" = {
268 targetDir = "";
269 src = composerEnv.buildZipPackage {
270 name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
271 src = fetchurl {
272 url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
273 sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
274 };
275 };
276 };
277 "psr/log" = {
278 targetDir = "";
279 src = composerEnv.buildZipPackage {
280 name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd";
281 src = fetchurl {
282 url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd;
283 sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d";
284 };
285 };
286 };
287 "psr/simple-cache" = {
288 targetDir = "";
289 src = composerEnv.buildZipPackage {
290 name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
291 src = fetchurl {
292 url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
293 sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
294 };
295 };
296 };
297 "sensio/framework-extra-bundle" = {
298 targetDir = "";
299 src = composerEnv.buildZipPackage {
300 name = "sensio-framework-extra-bundle-1fdf591c4b388e62dbb2579de89c1560b33f865d";
301 src = fetchurl {
302 url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/1fdf591c4b388e62dbb2579de89c1560b33f865d;
303 sha256 = "0hhw3lsvgm78rqphgmdrg2inc9997lwx0290x71hsixk08khnlb1";
304 };
305 };
306 };
307 "symfony/asset" = {
308 targetDir = "";
309 src = composerEnv.buildZipPackage {
310 name = "symfony-asset-fb06338fd3762f8615b51a58e5e9299ccca03876";
311 src = fetchurl {
312 url = https://api.github.com/repos/symfony/asset/zipball/fb06338fd3762f8615b51a58e5e9299ccca03876;
313 sha256 = "19fbnz2h4z5nxzcy8n3bfbcjwgncabwdlxh70qfkr7bswpsxr6p3";
314 };
315 };
316 };
317 "symfony/cache" = {
318 targetDir = "";
319 src = composerEnv.buildZipPackage {
320 name = "symfony-cache-5c4b50d6ba4f1c8955c3454444c1e3cfddaaad41";
321 src = fetchurl {
322 url = https://api.github.com/repos/symfony/cache/zipball/5c4b50d6ba4f1c8955c3454444c1e3cfddaaad41;
323 sha256 = "1wn2rd3n5nj300vsygh60vbjh2k9lh7s9c3ayl614hahrfcfb29s";
324 };
325 };
326 };
327 "symfony/config" = {
328 targetDir = "";
329 src = composerEnv.buildZipPackage {
330 name = "symfony-config-005d9a083d03f588677d15391a716b1ac9b887c0";
331 src = fetchurl {
332 url = https://api.github.com/repos/symfony/config/zipball/005d9a083d03f588677d15391a716b1ac9b887c0;
333 sha256 = "1h20qhkzsl5xwzs3rg1yyaq5yn8rg92krfzmpmfgv7d3jp1v03as";
334 };
335 };
336 };
337 "symfony/console" = {
338 targetDir = "";
339 src = composerEnv.buildZipPackage {
340 name = "symfony-console-4dff24e5d01e713818805c1862d2e3f901ee7dd0";
341 src = fetchurl {
342 url = https://api.github.com/repos/symfony/console/zipball/4dff24e5d01e713818805c1862d2e3f901ee7dd0;
343 sha256 = "016l3hxcbvyxz3kkkynk12gi8949hl3x09dwsh0x5wqikgnp64c2";
344 };
345 };
346 };
347 "symfony/contracts" = {
348 targetDir = "";
349 src = composerEnv.buildZipPackage {
350 name = "symfony-contracts-1aa7ab2429c3d594dd70689604b5cf7421254cdf";
351 src = fetchurl {
352 url = https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf;
353 sha256 = "0jhav49lngmrjg4r5kdpmc7lhmasn2fzkmbvhw62l4i1vnm5r5bm";
354 };
355 };
356 };
357 "symfony/debug" = {
358 targetDir = "";
359 src = composerEnv.buildZipPackage {
360 name = "symfony-debug-e0a2b92ee0b5b934f973d90c2f58e18af109d276";
361 src = fetchurl {
362 url = https://api.github.com/repos/symfony/debug/zipball/e0a2b92ee0b5b934f973d90c2f58e18af109d276;
363 sha256 = "0yzyaprsrmbc93gzwr1wdjx05kin7b4hqy5w74zkcxyab09pan7f";
364 };
365 };
366 };
367 "symfony/dependency-injection" = {
368 targetDir = "";
369 src = composerEnv.buildZipPackage {
370 name = "symfony-dependency-injection-e4adc57a48d3fa7f394edfffa9e954086d7740e5";
371 src = fetchurl {
372 url = https://api.github.com/repos/symfony/dependency-injection/zipball/e4adc57a48d3fa7f394edfffa9e954086d7740e5;
373 sha256 = "0g8ssf7qm0jf0anvflp033xwdim9z4g73k3kz1vs3smw4pffl6nv";
374 };
375 };
376 };
377 "symfony/doctrine-bridge" = {
378 targetDir = "";
379 src = composerEnv.buildZipPackage {
380 name = "symfony-doctrine-bridge-3466c911438e176c20e1943c529131889432d12f";
381 src = fetchurl {
382 url = https://api.github.com/repos/symfony/doctrine-bridge/zipball/3466c911438e176c20e1943c529131889432d12f;
383 sha256 = "0qq644z7l9j9fyydlj68p9f43a9i20rnmxy8pkq5sn4r0yn06bb8";
384 };
385 };
386 };
387 "symfony/event-dispatcher" = {
388 targetDir = "";
389 src = composerEnv.buildZipPackage {
390 name = "symfony-event-dispatcher-921f49c3158a276d27c0d770a5a347a3b718b328";
391 src = fetchurl {
392 url = https://api.github.com/repos/symfony/event-dispatcher/zipball/921f49c3158a276d27c0d770a5a347a3b718b328;
393 sha256 = "05i8syqbzhh11cf2i9d64s8b5x41mfsribfa62rvc0mhbqk7ifzf";
394 };
395 };
396 };
397 "symfony/filesystem" = {
398 targetDir = "";
399 src = composerEnv.buildZipPackage {
400 name = "symfony-filesystem-2f4c8b999b3b7cadb2a69390b01af70886753710";
401 src = fetchurl {
402 url = https://api.github.com/repos/symfony/filesystem/zipball/2f4c8b999b3b7cadb2a69390b01af70886753710;
403 sha256 = "1gi14q8gf250a3rzmr6arb08ljpzpfg868vm0z21fgmf0zh0dqr6";
404 };
405 };
406 };
407 "symfony/finder" = {
408 targetDir = "";
409 src = composerEnv.buildZipPackage {
410 name = "symfony-finder-e53d477d7b5c4982d0e1bfd2298dbee63d01441d";
411 src = fetchurl {
412 url = https://api.github.com/repos/symfony/finder/zipball/e53d477d7b5c4982d0e1bfd2298dbee63d01441d;
413 sha256 = "1mpxwgvfqzng36xbdvda6nk1zidyr9dgswccmr4z15k0i9gi0qsj";
414 };
415 };
416 };
417 "symfony/flex" = {
418 targetDir = "";
419 src = composerEnv.buildZipPackage {
420 name = "symfony-flex-955774ecf07b10230bb5b44e150ba078b45f68fa";
421 src = fetchurl {
422 url = https://api.github.com/repos/symfony/flex/zipball/955774ecf07b10230bb5b44e150ba078b45f68fa;
423 sha256 = "069v1s810mq5kqvx68x87lmlz0h9b2kgla1znnibnbh6j6k4qg6d";
424 };
425 };
426 };
427 "symfony/form" = {
428 targetDir = "";
429 src = composerEnv.buildZipPackage {
430 name = "symfony-form-5ab767b7732154ca6f45c92e30e081178edf30ad";
431 src = fetchurl {
432 url = https://api.github.com/repos/symfony/form/zipball/5ab767b7732154ca6f45c92e30e081178edf30ad;
433 sha256 = "1g65a7hl1kk6rpa6q52fyzy6vkjafr3233hi2qiggyp0qys20kcc";
434 };
435 };
436 };
437 "symfony/framework-bundle" = {
438 targetDir = "";
439 src = composerEnv.buildZipPackage {
440 name = "symfony-framework-bundle-eb32d67140510f04fe9cc5fb9ad38fda09591db1";
441 src = fetchurl {
442 url = https://api.github.com/repos/symfony/framework-bundle/zipball/eb32d67140510f04fe9cc5fb9ad38fda09591db1;
443 sha256 = "06dpqppwyngq1frww0q0zjs0gj8na0fi67czlhqf2x2lizgz6wjd";
444 };
445 };
446 };
447 "symfony/http-foundation" = {
448 targetDir = "";
449 src = composerEnv.buildZipPackage {
450 name = "symfony-http-foundation-1b31f3017fadd8cb05cf2c8aebdbf3b12a943851";
451 src = fetchurl {
452 url = https://api.github.com/repos/symfony/http-foundation/zipball/1b31f3017fadd8cb05cf2c8aebdbf3b12a943851;
453 sha256 = "0s6mx79gl6sp39bk8213xcdzx4ld5xim38s8lckm7wqnkvx94mfl";
454 };
455 };
456 };
457 "symfony/http-kernel" = {
458 targetDir = "";
459 src = composerEnv.buildZipPackage {
460 name = "symfony-http-kernel-b39ceffc0388232c309cbde3a7c3685f2ec0a624";
461 src = fetchurl {
462 url = https://api.github.com/repos/symfony/http-kernel/zipball/b39ceffc0388232c309cbde3a7c3685f2ec0a624;
463 sha256 = "17rb1hl9r8rlqw1cv9qx2ckvz81g2ylppirq035mya1a848y5ym5";
464 };
465 };
466 };
467 "symfony/inflector" = {
468 targetDir = "";
469 src = composerEnv.buildZipPackage {
470 name = "symfony-inflector-f9a637c0359f74404d44cf0da0a3ce53bae0787e";
471 src = fetchurl {
472 url = https://api.github.com/repos/symfony/inflector/zipball/f9a637c0359f74404d44cf0da0a3ce53bae0787e;
473 sha256 = "1sp1pk716biyplqpakcpq71ik2h2m1bvsz9cfj9zd63y2723xna3";
474 };
475 };
476 };
477 "symfony/intl" = {
478 targetDir = "";
479 src = composerEnv.buildZipPackage {
480 name = "symfony-intl-748a1c54903344385f88fef75da293915b16a207";
481 src = fetchurl {
482 url = https://api.github.com/repos/symfony/intl/zipball/748a1c54903344385f88fef75da293915b16a207;
483 sha256 = "1vwa2n7fglxs8rv1yrbxn6vgizg73asimg794igk27i90xdybfmc";
484 };
485 };
486 };
487 "symfony/lts" = {
488 targetDir = "";
489 src = composerEnv.buildZipPackage {
490 name = "symfony-lts-c1affae45b78aee036effa1759237e7fa96d4af2";
491 src = fetchurl {
492 url = https://api.github.com/repos/symfony/lts/zipball/c1affae45b78aee036effa1759237e7fa96d4af2;
493 sha256 = "0vk9pn4xl7ascvllak0gschdd1w2mxma3ng04j3r1n13zccxc33s";
494 };
495 };
496 };
497 "symfony/options-resolver" = {
498 targetDir = "";
499 src = composerEnv.buildZipPackage {
500 name = "symfony-options-resolver-a9c38e8a3da2c03b3e71fdffa6efb0bda51390ba";
501 src = fetchurl {
502 url = https://api.github.com/repos/symfony/options-resolver/zipball/a9c38e8a3da2c03b3e71fdffa6efb0bda51390ba;
503 sha256 = "1fjjlp09mwkjcxg98bihqlq4miq24k13691051f5p39lcy03zmb3";
504 };
505 };
506 };
507 "symfony/orm-pack" = {
508 targetDir = "";
509 src = composerEnv.buildZipPackage {
510 name = "symfony-orm-pack-1b58f752cd917a08c9c8df020781d9c46a2275b1";
511 src = fetchurl {
512 url = https://api.github.com/repos/symfony/orm-pack/zipball/1b58f752cd917a08c9c8df020781d9c46a2275b1;
513 sha256 = "1sk8jchaw29lmpq76yb24mc1csmifnkvbjdrgjdgqs6x5i39plli";
514 };
515 };
516 };
517 "symfony/polyfill-intl-icu" = {
518 targetDir = "";
519 src = composerEnv.buildZipPackage {
520 name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644";
521 src = fetchurl {
522 url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644;
523 sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq";
524 };
525 };
526 };
527 "symfony/polyfill-mbstring" = {
528 targetDir = "";
529 src = composerEnv.buildZipPackage {
530 name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494";
531 src = fetchurl {
532 url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494;
533 sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi";
534 };
535 };
536 };
537 "symfony/property-access" = {
538 targetDir = "";
539 src = composerEnv.buildZipPackage {
540 name = "symfony-property-access-b6df4e1849f389468edb36e2e59877d4a8170723";
541 src = fetchurl {
542 url = https://api.github.com/repos/symfony/property-access/zipball/b6df4e1849f389468edb36e2e59877d4a8170723;
543 sha256 = "16pbnv3x56gp5wxakmbphf3d4igkjyr3v693n3cjm62h72z4dxf3";
544 };
545 };
546 };
547 "symfony/routing" = {
548 targetDir = "";
549 src = composerEnv.buildZipPackage {
550 name = "symfony-routing-649460207e77da6c545326c7f53618d23ad2c866";
551 src = fetchurl {
552 url = https://api.github.com/repos/symfony/routing/zipball/649460207e77da6c545326c7f53618d23ad2c866;
553 sha256 = "1qjkgghs0kp4lk4711d3gx26vvilrrrjbbz02navzfqy4xjrf0sw";
554 };
555 };
556 };
557 "symfony/translation" = {
558 targetDir = "";
559 src = composerEnv.buildZipPackage {
560 name = "symfony-translation-c0e2191e9bed845946ab3d99767513b56ca7dcd6";
561 src = fetchurl {
562 url = https://api.github.com/repos/symfony/translation/zipball/c0e2191e9bed845946ab3d99767513b56ca7dcd6;
563 sha256 = "0gzq7f2izsiam9blha85bzvg7x6zc4f3x3bkwhzma6x6ipjfkla2";
564 };
565 };
566 };
567 "symfony/twig-bridge" = {
568 targetDir = "";
569 src = composerEnv.buildZipPackage {
570 name = "symfony-twig-bridge-2e928d6c8244e7f3b32bcfac5814095a83179e60";
571 src = fetchurl {
572 url = https://api.github.com/repos/symfony/twig-bridge/zipball/2e928d6c8244e7f3b32bcfac5814095a83179e60;
573 sha256 = "1f902j8b0lyqjss9r2mf7j63apv5z8ki57vmcdcw5jlqagbmw1y1";
574 };
575 };
576 };
577 "symfony/twig-bundle" = {
578 targetDir = "";
579 src = composerEnv.buildZipPackage {
580 name = "symfony-twig-bundle-024820cbb4aeffc4843c4170b69c057fb4840fb3";
581 src = fetchurl {
582 url = https://api.github.com/repos/symfony/twig-bundle/zipball/024820cbb4aeffc4843c4170b69c057fb4840fb3;
583 sha256 = "1qqfpxw228lc024whpr4j6aa6k9ly290nxz9c9ds826lllg2l1zh";
584 };
585 };
586 };
587 "symfony/validator" = {
588 targetDir = "";
589 src = composerEnv.buildZipPackage {
590 name = "symfony-validator-cd35bb14a0e81bd99835e36cac4db1e72ad1939b";
591 src = fetchurl {
592 url = https://api.github.com/repos/symfony/validator/zipball/cd35bb14a0e81bd99835e36cac4db1e72ad1939b;
593 sha256 = "1809yz483mv5mmrw14v3b371dmjab7i455gxkrqm0z8n0wjdn6i3";
594 };
595 };
596 };
597 "symfony/var-exporter" = {
598 targetDir = "";
599 src = composerEnv.buildZipPackage {
600 name = "symfony-var-exporter-a39222e357362424b61dcde50e2f7b5a7d3306db";
601 src = fetchurl {
602 url = https://api.github.com/repos/symfony/var-exporter/zipball/a39222e357362424b61dcde50e2f7b5a7d3306db;
603 sha256 = "1ys2sc3ivgfxq7kj8cydxqh5179d3niqxsy10lgg18c5a6bsj41j";
604 };
605 };
606 };
607 "symfony/webpack-encore-pack" = {
608 targetDir = "";
609 src = composerEnv.buildZipPackage {
610 name = "symfony-webpack-encore-pack-8d7f51379d7ae17aea7cf501d910a11896895ac4";
611 src = fetchurl {
612 url = https://api.github.com/repos/symfony/webpack-encore-pack/zipball/8d7f51379d7ae17aea7cf501d910a11896895ac4;
613 sha256 = "0k6xavcyihx45dsrm1r2r1lbn7vryy463akz66w4gycx5dcqrw0j";
614 };
615 };
616 };
617 "symfony/yaml" = {
618 targetDir = "";
619 src = composerEnv.buildZipPackage {
620 name = "symfony-yaml-c41175c801e3edfda90f32e292619d10c27103d7";
621 src = fetchurl {
622 url = https://api.github.com/repos/symfony/yaml/zipball/c41175c801e3edfda90f32e292619d10c27103d7;
623 sha256 = "0bh9365mmvzhdk1m0b1xarlg0swx9pv916m7xifcmdrxn67w552p";
624 };
625 };
626 };
627 "twig/twig" = {
628 targetDir = "";
629 src = composerEnv.buildZipPackage {
630 name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1";
631 src = fetchurl {
632 url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1;
633 sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n";
634 };
635 };
636 };
637 "zendframework/zend-code" = {
638 targetDir = "";
639 src = composerEnv.buildZipPackage {
640 name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb";
641 src = fetchurl {
642 url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb;
643 sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1";
644 };
645 };
646 };
647 "zendframework/zend-eventmanager" = {
648 targetDir = "";
649 src = composerEnv.buildZipPackage {
650 name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd";
651 src = fetchurl {
652 url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd;
653 sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n";
654 };
655 };
656 };
657 };
658 devPackages = {
659 "nikic/php-parser" = {
660 targetDir = "";
661 src = composerEnv.buildZipPackage {
662 name = "nikic-php-parser-8aae5b59b83bb4d0dbf07b0a835f2680a658f610";
663 src = fetchurl {
664 url = https://api.github.com/repos/nikic/PHP-Parser/zipball/8aae5b59b83bb4d0dbf07b0a835f2680a658f610;
665 sha256 = "103ix4bsvrwyc4wxh9cqd38xffn25kq3phnpgk8b3z7dqvvr2pss";
666 };
667 };
668 };
669 "symfony/dotenv" = {
670 targetDir = "";
671 src = composerEnv.buildZipPackage {
672 name = "symfony-dotenv-97f135ab40f969cbeae27d482ff63acbc33dbe2a";
673 src = fetchurl {
674 url = https://api.github.com/repos/symfony/dotenv/zipball/97f135ab40f969cbeae27d482ff63acbc33dbe2a;
675 sha256 = "1jwpxb4w0mi5p89k51l1g84hnnj9s8kjl9jsx3xj39hhc3dy44pc";
676 };
677 };
678 };
679 "symfony/maker-bundle" = {
680 targetDir = "";
681 src = composerEnv.buildZipPackage {
682 name = "symfony-maker-bundle-24b19cccad0c658eca516b35b08668d123fabf92";
683 src = fetchurl {
684 url = https://api.github.com/repos/symfony/maker-bundle/zipball/24b19cccad0c658eca516b35b08668d123fabf92;
685 sha256 = "1wm17jl3gk0m5ma7nz40y7ryxgm0qncrxcrqdqg5x6afwla85grp";
686 };
687 };
688 };
689 "symfony/polyfill-php72" = {
690 targetDir = "";
691 src = composerEnv.buildZipPackage {
692 name = "symfony-polyfill-php72-9050816e2ca34a8e916c3a0ae8b9c2fccf68b631";
693 src = fetchurl {
694 url = https://api.github.com/repos/symfony/polyfill-php72/zipball/9050816e2ca34a8e916c3a0ae8b9c2fccf68b631;
695 sha256 = "1smd08fw64mf89s9ma099ayfjlz26wrix9hfr6kh5w4d0rzrhmlw";
696 };
697 };
698 };
699 "symfony/profiler-pack" = {
700 targetDir = "";
701 src = composerEnv.buildZipPackage {
702 name = "symfony-profiler-pack-99c4370632c2a59bb0444852f92140074ef02209";
703 src = fetchurl {
704 url = https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209;
705 sha256 = "12xisnrqq6q5l0v8bric0p23bsaxh50x43fq7wn2adnsz24nv9pi";
706 };
707 };
708 };
709 "symfony/stopwatch" = {
710 targetDir = "";
711 src = composerEnv.buildZipPackage {
712 name = "symfony-stopwatch-ec076716412274e51f8a7ea675d9515e5c311123";
713 src = fetchurl {
714 url = https://api.github.com/repos/symfony/stopwatch/zipball/ec076716412274e51f8a7ea675d9515e5c311123;
715 sha256 = "0fzh2bh7lm8f222hk5ihfkpi697babfrz1r0dghlws17hfbgzgax";
716 };
717 };
718 };
719 "symfony/var-dumper" = {
720 targetDir = "";
721 src = composerEnv.buildZipPackage {
722 name = "symfony-var-dumper-db61258540350725f4beb6b84006e32398acd120";
723 src = fetchurl {
724 url = https://api.github.com/repos/symfony/var-dumper/zipball/db61258540350725f4beb6b84006e32398acd120;
725 sha256 = "0pw3hf4mcc1q9miswrjbgr32x0a2dfjvpi16pjzw173xmf79i4iz";
726 };
727 };
728 };
729 "symfony/web-profiler-bundle" = {
730 targetDir = "";
731 src = composerEnv.buildZipPackage {
732 name = "symfony-web-profiler-bundle-198cb0a6b85346bbab5e1bc74a0eb175b9fa2d08";
733 src = fetchurl {
734 url = https://api.github.com/repos/symfony/web-profiler-bundle/zipball/198cb0a6b85346bbab5e1bc74a0eb175b9fa2d08;
735 sha256 = "0r4r3zf22860mdx8b2l72ghz8liyi3l39cc1934b2lkh2kghlsi6";
736 };
737 };
738 };
739 };
740}
diff --git a/modules/private/websites/isabelle/aten_app/yarn-packages.nix b/modules/private/websites/isabelle/aten_app/yarn-packages.nix
deleted file mode 100644
index c16d9dc..0000000
--- a/modules/private/websites/isabelle/aten_app/yarn-packages.nix
+++ /dev/null
@@ -1,7871 +0,0 @@
1{fetchurl, linkFarm}: rec {
2 offline_cache = linkFarm "offline" packages;
3 packages = [
4
5 {
6 name = "_symfony_webpack_encore___webpack_encore_0.19.0.tgz";
7 path = fetchurl {
8 name = "_symfony_webpack_encore___webpack_encore_0.19.0.tgz";
9 url = "https://registry.yarnpkg.com/@symfony/webpack-encore/-/webpack-encore-0.19.0.tgz";
10 sha1 = "f0725dbbede5ff9d9fdbd7a07f84accafc83ca14";
11 };
12 }
13
14 {
15 name = "_types_node___node_10.5.3.tgz";
16 path = fetchurl {
17 name = "_types_node___node_10.5.3.tgz";
18 url = "https://registry.yarnpkg.com/@types/node/-/node-10.5.3.tgz";
19 sha1 = "5bcfaf088ad17894232012877669634c06b20cc5";
20 };
21 }
22
23 {
24 name = "_types_tapable___tapable_0.2.5.tgz";
25 path = fetchurl {
26 name = "_types_tapable___tapable_0.2.5.tgz";
27 url = "https://registry.yarnpkg.com/@types/tapable/-/tapable-0.2.5.tgz";
28 sha1 = "2443fc12da514c81346b1a665675559cee21fa75";
29 };
30 }
31
32 {
33 name = "_types_uglify_js___uglify_js_3.0.3.tgz";
34 path = fetchurl {
35 name = "_types_uglify_js___uglify_js_3.0.3.tgz";
36 url = "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.3.tgz";
37 sha1 = "801a5ca1dc642861f47c46d14b700ed2d610840b";
38 };
39 }
40
41 {
42 name = "_types_webpack___webpack_3.8.14.tgz";
43 path = fetchurl {
44 name = "_types_webpack___webpack_3.8.14.tgz";
45 url = "https://registry.yarnpkg.com/@types/webpack/-/webpack-3.8.14.tgz";
46 sha1 = "e2bfdf7f604b3f7dc776eaa17446d7f7538f3de7";
47 };
48 }
49
50 {
51 name = "abbrev___abbrev_1.1.1.tgz";
52 path = fetchurl {
53 name = "abbrev___abbrev_1.1.1.tgz";
54 url = "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz";
55 sha1 = "f8f2c887ad10bf67f634f005b6987fed3179aac8";
56 };
57 }
58
59 {
60 name = "accepts___accepts_1.3.5.tgz";
61 path = fetchurl {
62 name = "accepts___accepts_1.3.5.tgz";
63 url = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz";
64 sha1 = "eb777df6011723a3b14e8a72c0805c8e86746bd2";
65 };
66 }
67
68 {
69 name = "acorn_dynamic_import___acorn_dynamic_import_2.0.2.tgz";
70 path = fetchurl {
71 name = "acorn_dynamic_import___acorn_dynamic_import_2.0.2.tgz";
72 url = "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz";
73 sha1 = "c752bd210bef679501b6c6cb7fc84f8f47158cc4";
74 };
75 }
76
77 {
78 name = "acorn___acorn_4.0.13.tgz";
79 path = fetchurl {
80 name = "acorn___acorn_4.0.13.tgz";
81 url = "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz";
82 sha1 = "105495ae5361d697bd195c825192e1ad7f253787";
83 };
84 }
85
86 {
87 name = "acorn___acorn_5.7.1.tgz";
88 path = fetchurl {
89 name = "acorn___acorn_5.7.1.tgz";
90 url = "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz";
91 sha1 = "f095829297706a7c9776958c0afc8930a9b9d9d8";
92 };
93 }
94
95 {
96 name = "adjust_sourcemap_loader___adjust_sourcemap_loader_1.2.0.tgz";
97 path = fetchurl {
98 name = "adjust_sourcemap_loader___adjust_sourcemap_loader_1.2.0.tgz";
99 url = "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz";
100 sha1 = "e33fde95e50db9f2a802e3647e311d2fc5000c69";
101 };
102 }
103
104 {
105 name = "ajv_keywords___ajv_keywords_3.2.0.tgz";
106 path = fetchurl {
107 name = "ajv_keywords___ajv_keywords_3.2.0.tgz";
108 url = "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz";
109 sha1 = "e86b819c602cf8821ad637413698f1dec021847a";
110 };
111 }
112
113 {
114 name = "ajv___ajv_4.11.8.tgz";
115 path = fetchurl {
116 name = "ajv___ajv_4.11.8.tgz";
117 url = "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz";
118 sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
119 };
120 }
121
122 {
123 name = "ajv___ajv_5.5.2.tgz";
124 path = fetchurl {
125 name = "ajv___ajv_5.5.2.tgz";
126 url = "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz";
127 sha1 = "73b5eeca3fab653e3d3f9422b341ad42205dc965";
128 };
129 }
130
131 {
132 name = "ajv___ajv_6.5.2.tgz";
133 path = fetchurl {
134 name = "ajv___ajv_6.5.2.tgz";
135 url = "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz";
136 sha1 = "678495f9b82f7cca6be248dd92f59bff5e1f4360";
137 };
138 }
139
140 {
141 name = "align_text___align_text_0.1.4.tgz";
142 path = fetchurl {
143 name = "align_text___align_text_0.1.4.tgz";
144 url = "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz";
145 sha1 = "0cd90a561093f35d0a99256c22b7069433fad117";
146 };
147 }
148
149 {
150 name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
151 path = fetchurl {
152 name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
153 url = "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz";
154 sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3";
155 };
156 }
157
158 {
159 name = "amdefine___amdefine_1.0.1.tgz";
160 path = fetchurl {
161 name = "amdefine___amdefine_1.0.1.tgz";
162 url = "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz";
163 sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
164 };
165 }
166
167 {
168 name = "ansi_html___ansi_html_0.0.7.tgz";
169 path = fetchurl {
170 name = "ansi_html___ansi_html_0.0.7.tgz";
171 url = "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz";
172 sha1 = "813584021962a9e9e6fd039f940d12f56ca7859e";
173 };
174 }
175
176 {
177 name = "ansi_regex___ansi_regex_2.1.1.tgz";
178 path = fetchurl {
179 name = "ansi_regex___ansi_regex_2.1.1.tgz";
180 url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz";
181 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
182 };
183 }
184
185 {
186 name = "ansi_regex___ansi_regex_3.0.0.tgz";
187 path = fetchurl {
188 name = "ansi_regex___ansi_regex_3.0.0.tgz";
189 url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz";
190 sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
191 };
192 }
193
194 {
195 name = "ansi_styles___ansi_styles_2.2.1.tgz";
196 path = fetchurl {
197 name = "ansi_styles___ansi_styles_2.2.1.tgz";
198 url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz";
199 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
200 };
201 }
202
203 {
204 name = "ansi_styles___ansi_styles_3.2.1.tgz";
205 path = fetchurl {
206 name = "ansi_styles___ansi_styles_3.2.1.tgz";
207 url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz";
208 sha1 = "41fbb20243e50b12be0f04b8dedbf07520ce841d";
209 };
210 }
211
212 {
213 name = "anymatch___anymatch_2.0.0.tgz";
214 path = fetchurl {
215 name = "anymatch___anymatch_2.0.0.tgz";
216 url = "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz";
217 sha1 = "bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb";
218 };
219 }
220
221 {
222 name = "aproba___aproba_1.2.0.tgz";
223 path = fetchurl {
224 name = "aproba___aproba_1.2.0.tgz";
225 url = "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz";
226 sha1 = "6802e6264efd18c790a1b0d517f0f2627bf2c94a";
227 };
228 }
229
230 {
231 name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
232 path = fetchurl {
233 name = "are_we_there_yet___are_we_there_yet_1.1.5.tgz";
234 url = "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
235 sha1 = "4b35c2944f062a8bfcda66410760350fe9ddfc21";
236 };
237 }
238
239 {
240 name = "argparse___argparse_1.0.10.tgz";
241 path = fetchurl {
242 name = "argparse___argparse_1.0.10.tgz";
243 url = "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz";
244 sha1 = "bcd6791ea5ae09725e17e5ad988134cd40b3d911";
245 };
246 }
247
248 {
249 name = "arr_diff___arr_diff_2.0.0.tgz";
250 path = fetchurl {
251 name = "arr_diff___arr_diff_2.0.0.tgz";
252 url = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz";
253 sha1 = "8f3b827f955a8bd669697e4a4256ac3ceae356cf";
254 };
255 }
256
257 {
258 name = "arr_diff___arr_diff_4.0.0.tgz";
259 path = fetchurl {
260 name = "arr_diff___arr_diff_4.0.0.tgz";
261 url = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz";
262 sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
263 };
264 }
265
266 {
267 name = "arr_flatten___arr_flatten_1.1.0.tgz";
268 path = fetchurl {
269 name = "arr_flatten___arr_flatten_1.1.0.tgz";
270 url = "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz";
271 sha1 = "36048bbff4e7b47e136644316c99669ea5ae91f1";
272 };
273 }
274
275 {
276 name = "arr_union___arr_union_3.1.0.tgz";
277 path = fetchurl {
278 name = "arr_union___arr_union_3.1.0.tgz";
279 url = "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz";
280 sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
281 };
282 }
283
284 {
285 name = "array_find_index___array_find_index_1.0.2.tgz";
286 path = fetchurl {
287 name = "array_find_index___array_find_index_1.0.2.tgz";
288 url = "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz";
289 sha1 = "df010aa1287e164bbda6f9723b0a96a1ec4187a1";
290 };
291 }
292
293 {
294 name = "array_flatten___array_flatten_1.1.1.tgz";
295 path = fetchurl {
296 name = "array_flatten___array_flatten_1.1.1.tgz";
297 url = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz";
298 sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2";
299 };
300 }
301
302 {
303 name = "array_flatten___array_flatten_2.1.1.tgz";
304 path = fetchurl {
305 name = "array_flatten___array_flatten_2.1.1.tgz";
306 url = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz";
307 sha1 = "426bb9da84090c1838d812c8150af20a8331e296";
308 };
309 }
310
311 {
312 name = "array_includes___array_includes_3.0.3.tgz";
313 path = fetchurl {
314 name = "array_includes___array_includes_3.0.3.tgz";
315 url = "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz";
316 sha1 = "184b48f62d92d7452bb31b323165c7f8bd02266d";
317 };
318 }
319
320 {
321 name = "array_union___array_union_1.0.2.tgz";
322 path = fetchurl {
323 name = "array_union___array_union_1.0.2.tgz";
324 url = "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz";
325 sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39";
326 };
327 }
328
329 {
330 name = "array_uniq___array_uniq_1.0.3.tgz";
331 path = fetchurl {
332 name = "array_uniq___array_uniq_1.0.3.tgz";
333 url = "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz";
334 sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
335 };
336 }
337
338 {
339 name = "array_unique___array_unique_0.2.1.tgz";
340 path = fetchurl {
341 name = "array_unique___array_unique_0.2.1.tgz";
342 url = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz";
343 sha1 = "a1d97ccafcbc2625cc70fadceb36a50c58b01a53";
344 };
345 }
346
347 {
348 name = "array_unique___array_unique_0.3.2.tgz";
349 path = fetchurl {
350 name = "array_unique___array_unique_0.3.2.tgz";
351 url = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz";
352 sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
353 };
354 }
355
356 {
357 name = "asn1.js___asn1.js_4.10.1.tgz";
358 path = fetchurl {
359 name = "asn1.js___asn1.js_4.10.1.tgz";
360 url = "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz";
361 sha1 = "b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0";
362 };
363 }
364
365 {
366 name = "asn1___asn1_0.2.3.tgz";
367 path = fetchurl {
368 name = "asn1___asn1_0.2.3.tgz";
369 url = "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz";
370 sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86";
371 };
372 }
373
374 {
375 name = "assert_plus___assert_plus_1.0.0.tgz";
376 path = fetchurl {
377 name = "assert_plus___assert_plus_1.0.0.tgz";
378 url = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz";
379 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
380 };
381 }
382
383 {
384 name = "assert_plus___assert_plus_0.2.0.tgz";
385 path = fetchurl {
386 name = "assert_plus___assert_plus_0.2.0.tgz";
387 url = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz";
388 sha1 = "d74e1b87e7affc0db8aadb7021f3fe48101ab234";
389 };
390 }
391
392 {
393 name = "assert___assert_1.4.1.tgz";
394 path = fetchurl {
395 name = "assert___assert_1.4.1.tgz";
396 url = "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz";
397 sha1 = "99912d591836b5a6f5b345c0f07eefc08fc65d91";
398 };
399 }
400
401 {
402 name = "assign_symbols___assign_symbols_1.0.0.tgz";
403 path = fetchurl {
404 name = "assign_symbols___assign_symbols_1.0.0.tgz";
405 url = "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz";
406 sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
407 };
408 }
409
410 {
411 name = "async_each___async_each_1.0.1.tgz";
412 path = fetchurl {
413 name = "async_each___async_each_1.0.1.tgz";
414 url = "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz";
415 sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d";
416 };
417 }
418
419 {
420 name = "async_foreach___async_foreach_0.1.3.tgz";
421 path = fetchurl {
422 name = "async_foreach___async_foreach_0.1.3.tgz";
423 url = "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz";
424 sha1 = "36121f845c0578172de419a97dbeb1d16ec34542";
425 };
426 }
427
428 {
429 name = "async___async_1.5.2.tgz";
430 path = fetchurl {
431 name = "async___async_1.5.2.tgz";
432 url = "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz";
433 sha1 = "ec6a61ae56480c0c3cb241c95618e20892f9672a";
434 };
435 }
436
437 {
438 name = "async___async_2.6.1.tgz";
439 path = fetchurl {
440 name = "async___async_2.6.1.tgz";
441 url = "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz";
442 sha1 = "b245a23ca71930044ec53fa46aa00a3e87c6a610";
443 };
444 }
445
446 {
447 name = "asynckit___asynckit_0.4.0.tgz";
448 path = fetchurl {
449 name = "asynckit___asynckit_0.4.0.tgz";
450 url = "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz";
451 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
452 };
453 }
454
455 {
456 name = "atob___atob_2.1.1.tgz";
457 path = fetchurl {
458 name = "atob___atob_2.1.1.tgz";
459 url = "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz";
460 sha1 = "ae2d5a729477f289d60dd7f96a6314a22dd6c22a";
461 };
462 }
463
464 {
465 name = "autoprefixer___autoprefixer_6.7.7.tgz";
466 path = fetchurl {
467 name = "autoprefixer___autoprefixer_6.7.7.tgz";
468 url = "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz";
469 sha1 = "1dbd1c835658e35ce3f9984099db00585c782014";
470 };
471 }
472
473 {
474 name = "aws_sign2___aws_sign2_0.6.0.tgz";
475 path = fetchurl {
476 name = "aws_sign2___aws_sign2_0.6.0.tgz";
477 url = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz";
478 sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
479 };
480 }
481
482 {
483 name = "aws_sign2___aws_sign2_0.7.0.tgz";
484 path = fetchurl {
485 name = "aws_sign2___aws_sign2_0.7.0.tgz";
486 url = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz";
487 sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
488 };
489 }
490
491 {
492 name = "aws4___aws4_1.7.0.tgz";
493 path = fetchurl {
494 name = "aws4___aws4_1.7.0.tgz";
495 url = "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz";
496 sha1 = "d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289";
497 };
498 }
499
500 {
501 name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
502 path = fetchurl {
503 name = "babel_code_frame___babel_code_frame_6.26.0.tgz";
504 url = "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz";
505 sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b";
506 };
507 }
508
509 {
510 name = "babel_core___babel_core_6.26.3.tgz";
511 path = fetchurl {
512 name = "babel_core___babel_core_6.26.3.tgz";
513 url = "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz";
514 sha1 = "b2e2f09e342d0f0c88e2f02e067794125e75c207";
515 };
516 }
517
518 {
519 name = "babel_generator___babel_generator_6.26.1.tgz";
520 path = fetchurl {
521 name = "babel_generator___babel_generator_6.26.1.tgz";
522 url = "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz";
523 sha1 = "1844408d3b8f0d35a404ea7ac180f087a601bd90";
524 };
525 }
526
527 {
528 name = "babel_helper_builder_binary_assignment_operator_visitor___babel_helper_builder_binary_assignment_operator_visitor_6.24.1.tgz";
529 path = fetchurl {
530 name = "babel_helper_builder_binary_assignment_operator_visitor___babel_helper_builder_binary_assignment_operator_visitor_6.24.1.tgz";
531 url = "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz";
532 sha1 = "cce4517ada356f4220bcae8a02c2b346f9a56664";
533 };
534 }
535
536 {
537 name = "babel_helper_call_delegate___babel_helper_call_delegate_6.24.1.tgz";
538 path = fetchurl {
539 name = "babel_helper_call_delegate___babel_helper_call_delegate_6.24.1.tgz";
540 url = "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz";
541 sha1 = "ece6aacddc76e41c3461f88bfc575bd0daa2df8d";
542 };
543 }
544
545 {
546 name = "babel_helper_define_map___babel_helper_define_map_6.26.0.tgz";
547 path = fetchurl {
548 name = "babel_helper_define_map___babel_helper_define_map_6.26.0.tgz";
549 url = "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz";
550 sha1 = "a5f56dab41a25f97ecb498c7ebaca9819f95be5f";
551 };
552 }
553
554 {
555 name = "babel_helper_explode_assignable_expression___babel_helper_explode_assignable_expression_6.24.1.tgz";
556 path = fetchurl {
557 name = "babel_helper_explode_assignable_expression___babel_helper_explode_assignable_expression_6.24.1.tgz";
558 url = "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz";
559 sha1 = "f25b82cf7dc10433c55f70592d5746400ac22caa";
560 };
561 }
562
563 {
564 name = "babel_helper_function_name___babel_helper_function_name_6.24.1.tgz";
565 path = fetchurl {
566 name = "babel_helper_function_name___babel_helper_function_name_6.24.1.tgz";
567 url = "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz";
568 sha1 = "d3475b8c03ed98242a25b48351ab18399d3580a9";
569 };
570 }
571
572 {
573 name = "babel_helper_get_function_arity___babel_helper_get_function_arity_6.24.1.tgz";
574 path = fetchurl {
575 name = "babel_helper_get_function_arity___babel_helper_get_function_arity_6.24.1.tgz";
576 url = "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz";
577 sha1 = "8f7782aa93407c41d3aa50908f89b031b1b6853d";
578 };
579 }
580
581 {
582 name = "babel_helper_hoist_variables___babel_helper_hoist_variables_6.24.1.tgz";
583 path = fetchurl {
584 name = "babel_helper_hoist_variables___babel_helper_hoist_variables_6.24.1.tgz";
585 url = "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz";
586 sha1 = "1ecb27689c9d25513eadbc9914a73f5408be7a76";
587 };
588 }
589
590 {
591 name = "babel_helper_optimise_call_expression___babel_helper_optimise_call_expression_6.24.1.tgz";
592 path = fetchurl {
593 name = "babel_helper_optimise_call_expression___babel_helper_optimise_call_expression_6.24.1.tgz";
594 url = "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz";
595 sha1 = "f7a13427ba9f73f8f4fa993c54a97882d1244257";
596 };
597 }
598
599 {
600 name = "babel_helper_regex___babel_helper_regex_6.26.0.tgz";
601 path = fetchurl {
602 name = "babel_helper_regex___babel_helper_regex_6.26.0.tgz";
603 url = "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz";
604 sha1 = "325c59f902f82f24b74faceed0363954f6495e72";
605 };
606 }
607
608 {
609 name = "babel_helper_remap_async_to_generator___babel_helper_remap_async_to_generator_6.24.1.tgz";
610 path = fetchurl {
611 name = "babel_helper_remap_async_to_generator___babel_helper_remap_async_to_generator_6.24.1.tgz";
612 url = "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz";
613 sha1 = "5ec581827ad723fecdd381f1c928390676e4551b";
614 };
615 }
616
617 {
618 name = "babel_helper_replace_supers___babel_helper_replace_supers_6.24.1.tgz";
619 path = fetchurl {
620 name = "babel_helper_replace_supers___babel_helper_replace_supers_6.24.1.tgz";
621 url = "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz";
622 sha1 = "bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a";
623 };
624 }
625
626 {
627 name = "babel_helpers___babel_helpers_6.24.1.tgz";
628 path = fetchurl {
629 name = "babel_helpers___babel_helpers_6.24.1.tgz";
630 url = "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz";
631 sha1 = "3471de9caec388e5c850e597e58a26ddf37602b2";
632 };
633 }
634
635 {
636 name = "babel_loader___babel_loader_7.1.5.tgz";
637 path = fetchurl {
638 name = "babel_loader___babel_loader_7.1.5.tgz";
639 url = "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz";
640 sha1 = "e3ee0cd7394aa557e013b02d3e492bfd07aa6d68";
641 };
642 }
643
644 {
645 name = "babel_messages___babel_messages_6.23.0.tgz";
646 path = fetchurl {
647 name = "babel_messages___babel_messages_6.23.0.tgz";
648 url = "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz";
649 sha1 = "f3cdf4703858035b2a2951c6ec5edf6c62f2630e";
650 };
651 }
652
653 {
654 name = "babel_plugin_check_es2015_constants___babel_plugin_check_es2015_constants_6.22.0.tgz";
655 path = fetchurl {
656 name = "babel_plugin_check_es2015_constants___babel_plugin_check_es2015_constants_6.22.0.tgz";
657 url = "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz";
658 sha1 = "35157b101426fd2ffd3da3f75c7d1e91835bbf8a";
659 };
660 }
661
662 {
663 name = "babel_plugin_syntax_async_functions___babel_plugin_syntax_async_functions_6.13.0.tgz";
664 path = fetchurl {
665 name = "babel_plugin_syntax_async_functions___babel_plugin_syntax_async_functions_6.13.0.tgz";
666 url = "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz";
667 sha1 = "cad9cad1191b5ad634bf30ae0872391e0647be95";
668 };
669 }
670
671 {
672 name = "babel_plugin_syntax_exponentiation_operator___babel_plugin_syntax_exponentiation_operator_6.13.0.tgz";
673 path = fetchurl {
674 name = "babel_plugin_syntax_exponentiation_operator___babel_plugin_syntax_exponentiation_operator_6.13.0.tgz";
675 url = "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz";
676 sha1 = "9ee7e8337290da95288201a6a57f4170317830de";
677 };
678 }
679
680 {
681 name = "babel_plugin_syntax_trailing_function_commas___babel_plugin_syntax_trailing_function_commas_6.22.0.tgz";
682 path = fetchurl {
683 name = "babel_plugin_syntax_trailing_function_commas___babel_plugin_syntax_trailing_function_commas_6.22.0.tgz";
684 url = "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz";
685 sha1 = "ba0360937f8d06e40180a43fe0d5616fff532cf3";
686 };
687 }
688
689 {
690 name = "babel_plugin_transform_async_to_generator___babel_plugin_transform_async_to_generator_6.24.1.tgz";
691 path = fetchurl {
692 name = "babel_plugin_transform_async_to_generator___babel_plugin_transform_async_to_generator_6.24.1.tgz";
693 url = "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz";
694 sha1 = "6536e378aff6cb1d5517ac0e40eb3e9fc8d08761";
695 };
696 }
697
698 {
699 name = "babel_plugin_transform_es2015_arrow_functions___babel_plugin_transform_es2015_arrow_functions_6.22.0.tgz";
700 path = fetchurl {
701 name = "babel_plugin_transform_es2015_arrow_functions___babel_plugin_transform_es2015_arrow_functions_6.22.0.tgz";
702 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz";
703 sha1 = "452692cb711d5f79dc7f85e440ce41b9f244d221";
704 };
705 }
706
707 {
708 name = "babel_plugin_transform_es2015_block_scoped_functions___babel_plugin_transform_es2015_block_scoped_functions_6.22.0.tgz";
709 path = fetchurl {
710 name = "babel_plugin_transform_es2015_block_scoped_functions___babel_plugin_transform_es2015_block_scoped_functions_6.22.0.tgz";
711 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz";
712 sha1 = "bbc51b49f964d70cb8d8e0b94e820246ce3a6141";
713 };
714 }
715
716 {
717 name = "babel_plugin_transform_es2015_block_scoping___babel_plugin_transform_es2015_block_scoping_6.26.0.tgz";
718 path = fetchurl {
719 name = "babel_plugin_transform_es2015_block_scoping___babel_plugin_transform_es2015_block_scoping_6.26.0.tgz";
720 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz";
721 sha1 = "d70f5299c1308d05c12f463813b0a09e73b1895f";
722 };
723 }
724
725 {
726 name = "babel_plugin_transform_es2015_classes___babel_plugin_transform_es2015_classes_6.24.1.tgz";
727 path = fetchurl {
728 name = "babel_plugin_transform_es2015_classes___babel_plugin_transform_es2015_classes_6.24.1.tgz";
729 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz";
730 sha1 = "5a4c58a50c9c9461e564b4b2a3bfabc97a2584db";
731 };
732 }
733
734 {
735 name = "babel_plugin_transform_es2015_computed_properties___babel_plugin_transform_es2015_computed_properties_6.24.1.tgz";
736 path = fetchurl {
737 name = "babel_plugin_transform_es2015_computed_properties___babel_plugin_transform_es2015_computed_properties_6.24.1.tgz";
738 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz";
739 sha1 = "6fe2a8d16895d5634f4cd999b6d3480a308159b3";
740 };
741 }
742
743 {
744 name = "babel_plugin_transform_es2015_destructuring___babel_plugin_transform_es2015_destructuring_6.23.0.tgz";
745 path = fetchurl {
746 name = "babel_plugin_transform_es2015_destructuring___babel_plugin_transform_es2015_destructuring_6.23.0.tgz";
747 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz";
748 sha1 = "997bb1f1ab967f682d2b0876fe358d60e765c56d";
749 };
750 }
751
752 {
753 name = "babel_plugin_transform_es2015_duplicate_keys___babel_plugin_transform_es2015_duplicate_keys_6.24.1.tgz";
754 path = fetchurl {
755 name = "babel_plugin_transform_es2015_duplicate_keys___babel_plugin_transform_es2015_duplicate_keys_6.24.1.tgz";
756 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz";
757 sha1 = "73eb3d310ca969e3ef9ec91c53741a6f1576423e";
758 };
759 }
760
761 {
762 name = "babel_plugin_transform_es2015_for_of___babel_plugin_transform_es2015_for_of_6.23.0.tgz";
763 path = fetchurl {
764 name = "babel_plugin_transform_es2015_for_of___babel_plugin_transform_es2015_for_of_6.23.0.tgz";
765 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz";
766 sha1 = "f47c95b2b613df1d3ecc2fdb7573623c75248691";
767 };
768 }
769
770 {
771 name = "babel_plugin_transform_es2015_function_name___babel_plugin_transform_es2015_function_name_6.24.1.tgz";
772 path = fetchurl {
773 name = "babel_plugin_transform_es2015_function_name___babel_plugin_transform_es2015_function_name_6.24.1.tgz";
774 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz";
775 sha1 = "834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b";
776 };
777 }
778
779 {
780 name = "babel_plugin_transform_es2015_literals___babel_plugin_transform_es2015_literals_6.22.0.tgz";
781 path = fetchurl {
782 name = "babel_plugin_transform_es2015_literals___babel_plugin_transform_es2015_literals_6.22.0.tgz";
783 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz";
784 sha1 = "4f54a02d6cd66cf915280019a31d31925377ca2e";
785 };
786 }
787
788 {
789 name = "babel_plugin_transform_es2015_modules_amd___babel_plugin_transform_es2015_modules_amd_6.24.1.tgz";
790 path = fetchurl {
791 name = "babel_plugin_transform_es2015_modules_amd___babel_plugin_transform_es2015_modules_amd_6.24.1.tgz";
792 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz";
793 sha1 = "3b3e54017239842d6d19c3011c4bd2f00a00d154";
794 };
795 }
796
797 {
798 name = "babel_plugin_transform_es2015_modules_commonjs___babel_plugin_transform_es2015_modules_commonjs_6.26.2.tgz";
799 path = fetchurl {
800 name = "babel_plugin_transform_es2015_modules_commonjs___babel_plugin_transform_es2015_modules_commonjs_6.26.2.tgz";
801 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz";
802 sha1 = "58a793863a9e7ca870bdc5a881117ffac27db6f3";
803 };
804 }
805
806 {
807 name = "babel_plugin_transform_es2015_modules_systemjs___babel_plugin_transform_es2015_modules_systemjs_6.24.1.tgz";
808 path = fetchurl {
809 name = "babel_plugin_transform_es2015_modules_systemjs___babel_plugin_transform_es2015_modules_systemjs_6.24.1.tgz";
810 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz";
811 sha1 = "ff89a142b9119a906195f5f106ecf305d9407d23";
812 };
813 }
814
815 {
816 name = "babel_plugin_transform_es2015_modules_umd___babel_plugin_transform_es2015_modules_umd_6.24.1.tgz";
817 path = fetchurl {
818 name = "babel_plugin_transform_es2015_modules_umd___babel_plugin_transform_es2015_modules_umd_6.24.1.tgz";
819 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz";
820 sha1 = "ac997e6285cd18ed6176adb607d602344ad38468";
821 };
822 }
823
824 {
825 name = "babel_plugin_transform_es2015_object_super___babel_plugin_transform_es2015_object_super_6.24.1.tgz";
826 path = fetchurl {
827 name = "babel_plugin_transform_es2015_object_super___babel_plugin_transform_es2015_object_super_6.24.1.tgz";
828 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz";
829 sha1 = "24cef69ae21cb83a7f8603dad021f572eb278f8d";
830 };
831 }
832
833 {
834 name = "babel_plugin_transform_es2015_parameters___babel_plugin_transform_es2015_parameters_6.24.1.tgz";
835 path = fetchurl {
836 name = "babel_plugin_transform_es2015_parameters___babel_plugin_transform_es2015_parameters_6.24.1.tgz";
837 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz";
838 sha1 = "57ac351ab49caf14a97cd13b09f66fdf0a625f2b";
839 };
840 }
841
842 {
843 name = "babel_plugin_transform_es2015_shorthand_properties___babel_plugin_transform_es2015_shorthand_properties_6.24.1.tgz";
844 path = fetchurl {
845 name = "babel_plugin_transform_es2015_shorthand_properties___babel_plugin_transform_es2015_shorthand_properties_6.24.1.tgz";
846 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz";
847 sha1 = "24f875d6721c87661bbd99a4622e51f14de38aa0";
848 };
849 }
850
851 {
852 name = "babel_plugin_transform_es2015_spread___babel_plugin_transform_es2015_spread_6.22.0.tgz";
853 path = fetchurl {
854 name = "babel_plugin_transform_es2015_spread___babel_plugin_transform_es2015_spread_6.22.0.tgz";
855 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz";
856 sha1 = "d6d68a99f89aedc4536c81a542e8dd9f1746f8d1";
857 };
858 }
859
860 {
861 name = "babel_plugin_transform_es2015_sticky_regex___babel_plugin_transform_es2015_sticky_regex_6.24.1.tgz";
862 path = fetchurl {
863 name = "babel_plugin_transform_es2015_sticky_regex___babel_plugin_transform_es2015_sticky_regex_6.24.1.tgz";
864 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz";
865 sha1 = "00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc";
866 };
867 }
868
869 {
870 name = "babel_plugin_transform_es2015_template_literals___babel_plugin_transform_es2015_template_literals_6.22.0.tgz";
871 path = fetchurl {
872 name = "babel_plugin_transform_es2015_template_literals___babel_plugin_transform_es2015_template_literals_6.22.0.tgz";
873 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz";
874 sha1 = "a84b3450f7e9f8f1f6839d6d687da84bb1236d8d";
875 };
876 }
877
878 {
879 name = "babel_plugin_transform_es2015_typeof_symbol___babel_plugin_transform_es2015_typeof_symbol_6.23.0.tgz";
880 path = fetchurl {
881 name = "babel_plugin_transform_es2015_typeof_symbol___babel_plugin_transform_es2015_typeof_symbol_6.23.0.tgz";
882 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz";
883 sha1 = "dec09f1cddff94b52ac73d505c84df59dcceb372";
884 };
885 }
886
887 {
888 name = "babel_plugin_transform_es2015_unicode_regex___babel_plugin_transform_es2015_unicode_regex_6.24.1.tgz";
889 path = fetchurl {
890 name = "babel_plugin_transform_es2015_unicode_regex___babel_plugin_transform_es2015_unicode_regex_6.24.1.tgz";
891 url = "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz";
892 sha1 = "d38b12f42ea7323f729387f18a7c5ae1faeb35e9";
893 };
894 }
895
896 {
897 name = "babel_plugin_transform_exponentiation_operator___babel_plugin_transform_exponentiation_operator_6.24.1.tgz";
898 path = fetchurl {
899 name = "babel_plugin_transform_exponentiation_operator___babel_plugin_transform_exponentiation_operator_6.24.1.tgz";
900 url = "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz";
901 sha1 = "2ab0c9c7f3098fa48907772bb813fe41e8de3a0e";
902 };
903 }
904
905 {
906 name = "babel_plugin_transform_regenerator___babel_plugin_transform_regenerator_6.26.0.tgz";
907 path = fetchurl {
908 name = "babel_plugin_transform_regenerator___babel_plugin_transform_regenerator_6.26.0.tgz";
909 url = "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz";
910 sha1 = "e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f";
911 };
912 }
913
914 {
915 name = "babel_plugin_transform_strict_mode___babel_plugin_transform_strict_mode_6.24.1.tgz";
916 path = fetchurl {
917 name = "babel_plugin_transform_strict_mode___babel_plugin_transform_strict_mode_6.24.1.tgz";
918 url = "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz";
919 sha1 = "d5faf7aa578a65bbe591cf5edae04a0c67020758";
920 };
921 }
922
923 {
924 name = "babel_preset_env___babel_preset_env_1.7.0.tgz";
925 path = fetchurl {
926 name = "babel_preset_env___babel_preset_env_1.7.0.tgz";
927 url = "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz";
928 sha1 = "dea79fa4ebeb883cd35dab07e260c1c9c04df77a";
929 };
930 }
931
932 {
933 name = "babel_register___babel_register_6.26.0.tgz";
934 path = fetchurl {
935 name = "babel_register___babel_register_6.26.0.tgz";
936 url = "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz";
937 sha1 = "6ed021173e2fcb486d7acb45c6009a856f647071";
938 };
939 }
940
941 {
942 name = "babel_runtime___babel_runtime_6.26.0.tgz";
943 path = fetchurl {
944 name = "babel_runtime___babel_runtime_6.26.0.tgz";
945 url = "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz";
946 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
947 };
948 }
949
950 {
951 name = "babel_template___babel_template_6.26.0.tgz";
952 path = fetchurl {
953 name = "babel_template___babel_template_6.26.0.tgz";
954 url = "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz";
955 sha1 = "de03e2d16396b069f46dd9fff8521fb1a0e35e02";
956 };
957 }
958
959 {
960 name = "babel_traverse___babel_traverse_6.26.0.tgz";
961 path = fetchurl {
962 name = "babel_traverse___babel_traverse_6.26.0.tgz";
963 url = "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz";
964 sha1 = "46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee";
965 };
966 }
967
968 {
969 name = "babel_types___babel_types_6.26.0.tgz";
970 path = fetchurl {
971 name = "babel_types___babel_types_6.26.0.tgz";
972 url = "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz";
973 sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497";
974 };
975 }
976
977 {
978 name = "babylon___babylon_6.18.0.tgz";
979 path = fetchurl {
980 name = "babylon___babylon_6.18.0.tgz";
981 url = "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz";
982 sha1 = "af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3";
983 };
984 }
985
986 {
987 name = "balanced_match___balanced_match_0.4.2.tgz";
988 path = fetchurl {
989 name = "balanced_match___balanced_match_0.4.2.tgz";
990 url = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz";
991 sha1 = "cb3f3e3c732dc0f01ee70b403f302e61d7709838";
992 };
993 }
994
995 {
996 name = "balanced_match___balanced_match_1.0.0.tgz";
997 path = fetchurl {
998 name = "balanced_match___balanced_match_1.0.0.tgz";
999 url = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz";
1000 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
1001 };
1002 }
1003
1004 {
1005 name = "base64_js___base64_js_1.3.0.tgz";
1006 path = fetchurl {
1007 name = "base64_js___base64_js_1.3.0.tgz";
1008 url = "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz";
1009 sha1 = "cab1e6118f051095e58b5281aea8c1cd22bfc0e3";
1010 };
1011 }
1012
1013 {
1014 name = "base___base_0.11.2.tgz";
1015 path = fetchurl {
1016 name = "base___base_0.11.2.tgz";
1017 url = "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz";
1018 sha1 = "7bde5ced145b6d551a90db87f83c558b4eb48a8f";
1019 };
1020 }
1021
1022 {
1023 name = "batch___batch_0.6.1.tgz";
1024 path = fetchurl {
1025 name = "batch___batch_0.6.1.tgz";
1026 url = "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz";
1027 sha1 = "dc34314f4e679318093fc760272525f94bf25c16";
1028 };
1029 }
1030
1031 {
1032 name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
1033 path = fetchurl {
1034 name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
1035 url = "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
1036 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
1037 };
1038 }
1039
1040 {
1041 name = "big.js___big.js_3.2.0.tgz";
1042 path = fetchurl {
1043 name = "big.js___big.js_3.2.0.tgz";
1044 url = "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz";
1045 sha1 = "a5fc298b81b9e0dca2e458824784b65c52ba588e";
1046 };
1047 }
1048
1049 {
1050 name = "binary_extensions___binary_extensions_1.11.0.tgz";
1051 path = fetchurl {
1052 name = "binary_extensions___binary_extensions_1.11.0.tgz";
1053 url = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz";
1054 sha1 = "46aa1751fb6a2f93ee5e689bb1087d4b14c6c205";
1055 };
1056 }
1057
1058 {
1059 name = "block_stream___block_stream_0.0.9.tgz";
1060 path = fetchurl {
1061 name = "block_stream___block_stream_0.0.9.tgz";
1062 url = "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz";
1063 sha1 = "13ebfe778a03205cfe03751481ebb4b3300c126a";
1064 };
1065 }
1066
1067 {
1068 name = "bn.js___bn.js_4.11.8.tgz";
1069 path = fetchurl {
1070 name = "bn.js___bn.js_4.11.8.tgz";
1071 url = "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz";
1072 sha1 = "2cde09eb5ee341f484746bb0309b3253b1b1442f";
1073 };
1074 }
1075
1076 {
1077 name = "body_parser___body_parser_1.18.2.tgz";
1078 path = fetchurl {
1079 name = "body_parser___body_parser_1.18.2.tgz";
1080 url = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz";
1081 sha1 = "87678a19d84b47d859b83199bd59bce222b10454";
1082 };
1083 }
1084
1085 {
1086 name = "bonjour___bonjour_3.5.0.tgz";
1087 path = fetchurl {
1088 name = "bonjour___bonjour_3.5.0.tgz";
1089 url = "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz";
1090 sha1 = "8e890a183d8ee9a2393b3844c691a42bcf7bc9f5";
1091 };
1092 }
1093
1094 {
1095 name = "boolbase___boolbase_1.0.0.tgz";
1096 path = fetchurl {
1097 name = "boolbase___boolbase_1.0.0.tgz";
1098 url = "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz";
1099 sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
1100 };
1101 }
1102
1103 {
1104 name = "boom___boom_2.10.1.tgz";
1105 path = fetchurl {
1106 name = "boom___boom_2.10.1.tgz";
1107 url = "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz";
1108 sha1 = "39c8918ceff5799f83f9492a848f625add0c766f";
1109 };
1110 }
1111
1112 {
1113 name = "bootstrap___bootstrap_4.1.3.tgz";
1114 path = fetchurl {
1115 name = "bootstrap___bootstrap_4.1.3.tgz";
1116 url = "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.3.tgz";
1117 sha1 = "0eb371af2c8448e8c210411d0cb824a6409a12be";
1118 };
1119 }
1120
1121 {
1122 name = "brace_expansion___brace_expansion_1.1.11.tgz";
1123 path = fetchurl {
1124 name = "brace_expansion___brace_expansion_1.1.11.tgz";
1125 url = "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz";
1126 sha1 = "3c7fcbf529d87226f3d2f52b966ff5271eb441dd";
1127 };
1128 }
1129
1130 {
1131 name = "braces___braces_1.8.5.tgz";
1132 path = fetchurl {
1133 name = "braces___braces_1.8.5.tgz";
1134 url = "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz";
1135 sha1 = "ba77962e12dff969d6b76711e914b737857bf6a7";
1136 };
1137 }
1138
1139 {
1140 name = "braces___braces_2.3.2.tgz";
1141 path = fetchurl {
1142 name = "braces___braces_2.3.2.tgz";
1143 url = "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz";
1144 sha1 = "5979fd3f14cd531565e5fa2df1abfff1dfaee729";
1145 };
1146 }
1147
1148 {
1149 name = "brorand___brorand_1.1.0.tgz";
1150 path = fetchurl {
1151 name = "brorand___brorand_1.1.0.tgz";
1152 url = "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz";
1153 sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
1154 };
1155 }
1156
1157 {
1158 name = "browserify_aes___browserify_aes_1.2.0.tgz";
1159 path = fetchurl {
1160 name = "browserify_aes___browserify_aes_1.2.0.tgz";
1161 url = "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz";
1162 sha1 = "326734642f403dabc3003209853bb70ad428ef48";
1163 };
1164 }
1165
1166 {
1167 name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
1168 path = fetchurl {
1169 name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
1170 url = "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz";
1171 sha1 = "8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0";
1172 };
1173 }
1174
1175 {
1176 name = "browserify_des___browserify_des_1.0.2.tgz";
1177 path = fetchurl {
1178 name = "browserify_des___browserify_des_1.0.2.tgz";
1179 url = "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz";
1180 sha1 = "3af4f1f59839403572f1c66204375f7a7f703e9c";
1181 };
1182 }
1183
1184 {
1185 name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
1186 path = fetchurl {
1187 name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
1188 url = "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz";
1189 sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524";
1190 };
1191 }
1192
1193 {
1194 name = "browserify_sign___browserify_sign_4.0.4.tgz";
1195 path = fetchurl {
1196 name = "browserify_sign___browserify_sign_4.0.4.tgz";
1197 url = "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz";
1198 sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298";
1199 };
1200 }
1201
1202 {
1203 name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
1204 path = fetchurl {
1205 name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
1206 url = "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz";
1207 sha1 = "2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f";
1208 };
1209 }
1210
1211 {
1212 name = "browserslist___browserslist_1.7.7.tgz";
1213 path = fetchurl {
1214 name = "browserslist___browserslist_1.7.7.tgz";
1215 url = "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz";
1216 sha1 = "0bd76704258be829b2398bb50e4b62d1a166b0b9";
1217 };
1218 }
1219
1220 {
1221 name = "browserslist___browserslist_3.2.8.tgz";
1222 path = fetchurl {
1223 name = "browserslist___browserslist_3.2.8.tgz";
1224 url = "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz";
1225 sha1 = "b0005361d6471f0f5952797a76fc985f1f978fc6";
1226 };
1227 }
1228
1229 {
1230 name = "buffer_indexof___buffer_indexof_1.1.1.tgz";
1231 path = fetchurl {
1232 name = "buffer_indexof___buffer_indexof_1.1.1.tgz";
1233 url = "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz";
1234 sha1 = "52fabcc6a606d1a00302802648ef68f639da268c";
1235 };
1236 }
1237
1238 {
1239 name = "buffer_xor___buffer_xor_1.0.3.tgz";
1240 path = fetchurl {
1241 name = "buffer_xor___buffer_xor_1.0.3.tgz";
1242 url = "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz";
1243 sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
1244 };
1245 }
1246
1247 {
1248 name = "buffer___buffer_4.9.1.tgz";
1249 path = fetchurl {
1250 name = "buffer___buffer_4.9.1.tgz";
1251 url = "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz";
1252 sha1 = "6d1bb601b07a4efced97094132093027c95bc298";
1253 };
1254 }
1255
1256 {
1257 name = "builtin_modules___builtin_modules_1.1.1.tgz";
1258 path = fetchurl {
1259 name = "builtin_modules___builtin_modules_1.1.1.tgz";
1260 url = "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz";
1261 sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f";
1262 };
1263 }
1264
1265 {
1266 name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
1267 path = fetchurl {
1268 name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
1269 url = "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz";
1270 sha1 = "85982878e21b98e1c66425e03d0174788f569ee8";
1271 };
1272 }
1273
1274 {
1275 name = "bytes___bytes_3.0.0.tgz";
1276 path = fetchurl {
1277 name = "bytes___bytes_3.0.0.tgz";
1278 url = "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz";
1279 sha1 = "d32815404d689699f85a4ea4fa8755dd13a96048";
1280 };
1281 }
1282
1283 {
1284 name = "cache_base___cache_base_1.0.1.tgz";
1285 path = fetchurl {
1286 name = "cache_base___cache_base_1.0.1.tgz";
1287 url = "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz";
1288 sha1 = "0a7f46416831c8b662ee36fe4e7c59d76f666ab2";
1289 };
1290 }
1291
1292 {
1293 name = "camelcase_keys___camelcase_keys_2.1.0.tgz";
1294 path = fetchurl {
1295 name = "camelcase_keys___camelcase_keys_2.1.0.tgz";
1296 url = "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz";
1297 sha1 = "308beeaffdf28119051efa1d932213c91b8f92e7";
1298 };
1299 }
1300
1301 {
1302 name = "camelcase___camelcase_1.2.1.tgz";
1303 path = fetchurl {
1304 name = "camelcase___camelcase_1.2.1.tgz";
1305 url = "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz";
1306 sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39";
1307 };
1308 }
1309
1310 {
1311 name = "camelcase___camelcase_2.1.1.tgz";
1312 path = fetchurl {
1313 name = "camelcase___camelcase_2.1.1.tgz";
1314 url = "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz";
1315 sha1 = "7c1d16d679a1bbe59ca02cacecfb011e201f5a1f";
1316 };
1317 }
1318
1319 {
1320 name = "camelcase___camelcase_3.0.0.tgz";
1321 path = fetchurl {
1322 name = "camelcase___camelcase_3.0.0.tgz";
1323 url = "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz";
1324 sha1 = "32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a";
1325 };
1326 }
1327
1328 {
1329 name = "camelcase___camelcase_4.1.0.tgz";
1330 path = fetchurl {
1331 name = "camelcase___camelcase_4.1.0.tgz";
1332 url = "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz";
1333 sha1 = "d545635be1e33c542649c69173e5de6acfae34dd";
1334 };
1335 }
1336
1337 {
1338 name = "caniuse_api___caniuse_api_1.6.1.tgz";
1339 path = fetchurl {
1340 name = "caniuse_api___caniuse_api_1.6.1.tgz";
1341 url = "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz";
1342 sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c";
1343 };
1344 }
1345
1346 {
1347 name = "caniuse_db___caniuse_db_1.0.30000871.tgz";
1348 path = fetchurl {
1349 name = "caniuse_db___caniuse_db_1.0.30000871.tgz";
1350 url = "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000871.tgz";
1351 sha1 = "f1995c1fe31892649a7605957a80c92518423d4d";
1352 };
1353 }
1354
1355 {
1356 name = "caniuse_lite___caniuse_lite_1.0.30000865.tgz";
1357 path = fetchurl {
1358 name = "caniuse_lite___caniuse_lite_1.0.30000865.tgz";
1359 url = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz";
1360 sha1 = "70026616e8afe6e1442f8bb4e1092987d81a2f25";
1361 };
1362 }
1363
1364 {
1365 name = "caseless___caseless_0.12.0.tgz";
1366 path = fetchurl {
1367 name = "caseless___caseless_0.12.0.tgz";
1368 url = "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz";
1369 sha1 = "1b681c21ff84033c826543090689420d187151dc";
1370 };
1371 }
1372
1373 {
1374 name = "center_align___center_align_0.1.3.tgz";
1375 path = fetchurl {
1376 name = "center_align___center_align_0.1.3.tgz";
1377 url = "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz";
1378 sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad";
1379 };
1380 }
1381
1382 {
1383 name = "chalk___chalk_1.1.3.tgz";
1384 path = fetchurl {
1385 name = "chalk___chalk_1.1.3.tgz";
1386 url = "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz";
1387 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
1388 };
1389 }
1390
1391 {
1392 name = "chalk___chalk_2.4.1.tgz";
1393 path = fetchurl {
1394 name = "chalk___chalk_2.4.1.tgz";
1395 url = "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz";
1396 sha1 = "18c49ab16a037b6eb0152cc83e3471338215b66e";
1397 };
1398 }
1399
1400 {
1401 name = "chokidar___chokidar_2.0.4.tgz";
1402 path = fetchurl {
1403 name = "chokidar___chokidar_2.0.4.tgz";
1404 url = "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz";
1405 sha1 = "356ff4e2b0e8e43e322d18a372460bbcf3accd26";
1406 };
1407 }
1408
1409 {
1410 name = "chownr___chownr_1.0.1.tgz";
1411 path = fetchurl {
1412 name = "chownr___chownr_1.0.1.tgz";
1413 url = "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz";
1414 sha1 = "e2a75042a9551908bebd25b8523d5f9769d79181";
1415 };
1416 }
1417
1418 {
1419 name = "cipher_base___cipher_base_1.0.4.tgz";
1420 path = fetchurl {
1421 name = "cipher_base___cipher_base_1.0.4.tgz";
1422 url = "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz";
1423 sha1 = "8760e4ecc272f4c363532f926d874aae2c1397de";
1424 };
1425 }
1426
1427 {
1428 name = "clap___clap_1.2.3.tgz";
1429 path = fetchurl {
1430 name = "clap___clap_1.2.3.tgz";
1431 url = "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz";
1432 sha1 = "4f36745b32008492557f46412d66d50cb99bce51";
1433 };
1434 }
1435
1436 {
1437 name = "class_utils___class_utils_0.3.6.tgz";
1438 path = fetchurl {
1439 name = "class_utils___class_utils_0.3.6.tgz";
1440 url = "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz";
1441 sha1 = "f93369ae8b9a7ce02fd41faad0ca83033190c463";
1442 };
1443 }
1444
1445 {
1446 name = "clean_webpack_plugin___clean_webpack_plugin_0.1.19.tgz";
1447 path = fetchurl {
1448 name = "clean_webpack_plugin___clean_webpack_plugin_0.1.19.tgz";
1449 url = "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz";
1450 sha1 = "ceda8bb96b00fe168e9b080272960d20fdcadd6d";
1451 };
1452 }
1453
1454 {
1455 name = "cliui___cliui_2.1.0.tgz";
1456 path = fetchurl {
1457 name = "cliui___cliui_2.1.0.tgz";
1458 url = "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz";
1459 sha1 = "4b475760ff80264c762c3a1719032e91c7fea0d1";
1460 };
1461 }
1462
1463 {
1464 name = "cliui___cliui_3.2.0.tgz";
1465 path = fetchurl {
1466 name = "cliui___cliui_3.2.0.tgz";
1467 url = "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz";
1468 sha1 = "120601537a916d29940f934da3b48d585a39213d";
1469 };
1470 }
1471
1472 {
1473 name = "clone_deep___clone_deep_2.0.2.tgz";
1474 path = fetchurl {
1475 name = "clone_deep___clone_deep_2.0.2.tgz";
1476 url = "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz";
1477 sha1 = "00db3a1e173656730d1188c3d6aced6d7ea97713";
1478 };
1479 }
1480
1481 {
1482 name = "clone___clone_1.0.4.tgz";
1483 path = fetchurl {
1484 name = "clone___clone_1.0.4.tgz";
1485 url = "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz";
1486 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
1487 };
1488 }
1489
1490 {
1491 name = "co___co_4.6.0.tgz";
1492 path = fetchurl {
1493 name = "co___co_4.6.0.tgz";
1494 url = "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz";
1495 sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
1496 };
1497 }
1498
1499 {
1500 name = "coa___coa_1.0.4.tgz";
1501 path = fetchurl {
1502 name = "coa___coa_1.0.4.tgz";
1503 url = "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz";
1504 sha1 = "a9ef153660d6a86a8bdec0289a5c684d217432fd";
1505 };
1506 }
1507
1508 {
1509 name = "code_point_at___code_point_at_1.1.0.tgz";
1510 path = fetchurl {
1511 name = "code_point_at___code_point_at_1.1.0.tgz";
1512 url = "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz";
1513 sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
1514 };
1515 }
1516
1517 {
1518 name = "collection_visit___collection_visit_1.0.0.tgz";
1519 path = fetchurl {
1520 name = "collection_visit___collection_visit_1.0.0.tgz";
1521 url = "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz";
1522 sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
1523 };
1524 }
1525
1526 {
1527 name = "color_convert___color_convert_1.9.2.tgz";
1528 path = fetchurl {
1529 name = "color_convert___color_convert_1.9.2.tgz";
1530 url = "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz";
1531 sha1 = "49881b8fba67df12a96bdf3f56c0aab9e7913147";
1532 };
1533 }
1534
1535 {
1536 name = "color_name___color_name_1.1.1.tgz";
1537 path = fetchurl {
1538 name = "color_name___color_name_1.1.1.tgz";
1539 url = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz";
1540 sha1 = "4b1415304cf50028ea81643643bd82ea05803689";
1541 };
1542 }
1543
1544 {
1545 name = "color_name___color_name_1.1.3.tgz";
1546 path = fetchurl {
1547 name = "color_name___color_name_1.1.3.tgz";
1548 url = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz";
1549 sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
1550 };
1551 }
1552
1553 {
1554 name = "color_string___color_string_0.3.0.tgz";
1555 path = fetchurl {
1556 name = "color_string___color_string_0.3.0.tgz";
1557 url = "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz";
1558 sha1 = "27d46fb67025c5c2fa25993bfbf579e47841b991";
1559 };
1560 }
1561
1562 {
1563 name = "color___color_0.11.4.tgz";
1564 path = fetchurl {
1565 name = "color___color_0.11.4.tgz";
1566 url = "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz";
1567 sha1 = "6d7b5c74fb65e841cd48792ad1ed5e07b904d764";
1568 };
1569 }
1570
1571 {
1572 name = "colormin___colormin_1.1.2.tgz";
1573 path = fetchurl {
1574 name = "colormin___colormin_1.1.2.tgz";
1575 url = "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz";
1576 sha1 = "ea2f7420a72b96881a38aae59ec124a6f7298133";
1577 };
1578 }
1579
1580 {
1581 name = "colors___colors_1.1.2.tgz";
1582 path = fetchurl {
1583 name = "colors___colors_1.1.2.tgz";
1584 url = "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz";
1585 sha1 = "168a4701756b6a7f51a12ce0c97bfa28c084ed63";
1586 };
1587 }
1588
1589 {
1590 name = "combined_stream___combined_stream_1.0.6.tgz";
1591 path = fetchurl {
1592 name = "combined_stream___combined_stream_1.0.6.tgz";
1593 url = "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz";
1594 sha1 = "723e7df6e801ac5613113a7e445a9b69cb632818";
1595 };
1596 }
1597
1598 {
1599 name = "commondir___commondir_1.0.1.tgz";
1600 path = fetchurl {
1601 name = "commondir___commondir_1.0.1.tgz";
1602 url = "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz";
1603 sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b";
1604 };
1605 }
1606
1607 {
1608 name = "component_emitter___component_emitter_1.2.1.tgz";
1609 path = fetchurl {
1610 name = "component_emitter___component_emitter_1.2.1.tgz";
1611 url = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz";
1612 sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
1613 };
1614 }
1615
1616 {
1617 name = "compressible___compressible_2.0.14.tgz";
1618 path = fetchurl {
1619 name = "compressible___compressible_2.0.14.tgz";
1620 url = "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz";
1621 sha1 = "326c5f507fbb055f54116782b969a81b67a29da7";
1622 };
1623 }
1624
1625 {
1626 name = "compression___compression_1.7.3.tgz";
1627 path = fetchurl {
1628 name = "compression___compression_1.7.3.tgz";
1629 url = "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz";
1630 sha1 = "27e0e176aaf260f7f2c2813c3e440adb9f1993db";
1631 };
1632 }
1633
1634 {
1635 name = "concat_map___concat_map_0.0.1.tgz";
1636 path = fetchurl {
1637 name = "concat_map___concat_map_0.0.1.tgz";
1638 url = "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz";
1639 sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
1640 };
1641 }
1642
1643 {
1644 name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz";
1645 path = fetchurl {
1646 name = "connect_history_api_fallback___connect_history_api_fallback_1.5.0.tgz";
1647 url = "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz";
1648 sha1 = "b06873934bc5e344fef611a196a6faae0aee015a";
1649 };
1650 }
1651
1652 {
1653 name = "console_browserify___console_browserify_1.1.0.tgz";
1654 path = fetchurl {
1655 name = "console_browserify___console_browserify_1.1.0.tgz";
1656 url = "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz";
1657 sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10";
1658 };
1659 }
1660
1661 {
1662 name = "console_control_strings___console_control_strings_1.1.0.tgz";
1663 path = fetchurl {
1664 name = "console_control_strings___console_control_strings_1.1.0.tgz";
1665 url = "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz";
1666 sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
1667 };
1668 }
1669
1670 {
1671 name = "constants_browserify___constants_browserify_1.0.0.tgz";
1672 path = fetchurl {
1673 name = "constants_browserify___constants_browserify_1.0.0.tgz";
1674 url = "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz";
1675 sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
1676 };
1677 }
1678
1679 {
1680 name = "content_disposition___content_disposition_0.5.2.tgz";
1681 path = fetchurl {
1682 name = "content_disposition___content_disposition_0.5.2.tgz";
1683 url = "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz";
1684 sha1 = "0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4";
1685 };
1686 }
1687
1688 {
1689 name = "content_type___content_type_1.0.4.tgz";
1690 path = fetchurl {
1691 name = "content_type___content_type_1.0.4.tgz";
1692 url = "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz";
1693 sha1 = "e138cc75e040c727b1966fe5e5f8c9aee256fe3b";
1694 };
1695 }
1696
1697 {
1698 name = "convert_source_map___convert_source_map_0.3.5.tgz";
1699 path = fetchurl {
1700 name = "convert_source_map___convert_source_map_0.3.5.tgz";
1701 url = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz";
1702 sha1 = "f1d802950af7dd2631a1febe0596550c86ab3190";
1703 };
1704 }
1705
1706 {
1707 name = "convert_source_map___convert_source_map_1.5.1.tgz";
1708 path = fetchurl {
1709 name = "convert_source_map___convert_source_map_1.5.1.tgz";
1710 url = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz";
1711 sha1 = "b8278097b9bc229365de5c62cf5fcaed8b5599e5";
1712 };
1713 }
1714
1715 {
1716 name = "cookie_signature___cookie_signature_1.0.6.tgz";
1717 path = fetchurl {
1718 name = "cookie_signature___cookie_signature_1.0.6.tgz";
1719 url = "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz";
1720 sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c";
1721 };
1722 }
1723
1724 {
1725 name = "cookie___cookie_0.3.1.tgz";
1726 path = fetchurl {
1727 name = "cookie___cookie_0.3.1.tgz";
1728 url = "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz";
1729 sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb";
1730 };
1731 }
1732
1733 {
1734 name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
1735 path = fetchurl {
1736 name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
1737 url = "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
1738 sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
1739 };
1740 }
1741
1742 {
1743 name = "core_js___core_js_2.5.7.tgz";
1744 path = fetchurl {
1745 name = "core_js___core_js_2.5.7.tgz";
1746 url = "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz";
1747 sha1 = "f972608ff0cead68b841a16a932d0b183791814e";
1748 };
1749 }
1750
1751 {
1752 name = "core_util_is___core_util_is_1.0.2.tgz";
1753 path = fetchurl {
1754 name = "core_util_is___core_util_is_1.0.2.tgz";
1755 url = "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz";
1756 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
1757 };
1758 }
1759
1760 {
1761 name = "create_ecdh___create_ecdh_4.0.3.tgz";
1762 path = fetchurl {
1763 name = "create_ecdh___create_ecdh_4.0.3.tgz";
1764 url = "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz";
1765 sha1 = "c9111b6f33045c4697f144787f9254cdc77c45ff";
1766 };
1767 }
1768
1769 {
1770 name = "create_hash___create_hash_1.2.0.tgz";
1771 path = fetchurl {
1772 name = "create_hash___create_hash_1.2.0.tgz";
1773 url = "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz";
1774 sha1 = "889078af11a63756bcfb59bd221996be3a9ef196";
1775 };
1776 }
1777
1778 {
1779 name = "create_hmac___create_hmac_1.1.7.tgz";
1780 path = fetchurl {
1781 name = "create_hmac___create_hmac_1.1.7.tgz";
1782 url = "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz";
1783 sha1 = "69170c78b3ab957147b2b8b04572e47ead2243ff";
1784 };
1785 }
1786
1787 {
1788 name = "cross_spawn___cross_spawn_3.0.1.tgz";
1789 path = fetchurl {
1790 name = "cross_spawn___cross_spawn_3.0.1.tgz";
1791 url = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz";
1792 sha1 = "1256037ecb9f0c5f79e3d6ef135e30770184b982";
1793 };
1794 }
1795
1796 {
1797 name = "cross_spawn___cross_spawn_5.1.0.tgz";
1798 path = fetchurl {
1799 name = "cross_spawn___cross_spawn_5.1.0.tgz";
1800 url = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz";
1801 sha1 = "e8bd0efee58fcff6f8f94510a0a554bbfa235449";
1802 };
1803 }
1804
1805 {
1806 name = "cryptiles___cryptiles_2.0.5.tgz";
1807 path = fetchurl {
1808 name = "cryptiles___cryptiles_2.0.5.tgz";
1809 url = "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz";
1810 sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8";
1811 };
1812 }
1813
1814 {
1815 name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
1816 path = fetchurl {
1817 name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
1818 url = "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz";
1819 sha1 = "396cf9f3137f03e4b8e532c58f698254e00f80ec";
1820 };
1821 }
1822
1823 {
1824 name = "css_color_names___css_color_names_0.0.4.tgz";
1825 path = fetchurl {
1826 name = "css_color_names___css_color_names_0.0.4.tgz";
1827 url = "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz";
1828 sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0";
1829 };
1830 }
1831
1832 {
1833 name = "css_loader___css_loader_0.26.4.tgz";
1834 path = fetchurl {
1835 name = "css_loader___css_loader_0.26.4.tgz";
1836 url = "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.4.tgz";
1837 sha1 = "b61e9e30db94303e6ffc892f10ecd09ad025a1fd";
1838 };
1839 }
1840
1841 {
1842 name = "css_select___css_select_1.2.0.tgz";
1843 path = fetchurl {
1844 name = "css_select___css_select_1.2.0.tgz";
1845 url = "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz";
1846 sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
1847 };
1848 }
1849
1850 {
1851 name = "css_selector_tokenizer___css_selector_tokenizer_0.7.0.tgz";
1852 path = fetchurl {
1853 name = "css_selector_tokenizer___css_selector_tokenizer_0.7.0.tgz";
1854 url = "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz";
1855 sha1 = "e6988474ae8c953477bf5e7efecfceccd9cf4c86";
1856 };
1857 }
1858
1859 {
1860 name = "css_what___css_what_2.1.0.tgz";
1861 path = fetchurl {
1862 name = "css_what___css_what_2.1.0.tgz";
1863 url = "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz";
1864 sha1 = "9467d032c38cfaefb9f2d79501253062f87fa1bd";
1865 };
1866 }
1867
1868 {
1869 name = "css___css_2.2.3.tgz";
1870 path = fetchurl {
1871 name = "css___css_2.2.3.tgz";
1872 url = "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz";
1873 sha1 = "f861f4ba61e79bedc962aa548e5780fd95cbc6be";
1874 };
1875 }
1876
1877 {
1878 name = "cssesc___cssesc_0.1.0.tgz";
1879 path = fetchurl {
1880 name = "cssesc___cssesc_0.1.0.tgz";
1881 url = "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz";
1882 sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4";
1883 };
1884 }
1885
1886 {
1887 name = "cssnano___cssnano_3.10.0.tgz";
1888 path = fetchurl {
1889 name = "cssnano___cssnano_3.10.0.tgz";
1890 url = "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz";
1891 sha1 = "4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38";
1892 };
1893 }
1894
1895 {
1896 name = "csso___csso_2.3.2.tgz";
1897 path = fetchurl {
1898 name = "csso___csso_2.3.2.tgz";
1899 url = "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz";
1900 sha1 = "ddd52c587033f49e94b71fc55569f252e8ff5f85";
1901 };
1902 }
1903
1904 {
1905 name = "currently_unhandled___currently_unhandled_0.4.1.tgz";
1906 path = fetchurl {
1907 name = "currently_unhandled___currently_unhandled_0.4.1.tgz";
1908 url = "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz";
1909 sha1 = "988df33feab191ef799a61369dd76c17adf957ea";
1910 };
1911 }
1912
1913 {
1914 name = "d___d_1.0.0.tgz";
1915 path = fetchurl {
1916 name = "d___d_1.0.0.tgz";
1917 url = "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz";
1918 sha1 = "754bb5bfe55451da69a58b94d45f4c5b0462d58f";
1919 };
1920 }
1921
1922 {
1923 name = "dashdash___dashdash_1.14.1.tgz";
1924 path = fetchurl {
1925 name = "dashdash___dashdash_1.14.1.tgz";
1926 url = "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz";
1927 sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
1928 };
1929 }
1930
1931 {
1932 name = "date_now___date_now_0.1.4.tgz";
1933 path = fetchurl {
1934 name = "date_now___date_now_0.1.4.tgz";
1935 url = "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz";
1936 sha1 = "eaf439fd4d4848ad74e5cc7dbef200672b9e345b";
1937 };
1938 }
1939
1940 {
1941 name = "debug___debug_2.6.9.tgz";
1942 path = fetchurl {
1943 name = "debug___debug_2.6.9.tgz";
1944 url = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz";
1945 sha1 = "5d128515df134ff327e90a4c93f4e077a536341f";
1946 };
1947 }
1948
1949 {
1950 name = "debug___debug_3.1.0.tgz";
1951 path = fetchurl {
1952 name = "debug___debug_3.1.0.tgz";
1953 url = "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz";
1954 sha1 = "5bb5a0672628b64149566ba16819e61518c67261";
1955 };
1956 }
1957
1958 {
1959 name = "decamelize___decamelize_1.2.0.tgz";
1960 path = fetchurl {
1961 name = "decamelize___decamelize_1.2.0.tgz";
1962 url = "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz";
1963 sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
1964 };
1965 }
1966
1967 {
1968 name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
1969 path = fetchurl {
1970 name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
1971 url = "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
1972 sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
1973 };
1974 }
1975
1976 {
1977 name = "deep_equal___deep_equal_1.0.1.tgz";
1978 path = fetchurl {
1979 name = "deep_equal___deep_equal_1.0.1.tgz";
1980 url = "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz";
1981 sha1 = "f5d260292b660e084eff4cdbc9f08ad3247448b5";
1982 };
1983 }
1984
1985 {
1986 name = "deep_extend___deep_extend_0.6.0.tgz";
1987 path = fetchurl {
1988 name = "deep_extend___deep_extend_0.6.0.tgz";
1989 url = "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz";
1990 sha1 = "c4fa7c95404a17a9c3e8ca7e1537312b736330ac";
1991 };
1992 }
1993
1994 {
1995 name = "define_properties___define_properties_1.1.2.tgz";
1996 path = fetchurl {
1997 name = "define_properties___define_properties_1.1.2.tgz";
1998 url = "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz";
1999 sha1 = "83a73f2fea569898fb737193c8f873caf6d45c94";
2000 };
2001 }
2002
2003 {
2004 name = "define_property___define_property_0.2.5.tgz";
2005 path = fetchurl {
2006 name = "define_property___define_property_0.2.5.tgz";
2007 url = "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz";
2008 sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
2009 };
2010 }
2011
2012 {
2013 name = "define_property___define_property_1.0.0.tgz";
2014 path = fetchurl {
2015 name = "define_property___define_property_1.0.0.tgz";
2016 url = "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz";
2017 sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
2018 };
2019 }
2020
2021 {
2022 name = "define_property___define_property_2.0.2.tgz";
2023 path = fetchurl {
2024 name = "define_property___define_property_2.0.2.tgz";
2025 url = "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz";
2026 sha1 = "d459689e8d654ba77e02a817f8710d702cb16e9d";
2027 };
2028 }
2029
2030 {
2031 name = "defined___defined_1.0.0.tgz";
2032 path = fetchurl {
2033 name = "defined___defined_1.0.0.tgz";
2034 url = "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz";
2035 sha1 = "c98d9bcef75674188e110969151199e39b1fa693";
2036 };
2037 }
2038
2039 {
2040 name = "del___del_3.0.0.tgz";
2041 path = fetchurl {
2042 name = "del___del_3.0.0.tgz";
2043 url = "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz";
2044 sha1 = "53ecf699ffcbcb39637691ab13baf160819766e5";
2045 };
2046 }
2047
2048 {
2049 name = "delayed_stream___delayed_stream_1.0.0.tgz";
2050 path = fetchurl {
2051 name = "delayed_stream___delayed_stream_1.0.0.tgz";
2052 url = "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz";
2053 sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
2054 };
2055 }
2056
2057 {
2058 name = "delegates___delegates_1.0.0.tgz";
2059 path = fetchurl {
2060 name = "delegates___delegates_1.0.0.tgz";
2061 url = "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz";
2062 sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
2063 };
2064 }
2065
2066 {
2067 name = "depd___depd_1.1.1.tgz";
2068 path = fetchurl {
2069 name = "depd___depd_1.1.1.tgz";
2070 url = "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz";
2071 sha1 = "5783b4e1c459f06fa5ca27f991f3d06e7a310359";
2072 };
2073 }
2074
2075 {
2076 name = "depd___depd_1.1.2.tgz";
2077 path = fetchurl {
2078 name = "depd___depd_1.1.2.tgz";
2079 url = "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz";
2080 sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
2081 };
2082 }
2083
2084 {
2085 name = "des.js___des.js_1.0.0.tgz";
2086 path = fetchurl {
2087 name = "des.js___des.js_1.0.0.tgz";
2088 url = "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz";
2089 sha1 = "c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc";
2090 };
2091 }
2092
2093 {
2094 name = "destroy___destroy_1.0.4.tgz";
2095 path = fetchurl {
2096 name = "destroy___destroy_1.0.4.tgz";
2097 url = "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz";
2098 sha1 = "978857442c44749e4206613e37946205826abd80";
2099 };
2100 }
2101
2102 {
2103 name = "detect_indent___detect_indent_4.0.0.tgz";
2104 path = fetchurl {
2105 name = "detect_indent___detect_indent_4.0.0.tgz";
2106 url = "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz";
2107 sha1 = "f76d064352cdf43a1cb6ce619c4ee3a9475de208";
2108 };
2109 }
2110
2111 {
2112 name = "detect_libc___detect_libc_1.0.3.tgz";
2113 path = fetchurl {
2114 name = "detect_libc___detect_libc_1.0.3.tgz";
2115 url = "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz";
2116 sha1 = "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b";
2117 };
2118 }
2119
2120 {
2121 name = "detect_node___detect_node_2.0.3.tgz";
2122 path = fetchurl {
2123 name = "detect_node___detect_node_2.0.3.tgz";
2124 url = "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz";
2125 sha1 = "a2033c09cc8e158d37748fbde7507832bd6ce127";
2126 };
2127 }
2128
2129 {
2130 name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
2131 path = fetchurl {
2132 name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
2133 url = "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz";
2134 sha1 = "40e8ee98f55a2149607146921c63e1ae5f3d2875";
2135 };
2136 }
2137
2138 {
2139 name = "dns_equal___dns_equal_1.0.0.tgz";
2140 path = fetchurl {
2141 name = "dns_equal___dns_equal_1.0.0.tgz";
2142 url = "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz";
2143 sha1 = "b39e7f1da6eb0a75ba9c17324b34753c47e0654d";
2144 };
2145 }
2146
2147 {
2148 name = "dns_packet___dns_packet_1.3.1.tgz";
2149 path = fetchurl {
2150 name = "dns_packet___dns_packet_1.3.1.tgz";
2151 url = "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz";
2152 sha1 = "12aa426981075be500b910eedcd0b47dd7deda5a";
2153 };
2154 }
2155
2156 {
2157 name = "dns_txt___dns_txt_2.0.2.tgz";
2158 path = fetchurl {
2159 name = "dns_txt___dns_txt_2.0.2.tgz";
2160 url = "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz";
2161 sha1 = "b91d806f5d27188e4ab3e7d107d881a1cc4642b6";
2162 };
2163 }
2164
2165 {
2166 name = "dom_converter___dom_converter_0.1.4.tgz";
2167 path = fetchurl {
2168 name = "dom_converter___dom_converter_0.1.4.tgz";
2169 url = "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz";
2170 sha1 = "a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b";
2171 };
2172 }
2173
2174 {
2175 name = "dom_serializer___dom_serializer_0.1.0.tgz";
2176 path = fetchurl {
2177 name = "dom_serializer___dom_serializer_0.1.0.tgz";
2178 url = "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz";
2179 sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82";
2180 };
2181 }
2182
2183 {
2184 name = "domain_browser___domain_browser_1.2.0.tgz";
2185 path = fetchurl {
2186 name = "domain_browser___domain_browser_1.2.0.tgz";
2187 url = "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz";
2188 sha1 = "3d31f50191a6749dd1375a7f522e823d42e54eda";
2189 };
2190 }
2191
2192 {
2193 name = "domelementtype___domelementtype_1.3.0.tgz";
2194 path = fetchurl {
2195 name = "domelementtype___domelementtype_1.3.0.tgz";
2196 url = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz";
2197 sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2";
2198 };
2199 }
2200
2201 {
2202 name = "domelementtype___domelementtype_1.1.3.tgz";
2203 path = fetchurl {
2204 name = "domelementtype___domelementtype_1.1.3.tgz";
2205 url = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz";
2206 sha1 = "bd28773e2642881aec51544924299c5cd822185b";
2207 };
2208 }
2209
2210 {
2211 name = "domhandler___domhandler_2.1.0.tgz";
2212 path = fetchurl {
2213 name = "domhandler___domhandler_2.1.0.tgz";
2214 url = "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz";
2215 sha1 = "d2646f5e57f6c3bab11cf6cb05d3c0acf7412594";
2216 };
2217 }
2218
2219 {
2220 name = "domutils___domutils_1.1.6.tgz";
2221 path = fetchurl {
2222 name = "domutils___domutils_1.1.6.tgz";
2223 url = "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz";
2224 sha1 = "bddc3de099b9a2efacc51c623f28f416ecc57485";
2225 };
2226 }
2227
2228 {
2229 name = "domutils___domutils_1.5.1.tgz";
2230 path = fetchurl {
2231 name = "domutils___domutils_1.5.1.tgz";
2232 url = "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz";
2233 sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
2234 };
2235 }
2236
2237 {
2238 name = "ecc_jsbn___ecc_jsbn_0.1.1.tgz";
2239 path = fetchurl {
2240 name = "ecc_jsbn___ecc_jsbn_0.1.1.tgz";
2241 url = "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz";
2242 sha1 = "0fc73a9ed5f0d53c38193398523ef7e543777505";
2243 };
2244 }
2245
2246 {
2247 name = "ee_first___ee_first_1.1.1.tgz";
2248 path = fetchurl {
2249 name = "ee_first___ee_first_1.1.1.tgz";
2250 url = "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz";
2251 sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
2252 };
2253 }
2254
2255 {
2256 name = "electron_to_chromium___electron_to_chromium_1.3.52.tgz";
2257 path = fetchurl {
2258 name = "electron_to_chromium___electron_to_chromium_1.3.52.tgz";
2259 url = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz";
2260 sha1 = "d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0";
2261 };
2262 }
2263
2264 {
2265 name = "elliptic___elliptic_6.4.0.tgz";
2266 path = fetchurl {
2267 name = "elliptic___elliptic_6.4.0.tgz";
2268 url = "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz";
2269 sha1 = "cac9af8762c85836187003c8dfe193e5e2eae5df";
2270 };
2271 }
2272
2273 {
2274 name = "emojis_list___emojis_list_2.1.0.tgz";
2275 path = fetchurl {
2276 name = "emojis_list___emojis_list_2.1.0.tgz";
2277 url = "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz";
2278 sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389";
2279 };
2280 }
2281
2282 {
2283 name = "encodeurl___encodeurl_1.0.2.tgz";
2284 path = fetchurl {
2285 name = "encodeurl___encodeurl_1.0.2.tgz";
2286 url = "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz";
2287 sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
2288 };
2289 }
2290
2291 {
2292 name = "enhanced_resolve___enhanced_resolve_3.4.1.tgz";
2293 path = fetchurl {
2294 name = "enhanced_resolve___enhanced_resolve_3.4.1.tgz";
2295 url = "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz";
2296 sha1 = "0421e339fd71419b3da13d129b3979040230476e";
2297 };
2298 }
2299
2300 {
2301 name = "entities___entities_1.1.1.tgz";
2302 path = fetchurl {
2303 name = "entities___entities_1.1.1.tgz";
2304 url = "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz";
2305 sha1 = "6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0";
2306 };
2307 }
2308
2309 {
2310 name = "errno___errno_0.1.7.tgz";
2311 path = fetchurl {
2312 name = "errno___errno_0.1.7.tgz";
2313 url = "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz";
2314 sha1 = "4684d71779ad39af177e3f007996f7c67c852618";
2315 };
2316 }
2317
2318 {
2319 name = "error_ex___error_ex_1.3.2.tgz";
2320 path = fetchurl {
2321 name = "error_ex___error_ex_1.3.2.tgz";
2322 url = "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz";
2323 sha1 = "b4ac40648107fdcdcfae242f428bea8a14d4f1bf";
2324 };
2325 }
2326
2327 {
2328 name = "error_stack_parser___error_stack_parser_2.0.2.tgz";
2329 path = fetchurl {
2330 name = "error_stack_parser___error_stack_parser_2.0.2.tgz";
2331 url = "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz";
2332 sha1 = "4ae8dbaa2bf90a8b450707b9149dcabca135520d";
2333 };
2334 }
2335
2336 {
2337 name = "es_abstract___es_abstract_1.12.0.tgz";
2338 path = fetchurl {
2339 name = "es_abstract___es_abstract_1.12.0.tgz";
2340 url = "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz";
2341 sha1 = "9dbbdd27c6856f0001421ca18782d786bf8a6165";
2342 };
2343 }
2344
2345 {
2346 name = "es_to_primitive___es_to_primitive_1.1.1.tgz";
2347 path = fetchurl {
2348 name = "es_to_primitive___es_to_primitive_1.1.1.tgz";
2349 url = "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz";
2350 sha1 = "45355248a88979034b6792e19bb81f2b7975dd0d";
2351 };
2352 }
2353
2354 {
2355 name = "es5_ext___es5_ext_0.10.45.tgz";
2356 path = fetchurl {
2357 name = "es5_ext___es5_ext_0.10.45.tgz";
2358 url = "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz";
2359 sha1 = "0bfdf7b473da5919d5adf3bd25ceb754fccc3653";
2360 };
2361 }
2362
2363 {
2364 name = "es6_iterator___es6_iterator_2.0.3.tgz";
2365 path = fetchurl {
2366 name = "es6_iterator___es6_iterator_2.0.3.tgz";
2367 url = "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz";
2368 sha1 = "a7de889141a05a94b0854403b2d0a0fbfa98f3b7";
2369 };
2370 }
2371
2372 {
2373 name = "es6_map___es6_map_0.1.5.tgz";
2374 path = fetchurl {
2375 name = "es6_map___es6_map_0.1.5.tgz";
2376 url = "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz";
2377 sha1 = "9136e0503dcc06a301690f0bb14ff4e364e949f0";
2378 };
2379 }
2380
2381 {
2382 name = "es6_set___es6_set_0.1.5.tgz";
2383 path = fetchurl {
2384 name = "es6_set___es6_set_0.1.5.tgz";
2385 url = "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz";
2386 sha1 = "d2b3ec5d4d800ced818db538d28974db0a73ccb1";
2387 };
2388 }
2389
2390 {
2391 name = "es6_symbol___es6_symbol_3.1.1.tgz";
2392 path = fetchurl {
2393 name = "es6_symbol___es6_symbol_3.1.1.tgz";
2394 url = "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz";
2395 sha1 = "bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77";
2396 };
2397 }
2398
2399 {
2400 name = "es6_weak_map___es6_weak_map_2.0.2.tgz";
2401 path = fetchurl {
2402 name = "es6_weak_map___es6_weak_map_2.0.2.tgz";
2403 url = "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz";
2404 sha1 = "5e3ab32251ffd1538a1f8e5ffa1357772f92d96f";
2405 };
2406 }
2407
2408 {
2409 name = "escape_html___escape_html_1.0.3.tgz";
2410 path = fetchurl {
2411 name = "escape_html___escape_html_1.0.3.tgz";
2412 url = "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz";
2413 sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
2414 };
2415 }
2416
2417 {
2418 name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
2419 path = fetchurl {
2420 name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
2421 url = "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
2422 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
2423 };
2424 }
2425
2426 {
2427 name = "escope___escope_3.6.0.tgz";
2428 path = fetchurl {
2429 name = "escope___escope_3.6.0.tgz";
2430 url = "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz";
2431 sha1 = "e01975e812781a163a6dadfdd80398dc64c889c3";
2432 };
2433 }
2434
2435 {
2436 name = "esprima___esprima_2.7.3.tgz";
2437 path = fetchurl {
2438 name = "esprima___esprima_2.7.3.tgz";
2439 url = "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz";
2440 sha1 = "96e3b70d5779f6ad49cd032673d1c312767ba581";
2441 };
2442 }
2443
2444 {
2445 name = "esrecurse___esrecurse_4.2.1.tgz";
2446 path = fetchurl {
2447 name = "esrecurse___esrecurse_4.2.1.tgz";
2448 url = "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz";
2449 sha1 = "007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf";
2450 };
2451 }
2452
2453 {
2454 name = "estraverse___estraverse_4.2.0.tgz";
2455 path = fetchurl {
2456 name = "estraverse___estraverse_4.2.0.tgz";
2457 url = "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz";
2458 sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
2459 };
2460 }
2461
2462 {
2463 name = "esutils___esutils_2.0.2.tgz";
2464 path = fetchurl {
2465 name = "esutils___esutils_2.0.2.tgz";
2466 url = "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz";
2467 sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b";
2468 };
2469 }
2470
2471 {
2472 name = "etag___etag_1.8.1.tgz";
2473 path = fetchurl {
2474 name = "etag___etag_1.8.1.tgz";
2475 url = "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz";
2476 sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
2477 };
2478 }
2479
2480 {
2481 name = "event_emitter___event_emitter_0.3.5.tgz";
2482 path = fetchurl {
2483 name = "event_emitter___event_emitter_0.3.5.tgz";
2484 url = "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz";
2485 sha1 = "df8c69eef1647923c7157b9ce83840610b02cc39";
2486 };
2487 }
2488
2489 {
2490 name = "eventemitter3___eventemitter3_3.1.0.tgz";
2491 path = fetchurl {
2492 name = "eventemitter3___eventemitter3_3.1.0.tgz";
2493 url = "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz";
2494 sha1 = "090b4d6cdbd645ed10bf750d4b5407942d7ba163";
2495 };
2496 }
2497
2498 {
2499 name = "events___events_1.1.1.tgz";
2500 path = fetchurl {
2501 name = "events___events_1.1.1.tgz";
2502 url = "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz";
2503 sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924";
2504 };
2505 }
2506
2507 {
2508 name = "eventsource___eventsource_0.1.6.tgz";
2509 path = fetchurl {
2510 name = "eventsource___eventsource_0.1.6.tgz";
2511 url = "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz";
2512 sha1 = "0acede849ed7dd1ccc32c811bb11b944d4f29232";
2513 };
2514 }
2515
2516 {
2517 name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
2518 path = fetchurl {
2519 name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
2520 url = "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz";
2521 sha1 = "7fcbdb198dc71959432efe13842684e0525acb02";
2522 };
2523 }
2524
2525 {
2526 name = "execa___execa_0.7.0.tgz";
2527 path = fetchurl {
2528 name = "execa___execa_0.7.0.tgz";
2529 url = "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz";
2530 sha1 = "944becd34cc41ee32a63a9faf27ad5a65fc59777";
2531 };
2532 }
2533
2534 {
2535 name = "expand_brackets___expand_brackets_0.1.5.tgz";
2536 path = fetchurl {
2537 name = "expand_brackets___expand_brackets_0.1.5.tgz";
2538 url = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz";
2539 sha1 = "df07284e342a807cd733ac5af72411e581d1177b";
2540 };
2541 }
2542
2543 {
2544 name = "expand_brackets___expand_brackets_2.1.4.tgz";
2545 path = fetchurl {
2546 name = "expand_brackets___expand_brackets_2.1.4.tgz";
2547 url = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz";
2548 sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
2549 };
2550 }
2551
2552 {
2553 name = "expand_range___expand_range_1.8.2.tgz";
2554 path = fetchurl {
2555 name = "expand_range___expand_range_1.8.2.tgz";
2556 url = "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz";
2557 sha1 = "a299effd335fe2721ebae8e257ec79644fc85337";
2558 };
2559 }
2560
2561 {
2562 name = "express___express_4.16.3.tgz";
2563 path = fetchurl {
2564 name = "express___express_4.16.3.tgz";
2565 url = "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz";
2566 sha1 = "6af8a502350db3246ecc4becf6b5a34d22f7ed53";
2567 };
2568 }
2569
2570 {
2571 name = "extend_shallow___extend_shallow_2.0.1.tgz";
2572 path = fetchurl {
2573 name = "extend_shallow___extend_shallow_2.0.1.tgz";
2574 url = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz";
2575 sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
2576 };
2577 }
2578
2579 {
2580 name = "extend_shallow___extend_shallow_3.0.2.tgz";
2581 path = fetchurl {
2582 name = "extend_shallow___extend_shallow_3.0.2.tgz";
2583 url = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz";
2584 sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
2585 };
2586 }
2587
2588 {
2589 name = "extend___extend_3.0.2.tgz";
2590 path = fetchurl {
2591 name = "extend___extend_3.0.2.tgz";
2592 url = "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz";
2593 sha1 = "f8b1136b4071fbd8eb140aff858b1019ec2915fa";
2594 };
2595 }
2596
2597 {
2598 name = "extglob___extglob_0.3.2.tgz";
2599 path = fetchurl {
2600 name = "extglob___extglob_0.3.2.tgz";
2601 url = "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz";
2602 sha1 = "2e18ff3d2f49ab2765cec9023f011daa8d8349a1";
2603 };
2604 }
2605
2606 {
2607 name = "extglob___extglob_2.0.4.tgz";
2608 path = fetchurl {
2609 name = "extglob___extglob_2.0.4.tgz";
2610 url = "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz";
2611 sha1 = "ad00fe4dc612a9232e8718711dc5cb5ab0285543";
2612 };
2613 }
2614
2615 {
2616 name = "extract_text_webpack_plugin___extract_text_webpack_plugin_3.0.2.tgz";
2617 path = fetchurl {
2618 name = "extract_text_webpack_plugin___extract_text_webpack_plugin_3.0.2.tgz";
2619 url = "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz";
2620 sha1 = "5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7";
2621 };
2622 }
2623
2624 {
2625 name = "extsprintf___extsprintf_1.3.0.tgz";
2626 path = fetchurl {
2627 name = "extsprintf___extsprintf_1.3.0.tgz";
2628 url = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz";
2629 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
2630 };
2631 }
2632
2633 {
2634 name = "extsprintf___extsprintf_1.4.0.tgz";
2635 path = fetchurl {
2636 name = "extsprintf___extsprintf_1.4.0.tgz";
2637 url = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz";
2638 sha1 = "e2689f8f356fad62cca65a3a91c5df5f9551692f";
2639 };
2640 }
2641
2642 {
2643 name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz";
2644 path = fetchurl {
2645 name = "fast_deep_equal___fast_deep_equal_1.1.0.tgz";
2646 url = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz";
2647 sha1 = "c053477817c86b51daa853c81e059b733d023614";
2648 };
2649 }
2650
2651 {
2652 name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
2653 path = fetchurl {
2654 name = "fast_deep_equal___fast_deep_equal_2.0.1.tgz";
2655 url = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";
2656 sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
2657 };
2658 }
2659
2660 {
2661 name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
2662 path = fetchurl {
2663 name = "fast_json_stable_stringify___fast_json_stable_stringify_2.0.0.tgz";
2664 url = "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";
2665 sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2";
2666 };
2667 }
2668
2669 {
2670 name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
2671 path = fetchurl {
2672 name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
2673 url = "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
2674 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
2675 };
2676 }
2677
2678 {
2679 name = "fastparse___fastparse_1.1.1.tgz";
2680 path = fetchurl {
2681 name = "fastparse___fastparse_1.1.1.tgz";
2682 url = "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz";
2683 sha1 = "d1e2643b38a94d7583b479060e6c4affc94071f8";
2684 };
2685 }
2686
2687 {
2688 name = "faye_websocket___faye_websocket_0.10.0.tgz";
2689 path = fetchurl {
2690 name = "faye_websocket___faye_websocket_0.10.0.tgz";
2691 url = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz";
2692 sha1 = "4e492f8d04dfb6f89003507f6edbf2d501e7c6f4";
2693 };
2694 }
2695
2696 {
2697 name = "faye_websocket___faye_websocket_0.11.1.tgz";
2698 path = fetchurl {
2699 name = "faye_websocket___faye_websocket_0.11.1.tgz";
2700 url = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz";
2701 sha1 = "f0efe18c4f56e4f40afc7e06c719fd5ee6188f38";
2702 };
2703 }
2704
2705 {
2706 name = "file_loader___file_loader_0.10.1.tgz";
2707 path = fetchurl {
2708 name = "file_loader___file_loader_0.10.1.tgz";
2709 url = "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.1.tgz";
2710 sha1 = "815034119891fc6441fb5a64c11bc93c22ddd842";
2711 };
2712 }
2713
2714 {
2715 name = "filename_regex___filename_regex_2.0.1.tgz";
2716 path = fetchurl {
2717 name = "filename_regex___filename_regex_2.0.1.tgz";
2718 url = "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz";
2719 sha1 = "c1c4b9bee3e09725ddb106b75c1e301fe2f18b26";
2720 };
2721 }
2722
2723 {
2724 name = "fill_range___fill_range_2.2.4.tgz";
2725 path = fetchurl {
2726 name = "fill_range___fill_range_2.2.4.tgz";
2727 url = "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz";
2728 sha1 = "eb1e773abb056dcd8df2bfdf6af59b8b3a936565";
2729 };
2730 }
2731
2732 {
2733 name = "fill_range___fill_range_4.0.0.tgz";
2734 path = fetchurl {
2735 name = "fill_range___fill_range_4.0.0.tgz";
2736 url = "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz";
2737 sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
2738 };
2739 }
2740
2741 {
2742 name = "finalhandler___finalhandler_1.1.1.tgz";
2743 path = fetchurl {
2744 name = "finalhandler___finalhandler_1.1.1.tgz";
2745 url = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz";
2746 sha1 = "eebf4ed840079c83f4249038c9d703008301b105";
2747 };
2748 }
2749
2750 {
2751 name = "find_cache_dir___find_cache_dir_1.0.0.tgz";
2752 path = fetchurl {
2753 name = "find_cache_dir___find_cache_dir_1.0.0.tgz";
2754 url = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz";
2755 sha1 = "9288e3e9e3cc3748717d39eade17cf71fc30ee6f";
2756 };
2757 }
2758
2759 {
2760 name = "find_up___find_up_1.1.2.tgz";
2761 path = fetchurl {
2762 name = "find_up___find_up_1.1.2.tgz";
2763 url = "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz";
2764 sha1 = "6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f";
2765 };
2766 }
2767
2768 {
2769 name = "find_up___find_up_2.1.0.tgz";
2770 path = fetchurl {
2771 name = "find_up___find_up_2.1.0.tgz";
2772 url = "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz";
2773 sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
2774 };
2775 }
2776
2777 {
2778 name = "flatten___flatten_1.0.2.tgz";
2779 path = fetchurl {
2780 name = "flatten___flatten_1.0.2.tgz";
2781 url = "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz";
2782 sha1 = "dae46a9d78fbe25292258cc1e780a41d95c03782";
2783 };
2784 }
2785
2786 {
2787 name = "follow_redirects___follow_redirects_1.5.1.tgz";
2788 path = fetchurl {
2789 name = "follow_redirects___follow_redirects_1.5.1.tgz";
2790 url = "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz";
2791 sha1 = "67a8f14f5a1f67f962c2c46469c79eaec0a90291";
2792 };
2793 }
2794
2795 {
2796 name = "for_in___for_in_0.1.8.tgz";
2797 path = fetchurl {
2798 name = "for_in___for_in_0.1.8.tgz";
2799 url = "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz";
2800 sha1 = "d8773908e31256109952b1fdb9b3fa867d2775e1";
2801 };
2802 }
2803
2804 {
2805 name = "for_in___for_in_1.0.2.tgz";
2806 path = fetchurl {
2807 name = "for_in___for_in_1.0.2.tgz";
2808 url = "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz";
2809 sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
2810 };
2811 }
2812
2813 {
2814 name = "for_own___for_own_0.1.5.tgz";
2815 path = fetchurl {
2816 name = "for_own___for_own_0.1.5.tgz";
2817 url = "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz";
2818 sha1 = "5265c681a4f294dabbf17c9509b6763aa84510ce";
2819 };
2820 }
2821
2822 {
2823 name = "for_own___for_own_1.0.0.tgz";
2824 path = fetchurl {
2825 name = "for_own___for_own_1.0.0.tgz";
2826 url = "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz";
2827 sha1 = "c63332f415cedc4b04dbfe70cf836494c53cb44b";
2828 };
2829 }
2830
2831 {
2832 name = "foreach___foreach_2.0.5.tgz";
2833 path = fetchurl {
2834 name = "foreach___foreach_2.0.5.tgz";
2835 url = "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz";
2836 sha1 = "0bee005018aeb260d0a3af3ae658dd0136ec1b99";
2837 };
2838 }
2839
2840 {
2841 name = "forever_agent___forever_agent_0.6.1.tgz";
2842 path = fetchurl {
2843 name = "forever_agent___forever_agent_0.6.1.tgz";
2844 url = "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz";
2845 sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
2846 };
2847 }
2848
2849 {
2850 name = "form_data___form_data_2.1.4.tgz";
2851 path = fetchurl {
2852 name = "form_data___form_data_2.1.4.tgz";
2853 url = "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz";
2854 sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1";
2855 };
2856 }
2857
2858 {
2859 name = "form_data___form_data_2.3.2.tgz";
2860 path = fetchurl {
2861 name = "form_data___form_data_2.3.2.tgz";
2862 url = "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz";
2863 sha1 = "4970498be604c20c005d4f5c23aecd21d6b49099";
2864 };
2865 }
2866
2867 {
2868 name = "forwarded___forwarded_0.1.2.tgz";
2869 path = fetchurl {
2870 name = "forwarded___forwarded_0.1.2.tgz";
2871 url = "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz";
2872 sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84";
2873 };
2874 }
2875
2876 {
2877 name = "fragment_cache___fragment_cache_0.2.1.tgz";
2878 path = fetchurl {
2879 name = "fragment_cache___fragment_cache_0.2.1.tgz";
2880 url = "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz";
2881 sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
2882 };
2883 }
2884
2885 {
2886 name = "fresh___fresh_0.5.2.tgz";
2887 path = fetchurl {
2888 name = "fresh___fresh_0.5.2.tgz";
2889 url = "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz";
2890 sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
2891 };
2892 }
2893
2894 {
2895 name = "friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.0.tgz";
2896 path = fetchurl {
2897 name = "friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.0.tgz";
2898 url = "https://registry.yarnpkg.com/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz";
2899 sha1 = "efc86cbb816224565861a1be7a9d84d0aafea136";
2900 };
2901 }
2902
2903 {
2904 name = "fs_extra___fs_extra_2.1.2.tgz";
2905 path = fetchurl {
2906 name = "fs_extra___fs_extra_2.1.2.tgz";
2907 url = "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz";
2908 sha1 = "046c70163cef9aad46b0e4a7fa467fb22d71de35";
2909 };
2910 }
2911
2912 {
2913 name = "fs_minipass___fs_minipass_1.2.5.tgz";
2914 path = fetchurl {
2915 name = "fs_minipass___fs_minipass_1.2.5.tgz";
2916 url = "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz";
2917 sha1 = "06c277218454ec288df77ada54a03b8702aacb9d";
2918 };
2919 }
2920
2921 {
2922 name = "fs.realpath___fs.realpath_1.0.0.tgz";
2923 path = fetchurl {
2924 name = "fs.realpath___fs.realpath_1.0.0.tgz";
2925 url = "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz";
2926 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
2927 };
2928 }
2929
2930 {
2931 name = "fsevents___fsevents_1.2.4.tgz";
2932 path = fetchurl {
2933 name = "fsevents___fsevents_1.2.4.tgz";
2934 url = "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz";
2935 sha1 = "f41dcb1af2582af3692da36fc55cbd8e1041c426";
2936 };
2937 }
2938
2939 {
2940 name = "fstream___fstream_1.0.11.tgz";
2941 path = fetchurl {
2942 name = "fstream___fstream_1.0.11.tgz";
2943 url = "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz";
2944 sha1 = "5c1fb1f117477114f0632a0eb4b71b3cb0fd3171";
2945 };
2946 }
2947
2948 {
2949 name = "function_bind___function_bind_1.1.1.tgz";
2950 path = fetchurl {
2951 name = "function_bind___function_bind_1.1.1.tgz";
2952 url = "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz";
2953 sha1 = "a56899d3ea3c9bab874bb9773b7c5ede92f4895d";
2954 };
2955 }
2956
2957 {
2958 name = "gauge___gauge_2.7.4.tgz";
2959 path = fetchurl {
2960 name = "gauge___gauge_2.7.4.tgz";
2961 url = "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz";
2962 sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
2963 };
2964 }
2965
2966 {
2967 name = "gaze___gaze_1.1.3.tgz";
2968 path = fetchurl {
2969 name = "gaze___gaze_1.1.3.tgz";
2970 url = "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz";
2971 sha1 = "c441733e13b927ac8c0ff0b4c3b033f28812924a";
2972 };
2973 }
2974
2975 {
2976 name = "get_caller_file___get_caller_file_1.0.3.tgz";
2977 path = fetchurl {
2978 name = "get_caller_file___get_caller_file_1.0.3.tgz";
2979 url = "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz";
2980 sha1 = "f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a";
2981 };
2982 }
2983
2984 {
2985 name = "get_stdin___get_stdin_4.0.1.tgz";
2986 path = fetchurl {
2987 name = "get_stdin___get_stdin_4.0.1.tgz";
2988 url = "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz";
2989 sha1 = "b968c6b0a04384324902e8bf1a5df32579a450fe";
2990 };
2991 }
2992
2993 {
2994 name = "get_stream___get_stream_3.0.0.tgz";
2995 path = fetchurl {
2996 name = "get_stream___get_stream_3.0.0.tgz";
2997 url = "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz";
2998 sha1 = "8e943d1358dc37555054ecbe2edb05aa174ede14";
2999 };
3000 }
3001
3002 {
3003 name = "get_value___get_value_2.0.6.tgz";
3004 path = fetchurl {
3005 name = "get_value___get_value_2.0.6.tgz";
3006 url = "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz";
3007 sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
3008 };
3009 }
3010
3011 {
3012 name = "getpass___getpass_0.1.7.tgz";
3013 path = fetchurl {
3014 name = "getpass___getpass_0.1.7.tgz";
3015 url = "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz";
3016 sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
3017 };
3018 }
3019
3020 {
3021 name = "glob_base___glob_base_0.3.0.tgz";
3022 path = fetchurl {
3023 name = "glob_base___glob_base_0.3.0.tgz";
3024 url = "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz";
3025 sha1 = "dbb164f6221b1c0b1ccf82aea328b497df0ea3c4";
3026 };
3027 }
3028
3029 {
3030 name = "glob_parent___glob_parent_2.0.0.tgz";
3031 path = fetchurl {
3032 name = "glob_parent___glob_parent_2.0.0.tgz";
3033 url = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz";
3034 sha1 = "81383d72db054fcccf5336daa902f182f6edbb28";
3035 };
3036 }
3037
3038 {
3039 name = "glob_parent___glob_parent_3.1.0.tgz";
3040 path = fetchurl {
3041 name = "glob_parent___glob_parent_3.1.0.tgz";
3042 url = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz";
3043 sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
3044 };
3045 }
3046
3047 {
3048 name = "glob___glob_6.0.4.tgz";
3049 path = fetchurl {
3050 name = "glob___glob_6.0.4.tgz";
3051 url = "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz";
3052 sha1 = "0f08860f6a155127b2fadd4f9ce24b1aab6e4d22";
3053 };
3054 }
3055
3056 {
3057 name = "glob___glob_7.1.2.tgz";
3058 path = fetchurl {
3059 name = "glob___glob_7.1.2.tgz";
3060 url = "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz";
3061 sha1 = "c19c9df9a028702d678612384a6552404c636d15";
3062 };
3063 }
3064
3065 {
3066 name = "globals___globals_9.18.0.tgz";
3067 path = fetchurl {
3068 name = "globals___globals_9.18.0.tgz";
3069 url = "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz";
3070 sha1 = "aa3896b3e69b487f17e31ed2143d69a8e30c2d8a";
3071 };
3072 }
3073
3074 {
3075 name = "globby___globby_6.1.0.tgz";
3076 path = fetchurl {
3077 name = "globby___globby_6.1.0.tgz";
3078 url = "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz";
3079 sha1 = "f5a6d70e8395e21c858fb0489d64df02424d506c";
3080 };
3081 }
3082
3083 {
3084 name = "globule___globule_1.2.1.tgz";
3085 path = fetchurl {
3086 name = "globule___globule_1.2.1.tgz";
3087 url = "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz";
3088 sha1 = "5dffb1b191f22d20797a9369b49eab4e9839696d";
3089 };
3090 }
3091
3092 {
3093 name = "graceful_fs___graceful_fs_4.1.11.tgz";
3094 path = fetchurl {
3095 name = "graceful_fs___graceful_fs_4.1.11.tgz";
3096 url = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz";
3097 sha1 = "0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658";
3098 };
3099 }
3100
3101 {
3102 name = "handle_thing___handle_thing_1.2.5.tgz";
3103 path = fetchurl {
3104 name = "handle_thing___handle_thing_1.2.5.tgz";
3105 url = "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz";
3106 sha1 = "fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4";
3107 };
3108 }
3109
3110 {
3111 name = "har_schema___har_schema_1.0.5.tgz";
3112 path = fetchurl {
3113 name = "har_schema___har_schema_1.0.5.tgz";
3114 url = "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz";
3115 sha1 = "d263135f43307c02c602afc8fe95970c0151369e";
3116 };
3117 }
3118
3119 {
3120 name = "har_schema___har_schema_2.0.0.tgz";
3121 path = fetchurl {
3122 name = "har_schema___har_schema_2.0.0.tgz";
3123 url = "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz";
3124 sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
3125 };
3126 }
3127
3128 {
3129 name = "har_validator___har_validator_4.2.1.tgz";
3130 path = fetchurl {
3131 name = "har_validator___har_validator_4.2.1.tgz";
3132 url = "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz";
3133 sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a";
3134 };
3135 }
3136
3137 {
3138 name = "har_validator___har_validator_5.0.3.tgz";
3139 path = fetchurl {
3140 name = "har_validator___har_validator_5.0.3.tgz";
3141 url = "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz";
3142 sha1 = "ba402c266194f15956ef15e0fcf242993f6a7dfd";
3143 };
3144 }
3145
3146 {
3147 name = "has_ansi___has_ansi_2.0.0.tgz";
3148 path = fetchurl {
3149 name = "has_ansi___has_ansi_2.0.0.tgz";
3150 url = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz";
3151 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
3152 };
3153 }
3154
3155 {
3156 name = "has_flag___has_flag_1.0.0.tgz";
3157 path = fetchurl {
3158 name = "has_flag___has_flag_1.0.0.tgz";
3159 url = "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz";
3160 sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa";
3161 };
3162 }
3163
3164 {
3165 name = "has_flag___has_flag_2.0.0.tgz";
3166 path = fetchurl {
3167 name = "has_flag___has_flag_2.0.0.tgz";
3168 url = "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz";
3169 sha1 = "e8207af1cc7b30d446cc70b734b5e8be18f88d51";
3170 };
3171 }
3172
3173 {
3174 name = "has_flag___has_flag_3.0.0.tgz";
3175 path = fetchurl {
3176 name = "has_flag___has_flag_3.0.0.tgz";
3177 url = "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz";
3178 sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
3179 };
3180 }
3181
3182 {
3183 name = "has_unicode___has_unicode_2.0.1.tgz";
3184 path = fetchurl {
3185 name = "has_unicode___has_unicode_2.0.1.tgz";
3186 url = "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz";
3187 sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
3188 };
3189 }
3190
3191 {
3192 name = "has_value___has_value_0.3.1.tgz";
3193 path = fetchurl {
3194 name = "has_value___has_value_0.3.1.tgz";
3195 url = "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz";
3196 sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
3197 };
3198 }
3199
3200 {
3201 name = "has_value___has_value_1.0.0.tgz";
3202 path = fetchurl {
3203 name = "has_value___has_value_1.0.0.tgz";
3204 url = "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz";
3205 sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
3206 };
3207 }
3208
3209 {
3210 name = "has_values___has_values_0.1.4.tgz";
3211 path = fetchurl {
3212 name = "has_values___has_values_0.1.4.tgz";
3213 url = "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz";
3214 sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
3215 };
3216 }
3217
3218 {
3219 name = "has_values___has_values_1.0.0.tgz";
3220 path = fetchurl {
3221 name = "has_values___has_values_1.0.0.tgz";
3222 url = "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz";
3223 sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
3224 };
3225 }
3226
3227 {
3228 name = "has___has_1.0.3.tgz";
3229 path = fetchurl {
3230 name = "has___has_1.0.3.tgz";
3231 url = "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz";
3232 sha1 = "722d7cbfc1f6aa8241f16dd814e011e1f41e8796";
3233 };
3234 }
3235
3236 {
3237 name = "hash_base___hash_base_3.0.4.tgz";
3238 path = fetchurl {
3239 name = "hash_base___hash_base_3.0.4.tgz";
3240 url = "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz";
3241 sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918";
3242 };
3243 }
3244
3245 {
3246 name = "hash.js___hash.js_1.1.5.tgz";
3247 path = fetchurl {
3248 name = "hash.js___hash.js_1.1.5.tgz";
3249 url = "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz";
3250 sha1 = "e38ab4b85dfb1e0c40fe9265c0e9b54854c23812";
3251 };
3252 }
3253
3254 {
3255 name = "hawk___hawk_3.1.3.tgz";
3256 path = fetchurl {
3257 name = "hawk___hawk_3.1.3.tgz";
3258 url = "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz";
3259 sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4";
3260 };
3261 }
3262
3263 {
3264 name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
3265 path = fetchurl {
3266 name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
3267 url = "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz";
3268 sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1";
3269 };
3270 }
3271
3272 {
3273 name = "hoek___hoek_2.16.3.tgz";
3274 path = fetchurl {
3275 name = "hoek___hoek_2.16.3.tgz";
3276 url = "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz";
3277 sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
3278 };
3279 }
3280
3281 {
3282 name = "home_or_tmp___home_or_tmp_2.0.0.tgz";
3283 path = fetchurl {
3284 name = "home_or_tmp___home_or_tmp_2.0.0.tgz";
3285 url = "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz";
3286 sha1 = "e36c3f2d2cae7d746a857e38d18d5f32a7882db8";
3287 };
3288 }
3289
3290 {
3291 name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
3292 path = fetchurl {
3293 name = "hosted_git_info___hosted_git_info_2.7.1.tgz";
3294 url = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz";
3295 sha1 = "97f236977bd6e125408930ff6de3eec6281ec047";
3296 };
3297 }
3298
3299 {
3300 name = "hpack.js___hpack.js_2.1.6.tgz";
3301 path = fetchurl {
3302 name = "hpack.js___hpack.js_2.1.6.tgz";
3303 url = "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz";
3304 sha1 = "87774c0949e513f42e84575b3c45681fade2a0b2";
3305 };
3306 }
3307
3308 {
3309 name = "html_comment_regex___html_comment_regex_1.1.1.tgz";
3310 path = fetchurl {
3311 name = "html_comment_regex___html_comment_regex_1.1.1.tgz";
3312 url = "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz";
3313 sha1 = "668b93776eaae55ebde8f3ad464b307a4963625e";
3314 };
3315 }
3316
3317 {
3318 name = "html_entities___html_entities_1.2.1.tgz";
3319 path = fetchurl {
3320 name = "html_entities___html_entities_1.2.1.tgz";
3321 url = "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz";
3322 sha1 = "0df29351f0721163515dfb9e5543e5f6eed5162f";
3323 };
3324 }
3325
3326 {
3327 name = "htmlparser2___htmlparser2_3.3.0.tgz";
3328 path = fetchurl {
3329 name = "htmlparser2___htmlparser2_3.3.0.tgz";
3330 url = "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz";
3331 sha1 = "cc70d05a59f6542e43f0e685c982e14c924a9efe";
3332 };
3333 }
3334
3335 {
3336 name = "http_deceiver___http_deceiver_1.2.7.tgz";
3337 path = fetchurl {
3338 name = "http_deceiver___http_deceiver_1.2.7.tgz";
3339 url = "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz";
3340 sha1 = "fa7168944ab9a519d337cb0bec7284dc3e723d87";
3341 };
3342 }
3343
3344 {
3345 name = "http_errors___http_errors_1.6.2.tgz";
3346 path = fetchurl {
3347 name = "http_errors___http_errors_1.6.2.tgz";
3348 url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz";
3349 sha1 = "0a002cc85707192a7e7946ceedc11155f60ec736";
3350 };
3351 }
3352
3353 {
3354 name = "http_errors___http_errors_1.6.3.tgz";
3355 path = fetchurl {
3356 name = "http_errors___http_errors_1.6.3.tgz";
3357 url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz";
3358 sha1 = "8b55680bb4be283a0b5bf4ea2e38580be1d9320d";
3359 };
3360 }
3361
3362 {
3363 name = "http_parser_js___http_parser_js_0.4.13.tgz";
3364 path = fetchurl {
3365 name = "http_parser_js___http_parser_js_0.4.13.tgz";
3366 url = "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz";
3367 sha1 = "3bd6d6fde6e3172c9334c3b33b6c193d80fe1137";
3368 };
3369 }
3370
3371 {
3372 name = "http_proxy_middleware___http_proxy_middleware_0.17.4.tgz";
3373 path = fetchurl {
3374 name = "http_proxy_middleware___http_proxy_middleware_0.17.4.tgz";
3375 url = "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz";
3376 sha1 = "642e8848851d66f09d4f124912846dbaeb41b833";
3377 };
3378 }
3379
3380 {
3381 name = "http_proxy___http_proxy_1.17.0.tgz";
3382 path = fetchurl {
3383 name = "http_proxy___http_proxy_1.17.0.tgz";
3384 url = "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz";
3385 sha1 = "7ad38494658f84605e2f6db4436df410f4e5be9a";
3386 };
3387 }
3388
3389 {
3390 name = "http_signature___http_signature_1.1.1.tgz";
3391 path = fetchurl {
3392 name = "http_signature___http_signature_1.1.1.tgz";
3393 url = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz";
3394 sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf";
3395 };
3396 }
3397
3398 {
3399 name = "http_signature___http_signature_1.2.0.tgz";
3400 path = fetchurl {
3401 name = "http_signature___http_signature_1.2.0.tgz";
3402 url = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz";
3403 sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
3404 };
3405 }
3406
3407 {
3408 name = "https_browserify___https_browserify_1.0.0.tgz";
3409 path = fetchurl {
3410 name = "https_browserify___https_browserify_1.0.0.tgz";
3411 url = "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz";
3412 sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
3413 };
3414 }
3415
3416 {
3417 name = "iconv_lite___iconv_lite_0.4.19.tgz";
3418 path = fetchurl {
3419 name = "iconv_lite___iconv_lite_0.4.19.tgz";
3420 url = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz";
3421 sha1 = "f7468f60135f5e5dad3399c0a81be9a1603a082b";
3422 };
3423 }
3424
3425 {
3426 name = "iconv_lite___iconv_lite_0.4.23.tgz";
3427 path = fetchurl {
3428 name = "iconv_lite___iconv_lite_0.4.23.tgz";
3429 url = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz";
3430 sha1 = "297871f63be507adcfbfca715d0cd0eed84e9a63";
3431 };
3432 }
3433
3434 {
3435 name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz";
3436 path = fetchurl {
3437 name = "icss_replace_symbols___icss_replace_symbols_1.1.0.tgz";
3438 url = "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz";
3439 sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded";
3440 };
3441 }
3442
3443 {
3444 name = "ieee754___ieee754_1.1.12.tgz";
3445 path = fetchurl {
3446 name = "ieee754___ieee754_1.1.12.tgz";
3447 url = "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz";
3448 sha1 = "50bf24e5b9c8bb98af4964c941cdb0918da7b60b";
3449 };
3450 }
3451
3452 {
3453 name = "ignore_walk___ignore_walk_3.0.1.tgz";
3454 path = fetchurl {
3455 name = "ignore_walk___ignore_walk_3.0.1.tgz";
3456 url = "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz";
3457 sha1 = "a83e62e7d272ac0e3b551aaa82831a19b69f82f8";
3458 };
3459 }
3460
3461 {
3462 name = "import_local___import_local_1.0.0.tgz";
3463 path = fetchurl {
3464 name = "import_local___import_local_1.0.0.tgz";
3465 url = "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz";
3466 sha1 = "5e4ffdc03f4fe6c009c6729beb29631c2f8227bc";
3467 };
3468 }
3469
3470 {
3471 name = "in_publish___in_publish_2.0.0.tgz";
3472 path = fetchurl {
3473 name = "in_publish___in_publish_2.0.0.tgz";
3474 url = "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz";
3475 sha1 = "e20ff5e3a2afc2690320b6dc552682a9c7fadf51";
3476 };
3477 }
3478
3479 {
3480 name = "indent_string___indent_string_2.1.0.tgz";
3481 path = fetchurl {
3482 name = "indent_string___indent_string_2.1.0.tgz";
3483 url = "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz";
3484 sha1 = "8e2d48348742121b4a8218b7a137e9a52049dc80";
3485 };
3486 }
3487
3488 {
3489 name = "indexes_of___indexes_of_1.0.1.tgz";
3490 path = fetchurl {
3491 name = "indexes_of___indexes_of_1.0.1.tgz";
3492 url = "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz";
3493 sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607";
3494 };
3495 }
3496
3497 {
3498 name = "indexof___indexof_0.0.1.tgz";
3499 path = fetchurl {
3500 name = "indexof___indexof_0.0.1.tgz";
3501 url = "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz";
3502 sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
3503 };
3504 }
3505
3506 {
3507 name = "inflight___inflight_1.0.6.tgz";
3508 path = fetchurl {
3509 name = "inflight___inflight_1.0.6.tgz";
3510 url = "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz";
3511 sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
3512 };
3513 }
3514
3515 {
3516 name = "inherits___inherits_2.0.3.tgz";
3517 path = fetchurl {
3518 name = "inherits___inherits_2.0.3.tgz";
3519 url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz";
3520 sha1 = "633c2c83e3da42a502f52466022480f4208261de";
3521 };
3522 }
3523
3524 {
3525 name = "inherits___inherits_2.0.1.tgz";
3526 path = fetchurl {
3527 name = "inherits___inherits_2.0.1.tgz";
3528 url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz";
3529 sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
3530 };
3531 }
3532
3533 {
3534 name = "ini___ini_1.3.5.tgz";
3535 path = fetchurl {
3536 name = "ini___ini_1.3.5.tgz";
3537 url = "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz";
3538 sha1 = "eee25f56db1c9ec6085e0c22778083f596abf927";
3539 };
3540 }
3541
3542 {
3543 name = "internal_ip___internal_ip_1.2.0.tgz";
3544 path = fetchurl {
3545 name = "internal_ip___internal_ip_1.2.0.tgz";
3546 url = "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz";
3547 sha1 = "ae9fbf93b984878785d50a8de1b356956058cf5c";
3548 };
3549 }
3550
3551 {
3552 name = "interpret___interpret_1.1.0.tgz";
3553 path = fetchurl {
3554 name = "interpret___interpret_1.1.0.tgz";
3555 url = "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz";
3556 sha1 = "7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614";
3557 };
3558 }
3559
3560 {
3561 name = "invariant___invariant_2.2.4.tgz";
3562 path = fetchurl {
3563 name = "invariant___invariant_2.2.4.tgz";
3564 url = "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz";
3565 sha1 = "610f3c92c9359ce1db616e538008d23ff35158e6";
3566 };
3567 }
3568
3569 {
3570 name = "invert_kv___invert_kv_1.0.0.tgz";
3571 path = fetchurl {
3572 name = "invert_kv___invert_kv_1.0.0.tgz";
3573 url = "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz";
3574 sha1 = "104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6";
3575 };
3576 }
3577
3578 {
3579 name = "ip___ip_1.1.5.tgz";
3580 path = fetchurl {
3581 name = "ip___ip_1.1.5.tgz";
3582 url = "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz";
3583 sha1 = "bdded70114290828c0a039e72ef25f5aaec4354a";
3584 };
3585 }
3586
3587 {
3588 name = "ipaddr.js___ipaddr.js_1.8.0.tgz";
3589 path = fetchurl {
3590 name = "ipaddr.js___ipaddr.js_1.8.0.tgz";
3591 url = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz";
3592 sha1 = "eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e";
3593 };
3594 }
3595
3596 {
3597 name = "is_absolute_url___is_absolute_url_2.1.0.tgz";
3598 path = fetchurl {
3599 name = "is_absolute_url___is_absolute_url_2.1.0.tgz";
3600 url = "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz";
3601 sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6";
3602 };
3603 }
3604
3605 {
3606 name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
3607 path = fetchurl {
3608 name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
3609 url = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
3610 sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
3611 };
3612 }
3613
3614 {
3615 name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
3616 path = fetchurl {
3617 name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
3618 url = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
3619 sha1 = "169c2f6d3df1f992618072365c9b0ea1f6878656";
3620 };
3621 }
3622
3623 {
3624 name = "is_arrayish___is_arrayish_0.2.1.tgz";
3625 path = fetchurl {
3626 name = "is_arrayish___is_arrayish_0.2.1.tgz";
3627 url = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz";
3628 sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
3629 };
3630 }
3631
3632 {
3633 name = "is_binary_path___is_binary_path_1.0.1.tgz";
3634 path = fetchurl {
3635 name = "is_binary_path___is_binary_path_1.0.1.tgz";
3636 url = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz";
3637 sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
3638 };
3639 }
3640
3641 {
3642 name = "is_buffer___is_buffer_1.1.6.tgz";
3643 path = fetchurl {
3644 name = "is_buffer___is_buffer_1.1.6.tgz";
3645 url = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz";
3646 sha1 = "efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be";
3647 };
3648 }
3649
3650 {
3651 name = "is_builtin_module___is_builtin_module_1.0.0.tgz";
3652 path = fetchurl {
3653 name = "is_builtin_module___is_builtin_module_1.0.0.tgz";
3654 url = "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz";
3655 sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe";
3656 };
3657 }
3658
3659 {
3660 name = "is_callable___is_callable_1.1.4.tgz";
3661 path = fetchurl {
3662 name = "is_callable___is_callable_1.1.4.tgz";
3663 url = "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz";
3664 sha1 = "1e1adf219e1eeb684d691f9d6a05ff0d30a24d75";
3665 };
3666 }
3667
3668 {
3669 name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
3670 path = fetchurl {
3671 name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
3672 url = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
3673 sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
3674 };
3675 }
3676
3677 {
3678 name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
3679 path = fetchurl {
3680 name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
3681 url = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
3682 sha1 = "d84876321d0e7add03990406abbbbd36ba9268c7";
3683 };
3684 }
3685
3686 {
3687 name = "is_date_object___is_date_object_1.0.1.tgz";
3688 path = fetchurl {
3689 name = "is_date_object___is_date_object_1.0.1.tgz";
3690 url = "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz";
3691 sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16";
3692 };
3693 }
3694
3695 {
3696 name = "is_descriptor___is_descriptor_0.1.6.tgz";
3697 path = fetchurl {
3698 name = "is_descriptor___is_descriptor_0.1.6.tgz";
3699 url = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz";
3700 sha1 = "366d8240dde487ca51823b1ab9f07a10a78251ca";
3701 };
3702 }
3703
3704 {
3705 name = "is_descriptor___is_descriptor_1.0.2.tgz";
3706 path = fetchurl {
3707 name = "is_descriptor___is_descriptor_1.0.2.tgz";
3708 url = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz";
3709 sha1 = "3b159746a66604b04f8c81524ba365c5f14d86ec";
3710 };
3711 }
3712
3713 {
3714 name = "is_dotfile___is_dotfile_1.0.3.tgz";
3715 path = fetchurl {
3716 name = "is_dotfile___is_dotfile_1.0.3.tgz";
3717 url = "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz";
3718 sha1 = "a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1";
3719 };
3720 }
3721
3722 {
3723 name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
3724 path = fetchurl {
3725 name = "is_equal_shallow___is_equal_shallow_0.1.3.tgz";
3726 url = "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz";
3727 sha1 = "2238098fc221de0bcfa5d9eac4c45d638aa1c534";
3728 };
3729 }
3730
3731 {
3732 name = "is_extendable___is_extendable_0.1.1.tgz";
3733 path = fetchurl {
3734 name = "is_extendable___is_extendable_0.1.1.tgz";
3735 url = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz";
3736 sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
3737 };
3738 }
3739
3740 {
3741 name = "is_extendable___is_extendable_1.0.1.tgz";
3742 path = fetchurl {
3743 name = "is_extendable___is_extendable_1.0.1.tgz";
3744 url = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz";
3745 sha1 = "a7470f9e426733d81bd81e1155264e3a3507cab4";
3746 };
3747 }
3748
3749 {
3750 name = "is_extglob___is_extglob_1.0.0.tgz";
3751 path = fetchurl {
3752 name = "is_extglob___is_extglob_1.0.0.tgz";
3753 url = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz";
3754 sha1 = "ac468177c4943405a092fc8f29760c6ffc6206c0";
3755 };
3756 }
3757
3758 {
3759 name = "is_extglob___is_extglob_2.1.1.tgz";
3760 path = fetchurl {
3761 name = "is_extglob___is_extglob_2.1.1.tgz";
3762 url = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz";
3763 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
3764 };
3765 }
3766
3767 {
3768 name = "is_finite___is_finite_1.0.2.tgz";
3769 path = fetchurl {
3770 name = "is_finite___is_finite_1.0.2.tgz";
3771 url = "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz";
3772 sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa";
3773 };
3774 }
3775
3776 {
3777 name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
3778 path = fetchurl {
3779 name = "is_fullwidth_code_point___is_fullwidth_code_point_1.0.0.tgz";
3780 url = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
3781 sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
3782 };
3783 }
3784
3785 {
3786 name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
3787 path = fetchurl {
3788 name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
3789 url = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
3790 sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
3791 };
3792 }
3793
3794 {
3795 name = "is_glob___is_glob_2.0.1.tgz";
3796 path = fetchurl {
3797 name = "is_glob___is_glob_2.0.1.tgz";
3798 url = "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz";
3799 sha1 = "d096f926a3ded5600f3fdfd91198cb0888c2d863";
3800 };
3801 }
3802
3803 {
3804 name = "is_glob___is_glob_3.1.0.tgz";
3805 path = fetchurl {
3806 name = "is_glob___is_glob_3.1.0.tgz";
3807 url = "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz";
3808 sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
3809 };
3810 }
3811
3812 {
3813 name = "is_glob___is_glob_4.0.0.tgz";
3814 path = fetchurl {
3815 name = "is_glob___is_glob_4.0.0.tgz";
3816 url = "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz";
3817 sha1 = "9521c76845cc2610a85203ddf080a958c2ffabc0";
3818 };
3819 }
3820
3821 {
3822 name = "is_number___is_number_2.1.0.tgz";
3823 path = fetchurl {
3824 name = "is_number___is_number_2.1.0.tgz";
3825 url = "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz";
3826 sha1 = "01fcbbb393463a548f2f466cce16dece49db908f";
3827 };
3828 }
3829
3830 {
3831 name = "is_number___is_number_3.0.0.tgz";
3832 path = fetchurl {
3833 name = "is_number___is_number_3.0.0.tgz";
3834 url = "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz";
3835 sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
3836 };
3837 }
3838
3839 {
3840 name = "is_number___is_number_4.0.0.tgz";
3841 path = fetchurl {
3842 name = "is_number___is_number_4.0.0.tgz";
3843 url = "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz";
3844 sha1 = "0026e37f5454d73e356dfe6564699867c6a7f0ff";
3845 };
3846 }
3847
3848 {
3849 name = "is_path_cwd___is_path_cwd_1.0.0.tgz";
3850 path = fetchurl {
3851 name = "is_path_cwd___is_path_cwd_1.0.0.tgz";
3852 url = "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz";
3853 sha1 = "d225ec23132e89edd38fda767472e62e65f1106d";
3854 };
3855 }
3856
3857 {
3858 name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz";
3859 path = fetchurl {
3860 name = "is_path_in_cwd___is_path_in_cwd_1.0.1.tgz";
3861 url = "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz";
3862 sha1 = "5ac48b345ef675339bd6c7a48a912110b241cf52";
3863 };
3864 }
3865
3866 {
3867 name = "is_path_inside___is_path_inside_1.0.1.tgz";
3868 path = fetchurl {
3869 name = "is_path_inside___is_path_inside_1.0.1.tgz";
3870 url = "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz";
3871 sha1 = "8ef5b7de50437a3fdca6b4e865ef7aa55cb48036";
3872 };
3873 }
3874
3875 {
3876 name = "is_plain_obj___is_plain_obj_1.1.0.tgz";
3877 path = fetchurl {
3878 name = "is_plain_obj___is_plain_obj_1.1.0.tgz";
3879 url = "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz";
3880 sha1 = "71a50c8429dfca773c92a390a4a03b39fcd51d3e";
3881 };
3882 }
3883
3884 {
3885 name = "is_plain_object___is_plain_object_2.0.4.tgz";
3886 path = fetchurl {
3887 name = "is_plain_object___is_plain_object_2.0.4.tgz";
3888 url = "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz";
3889 sha1 = "2c163b3fafb1b606d9d17928f05c2a1c38e07677";
3890 };
3891 }
3892
3893 {
3894 name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
3895 path = fetchurl {
3896 name = "is_posix_bracket___is_posix_bracket_0.1.1.tgz";
3897 url = "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz";
3898 sha1 = "3334dc79774368e92f016e6fbc0a88f5cd6e6bc4";
3899 };
3900 }
3901
3902 {
3903 name = "is_primitive___is_primitive_2.0.0.tgz";
3904 path = fetchurl {
3905 name = "is_primitive___is_primitive_2.0.0.tgz";
3906 url = "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz";
3907 sha1 = "207bab91638499c07b2adf240a41a87210034575";
3908 };
3909 }
3910
3911 {
3912 name = "is_regex___is_regex_1.0.4.tgz";
3913 path = fetchurl {
3914 name = "is_regex___is_regex_1.0.4.tgz";
3915 url = "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz";
3916 sha1 = "5517489b547091b0930e095654ced25ee97e9491";
3917 };
3918 }
3919
3920 {
3921 name = "is_stream___is_stream_1.1.0.tgz";
3922 path = fetchurl {
3923 name = "is_stream___is_stream_1.1.0.tgz";
3924 url = "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz";
3925 sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
3926 };
3927 }
3928
3929 {
3930 name = "is_svg___is_svg_2.1.0.tgz";
3931 path = fetchurl {
3932 name = "is_svg___is_svg_2.1.0.tgz";
3933 url = "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz";
3934 sha1 = "cf61090da0d9efbcab8722deba6f032208dbb0e9";
3935 };
3936 }
3937
3938 {
3939 name = "is_symbol___is_symbol_1.0.1.tgz";
3940 path = fetchurl {
3941 name = "is_symbol___is_symbol_1.0.1.tgz";
3942 url = "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz";
3943 sha1 = "3cc59f00025194b6ab2e38dbae6689256b660572";
3944 };
3945 }
3946
3947 {
3948 name = "is_typedarray___is_typedarray_1.0.0.tgz";
3949 path = fetchurl {
3950 name = "is_typedarray___is_typedarray_1.0.0.tgz";
3951 url = "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz";
3952 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
3953 };
3954 }
3955
3956 {
3957 name = "is_utf8___is_utf8_0.2.1.tgz";
3958 path = fetchurl {
3959 name = "is_utf8___is_utf8_0.2.1.tgz";
3960 url = "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz";
3961 sha1 = "4b0da1442104d1b336340e80797e865cf39f7d72";
3962 };
3963 }
3964
3965 {
3966 name = "is_windows___is_windows_1.0.2.tgz";
3967 path = fetchurl {
3968 name = "is_windows___is_windows_1.0.2.tgz";
3969 url = "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz";
3970 sha1 = "d1850eb9791ecd18e6182ce12a30f396634bb19d";
3971 };
3972 }
3973
3974 {
3975 name = "is_wsl___is_wsl_1.1.0.tgz";
3976 path = fetchurl {
3977 name = "is_wsl___is_wsl_1.1.0.tgz";
3978 url = "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz";
3979 sha1 = "1f16e4aa22b04d1336b66188a66af3c600c3a66d";
3980 };
3981 }
3982
3983 {
3984 name = "isarray___isarray_0.0.1.tgz";
3985 path = fetchurl {
3986 name = "isarray___isarray_0.0.1.tgz";
3987 url = "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz";
3988 sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
3989 };
3990 }
3991
3992 {
3993 name = "isarray___isarray_1.0.0.tgz";
3994 path = fetchurl {
3995 name = "isarray___isarray_1.0.0.tgz";
3996 url = "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz";
3997 sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
3998 };
3999 }
4000
4001 {
4002 name = "isexe___isexe_2.0.0.tgz";
4003 path = fetchurl {
4004 name = "isexe___isexe_2.0.0.tgz";
4005 url = "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz";
4006 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
4007 };
4008 }
4009
4010 {
4011 name = "isobject___isobject_2.1.0.tgz";
4012 path = fetchurl {
4013 name = "isobject___isobject_2.1.0.tgz";
4014 url = "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz";
4015 sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
4016 };
4017 }
4018
4019 {
4020 name = "isobject___isobject_3.0.1.tgz";
4021 path = fetchurl {
4022 name = "isobject___isobject_3.0.1.tgz";
4023 url = "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz";
4024 sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
4025 };
4026 }
4027
4028 {
4029 name = "isstream___isstream_0.1.2.tgz";
4030 path = fetchurl {
4031 name = "isstream___isstream_0.1.2.tgz";
4032 url = "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz";
4033 sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
4034 };
4035 }
4036
4037 {
4038 name = "jquery___jquery_3.3.1.tgz";
4039 path = fetchurl {
4040 name = "jquery___jquery_3.3.1.tgz";
4041 url = "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz";
4042 sha1 = "958ce29e81c9790f31be7792df5d4d95fc57fbca";
4043 };
4044 }
4045
4046 {
4047 name = "js_base64___js_base64_2.4.8.tgz";
4048 path = fetchurl {
4049 name = "js_base64___js_base64_2.4.8.tgz";
4050 url = "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz";
4051 sha1 = "57a9b130888f956834aa40c5b165ba59c758f033";
4052 };
4053 }
4054
4055 {
4056 name = "js_tokens___js_tokens_4.0.0.tgz";
4057 path = fetchurl {
4058 name = "js_tokens___js_tokens_4.0.0.tgz";
4059 url = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz";
4060 sha1 = "19203fb59991df98e3a287050d4647cdeaf32499";
4061 };
4062 }
4063
4064 {
4065 name = "js_tokens___js_tokens_3.0.2.tgz";
4066 path = fetchurl {
4067 name = "js_tokens___js_tokens_3.0.2.tgz";
4068 url = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz";
4069 sha1 = "9866df395102130e38f7f996bceb65443209c25b";
4070 };
4071 }
4072
4073 {
4074 name = "js_yaml___js_yaml_3.7.0.tgz";
4075 path = fetchurl {
4076 name = "js_yaml___js_yaml_3.7.0.tgz";
4077 url = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz";
4078 sha1 = "5c967ddd837a9bfdca5f2de84253abe8a1c03b80";
4079 };
4080 }
4081
4082 {
4083 name = "jsbn___jsbn_0.1.1.tgz";
4084 path = fetchurl {
4085 name = "jsbn___jsbn_0.1.1.tgz";
4086 url = "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz";
4087 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
4088 };
4089 }
4090
4091 {
4092 name = "jsesc___jsesc_1.3.0.tgz";
4093 path = fetchurl {
4094 name = "jsesc___jsesc_1.3.0.tgz";
4095 url = "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz";
4096 sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b";
4097 };
4098 }
4099
4100 {
4101 name = "jsesc___jsesc_0.5.0.tgz";
4102 path = fetchurl {
4103 name = "jsesc___jsesc_0.5.0.tgz";
4104 url = "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz";
4105 sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
4106 };
4107 }
4108
4109 {
4110 name = "json_loader___json_loader_0.5.7.tgz";
4111 path = fetchurl {
4112 name = "json_loader___json_loader_0.5.7.tgz";
4113 url = "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz";
4114 sha1 = "dca14a70235ff82f0ac9a3abeb60d337a365185d";
4115 };
4116 }
4117
4118 {
4119 name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz";
4120 path = fetchurl {
4121 name = "json_schema_traverse___json_schema_traverse_0.3.1.tgz";
4122 url = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz";
4123 sha1 = "349a6d44c53a51de89b40805c5d5e59b417d3340";
4124 };
4125 }
4126
4127 {
4128 name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
4129 path = fetchurl {
4130 name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
4131 url = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
4132 sha1 = "69f6a87d9513ab8bb8fe63bdb0979c448e684660";
4133 };
4134 }
4135
4136 {
4137 name = "json_schema___json_schema_0.2.3.tgz";
4138 path = fetchurl {
4139 name = "json_schema___json_schema_0.2.3.tgz";
4140 url = "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz";
4141 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
4142 };
4143 }
4144
4145 {
4146 name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
4147 path = fetchurl {
4148 name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
4149 url = "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz";
4150 sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af";
4151 };
4152 }
4153
4154 {
4155 name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
4156 path = fetchurl {
4157 name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
4158 url = "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
4159 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
4160 };
4161 }
4162
4163 {
4164 name = "json3___json3_3.3.2.tgz";
4165 path = fetchurl {
4166 name = "json3___json3_3.3.2.tgz";
4167 url = "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz";
4168 sha1 = "3c0434743df93e2f5c42aee7b19bcb483575f4e1";
4169 };
4170 }
4171
4172 {
4173 name = "json5___json5_0.5.1.tgz";
4174 path = fetchurl {
4175 name = "json5___json5_0.5.1.tgz";
4176 url = "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz";
4177 sha1 = "1eade7acc012034ad84e2396767ead9fa5495821";
4178 };
4179 }
4180
4181 {
4182 name = "jsonfile___jsonfile_2.4.0.tgz";
4183 path = fetchurl {
4184 name = "jsonfile___jsonfile_2.4.0.tgz";
4185 url = "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz";
4186 sha1 = "3736a2b428b87bbda0cc83b53fa3d633a35c2ae8";
4187 };
4188 }
4189
4190 {
4191 name = "jsonify___jsonify_0.0.0.tgz";
4192 path = fetchurl {
4193 name = "jsonify___jsonify_0.0.0.tgz";
4194 url = "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz";
4195 sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73";
4196 };
4197 }
4198
4199 {
4200 name = "jsprim___jsprim_1.4.1.tgz";
4201 path = fetchurl {
4202 name = "jsprim___jsprim_1.4.1.tgz";
4203 url = "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz";
4204 sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
4205 };
4206 }
4207
4208 {
4209 name = "killable___killable_1.0.0.tgz";
4210 path = fetchurl {
4211 name = "killable___killable_1.0.0.tgz";
4212 url = "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz";
4213 sha1 = "da8b84bd47de5395878f95d64d02f2449fe05e6b";
4214 };
4215 }
4216
4217 {
4218 name = "kind_of___kind_of_3.2.2.tgz";
4219 path = fetchurl {
4220 name = "kind_of___kind_of_3.2.2.tgz";
4221 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz";
4222 sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
4223 };
4224 }
4225
4226 {
4227 name = "kind_of___kind_of_4.0.0.tgz";
4228 path = fetchurl {
4229 name = "kind_of___kind_of_4.0.0.tgz";
4230 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz";
4231 sha1 = "20813df3d712928b207378691a45066fae72dd57";
4232 };
4233 }
4234
4235 {
4236 name = "kind_of___kind_of_5.1.0.tgz";
4237 path = fetchurl {
4238 name = "kind_of___kind_of_5.1.0.tgz";
4239 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz";
4240 sha1 = "729c91e2d857b7a419a1f9aa65685c4c33f5845d";
4241 };
4242 }
4243
4244 {
4245 name = "kind_of___kind_of_6.0.2.tgz";
4246 path = fetchurl {
4247 name = "kind_of___kind_of_6.0.2.tgz";
4248 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz";
4249 sha1 = "01146b36a6218e64e58f3a8d66de5d7fc6f6d051";
4250 };
4251 }
4252
4253 {
4254 name = "lazy_cache___lazy_cache_1.0.4.tgz";
4255 path = fetchurl {
4256 name = "lazy_cache___lazy_cache_1.0.4.tgz";
4257 url = "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz";
4258 sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e";
4259 };
4260 }
4261
4262 {
4263 name = "lcid___lcid_1.0.0.tgz";
4264 path = fetchurl {
4265 name = "lcid___lcid_1.0.0.tgz";
4266 url = "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz";
4267 sha1 = "308accafa0bc483a3867b4b6f2b9506251d1b835";
4268 };
4269 }
4270
4271 {
4272 name = "load_json_file___load_json_file_1.1.0.tgz";
4273 path = fetchurl {
4274 name = "load_json_file___load_json_file_1.1.0.tgz";
4275 url = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz";
4276 sha1 = "956905708d58b4bab4c2261b04f59f31c99374c0";
4277 };
4278 }
4279
4280 {
4281 name = "load_json_file___load_json_file_2.0.0.tgz";
4282 path = fetchurl {
4283 name = "load_json_file___load_json_file_2.0.0.tgz";
4284 url = "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz";
4285 sha1 = "7947e42149af80d696cbf797bcaabcfe1fe29ca8";
4286 };
4287 }
4288
4289 {
4290 name = "loader_runner___loader_runner_2.3.0.tgz";
4291 path = fetchurl {
4292 name = "loader_runner___loader_runner_2.3.0.tgz";
4293 url = "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz";
4294 sha1 = "f482aea82d543e07921700d5a46ef26fdac6b8a2";
4295 };
4296 }
4297
4298 {
4299 name = "loader_utils___loader_utils_1.1.0.tgz";
4300 path = fetchurl {
4301 name = "loader_utils___loader_utils_1.1.0.tgz";
4302 url = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz";
4303 sha1 = "c98aef488bcceda2ffb5e2de646d6a754429f5cd";
4304 };
4305 }
4306
4307 {
4308 name = "locate_path___locate_path_2.0.0.tgz";
4309 path = fetchurl {
4310 name = "locate_path___locate_path_2.0.0.tgz";
4311 url = "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz";
4312 sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
4313 };
4314 }
4315
4316 {
4317 name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz";
4318 path = fetchurl {
4319 name = "lodash._baseassign___lodash._baseassign_3.2.0.tgz";
4320 url = "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz";
4321 sha1 = "8c38a099500f215ad09e59f1722fd0c52bfe0a4e";
4322 };
4323 }
4324
4325 {
4326 name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz";
4327 path = fetchurl {
4328 name = "lodash._basecopy___lodash._basecopy_3.0.1.tgz";
4329 url = "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz";
4330 sha1 = "8da0e6a876cf344c0ad8a54882111dd3c5c7ca36";
4331 };
4332 }
4333
4334 {
4335 name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz";
4336 path = fetchurl {
4337 name = "lodash._bindcallback___lodash._bindcallback_3.0.1.tgz";
4338 url = "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz";
4339 sha1 = "e531c27644cf8b57a99e17ed95b35c748789392e";
4340 };
4341 }
4342
4343 {
4344 name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz";
4345 path = fetchurl {
4346 name = "lodash._createassigner___lodash._createassigner_3.1.1.tgz";
4347 url = "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz";
4348 sha1 = "838a5bae2fdaca63ac22dee8e19fa4e6d6970b11";
4349 };
4350 }
4351
4352 {
4353 name = "lodash._getnative___lodash._getnative_3.9.1.tgz";
4354 path = fetchurl {
4355 name = "lodash._getnative___lodash._getnative_3.9.1.tgz";
4356 url = "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz";
4357 sha1 = "570bc7dede46d61cdcde687d65d3eecbaa3aaff5";
4358 };
4359 }
4360
4361 {
4362 name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz";
4363 path = fetchurl {
4364 name = "lodash._isiterateecall___lodash._isiterateecall_3.0.9.tgz";
4365 url = "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz";
4366 sha1 = "5203ad7ba425fae842460e696db9cf3e6aac057c";
4367 };
4368 }
4369
4370 {
4371 name = "lodash.assign___lodash.assign_3.2.0.tgz";
4372 path = fetchurl {
4373 name = "lodash.assign___lodash.assign_3.2.0.tgz";
4374 url = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz";
4375 sha1 = "3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa";
4376 };
4377 }
4378
4379 {
4380 name = "lodash.assign___lodash.assign_4.2.0.tgz";
4381 path = fetchurl {
4382 name = "lodash.assign___lodash.assign_4.2.0.tgz";
4383 url = "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz";
4384 sha1 = "0d99f3ccd7a6d261d19bdaeb9245005d285808e7";
4385 };
4386 }
4387
4388 {
4389 name = "lodash.camelcase___lodash.camelcase_4.3.0.tgz";
4390 path = fetchurl {
4391 name = "lodash.camelcase___lodash.camelcase_4.3.0.tgz";
4392 url = "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz";
4393 sha1 = "b28aa6288a2b9fc651035c7711f65ab6190331a6";
4394 };
4395 }
4396
4397 {
4398 name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
4399 path = fetchurl {
4400 name = "lodash.clonedeep___lodash.clonedeep_4.5.0.tgz";
4401 url = "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz";
4402 sha1 = "e23f3f9c4f8fbdde872529c1071857a086e5ccef";
4403 };
4404 }
4405
4406 {
4407 name = "lodash.debounce___lodash.debounce_4.0.8.tgz";
4408 path = fetchurl {
4409 name = "lodash.debounce___lodash.debounce_4.0.8.tgz";
4410 url = "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz";
4411 sha1 = "82d79bff30a67c4005ffd5e2515300ad9ca4d7af";
4412 };
4413 }
4414
4415 {
4416 name = "lodash.defaults___lodash.defaults_3.1.2.tgz";
4417 path = fetchurl {
4418 name = "lodash.defaults___lodash.defaults_3.1.2.tgz";
4419 url = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz";
4420 sha1 = "c7308b18dbf8bc9372d701a73493c61192bd2e2c";
4421 };
4422 }
4423
4424 {
4425 name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
4426 path = fetchurl {
4427 name = "lodash.defaults___lodash.defaults_4.2.0.tgz";
4428 url = "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz";
4429 sha1 = "d09178716ffea4dde9e5fb7b37f6f0802274580c";
4430 };
4431 }
4432
4433 {
4434 name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz";
4435 path = fetchurl {
4436 name = "lodash.isarguments___lodash.isarguments_3.1.0.tgz";
4437 url = "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz";
4438 sha1 = "2f573d85c6a24289ff00663b491c1d338ff3458a";
4439 };
4440 }
4441
4442 {
4443 name = "lodash.isarray___lodash.isarray_3.0.4.tgz";
4444 path = fetchurl {
4445 name = "lodash.isarray___lodash.isarray_3.0.4.tgz";
4446 url = "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz";
4447 sha1 = "79e4eb88c36a8122af86f844aa9bcd851b5fbb55";
4448 };
4449 }
4450
4451 {
4452 name = "lodash.keys___lodash.keys_3.1.2.tgz";
4453 path = fetchurl {
4454 name = "lodash.keys___lodash.keys_3.1.2.tgz";
4455 url = "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz";
4456 sha1 = "4dbc0472b156be50a0b286855d1bd0b0c656098a";
4457 };
4458 }
4459
4460 {
4461 name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
4462 path = fetchurl {
4463 name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
4464 url = "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz";
4465 sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe";
4466 };
4467 }
4468
4469 {
4470 name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz";
4471 path = fetchurl {
4472 name = "lodash.mergewith___lodash.mergewith_4.6.1.tgz";
4473 url = "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz";
4474 sha1 = "639057e726c3afbdb3e7d42741caa8d6e4335927";
4475 };
4476 }
4477
4478 {
4479 name = "lodash.restparam___lodash.restparam_3.6.1.tgz";
4480 path = fetchurl {
4481 name = "lodash.restparam___lodash.restparam_3.6.1.tgz";
4482 url = "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz";
4483 sha1 = "936a4e309ef330a7645ed4145986c85ae5b20805";
4484 };
4485 }
4486
4487 {
4488 name = "lodash.tail___lodash.tail_4.1.1.tgz";
4489 path = fetchurl {
4490 name = "lodash.tail___lodash.tail_4.1.1.tgz";
4491 url = "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz";
4492 sha1 = "d2333a36d9e7717c8ad2f7cacafec7c32b444664";
4493 };
4494 }
4495
4496 {
4497 name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
4498 path = fetchurl {
4499 name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
4500 url = "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
4501 sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
4502 };
4503 }
4504
4505 {
4506 name = "lodash___lodash_4.17.10.tgz";
4507 path = fetchurl {
4508 name = "lodash___lodash_4.17.10.tgz";
4509 url = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz";
4510 sha1 = "1b7793cf7259ea38fb3661d4d38b3260af8ae4e7";
4511 };
4512 }
4513
4514 {
4515 name = "loglevel___loglevel_1.6.1.tgz";
4516 path = fetchurl {
4517 name = "loglevel___loglevel_1.6.1.tgz";
4518 url = "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz";
4519 sha1 = "e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa";
4520 };
4521 }
4522
4523 {
4524 name = "longest___longest_1.0.1.tgz";
4525 path = fetchurl {
4526 name = "longest___longest_1.0.1.tgz";
4527 url = "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz";
4528 sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097";
4529 };
4530 }
4531
4532 {
4533 name = "loose_envify___loose_envify_1.4.0.tgz";
4534 path = fetchurl {
4535 name = "loose_envify___loose_envify_1.4.0.tgz";
4536 url = "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz";
4537 sha1 = "71ee51fa7be4caec1a63839f7e682d8132d30caf";
4538 };
4539 }
4540
4541 {
4542 name = "loud_rejection___loud_rejection_1.6.0.tgz";
4543 path = fetchurl {
4544 name = "loud_rejection___loud_rejection_1.6.0.tgz";
4545 url = "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz";
4546 sha1 = "5b46f80147edee578870f086d04821cf998e551f";
4547 };
4548 }
4549
4550 {
4551 name = "lru_cache___lru_cache_4.1.3.tgz";
4552 path = fetchurl {
4553 name = "lru_cache___lru_cache_4.1.3.tgz";
4554 url = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz";
4555 sha1 = "a1175cf3496dfc8436c156c334b4955992bce69c";
4556 };
4557 }
4558
4559 {
4560 name = "make_dir___make_dir_1.3.0.tgz";
4561 path = fetchurl {
4562 name = "make_dir___make_dir_1.3.0.tgz";
4563 url = "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz";
4564 sha1 = "79c1033b80515bd6d24ec9933e860ca75ee27f0c";
4565 };
4566 }
4567
4568 {
4569 name = "map_cache___map_cache_0.2.2.tgz";
4570 path = fetchurl {
4571 name = "map_cache___map_cache_0.2.2.tgz";
4572 url = "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz";
4573 sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
4574 };
4575 }
4576
4577 {
4578 name = "map_obj___map_obj_1.0.1.tgz";
4579 path = fetchurl {
4580 name = "map_obj___map_obj_1.0.1.tgz";
4581 url = "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz";
4582 sha1 = "d933ceb9205d82bdcf4886f6742bdc2b4dea146d";
4583 };
4584 }
4585
4586 {
4587 name = "map_visit___map_visit_1.0.0.tgz";
4588 path = fetchurl {
4589 name = "map_visit___map_visit_1.0.0.tgz";
4590 url = "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz";
4591 sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
4592 };
4593 }
4594
4595 {
4596 name = "math_expression_evaluator___math_expression_evaluator_1.2.17.tgz";
4597 path = fetchurl {
4598 name = "math_expression_evaluator___math_expression_evaluator_1.2.17.tgz";
4599 url = "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz";
4600 sha1 = "de819fdbcd84dccd8fae59c6aeb79615b9d266ac";
4601 };
4602 }
4603
4604 {
4605 name = "math_random___math_random_1.0.1.tgz";
4606 path = fetchurl {
4607 name = "math_random___math_random_1.0.1.tgz";
4608 url = "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz";
4609 sha1 = "8b3aac588b8a66e4975e3cdea67f7bb329601fac";
4610 };
4611 }
4612
4613 {
4614 name = "md5.js___md5.js_1.3.4.tgz";
4615 path = fetchurl {
4616 name = "md5.js___md5.js_1.3.4.tgz";
4617 url = "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz";
4618 sha1 = "e9bdbde94a20a5ac18b04340fc5764d5b09d901d";
4619 };
4620 }
4621
4622 {
4623 name = "media_typer___media_typer_0.3.0.tgz";
4624 path = fetchurl {
4625 name = "media_typer___media_typer_0.3.0.tgz";
4626 url = "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz";
4627 sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
4628 };
4629 }
4630
4631 {
4632 name = "mem___mem_1.1.0.tgz";
4633 path = fetchurl {
4634 name = "mem___mem_1.1.0.tgz";
4635 url = "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz";
4636 sha1 = "5edd52b485ca1d900fe64895505399a0dfa45f76";
4637 };
4638 }
4639
4640 {
4641 name = "memory_fs___memory_fs_0.4.1.tgz";
4642 path = fetchurl {
4643 name = "memory_fs___memory_fs_0.4.1.tgz";
4644 url = "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz";
4645 sha1 = "3a9a20b8462523e447cfbc7e8bb80ed667bfc552";
4646 };
4647 }
4648
4649 {
4650 name = "meow___meow_3.7.0.tgz";
4651 path = fetchurl {
4652 name = "meow___meow_3.7.0.tgz";
4653 url = "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz";
4654 sha1 = "72cb668b425228290abbfa856892587308a801fb";
4655 };
4656 }
4657
4658 {
4659 name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
4660 path = fetchurl {
4661 name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
4662 url = "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz";
4663 sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61";
4664 };
4665 }
4666
4667 {
4668 name = "methods___methods_1.1.2.tgz";
4669 path = fetchurl {
4670 name = "methods___methods_1.1.2.tgz";
4671 url = "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz";
4672 sha1 = "5529a4d67654134edcc5266656835b0f851afcee";
4673 };
4674 }
4675
4676 {
4677 name = "micromatch___micromatch_2.3.11.tgz";
4678 path = fetchurl {
4679 name = "micromatch___micromatch_2.3.11.tgz";
4680 url = "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz";
4681 sha1 = "86677c97d1720b363431d04d0d15293bd38c1565";
4682 };
4683 }
4684
4685 {
4686 name = "micromatch___micromatch_3.1.10.tgz";
4687 path = fetchurl {
4688 name = "micromatch___micromatch_3.1.10.tgz";
4689 url = "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz";
4690 sha1 = "70859bc95c9840952f359a068a3fc49f9ecfac23";
4691 };
4692 }
4693
4694 {
4695 name = "miller_rabin___miller_rabin_4.0.1.tgz";
4696 path = fetchurl {
4697 name = "miller_rabin___miller_rabin_4.0.1.tgz";
4698 url = "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz";
4699 sha1 = "f080351c865b0dc562a8462966daa53543c78a4d";
4700 };
4701 }
4702
4703 {
4704 name = "mime_db___mime_db_1.35.0.tgz";
4705 path = fetchurl {
4706 name = "mime_db___mime_db_1.35.0.tgz";
4707 url = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz";
4708 sha1 = "0569d657466491283709663ad379a99b90d9ab47";
4709 };
4710 }
4711
4712 {
4713 name = "mime_types___mime_types_2.1.19.tgz";
4714 path = fetchurl {
4715 name = "mime_types___mime_types_2.1.19.tgz";
4716 url = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz";
4717 sha1 = "71e464537a7ef81c15f2db9d97e913fc0ff606f0";
4718 };
4719 }
4720
4721 {
4722 name = "mime___mime_1.4.1.tgz";
4723 path = fetchurl {
4724 name = "mime___mime_1.4.1.tgz";
4725 url = "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz";
4726 sha1 = "121f9ebc49e3766f311a76e1fa1c8003c4b03aa6";
4727 };
4728 }
4729
4730 {
4731 name = "mime___mime_1.6.0.tgz";
4732 path = fetchurl {
4733 name = "mime___mime_1.6.0.tgz";
4734 url = "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz";
4735 sha1 = "32cd9e5c64553bd58d19a568af452acff04981b1";
4736 };
4737 }
4738
4739 {
4740 name = "mimic_fn___mimic_fn_1.2.0.tgz";
4741 path = fetchurl {
4742 name = "mimic_fn___mimic_fn_1.2.0.tgz";
4743 url = "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz";
4744 sha1 = "820c86a39334640e99516928bd03fca88057d022";
4745 };
4746 }
4747
4748 {
4749 name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
4750 path = fetchurl {
4751 name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
4752 url = "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
4753 sha1 = "2e194de044626d4a10e7f7fbc00ce73e83e4d5c7";
4754 };
4755 }
4756
4757 {
4758 name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
4759 path = fetchurl {
4760 name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
4761 url = "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz";
4762 sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
4763 };
4764 }
4765
4766 {
4767 name = "minimatch___minimatch_3.0.4.tgz";
4768 path = fetchurl {
4769 name = "minimatch___minimatch_3.0.4.tgz";
4770 url = "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz";
4771 sha1 = "5166e286457f03306064be5497e8dbb0c3d32083";
4772 };
4773 }
4774
4775 {
4776 name = "minimist___minimist_0.0.8.tgz";
4777 path = fetchurl {
4778 name = "minimist___minimist_0.0.8.tgz";
4779 url = "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz";
4780 sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
4781 };
4782 }
4783
4784 {
4785 name = "minimist___minimist_1.2.0.tgz";
4786 path = fetchurl {
4787 name = "minimist___minimist_1.2.0.tgz";
4788 url = "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz";
4789 sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284";
4790 };
4791 }
4792
4793 {
4794 name = "minipass___minipass_2.3.3.tgz";
4795 path = fetchurl {
4796 name = "minipass___minipass_2.3.3.tgz";
4797 url = "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz";
4798 sha1 = "a7dcc8b7b833f5d368759cce544dccb55f50f233";
4799 };
4800 }
4801
4802 {
4803 name = "minizlib___minizlib_1.1.0.tgz";
4804 path = fetchurl {
4805 name = "minizlib___minizlib_1.1.0.tgz";
4806 url = "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz";
4807 sha1 = "11e13658ce46bc3a70a267aac58359d1e0c29ceb";
4808 };
4809 }
4810
4811 {
4812 name = "mixin_deep___mixin_deep_1.3.1.tgz";
4813 path = fetchurl {
4814 name = "mixin_deep___mixin_deep_1.3.1.tgz";
4815 url = "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz";
4816 sha1 = "a49e7268dce1a0d9698e45326c5626df3543d0fe";
4817 };
4818 }
4819
4820 {
4821 name = "mixin_object___mixin_object_2.0.1.tgz";
4822 path = fetchurl {
4823 name = "mixin_object___mixin_object_2.0.1.tgz";
4824 url = "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz";
4825 sha1 = "4fb949441dab182540f1fe035ba60e1947a5e57e";
4826 };
4827 }
4828
4829 {
4830 name = "mkdirp___mkdirp_0.5.1.tgz";
4831 path = fetchurl {
4832 name = "mkdirp___mkdirp_0.5.1.tgz";
4833 url = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz";
4834 sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
4835 };
4836 }
4837
4838 {
4839 name = "ms___ms_2.0.0.tgz";
4840 path = fetchurl {
4841 name = "ms___ms_2.0.0.tgz";
4842 url = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz";
4843 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
4844 };
4845 }
4846
4847 {
4848 name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz";
4849 path = fetchurl {
4850 name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz";
4851 url = "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz";
4852 sha1 = "899f11d9686e5e05cb91b35d5f0e63b773cfc901";
4853 };
4854 }
4855
4856 {
4857 name = "multicast_dns___multicast_dns_6.2.3.tgz";
4858 path = fetchurl {
4859 name = "multicast_dns___multicast_dns_6.2.3.tgz";
4860 url = "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz";
4861 sha1 = "a0ec7bd9055c4282f790c3c82f4e28db3b31b229";
4862 };
4863 }
4864
4865 {
4866 name = "nan___nan_2.10.0.tgz";
4867 path = fetchurl {
4868 name = "nan___nan_2.10.0.tgz";
4869 url = "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz";
4870 sha1 = "96d0cd610ebd58d4b4de9cc0c6828cda99c7548f";
4871 };
4872 }
4873
4874 {
4875 name = "nanomatch___nanomatch_1.2.13.tgz";
4876 path = fetchurl {
4877 name = "nanomatch___nanomatch_1.2.13.tgz";
4878 url = "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz";
4879 sha1 = "b87a8aa4fc0de8fe6be88895b38983ff265bd119";
4880 };
4881 }
4882
4883 {
4884 name = "needle___needle_2.2.1.tgz";
4885 path = fetchurl {
4886 name = "needle___needle_2.2.1.tgz";
4887 url = "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz";
4888 sha1 = "b5e325bd3aae8c2678902fa296f729455d1d3a7d";
4889 };
4890 }
4891
4892 {
4893 name = "negotiator___negotiator_0.6.1.tgz";
4894 path = fetchurl {
4895 name = "negotiator___negotiator_0.6.1.tgz";
4896 url = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz";
4897 sha1 = "2b327184e8992101177b28563fb5e7102acd0ca9";
4898 };
4899 }
4900
4901 {
4902 name = "neo_async___neo_async_2.5.1.tgz";
4903 path = fetchurl {
4904 name = "neo_async___neo_async_2.5.1.tgz";
4905 url = "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz";
4906 sha1 = "acb909e327b1e87ec9ef15f41b8a269512ad41ee";
4907 };
4908 }
4909
4910 {
4911 name = "next_tick___next_tick_1.0.0.tgz";
4912 path = fetchurl {
4913 name = "next_tick___next_tick_1.0.0.tgz";
4914 url = "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz";
4915 sha1 = "ca86d1fe8828169b0120208e3dc8424b9db8342c";
4916 };
4917 }
4918
4919 {
4920 name = "node_forge___node_forge_0.7.5.tgz";
4921 path = fetchurl {
4922 name = "node_forge___node_forge_0.7.5.tgz";
4923 url = "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz";
4924 sha1 = "6c152c345ce11c52f465c2abd957e8639cd674df";
4925 };
4926 }
4927
4928 {
4929 name = "node_gyp___node_gyp_3.7.0.tgz";
4930 path = fetchurl {
4931 name = "node_gyp___node_gyp_3.7.0.tgz";
4932 url = "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz";
4933 sha1 = "789478e8f6c45e277aa014f3e28f958f286f9203";
4934 };
4935 }
4936
4937 {
4938 name = "node_libs_browser___node_libs_browser_2.1.0.tgz";
4939 path = fetchurl {
4940 name = "node_libs_browser___node_libs_browser_2.1.0.tgz";
4941 url = "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz";
4942 sha1 = "5f94263d404f6e44767d726901fff05478d600df";
4943 };
4944 }
4945
4946 {
4947 name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
4948 path = fetchurl {
4949 name = "node_pre_gyp___node_pre_gyp_0.10.3.tgz";
4950 url = "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz";
4951 sha1 = "3070040716afdc778747b61b6887bf78880b80fc";
4952 };
4953 }
4954
4955 {
4956 name = "node_sass___node_sass_4.9.2.tgz";
4957 path = fetchurl {
4958 name = "node_sass___node_sass_4.9.2.tgz";
4959 url = "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.2.tgz";
4960 sha1 = "5e63fe6bd0f2ae3ac9d6c14ede8620e2b8bdb437";
4961 };
4962 }
4963
4964 {
4965 name = "nopt___nopt_3.0.6.tgz";
4966 path = fetchurl {
4967 name = "nopt___nopt_3.0.6.tgz";
4968 url = "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz";
4969 sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
4970 };
4971 }
4972
4973 {
4974 name = "nopt___nopt_4.0.1.tgz";
4975 path = fetchurl {
4976 name = "nopt___nopt_4.0.1.tgz";
4977 url = "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz";
4978 sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d";
4979 };
4980 }
4981
4982 {
4983 name = "normalize_package_data___normalize_package_data_2.4.0.tgz";
4984 path = fetchurl {
4985 name = "normalize_package_data___normalize_package_data_2.4.0.tgz";
4986 url = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
4987 sha1 = "12f95a307d58352075a04907b84ac8be98ac012f";
4988 };
4989 }
4990
4991 {
4992 name = "normalize_path___normalize_path_2.1.1.tgz";
4993 path = fetchurl {
4994 name = "normalize_path___normalize_path_2.1.1.tgz";
4995 url = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz";
4996 sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
4997 };
4998 }
4999
5000 {
5001 name = "normalize_range___normalize_range_0.1.2.tgz";
5002 path = fetchurl {
5003 name = "normalize_range___normalize_range_0.1.2.tgz";
5004 url = "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz";
5005 sha1 = "2d10c06bdfd312ea9777695a4d28439456b75942";
5006 };
5007 }
5008
5009 {
5010 name = "normalize_url___normalize_url_1.9.1.tgz";
5011 path = fetchurl {
5012 name = "normalize_url___normalize_url_1.9.1.tgz";
5013 url = "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz";
5014 sha1 = "2cc0d66b31ea23036458436e3620d85954c66c3c";
5015 };
5016 }
5017
5018 {
5019 name = "npm_bundled___npm_bundled_1.0.3.tgz";
5020 path = fetchurl {
5021 name = "npm_bundled___npm_bundled_1.0.3.tgz";
5022 url = "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz";
5023 sha1 = "7e71703d973af3370a9591bafe3a63aca0be2308";
5024 };
5025 }
5026
5027 {
5028 name = "npm_packlist___npm_packlist_1.1.11.tgz";
5029 path = fetchurl {
5030 name = "npm_packlist___npm_packlist_1.1.11.tgz";
5031 url = "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz";
5032 sha1 = "84e8c683cbe7867d34b1d357d893ce29e28a02de";
5033 };
5034 }
5035
5036 {
5037 name = "npm_run_path___npm_run_path_2.0.2.tgz";
5038 path = fetchurl {
5039 name = "npm_run_path___npm_run_path_2.0.2.tgz";
5040 url = "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz";
5041 sha1 = "35a9232dfa35d7067b4cb2ddf2357b1871536c5f";
5042 };
5043 }
5044
5045 {
5046 name = "npmlog___npmlog_4.1.2.tgz";
5047 path = fetchurl {
5048 name = "npmlog___npmlog_4.1.2.tgz";
5049 url = "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz";
5050 sha1 = "08a7f2a8bf734604779a9efa4ad5cc717abb954b";
5051 };
5052 }
5053
5054 {
5055 name = "nth_check___nth_check_1.0.1.tgz";
5056 path = fetchurl {
5057 name = "nth_check___nth_check_1.0.1.tgz";
5058 url = "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz";
5059 sha1 = "9929acdf628fc2c41098deab82ac580cf149aae4";
5060 };
5061 }
5062
5063 {
5064 name = "num2fraction___num2fraction_1.2.2.tgz";
5065 path = fetchurl {
5066 name = "num2fraction___num2fraction_1.2.2.tgz";
5067 url = "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz";
5068 sha1 = "6f682b6a027a4e9ddfa4564cd2589d1d4e669ede";
5069 };
5070 }
5071
5072 {
5073 name = "number_is_nan___number_is_nan_1.0.1.tgz";
5074 path = fetchurl {
5075 name = "number_is_nan___number_is_nan_1.0.1.tgz";
5076 url = "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz";
5077 sha1 = "097b602b53422a522c1afb8790318336941a011d";
5078 };
5079 }
5080
5081 {
5082 name = "oauth_sign___oauth_sign_0.8.2.tgz";
5083 path = fetchurl {
5084 name = "oauth_sign___oauth_sign_0.8.2.tgz";
5085 url = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz";
5086 sha1 = "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43";
5087 };
5088 }
5089
5090 {
5091 name = "object_assign___object_assign_4.1.1.tgz";
5092 path = fetchurl {
5093 name = "object_assign___object_assign_4.1.1.tgz";
5094 url = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz";
5095 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
5096 };
5097 }
5098
5099 {
5100 name = "object_copy___object_copy_0.1.0.tgz";
5101 path = fetchurl {
5102 name = "object_copy___object_copy_0.1.0.tgz";
5103 url = "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz";
5104 sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
5105 };
5106 }
5107
5108 {
5109 name = "object_keys___object_keys_1.0.12.tgz";
5110 path = fetchurl {
5111 name = "object_keys___object_keys_1.0.12.tgz";
5112 url = "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz";
5113 sha1 = "09c53855377575310cca62f55bb334abff7b3ed2";
5114 };
5115 }
5116
5117 {
5118 name = "object_path___object_path_0.9.2.tgz";
5119 path = fetchurl {
5120 name = "object_path___object_path_0.9.2.tgz";
5121 url = "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz";
5122 sha1 = "0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5";
5123 };
5124 }
5125
5126 {
5127 name = "object_visit___object_visit_1.0.1.tgz";
5128 path = fetchurl {
5129 name = "object_visit___object_visit_1.0.1.tgz";
5130 url = "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz";
5131 sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
5132 };
5133 }
5134
5135 {
5136 name = "object.omit___object.omit_2.0.1.tgz";
5137 path = fetchurl {
5138 name = "object.omit___object.omit_2.0.1.tgz";
5139 url = "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz";
5140 sha1 = "1a9c744829f39dbb858c76ca3579ae2a54ebd1fa";
5141 };
5142 }
5143
5144 {
5145 name = "object.pick___object.pick_1.3.0.tgz";
5146 path = fetchurl {
5147 name = "object.pick___object.pick_1.3.0.tgz";
5148 url = "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz";
5149 sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
5150 };
5151 }
5152
5153 {
5154 name = "obuf___obuf_1.1.2.tgz";
5155 path = fetchurl {
5156 name = "obuf___obuf_1.1.2.tgz";
5157 url = "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz";
5158 sha1 = "09bea3343d41859ebd446292d11c9d4db619084e";
5159 };
5160 }
5161
5162 {
5163 name = "on_finished___on_finished_2.3.0.tgz";
5164 path = fetchurl {
5165 name = "on_finished___on_finished_2.3.0.tgz";
5166 url = "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz";
5167 sha1 = "20f1336481b083cd75337992a16971aa2d906947";
5168 };
5169 }
5170
5171 {
5172 name = "on_headers___on_headers_1.0.1.tgz";
5173 path = fetchurl {
5174 name = "on_headers___on_headers_1.0.1.tgz";
5175 url = "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz";
5176 sha1 = "928f5d0f470d49342651ea6794b0857c100693f7";
5177 };
5178 }
5179
5180 {
5181 name = "once___once_1.4.0.tgz";
5182 path = fetchurl {
5183 name = "once___once_1.4.0.tgz";
5184 url = "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz";
5185 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
5186 };
5187 }
5188
5189 {
5190 name = "open_iconic___open_iconic_1.1.1.tgz";
5191 path = fetchurl {
5192 name = "open_iconic___open_iconic_1.1.1.tgz";
5193 url = "https://registry.yarnpkg.com/open-iconic/-/open-iconic-1.1.1.tgz";
5194 sha1 = "9dcfc8c7cd3c61cdb4a236b1a347894c97adc0c6";
5195 };
5196 }
5197
5198 {
5199 name = "opn___opn_5.3.0.tgz";
5200 path = fetchurl {
5201 name = "opn___opn_5.3.0.tgz";
5202 url = "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz";
5203 sha1 = "64871565c863875f052cfdf53d3e3cb5adb53b1c";
5204 };
5205 }
5206
5207 {
5208 name = "original___original_1.0.1.tgz";
5209 path = fetchurl {
5210 name = "original___original_1.0.1.tgz";
5211 url = "https://registry.yarnpkg.com/original/-/original-1.0.1.tgz";
5212 sha1 = "b0a53ff42ba997a8c9cd1fb5daaeb42b9d693190";
5213 };
5214 }
5215
5216 {
5217 name = "os_browserify___os_browserify_0.3.0.tgz";
5218 path = fetchurl {
5219 name = "os_browserify___os_browserify_0.3.0.tgz";
5220 url = "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz";
5221 sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
5222 };
5223 }
5224
5225 {
5226 name = "os_homedir___os_homedir_1.0.2.tgz";
5227 path = fetchurl {
5228 name = "os_homedir___os_homedir_1.0.2.tgz";
5229 url = "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz";
5230 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
5231 };
5232 }
5233
5234 {
5235 name = "os_locale___os_locale_1.4.0.tgz";
5236 path = fetchurl {
5237 name = "os_locale___os_locale_1.4.0.tgz";
5238 url = "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz";
5239 sha1 = "20f9f17ae29ed345e8bde583b13d2009803c14d9";
5240 };
5241 }
5242
5243 {
5244 name = "os_locale___os_locale_2.1.0.tgz";
5245 path = fetchurl {
5246 name = "os_locale___os_locale_2.1.0.tgz";
5247 url = "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz";
5248 sha1 = "42bc2900a6b5b8bd17376c8e882b65afccf24bf2";
5249 };
5250 }
5251
5252 {
5253 name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
5254 path = fetchurl {
5255 name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
5256 url = "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
5257 sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
5258 };
5259 }
5260
5261 {
5262 name = "osenv___osenv_0.1.5.tgz";
5263 path = fetchurl {
5264 name = "osenv___osenv_0.1.5.tgz";
5265 url = "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz";
5266 sha1 = "85cdfafaeb28e8677f416e287592b5f3f49ea410";
5267 };
5268 }
5269
5270 {
5271 name = "p_finally___p_finally_1.0.0.tgz";
5272 path = fetchurl {
5273 name = "p_finally___p_finally_1.0.0.tgz";
5274 url = "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz";
5275 sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae";
5276 };
5277 }
5278
5279 {
5280 name = "p_limit___p_limit_1.3.0.tgz";
5281 path = fetchurl {
5282 name = "p_limit___p_limit_1.3.0.tgz";
5283 url = "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz";
5284 sha1 = "b86bd5f0c25690911c7590fcbfc2010d54b3ccb8";
5285 };
5286 }
5287
5288 {
5289 name = "p_locate___p_locate_2.0.0.tgz";
5290 path = fetchurl {
5291 name = "p_locate___p_locate_2.0.0.tgz";
5292 url = "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz";
5293 sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
5294 };
5295 }
5296
5297 {
5298 name = "p_map___p_map_1.2.0.tgz";
5299 path = fetchurl {
5300 name = "p_map___p_map_1.2.0.tgz";
5301 url = "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz";
5302 sha1 = "e4e94f311eabbc8633a1e79908165fca26241b6b";
5303 };
5304 }
5305
5306 {
5307 name = "p_try___p_try_1.0.0.tgz";
5308 path = fetchurl {
5309 name = "p_try___p_try_1.0.0.tgz";
5310 url = "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz";
5311 sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
5312 };
5313 }
5314
5315 {
5316 name = "pako___pako_1.0.6.tgz";
5317 path = fetchurl {
5318 name = "pako___pako_1.0.6.tgz";
5319 url = "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz";
5320 sha1 = "0101211baa70c4bca4a0f63f2206e97b7dfaf258";
5321 };
5322 }
5323
5324 {
5325 name = "parse_asn1___parse_asn1_5.1.1.tgz";
5326 path = fetchurl {
5327 name = "parse_asn1___parse_asn1_5.1.1.tgz";
5328 url = "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz";
5329 sha1 = "f6bf293818332bd0dab54efb16087724745e6ca8";
5330 };
5331 }
5332
5333 {
5334 name = "parse_glob___parse_glob_3.0.4.tgz";
5335 path = fetchurl {
5336 name = "parse_glob___parse_glob_3.0.4.tgz";
5337 url = "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz";
5338 sha1 = "b2c376cfb11f35513badd173ef0bb6e3a388391c";
5339 };
5340 }
5341
5342 {
5343 name = "parse_json___parse_json_2.2.0.tgz";
5344 path = fetchurl {
5345 name = "parse_json___parse_json_2.2.0.tgz";
5346 url = "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz";
5347 sha1 = "f480f40434ef80741f8469099f8dea18f55a4dc9";
5348 };
5349 }
5350
5351 {
5352 name = "parseurl___parseurl_1.3.2.tgz";
5353 path = fetchurl {
5354 name = "parseurl___parseurl_1.3.2.tgz";
5355 url = "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz";
5356 sha1 = "fc289d4ed8993119460c156253262cdc8de65bf3";
5357 };
5358 }
5359
5360 {
5361 name = "pascalcase___pascalcase_0.1.1.tgz";
5362 path = fetchurl {
5363 name = "pascalcase___pascalcase_0.1.1.tgz";
5364 url = "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz";
5365 sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
5366 };
5367 }
5368
5369 {
5370 name = "path_browserify___path_browserify_0.0.0.tgz";
5371 path = fetchurl {
5372 name = "path_browserify___path_browserify_0.0.0.tgz";
5373 url = "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz";
5374 sha1 = "a0b870729aae214005b7d5032ec2cbbb0fb4451a";
5375 };
5376 }
5377
5378 {
5379 name = "path_dirname___path_dirname_1.0.2.tgz";
5380 path = fetchurl {
5381 name = "path_dirname___path_dirname_1.0.2.tgz";
5382 url = "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz";
5383 sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
5384 };
5385 }
5386
5387 {
5388 name = "path_exists___path_exists_2.1.0.tgz";
5389 path = fetchurl {
5390 name = "path_exists___path_exists_2.1.0.tgz";
5391 url = "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz";
5392 sha1 = "0feb6c64f0fc518d9a754dd5efb62c7022761f4b";
5393 };
5394 }
5395
5396 {
5397 name = "path_exists___path_exists_3.0.0.tgz";
5398 path = fetchurl {
5399 name = "path_exists___path_exists_3.0.0.tgz";
5400 url = "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz";
5401 sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
5402 };
5403 }
5404
5405 {
5406 name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
5407 path = fetchurl {
5408 name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
5409 url = "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
5410 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
5411 };
5412 }
5413
5414 {
5415 name = "path_is_inside___path_is_inside_1.0.2.tgz";
5416 path = fetchurl {
5417 name = "path_is_inside___path_is_inside_1.0.2.tgz";
5418 url = "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz";
5419 sha1 = "365417dede44430d1c11af61027facf074bdfc53";
5420 };
5421 }
5422
5423 {
5424 name = "path_key___path_key_2.0.1.tgz";
5425 path = fetchurl {
5426 name = "path_key___path_key_2.0.1.tgz";
5427 url = "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz";
5428 sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
5429 };
5430 }
5431
5432 {
5433 name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
5434 path = fetchurl {
5435 name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
5436 url = "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz";
5437 sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c";
5438 };
5439 }
5440
5441 {
5442 name = "path_type___path_type_1.1.0.tgz";
5443 path = fetchurl {
5444 name = "path_type___path_type_1.1.0.tgz";
5445 url = "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz";
5446 sha1 = "59c44f7ee491da704da415da5a4070ba4f8fe441";
5447 };
5448 }
5449
5450 {
5451 name = "path_type___path_type_2.0.0.tgz";
5452 path = fetchurl {
5453 name = "path_type___path_type_2.0.0.tgz";
5454 url = "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz";
5455 sha1 = "f012ccb8415b7096fc2daa1054c3d72389594c73";
5456 };
5457 }
5458
5459 {
5460 name = "pbkdf2___pbkdf2_3.0.16.tgz";
5461 path = fetchurl {
5462 name = "pbkdf2___pbkdf2_3.0.16.tgz";
5463 url = "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz";
5464 sha1 = "7404208ec6b01b62d85bf83853a8064f8d9c2a5c";
5465 };
5466 }
5467
5468 {
5469 name = "performance_now___performance_now_0.2.0.tgz";
5470 path = fetchurl {
5471 name = "performance_now___performance_now_0.2.0.tgz";
5472 url = "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz";
5473 sha1 = "33ef30c5c77d4ea21c5a53869d91b56d8f2555e5";
5474 };
5475 }
5476
5477 {
5478 name = "performance_now___performance_now_2.1.0.tgz";
5479 path = fetchurl {
5480 name = "performance_now___performance_now_2.1.0.tgz";
5481 url = "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz";
5482 sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
5483 };
5484 }
5485
5486 {
5487 name = "pify___pify_2.3.0.tgz";
5488 path = fetchurl {
5489 name = "pify___pify_2.3.0.tgz";
5490 url = "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz";
5491 sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c";
5492 };
5493 }
5494
5495 {
5496 name = "pify___pify_3.0.0.tgz";
5497 path = fetchurl {
5498 name = "pify___pify_3.0.0.tgz";
5499 url = "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz";
5500 sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176";
5501 };
5502 }
5503
5504 {
5505 name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
5506 path = fetchurl {
5507 name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
5508 url = "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
5509 sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
5510 };
5511 }
5512
5513 {
5514 name = "pinkie___pinkie_2.0.4.tgz";
5515 path = fetchurl {
5516 name = "pinkie___pinkie_2.0.4.tgz";
5517 url = "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz";
5518 sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
5519 };
5520 }
5521
5522 {
5523 name = "pkg_dir___pkg_dir_2.0.0.tgz";
5524 path = fetchurl {
5525 name = "pkg_dir___pkg_dir_2.0.0.tgz";
5526 url = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz";
5527 sha1 = "f6d5d1109e19d63edf428e0bd57e12777615334b";
5528 };
5529 }
5530
5531 {
5532 name = "pkg_up___pkg_up_1.0.0.tgz";
5533 path = fetchurl {
5534 name = "pkg_up___pkg_up_1.0.0.tgz";
5535 url = "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz";
5536 sha1 = "3e08fb461525c4421624a33b9f7e6d0af5b05a26";
5537 };
5538 }
5539
5540 {
5541 name = "popper.js___popper.js_1.14.4.tgz";
5542 path = fetchurl {
5543 name = "popper.js___popper.js_1.14.4.tgz";
5544 url = "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.4.tgz";
5545 sha1 = "8eec1d8ff02a5a3a152dd43414a15c7b79fd69b6";
5546 };
5547 }
5548
5549 {
5550 name = "portfinder___portfinder_1.0.13.tgz";
5551 path = fetchurl {
5552 name = "portfinder___portfinder_1.0.13.tgz";
5553 url = "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz";
5554 sha1 = "bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9";
5555 };
5556 }
5557
5558 {
5559 name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
5560 path = fetchurl {
5561 name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
5562 url = "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
5563 sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
5564 };
5565 }
5566
5567 {
5568 name = "postcss_calc___postcss_calc_5.3.1.tgz";
5569 path = fetchurl {
5570 name = "postcss_calc___postcss_calc_5.3.1.tgz";
5571 url = "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz";
5572 sha1 = "77bae7ca928ad85716e2fda42f261bf7c1d65b5e";
5573 };
5574 }
5575
5576 {
5577 name = "postcss_colormin___postcss_colormin_2.2.2.tgz";
5578 path = fetchurl {
5579 name = "postcss_colormin___postcss_colormin_2.2.2.tgz";
5580 url = "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz";
5581 sha1 = "6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b";
5582 };
5583 }
5584
5585 {
5586 name = "postcss_convert_values___postcss_convert_values_2.6.1.tgz";
5587 path = fetchurl {
5588 name = "postcss_convert_values___postcss_convert_values_2.6.1.tgz";
5589 url = "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz";
5590 sha1 = "bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d";
5591 };
5592 }
5593
5594 {
5595 name = "postcss_discard_comments___postcss_discard_comments_2.0.4.tgz";
5596 path = fetchurl {
5597 name = "postcss_discard_comments___postcss_discard_comments_2.0.4.tgz";
5598 url = "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz";
5599 sha1 = "befe89fafd5b3dace5ccce51b76b81514be00e3d";
5600 };
5601 }
5602
5603 {
5604 name = "postcss_discard_duplicates___postcss_discard_duplicates_2.1.0.tgz";
5605 path = fetchurl {
5606 name = "postcss_discard_duplicates___postcss_discard_duplicates_2.1.0.tgz";
5607 url = "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz";
5608 sha1 = "b9abf27b88ac188158a5eb12abcae20263b91932";
5609 };
5610 }
5611
5612 {
5613 name = "postcss_discard_empty___postcss_discard_empty_2.1.0.tgz";
5614 path = fetchurl {
5615 name = "postcss_discard_empty___postcss_discard_empty_2.1.0.tgz";
5616 url = "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz";
5617 sha1 = "d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5";
5618 };
5619 }
5620
5621 {
5622 name = "postcss_discard_overridden___postcss_discard_overridden_0.1.1.tgz";
5623 path = fetchurl {
5624 name = "postcss_discard_overridden___postcss_discard_overridden_0.1.1.tgz";
5625 url = "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz";
5626 sha1 = "8b1eaf554f686fb288cd874c55667b0aa3668d58";
5627 };
5628 }
5629
5630 {
5631 name = "postcss_discard_unused___postcss_discard_unused_2.2.3.tgz";
5632 path = fetchurl {
5633 name = "postcss_discard_unused___postcss_discard_unused_2.2.3.tgz";
5634 url = "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz";
5635 sha1 = "bce30b2cc591ffc634322b5fb3464b6d934f4433";
5636 };
5637 }
5638
5639 {
5640 name = "postcss_filter_plugins___postcss_filter_plugins_2.0.3.tgz";
5641 path = fetchurl {
5642 name = "postcss_filter_plugins___postcss_filter_plugins_2.0.3.tgz";
5643 url = "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz";
5644 sha1 = "82245fdf82337041645e477114d8e593aa18b8ec";
5645 };
5646 }
5647
5648 {
5649 name = "postcss_merge_idents___postcss_merge_idents_2.1.7.tgz";
5650 path = fetchurl {
5651 name = "postcss_merge_idents___postcss_merge_idents_2.1.7.tgz";
5652 url = "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz";
5653 sha1 = "4c5530313c08e1d5b3bbf3d2bbc747e278eea270";
5654 };
5655 }
5656
5657 {
5658 name = "postcss_merge_longhand___postcss_merge_longhand_2.0.2.tgz";
5659 path = fetchurl {
5660 name = "postcss_merge_longhand___postcss_merge_longhand_2.0.2.tgz";
5661 url = "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz";
5662 sha1 = "23d90cd127b0a77994915332739034a1a4f3d658";
5663 };
5664 }
5665
5666 {
5667 name = "postcss_merge_rules___postcss_merge_rules_2.1.2.tgz";
5668 path = fetchurl {
5669 name = "postcss_merge_rules___postcss_merge_rules_2.1.2.tgz";
5670 url = "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz";
5671 sha1 = "d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721";
5672 };
5673 }
5674
5675 {
5676 name = "postcss_message_helpers___postcss_message_helpers_2.0.0.tgz";
5677 path = fetchurl {
5678 name = "postcss_message_helpers___postcss_message_helpers_2.0.0.tgz";
5679 url = "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz";
5680 sha1 = "a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e";
5681 };
5682 }
5683
5684 {
5685 name = "postcss_minify_font_values___postcss_minify_font_values_1.0.5.tgz";
5686 path = fetchurl {
5687 name = "postcss_minify_font_values___postcss_minify_font_values_1.0.5.tgz";
5688 url = "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz";
5689 sha1 = "4b58edb56641eba7c8474ab3526cafd7bbdecb69";
5690 };
5691 }
5692
5693 {
5694 name = "postcss_minify_gradients___postcss_minify_gradients_1.0.5.tgz";
5695 path = fetchurl {
5696 name = "postcss_minify_gradients___postcss_minify_gradients_1.0.5.tgz";
5697 url = "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz";
5698 sha1 = "5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1";
5699 };
5700 }
5701
5702 {
5703 name = "postcss_minify_params___postcss_minify_params_1.2.2.tgz";
5704 path = fetchurl {
5705 name = "postcss_minify_params___postcss_minify_params_1.2.2.tgz";
5706 url = "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz";
5707 sha1 = "ad2ce071373b943b3d930a3fa59a358c28d6f1f3";
5708 };
5709 }
5710
5711 {
5712 name = "postcss_minify_selectors___postcss_minify_selectors_2.1.1.tgz";
5713 path = fetchurl {
5714 name = "postcss_minify_selectors___postcss_minify_selectors_2.1.1.tgz";
5715 url = "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz";
5716 sha1 = "b2c6a98c0072cf91b932d1a496508114311735bf";
5717 };
5718 }
5719
5720 {
5721 name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.1.0.tgz";
5722 path = fetchurl {
5723 name = "postcss_modules_extract_imports___postcss_modules_extract_imports_1.1.0.tgz";
5724 url = "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz";
5725 sha1 = "b614c9720be6816eaee35fb3a5faa1dba6a05ddb";
5726 };
5727 }
5728
5729 {
5730 name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz";
5731 path = fetchurl {
5732 name = "postcss_modules_local_by_default___postcss_modules_local_by_default_1.2.0.tgz";
5733 url = "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz";
5734 sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069";
5735 };
5736 }
5737
5738 {
5739 name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz";
5740 path = fetchurl {
5741 name = "postcss_modules_scope___postcss_modules_scope_1.1.0.tgz";
5742 url = "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz";
5743 sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90";
5744 };
5745 }
5746
5747 {
5748 name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz";
5749 path = fetchurl {
5750 name = "postcss_modules_values___postcss_modules_values_1.3.0.tgz";
5751 url = "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz";
5752 sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20";
5753 };
5754 }
5755
5756 {
5757 name = "postcss_normalize_charset___postcss_normalize_charset_1.1.1.tgz";
5758 path = fetchurl {
5759 name = "postcss_normalize_charset___postcss_normalize_charset_1.1.1.tgz";
5760 url = "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz";
5761 sha1 = "ef9ee71212d7fe759c78ed162f61ed62b5cb93f1";
5762 };
5763 }
5764
5765 {
5766 name = "postcss_normalize_url___postcss_normalize_url_3.0.8.tgz";
5767 path = fetchurl {
5768 name = "postcss_normalize_url___postcss_normalize_url_3.0.8.tgz";
5769 url = "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz";
5770 sha1 = "108f74b3f2fcdaf891a2ffa3ea4592279fc78222";
5771 };
5772 }
5773
5774 {
5775 name = "postcss_ordered_values___postcss_ordered_values_2.2.3.tgz";
5776 path = fetchurl {
5777 name = "postcss_ordered_values___postcss_ordered_values_2.2.3.tgz";
5778 url = "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz";
5779 sha1 = "eec6c2a67b6c412a8db2042e77fe8da43f95c11d";
5780 };
5781 }
5782
5783 {
5784 name = "postcss_reduce_idents___postcss_reduce_idents_2.4.0.tgz";
5785 path = fetchurl {
5786 name = "postcss_reduce_idents___postcss_reduce_idents_2.4.0.tgz";
5787 url = "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz";
5788 sha1 = "c2c6d20cc958284f6abfbe63f7609bf409059ad3";
5789 };
5790 }
5791
5792 {
5793 name = "postcss_reduce_initial___postcss_reduce_initial_1.0.1.tgz";
5794 path = fetchurl {
5795 name = "postcss_reduce_initial___postcss_reduce_initial_1.0.1.tgz";
5796 url = "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz";
5797 sha1 = "68f80695f045d08263a879ad240df8dd64f644ea";
5798 };
5799 }
5800
5801 {
5802 name = "postcss_reduce_transforms___postcss_reduce_transforms_1.0.4.tgz";
5803 path = fetchurl {
5804 name = "postcss_reduce_transforms___postcss_reduce_transforms_1.0.4.tgz";
5805 url = "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz";
5806 sha1 = "ff76f4d8212437b31c298a42d2e1444025771ae1";
5807 };
5808 }
5809
5810 {
5811 name = "postcss_selector_parser___postcss_selector_parser_2.2.3.tgz";
5812 path = fetchurl {
5813 name = "postcss_selector_parser___postcss_selector_parser_2.2.3.tgz";
5814 url = "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz";
5815 sha1 = "f9437788606c3c9acee16ffe8d8b16297f27bb90";
5816 };
5817 }
5818
5819 {
5820 name = "postcss_svgo___postcss_svgo_2.1.6.tgz";
5821 path = fetchurl {
5822 name = "postcss_svgo___postcss_svgo_2.1.6.tgz";
5823 url = "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz";
5824 sha1 = "b6df18aa613b666e133f08adb5219c2684ac108d";
5825 };
5826 }
5827
5828 {
5829 name = "postcss_unique_selectors___postcss_unique_selectors_2.0.2.tgz";
5830 path = fetchurl {
5831 name = "postcss_unique_selectors___postcss_unique_selectors_2.0.2.tgz";
5832 url = "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz";
5833 sha1 = "981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d";
5834 };
5835 }
5836
5837 {
5838 name = "postcss_value_parser___postcss_value_parser_3.3.0.tgz";
5839 path = fetchurl {
5840 name = "postcss_value_parser___postcss_value_parser_3.3.0.tgz";
5841 url = "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz";
5842 sha1 = "87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15";
5843 };
5844 }
5845
5846 {
5847 name = "postcss_zindex___postcss_zindex_2.2.0.tgz";
5848 path = fetchurl {
5849 name = "postcss_zindex___postcss_zindex_2.2.0.tgz";
5850 url = "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz";
5851 sha1 = "d2109ddc055b91af67fc4cb3b025946639d2af22";
5852 };
5853 }
5854
5855 {
5856 name = "postcss___postcss_5.2.18.tgz";
5857 path = fetchurl {
5858 name = "postcss___postcss_5.2.18.tgz";
5859 url = "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz";
5860 sha1 = "badfa1497d46244f6390f58b319830d9107853c5";
5861 };
5862 }
5863
5864 {
5865 name = "postcss___postcss_6.0.23.tgz";
5866 path = fetchurl {
5867 name = "postcss___postcss_6.0.23.tgz";
5868 url = "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz";
5869 sha1 = "61c82cc328ac60e677645f979054eb98bc0e3324";
5870 };
5871 }
5872
5873 {
5874 name = "prepend_http___prepend_http_1.0.4.tgz";
5875 path = fetchurl {
5876 name = "prepend_http___prepend_http_1.0.4.tgz";
5877 url = "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz";
5878 sha1 = "d4f4562b0ce3696e41ac52d0e002e57a635dc6dc";
5879 };
5880 }
5881
5882 {
5883 name = "preserve___preserve_0.2.0.tgz";
5884 path = fetchurl {
5885 name = "preserve___preserve_0.2.0.tgz";
5886 url = "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz";
5887 sha1 = "815ed1f6ebc65926f865b310c0713bcb3315ce4b";
5888 };
5889 }
5890
5891 {
5892 name = "pretty_error___pretty_error_2.1.1.tgz";
5893 path = fetchurl {
5894 name = "pretty_error___pretty_error_2.1.1.tgz";
5895 url = "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz";
5896 sha1 = "5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3";
5897 };
5898 }
5899
5900 {
5901 name = "private___private_0.1.8.tgz";
5902 path = fetchurl {
5903 name = "private___private_0.1.8.tgz";
5904 url = "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz";
5905 sha1 = "2381edb3689f7a53d653190060fcf822d2f368ff";
5906 };
5907 }
5908
5909 {
5910 name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
5911 path = fetchurl {
5912 name = "process_nextick_args___process_nextick_args_2.0.0.tgz";
5913 url = "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz";
5914 sha1 = "a37d732f4271b4ab1ad070d35508e8290788ffaa";
5915 };
5916 }
5917
5918 {
5919 name = "process___process_0.11.10.tgz";
5920 path = fetchurl {
5921 name = "process___process_0.11.10.tgz";
5922 url = "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz";
5923 sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182";
5924 };
5925 }
5926
5927 {
5928 name = "proxy_addr___proxy_addr_2.0.4.tgz";
5929 path = fetchurl {
5930 name = "proxy_addr___proxy_addr_2.0.4.tgz";
5931 url = "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz";
5932 sha1 = "ecfc733bf22ff8c6f407fa275327b9ab67e48b93";
5933 };
5934 }
5935
5936 {
5937 name = "prr___prr_1.0.1.tgz";
5938 path = fetchurl {
5939 name = "prr___prr_1.0.1.tgz";
5940 url = "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz";
5941 sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
5942 };
5943 }
5944
5945 {
5946 name = "pseudomap___pseudomap_1.0.2.tgz";
5947 path = fetchurl {
5948 name = "pseudomap___pseudomap_1.0.2.tgz";
5949 url = "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz";
5950 sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
5951 };
5952 }
5953
5954 {
5955 name = "public_encrypt___public_encrypt_4.0.2.tgz";
5956 path = fetchurl {
5957 name = "public_encrypt___public_encrypt_4.0.2.tgz";
5958 url = "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz";
5959 sha1 = "46eb9107206bf73489f8b85b69d91334c6610994";
5960 };
5961 }
5962
5963 {
5964 name = "punycode___punycode_1.3.2.tgz";
5965 path = fetchurl {
5966 name = "punycode___punycode_1.3.2.tgz";
5967 url = "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz";
5968 sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
5969 };
5970 }
5971
5972 {
5973 name = "punycode___punycode_1.4.1.tgz";
5974 path = fetchurl {
5975 name = "punycode___punycode_1.4.1.tgz";
5976 url = "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz";
5977 sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
5978 };
5979 }
5980
5981 {
5982 name = "punycode___punycode_2.1.1.tgz";
5983 path = fetchurl {
5984 name = "punycode___punycode_2.1.1.tgz";
5985 url = "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz";
5986 sha1 = "b58b010ac40c22c5657616c8d2c2c02c7bf479ec";
5987 };
5988 }
5989
5990 {
5991 name = "q___q_1.5.1.tgz";
5992 path = fetchurl {
5993 name = "q___q_1.5.1.tgz";
5994 url = "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz";
5995 sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7";
5996 };
5997 }
5998
5999 {
6000 name = "qs___qs_6.5.1.tgz";
6001 path = fetchurl {
6002 name = "qs___qs_6.5.1.tgz";
6003 url = "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz";
6004 sha1 = "349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8";
6005 };
6006 }
6007
6008 {
6009 name = "qs___qs_6.4.0.tgz";
6010 path = fetchurl {
6011 name = "qs___qs_6.4.0.tgz";
6012 url = "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz";
6013 sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233";
6014 };
6015 }
6016
6017 {
6018 name = "qs___qs_6.5.2.tgz";
6019 path = fetchurl {
6020 name = "qs___qs_6.5.2.tgz";
6021 url = "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz";
6022 sha1 = "cb3ae806e8740444584ef154ce8ee98d403f3e36";
6023 };
6024 }
6025
6026 {
6027 name = "query_string___query_string_4.3.4.tgz";
6028 path = fetchurl {
6029 name = "query_string___query_string_4.3.4.tgz";
6030 url = "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz";
6031 sha1 = "bbb693b9ca915c232515b228b1a02b609043dbeb";
6032 };
6033 }
6034
6035 {
6036 name = "querystring_es3___querystring_es3_0.2.1.tgz";
6037 path = fetchurl {
6038 name = "querystring_es3___querystring_es3_0.2.1.tgz";
6039 url = "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz";
6040 sha1 = "9ec61f79049875707d69414596fd907a4d711e73";
6041 };
6042 }
6043
6044 {
6045 name = "querystring___querystring_0.2.0.tgz";
6046 path = fetchurl {
6047 name = "querystring___querystring_0.2.0.tgz";
6048 url = "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz";
6049 sha1 = "b209849203bb25df820da756e747005878521620";
6050 };
6051 }
6052
6053 {
6054 name = "querystringify___querystringify_2.0.0.tgz";
6055 path = fetchurl {
6056 name = "querystringify___querystringify_2.0.0.tgz";
6057 url = "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz";
6058 sha1 = "fa3ed6e68eb15159457c89b37bc6472833195755";
6059 };
6060 }
6061
6062 {
6063 name = "randomatic___randomatic_3.0.0.tgz";
6064 path = fetchurl {
6065 name = "randomatic___randomatic_3.0.0.tgz";
6066 url = "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz";
6067 sha1 = "d35490030eb4f7578de292ce6dfb04a91a128923";
6068 };
6069 }
6070
6071 {
6072 name = "randombytes___randombytes_2.0.6.tgz";
6073 path = fetchurl {
6074 name = "randombytes___randombytes_2.0.6.tgz";
6075 url = "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz";
6076 sha1 = "d302c522948588848a8d300c932b44c24231da80";
6077 };
6078 }
6079
6080 {
6081 name = "randomfill___randomfill_1.0.4.tgz";
6082 path = fetchurl {
6083 name = "randomfill___randomfill_1.0.4.tgz";
6084 url = "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz";
6085 sha1 = "c92196fc86ab42be983f1bf31778224931d61458";
6086 };
6087 }
6088
6089 {
6090 name = "range_parser___range_parser_1.2.0.tgz";
6091 path = fetchurl {
6092 name = "range_parser___range_parser_1.2.0.tgz";
6093 url = "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz";
6094 sha1 = "f49be6b487894ddc40dcc94a322f611092e00d5e";
6095 };
6096 }
6097
6098 {
6099 name = "raw_body___raw_body_2.3.2.tgz";
6100 path = fetchurl {
6101 name = "raw_body___raw_body_2.3.2.tgz";
6102 url = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz";
6103 sha1 = "bcd60c77d3eb93cde0050295c3f379389bc88f89";
6104 };
6105 }
6106
6107 {
6108 name = "rc___rc_1.2.8.tgz";
6109 path = fetchurl {
6110 name = "rc___rc_1.2.8.tgz";
6111 url = "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz";
6112 sha1 = "cd924bf5200a075b83c188cd6b9e211b7fc0d3ed";
6113 };
6114 }
6115
6116 {
6117 name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
6118 path = fetchurl {
6119 name = "read_pkg_up___read_pkg_up_1.0.1.tgz";
6120 url = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz";
6121 sha1 = "9d63c13276c065918d57f002a57f40a1b643fb02";
6122 };
6123 }
6124
6125 {
6126 name = "read_pkg_up___read_pkg_up_2.0.0.tgz";
6127 path = fetchurl {
6128 name = "read_pkg_up___read_pkg_up_2.0.0.tgz";
6129 url = "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz";
6130 sha1 = "6b72a8048984e0c41e79510fd5e9fa99b3b549be";
6131 };
6132 }
6133
6134 {
6135 name = "read_pkg___read_pkg_1.1.0.tgz";
6136 path = fetchurl {
6137 name = "read_pkg___read_pkg_1.1.0.tgz";
6138 url = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz";
6139 sha1 = "f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28";
6140 };
6141 }
6142
6143 {
6144 name = "read_pkg___read_pkg_2.0.0.tgz";
6145 path = fetchurl {
6146 name = "read_pkg___read_pkg_2.0.0.tgz";
6147 url = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz";
6148 sha1 = "8ef1c0623c6a6db0dc6713c4bfac46332b2368f8";
6149 };
6150 }
6151
6152 {
6153 name = "readable_stream___readable_stream_1.0.34.tgz";
6154 path = fetchurl {
6155 name = "readable_stream___readable_stream_1.0.34.tgz";
6156 url = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz";
6157 sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c";
6158 };
6159 }
6160
6161 {
6162 name = "readable_stream___readable_stream_2.3.6.tgz";
6163 path = fetchurl {
6164 name = "readable_stream___readable_stream_2.3.6.tgz";
6165 url = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz";
6166 sha1 = "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf";
6167 };
6168 }
6169
6170 {
6171 name = "readdirp___readdirp_2.1.0.tgz";
6172 path = fetchurl {
6173 name = "readdirp___readdirp_2.1.0.tgz";
6174 url = "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz";
6175 sha1 = "4ed0ad060df3073300c48440373f72d1cc642d78";
6176 };
6177 }
6178
6179 {
6180 name = "redent___redent_1.0.0.tgz";
6181 path = fetchurl {
6182 name = "redent___redent_1.0.0.tgz";
6183 url = "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz";
6184 sha1 = "cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde";
6185 };
6186 }
6187
6188 {
6189 name = "reduce_css_calc___reduce_css_calc_1.3.0.tgz";
6190 path = fetchurl {
6191 name = "reduce_css_calc___reduce_css_calc_1.3.0.tgz";
6192 url = "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz";
6193 sha1 = "747c914e049614a4c9cfbba629871ad1d2927716";
6194 };
6195 }
6196
6197 {
6198 name = "reduce_function_call___reduce_function_call_1.0.2.tgz";
6199 path = fetchurl {
6200 name = "reduce_function_call___reduce_function_call_1.0.2.tgz";
6201 url = "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz";
6202 sha1 = "5a200bf92e0e37751752fe45b0ab330fd4b6be99";
6203 };
6204 }
6205
6206 {
6207 name = "regenerate___regenerate_1.4.0.tgz";
6208 path = fetchurl {
6209 name = "regenerate___regenerate_1.4.0.tgz";
6210 url = "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz";
6211 sha1 = "4a856ec4b56e4077c557589cae85e7a4c8869a11";
6212 };
6213 }
6214
6215 {
6216 name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
6217 path = fetchurl {
6218 name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
6219 url = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
6220 sha1 = "be05ad7f9bf7d22e056f9726cee5017fbf19e2e9";
6221 };
6222 }
6223
6224 {
6225 name = "regenerator_transform___regenerator_transform_0.10.1.tgz";
6226 path = fetchurl {
6227 name = "regenerator_transform___regenerator_transform_0.10.1.tgz";
6228 url = "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz";
6229 sha1 = "1e4996837231da8b7f3cf4114d71b5691a0680dd";
6230 };
6231 }
6232
6233 {
6234 name = "regex_cache___regex_cache_0.4.4.tgz";
6235 path = fetchurl {
6236 name = "regex_cache___regex_cache_0.4.4.tgz";
6237 url = "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz";
6238 sha1 = "75bdc58a2a1496cec48a12835bc54c8d562336dd";
6239 };
6240 }
6241
6242 {
6243 name = "regex_not___regex_not_1.0.2.tgz";
6244 path = fetchurl {
6245 name = "regex_not___regex_not_1.0.2.tgz";
6246 url = "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz";
6247 sha1 = "1f4ece27e00b0b65e0247a6810e6a85d83a5752c";
6248 };
6249 }
6250
6251 {
6252 name = "regex_parser___regex_parser_2.2.9.tgz";
6253 path = fetchurl {
6254 name = "regex_parser___regex_parser_2.2.9.tgz";
6255 url = "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.9.tgz";
6256 sha1 = "a372f45a248b62976a568037c1b6e60a60599192";
6257 };
6258 }
6259
6260 {
6261 name = "regexpu_core___regexpu_core_1.0.0.tgz";
6262 path = fetchurl {
6263 name = "regexpu_core___regexpu_core_1.0.0.tgz";
6264 url = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz";
6265 sha1 = "86a763f58ee4d7c2f6b102e4764050de7ed90c6b";
6266 };
6267 }
6268
6269 {
6270 name = "regexpu_core___regexpu_core_2.0.0.tgz";
6271 path = fetchurl {
6272 name = "regexpu_core___regexpu_core_2.0.0.tgz";
6273 url = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz";
6274 sha1 = "49d038837b8dcf8bfa5b9a42139938e6ea2ae240";
6275 };
6276 }
6277
6278 {
6279 name = "regjsgen___regjsgen_0.2.0.tgz";
6280 path = fetchurl {
6281 name = "regjsgen___regjsgen_0.2.0.tgz";
6282 url = "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz";
6283 sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7";
6284 };
6285 }
6286
6287 {
6288 name = "regjsparser___regjsparser_0.1.5.tgz";
6289 path = fetchurl {
6290 name = "regjsparser___regjsparser_0.1.5.tgz";
6291 url = "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz";
6292 sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c";
6293 };
6294 }
6295
6296 {
6297 name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
6298 path = fetchurl {
6299 name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
6300 url = "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
6301 sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
6302 };
6303 }
6304
6305 {
6306 name = "renderkid___renderkid_2.0.1.tgz";
6307 path = fetchurl {
6308 name = "renderkid___renderkid_2.0.1.tgz";
6309 url = "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz";
6310 sha1 = "898cabfc8bede4b7b91135a3ffd323e58c0db319";
6311 };
6312 }
6313
6314 {
6315 name = "repeat_element___repeat_element_1.1.2.tgz";
6316 path = fetchurl {
6317 name = "repeat_element___repeat_element_1.1.2.tgz";
6318 url = "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz";
6319 sha1 = "ef089a178d1483baae4d93eb98b4f9e4e11d990a";
6320 };
6321 }
6322
6323 {
6324 name = "repeat_string___repeat_string_1.6.1.tgz";
6325 path = fetchurl {
6326 name = "repeat_string___repeat_string_1.6.1.tgz";
6327 url = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz";
6328 sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
6329 };
6330 }
6331
6332 {
6333 name = "repeating___repeating_2.0.1.tgz";
6334 path = fetchurl {
6335 name = "repeating___repeating_2.0.1.tgz";
6336 url = "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz";
6337 sha1 = "5214c53a926d3552707527fbab415dbc08d06dda";
6338 };
6339 }
6340
6341 {
6342 name = "request___request_2.87.0.tgz";
6343 path = fetchurl {
6344 name = "request___request_2.87.0.tgz";
6345 url = "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz";
6346 sha1 = "32f00235cd08d482b4d0d68db93a829c0ed5756e";
6347 };
6348 }
6349
6350 {
6351 name = "request___request_2.81.0.tgz";
6352 path = fetchurl {
6353 name = "request___request_2.81.0.tgz";
6354 url = "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz";
6355 sha1 = "c6928946a0e06c5f8d6f8a9333469ffda46298a0";
6356 };
6357 }
6358
6359 {
6360 name = "require_directory___require_directory_2.1.1.tgz";
6361 path = fetchurl {
6362 name = "require_directory___require_directory_2.1.1.tgz";
6363 url = "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz";
6364 sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
6365 };
6366 }
6367
6368 {
6369 name = "require_main_filename___require_main_filename_1.0.1.tgz";
6370 path = fetchurl {
6371 name = "require_main_filename___require_main_filename_1.0.1.tgz";
6372 url = "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz";
6373 sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
6374 };
6375 }
6376
6377 {
6378 name = "requires_port___requires_port_1.0.0.tgz";
6379 path = fetchurl {
6380 name = "requires_port___requires_port_1.0.0.tgz";
6381 url = "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz";
6382 sha1 = "925d2601d39ac485e091cf0da5c6e694dc3dcaff";
6383 };
6384 }
6385
6386 {
6387 name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
6388 path = fetchurl {
6389 name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
6390 url = "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz";
6391 sha1 = "00a9f7387556e27038eae232caa372a6a59b665a";
6392 };
6393 }
6394
6395 {
6396 name = "resolve_from___resolve_from_3.0.0.tgz";
6397 path = fetchurl {
6398 name = "resolve_from___resolve_from_3.0.0.tgz";
6399 url = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz";
6400 sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
6401 };
6402 }
6403
6404 {
6405 name = "resolve_url_loader___resolve_url_loader_2.3.0.tgz";
6406 path = fetchurl {
6407 name = "resolve_url_loader___resolve_url_loader_2.3.0.tgz";
6408 url = "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.3.0.tgz";
6409 sha1 = "e1b37034d48f22f8cfb9f04c026faaa070fdaf26";
6410 };
6411 }
6412
6413 {
6414 name = "resolve_url___resolve_url_0.2.1.tgz";
6415 path = fetchurl {
6416 name = "resolve_url___resolve_url_0.2.1.tgz";
6417 url = "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz";
6418 sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
6419 };
6420 }
6421
6422 {
6423 name = "ret___ret_0.1.15.tgz";
6424 path = fetchurl {
6425 name = "ret___ret_0.1.15.tgz";
6426 url = "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz";
6427 sha1 = "b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc";
6428 };
6429 }
6430
6431 {
6432 name = "rework_visit___rework_visit_1.0.0.tgz";
6433 path = fetchurl {
6434 name = "rework_visit___rework_visit_1.0.0.tgz";
6435 url = "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz";
6436 sha1 = "9945b2803f219e2f7aca00adb8bc9f640f842c9a";
6437 };
6438 }
6439
6440 {
6441 name = "rework___rework_1.0.1.tgz";
6442 path = fetchurl {
6443 name = "rework___rework_1.0.1.tgz";
6444 url = "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz";
6445 sha1 = "30806a841342b54510aa4110850cd48534144aa7";
6446 };
6447 }
6448
6449 {
6450 name = "right_align___right_align_0.1.3.tgz";
6451 path = fetchurl {
6452 name = "right_align___right_align_0.1.3.tgz";
6453 url = "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz";
6454 sha1 = "61339b722fe6a3515689210d24e14c96148613ef";
6455 };
6456 }
6457
6458 {
6459 name = "rimraf___rimraf_2.6.2.tgz";
6460 path = fetchurl {
6461 name = "rimraf___rimraf_2.6.2.tgz";
6462 url = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz";
6463 sha1 = "2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36";
6464 };
6465 }
6466
6467 {
6468 name = "ripemd160___ripemd160_2.0.2.tgz";
6469 path = fetchurl {
6470 name = "ripemd160___ripemd160_2.0.2.tgz";
6471 url = "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz";
6472 sha1 = "a1c1a6f624751577ba5d07914cbc92850585890c";
6473 };
6474 }
6475
6476 {
6477 name = "safe_buffer___safe_buffer_5.1.1.tgz";
6478 path = fetchurl {
6479 name = "safe_buffer___safe_buffer_5.1.1.tgz";
6480 url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz";
6481 sha1 = "893312af69b2123def71f57889001671eeb2c853";
6482 };
6483 }
6484
6485 {
6486 name = "safe_buffer___safe_buffer_5.1.2.tgz";
6487 path = fetchurl {
6488 name = "safe_buffer___safe_buffer_5.1.2.tgz";
6489 url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz";
6490 sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d";
6491 };
6492 }
6493
6494 {
6495 name = "safe_regex___safe_regex_1.1.0.tgz";
6496 path = fetchurl {
6497 name = "safe_regex___safe_regex_1.1.0.tgz";
6498 url = "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz";
6499 sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
6500 };
6501 }
6502
6503 {
6504 name = "safer_buffer___safer_buffer_2.1.2.tgz";
6505 path = fetchurl {
6506 name = "safer_buffer___safer_buffer_2.1.2.tgz";
6507 url = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz";
6508 sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a";
6509 };
6510 }
6511
6512 {
6513 name = "sass_graph___sass_graph_2.2.4.tgz";
6514 path = fetchurl {
6515 name = "sass_graph___sass_graph_2.2.4.tgz";
6516 url = "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz";
6517 sha1 = "13fbd63cd1caf0908b9fd93476ad43a51d1e0b49";
6518 };
6519 }
6520
6521 {
6522 name = "sass_loader___sass_loader_7.0.3.tgz";
6523 path = fetchurl {
6524 name = "sass_loader___sass_loader_7.0.3.tgz";
6525 url = "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.3.tgz";
6526 sha1 = "6ca10871a1cc7549f8143db5a9958242c4e4ca2a";
6527 };
6528 }
6529
6530 {
6531 name = "sax___sax_1.2.4.tgz";
6532 path = fetchurl {
6533 name = "sax___sax_1.2.4.tgz";
6534 url = "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz";
6535 sha1 = "2816234e2378bddc4e5354fab5caa895df7100d9";
6536 };
6537 }
6538
6539 {
6540 name = "schema_utils___schema_utils_0.3.0.tgz";
6541 path = fetchurl {
6542 name = "schema_utils___schema_utils_0.3.0.tgz";
6543 url = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz";
6544 sha1 = "f5877222ce3e931edae039f17eb3716e7137f8cf";
6545 };
6546 }
6547
6548 {
6549 name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz";
6550 path = fetchurl {
6551 name = "scss_tokenizer___scss_tokenizer_0.2.3.tgz";
6552 url = "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz";
6553 sha1 = "8eb06db9a9723333824d3f5530641149847ce5d1";
6554 };
6555 }
6556
6557 {
6558 name = "select_hose___select_hose_2.0.0.tgz";
6559 path = fetchurl {
6560 name = "select_hose___select_hose_2.0.0.tgz";
6561 url = "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz";
6562 sha1 = "625d8658f865af43ec962bfc376a37359a4994ca";
6563 };
6564 }
6565
6566 {
6567 name = "selfsigned___selfsigned_1.10.3.tgz";
6568 path = fetchurl {
6569 name = "selfsigned___selfsigned_1.10.3.tgz";
6570 url = "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz";
6571 sha1 = "d628ecf9e3735f84e8bafba936b3cf85bea43823";
6572 };
6573 }
6574
6575 {
6576 name = "semver___semver_5.5.0.tgz";
6577 path = fetchurl {
6578 name = "semver___semver_5.5.0.tgz";
6579 url = "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz";
6580 sha1 = "dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab";
6581 };
6582 }
6583
6584 {
6585 name = "semver___semver_5.3.0.tgz";
6586 path = fetchurl {
6587 name = "semver___semver_5.3.0.tgz";
6588 url = "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz";
6589 sha1 = "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f";
6590 };
6591 }
6592
6593 {
6594 name = "send___send_0.16.2.tgz";
6595 path = fetchurl {
6596 name = "send___send_0.16.2.tgz";
6597 url = "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz";
6598 sha1 = "6ecca1e0f8c156d141597559848df64730a6bbc1";
6599 };
6600 }
6601
6602 {
6603 name = "serve_index___serve_index_1.9.1.tgz";
6604 path = fetchurl {
6605 name = "serve_index___serve_index_1.9.1.tgz";
6606 url = "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz";
6607 sha1 = "d3768d69b1e7d82e5ce050fff5b453bea12a9239";
6608 };
6609 }
6610
6611 {
6612 name = "serve_static___serve_static_1.13.2.tgz";
6613 path = fetchurl {
6614 name = "serve_static___serve_static_1.13.2.tgz";
6615 url = "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz";
6616 sha1 = "095e8472fd5b46237db50ce486a43f4b86c6cec1";
6617 };
6618 }
6619
6620 {
6621 name = "set_blocking___set_blocking_2.0.0.tgz";
6622 path = fetchurl {
6623 name = "set_blocking___set_blocking_2.0.0.tgz";
6624 url = "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz";
6625 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
6626 };
6627 }
6628
6629 {
6630 name = "set_immediate_shim___set_immediate_shim_1.0.1.tgz";
6631 path = fetchurl {
6632 name = "set_immediate_shim___set_immediate_shim_1.0.1.tgz";
6633 url = "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz";
6634 sha1 = "4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61";
6635 };
6636 }
6637
6638 {
6639 name = "set_value___set_value_0.4.3.tgz";
6640 path = fetchurl {
6641 name = "set_value___set_value_0.4.3.tgz";
6642 url = "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz";
6643 sha1 = "7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1";
6644 };
6645 }
6646
6647 {
6648 name = "set_value___set_value_2.0.0.tgz";
6649 path = fetchurl {
6650 name = "set_value___set_value_2.0.0.tgz";
6651 url = "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz";
6652 sha1 = "71ae4a88f0feefbbf52d1ea604f3fb315ebb6274";
6653 };
6654 }
6655
6656 {
6657 name = "setimmediate___setimmediate_1.0.5.tgz";
6658 path = fetchurl {
6659 name = "setimmediate___setimmediate_1.0.5.tgz";
6660 url = "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz";
6661 sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285";
6662 };
6663 }
6664
6665 {
6666 name = "setprototypeof___setprototypeof_1.0.3.tgz";
6667 path = fetchurl {
6668 name = "setprototypeof___setprototypeof_1.0.3.tgz";
6669 url = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz";
6670 sha1 = "66567e37043eeb4f04d91bd658c0cbefb55b8e04";
6671 };
6672 }
6673
6674 {
6675 name = "setprototypeof___setprototypeof_1.1.0.tgz";
6676 path = fetchurl {
6677 name = "setprototypeof___setprototypeof_1.1.0.tgz";
6678 url = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz";
6679 sha1 = "d0bd85536887b6fe7c0d818cb962d9d91c54e656";
6680 };
6681 }
6682
6683 {
6684 name = "sha.js___sha.js_2.4.11.tgz";
6685 path = fetchurl {
6686 name = "sha.js___sha.js_2.4.11.tgz";
6687 url = "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz";
6688 sha1 = "37a5cf0b81ecbc6943de109ba2960d1b26584ae7";
6689 };
6690 }
6691
6692 {
6693 name = "shallow_clone___shallow_clone_1.0.0.tgz";
6694 path = fetchurl {
6695 name = "shallow_clone___shallow_clone_1.0.0.tgz";
6696 url = "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz";
6697 sha1 = "4480cd06e882ef68b2ad88a3ea54832e2c48b571";
6698 };
6699 }
6700
6701 {
6702 name = "shebang_command___shebang_command_1.2.0.tgz";
6703 path = fetchurl {
6704 name = "shebang_command___shebang_command_1.2.0.tgz";
6705 url = "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz";
6706 sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
6707 };
6708 }
6709
6710 {
6711 name = "shebang_regex___shebang_regex_1.0.0.tgz";
6712 path = fetchurl {
6713 name = "shebang_regex___shebang_regex_1.0.0.tgz";
6714 url = "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz";
6715 sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
6716 };
6717 }
6718
6719 {
6720 name = "signal_exit___signal_exit_3.0.2.tgz";
6721 path = fetchurl {
6722 name = "signal_exit___signal_exit_3.0.2.tgz";
6723 url = "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz";
6724 sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
6725 };
6726 }
6727
6728 {
6729 name = "slash___slash_1.0.0.tgz";
6730 path = fetchurl {
6731 name = "slash___slash_1.0.0.tgz";
6732 url = "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz";
6733 sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55";
6734 };
6735 }
6736
6737 {
6738 name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
6739 path = fetchurl {
6740 name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
6741 url = "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
6742 sha1 = "6c175f86ff14bdb0724563e8f3c1b021a286853b";
6743 };
6744 }
6745
6746 {
6747 name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
6748 path = fetchurl {
6749 name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
6750 url = "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
6751 sha1 = "f956479486f2acd79700693f6f7b805e45ab56e2";
6752 };
6753 }
6754
6755 {
6756 name = "snapdragon___snapdragon_0.8.2.tgz";
6757 path = fetchurl {
6758 name = "snapdragon___snapdragon_0.8.2.tgz";
6759 url = "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz";
6760 sha1 = "64922e7c565b0e14204ba1aa7d6964278d25182d";
6761 };
6762 }
6763
6764 {
6765 name = "sntp___sntp_1.0.9.tgz";
6766 path = fetchurl {
6767 name = "sntp___sntp_1.0.9.tgz";
6768 url = "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz";
6769 sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198";
6770 };
6771 }
6772
6773 {
6774 name = "sockjs_client___sockjs_client_1.1.4.tgz";
6775 path = fetchurl {
6776 name = "sockjs_client___sockjs_client_1.1.4.tgz";
6777 url = "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz";
6778 sha1 = "5babe386b775e4cf14e7520911452654016c8b12";
6779 };
6780 }
6781
6782 {
6783 name = "sockjs___sockjs_0.3.19.tgz";
6784 path = fetchurl {
6785 name = "sockjs___sockjs_0.3.19.tgz";
6786 url = "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz";
6787 sha1 = "d976bbe800af7bd20ae08598d582393508993c0d";
6788 };
6789 }
6790
6791 {
6792 name = "sort_keys___sort_keys_1.1.2.tgz";
6793 path = fetchurl {
6794 name = "sort_keys___sort_keys_1.1.2.tgz";
6795 url = "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz";
6796 sha1 = "441b6d4d346798f1b4e49e8920adfba0e543f9ad";
6797 };
6798 }
6799
6800 {
6801 name = "source_list_map___source_list_map_0.1.8.tgz";
6802 path = fetchurl {
6803 name = "source_list_map___source_list_map_0.1.8.tgz";
6804 url = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz";
6805 sha1 = "c550b2ab5427f6b3f21f5afead88c4f5587b2106";
6806 };
6807 }
6808
6809 {
6810 name = "source_list_map___source_list_map_2.0.0.tgz";
6811 path = fetchurl {
6812 name = "source_list_map___source_list_map_2.0.0.tgz";
6813 url = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz";
6814 sha1 = "aaa47403f7b245a92fbc97ea08f250d6087ed085";
6815 };
6816 }
6817
6818 {
6819 name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
6820 path = fetchurl {
6821 name = "source_map_resolve___source_map_resolve_0.5.2.tgz";
6822 url = "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz";
6823 sha1 = "72e2cc34095543e43b2c62b2c4c10d4a9054f259";
6824 };
6825 }
6826
6827 {
6828 name = "source_map_support___source_map_support_0.4.18.tgz";
6829 path = fetchurl {
6830 name = "source_map_support___source_map_support_0.4.18.tgz";
6831 url = "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz";
6832 sha1 = "0286a6de8be42641338594e97ccea75f0a2c585f";
6833 };
6834 }
6835
6836 {
6837 name = "source_map_url___source_map_url_0.4.0.tgz";
6838 path = fetchurl {
6839 name = "source_map_url___source_map_url_0.4.0.tgz";
6840 url = "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz";
6841 sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
6842 };
6843 }
6844
6845 {
6846 name = "source_map___source_map_0.1.43.tgz";
6847 path = fetchurl {
6848 name = "source_map___source_map_0.1.43.tgz";
6849 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz";
6850 sha1 = "c24bc146ca517c1471f5dacbe2571b2b7f9e3346";
6851 };
6852 }
6853
6854 {
6855 name = "source_map___source_map_0.4.4.tgz";
6856 path = fetchurl {
6857 name = "source_map___source_map_0.4.4.tgz";
6858 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz";
6859 sha1 = "eba4f5da9c0dc999de68032d8b4f76173652036b";
6860 };
6861 }
6862
6863 {
6864 name = "source_map___source_map_0.5.7.tgz";
6865 path = fetchurl {
6866 name = "source_map___source_map_0.5.7.tgz";
6867 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz";
6868 sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
6869 };
6870 }
6871
6872 {
6873 name = "source_map___source_map_0.6.1.tgz";
6874 path = fetchurl {
6875 name = "source_map___source_map_0.6.1.tgz";
6876 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz";
6877 sha1 = "74722af32e9614e9c287a8d0bbde48b5e2f1a263";
6878 };
6879 }
6880
6881 {
6882 name = "spdx_correct___spdx_correct_3.0.0.tgz";
6883 path = fetchurl {
6884 name = "spdx_correct___spdx_correct_3.0.0.tgz";
6885 url = "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz";
6886 sha1 = "05a5b4d7153a195bc92c3c425b69f3b2a9524c82";
6887 };
6888 }
6889
6890 {
6891 name = "spdx_exceptions___spdx_exceptions_2.1.0.tgz";
6892 path = fetchurl {
6893 name = "spdx_exceptions___spdx_exceptions_2.1.0.tgz";
6894 url = "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz";
6895 sha1 = "2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9";
6896 };
6897 }
6898
6899 {
6900 name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
6901 path = fetchurl {
6902 name = "spdx_expression_parse___spdx_expression_parse_3.0.0.tgz";
6903 url = "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
6904 sha1 = "99e119b7a5da00e05491c9fa338b7904823b41d0";
6905 };
6906 }
6907
6908 {
6909 name = "spdx_license_ids___spdx_license_ids_3.0.0.tgz";
6910 path = fetchurl {
6911 name = "spdx_license_ids___spdx_license_ids_3.0.0.tgz";
6912 url = "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz";
6913 sha1 = "7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87";
6914 };
6915 }
6916
6917 {
6918 name = "spdy_transport___spdy_transport_2.1.0.tgz";
6919 path = fetchurl {
6920 name = "spdy_transport___spdy_transport_2.1.0.tgz";
6921 url = "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz";
6922 sha1 = "4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1";
6923 };
6924 }
6925
6926 {
6927 name = "spdy___spdy_3.4.7.tgz";
6928 path = fetchurl {
6929 name = "spdy___spdy_3.4.7.tgz";
6930 url = "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz";
6931 sha1 = "42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc";
6932 };
6933 }
6934
6935 {
6936 name = "split_string___split_string_3.1.0.tgz";
6937 path = fetchurl {
6938 name = "split_string___split_string_3.1.0.tgz";
6939 url = "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz";
6940 sha1 = "7cb09dda3a86585705c64b39a6466038682e8fe2";
6941 };
6942 }
6943
6944 {
6945 name = "sprintf_js___sprintf_js_1.0.3.tgz";
6946 path = fetchurl {
6947 name = "sprintf_js___sprintf_js_1.0.3.tgz";
6948 url = "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz";
6949 sha1 = "04e6926f662895354f3dd015203633b857297e2c";
6950 };
6951 }
6952
6953 {
6954 name = "sshpk___sshpk_1.14.2.tgz";
6955 path = fetchurl {
6956 name = "sshpk___sshpk_1.14.2.tgz";
6957 url = "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz";
6958 sha1 = "c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98";
6959 };
6960 }
6961
6962 {
6963 name = "stackframe___stackframe_1.0.4.tgz";
6964 path = fetchurl {
6965 name = "stackframe___stackframe_1.0.4.tgz";
6966 url = "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz";
6967 sha1 = "357b24a992f9427cba6b545d96a14ed2cbca187b";
6968 };
6969 }
6970
6971 {
6972 name = "static_extend___static_extend_0.1.2.tgz";
6973 path = fetchurl {
6974 name = "static_extend___static_extend_0.1.2.tgz";
6975 url = "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz";
6976 sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
6977 };
6978 }
6979
6980 {
6981 name = "statuses___statuses_1.5.0.tgz";
6982 path = fetchurl {
6983 name = "statuses___statuses_1.5.0.tgz";
6984 url = "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz";
6985 sha1 = "161c7dac177659fd9811f43771fa99381478628c";
6986 };
6987 }
6988
6989 {
6990 name = "statuses___statuses_1.4.0.tgz";
6991 path = fetchurl {
6992 name = "statuses___statuses_1.4.0.tgz";
6993 url = "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz";
6994 sha1 = "bb73d446da2796106efcc1b601a253d6c46bd087";
6995 };
6996 }
6997
6998 {
6999 name = "stdout_stream___stdout_stream_1.4.0.tgz";
7000 path = fetchurl {
7001 name = "stdout_stream___stdout_stream_1.4.0.tgz";
7002 url = "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz";
7003 sha1 = "a2c7c8587e54d9427ea9edb3ac3f2cd522df378b";
7004 };
7005 }
7006
7007 {
7008 name = "stream_browserify___stream_browserify_2.0.1.tgz";
7009 path = fetchurl {
7010 name = "stream_browserify___stream_browserify_2.0.1.tgz";
7011 url = "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz";
7012 sha1 = "66266ee5f9bdb9940a4e4514cafb43bb71e5c9db";
7013 };
7014 }
7015
7016 {
7017 name = "stream_http___stream_http_2.8.3.tgz";
7018 path = fetchurl {
7019 name = "stream_http___stream_http_2.8.3.tgz";
7020 url = "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz";
7021 sha1 = "b2d242469288a5a27ec4fe8933acf623de6514fc";
7022 };
7023 }
7024
7025 {
7026 name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz";
7027 path = fetchurl {
7028 name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz";
7029 url = "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz";
7030 sha1 = "279b225df1d582b1f54e65addd4352e18faa0713";
7031 };
7032 }
7033
7034 {
7035 name = "string_width___string_width_1.0.2.tgz";
7036 path = fetchurl {
7037 name = "string_width___string_width_1.0.2.tgz";
7038 url = "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz";
7039 sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
7040 };
7041 }
7042
7043 {
7044 name = "string_width___string_width_2.1.1.tgz";
7045 path = fetchurl {
7046 name = "string_width___string_width_2.1.1.tgz";
7047 url = "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz";
7048 sha1 = "ab93f27a8dc13d28cac815c462143a6d9012ae9e";
7049 };
7050 }
7051
7052 {
7053 name = "string_decoder___string_decoder_1.1.1.tgz";
7054 path = fetchurl {
7055 name = "string_decoder___string_decoder_1.1.1.tgz";
7056 url = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz";
7057 sha1 = "9cf1611ba62685d7030ae9e4ba34149c3af03fc8";
7058 };
7059 }
7060
7061 {
7062 name = "string_decoder___string_decoder_0.10.31.tgz";
7063 path = fetchurl {
7064 name = "string_decoder___string_decoder_0.10.31.tgz";
7065 url = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz";
7066 sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
7067 };
7068 }
7069
7070 {
7071 name = "stringstream___stringstream_0.0.6.tgz";
7072 path = fetchurl {
7073 name = "stringstream___stringstream_0.0.6.tgz";
7074 url = "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz";
7075 sha1 = "7880225b0d4ad10e30927d167a1d6f2fd3b33a72";
7076 };
7077 }
7078
7079 {
7080 name = "strip_ansi___strip_ansi_3.0.1.tgz";
7081 path = fetchurl {
7082 name = "strip_ansi___strip_ansi_3.0.1.tgz";
7083 url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz";
7084 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
7085 };
7086 }
7087
7088 {
7089 name = "strip_ansi___strip_ansi_4.0.0.tgz";
7090 path = fetchurl {
7091 name = "strip_ansi___strip_ansi_4.0.0.tgz";
7092 url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz";
7093 sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
7094 };
7095 }
7096
7097 {
7098 name = "strip_bom___strip_bom_2.0.0.tgz";
7099 path = fetchurl {
7100 name = "strip_bom___strip_bom_2.0.0.tgz";
7101 url = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz";
7102 sha1 = "6219a85616520491f35788bdbf1447a99c7e6b0e";
7103 };
7104 }
7105
7106 {
7107 name = "strip_bom___strip_bom_3.0.0.tgz";
7108 path = fetchurl {
7109 name = "strip_bom___strip_bom_3.0.0.tgz";
7110 url = "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz";
7111 sha1 = "2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3";
7112 };
7113 }
7114
7115 {
7116 name = "strip_eof___strip_eof_1.0.0.tgz";
7117 path = fetchurl {
7118 name = "strip_eof___strip_eof_1.0.0.tgz";
7119 url = "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz";
7120 sha1 = "bb43ff5598a6eb05d89b59fcd129c983313606bf";
7121 };
7122 }
7123
7124 {
7125 name = "strip_indent___strip_indent_1.0.1.tgz";
7126 path = fetchurl {
7127 name = "strip_indent___strip_indent_1.0.1.tgz";
7128 url = "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz";
7129 sha1 = "0c7962a6adefa7bbd4ac366460a638552ae1a0a2";
7130 };
7131 }
7132
7133 {
7134 name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
7135 path = fetchurl {
7136 name = "strip_json_comments___strip_json_comments_2.0.1.tgz";
7137 url = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz";
7138 sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a";
7139 };
7140 }
7141
7142 {
7143 name = "style_loader___style_loader_0.13.2.tgz";
7144 path = fetchurl {
7145 name = "style_loader___style_loader_0.13.2.tgz";
7146 url = "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz";
7147 sha1 = "74533384cf698c7104c7951150b49717adc2f3bb";
7148 };
7149 }
7150
7151 {
7152 name = "summernote___summernote_0.8.10.tgz";
7153 path = fetchurl {
7154 name = "summernote___summernote_0.8.10.tgz";
7155 url = "https://registry.yarnpkg.com/summernote/-/summernote-0.8.10.tgz";
7156 sha1 = "21a5d7f18a3b07500b58b60d5907417a54897520";
7157 };
7158 }
7159
7160 {
7161 name = "supports_color___supports_color_2.0.0.tgz";
7162 path = fetchurl {
7163 name = "supports_color___supports_color_2.0.0.tgz";
7164 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz";
7165 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
7166 };
7167 }
7168
7169 {
7170 name = "supports_color___supports_color_3.2.3.tgz";
7171 path = fetchurl {
7172 name = "supports_color___supports_color_3.2.3.tgz";
7173 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz";
7174 sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6";
7175 };
7176 }
7177
7178 {
7179 name = "supports_color___supports_color_4.5.0.tgz";
7180 path = fetchurl {
7181 name = "supports_color___supports_color_4.5.0.tgz";
7182 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz";
7183 sha1 = "be7a0de484dec5c5cddf8b3d59125044912f635b";
7184 };
7185 }
7186
7187 {
7188 name = "supports_color___supports_color_5.4.0.tgz";
7189 path = fetchurl {
7190 name = "supports_color___supports_color_5.4.0.tgz";
7191 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz";
7192 sha1 = "1c6b337402c2137605efe19f10fec390f6faab54";
7193 };
7194 }
7195
7196 {
7197 name = "svgo___svgo_0.7.2.tgz";
7198 path = fetchurl {
7199 name = "svgo___svgo_0.7.2.tgz";
7200 url = "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz";
7201 sha1 = "9f5772413952135c6fefbf40afe6a4faa88b4bb5";
7202 };
7203 }
7204
7205 {
7206 name = "tapable___tapable_0.2.8.tgz";
7207 path = fetchurl {
7208 name = "tapable___tapable_0.2.8.tgz";
7209 url = "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz";
7210 sha1 = "99372a5c999bf2df160afc0d74bed4f47948cd22";
7211 };
7212 }
7213
7214 {
7215 name = "tar___tar_2.2.1.tgz";
7216 path = fetchurl {
7217 name = "tar___tar_2.2.1.tgz";
7218 url = "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz";
7219 sha1 = "8e4d2a256c0e2185c6b18ad694aec968b83cb1d1";
7220 };
7221 }
7222
7223 {
7224 name = "tar___tar_4.4.4.tgz";
7225 path = fetchurl {
7226 name = "tar___tar_4.4.4.tgz";
7227 url = "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz";
7228 sha1 = "ec8409fae9f665a4355cc3b4087d0820232bb8cd";
7229 };
7230 }
7231
7232 {
7233 name = "thunky___thunky_1.0.2.tgz";
7234 path = fetchurl {
7235 name = "thunky___thunky_1.0.2.tgz";
7236 url = "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz";
7237 sha1 = "a862e018e3fb1ea2ec3fce5d55605cf57f247371";
7238 };
7239 }
7240
7241 {
7242 name = "time_stamp___time_stamp_2.0.0.tgz";
7243 path = fetchurl {
7244 name = "time_stamp___time_stamp_2.0.0.tgz";
7245 url = "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz";
7246 sha1 = "95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357";
7247 };
7248 }
7249
7250 {
7251 name = "timers_browserify___timers_browserify_2.0.10.tgz";
7252 path = fetchurl {
7253 name = "timers_browserify___timers_browserify_2.0.10.tgz";
7254 url = "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz";
7255 sha1 = "1d28e3d2aadf1d5a5996c4e9f95601cd053480ae";
7256 };
7257 }
7258
7259 {
7260 name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
7261 path = fetchurl {
7262 name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
7263 url = "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
7264 sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
7265 };
7266 }
7267
7268 {
7269 name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
7270 path = fetchurl {
7271 name = "to_fast_properties___to_fast_properties_1.0.3.tgz";
7272 url = "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz";
7273 sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47";
7274 };
7275 }
7276
7277 {
7278 name = "to_object_path___to_object_path_0.3.0.tgz";
7279 path = fetchurl {
7280 name = "to_object_path___to_object_path_0.3.0.tgz";
7281 url = "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz";
7282 sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
7283 };
7284 }
7285
7286 {
7287 name = "to_regex_range___to_regex_range_2.1.1.tgz";
7288 path = fetchurl {
7289 name = "to_regex_range___to_regex_range_2.1.1.tgz";
7290 url = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz";
7291 sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
7292 };
7293 }
7294
7295 {
7296 name = "to_regex___to_regex_3.0.2.tgz";
7297 path = fetchurl {
7298 name = "to_regex___to_regex_3.0.2.tgz";
7299 url = "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz";
7300 sha1 = "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce";
7301 };
7302 }
7303
7304 {
7305 name = "tough_cookie___tough_cookie_2.3.4.tgz";
7306 path = fetchurl {
7307 name = "tough_cookie___tough_cookie_2.3.4.tgz";
7308 url = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz";
7309 sha1 = "ec60cee38ac675063ffc97a5c18970578ee83655";
7310 };
7311 }
7312
7313 {
7314 name = "trim_newlines___trim_newlines_1.0.0.tgz";
7315 path = fetchurl {
7316 name = "trim_newlines___trim_newlines_1.0.0.tgz";
7317 url = "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz";
7318 sha1 = "5887966bb582a4503a41eb524f7d35011815a613";
7319 };
7320 }
7321
7322 {
7323 name = "trim_right___trim_right_1.0.1.tgz";
7324 path = fetchurl {
7325 name = "trim_right___trim_right_1.0.1.tgz";
7326 url = "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz";
7327 sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003";
7328 };
7329 }
7330
7331 {
7332 name = "true_case_path___true_case_path_1.0.2.tgz";
7333 path = fetchurl {
7334 name = "true_case_path___true_case_path_1.0.2.tgz";
7335 url = "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz";
7336 sha1 = "7ec91130924766c7f573be3020c34f8fdfd00d62";
7337 };
7338 }
7339
7340 {
7341 name = "tty_browserify___tty_browserify_0.0.0.tgz";
7342 path = fetchurl {
7343 name = "tty_browserify___tty_browserify_0.0.0.tgz";
7344 url = "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz";
7345 sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6";
7346 };
7347 }
7348
7349 {
7350 name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
7351 path = fetchurl {
7352 name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
7353 url = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
7354 sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
7355 };
7356 }
7357
7358 {
7359 name = "tweetnacl___tweetnacl_0.14.5.tgz";
7360 path = fetchurl {
7361 name = "tweetnacl___tweetnacl_0.14.5.tgz";
7362 url = "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz";
7363 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
7364 };
7365 }
7366
7367 {
7368 name = "type_is___type_is_1.6.16.tgz";
7369 path = fetchurl {
7370 name = "type_is___type_is_1.6.16.tgz";
7371 url = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz";
7372 sha1 = "f89ce341541c672b25ee7ae3c73dee3b2be50194";
7373 };
7374 }
7375
7376 {
7377 name = "uglify_js___uglify_js_2.8.29.tgz";
7378 path = fetchurl {
7379 name = "uglify_js___uglify_js_2.8.29.tgz";
7380 url = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz";
7381 sha1 = "29c5733148057bb4e1f75df35b7a9cb72e6a59dd";
7382 };
7383 }
7384
7385 {
7386 name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz";
7387 path = fetchurl {
7388 name = "uglify_to_browserify___uglify_to_browserify_1.0.2.tgz";
7389 url = "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz";
7390 sha1 = "6e0924d6bda6b5afe349e39a6d632850a0f882b7";
7391 };
7392 }
7393
7394 {
7395 name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_0.4.6.tgz";
7396 path = fetchurl {
7397 name = "uglifyjs_webpack_plugin___uglifyjs_webpack_plugin_0.4.6.tgz";
7398 url = "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz";
7399 sha1 = "b951f4abb6bd617e66f63eb891498e391763e309";
7400 };
7401 }
7402
7403 {
7404 name = "union_value___union_value_1.0.0.tgz";
7405 path = fetchurl {
7406 name = "union_value___union_value_1.0.0.tgz";
7407 url = "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz";
7408 sha1 = "5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4";
7409 };
7410 }
7411
7412 {
7413 name = "uniq___uniq_1.0.1.tgz";
7414 path = fetchurl {
7415 name = "uniq___uniq_1.0.1.tgz";
7416 url = "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz";
7417 sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
7418 };
7419 }
7420
7421 {
7422 name = "uniqs___uniqs_2.0.0.tgz";
7423 path = fetchurl {
7424 name = "uniqs___uniqs_2.0.0.tgz";
7425 url = "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz";
7426 sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02";
7427 };
7428 }
7429
7430 {
7431 name = "unpipe___unpipe_1.0.0.tgz";
7432 path = fetchurl {
7433 name = "unpipe___unpipe_1.0.0.tgz";
7434 url = "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz";
7435 sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
7436 };
7437 }
7438
7439 {
7440 name = "unset_value___unset_value_1.0.0.tgz";
7441 path = fetchurl {
7442 name = "unset_value___unset_value_1.0.0.tgz";
7443 url = "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz";
7444 sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
7445 };
7446 }
7447
7448 {
7449 name = "upath___upath_1.1.0.tgz";
7450 path = fetchurl {
7451 name = "upath___upath_1.1.0.tgz";
7452 url = "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz";
7453 sha1 = "35256597e46a581db4793d0ce47fa9aebfc9fabd";
7454 };
7455 }
7456
7457 {
7458 name = "uri_js___uri_js_4.2.2.tgz";
7459 path = fetchurl {
7460 name = "uri_js___uri_js_4.2.2.tgz";
7461 url = "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz";
7462 sha1 = "94c540e1ff772956e2299507c010aea6c8838eb0";
7463 };
7464 }
7465
7466 {
7467 name = "urix___urix_0.1.0.tgz";
7468 path = fetchurl {
7469 name = "urix___urix_0.1.0.tgz";
7470 url = "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz";
7471 sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
7472 };
7473 }
7474
7475 {
7476 name = "url_parse___url_parse_1.4.1.tgz";
7477 path = fetchurl {
7478 name = "url_parse___url_parse_1.4.1.tgz";
7479 url = "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.1.tgz";
7480 sha1 = "4dec9dad3dc8585f862fed461d2e19bbf623df30";
7481 };
7482 }
7483
7484 {
7485 name = "url___url_0.11.0.tgz";
7486 path = fetchurl {
7487 name = "url___url_0.11.0.tgz";
7488 url = "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz";
7489 sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
7490 };
7491 }
7492
7493 {
7494 name = "use___use_3.1.1.tgz";
7495 path = fetchurl {
7496 name = "use___use_3.1.1.tgz";
7497 url = "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz";
7498 sha1 = "d50c8cac79a19fbc20f2911f56eb973f4e10070f";
7499 };
7500 }
7501
7502 {
7503 name = "util_deprecate___util_deprecate_1.0.2.tgz";
7504 path = fetchurl {
7505 name = "util_deprecate___util_deprecate_1.0.2.tgz";
7506 url = "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz";
7507 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
7508 };
7509 }
7510
7511 {
7512 name = "util___util_0.10.3.tgz";
7513 path = fetchurl {
7514 name = "util___util_0.10.3.tgz";
7515 url = "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz";
7516 sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
7517 };
7518 }
7519
7520 {
7521 name = "util___util_0.10.4.tgz";
7522 path = fetchurl {
7523 name = "util___util_0.10.4.tgz";
7524 url = "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz";
7525 sha1 = "3aa0125bfe668a4672de58857d3ace27ecb76901";
7526 };
7527 }
7528
7529 {
7530 name = "utila___utila_0.3.3.tgz";
7531 path = fetchurl {
7532 name = "utila___utila_0.3.3.tgz";
7533 url = "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz";
7534 sha1 = "d7e8e7d7e309107092b05f8d9688824d633a4226";
7535 };
7536 }
7537
7538 {
7539 name = "utila___utila_0.4.0.tgz";
7540 path = fetchurl {
7541 name = "utila___utila_0.4.0.tgz";
7542 url = "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz";
7543 sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c";
7544 };
7545 }
7546
7547 {
7548 name = "utils_merge___utils_merge_1.0.1.tgz";
7549 path = fetchurl {
7550 name = "utils_merge___utils_merge_1.0.1.tgz";
7551 url = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz";
7552 sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
7553 };
7554 }
7555
7556 {
7557 name = "uuid___uuid_3.3.2.tgz";
7558 path = fetchurl {
7559 name = "uuid___uuid_3.3.2.tgz";
7560 url = "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz";
7561 sha1 = "1b4af4955eb3077c501c23872fc6513811587131";
7562 };
7563 }
7564
7565 {
7566 name = "validate_npm_package_license___validate_npm_package_license_3.0.3.tgz";
7567 path = fetchurl {
7568 name = "validate_npm_package_license___validate_npm_package_license_3.0.3.tgz";
7569 url = "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz";
7570 sha1 = "81643bcbef1bdfecd4623793dc4648948ba98338";
7571 };
7572 }
7573
7574 {
7575 name = "vary___vary_1.1.2.tgz";
7576 path = fetchurl {
7577 name = "vary___vary_1.1.2.tgz";
7578 url = "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz";
7579 sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc";
7580 };
7581 }
7582
7583 {
7584 name = "vendors___vendors_1.0.2.tgz";
7585 path = fetchurl {
7586 name = "vendors___vendors_1.0.2.tgz";
7587 url = "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz";
7588 sha1 = "7fcb5eef9f5623b156bcea89ec37d63676f21801";
7589 };
7590 }
7591
7592 {
7593 name = "verror___verror_1.10.0.tgz";
7594 path = fetchurl {
7595 name = "verror___verror_1.10.0.tgz";
7596 url = "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz";
7597 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
7598 };
7599 }
7600
7601 {
7602 name = "vm_browserify___vm_browserify_0.0.4.tgz";
7603 path = fetchurl {
7604 name = "vm_browserify___vm_browserify_0.0.4.tgz";
7605 url = "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz";
7606 sha1 = "5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73";
7607 };
7608 }
7609
7610 {
7611 name = "watchpack___watchpack_1.6.0.tgz";
7612 path = fetchurl {
7613 name = "watchpack___watchpack_1.6.0.tgz";
7614 url = "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz";
7615 sha1 = "4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00";
7616 };
7617 }
7618
7619 {
7620 name = "wbuf___wbuf_1.7.3.tgz";
7621 path = fetchurl {
7622 name = "wbuf___wbuf_1.7.3.tgz";
7623 url = "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz";
7624 sha1 = "c1d8d149316d3ea852848895cb6a0bfe887b87df";
7625 };
7626 }
7627
7628 {
7629 name = "webpack_chunk_hash___webpack_chunk_hash_0.5.0.tgz";
7630 path = fetchurl {
7631 name = "webpack_chunk_hash___webpack_chunk_hash_0.5.0.tgz";
7632 url = "https://registry.yarnpkg.com/webpack-chunk-hash/-/webpack-chunk-hash-0.5.0.tgz";
7633 sha1 = "1dba38203d73c1e6ab069b6810a5a37402399dec";
7634 };
7635 }
7636
7637 {
7638 name = "webpack_dev_middleware___webpack_dev_middleware_1.12.2.tgz";
7639 path = fetchurl {
7640 name = "webpack_dev_middleware___webpack_dev_middleware_1.12.2.tgz";
7641 url = "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz";
7642 sha1 = "f8fc1120ce3b4fc5680ceecb43d777966b21105e";
7643 };
7644 }
7645
7646 {
7647 name = "webpack_dev_server___webpack_dev_server_2.11.2.tgz";
7648 path = fetchurl {
7649 name = "webpack_dev_server___webpack_dev_server_2.11.2.tgz";
7650 url = "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz";
7651 sha1 = "1f4f4c78bf1895378f376815910812daf79a216f";
7652 };
7653 }
7654
7655 {
7656 name = "webpack_sources___webpack_sources_1.1.0.tgz";
7657 path = fetchurl {
7658 name = "webpack_sources___webpack_sources_1.1.0.tgz";
7659 url = "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz";
7660 sha1 = "a101ebae59d6507354d71d8013950a3a8b7a5a54";
7661 };
7662 }
7663
7664 {
7665 name = "webpack___webpack_3.12.0.tgz";
7666 path = fetchurl {
7667 name = "webpack___webpack_3.12.0.tgz";
7668 url = "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz";
7669 sha1 = "3f9e34360370602fcf639e97939db486f4ec0d74";
7670 };
7671 }
7672
7673 {
7674 name = "websocket_driver___websocket_driver_0.7.0.tgz";
7675 path = fetchurl {
7676 name = "websocket_driver___websocket_driver_0.7.0.tgz";
7677 url = "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz";
7678 sha1 = "0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb";
7679 };
7680 }
7681
7682 {
7683 name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
7684 path = fetchurl {
7685 name = "websocket_extensions___websocket_extensions_0.1.3.tgz";
7686 url = "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz";
7687 sha1 = "5d2ff22977003ec687a4b87073dfbbac146ccf29";
7688 };
7689 }
7690
7691 {
7692 name = "whet.extend___whet.extend_0.9.9.tgz";
7693 path = fetchurl {
7694 name = "whet.extend___whet.extend_0.9.9.tgz";
7695 url = "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz";
7696 sha1 = "f877d5bf648c97e5aa542fadc16d6a259b9c11a1";
7697 };
7698 }
7699
7700 {
7701 name = "which_module___which_module_1.0.0.tgz";
7702 path = fetchurl {
7703 name = "which_module___which_module_1.0.0.tgz";
7704 url = "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz";
7705 sha1 = "bba63ca861948994ff307736089e3b96026c2a4f";
7706 };
7707 }
7708
7709 {
7710 name = "which_module___which_module_2.0.0.tgz";
7711 path = fetchurl {
7712 name = "which_module___which_module_2.0.0.tgz";
7713 url = "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz";
7714 sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
7715 };
7716 }
7717
7718 {
7719 name = "which___which_1.3.1.tgz";
7720 path = fetchurl {
7721 name = "which___which_1.3.1.tgz";
7722 url = "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz";
7723 sha1 = "a45043d54f5805316da8d62f9f50918d3da70b0a";
7724 };
7725 }
7726
7727 {
7728 name = "wide_align___wide_align_1.1.3.tgz";
7729 path = fetchurl {
7730 name = "wide_align___wide_align_1.1.3.tgz";
7731 url = "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz";
7732 sha1 = "ae074e6bdc0c14a431e804e624549c633b000457";
7733 };
7734 }
7735
7736 {
7737 name = "window_size___window_size_0.1.0.tgz";
7738 path = fetchurl {
7739 name = "window_size___window_size_0.1.0.tgz";
7740 url = "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz";
7741 sha1 = "5438cd2ea93b202efa3a19fe8887aee7c94f9c9d";
7742 };
7743 }
7744
7745 {
7746 name = "wordwrap___wordwrap_0.0.2.tgz";
7747 path = fetchurl {
7748 name = "wordwrap___wordwrap_0.0.2.tgz";
7749 url = "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz";
7750 sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f";
7751 };
7752 }
7753
7754 {
7755 name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
7756 path = fetchurl {
7757 name = "wrap_ansi___wrap_ansi_2.1.0.tgz";
7758 url = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz";
7759 sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85";
7760 };
7761 }
7762
7763 {
7764 name = "wrappy___wrappy_1.0.2.tgz";
7765 path = fetchurl {
7766 name = "wrappy___wrappy_1.0.2.tgz";
7767 url = "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz";
7768 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
7769 };
7770 }
7771
7772 {
7773 name = "xtend___xtend_4.0.1.tgz";
7774 path = fetchurl {
7775 name = "xtend___xtend_4.0.1.tgz";
7776 url = "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz";
7777 sha1 = "a5c6d532be656e23db820efb943a1f04998d63af";
7778 };
7779 }
7780
7781 {
7782 name = "y18n___y18n_3.2.1.tgz";
7783 path = fetchurl {
7784 name = "y18n___y18n_3.2.1.tgz";
7785 url = "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz";
7786 sha1 = "6d15fba884c08679c0d77e88e7759e811e07fa41";
7787 };
7788 }
7789
7790 {
7791 name = "yallist___yallist_2.1.2.tgz";
7792 path = fetchurl {
7793 name = "yallist___yallist_2.1.2.tgz";
7794 url = "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz";
7795 sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
7796 };
7797 }
7798
7799 {
7800 name = "yallist___yallist_3.0.2.tgz";
7801 path = fetchurl {
7802 name = "yallist___yallist_3.0.2.tgz";
7803 url = "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz";
7804 sha1 = "8452b4bb7e83c7c188d8041c1a837c773d6d8bb9";
7805 };
7806 }
7807
7808 {
7809 name = "yargs_parser___yargs_parser_4.2.1.tgz";
7810 path = fetchurl {
7811 name = "yargs_parser___yargs_parser_4.2.1.tgz";
7812 url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz";
7813 sha1 = "29cceac0dc4f03c6c87b4a9f217dd18c9f74871c";
7814 };
7815 }
7816
7817 {
7818 name = "yargs_parser___yargs_parser_5.0.0.tgz";
7819 path = fetchurl {
7820 name = "yargs_parser___yargs_parser_5.0.0.tgz";
7821 url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz";
7822 sha1 = "275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a";
7823 };
7824 }
7825
7826 {
7827 name = "yargs_parser___yargs_parser_7.0.0.tgz";
7828 path = fetchurl {
7829 name = "yargs_parser___yargs_parser_7.0.0.tgz";
7830 url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz";
7831 sha1 = "8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9";
7832 };
7833 }
7834
7835 {
7836 name = "yargs___yargs_6.6.0.tgz";
7837 path = fetchurl {
7838 name = "yargs___yargs_6.6.0.tgz";
7839 url = "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz";
7840 sha1 = "782ec21ef403345f830a808ca3d513af56065208";
7841 };
7842 }
7843
7844 {
7845 name = "yargs___yargs_7.1.0.tgz";
7846 path = fetchurl {
7847 name = "yargs___yargs_7.1.0.tgz";
7848 url = "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz";
7849 sha1 = "6ba318eb16961727f5d284f8ea003e8d6154d0c8";
7850 };
7851 }
7852
7853 {
7854 name = "yargs___yargs_8.0.2.tgz";
7855 path = fetchurl {
7856 name = "yargs___yargs_8.0.2.tgz";
7857 url = "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz";
7858 sha1 = "6299a9055b1cefc969ff7e79c1d918dceb22c360";
7859 };
7860 }
7861
7862 {
7863 name = "yargs___yargs_3.10.0.tgz";
7864 path = fetchurl {
7865 name = "yargs___yargs_3.10.0.tgz";
7866 url = "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz";
7867 sha1 = "f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1";
7868 };
7869 }
7870 ];
7871}
diff --git a/modules/private/websites/isabelle/aten_integration.nix b/modules/private/websites/isabelle/aten_integration.nix
deleted file mode 100644
index c55ef92..0000000
--- a/modules/private/websites/isabelle/aten_integration.nix
+++ /dev/null
@@ -1,91 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 secrets = config.myEnv.websites.isabelle.aten_integration;
4 webRoot = "/var/lib/ftp/immae/aten/public";
5 cfg = config.myServices.websites.isabelle.aten_integration;
6 pcfg = config.services.phpApplication;
7in {
8 options.myServices.websites.isabelle.aten_integration.enable = lib.mkEnableOption "enable Aten's website in integration";
9
10 config = lib.mkIf cfg.enable {
11 services.phpApplication.apps.isabelle_aten_integration = {
12 websiteEnv = "integration";
13 httpdUser = config.services.httpd.Inte.user;
14 httpdGroup = config.services.httpd.Inte.group;
15 httpdWatchFiles = [
16 config.secrets.fullPaths."websites/isabelle/aten_integration"
17 ];
18 inherit webRoot;
19 varDir = "/var/lib/ftp/immae/aten_var";
20 app = "/var/lib/ftp/immae/aten";
21 serviceDeps = [ "postgresql.service" ];
22 preStartActions = [
23 "APP_ENV=dev ./bin/console --env=dev cache:clear --no-warmup"
24 ];
25 phpOpenbasedir = [ "/tmp" ];
26 phpPool = {
27 "php_admin_value[upload_max_filesize]" = "20M";
28 "php_admin_value[post_max_size]" = "20M";
29 #"php_admin_flag[log_errors]" = "on";
30 "pm" = "ondemand";
31 "pm.max_children" = "5";
32 "pm.process_idle_timeout" = "60";
33 };
34 phpEnv = {
35 SYMFONY_DEBUG_MODE = "\"yes\"";
36 };
37 phpPackage = pkgs.php72;
38 };
39
40 secrets.keys."websites/isabelle/aten_integration" = {
41 user = config.services.httpd.Inte.user;
42 group = config.services.httpd.Inte.group;
43 permissions = "0400";
44 text = let
45 # cf:
46 # https://secure.php.net/manual/fr/function.parse-url.php
47 # vendor/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php#parseDatabaseUrlQuery
48 psql_url = with secrets.postgresql; "pdo-pgsql://${user}:${password}@invalid:${port}/${database}?host=${socket}";
49 in ''
50 SetEnv APP_ENV "dev"
51 SetEnv APP_SECRET "${secrets.secret}"
52 SetEnv DATABASE_URL "${psql_url}"
53 '';
54 };
55 services.websites.env.integration.vhostConfs.isabelle_aten_integration = {
56 certName = "integration";
57 addToCerts = true;
58 hosts = [ "aten.ic.immae.dev" ];
59 root = webRoot;
60 extraConfig = [
61 ''
62 <FilesMatch "\.php$">
63 SetHandler "proxy:unix:${pcfg.phpListenPaths.isabelle_aten_integration}|fcgi://localhost"
64 </FilesMatch>
65
66 Include ${config.secrets.fullPaths."websites/isabelle/aten_integration"}
67
68 <Location />
69 Use LDAPConnect
70 Require ldap-group cn=ic.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
71 ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
72 </Location>
73
74 <Location /backend>
75 Use LDAPConnect
76 Require ldap-group cn=ic.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
77 ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
78 </Location>
79
80 <Directory ${webRoot}>
81 Options Indexes FollowSymLinks MultiViews Includes
82 AllowOverride All
83 Require all granted
84 DirectoryIndex index.php
85 FallbackResource /index.php
86 </Directory>
87 ''
88 ];
89 };
90 };
91}
diff --git a/modules/private/websites/isabelle/aten_production.nix b/modules/private/websites/isabelle/aten_production.nix
deleted file mode 100644
index 928a815..0000000
--- a/modules/private/websites/isabelle/aten_production.nix
+++ /dev/null
@@ -1,90 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 secrets = config.myEnv.websites.isabelle.aten_production;
4 app = pkgs.callPackage ./aten_app {
5 composerEnv = pkgs.composerEnv.override { php = pkgs.php72; };
6 environment = secrets.environment;
7 varDir = "/var/lib/isabelle_aten_production";
8 };
9 cfg = config.myServices.websites.isabelle.aten_production;
10 pcfg = config.services.phpApplication;
11in {
12 options.myServices.websites.isabelle.aten_production.enable = lib.mkEnableOption "enable Aten's website in production";
13
14 config = lib.mkIf cfg.enable {
15 services.webstats.sites = [ { name = "aten.pro"; } ];
16 services.phpApplication.apps.isabelle_aten_production = {
17 websiteEnv = "production";
18 httpdUser = config.services.httpd.Prod.user;
19 httpdGroup = config.services.httpd.Prod.group;
20 httpdWatchFiles = [
21 config.secrets.fullPaths."websites/isabelle/aten_production"
22 ];
23 inherit (app) webRoot varDir;
24 inherit app;
25 serviceDeps = [ "postgresql.service" ];
26 preStartActions = [
27 "APP_ENV=${app.environment} ./bin/console --env=${app.environment} cache:clear --no-warmup"
28 ];
29 phpOpenbasedir = [ "/tmp" ];
30 phpPool = {
31 "php_admin_value[upload_max_filesize]" = "20M";
32 "php_admin_value[post_max_size]" = "20M";
33 #"php_admin_flag[log_errors]" = "on";
34 "pm" = "dynamic";
35 "pm.max_children" = "20";
36 "pm.start_servers" = "2";
37 "pm.min_spare_servers" = "1";
38 "pm.max_spare_servers" = "3";
39 };
40 phpPackage = pkgs.php72;
41 };
42
43 secrets.keys."websites/isabelle/aten_production" = {
44 user = config.services.httpd.Prod.user;
45 group = config.services.httpd.Prod.group;
46 permissions = "0400";
47 text = let
48 # cf:
49 # https://secure.php.net/manual/fr/function.parse-url.php
50 # vendor/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php#parseDatabaseUrlQuery
51 psql_url = with secrets.postgresql; "pdo-pgsql://${user}:${password}@invalid:${port}/${database}?host=${socket}";
52 in ''
53 SetEnv APP_ENV "${app.environment}"
54 SetEnv APP_SECRET "${secrets.secret}"
55 SetEnv DATABASE_URL "${psql_url}"
56 '';
57 };
58 services.websites.env.production.vhostConfs.isabelle_aten_production = {
59 certName = "isabelle";
60 certMainHost = "aten.pro";
61 hosts = [ "aten.pro" "www.aten.pro" ];
62 root = app.webRoot;
63 extraConfig = [
64 ''
65 <FilesMatch "\.php$">
66 SetHandler "proxy:unix:${pcfg.phpListenPaths.isabelle_aten_production}|fcgi://localhost"
67 </FilesMatch>
68
69 Include ${config.secrets.fullPaths."websites/isabelle/aten_production"}
70
71 Use Stats aten.pro
72
73 <Location /backend>
74 Use LDAPConnect
75 Require ldap-group cn=aten.pro,cn=httpd,ou=services,dc=immae,dc=eu
76 ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://aten.pro\"></html>"
77 </Location>
78
79 <Directory ${app.webRoot}>
80 Options Indexes FollowSymLinks MultiViews Includes
81 AllowOverride All
82 Require all granted
83 DirectoryIndex index.php
84 FallbackResource /index.php
85 </Directory>
86 ''
87 ];
88 };
89 };
90}
diff --git a/modules/private/websites/isabelle/config/chmod.php b/modules/private/websites/isabelle/config/chmod.php
deleted file mode 100644
index aae16cd..0000000
--- a/modules/private/websites/isabelle/config/chmod.php
+++ /dev/null
@@ -1,4 +0,0 @@
1<?php
2if (!defined("_ECRIRE_INC_VERSION")) return;
3if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', 0777);
4?> \ No newline at end of file
diff --git a/modules/private/websites/isabelle/config/connect.php b/modules/private/websites/isabelle/config/connect.php
deleted file mode 100644
index 18b0933..0000000
--- a/modules/private/websites/isabelle/config/connect.php
+++ /dev/null
@@ -1,15 +0,0 @@
1<?php
2if (!defined("_ECRIRE_INC_VERSION")) return;
3define('_MYSQL_SET_SQL_MODE',true);
4$GLOBALS['spip_connect_version'] = 0.7;
5spip_connect_db(
6 getenv("SPIP_MYSQL_HOST"),
7 getenv("SPIP_MYSQL_PORT"),
8 getenv("SPIP_MYSQL_USER"),
9 getenv("SPIP_MYSQL_PASSWORD"),
10 getenv("SPIP_MYSQL_DB"),
11 'mysql',
12 'spip',
13 'ldap.php'
14);
15?>
diff --git a/modules/private/websites/isabelle/config/ldap.php b/modules/private/websites/isabelle/config/ldap.php
deleted file mode 100644
index 825b7ed..0000000
--- a/modules/private/websites/isabelle/config/ldap.php
+++ /dev/null
@@ -1,9 +0,0 @@
1<?php
2if (!defined("_ECRIRE_INC_VERSION")) return;
3$GLOBALS['ldap_base'] = getenv("SPIP_LDAP_BASE");
4$GLOBALS['ldap_link'] = @ldap_connect(getenv("SPIP_LDAP_HOST"));
5@ldap_set_option($GLOBALS['ldap_link'],LDAP_OPT_PROTOCOL_VERSION,'3');
6@ldap_bind($GLOBALS['ldap_link'],getenv("SPIP_LDAP_SEARCH_DN"), getenv("SPIP_LDAP_SEARCH_PW"));
7$GLOBALS['ldap_champs'] = array('login' => array('sAMAccountName','uid','login','userid','cn','sn'),'nom' => 'cn','email' => 'mail','bio' => 'description',);
8$GLOBALS['ldap_search'] = getenv("SPIP_LDAP_SEARCH");
9?>
diff --git a/modules/private/websites/isabelle/iridologie.nix b/modules/private/websites/isabelle/iridologie.nix
deleted file mode 100644
index cd733c1..0000000
--- a/modules/private/websites/isabelle/iridologie.nix
+++ /dev/null
@@ -1,113 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 icfg = config.myEnv.websites.isabelle.iridologie;
4 cfg = config.myServices.websites.isabelle.iridologie;
5 app = pkgs.callPackage ./iridologie_app {
6 inherit (icfg) environment;
7 inherit (pkgs.webapps) spip;
8 varDir = "/var/lib/isabelle_iridologie";
9 };
10
11 apacheUser = config.services.httpd.Prod.user;
12 apacheGroup = config.services.httpd.Prod.group;
13 secretsPath = config.secrets.fullPaths."websites/isabelle/iridologie";
14in {
15 options.myServices.websites.isabelle.iridologie.enable = lib.mkEnableOption "enable Iridologie's website";
16
17 config = lib.mkIf cfg.enable {
18 secrets.keys."websites/isabelle/iridologie" = {
19 user = apacheUser;
20 group = apacheGroup;
21 permissions = "0400";
22 text = ''
23 SetEnv SPIP_CONFIG_DIR "${./config}"
24 SetEnv SPIP_VAR_DIR "${app.varDir}"
25 SetEnv SPIP_SITE "iridologie-${app.environment}"
26 SetEnv SPIP_LDAP_BASE "dc=immae,dc=eu"
27 SetEnv SPIP_LDAP_HOST "ldaps://ldap.immae.eu"
28 SetEnv SPIP_LDAP_SEARCH_DN "${icfg.ldap.dn}"
29 SetEnv SPIP_LDAP_SEARCH_PW "${icfg.ldap.password}"
30 SetEnv SPIP_LDAP_SEARCH "${icfg.ldap.filter}"
31 SetEnv SPIP_MYSQL_HOST "${icfg.mysql.host}"
32 SetEnv SPIP_MYSQL_PORT "${icfg.mysql.port}"
33 SetEnv SPIP_MYSQL_DB "${icfg.mysql.database}"
34 SetEnv SPIP_MYSQL_USER "${icfg.mysql.user}"
35 SetEnv SPIP_MYSQL_PASSWORD "${icfg.mysql.password}"
36 '';
37 };
38 services.webstats.sites = [ { name = "iridologie.icommandeur.org"; } ];
39
40 systemd.services.phpfpm-isabelle_iridologie.after = lib.mkAfter [ "mysql.service" ];
41 systemd.services.phpfpm-isabelle_iridologie.wants = [ "mysql.service" ];
42 services.phpfpm.pools.isabelle_iridologie = {
43 user = config.services.httpd.Prod.user;
44 group = config.services.httpd.Prod.group;
45 settings = {
46 "listen.owner" = "${apacheUser}";
47 "listen.group" = "${apacheGroup}";
48 "php_admin_value[upload_max_filesize]" = "20M";
49 "php_admin_value[post_max_size]" = "20M";
50 #"php_admin_flag[log_errors]" = "on";
51 "php_admin_value[open_basedir]" = "${app.spipConfig}:${./config}:${app}:${app.varDir}:/tmp";
52 "php_admin_value[session.save_path]" = "${app.varDir}/phpSessions";
53 "pm" = "dynamic";
54 "pm.max_children" = "20";
55 "pm.start_servers" = "2";
56 "pm.min_spare_servers" = "1";
57 "pm.max_spare_servers" = "3";
58 };
59 phpPackage = pkgs.php72;
60 };
61 system.activationScripts.isabelle_iridologie = {
62 deps = [ "wrappers" ];
63 text = ''
64 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir} ${app.varDir}/IMG ${app.varDir}/tmp ${app.varDir}/local
65 install -m 0750 -o ${apacheUser} -g ${apacheGroup} -d ${app.varDir}/phpSessions
66 '';
67 };
68 services.websites.env.production.modules = [ "proxy_fcgi" ];
69 services.websites.env.production.vhostConfs.isabelle_iridologie = {
70 certName = "isabelle";
71 addToCerts = true;
72 hosts = [ "iridologie.icommandeur.org" "icommandeur.org" "www.icommandeur.org" ];
73 root = app.webRoot;
74 extraConfig = [
75 ''
76 RewriteEngine On
77 RewriteCond "%{HTTP_HOST}" "!^iridologie\.icommandeur\.org$" [NC]
78 RewriteRule ^(.+)$ https://iridologie.icommandeur.org$1 [R=302,L]
79
80 Include ${secretsPath}
81
82 RewriteEngine On
83
84 <FilesMatch "\.php$">
85 SetHandler "proxy:unix:${config.services.phpfpm.pools.isabelle_iridologie.socket}|fcgi://localhost"
86 </FilesMatch>
87
88 <Directory ${app.webRoot}>
89 DirectoryIndex index.php index.htm index.html
90 Options -Indexes +FollowSymLinks +MultiViews +Includes
91 Include ${app.webRoot}/htaccess.txt
92
93 AllowOverride AuthConfig FileInfo Limit
94 Require all granted
95 </Directory>
96
97 <DirectoryMatch "${app.webRoot}/squelettes">
98 Require all denied
99 </DirectoryMatch>
100
101 <FilesMatch "(.htaccess|rewrite-rules|.gitignore)$">
102 Require all denied
103 </FilesMatch>
104
105 Use Stats iridologie.icommandeur.org
106 ''
107 ];
108 };
109 services.websites.env.production.watchPaths = [
110 secretsPath
111 ];
112 };
113}
diff --git a/modules/private/websites/isabelle/iridologie_app/default.nix b/modules/private/websites/isabelle/iridologie_app/default.nix
deleted file mode 100644
index edb7eef..0000000
--- a/modules/private/websites/isabelle/iridologie_app/default.nix
+++ /dev/null
@@ -1,19 +0,0 @@
1{ environment ? "prod"
2, varDir ? "/var/lib/iridologie_${environment}"
3, spip, stdenv, sassc, sources }:
4let
5 siteDir = stdenv.mkDerivation rec {
6 version = sources.websites-isabelle-iridologie.version;
7 pname = "iridologie";
8 name = "${pname}-${version}";
9 src = sources.websites-isabelle-iridologie;
10 installPhase = ''
11 cp -a . $out
12 '';
13 };
14in
15spip.override {
16 ldap = true;
17 siteName = "iridologie";
18 inherit environment siteDir varDir;
19}
diff --git a/modules/private/websites/jerome/naturaloutil.nix b/modules/private/websites/jerome/naturaloutil.nix
deleted file mode 100644
index 0974ce3..0000000
--- a/modules/private/websites/jerome/naturaloutil.nix
+++ /dev/null
@@ -1,97 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; };
4 cfg = config.myServices.websites.jerome.naturaloutil;
5 varDir = "/var/lib/ftp/jerome";
6 env = config.myEnv.websites.jerome;
7 apacheUser = config.services.httpd.Prod.user;
8 apacheGroup = config.services.httpd.Prod.group;
9 secretsPath = config.secrets.fullPaths."websites/jerome/naturaloutil";
10in {
11 options.myServices.websites.jerome.naturaloutil.enable = lib.mkEnableOption "enable Jerome Naturaloutil's website";
12
13 config = lib.mkIf cfg.enable {
14 services.webstats.sites = [ { name = "naturaloutil.immae.eu"; } ];
15
16 security.acme.certs."ftp".extraDomains."naturaloutil.immae.eu" = null;
17
18 secrets.keys."websites/jerome/naturaloutil" = {
19 user = apacheUser;
20 group = apacheGroup;
21 permissions = "0400";
22 text = ''
23 <?php
24 $mysql_user = '${env.mysql.user}' ;
25 $mysql_server = '${env.mysql.host}' ;
26 $mysql_base = '${env.mysql.database}' ;
27 $mysql_password = '${env.mysql.password}' ;
28 //connect to db
29 $db = mysqli_init();
30 ${if env.mysql.host != "localhost" then ''
31 mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
32 $db->ssl_set(NULL, NULL, "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt", NULL, NULL);
33 '' else ""}
34 $database = connect_db($db, $mysql_server, $mysql_base, $mysql_user, $mysql_password);
35 ?>
36 '';
37 };
38 system.activationScripts.jerome_naturaloutil = {
39 deps = [ "httpd" ];
40 text = ''
41 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/jerome_naturaloutil
42 '';
43 };
44 systemd.services.phpfpm-jerome_naturaloutil.after = lib.mkAfter [ "mysql.service" ];
45 systemd.services.phpfpm-jerome_naturaloutil.wants = [ "mysql.service" ];
46 services.phpfpm.pools.jerome_naturaloutil = {
47 user = apacheUser;
48 group = apacheGroup;
49 settings = {
50 "listen.owner" = apacheUser;
51 "listen.group" = apacheGroup;
52
53 "pm" = "ondemand";
54 "pm.max_children" = "5";
55 "pm.process_idle_timeout" = "60";
56
57 "php_admin_value[open_basedir]" = "/var/lib/php/sessions/jerome_naturaloutil:${secretsPath}:${varDir}:/tmp";
58 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/jerome_naturaloutil";
59 };
60 phpEnv = {
61 BDD_CONNECT = secretsPath;
62 };
63 phpPackage = pkgs.php72;
64 };
65 services.websites.env.production.modules = adminer.apache.modules ++ [ "proxy_fcgi" ];
66 services.websites.env.production.vhostConfs.jerome_naturaloutil = {
67 certName = "jerome";
68 certMainHost = "naturaloutil.immae.eu";
69 hosts = ["naturaloutil.immae.eu" ];
70 root = varDir;
71 extraConfig = [
72 (adminer.apache.vhostConf null)
73 ''
74 Use Stats naturaloutil.immae.eu
75 ServerAdmin ${env.server_admin}
76 ErrorLog "${varDir}/logs/error_log"
77 CustomLog "${varDir}/logs/access_log" combined
78
79 <FilesMatch "\.php$">
80 SetHandler "proxy:unix:${config.services.phpfpm.pools.jerome_naturaloutil.socket}|fcgi://localhost"
81 </FilesMatch>
82
83 <Directory ${varDir}/logs>
84 AllowOverride None
85 Require all denied
86 </Directory>
87 <Directory ${varDir}>
88 DirectoryIndex index.php index.htm index.html
89 Options Indexes FollowSymLinks MultiViews Includes
90 AllowOverride None
91 Require all granted
92 </Directory>
93 ''
94 ];
95 };
96 };
97}
diff --git a/modules/private/websites/leila/production.nix b/modules/private/websites/leila/production.nix
deleted file mode 100644
index 8385bc7..0000000
--- a/modules/private/websites/leila/production.nix
+++ /dev/null
@@ -1,114 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.leila.production;
4 varDir = "/var/lib/ftp/leila";
5 apacheUser = config.services.httpd.Prod.user;
6 apacheGroup = config.services.httpd.Prod.group;
7in {
8 options.myServices.websites.leila.production.enable = lib.mkEnableOption "enable Leila's websites in production";
9
10 config = lib.mkIf cfg.enable {
11 services.phpfpm.pools.leila = {
12 user = apacheUser;
13 group = apacheGroup;
14 settings = {
15 "listen.owner" = apacheUser;
16 "listen.group" = apacheGroup;
17
18 "pm" = "ondemand";
19 "pm.max_children" = "5";
20 "pm.process_idle_timeout" = "60";
21
22 "php_admin_value[open_basedir]" = "${varDir}:/tmp";
23 "php_admin_value[max_execution_time]" = "1800";
24 };
25 phpOptions = config.services.phpfpm.phpOptions + ''
26 disable_functions = "mail"
27 '';
28 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick ]);
29 phpEnv = {
30 PATH = lib.makeBinPath [ pkgs.imagemagick ];
31 };
32 };
33
34 services.webstats.sites = [
35 { name = "leila.bouya.org"; }
36 { name = "chorale.leila.bouya.org"; }
37 { name = "syrwennecreation.bouya.org"; }
38 ];
39
40 services.websites.env.production.modules = [ "proxy_fcgi" ];
41 services.websites.env.production.vhostConfs.leila_chorale = {
42 certName = "leila";
43 addToCerts = true;
44 hosts = [ "chorale.leila.bouya.org" "chorale-vocanta.fr.nf" "www.chorale-vocanta.fr.nf" ];
45 root = "${varDir}/Chorale";
46 extraConfig = [
47 ''
48 Use Stats chorale.leila.bouya.org
49 <Directory ${varDir}/Chorale>
50 DirectoryIndex index.php index.htm index.html
51 Options Indexes FollowSymLinks MultiViews Includes
52 AllowOverride None
53
54 Use LDAPConnect
55 Require ldap-group cn=chorale.leila.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu
56
57 <FilesMatch "\.php$">
58 SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost"
59 </FilesMatch>
60 </Directory>
61 ''
62 ];
63 };
64 services.websites.env.production.vhostConfs.leila_syrwenne = {
65 certName = "leila";
66 addToCerts = true;
67 hosts = [ "syrwennecreation.bouya.org" ];
68 root = "${varDir}/Syrwennecreation";
69 extraConfig = [
70 ''
71 Use Stats syrwennecreation.bouya.org
72 <Directory ${varDir}/Syrwennecreation>
73 DirectoryIndex index.php index.htm index.html
74 Options Indexes FollowSymLinks MultiViews Includes
75 AllowOverride None
76
77 <FilesMatch "\.php$">
78 SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost"
79 </FilesMatch>
80 </Directory>
81 ''
82 ];
83 };
84 services.websites.env.production.vhostConfs.leila = {
85 certName = "leila";
86 certMainHost = "leila.bouya.org";
87 hosts = [ "leila.bouya.org" ];
88 root = varDir;
89 extraConfig = [
90 ''
91 Use Stats leila.bouya.org
92 <Directory ${varDir}/Chorale>
93 DirectoryIndex index.htm index.html
94 Options Indexes FollowSymLinks MultiViews Includes
95 AllowOverride None
96
97 Use LDAPConnect
98 Require ldap-group cn=chorale.leila.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu
99
100 <FilesMatch "\.php$">
101 SetHandler "proxy:unix:${config.services.phpfpm.pools.leila.socket}|fcgi://localhost"
102 </FilesMatch>
103 </Directory>
104 <Directory ${varDir}>
105 DirectoryIndex index.htm index.html
106 Options Indexes FollowSymLinks MultiViews Includes
107 AllowOverride None
108 Require all granted
109 </Directory>
110 ''
111 ];
112 };
113 };
114}
diff --git a/modules/private/websites/ludivine/app/default.nix b/modules/private/websites/ludivine/app/default.nix
deleted file mode 100644
index 323b6e0..0000000
--- a/modules/private/websites/ludivine/app/default.nix
+++ /dev/null
@@ -1,37 +0,0 @@
1{ environment, varDir, secretsPath
2, composerEnv, fetchurl, fetchgit, imagemagick, sass, ruby, sources }:
3let
4 app = composerEnv.buildPackage (
5 import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
6 rec {
7 name = "${pname}-${version}";
8 pname = "ludivinecassal";
9 version = sources.websites-ludivine-app.version;
10 src = sources.websites-ludivine-app;
11 noDev = (environment == "prod");
12 preInstall = ''
13 export SYMFONY_ENV="${environment}"
14 cp app/config/parameters.yml.dist app/config/parameters.yml
15 cat >> app/config/parameters.yml <<EOF
16 leapt_im:
17 binary_path: ${imagemagick}/bin
18 assetic:
19 sass: ${sass}/bin/sass
20 ruby: ${ruby}/bin/ruby
21 EOF
22 sed -i -e "/Incenteev..ParameterHandler..ScriptHandler::buildParameters/d" composer.json
23 '';
24 # /!\ miniatures and data need to be in the same physical dir due to a
25 # bug in leapt.im (searches for data/../miniatures)
26 postInstall = ''
27 rm -rf var/{logs,cache,data,miniatures,tmp}
28 ln -sf ${varDir}/{logs,cache,data,miniatures,tmp} var/
29 ln -sf ${secretsPath} app/config/parameters.yml
30 '';
31 buildInputs = [ sass ];
32 passthru = {
33 inherit varDir environment;
34 webRoot = "${app}/web";
35 };
36 });
37in 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
index 4dd5ef5..0000000
--- a/modules/private/websites/ludivine/app/php-packages.nix
+++ /dev/null
@@ -1,868 +0,0 @@
1# Generated with composer2nix and adapted to return only the list of
2# packages
3{ composerEnv, fetchurl, fetchgit ? null }:
4{
5 packages = {
6 "behat/transliterator" = {
7 targetDir = "";
8 src = composerEnv.buildZipPackage {
9 name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
10 src = fetchurl {
11 url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
12 sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
13 };
14 };
15 };
16 "components/bootstrap" = {
17 targetDir = "";
18 src = composerEnv.buildZipPackage {
19 name = "components-bootstrap-5d60b2efd3159e1a9e203901849b3493c5aac61f";
20 src = fetchurl {
21 url = https://api.github.com/repos/components/bootstrap/zipball/5d60b2efd3159e1a9e203901849b3493c5aac61f;
22 sha256 = "0jdyxl86dr2lf8az1vby84i7kdn1qcqkp8fy60rs18gav0aqp4fg";
23 };
24 };
25 };
26 "components/jquery" = {
27 targetDir = "";
28 src = composerEnv.buildZipPackage {
29 name = "components-jquery-459648cda77875519c5da3ae1dd0ed5d170aa649";
30 src = fetchurl {
31 url = https://api.github.com/repos/components/jquery/zipball/459648cda77875519c5da3ae1dd0ed5d170aa649;
32 sha256 = "04jv8yifhwx0cpkw3y3ng0bs2dv77pzrdd640p59rjxwba6r1lbb";
33 };
34 };
35 };
36 "components/jqueryui" = {
37 targetDir = "";
38 src = composerEnv.buildZipPackage {
39 name = "components-jqueryui-c34f8dbf3ba57b3784b93f26119f436c0e8288e1";
40 src = fetchurl {
41 url = https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1;
42 sha256 = "00nkg6z8g6l3jysyzsfmfxhxqcdsd3jfqib28j8kn2frzx508xv9";
43 };
44 };
45 };
46 "composer/ca-bundle" = {
47 targetDir = "";
48 src = composerEnv.buildZipPackage {
49 name = "composer-ca-bundle-8afa52cd417f4ec417b4bfe86b68106538a87660";
50 src = fetchurl {
51 url = https://api.github.com/repos/composer/ca-bundle/zipball/8afa52cd417f4ec417b4bfe86b68106538a87660;
52 sha256 = "18b0gq29frjf4yhl4sl3i3zbz6zr3qjgsjb8cjdhz65vpb50581p";
53 };
54 };
55 };
56 "doctrine/annotations" = {
57 targetDir = "";
58 src = composerEnv.buildZipPackage {
59 name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5";
60 src = fetchurl {
61 url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5;
62 sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7";
63 };
64 };
65 };
66 "doctrine/cache" = {
67 targetDir = "";
68 src = composerEnv.buildZipPackage {
69 name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57";
70 src = fetchurl {
71 url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57;
72 sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i";
73 };
74 };
75 };
76 "doctrine/collections" = {
77 targetDir = "";
78 src = composerEnv.buildZipPackage {
79 name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf";
80 src = fetchurl {
81 url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf;
82 sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis";
83 };
84 };
85 };
86 "doctrine/common" = {
87 targetDir = "";
88 src = composerEnv.buildZipPackage {
89 name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d";
90 src = fetchurl {
91 url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d;
92 sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na";
93 };
94 };
95 };
96 "doctrine/dbal" = {
97 targetDir = "";
98 src = composerEnv.buildZipPackage {
99 name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9";
100 src = fetchurl {
101 url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9;
102 sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj";
103 };
104 };
105 };
106 "doctrine/doctrine-bundle" = {
107 targetDir = "";
108 src = composerEnv.buildZipPackage {
109 name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d";
110 src = fetchurl {
111 url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d;
112 sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3";
113 };
114 };
115 };
116 "doctrine/doctrine-cache-bundle" = {
117 targetDir = "";
118 src = composerEnv.buildZipPackage {
119 name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927";
120 src = fetchurl {
121 url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927;
122 sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa";
123 };
124 };
125 };
126 "doctrine/doctrine-migrations-bundle" = {
127 targetDir = "";
128 src = composerEnv.buildZipPackage {
129 name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce";
130 src = fetchurl {
131 url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce;
132 sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn";
133 };
134 };
135 };
136 "doctrine/event-manager" = {
137 targetDir = "";
138 src = composerEnv.buildZipPackage {
139 name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3";
140 src = fetchurl {
141 url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3;
142 sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88";
143 };
144 };
145 };
146 "doctrine/inflector" = {
147 targetDir = "";
148 src = composerEnv.buildZipPackage {
149 name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a";
150 src = fetchurl {
151 url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a;
152 sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5";
153 };
154 };
155 };
156 "doctrine/instantiator" = {
157 targetDir = "";
158 src = composerEnv.buildZipPackage {
159 name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda";
160 src = fetchurl {
161 url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda;
162 sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy";
163 };
164 };
165 };
166 "doctrine/lexer" = {
167 targetDir = "";
168 src = composerEnv.buildZipPackage {
169 name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
170 src = fetchurl {
171 url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
172 sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
173 };
174 };
175 };
176 "doctrine/migrations" = {
177 targetDir = "";
178 src = composerEnv.buildZipPackage {
179 name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6";
180 src = fetchurl {
181 url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6;
182 sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld";
183 };
184 };
185 };
186 "doctrine/orm" = {
187 targetDir = "";
188 src = composerEnv.buildZipPackage {
189 name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8";
190 src = fetchurl {
191 url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8;
192 sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls";
193 };
194 };
195 };
196 "doctrine/persistence" = {
197 targetDir = "";
198 src = composerEnv.buildZipPackage {
199 name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38";
200 src = fetchurl {
201 url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38;
202 sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7";
203 };
204 };
205 };
206 "doctrine/reflection" = {
207 targetDir = "";
208 src = composerEnv.buildZipPackage {
209 name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6";
210 src = fetchurl {
211 url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6;
212 sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy";
213 };
214 };
215 };
216 "fig/link-util" = {
217 targetDir = "";
218 src = composerEnv.buildZipPackage {
219 name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac";
220 src = fetchurl {
221 url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac;
222 sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64";
223 };
224 };
225 };
226 "gedmo/doctrine-extensions" = {
227 targetDir = "";
228 src = composerEnv.buildZipPackage {
229 name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27";
230 src = fetchurl {
231 url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27;
232 sha256 = "1i33xy9s18rncc1fllwi2qi7hrxj8g762fvgl9np7xndxa7kclyb";
233 };
234 };
235 };
236 "immae/ludivine-ckeditor-component" = {
237 targetDir = "";
238 src = fetchgit {
239 name = "immae-ludivine-ckeditor-component-1794320dcfdfcd19572fb1676294f9853a6bbc20";
240 url = "https://git.immae.eu/perso/Immae/Projets/packagist/ludivine-ckeditor-component.git";
241 rev = "1794320dcfdfcd19572fb1676294f9853a6bbc20";
242 sha256 = "080f3znvp0aj5jdpc3ywis0kfzvkwz5mw2jcj12gwq3r5g5i8zdq";
243 };
244 };
245 "immae/ludivine-slick-component" = {
246 targetDir = "";
247 src = fetchgit {
248 name = "immae-ludivine-slick-component-604734c4a960aac3d99f1008337181ed2b0f04db";
249 url = "https://git.immae.eu/perso/Immae/Projets/packagist/ludivine-slick-component.git";
250 rev = "604734c4a960aac3d99f1008337181ed2b0f04db";
251 sha256 = "041wqv9pa9nvqcgqykx6cnbj539qnr9h1iym7l54igw12yj57w06";
252 };
253 };
254 "incenteev/composer-parameter-handler" = {
255 targetDir = "";
256 src = composerEnv.buildZipPackage {
257 name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550";
258 src = fetchurl {
259 url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550;
260 sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm";
261 };
262 };
263 };
264 "jdorn/sql-formatter" = {
265 targetDir = "";
266 src = composerEnv.buildZipPackage {
267 name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
268 src = fetchurl {
269 url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
270 sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
271 };
272 };
273 };
274 "kriswallsmith/assetic" = {
275 targetDir = "";
276 src = composerEnv.buildZipPackage {
277 name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1";
278 src = fetchurl {
279 url = https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1;
280 sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8";
281 };
282 };
283 };
284 "leapt/im-bundle" = {
285 targetDir = "";
286 src = composerEnv.buildZipPackage {
287 name = "leapt-im-bundle-83442778d118f6edb537b93f9746c3a97e56c3d1";
288 src = fetchurl {
289 url = https://api.github.com/repos/leapt/im-bundle/zipball/83442778d118f6edb537b93f9746c3a97e56c3d1;
290 sha256 = "1gm4ih3v1j0xjm7mrpspd3yacdwvbqgag22cyqmix0hc9hw3pc6a";
291 };
292 };
293 };
294 "luxifer/doctrine-functions" = {
295 targetDir = "";
296 src = composerEnv.buildZipPackage {
297 name = "luxifer-doctrine-functions-e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c";
298 src = fetchurl {
299 url = https://api.github.com/repos/luxifer/doctrine-functions/zipball/e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c;
300 sha256 = "1sw4826nvs5q0y2na9m26rbxfiaw0kfqwhky7x7apicgx5adqfa9";
301 };
302 };
303 };
304 "monolog/monolog" = {
305 targetDir = "";
306 src = composerEnv.buildZipPackage {
307 name = "monolog-monolog-bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266";
308 src = fetchurl {
309 url = https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266;
310 sha256 = "0h3nnxjf2bdh7nmpqnpij99lqv6bw13r2bx83d8vn5zvblwg5png";
311 };
312 };
313 };
314 "ocramius/package-versions" = {
315 targetDir = "";
316 needsModifyRights = true;
317 src = composerEnv.buildZipPackage {
318 name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f";
319 src = fetchurl {
320 url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f;
321 sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881";
322 };
323 };
324 };
325 "ocramius/proxy-manager" = {
326 targetDir = "";
327 src = composerEnv.buildZipPackage {
328 name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1";
329 src = fetchurl {
330 url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1;
331 sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn";
332 };
333 };
334 };
335 "paragonie/random_compat" = {
336 targetDir = "";
337 src = composerEnv.buildZipPackage {
338 name = "paragonie-random_compat-84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95";
339 src = fetchurl {
340 url = https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95;
341 sha256 = "03nsccdvcb79l64b7lsmx0n8ldf5z3v8niqr7bpp6wg401qp9p09";
342 };
343 };
344 };
345 "psr/cache" = {
346 targetDir = "";
347 src = composerEnv.buildZipPackage {
348 name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
349 src = fetchurl {
350 url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
351 sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
352 };
353 };
354 };
355 "psr/container" = {
356 targetDir = "";
357 src = composerEnv.buildZipPackage {
358 name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
359 src = fetchurl {
360 url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
361 sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
362 };
363 };
364 };
365 "psr/link" = {
366 targetDir = "";
367 src = composerEnv.buildZipPackage {
368 name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562";
369 src = fetchurl {
370 url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562;
371 sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13";
372 };
373 };
374 };
375 "psr/log" = {
376 targetDir = "";
377 src = composerEnv.buildZipPackage {
378 name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd";
379 src = fetchurl {
380 url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd;
381 sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d";
382 };
383 };
384 };
385 "psr/simple-cache" = {
386 targetDir = "";
387 src = composerEnv.buildZipPackage {
388 name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
389 src = fetchurl {
390 url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
391 sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
392 };
393 };
394 };
395 "robloach/component-installer" = {
396 targetDir = "";
397 src = composerEnv.buildZipPackage {
398 name = "robloach-component-installer-908a859aa7c4949ba9ad67091e67bac10b66d3d7";
399 src = fetchurl {
400 url = https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7;
401 sha256 = "19y5sv4k338bihzmm8iac6q43r18vxhmbpvrdhz8jn39r51ampq9";
402 };
403 };
404 };
405 "sensio/distribution-bundle" = {
406 targetDir = "";
407 src = composerEnv.buildZipPackage {
408 name = "sensio-distribution-bundle-59eac70f15f97ee945924948a6f5e2f6f86b7a4b";
409 src = fetchurl {
410 url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/59eac70f15f97ee945924948a6f5e2f6f86b7a4b;
411 sha256 = "05mj4c0ahwg6l2wipyqfyyjjp1m2vvl7ymp61nvwv7zhvqacvljs";
412 };
413 };
414 };
415 "sensio/framework-extra-bundle" = {
416 targetDir = "";
417 src = composerEnv.buildZipPackage {
418 name = "sensio-framework-extra-bundle-bb907234df776b68922eb4b25bfa061683597b6a";
419 src = fetchurl {
420 url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a;
421 sha256 = "011hcljjcfq5qy4a7mlf0hwqxyb58yci40ini0n5rqandcyk2nck";
422 };
423 };
424 };
425 "sensiolabs/security-checker" = {
426 targetDir = "";
427 src = composerEnv.buildZipPackage {
428 name = "sensiolabs-security-checker-46be3f58adac13084497961e10eed9a7fb4d44d1";
429 src = fetchurl {
430 url = https://api.github.com/repos/sensiolabs/security-checker/zipball/46be3f58adac13084497961e10eed9a7fb4d44d1;
431 sha256 = "1caqf3hdfsajj9nb8fpinvs6apv90g1srwxcyxdnr6a8d6g0p6qi";
432 };
433 };
434 };
435 "swiftmailer/swiftmailer" = {
436 targetDir = "";
437 src = composerEnv.buildZipPackage {
438 name = "swiftmailer-swiftmailer-181b89f18a90f8925ef805f950d47a7190e9b950";
439 src = fetchurl {
440 url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950;
441 sha256 = "0hkmawv3bhbqdavy4wxqhzajg5zqd7chsi8w27y2zdi5r35az75d";
442 };
443 };
444 };
445 "symfony/assetic-bundle" = {
446 targetDir = "";
447 src = composerEnv.buildZipPackage {
448 name = "symfony-assetic-bundle-2e0a23a4874838e26de6f025e02fc63328921a4c";
449 src = fetchurl {
450 url = https://api.github.com/repos/symfony/assetic-bundle/zipball/2e0a23a4874838e26de6f025e02fc63328921a4c;
451 sha256 = "17rxrkyzxa6x5nn7qhhhdgx4z0nlznnq5fifza4wv9znca8bbwyc";
452 };
453 };
454 };
455 "symfony/monolog-bundle" = {
456 targetDir = "";
457 src = composerEnv.buildZipPackage {
458 name = "symfony-monolog-bundle-572e143afc03419a75ab002c80a2fd99299195ff";
459 src = fetchurl {
460 url = https://api.github.com/repos/symfony/monolog-bundle/zipball/572e143afc03419a75ab002c80a2fd99299195ff;
461 sha256 = "0g8icydnwfbqcbc56pqyc8bv1vp31331w0r75r3hqh225p2j1nd7";
462 };
463 };
464 };
465 "symfony/polyfill-apcu" = {
466 targetDir = "";
467 src = composerEnv.buildZipPackage {
468 name = "symfony-polyfill-apcu-19e1b73bf255265ad0b568f81766ae2a3266d8d2";
469 src = fetchurl {
470 url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/19e1b73bf255265ad0b568f81766ae2a3266d8d2;
471 sha256 = "0jg33c81kwkpxk0b18jkslz9jkbkxl5k48h6m5b33dm63p1fj05r";
472 };
473 };
474 };
475 "symfony/polyfill-ctype" = {
476 targetDir = "";
477 src = composerEnv.buildZipPackage {
478 name = "symfony-polyfill-ctype-e3d826245268269cd66f8326bd8bc066687b4a19";
479 src = fetchurl {
480 url = https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19;
481 sha256 = "16md0qmy5jvvl7lc6n6r5hxjdr5i30vl6n9rpkm4b11rh2nqh7mh";
482 };
483 };
484 };
485 "symfony/polyfill-intl-icu" = {
486 targetDir = "";
487 src = composerEnv.buildZipPackage {
488 name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644";
489 src = fetchurl {
490 url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644;
491 sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq";
492 };
493 };
494 };
495 "symfony/polyfill-mbstring" = {
496 targetDir = "";
497 src = composerEnv.buildZipPackage {
498 name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494";
499 src = fetchurl {
500 url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494;
501 sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi";
502 };
503 };
504 };
505 "symfony/polyfill-php56" = {
506 targetDir = "";
507 src = composerEnv.buildZipPackage {
508 name = "symfony-polyfill-php56-ff208829fe1aa48ab9af356992bb7199fed551af";
509 src = fetchurl {
510 url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ff208829fe1aa48ab9af356992bb7199fed551af;
511 sha256 = "0vmpiwakc7hpbr6jwpk7cqcy41ybgwl6jkn3q8c4ryxynknn5hfk";
512 };
513 };
514 };
515 "symfony/polyfill-php70" = {
516 targetDir = "";
517 src = composerEnv.buildZipPackage {
518 name = "symfony-polyfill-php70-6b88000cdd431cd2e940caa2cb569201f3f84224";
519 src = fetchurl {
520 url = https://api.github.com/repos/symfony/polyfill-php70/zipball/6b88000cdd431cd2e940caa2cb569201f3f84224;
521 sha256 = "08h77r1i2q4pwdd0yk3pfhqqgk0z7gwmkzmvykx9bfv1z7a0h8ik";
522 };
523 };
524 };
525 "symfony/polyfill-util" = {
526 targetDir = "";
527 src = composerEnv.buildZipPackage {
528 name = "symfony-polyfill-util-3b58903eae668d348a7126f999b0da0f2f93611c";
529 src = fetchurl {
530 url = https://api.github.com/repos/symfony/polyfill-util/zipball/3b58903eae668d348a7126f999b0da0f2f93611c;
531 sha256 = "00bb5mgljk6d54nyvd4gmc7mbzfr4b4q7h3rxmv8rzq613wcjp3i";
532 };
533 };
534 };
535 "symfony/swiftmailer-bundle" = {
536 targetDir = "";
537 src = composerEnv.buildZipPackage {
538 name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec";
539 src = fetchurl {
540 url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec;
541 sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01";
542 };
543 };
544 };
545 "symfony/symfony" = {
546 targetDir = "";
547 src = composerEnv.buildZipPackage {
548 name = "symfony-symfony-f6b8ddc362b1cf3fb06548693c3adbb736092412";
549 src = fetchurl {
550 url = https://api.github.com/repos/symfony/symfony/zipball/f6b8ddc362b1cf3fb06548693c3adbb736092412;
551 sha256 = "0ip7k5xf34w4p1zvv2nkv4nyik3asidk3zlgzyc1v57429z0f28q";
552 };
553 };
554 };
555 "twig/extensions" = {
556 targetDir = "";
557 src = composerEnv.buildZipPackage {
558 name = "twig-extensions-57873c8b0c1be51caa47df2cdb824490beb16202";
559 src = fetchurl {
560 url = https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202;
561 sha256 = "1sjajjd6vnczvdrl9b8zhzr06l5dflzqiwg9d33d92q8gli4j7jn";
562 };
563 };
564 };
565 "twig/twig" = {
566 targetDir = "";
567 src = composerEnv.buildZipPackage {
568 name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1";
569 src = fetchurl {
570 url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1;
571 sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n";
572 };
573 };
574 };
575 "zendframework/zend-code" = {
576 targetDir = "";
577 src = composerEnv.buildZipPackage {
578 name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb";
579 src = fetchurl {
580 url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb;
581 sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1";
582 };
583 };
584 };
585 "zendframework/zend-eventmanager" = {
586 targetDir = "";
587 src = composerEnv.buildZipPackage {
588 name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd";
589 src = fetchurl {
590 url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd;
591 sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n";
592 };
593 };
594 };
595 };
596 devPackages = {
597 "doctrine/data-fixtures" = {
598 targetDir = "";
599 src = composerEnv.buildZipPackage {
600 name = "doctrine-data-fixtures-3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a";
601 src = fetchurl {
602 url = https://api.github.com/repos/doctrine/data-fixtures/zipball/3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a;
603 sha256 = "0wbxhy7hq17laqgnq9x9ygysv0n1kn7s4x3v89pk7iy622pil3sm";
604 };
605 };
606 };
607 "doctrine/doctrine-fixtures-bundle" = {
608 targetDir = "";
609 src = composerEnv.buildZipPackage {
610 name = "doctrine-doctrine-fixtures-bundle-74b8cc70a4a25b774628ee59f4cdf3623a146273";
611 src = fetchurl {
612 url = https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273;
613 sha256 = "1bbflq8k6izwqgp9ka2gyb5y96a80b4lnlc5wrgc5gnih7hqidlf";
614 };
615 };
616 };
617 "fzaninotto/faker" = {
618 targetDir = "";
619 src = composerEnv.buildZipPackage {
620 name = "fzaninotto-faker-d0190b156bcca848d401fb80f31f504f37141c8d";
621 src = fetchurl {
622 url = https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d;
623 sha256 = "1x7xrxw14x7b0iq7sxi9ynswk8ljga62i77ch7xip4dwgq1dypvi";
624 };
625 };
626 };
627 "league/factory-muffin" = {
628 targetDir = "";
629 src = composerEnv.buildZipPackage {
630 name = "league-factory-muffin-316ed2bac70178567f995d877b831804c9c58d5a";
631 src = fetchurl {
632 url = https://api.github.com/repos/thephpleague/factory-muffin/zipball/316ed2bac70178567f995d877b831804c9c58d5a;
633 sha256 = "1fxh0hsqifmnhgkwyd460x3w9wn74369lmak3f1m24mn2asiynxq";
634 };
635 };
636 };
637 "league/factory-muffin-faker" = {
638 targetDir = "";
639 src = composerEnv.buildZipPackage {
640 name = "league-factory-muffin-faker-30dbd11bb6be03b47e52bd60006ae198d20ab426";
641 src = fetchurl {
642 url = https://api.github.com/repos/thephpleague/factory-muffin-faker/zipball/30dbd11bb6be03b47e52bd60006ae198d20ab426;
643 sha256 = "0dsimjdnsmzdd4vwjzw1gz1bb4zlhmv66g3fc9k4nj5bqch6mny1";
644 };
645 };
646 };
647 "mikey179/vfsStream" = {
648 targetDir = "";
649 src = composerEnv.buildZipPackage {
650 name = "mikey179-vfsStream-d5fec95f541d4d71c4823bb5e30cf9b9e5b96145";
651 src = fetchurl {
652 url = https://github.com/bovigo/vfsStream/archive/v1.6.5.zip;
653 sha256 = "16vi7ci8nxq5hxnzzjmmia73gdm55qcwn006c6hgdwa3i58dnr4l";
654 };
655 };
656 };
657 "phpdocumentor/reflection-common" = {
658 targetDir = "";
659 src = composerEnv.buildZipPackage {
660 name = "phpdocumentor-reflection-common-21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6";
661 src = fetchurl {
662 url = https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6;
663 sha256 = "1yaf1zg9lnkfnq2ndpviv0hg5bza9vjvv5l4wgcn25lx1p8a94w2";
664 };
665 };
666 };
667 "phpdocumentor/reflection-docblock" = {
668 targetDir = "";
669 src = composerEnv.buildZipPackage {
670 name = "phpdocumentor-reflection-docblock-94fd0001232e47129dd3504189fa1c7225010d08";
671 src = fetchurl {
672 url = https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08;
673 sha256 = "03zvxqb5n9ddvysj8mjdwf59h7sagj5x5z15nhs7mqpcky1w388x";
674 };
675 };
676 };
677 "phpdocumentor/type-resolver" = {
678 targetDir = "";
679 src = composerEnv.buildZipPackage {
680 name = "phpdocumentor-type-resolver-9c977708995954784726e25d0cd1dddf4e65b0f7";
681 src = fetchurl {
682 url = https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7;
683 sha256 = "0h888r2iy2290yp9i3fij8wd5b7960yi7yn1rwh26x1xxd83n2mb";
684 };
685 };
686 };
687 "phpspec/prophecy" = {
688 targetDir = "";
689 src = composerEnv.buildZipPackage {
690 name = "phpspec-prophecy-4ba436b55987b4bf311cb7c6ba82aa528aac0a06";
691 src = fetchurl {
692 url = https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06;
693 sha256 = "0sz9fg8r4yvpgrhsh6qaic3p89pafdj8bdf4izbcccq6mdhclxn6";
694 };
695 };
696 };
697 "phpunit/php-code-coverage" = {
698 targetDir = "";
699 src = composerEnv.buildZipPackage {
700 name = "phpunit-php-code-coverage-eabf68b476ac7d0f73793aada060f1c1a9bf8979";
701 src = fetchurl {
702 url = https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979;
703 sha256 = "0xfkf2kaqrid0ajr8qfh3qnpiqqddl0cmmdy6hd7l9y7ziy6qz8d";
704 };
705 };
706 };
707 "phpunit/php-file-iterator" = {
708 targetDir = "";
709 src = composerEnv.buildZipPackage {
710 name = "phpunit-php-file-iterator-730b01bc3e867237eaac355e06a36b85dd93a8b4";
711 src = fetchurl {
712 url = https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4;
713 sha256 = "0kbg907g9hrx7pv8v0wnf4ifqywdgvigq6y6z00lyhgd0b8is060";
714 };
715 };
716 };
717 "phpunit/php-text-template" = {
718 targetDir = "";
719 src = composerEnv.buildZipPackage {
720 name = "phpunit-php-text-template-31f8b717e51d9a2afca6c9f046f5d69fc27c8686";
721 src = fetchurl {
722 url = https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686;
723 sha256 = "1y03m38qqvsbvyakd72v4dram81dw3swyn5jpss153i5nmqr4p76";
724 };
725 };
726 };
727 "phpunit/php-timer" = {
728 targetDir = "";
729 src = composerEnv.buildZipPackage {
730 name = "phpunit-php-timer-3dcf38ca72b158baf0bc245e9184d3fdffa9c46f";
731 src = fetchurl {
732 url = https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f;
733 sha256 = "1j04r0hqzrv6m1jk5nb92k2nnana72nscqpfk3rgv3fzrrv69ljr";
734 };
735 };
736 };
737 "phpunit/php-token-stream" = {
738 targetDir = "";
739 src = composerEnv.buildZipPackage {
740 name = "phpunit-php-token-stream-1ce90ba27c42e4e44e6d8458241466380b51fa16";
741 src = fetchurl {
742 url = https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16;
743 sha256 = "0j1v83m268cddhyzi8qvqfzhpz12hrm3dyw6skyqvljdp7l9x6lk";
744 };
745 };
746 };
747 "phpunit/phpunit" = {
748 targetDir = "";
749 src = composerEnv.buildZipPackage {
750 name = "phpunit-phpunit-46023de9a91eec7dfb06cc56cb4e260017298517";
751 src = fetchurl {
752 url = https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517;
753 sha256 = "0mxhgcmc575hw3n7czindgqiha8jhdi4p19h883vf15fg6xf5iv6";
754 };
755 };
756 };
757 "phpunit/phpunit-mock-objects" = {
758 targetDir = "";
759 src = composerEnv.buildZipPackage {
760 name = "phpunit-phpunit-mock-objects-ac8e7a3db35738d56ee9a76e78a4e03d97628983";
761 src = fetchurl {
762 url = https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983;
763 sha256 = "0s7nyyafdqw2hp7wsd2mxnjxpk26630vv3wii6hcdb0q8xy8r78i";
764 };
765 };
766 };
767 "sebastian/comparator" = {
768 targetDir = "";
769 src = composerEnv.buildZipPackage {
770 name = "sebastian-comparator-2b7424b55f5047b47ac6e5ccb20b2aea4011d9be";
771 src = fetchurl {
772 url = https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be;
773 sha256 = "0ymarxgnr8b3iy0w18h5z13iiv0ja17vjryryzfcwlqqhlc6w7iq";
774 };
775 };
776 };
777 "sebastian/diff" = {
778 targetDir = "";
779 src = composerEnv.buildZipPackage {
780 name = "sebastian-diff-7f066a26a962dbe58ddea9f72a4e82874a3975a4";
781 src = fetchurl {
782 url = https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4;
783 sha256 = "1ppx21vjj79z6d584ryq451k7kvdc511awmqjkj9g4vxj1s1h3j6";
784 };
785 };
786 };
787 "sebastian/environment" = {
788 targetDir = "";
789 src = composerEnv.buildZipPackage {
790 name = "sebastian-environment-be2c607e43ce4c89ecd60e75c6a85c126e754aea";
791 src = fetchurl {
792 url = https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea;
793 sha256 = "0gzgnk847kf18krq4ybbi2knzj7i0kdghsdlj6qynzzrlf7idij0";
794 };
795 };
796 };
797 "sebastian/exporter" = {
798 targetDir = "";
799 src = composerEnv.buildZipPackage {
800 name = "sebastian-exporter-42c4c2eec485ee3e159ec9884f95b431287edde4";
801 src = fetchurl {
802 url = https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4;
803 sha256 = "1p5mc4lqwxn79v06jjlgqxynblywcxw2mkhbf6r4jlz0bsrqafxn";
804 };
805 };
806 };
807 "sebastian/global-state" = {
808 targetDir = "";
809 src = composerEnv.buildZipPackage {
810 name = "sebastian-global-state-bc37d50fea7d017d3d340f230811c9f1d7280af4";
811 src = fetchurl {
812 url = https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4;
813 sha256 = "0y1x16mf9q38s7rlc7k2s6sxn2ccxmyk1q5zgh24hr4yp035f0pb";
814 };
815 };
816 };
817 "sebastian/recursion-context" = {
818 targetDir = "";
819 src = composerEnv.buildZipPackage {
820 name = "sebastian-recursion-context-b19cc3298482a335a95f3016d2f8a6950f0fbcd7";
821 src = fetchurl {
822 url = https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7;
823 sha256 = "1i9xdv55nkg1yy5q4lmpq1jsjif69hjrwmr1zha6b5qjf6ivlvjm";
824 };
825 };
826 };
827 "sebastian/version" = {
828 targetDir = "";
829 src = composerEnv.buildZipPackage {
830 name = "sebastian-version-58b3a85e7999757d6ad81c787a1fbf5ff6c628c6";
831 src = fetchurl {
832 url = https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6;
833 sha256 = "1s71b6ss29pcsm0120myriwnzla1kpj13f3f739c7k1wfm69h4wz";
834 };
835 };
836 };
837 "sensio/generator-bundle" = {
838 targetDir = "";
839 src = composerEnv.buildZipPackage {
840 name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65";
841 src = fetchurl {
842 url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65;
843 sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3";
844 };
845 };
846 };
847 "symfony/phpunit-bridge" = {
848 targetDir = "";
849 src = composerEnv.buildZipPackage {
850 name = "symfony-phpunit-bridge-2155067dfc73e0e77dbc26f236af17e4df552de5";
851 src = fetchurl {
852 url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/2155067dfc73e0e77dbc26f236af17e4df552de5;
853 sha256 = "1fhqyhvns69pkv086d1sp918bakqq9pk9d16nzck2s4pfdf097pj";
854 };
855 };
856 };
857 "webmozart/assert" = {
858 targetDir = "";
859 src = composerEnv.buildZipPackage {
860 name = "webmozart-assert-83e253c8e0be5b0257b881e1827274667c5c17a9";
861 src = fetchurl {
862 url = https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9;
863 sha256 = "04w7rrjy43k93376an7xhnxqn2ibbw5fra7rqky7j1dl1f0hkn6d";
864 };
865 };
866 };
867 };
868}
diff --git a/modules/private/websites/ludivine/integration.nix b/modules/private/websites/ludivine/integration.nix
deleted file mode 100644
index 49aa113..0000000
--- a/modules/private/websites/ludivine/integration.nix
+++ /dev/null
@@ -1,145 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 secrets = config.myEnv.websites.ludivine.integration;
4 cfg = config.myServices.websites.ludivine.integration;
5 pcfg = config.services.phpApplication;
6 webRoot = "/var/lib/ftp/immae/ludivine/web";
7in {
8 options.myServices.websites.ludivine.integration.enable = lib.mkEnableOption "enable Ludivine's website in integration";
9
10 config = lib.mkIf cfg.enable {
11 services.phpApplication.apps.ludivine_integration = {
12 websiteEnv = "integration";
13 httpdUser = config.services.httpd.Inte.user;
14 httpdGroup = config.services.httpd.Inte.group;
15 inherit webRoot;
16 varDir = "/var/lib/ftp/immae/ludivine_var";
17 app = "/var/lib/ftp/immae/ludivine";
18 varDirPaths = {
19 "tmp" = "0700";
20 };
21 serviceDeps = [ "mysql.service" ];
22 preStartActions = [
23 "./bin/console --env=dev cache:clear --no-warmup"
24 ];
25 phpOpenbasedir = [ "/tmp" ];
26 phpPool = {
27 "php_admin_value[upload_max_filesize]" = "20M";
28 "php_admin_value[post_max_size]" = "20M";
29 #"php_admin_flag[log_errors]" = "on";
30 "pm" = "ondemand";
31 "pm.max_children" = "5";
32 "pm.process_idle_timeout" = "60";
33 };
34 phpEnv = {
35 PATH = lib.makeBinPath [
36 # below ones don't need to be in the PATH but they’re used in
37 # secrets
38 pkgs.imagemagick pkgs.sass pkgs.ruby
39 ];
40 SYMFONY_DEBUG_MODE = "\"yes\"";
41 };
42 phpWatchFiles = [
43 config.secrets.fullPaths."websites/ludivine/integration"
44 ];
45 phpPackage = pkgs.php72;
46 };
47
48 secrets.keys."websites/ludivine/integration" = {
49 user = config.services.httpd.Inte.user;
50 group = config.services.httpd.Inte.group;
51 permissions = "0400";
52 text = ''
53 # This file is auto-generated during the composer install
54 parameters:
55 database_host: ${secrets.mysql.host}
56 database_port: ${secrets.mysql.port}
57 database_name: ${secrets.mysql.database}
58 database_user: ${secrets.mysql.user}
59 database_password: ${secrets.mysql.password}
60 database_server_version: ${pkgs.mariadb.mysqlVersion}
61 mailer_transport: smtp
62 mailer_host: 127.0.0.1
63 mailer_user: null
64 mailer_password: null
65 secret: ${secrets.secret}
66 ldap_host: ldap.immae.eu
67 ldap_port: 636
68 ldap_version: 3
69 ldap_ssl: true
70 ldap_tls: false
71 ldap_user_bind: 'uid={username},ou=users,dc=immae,dc=eu'
72 ldap_base_dn: 'dc=immae,dc=eu'
73 ldap_search_dn: '${secrets.ldap.dn}'
74 ldap_search_password: '${secrets.ldap.password}'
75 ldap_search_filter: '${secrets.ldap.filter}'
76 leapt_im:
77 binary_path: ${pkgs.imagemagick}/bin
78 assetic:
79 sass: ${pkgs.sass}/bin/sass
80 ruby: ${pkgs.ruby}/bin/ruby
81 '';
82 };
83
84 services.websites.env.integration.vhostConfs.ludivine_integration = {
85 certName = "integration";
86 addToCerts = true;
87 hosts = [ "test.lc.immae.dev" ];
88 root = webRoot;
89 extraConfig = [
90 ''
91 <FilesMatch "\.php$">
92 SetHandler "proxy:unix:${pcfg.phpListenPaths.ludivine_integration}|fcgi://localhost"
93 </FilesMatch>
94
95 <Location />
96 Use LDAPConnect
97 Require ldap-group cn=lc.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
98 ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://ludivinecassal.com\"></html>"
99 </Location>
100
101 <Directory ${webRoot}>
102 Options Indexes FollowSymLinks MultiViews Includes
103 AllowOverride None
104 Require all granted
105
106 DirectoryIndex app_dev.php
107
108 <IfModule mod_negotiation.c>
109 Options -MultiViews
110 </IfModule>
111
112 <IfModule mod_rewrite.c>
113 RewriteEngine On
114
115 RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
116 RewriteRule ^(.*) - [E=BASE:%1]
117
118 # Maintenance script
119 RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f
120 RewriteCond %{SCRIPT_FILENAME} !maintenance.php
121 RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L]
122 ErrorDocument 503 /maintenance.php
123
124 # Sets the HTTP_AUTHORIZATION header removed by Apache
125 RewriteCond %{HTTP:Authorization} .
126 RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
127
128 RewriteCond %{ENV:REDIRECT_STATUS} ^$
129 RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
130
131 # If the requested filename exists, simply serve it.
132 # We only want to let Apache serve files and not directories.
133 RewriteCond %{REQUEST_FILENAME} -f
134 RewriteRule ^ - [L]
135
136 # Rewrite all other queries to the front controller.
137 RewriteRule ^ %{ENV:BASE}/app_dev.php [L]
138 </IfModule>
139
140 </Directory>
141 ''
142 ];
143 };
144 };
145}
diff --git a/modules/private/websites/ludivine/production.nix b/modules/private/websites/ludivine/production.nix
deleted file mode 100644
index 7a18b88..0000000
--- a/modules/private/websites/ludivine/production.nix
+++ /dev/null
@@ -1,116 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 secrets = config.myEnv.websites.ludivine.production;
4 app = pkgs.callPackage ./app {
5 composerEnv = pkgs.composerEnv.override { php = pkgs.php72; };
6 environment = secrets.environment;
7 varDir = "/var/lib/ludivine_production";
8 secretsPath = config.secrets.fullPaths."websites/ludivine/production";
9 };
10 pcfg = config.services.phpApplication;
11 cfg = config.myServices.websites.ludivine.production;
12in {
13 options.myServices.websites.ludivine.production.enable = lib.mkEnableOption "enable Ludivine's website in production";
14
15 config = lib.mkIf cfg.enable {
16 services.webstats.sites = [ { name = "ludivinecassal.com"; } ];
17 services.phpApplication.apps.ludivine_production = {
18 websiteEnv = "production";
19 httpdUser = config.services.httpd.Prod.user;
20 httpdGroup = config.services.httpd.Prod.group;
21 inherit (app) webRoot varDir;
22 varDirPaths = {
23 "tmp" = "0700";
24 };
25 inherit app;
26 serviceDeps = [ "mysql.service" ];
27 preStartActions = [
28 "./bin/console --env=${app.environment} cache:clear --no-warmup"
29 ];
30 phpOpenbasedir = [ "/tmp" ];
31 phpPool = {
32 "php_admin_value[upload_max_filesize]" = "20M";
33 "php_admin_value[post_max_size]" = "20M";
34 #"php_admin_flag[log_errors]" = "on";
35 "pm" = "dynamic";
36 "pm.max_children" = "20";
37 "pm.start_servers" = "2";
38 "pm.min_spare_servers" = "1";
39 "pm.max_spare_servers" = "3";
40 };
41 phpWatchFiles = [
42 config.secrets.fullPaths."websites/ludivine/production"
43 ];
44 phpEnv = {
45 PATH = lib.makeBinPath [
46 # below ones don't need to be in the PATH but they’re used in
47 # secrets
48 pkgs.imagemagick pkgs.sass pkgs.ruby
49 ];
50 };
51 phpPackage = pkgs.php72;
52 };
53
54 secrets.keys."websites/ludivine/production" = {
55 user = config.services.httpd.Prod.user;
56 group = config.services.httpd.Prod.group;
57 permissions = "0400";
58 text = ''
59 # This file is auto-generated during the composer install
60 parameters:
61 database_host: ${secrets.mysql.host}
62 database_port: ${secrets.mysql.port}
63 database_name: ${secrets.mysql.database}
64 database_user: ${secrets.mysql.user}
65 database_password: ${secrets.mysql.password}
66 database_server_version: ${pkgs.mariadb.mysqlVersion}
67 mailer_transport: smtp
68 mailer_host: 127.0.0.1
69 mailer_user: null
70 mailer_password: null
71 secret: ${secrets.secret}
72 ldap_host: ldap.immae.eu
73 ldap_port: 636
74 ldap_version: 3
75 ldap_ssl: true
76 ldap_tls: false
77 ldap_user_bind: 'uid={username},ou=users,dc=immae,dc=eu'
78 ldap_base_dn: 'dc=immae,dc=eu'
79 ldap_search_dn: '${secrets.ldap.dn}'
80 ldap_search_password: '${secrets.ldap.password}'
81 ldap_search_filter: '${secrets.ldap.filter}'
82 leapt_im:
83 binary_path: ${pkgs.imagemagick}/bin
84 assetic:
85 sass: ${pkgs.sass}/bin/sass
86 ruby: ${pkgs.ruby}/bin/ruby
87 '';
88 };
89
90 services.websites.env.production.vhostConfs.ludivine_production = {
91 certName = "ludivine";
92 certMainHost = "ludivinecassal.com";
93 hosts = ["ludivinecassal.com" "www.ludivinecassal.com" ];
94 root = app.webRoot;
95 extraConfig = [
96 ''
97 RewriteEngine on
98 RewriteCond "%{HTTP_HOST}" "!^ludivinecassal\.com$" [NC]
99 RewriteRule ^(.+)$ https://ludivinecassal.com$1 [R=302,L]
100
101 <FilesMatch "\.php$">
102 SetHandler "proxy:unix:${pcfg.phpListenPaths.ludivine_production}|fcgi://localhost"
103 </FilesMatch>
104
105 Use Stats ludivinecassal.com
106
107 <Directory ${app.webRoot}>
108 Options Indexes FollowSymLinks MultiViews Includes
109 AllowOverride All
110 Require all granted
111 </Directory>
112 ''
113 ];
114 };
115 };
116}
diff --git a/modules/private/websites/nassime/production.nix b/modules/private/websites/nassime/production.nix
deleted file mode 100644
index 1179351..0000000
--- a/modules/private/websites/nassime/production.nix
+++ /dev/null
@@ -1,35 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.nassime.production;
4 varDir = "/var/lib/ftp/nassime";
5 env = config.myEnv.websites.nassime;
6 domain = "nassime.bouya.org";
7in {
8 options.myServices.websites.nassime.production.enable = lib.mkEnableOption "enable Nassime's website";
9
10 config = lib.mkIf cfg.enable {
11 services.webstats.sites = [ { name = domain; } ];
12
13 security.acme.certs."ftp".extraDomains."${domain}" = null;
14
15 services.websites.env.production.vhostConfs.nassime = {
16 certName = "nassime";
17 certMainHost = domain;
18 hosts = [ domain ];
19 root = varDir;
20 extraConfig = [
21 ''
22 Use Stats ${domain}
23 ServerAdmin ${env.server_admin}
24
25 <Directory ${varDir}>
26 DirectoryIndex index.htm index.html
27 Options Indexes FollowSymLinks MultiViews Includes
28 AllowOverride None
29 Require all granted
30 </Directory>
31 ''
32 ];
33 };
34 };
35}
diff --git a/modules/private/websites/nath/villon.nix b/modules/private/websites/nath/villon.nix
deleted file mode 100644
index 57a1df5..0000000
--- a/modules/private/websites/nath/villon.nix
+++ /dev/null
@@ -1,42 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.nath.villon;
4 varDir = "/var/lib/ftp/nath";
5 env = config.myEnv.websites.nath;
6 domain = "sntvillon.immae.eu";
7 apacheUser = config.services.httpd.Prod.user;
8 apacheGroup = config.services.httpd.Prod.group;
9in {
10 options.myServices.websites.nath.villon.enable = lib.mkEnableOption "enable Nath's website";
11
12 config = lib.mkIf cfg.enable {
13 services.webstats.sites = [ { name = domain; } ];
14
15 system.activationScripts.nath_villon = {
16 deps = [ "users" ];
17 text = ''
18 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${varDir}
19 '';
20 };
21 security.acme.certs."ftp".extraDomains."${domain}" = null;
22
23 services.websites.env.production.vhostConfs.nath_villon = {
24 certName = "nath";
25 certMainHost = domain;
26 hosts = [ domain ];
27 root = varDir;
28 extraConfig = [
29 ''
30 Use Stats ${domain}
31
32 <Directory ${varDir}>
33 DirectoryIndex index.htm index.html
34 Options Indexes FollowSymLinks MultiViews Includes
35 AllowOverride None
36 Require all granted
37 </Directory>
38 ''
39 ];
40 };
41 };
42}
diff --git a/modules/private/websites/papa/maison_bbc.nix b/modules/private/websites/papa/maison_bbc.nix
deleted file mode 100644
index 3eb736e..0000000
--- a/modules/private/websites/papa/maison_bbc.nix
+++ /dev/null
@@ -1,28 +0,0 @@
1{ lib, config, ... }:
2let
3 cfg = config.myServices.websites.papa.maison_bbc;
4in {
5 options.myServices.websites.papa.maison_bbc.enable = lib.mkEnableOption "enable Papa Maison bbc website";
6
7 config = lib.mkIf cfg.enable {
8 services.webstats.sites = [ { name = "maison.bbc.bouya.org"; } ];
9
10 services.websites.env.production.vhostConfs.papa_maison_bbc = {
11 certName = "papa";
12 addToCerts = true;
13 hosts = [ "maison.bbc.bouya.org" ];
14 root = ./maison_bbc_static;
15 extraConfig = [
16 ''
17 ErrorDocument 404 /index.html
18 <Directory ${./maison_bbc_static}>
19 DirectoryIndex index.htm index.html
20 AllowOverride None
21 Require all granted
22 </Directory>
23 ''
24 ];
25 };
26 };
27}
28
diff --git a/modules/private/websites/papa/maison_bbc_static/data.json b/modules/private/websites/papa/maison_bbc_static/data.json
deleted file mode 100644
index 1784d27..0000000
--- a/modules/private/websites/papa/maison_bbc_static/data.json
+++ /dev/null
@@ -1,4101 +0,0 @@
1{
2 "mean_consumption": {
3 "data": [
4 {
5 "x": "2010-01-01 00:00:00",
6 "y": 0
7 },
8 {
9 "x": "2012-06-01 00:00:00",
10 "y": 0.3
11 },
12 {
13 "x": "2012-07-01 00:00:00",
14 "y": 0.3
15 },
16 {
17 "x": "2012-08-01 00:00:00",
18 "y": 0.5
19 },
20 {
21 "x": "2012-09-01 00:00:00",
22 "y": 0.4
23 },
24 {
25 "x": "2012-10-01 00:00:00",
26 "y": 0.4
27 },
28 {
29 "x": "2012-11-01 00:00:00",
30 "y": 0.5
31 },
32 {
33 "x": "2012-12-01 00:00:00",
34 "y": 0.5
35 },
36 {
37 "x": "2013-01-01 00:00:00",
38 "y": 0.5
39 },
40 {
41 "x": "2013-02-01 00:00:00",
42 "y": 0.4
43 },
44 {
45 "x": "2013-03-01 00:00:00",
46 "y": 0.6
47 },
48 {
49 "x": "2013-04-01 00:00:00",
50 "y": 0.5
51 },
52 {
53 "x": "2013-05-01 00:00:00",
54 "y": 0.5
55 },
56 {
57 "x": "2013-06-01 00:00:00",
58 "y": 0.4
59 },
60 {
61 "x": "2013-07-01 00:00:00",
62 "y": 0.5
63 },
64 {
65 "x": "2013-08-01 00:00:00",
66 "y": 0.4
67 },
68 {
69 "x": "2013-09-01 00:00:00",
70 "y": 0.5
71 },
72 {
73 "x": "2013-10-01 00:00:00",
74 "y": 0.5
75 },
76 {
77 "x": "2013-11-01 00:00:00",
78 "y": 0.6
79 },
80 {
81 "x": "2013-12-01 00:00:00",
82 "y": 0.6
83 },
84 {
85 "x": "2014-01-01 00:00:00",
86 "y": 0.6
87 },
88 {
89 "x": "2014-02-01 00:00:00",
90 "y": 0.5
91 },
92 {
93 "x": "2014-03-01 00:00:00",
94 "y": 0.6
95 },
96 {
97 "x": "2014-04-01 00:00:00",
98 "y": 0.5
99 },
100 {
101 "x": "2014-05-01 00:00:00",
102 "y": 0.6
103 },
104 {
105 "x": "2014-10-01 00:00:00",
106 "y": 0.7
107 },
108 {
109 "x": "2014-12-01 00:00:00",
110 "y": 8.1
111 },
112 {
113 "x": "2015-01-01 00:00:00",
114 "y": 8.8
115 },
116 {
117 "x": "2015-02-01 00:00:00",
118 "y": 8.2
119 },
120 {
121 "x": "2015-03-01 00:00:00",
122 "y": 7.2
123 },
124 {
125 "x": "2015-04-01 00:00:00",
126 "y": 1.2
127 },
128 {
129 "x": "2015-05-01 00:00:00",
130 "y": 0.6
131 },
132 {
133 "x": "2015-06-01 00:00:00",
134 "y": 0.6
135 },
136 {
137 "x": "2015-07-01 00:00:00",
138 "y": 0.5
139 },
140 {
141 "x": "2015-08-01 00:00:00",
142 "y": 0.6
143 },
144 {
145 "x": "2015-09-01 00:00:00",
146 "y": 0.5
147 },
148 {
149 "x": "2016-02-01 00:00:00",
150 "y": 0
151 },
152 {
153 "x": "2016-03-01 00:00:00",
154 "y": 0
155 },
156 {
157 "x": "2016-04-01 00:00:00",
158 "y": 0
159 },
160 {
161 "x": "2016-05-01 00:00:00",
162 "y": 0
163 },
164 {
165 "x": "2016-06-01 00:00:00",
166 "y": 0
167 },
168 {
169 "x": "2016-07-01 00:00:00",
170 "y": 0
171 },
172 {
173 "x": "2016-08-01 00:00:00",
174 "y": 0
175 },
176 {
177 "x": "2016-09-01 00:00:00",
178 "y": 0
179 },
180 {
181 "x": "2017-04-01 00:00:00",
182 "y": 0.4
183 },
184 {
185 "x": "2017-05-01 00:00:00",
186 "y": 0.5
187 },
188 {
189 "x": "2017-06-01 00:00:00",
190 "y": 0.4
191 },
192 {
193 "x": "2017-07-01 00:00:00",
194 "y": 0.6
195 },
196 {
197 "x": "2017-08-01 00:00:00",
198 "y": 0.4
199 },
200 {
201 "x": "2017-09-01 00:00:00",
202 "y": 0.5
203 },
204 {
205 "x": "2017-10-01 00:00:00",
206 "y": 0.4
207 },
208 {
209 "x": "2017-11-01 00:00:00",
210 "y": 0.5
211 },
212 {
213 "x": "2017-12-01 00:00:00",
214 "y": 0.6
215 },
216 {
217 "x": "2018-01-01 00:00:00",
218 "y": 0.6
219 },
220 {
221 "x": "2018-02-01 00:00:00",
222 "y": 0.6
223 },
224 {
225 "x": "2018-03-01 00:00:00",
226 "y": 0.6
227 },
228 {
229 "x": "2018-04-01 00:00:00",
230 "y": 0.5
231 },
232 {
233 "x": "2018-05-01 00:00:00",
234 "y": 0.4
235 },
236 {
237 "x": "2018-06-01 00:00:00",
238 "y": 0.5
239 },
240 {
241 "x": "2018-07-01 00:00:00",
242 "y": 0.5
243 },
244 {
245 "x": "2018-08-01 00:00:00",
246 "y": 0.8
247 },
248 {
249 "x": "2019-03-01 00:00:00",
250 "y": 0.6
251 },
252 {
253 "x": "2019-04-01 00:00:00",
254 "y": 0.6
255 },
256 {
257 "x": "2019-05-01 00:00:00",
258 "y": 0.4
259 },
260 {
261 "x": "2019-06-01 00:00:00",
262 "y": 0.4
263 },
264 {
265 "x": "2019-07-01 00:00:00",
266 "y": 0.4
267 },
268 {
269 "x": "2019-08-01 00:00:00",
270 "y": 0.6
271 },
272 {
273 "x": "2020-03-01 00:00:00",
274 "y": 0.5
275 },
276 {
277 "x": "2020-04-01 00:00:00",
278 "y": 0.5
279 },
280 {
281 "x": "2020-05-01 00:00:00",
282 "y": 0.5
283 }
284 ],
285 "name": "Consommation moyenne",
286 "unit": "kW",
287 "hide": false
288 },
289 "total_consumption": {
290 "data": [
291 {
292 "x": "2010-01-01 00:00:00",
293 "y": 74.8
294 },
295 {
296 "x": "2012-08-01 00:00:00",
297 "y": 629
298 },
299 {
300 "x": "2012-09-01 00:00:00",
301 "y": 859.3
302 },
303 {
304 "x": "2012-10-01 00:00:00",
305 "y": 1150.7
306 },
307 {
308 "x": "2012-11-01 00:00:00",
309 "y": 1440.1
310 },
311 {
312 "x": "2012-12-01 00:00:00",
313 "y": 1829.6
314 },
315 {
316 "x": "2013-01-01 00:00:00",
317 "y": 2218.6
318 },
319 {
320 "x": "2013-02-01 00:00:00",
321 "y": 468.7
322 },
323 {
324 "x": "2013-03-01 00:00:00",
325 "y": 2924.1
326 },
327 {
328 "x": "2013-04-01 00:00:00",
329 "y": -3217.1
330 },
331 {
332 "x": "2013-05-01 00:00:00",
333 "y": -2847.2
334 },
335 {
336 "x": "2013-06-01 00:00:00",
337 "y": 224.6
338 },
339 {
340 "x": "2013-07-01 00:00:00",
341 "y": 536.5
342 },
343 {
344 "x": "2013-08-01 00:00:00",
345 "y": 882
346 },
347 {
348 "x": "2013-09-01 00:00:00",
349 "y": 1207.7
350 },
351 {
352 "x": "2013-10-01 00:00:00",
353 "y": 1565.4
354 },
355 {
356 "x": "2013-11-01 00:00:00",
357 "y": 1924.1
358 },
359 {
360 "x": "2013-12-01 00:00:00",
361 "y": 2323.5
362 },
363 {
364 "x": "2014-01-01 00:00:00",
365 "y": 2754.8
366 },
367 {
368 "x": "2014-02-01 00:00:00",
369 "y": 3176.7
370 },
371 {
372 "x": "2014-03-01 00:00:00",
373 "y": 3530.1
374 },
375 {
376 "x": "2014-04-01 00:00:00",
377 "y": 3975
378 },
379 {
380 "x": "2014-05-01 00:00:00",
381 "y": 4364.8
382 },
383 {
384 "x": "2014-10-01 00:00:00",
385 "y": 1485.8
386 },
387 {
388 "x": "2014-12-01 00:00:00",
389 "y": 9.3
390 },
391 {
392 "x": "2015-01-01 00:00:00",
393 "y": 6
394 },
395 {
396 "x": "2015-02-01 00:00:00",
397 "y": 10
398 },
399 {
400 "x": "2015-03-01 00:00:00",
401 "y": 10.9
402 },
403 {
404 "x": "2015-04-01 00:00:00",
405 "y": 13.1
406 },
407 {
408 "x": "2015-05-01 00:00:00",
409 "y": 1.6
410 },
411 {
412 "x": "2015-06-01 00:00:00",
413 "y": 2.1
414 },
415 {
416 "x": "2015-07-01 00:00:00",
417 "y": 2.8
418 },
419 {
420 "x": "2015-08-01 00:00:00",
421 "y": 2.2
422 },
423 {
424 "x": "2015-09-01 00:00:00",
425 "y": 2.8
426 },
427 {
428 "x": "2016-02-01 00:00:00",
429 "y": 0
430 },
431 {
432 "x": "2016-03-01 00:00:00",
433 "y": 2.1
434 },
435 {
436 "x": "2016-04-01 00:00:00",
437 "y": 43.2
438 },
439 {
440 "x": "2016-05-01 00:00:00",
441 "y": 78.6
442 },
443 {
444 "x": "2016-06-01 00:00:00",
445 "y": 118.2
446 },
447 {
448 "x": "2016-07-01 00:00:00",
449 "y": 155.2
450 },
451 {
452 "x": "2016-08-01 00:00:00",
453 "y": 203.1
454 },
455 {
456 "x": "2016-09-01 00:00:00",
457 "y": 213.7
458 },
459 {
460 "x": "2017-04-01 00:00:00",
461 "y": 4567.8
462 },
463 {
464 "x": "2017-05-01 00:00:00",
465 "y": 46.2
466 },
467 {
468 "x": "2017-06-01 00:00:00",
469 "y": 404.3
470 },
471 {
472 "x": "2017-07-01 00:00:00",
473 "y": 711.3
474 },
475 {
476 "x": "2017-08-01 00:00:00",
477 "y": 1098.7
478 },
479 {
480 "x": "2017-09-01 00:00:00",
481 "y": 1365.4
482 },
483 {
484 "x": "2017-10-01 00:00:00",
485 "y": 1705.3
486 },
487 {
488 "x": "2017-11-01 00:00:00",
489 "y": 2041.5
490 },
491 {
492 "x": "2017-12-01 00:00:00",
493 "y": 2400.8
494 },
495 {
496 "x": "2018-01-01 00:00:00",
497 "y": 2816.8
498 },
499 {
500 "x": "2018-02-01 00:00:00",
501 "y": 3236.5
502 },
503 {
504 "x": "2018-03-01 00:00:00",
505 "y": 3610
506 },
507 {
508 "x": "2018-04-01 00:00:00",
509 "y": 4047.8
510 },
511 {
512 "x": "2018-05-01 00:00:00",
513 "y": 4447.2
514 },
515 {
516 "x": "2018-06-01 00:00:00",
517 "y": 4704.1
518 },
519 {
520 "x": "2018-07-01 00:00:00",
521 "y": 260.9
522 },
523 {
524 "x": "2018-08-01 00:00:00",
525 "y": 502.7
526 },
527 {
528 "x": "2019-03-01 00:00:00",
529 "y": 896.9
530 },
531 {
532 "x": "2019-04-01 00:00:00",
533 "y": 1268.4
534 },
535 {
536 "x": "2019-05-01 00:00:00",
537 "y": 1625.5
538 },
539 {
540 "x": "2019-06-01 00:00:00",
541 "y": 1944.8
542 },
543 {
544 "x": "2019-07-01 00:00:00",
545 "y": 2256.8
546 },
547 {
548 "x": "2019-08-01 00:00:00",
549 "y": 2714.7
550 },
551 {
552 "x": "2020-03-01 00:00:00",
553 "y": 314.9
554 },
555 {
556 "x": "2020-04-01 00:00:00",
557 "y": 679.7
558 },
559 {
560 "x": "2020-05-01 00:00:00",
561 "y": 1084.7
562 }
563 ],
564 "name": "Consommation totale",
565 "unit": "kWh",
566 "hide": false
567 },
568 "Chambre_RDC_temperature": {
569 "data": [
570 {
571 "x": "2012-06-01 00:00:00",
572 "y": 22.3
573 },
574 {
575 "x": "2012-07-01 00:00:00",
576 "y": 22.7
577 },
578 {
579 "x": "2012-08-01 00:00:00",
580 "y": 25.1
581 },
582 {
583 "x": "2012-09-01 00:00:00",
584 "y": 22.6
585 },
586 {
587 "x": "2012-10-01 00:00:00",
588 "y": 20.7
589 },
590 {
591 "x": "2012-11-01 00:00:00",
592 "y": 18
593 },
594 {
595 "x": "2012-12-01 00:00:00",
596 "y": 20
597 },
598 {
599 "x": "2013-01-01 00:00:00",
600 "y": 20.1
601 },
602 {
603 "x": "2013-02-01 00:00:00",
604 "y": 15.6
605 },
606 {
607 "x": "2013-03-01 00:00:00",
608 "y": 20.3
609 },
610 {
611 "x": "2013-04-01 00:00:00",
612 "y": 18.1
613 },
614 {
615 "x": "2013-05-01 00:00:00",
616 "y": 21.5
617 },
618 {
619 "x": "2013-06-01 00:00:00",
620 "y": 22.3
621 },
622 {
623 "x": "2013-07-01 00:00:00",
624 "y": 25.1
625 },
626 {
627 "x": "2013-08-01 00:00:00",
628 "y": 22.7
629 },
630 {
631 "x": "2013-09-01 00:00:00",
632 "y": 22.7
633 },
634 {
635 "x": "2013-10-01 00:00:00",
636 "y": 21.4
637 },
638 {
639 "x": "2013-11-01 00:00:00",
640 "y": 20.3
641 },
642 {
643 "x": "2013-12-01 00:00:00",
644 "y": 20.4
645 },
646 {
647 "x": "2014-01-01 00:00:00",
648 "y": 20.5
649 },
650 {
651 "x": "2014-02-01 00:00:00",
652 "y": 19.8
653 },
654 {
655 "x": "2014-03-01 00:00:00",
656 "y": 20.6
657 },
658 {
659 "x": "2014-04-01 00:00:00",
660 "y": 21.3
661 },
662 {
663 "x": "2014-05-01 00:00:00",
664 "y": 21.9
665 },
666 {
667 "x": "2014-06-01 00:00:00",
668 "y": 25
669 },
670 {
671 "x": "2014-10-01 00:00:00",
672 "y": 22.4
673 },
674 {
675 "x": "2014-11-01 00:00:00",
676 "y": 20.6
677 },
678 {
679 "x": "2014-12-01 00:00:00",
680 "y": 18.2
681 },
682 {
683 "x": "2015-01-01 00:00:00",
684 "y": 20
685 },
686 {
687 "x": "2015-02-01 00:00:00",
688 "y": 20
689 },
690 {
691 "x": "2015-03-01 00:00:00",
692 "y": 19.6
693 },
694 {
695 "x": "2015-04-01 00:00:00",
696 "y": 21.4
697 },
698 {
699 "x": "2015-05-01 00:00:00",
700 "y": 20.4
701 },
702 {
703 "x": "2015-06-01 00:00:00",
704 "y": 24.2
705 },
706 {
707 "x": "2015-07-01 00:00:00",
708 "y": 24.5
709 },
710 {
711 "x": "2015-08-01 00:00:00",
712 "y": 23.6
713 },
714 {
715 "x": "2015-09-01 00:00:00",
716 "y": 22.2
717 },
718 {
719 "x": "2015-10-01 00:00:00",
720 "y": 20.9
721 },
722 {
723 "x": "2015-11-01 00:00:00",
724 "y": 20.6
725 },
726 {
727 "x": "2015-12-01 00:00:00",
728 "y": 19.5
729 },
730 {
731 "x": "2016-01-01 00:00:00",
732 "y": 19.8
733 },
734 {
735 "x": "2016-02-01 00:00:00",
736 "y": 20.4
737 },
738 {
739 "x": "2016-03-01 00:00:00",
740 "y": 19.8
741 },
742 {
743 "x": "2016-04-01 00:00:00",
744 "y": 19.5
745 },
746 {
747 "x": "2016-05-01 00:00:00",
748 "y": 21.3
749 },
750 {
751 "x": "2016-06-01 00:00:00",
752 "y": 22.9
753 },
754 {
755 "x": "2016-07-01 00:00:00",
756 "y": 24.4
757 },
758 {
759 "x": "2016-08-01 00:00:00",
760 "y": 24
761 },
762 {
763 "x": "2016-09-01 00:00:00",
764 "y": 23.5
765 },
766 {
767 "x": "2017-03-01 00:00:00",
768 "y": 21.1
769 },
770 {
771 "x": "2017-04-01 00:00:00",
772 "y": 20.6
773 },
774 {
775 "x": "2017-05-01 00:00:00",
776 "y": 22.2
777 },
778 {
779 "x": "2017-06-01 00:00:00",
780 "y": 23.7
781 },
782 {
783 "x": "2017-07-01 00:00:00",
784 "y": 23.9
785 },
786 {
787 "x": "2017-08-01 00:00:00",
788 "y": 23.4
789 },
790 {
791 "x": "2017-09-01 00:00:00",
792 "y": 22.9
793 },
794 {
795 "x": "2017-10-01 00:00:00",
796 "y": 22
797 },
798 {
799 "x": "2017-11-01 00:00:00",
800 "y": 19.7
801 },
802 {
803 "x": "2017-12-01 00:00:00",
804 "y": 20
805 },
806 {
807 "x": "2018-01-01 00:00:00",
808 "y": 20
809 },
810 {
811 "x": "2018-02-01 00:00:00",
812 "y": 20.2
813 },
814 {
815 "x": "2018-03-01 00:00:00",
816 "y": 19.9
817 },
818 {
819 "x": "2018-04-01 00:00:00",
820 "y": 21.1
821 },
822 {
823 "x": "2018-05-01 00:00:00",
824 "y": 22.3
825 },
826 {
827 "x": "2018-06-01 00:00:00",
828 "y": 23.5
829 },
830 {
831 "x": "2018-07-01 00:00:00",
832 "y": 23.8
833 },
834 {
835 "x": "2018-08-01 00:00:00",
836 "y": 23.5
837 },
838 {
839 "x": "2019-03-01 00:00:00",
840 "y": 21.7
841 },
842 {
843 "x": "2019-04-01 00:00:00",
844 "y": 21.7
845 },
846 {
847 "x": "2019-05-01 00:00:00",
848 "y": 21.7
849 },
850 {
851 "x": "2019-06-01 00:00:00",
852 "y": 23.6
853 },
854 {
855 "x": "2019-07-01 00:00:00",
856 "y": 24.4
857 },
858 {
859 "x": "2019-08-01 00:00:00",
860 "y": 23.3
861 },
862 {
863 "x": "2020-03-01 00:00:00",
864 "y": 22
865 }
866 ],
867 "name": "Chambre_RDC",
868 "unit": "°C",
869 "hide": false
870 },
871 "Exterieure_temperature": {
872 "data": [
873 {
874 "x": "2012-06-01 00:00:00",
875 "y": 18.6
876 },
877 {
878 "x": "2012-07-01 00:00:00",
879 "y": 20.2
880 },
881 {
882 "x": "2012-08-01 00:00:00",
883 "y": 24.7
884 },
885 {
886 "x": "2012-09-01 00:00:00",
887 "y": 23.2
888 },
889 {
890 "x": "2012-10-01 00:00:00",
891 "y": 21.7
892 },
893 {
894 "x": "2012-11-01 00:00:00",
895 "y": 13.3
896 },
897 {
898 "x": "2012-12-01 00:00:00",
899 "y": 6.1
900 },
901 {
902 "x": "2013-01-01 00:00:00",
903 "y": 3.3
904 },
905 {
906 "x": "2013-02-01 00:00:00",
907 "y": 1.9
908 },
909 {
910 "x": "2013-03-01 00:00:00",
911 "y": 6.6
912 },
913 {
914 "x": "2013-04-01 00:00:00",
915 "y": 10.2
916 },
917 {
918 "x": "2013-05-01 00:00:00",
919 "y": 11.2
920 },
921 {
922 "x": "2013-06-01 00:00:00",
923 "y": 16.9
924 },
925 {
926 "x": "2013-07-01 00:00:00",
927 "y": 28.9
928 },
929 {
930 "x": "2013-10-01 00:00:00",
931 "y": 16.9
932 },
933 {
934 "x": "2013-11-01 00:00:00",
935 "y": 5.9
936 },
937 {
938 "x": "2013-12-01 00:00:00",
939 "y": 4.5
940 },
941 {
942 "x": "2014-01-01 00:00:00",
943 "y": 6.9
944 },
945 {
946 "x": "2014-02-01 00:00:00",
947 "y": 6.8
948 },
949 {
950 "x": "2014-03-01 00:00:00",
951 "y": 8.3
952 },
953 {
954 "x": "2014-04-01 00:00:00",
955 "y": 11.6
956 },
957 {
958 "x": "2014-05-01 00:00:00",
959 "y": 12
960 },
961 {
962 "x": "2014-06-01 00:00:00",
963 "y": 17.3
964 },
965 {
966 "x": "2014-10-01 00:00:00",
967 "y": 13.5
968 },
969 {
970 "x": "2014-11-01 00:00:00",
971 "y": 9.9
972 },
973 {
974 "x": "2014-12-01 00:00:00",
975 "y": 4.5
976 },
977 {
978 "x": "2015-01-01 00:00:00",
979 "y": 4.4
980 },
981 {
982 "x": "2015-02-01 00:00:00",
983 "y": 4.4
984 },
985 {
986 "x": "2015-03-01 00:00:00",
987 "y": 7.7
988 },
989 {
990 "x": "2015-04-01 00:00:00",
991 "y": 12.4
992 },
993 {
994 "x": "2015-05-01 00:00:00",
995 "y": 14.1
996 },
997 {
998 "x": "2015-06-01 00:00:00",
999 "y": 18.8
1000 },
1001 {
1002 "x": "2015-07-01 00:00:00",
1003 "y": 21.5
1004 },
1005 {
1006 "x": "2015-08-01 00:00:00",
1007 "y": 20.7
1008 },
1009 {
1010 "x": "2015-09-01 00:00:00",
1011 "y": 14.3
1012 },
1013 {
1014 "x": "2015-10-01 00:00:00",
1015 "y": 10.4
1016 },
1017 {
1018 "x": "2015-11-01 00:00:00",
1019 "y": 9.3
1020 },
1021 {
1022 "x": "2015-12-01 00:00:00",
1023 "y": 7.7
1024 },
1025 {
1026 "x": "2016-01-01 00:00:00",
1027 "y": 6
1028 },
1029 {
1030 "x": "2016-02-01 00:00:00",
1031 "y": 5.6
1032 },
1033 {
1034 "x": "2016-03-01 00:00:00",
1035 "y": 6.6
1036 },
1037 {
1038 "x": "2016-04-01 00:00:00",
1039 "y": 9.6
1040 },
1041 {
1042 "x": "2016-05-01 00:00:00",
1043 "y": 14.5
1044 },
1045 {
1046 "x": "2016-06-01 00:00:00",
1047 "y": 17.9
1048 },
1049 {
1050 "x": "2016-07-01 00:00:00",
1051 "y": 21.3
1052 },
1053 {
1054 "x": "2016-08-01 00:00:00",
1055 "y": 20.4
1056 },
1057 {
1058 "x": "2017-03-01 00:00:00",
1059 "y": 14.2
1060 },
1061 {
1062 "x": "2017-04-01 00:00:00",
1063 "y": 9.7
1064 },
1065 {
1066 "x": "2017-05-01 00:00:00",
1067 "y": 16.8
1068 },
1069 {
1070 "x": "2017-06-01 00:00:00",
1071 "y": 23.9
1072 },
1073 {
1074 "x": "2017-07-01 00:00:00",
1075 "y": 21.4
1076 },
1077 {
1078 "x": "2017-08-01 00:00:00",
1079 "y": 20.7
1080 },
1081 {
1082 "x": "2017-09-01 00:00:00",
1083 "y": 15.8
1084 },
1085 {
1086 "x": "2017-10-01 00:00:00",
1087 "y": 14.2
1088 },
1089 {
1090 "x": "2017-11-01 00:00:00",
1091 "y": 7.5
1092 },
1093 {
1094 "x": "2017-12-01 00:00:00",
1095 "y": 4.2
1096 },
1097 {
1098 "x": "2018-03-01 00:00:00",
1099 "y": 10.2
1100 },
1101 {
1102 "x": "2018-04-01 00:00:00",
1103 "y": 17.6
1104 },
1105 {
1106 "x": "2018-05-01 00:00:00",
1107 "y": 16.1
1108 },
1109 {
1110 "x": "2018-06-01 00:00:00",
1111 "y": 22.4
1112 },
1113 {
1114 "x": "2018-07-01 00:00:00",
1115 "y": 30
1116 },
1117 {
1118 "x": "2018-08-01 00:00:00",
1119 "y": 19.8
1120 }
1121 ],
1122 "name": "Exterieure",
1123 "unit": "°C",
1124 "hide": false
1125 },
1126 "Sejour_temperature": {
1127 "data": [
1128 {
1129 "x": "2012-06-01 00:00:00",
1130 "y": 22.8
1131 },
1132 {
1133 "x": "2012-07-01 00:00:00",
1134 "y": 23
1135 },
1136 {
1137 "x": "2012-08-01 00:00:00",
1138 "y": 25.3
1139 },
1140 {
1141 "x": "2012-09-01 00:00:00",
1142 "y": 23.3
1143 },
1144 {
1145 "x": "2012-10-01 00:00:00",
1146 "y": 21.7
1147 },
1148 {
1149 "x": "2012-11-01 00:00:00",
1150 "y": 19.9
1151 },
1152 {
1153 "x": "2012-12-01 00:00:00",
1154 "y": 20.1
1155 },
1156 {
1157 "x": "2013-01-01 00:00:00",
1158 "y": 20
1159 },
1160 {
1161 "x": "2013-02-01 00:00:00",
1162 "y": 15.8
1163 },
1164 {
1165 "x": "2013-03-01 00:00:00",
1166 "y": 20.5
1167 },
1168 {
1169 "x": "2013-04-01 00:00:00",
1170 "y": 20.8
1171 },
1172 {
1173 "x": "2013-05-01 00:00:00",
1174 "y": 20.9
1175 },
1176 {
1177 "x": "2013-06-01 00:00:00",
1178 "y": 22
1179 },
1180 {
1181 "x": "2013-07-01 00:00:00",
1182 "y": 25
1183 },
1184 {
1185 "x": "2013-08-01 00:00:00",
1186 "y": 22.7
1187 },
1188 {
1189 "x": "2013-09-01 00:00:00",
1190 "y": 22.9
1191 },
1192 {
1193 "x": "2013-10-01 00:00:00",
1194 "y": 21.5
1195 },
1196 {
1197 "x": "2013-11-01 00:00:00",
1198 "y": 20.3
1199 },
1200 {
1201 "x": "2013-12-01 00:00:00",
1202 "y": 20.7
1203 },
1204 {
1205 "x": "2014-01-01 00:00:00",
1206 "y": 20.6
1207 },
1208 {
1209 "x": "2014-02-01 00:00:00",
1210 "y": 19.9
1211 },
1212 {
1213 "x": "2014-03-01 00:00:00",
1214 "y": 21.2
1215 },
1216 {
1217 "x": "2014-04-01 00:00:00",
1218 "y": 21.7
1219 },
1220 {
1221 "x": "2014-05-01 00:00:00",
1222 "y": 22.3
1223 },
1224 {
1225 "x": "2014-06-01 00:00:00",
1226 "y": 25.6
1227 },
1228 {
1229 "x": "2014-10-01 00:00:00",
1230 "y": 22.8
1231 },
1232 {
1233 "x": "2014-11-01 00:00:00",
1234 "y": 20.9
1235 },
1236 {
1237 "x": "2014-12-01 00:00:00",
1238 "y": 18
1239 },
1240 {
1241 "x": "2015-01-01 00:00:00",
1242 "y": 20
1243 },
1244 {
1245 "x": "2015-02-01 00:00:00",
1246 "y": 20
1247 },
1248 {
1249 "x": "2015-03-01 00:00:00",
1250 "y": 19.6
1251 },
1252 {
1253 "x": "2015-04-01 00:00:00",
1254 "y": 21.8
1255 },
1256 {
1257 "x": "2015-05-01 00:00:00",
1258 "y": 20.5
1259 },
1260 {
1261 "x": "2015-06-01 00:00:00",
1262 "y": 24.4
1263 },
1264 {
1265 "x": "2015-07-01 00:00:00",
1266 "y": 21.6
1267 },
1268 {
1269 "x": "2015-08-01 00:00:00",
1270 "y": 23.9
1271 },
1272 {
1273 "x": "2015-09-01 00:00:00",
1274 "y": 23.1
1275 },
1276 {
1277 "x": "2015-10-01 00:00:00",
1278 "y": 21.4
1279 },
1280 {
1281 "x": "2015-11-01 00:00:00",
1282 "y": 21.1
1283 },
1284 {
1285 "x": "2015-12-01 00:00:00",
1286 "y": 20.1
1287 },
1288 {
1289 "x": "2016-01-01 00:00:00",
1290 "y": 20.1
1291 },
1292 {
1293 "x": "2016-02-01 00:00:00",
1294 "y": 20.3
1295 },
1296 {
1297 "x": "2016-03-01 00:00:00",
1298 "y": 20.2
1299 },
1300 {
1301 "x": "2016-04-01 00:00:00",
1302 "y": 19.7
1303 },
1304 {
1305 "x": "2016-05-01 00:00:00",
1306 "y": 21.6
1307 },
1308 {
1309 "x": "2016-06-01 00:00:00",
1310 "y": 23.2
1311 },
1312 {
1313 "x": "2016-07-01 00:00:00",
1314 "y": 24.7
1315 },
1316 {
1317 "x": "2016-08-01 00:00:00",
1318 "y": 24.5
1319 },
1320 {
1321 "x": "2016-09-01 00:00:00",
1322 "y": 23.7
1323 },
1324 {
1325 "x": "2017-03-01 00:00:00",
1326 "y": 21.7
1327 },
1328 {
1329 "x": "2017-04-01 00:00:00",
1330 "y": 21
1331 },
1332 {
1333 "x": "2017-05-01 00:00:00",
1334 "y": 22.6
1335 },
1336 {
1337 "x": "2017-06-01 00:00:00",
1338 "y": 24
1339 },
1340 {
1341 "x": "2017-07-01 00:00:00",
1342 "y": 24.3
1343 },
1344 {
1345 "x": "2017-08-01 00:00:00",
1346 "y": 23.7
1347 },
1348 {
1349 "x": "2017-09-01 00:00:00",
1350 "y": 23.3
1351 },
1352 {
1353 "x": "2017-10-01 00:00:00",
1354 "y": 22.6
1355 },
1356 {
1357 "x": "2017-11-01 00:00:00",
1358 "y": 20.3
1359 },
1360 {
1361 "x": "2017-12-01 00:00:00",
1362 "y": 19.9
1363 },
1364 {
1365 "x": "2018-01-01 00:00:00",
1366 "y": 19.9
1367 },
1368 {
1369 "x": "2018-02-01 00:00:00",
1370 "y": 19.9
1371 },
1372 {
1373 "x": "2018-03-01 00:00:00",
1374 "y": 20.3
1375 },
1376 {
1377 "x": "2018-04-01 00:00:00",
1378 "y": 21.6
1379 },
1380 {
1381 "x": "2018-05-01 00:00:00",
1382 "y": 22.6
1383 },
1384 {
1385 "x": "2018-06-01 00:00:00",
1386 "y": 23.8
1387 },
1388 {
1389 "x": "2018-07-01 00:00:00",
1390 "y": 23.9
1391 },
1392 {
1393 "x": "2018-08-01 00:00:00",
1394 "y": 23.7
1395 },
1396 {
1397 "x": "2019-03-01 00:00:00",
1398 "y": 23.3
1399 },
1400 {
1401 "x": "2019-04-01 00:00:00",
1402 "y": 22.7
1403 },
1404 {
1405 "x": "2019-05-01 00:00:00",
1406 "y": 22.2
1407 },
1408 {
1409 "x": "2019-06-01 00:00:00",
1410 "y": 23.8
1411 },
1412 {
1413 "x": "2019-07-01 00:00:00",
1414 "y": 24.6
1415 },
1416 {
1417 "x": "2019-08-01 00:00:00",
1418 "y": 23.3
1419 },
1420 {
1421 "x": "2020-03-01 00:00:00",
1422 "y": 23.5
1423 }
1424 ],
1425 "name": "Sejour",
1426 "unit": "°C",
1427 "hide": false
1428 },
1429 "Garage_temperature": {
1430 "data": [
1431 {
1432 "x": "2012-06-01 00:00:00",
1433 "y": 20.2
1434 },
1435 {
1436 "x": "2012-07-01 00:00:00",
1437 "y": 19.4
1438 },
1439 {
1440 "x": "2012-08-01 00:00:00",
1441 "y": 22.2
1442 },
1443 {
1444 "x": "2012-09-01 00:00:00",
1445 "y": 17
1446 },
1447 {
1448 "x": "2012-10-01 00:00:00",
1449 "y": 13.8
1450 },
1451 {
1452 "x": "2012-11-01 00:00:00",
1453 "y": 9.2
1454 },
1455 {
1456 "x": "2012-12-01 00:00:00",
1457 "y": 7.6
1458 },
1459 {
1460 "x": "2013-01-01 00:00:00",
1461 "y": 5.3
1462 },
1463 {
1464 "x": "2013-02-01 00:00:00",
1465 "y": 3.4
1466 },
1467 {
1468 "x": "2013-03-01 00:00:00",
1469 "y": 7.3
1470 },
1471 {
1472 "x": "2013-04-01 00:00:00",
1473 "y": 10.7
1474 },
1475 {
1476 "x": "2013-05-01 00:00:00",
1477 "y": 12.4
1478 },
1479 {
1480 "x": "2013-06-01 00:00:00",
1481 "y": 17.2
1482 },
1483 {
1484 "x": "2013-07-01 00:00:00",
1485 "y": 23
1486 },
1487 {
1488 "x": "2013-08-01 00:00:00",
1489 "y": 20.2
1490 },
1491 {
1492 "x": "2013-09-01 00:00:00",
1493 "y": 17.1
1494 },
1495 {
1496 "x": "2013-10-01 00:00:00",
1497 "y": 14.5
1498 },
1499 {
1500 "x": "2013-11-01 00:00:00",
1501 "y": 8.2
1502 },
1503 {
1504 "x": "2013-12-01 00:00:00",
1505 "y": 5.9
1506 },
1507 {
1508 "x": "2014-01-01 00:00:00",
1509 "y": 7.9
1510 },
1511 {
1512 "x": "2014-02-01 00:00:00",
1513 "y": 7.6
1514 },
1515 {
1516 "x": "2014-03-01 00:00:00",
1517 "y": 9
1518 },
1519 {
1520 "x": "2014-04-01 00:00:00",
1521 "y": 12.6
1522 },
1523 {
1524 "x": "2014-05-01 00:00:00",
1525 "y": 14.2
1526 },
1527 {
1528 "x": "2014-06-01 00:00:00",
1529 "y": 21.5
1530 },
1531 {
1532 "x": "2014-10-01 00:00:00",
1533 "y": 14.6
1534 },
1535 {
1536 "x": "2014-11-01 00:00:00",
1537 "y": 11.2
1538 },
1539 {
1540 "x": "2014-12-01 00:00:00",
1541 "y": 6.7
1542 },
1543 {
1544 "x": "2015-01-01 00:00:00",
1545 "y": 6.3
1546 },
1547 {
1548 "x": "2015-02-01 00:00:00",
1549 "y": 5.1
1550 },
1551 {
1552 "x": "2015-03-01 00:00:00",
1553 "y": 8.6
1554 },
1555 {
1556 "x": "2015-04-01 00:00:00",
1557 "y": 13.3
1558 },
1559 {
1560 "x": "2015-05-01 00:00:00",
1561 "y": 14.2
1562 },
1563 {
1564 "x": "2015-06-01 00:00:00",
1565 "y": 20.9
1566 },
1567 {
1568 "x": "2015-07-01 00:00:00",
1569 "y": 23.2
1570 },
1571 {
1572 "x": "2015-08-01 00:00:00",
1573 "y": 21.8
1574 },
1575 {
1576 "x": "2015-09-01 00:00:00",
1577 "y": 16.3
1578 },
1579 {
1580 "x": "2015-10-01 00:00:00",
1581 "y": 12.5
1582 },
1583 {
1584 "x": "2015-11-01 00:00:00",
1585 "y": 10.8
1586 },
1587 {
1588 "x": "2015-12-01 00:00:00",
1589 "y": 7.5
1590 },
1591 {
1592 "x": "2016-02-01 00:00:00",
1593 "y": 55.6
1594 },
1595 {
1596 "x": "2016-03-01 00:00:00",
1597 "y": 8
1598 },
1599 {
1600 "x": "2016-04-01 00:00:00",
1601 "y": 11.4
1602 },
1603 {
1604 "x": "2016-05-01 00:00:00",
1605 "y": 15.2
1606 },
1607 {
1608 "x": "2016-06-01 00:00:00",
1609 "y": 18.5
1610 },
1611 {
1612 "x": "2016-07-01 00:00:00",
1613 "y": 21.3
1614 },
1615 {
1616 "x": "2016-08-01 00:00:00",
1617 "y": 22.6
1618 },
1619 {
1620 "x": "2016-09-01 00:00:00",
1621 "y": 18.8
1622 },
1623 {
1624 "x": "2017-03-01 00:00:00",
1625 "y": 15.2
1626 },
1627 {
1628 "x": "2017-04-01 00:00:00",
1629 "y": 11.5
1630 },
1631 {
1632 "x": "2017-05-01 00:00:00",
1633 "y": 16.7
1634 },
1635 {
1636 "x": "2017-06-01 00:00:00",
1637 "y": 21.7
1638 },
1639 {
1640 "x": "2017-07-01 00:00:00",
1641 "y": 21.5
1642 },
1643 {
1644 "x": "2017-08-01 00:00:00",
1645 "y": 21.1
1646 },
1647 {
1648 "x": "2017-09-01 00:00:00",
1649 "y": 16.4
1650 },
1651 {
1652 "x": "2017-10-01 00:00:00",
1653 "y": 14.2
1654 },
1655 {
1656 "x": "2017-11-01 00:00:00",
1657 "y": 9
1658 },
1659 {
1660 "x": "2017-12-01 00:00:00",
1661 "y": 7
1662 },
1663 {
1664 "x": "2018-01-01 00:00:00",
1665 "y": 9.3
1666 },
1667 {
1668 "x": "2018-02-01 00:00:00",
1669 "y": 4
1670 },
1671 {
1672 "x": "2018-03-01 00:00:00",
1673 "y": 9.4
1674 },
1675 {
1676 "x": "2018-04-01 00:00:00",
1677 "y": 12.9
1678 },
1679 {
1680 "x": "2019-03-01 00:00:00",
1681 "y": 13.9
1682 },
1683 {
1684 "x": "2019-04-01 00:00:00",
1685 "y": 14.1
1686 },
1687 {
1688 "x": "2019-05-01 00:00:00",
1689 "y": 16.4
1690 },
1691 {
1692 "x": "2019-06-01 00:00:00",
1693 "y": 24
1694 },
1695 {
1696 "x": "2019-07-01 00:00:00",
1697 "y": 24.2
1698 },
1699 {
1700 "x": "2020-03-01 00:00:00",
1701 "y": 21.3
1702 },
1703 {
1704 "x": "2020-05-01 00:00:00",
1705 "y": 21
1706 }
1707 ],
1708 "name": "Garage",
1709 "unit": "°C",
1710 "hide": true
1711 },
1712 "Soufflage_temperature": {
1713 "data": [
1714 {
1715 "x": "2012-06-01 00:00:00",
1716 "y": 22
1717 },
1718 {
1719 "x": "2012-07-01 00:00:00",
1720 "y": 22.3
1721 },
1722 {
1723 "x": "2012-08-01 00:00:00",
1724 "y": 24.1
1725 },
1726 {
1727 "x": "2012-09-01 00:00:00",
1728 "y": 20.7
1729 },
1730 {
1731 "x": "2012-10-01 00:00:00",
1732 "y": 18.1
1733 },
1734 {
1735 "x": "2012-11-01 00:00:00",
1736 "y": 14.6
1737 },
1738 {
1739 "x": "2012-12-01 00:00:00",
1740 "y": 16.5
1741 },
1742 {
1743 "x": "2013-01-01 00:00:00",
1744 "y": 16.7
1745 },
1746 {
1747 "x": "2013-02-01 00:00:00",
1748 "y": 13.4
1749 },
1750 {
1751 "x": "2013-03-01 00:00:00",
1752 "y": 18.2
1753 },
1754 {
1755 "x": "2013-04-01 00:00:00",
1756 "y": 19.8
1757 },
1758 {
1759 "x": "2013-05-01 00:00:00",
1760 "y": 20.4
1761 },
1762 {
1763 "x": "2013-06-01 00:00:00",
1764 "y": 22.7
1765 },
1766 {
1767 "x": "2013-07-01 00:00:00",
1768 "y": 24.9
1769 },
1770 {
1771 "x": "2013-08-01 00:00:00",
1772 "y": 22.8
1773 },
1774 {
1775 "x": "2013-09-01 00:00:00",
1776 "y": 22.3
1777 },
1778 {
1779 "x": "2013-10-01 00:00:00",
1780 "y": 20.2
1781 },
1782 {
1783 "x": "2013-11-01 00:00:00",
1784 "y": 17
1785 },
1786 {
1787 "x": "2013-12-01 00:00:00",
1788 "y": 17.8
1789 },
1790 {
1791 "x": "2014-01-01 00:00:00",
1792 "y": 18.3
1793 },
1794 {
1795 "x": "2014-02-01 00:00:00",
1796 "y": 17.8
1797 },
1798 {
1799 "x": "2014-03-01 00:00:00",
1800 "y": 19.1
1801 },
1802 {
1803 "x": "2014-04-01 00:00:00",
1804 "y": 20.7
1805 },
1806 {
1807 "x": "2014-11-01 00:00:00",
1808 "y": 24.1
1809 },
1810 {
1811 "x": "2014-12-01 00:00:00",
1812 "y": 6.6
1813 },
1814 {
1815 "x": "2015-01-01 00:00:00",
1816 "y": 6.4
1817 },
1818 {
1819 "x": "2015-02-01 00:00:00",
1820 "y": 4.8
1821 },
1822 {
1823 "x": "2015-03-01 00:00:00",
1824 "y": 9.9
1825 },
1826 {
1827 "x": "2015-04-01 00:00:00",
1828 "y": 15.3
1829 },
1830 {
1831 "x": "2015-05-01 00:00:00",
1832 "y": 15.8
1833 },
1834 {
1835 "x": "2015-06-01 00:00:00",
1836 "y": 20.1
1837 },
1838 {
1839 "x": "2015-07-01 00:00:00",
1840 "y": 21.8
1841 },
1842 {
1843 "x": "2015-08-01 00:00:00",
1844 "y": 21.9
1845 },
1846 {
1847 "x": "2015-09-01 00:00:00",
1848 "y": 17.1
1849 },
1850 {
1851 "x": "2015-10-01 00:00:00",
1852 "y": 13.2
1853 },
1854 {
1855 "x": "2015-11-01 00:00:00",
1856 "y": 12.8
1857 },
1858 {
1859 "x": "2015-12-01 00:00:00",
1860 "y": 11.1
1861 },
1862 {
1863 "x": "2016-01-01 00:00:00",
1864 "y": 11.7
1865 },
1866 {
1867 "x": "2016-02-01 00:00:00",
1868 "y": 11.3
1869 },
1870 {
1871 "x": "2017-03-01 00:00:00",
1872 "y": 24.2
1873 },
1874 {
1875 "x": "2017-04-01 00:00:00",
1876 "y": 18.5
1877 },
1878 {
1879 "x": "2017-05-01 00:00:00",
1880 "y": 22.2
1881 },
1882 {
1883 "x": "2017-06-01 00:00:00",
1884 "y": 24.2
1885 },
1886 {
1887 "x": "2017-07-01 00:00:00",
1888 "y": 23.8
1889 },
1890 {
1891 "x": "2017-08-01 00:00:00",
1892 "y": 23
1893 },
1894 {
1895 "x": "2017-09-01 00:00:00",
1896 "y": 20.9
1897 },
1898 {
1899 "x": "2017-10-01 00:00:00",
1900 "y": 19.3
1901 },
1902 {
1903 "x": "2017-11-01 00:00:00",
1904 "y": 14.6
1905 },
1906 {
1907 "x": "2017-12-01 00:00:00",
1908 "y": 14.9
1909 },
1910 {
1911 "x": "2018-01-01 00:00:00",
1912 "y": 16.4
1913 },
1914 {
1915 "x": "2018-02-01 00:00:00",
1916 "y": 13.5
1917 },
1918 {
1919 "x": "2018-03-01 00:00:00",
1920 "y": 14.7
1921 }
1922 ],
1923 "name": "Soufflage",
1924 "unit": "°C",
1925 "hide": true
1926 },
1927 "Mezzanine_temperature": {
1928 "data": [
1929 {
1930 "x": "2012-06-01 00:00:00",
1931 "y": 23.3
1932 },
1933 {
1934 "x": "2012-07-01 00:00:00",
1935 "y": 23.5
1936 },
1937 {
1938 "x": "2012-08-01 00:00:00",
1939 "y": 25.9
1940 },
1941 {
1942 "x": "2012-09-01 00:00:00",
1943 "y": 23.1
1944 },
1945 {
1946 "x": "2012-10-01 00:00:00",
1947 "y": 21.5
1948 },
1949 {
1950 "x": "2012-11-01 00:00:00",
1951 "y": 19.7
1952 },
1953 {
1954 "x": "2012-12-01 00:00:00",
1955 "y": 19.4
1956 },
1957 {
1958 "x": "2013-01-01 00:00:00",
1959 "y": 19
1960 },
1961 {
1962 "x": "2013-02-01 00:00:00",
1963 "y": 15.3
1964 },
1965 {
1966 "x": "2013-03-01 00:00:00",
1967 "y": 19.9
1968 },
1969 {
1970 "x": "2013-04-01 00:00:00",
1971 "y": 20.5
1972 },
1973 {
1974 "x": "2013-05-01 00:00:00",
1975 "y": 20.8
1976 },
1977 {
1978 "x": "2013-06-01 00:00:00",
1979 "y": 22.2
1980 },
1981 {
1982 "x": "2013-07-01 00:00:00",
1983 "y": 25.7
1984 },
1985 {
1986 "x": "2013-08-01 00:00:00",
1987 "y": 23.1
1988 },
1989 {
1990 "x": "2013-09-01 00:00:00",
1991 "y": 23
1992 },
1993 {
1994 "x": "2013-10-01 00:00:00",
1995 "y": 21.5
1996 },
1997 {
1998 "x": "2013-11-01 00:00:00",
1999 "y": 19.5
2000 },
2001 {
2002 "x": "2013-12-01 00:00:00",
2003 "y": 20
2004 },
2005 {
2006 "x": "2014-01-01 00:00:00",
2007 "y": 20
2008 },
2009 {
2010 "x": "2014-02-01 00:00:00",
2011 "y": 19.6
2012 },
2013 {
2014 "x": "2014-03-01 00:00:00",
2015 "y": 21.1
2016 },
2017 {
2018 "x": "2014-04-01 00:00:00",
2019 "y": 21.6
2020 },
2021 {
2022 "x": "2014-05-01 00:00:00",
2023 "y": 22.3
2024 },
2025 {
2026 "x": "2014-06-01 00:00:00",
2027 "y": 25.9
2028 },
2029 {
2030 "x": "2015-09-01 00:00:00",
2031 "y": 22.7
2032 },
2033 {
2034 "x": "2015-10-01 00:00:00",
2035 "y": 21.3
2036 },
2037 {
2038 "x": "2015-11-01 00:00:00",
2039 "y": 20.9
2040 },
2041 {
2042 "x": "2015-12-01 00:00:00",
2043 "y": 19.9
2044 },
2045 {
2046 "x": "2016-01-01 00:00:00",
2047 "y": 19.6
2048 },
2049 {
2050 "x": "2016-02-01 00:00:00",
2051 "y": 17.6
2052 },
2053 {
2054 "x": "2016-03-01 00:00:00",
2055 "y": 19.9
2056 },
2057 {
2058 "x": "2016-04-01 00:00:00",
2059 "y": 19.5
2060 },
2061 {
2062 "x": "2016-05-01 00:00:00",
2063 "y": 21.6
2064 },
2065 {
2066 "x": "2016-06-01 00:00:00",
2067 "y": 23.5
2068 },
2069 {
2070 "x": "2016-07-01 00:00:00",
2071 "y": 25.4
2072 },
2073 {
2074 "x": "2016-08-01 00:00:00",
2075 "y": 25.1
2076 },
2077 {
2078 "x": "2016-09-01 00:00:00",
2079 "y": 24.2
2080 },
2081 {
2082 "x": "2017-03-01 00:00:00",
2083 "y": 21.8
2084 },
2085 {
2086 "x": "2017-04-01 00:00:00",
2087 "y": 20.6
2088 },
2089 {
2090 "x": "2017-05-01 00:00:00",
2091 "y": 22.8
2092 },
2093 {
2094 "x": "2017-06-01 00:00:00",
2095 "y": 24.9
2096 },
2097 {
2098 "x": "2017-07-01 00:00:00",
2099 "y": 24.9
2100 },
2101 {
2102 "x": "2017-08-01 00:00:00",
2103 "y": 24.2
2104 },
2105 {
2106 "x": "2017-09-01 00:00:00",
2107 "y": 23.2
2108 },
2109 {
2110 "x": "2019-03-01 00:00:00",
2111 "y": 22.7
2112 },
2113 {
2114 "x": "2019-04-01 00:00:00",
2115 "y": 22.6
2116 },
2117 {
2118 "x": "2019-05-01 00:00:00",
2119 "y": 22.2
2120 },
2121 {
2122 "x": "2019-06-01 00:00:00",
2123 "y": 24.4
2124 },
2125 {
2126 "x": "2019-07-01 00:00:00",
2127 "y": 25.6
2128 },
2129 {
2130 "x": "2019-08-01 00:00:00",
2131 "y": 23.9
2132 }
2133 ],
2134 "name": "Mezzanine",
2135 "unit": "°C",
2136 "hide": false
2137 },
2138 "Extraction_temperature": {
2139 "data": [
2140 {
2141 "x": "2012-06-01 00:00:00",
2142 "y": 22
2143 },
2144 {
2145 "x": "2012-07-01 00:00:00",
2146 "y": 22.4
2147 },
2148 {
2149 "x": "2012-08-01 00:00:00",
2150 "y": 24.6
2151 },
2152 {
2153 "x": "2012-09-01 00:00:00",
2154 "y": 21.7
2155 },
2156 {
2157 "x": "2012-10-01 00:00:00",
2158 "y": 19.2
2159 },
2160 {
2161 "x": "2012-11-01 00:00:00",
2162 "y": 17.3
2163 },
2164 {
2165 "x": "2012-12-01 00:00:00",
2166 "y": 18.4
2167 },
2168 {
2169 "x": "2013-01-01 00:00:00",
2170 "y": 20.3
2171 },
2172 {
2173 "x": "2013-02-01 00:00:00",
2174 "y": 16.2
2175 },
2176 {
2177 "x": "2013-03-01 00:00:00",
2178 "y": 20.8
2179 },
2180 {
2181 "x": "2013-04-01 00:00:00",
2182 "y": 21.4
2183 },
2184 {
2185 "x": "2013-05-01 00:00:00",
2186 "y": 21.7
2187 },
2188 {
2189 "x": "2013-06-01 00:00:00",
2190 "y": 22.7
2191 },
2192 {
2193 "x": "2013-07-01 00:00:00",
2194 "y": 25.5
2195 },
2196 {
2197 "x": "2013-08-01 00:00:00",
2198 "y": 22.7
2199 },
2200 {
2201 "x": "2013-09-01 00:00:00",
2202 "y": 22.7
2203 },
2204 {
2205 "x": "2013-10-01 00:00:00",
2206 "y": 21.3
2207 },
2208 {
2209 "x": "2013-11-01 00:00:00",
2210 "y": 19.3
2211 },
2212 {
2213 "x": "2013-12-01 00:00:00",
2214 "y": 20.6
2215 },
2216 {
2217 "x": "2014-11-01 00:00:00",
2218 "y": 20.8
2219 },
2220 {
2221 "x": "2014-12-01 00:00:00",
2222 "y": 18.8
2223 },
2224 {
2225 "x": "2015-01-01 00:00:00",
2226 "y": -90.2
2227 },
2228 {
2229 "x": "2017-03-01 00:00:00",
2230 "y": 24
2231 },
2232 {
2233 "x": "2017-04-01 00:00:00",
2234 "y": 20.4
2235 },
2236 {
2237 "x": "2017-05-01 00:00:00",
2238 "y": 22.7
2239 },
2240 {
2241 "x": "2017-06-01 00:00:00",
2242 "y": 24.4
2243 },
2244 {
2245 "x": "2017-07-01 00:00:00",
2246 "y": 24.7
2247 },
2248 {
2249 "x": "2017-08-01 00:00:00",
2250 "y": 23.7
2251 },
2252 {
2253 "x": "2017-09-01 00:00:00",
2254 "y": 22.8
2255 },
2256 {
2257 "x": "2017-10-01 00:00:00",
2258 "y": 21.8
2259 },
2260 {
2261 "x": "2017-11-01 00:00:00",
2262 "y": 17.9
2263 }
2264 ],
2265 "name": "Extraction",
2266 "unit": "°C",
2267 "hide": true
2268 },
2269 "Bureau_temperature": {
2270 "data": [
2271 {
2272 "x": "2012-08-01 00:00:00",
2273 "y": 26
2274 },
2275 {
2276 "x": "2012-09-01 00:00:00",
2277 "y": 26.3
2278 },
2279 {
2280 "x": "2012-10-01 00:00:00",
2281 "y": 24.8
2282 },
2283 {
2284 "x": "2012-11-01 00:00:00",
2285 "y": 24.4
2286 },
2287 {
2288 "x": "2012-12-01 00:00:00",
2289 "y": 23.6
2290 },
2291 {
2292 "x": "2013-01-01 00:00:00",
2293 "y": 23.9
2294 },
2295 {
2296 "x": "2013-02-01 00:00:00",
2297 "y": 18
2298 },
2299 {
2300 "x": "2013-03-01 00:00:00",
2301 "y": 23.2
2302 },
2303 {
2304 "x": "2013-04-01 00:00:00",
2305 "y": 22.6
2306 },
2307 {
2308 "x": "2013-05-01 00:00:00",
2309 "y": 22.7
2310 },
2311 {
2312 "x": "2013-06-01 00:00:00",
2313 "y": 22.6
2314 },
2315 {
2316 "x": "2013-07-01 00:00:00",
2317 "y": 26.1
2318 },
2319 {
2320 "x": "2013-08-01 00:00:00",
2321 "y": 23.9
2322 },
2323 {
2324 "x": "2013-09-01 00:00:00",
2325 "y": 23.5
2326 },
2327 {
2328 "x": "2013-10-01 00:00:00",
2329 "y": 22.2
2330 },
2331 {
2332 "x": "2013-11-01 00:00:00",
2333 "y": 23.7
2334 },
2335 {
2336 "x": "2013-12-01 00:00:00",
2337 "y": 23.9
2338 },
2339 {
2340 "x": "2014-01-01 00:00:00",
2341 "y": 23.5
2342 },
2343 {
2344 "x": "2014-02-01 00:00:00",
2345 "y": 22.7
2346 },
2347 {
2348 "x": "2014-03-01 00:00:00",
2349 "y": 22.8
2350 },
2351 {
2352 "x": "2014-04-01 00:00:00",
2353 "y": 22.9
2354 },
2355 {
2356 "x": "2014-05-01 00:00:00",
2357 "y": 23.6
2358 },
2359 {
2360 "x": "2014-06-01 00:00:00",
2361 "y": 27
2362 },
2363 {
2364 "x": "2014-10-01 00:00:00",
2365 "y": 24
2366 },
2367 {
2368 "x": "2014-11-01 00:00:00",
2369 "y": 22.5
2370 },
2371 {
2372 "x": "2014-12-01 00:00:00",
2373 "y": 20.9
2374 },
2375 {
2376 "x": "2015-01-01 00:00:00",
2377 "y": 23.5
2378 },
2379 {
2380 "x": "2015-02-01 00:00:00",
2381 "y": 23.7
2382 },
2383 {
2384 "x": "2015-03-01 00:00:00",
2385 "y": 22.4
2386 },
2387 {
2388 "x": "2015-04-01 00:00:00",
2389 "y": 23.3
2390 },
2391 {
2392 "x": "2015-05-01 00:00:00",
2393 "y": 23.2
2394 },
2395 {
2396 "x": "2015-06-01 00:00:00",
2397 "y": 26
2398 },
2399 {
2400 "x": "2015-07-01 00:00:00",
2401 "y": 26.3
2402 },
2403 {
2404 "x": "2015-08-01 00:00:00",
2405 "y": 24.3
2406 },
2407 {
2408 "x": "2015-09-01 00:00:00",
2409 "y": 23.7
2410 },
2411 {
2412 "x": "2015-10-01 00:00:00",
2413 "y": 22.6
2414 },
2415 {
2416 "x": "2015-11-01 00:00:00",
2417 "y": 22.5
2418 },
2419 {
2420 "x": "2015-12-01 00:00:00",
2421 "y": 22
2422 },
2423 {
2424 "x": "2016-01-01 00:00:00",
2425 "y": 22.8
2426 },
2427 {
2428 "x": "2016-02-01 00:00:00",
2429 "y": 20.8
2430 },
2431 {
2432 "x": "2016-03-01 00:00:00",
2433 "y": 22.8
2434 },
2435 {
2436 "x": "2016-04-01 00:00:00",
2437 "y": 22.1
2438 },
2439 {
2440 "x": "2016-05-01 00:00:00",
2441 "y": 23.1
2442 },
2443 {
2444 "x": "2016-06-01 00:00:00",
2445 "y": 24.4
2446 },
2447 {
2448 "x": "2016-07-01 00:00:00",
2449 "y": 26.3
2450 },
2451 {
2452 "x": "2016-08-01 00:00:00",
2453 "y": 26
2454 },
2455 {
2456 "x": "2016-09-01 00:00:00",
2457 "y": 24.9
2458 },
2459 {
2460 "x": "2017-03-01 00:00:00",
2461 "y": 22.9
2462 },
2463 {
2464 "x": "2017-04-01 00:00:00",
2465 "y": 23.9
2466 },
2467 {
2468 "x": "2017-05-01 00:00:00",
2469 "y": 24.6
2470 },
2471 {
2472 "x": "2017-06-01 00:00:00",
2473 "y": 25.2
2474 },
2475 {
2476 "x": "2017-07-01 00:00:00",
2477 "y": 33.8
2478 },
2479 {
2480 "x": "2017-08-01 00:00:00",
2481 "y": 38.6
2482 },
2483 {
2484 "x": "2017-09-01 00:00:00",
2485 "y": 35.3
2486 },
2487 {
2488 "x": "2017-10-01 00:00:00",
2489 "y": 35.2
2490 },
2491 {
2492 "x": "2017-11-01 00:00:00",
2493 "y": 36.2
2494 },
2495 {
2496 "x": "2017-12-01 00:00:00",
2497 "y": 24.3
2498 },
2499 {
2500 "x": "2018-01-01 00:00:00",
2501 "y": 23.6
2502 },
2503 {
2504 "x": "2018-02-01 00:00:00",
2505 "y": 24.6
2506 },
2507 {
2508 "x": "2018-03-01 00:00:00",
2509 "y": 22.7
2510 },
2511 {
2512 "x": "2018-04-01 00:00:00",
2513 "y": 24.8
2514 },
2515 {
2516 "x": "2018-05-01 00:00:00",
2517 "y": 26.1
2518 },
2519 {
2520 "x": "2018-06-01 00:00:00",
2521 "y": 26.5
2522 },
2523 {
2524 "x": "2018-07-01 00:00:00",
2525 "y": 30
2526 },
2527 {
2528 "x": "2018-08-01 00:00:00",
2529 "y": 27.5
2530 },
2531 {
2532 "x": "2019-03-01 00:00:00",
2533 "y": 25.3
2534 },
2535 {
2536 "x": "2019-04-01 00:00:00",
2537 "y": 26.1
2538 },
2539 {
2540 "x": "2019-05-01 00:00:00",
2541 "y": 25.2
2542 },
2543 {
2544 "x": "2019-06-01 00:00:00",
2545 "y": 27.3
2546 },
2547 {
2548 "x": "2019-07-01 00:00:00",
2549 "y": 30.2
2550 },
2551 {
2552 "x": "2019-08-01 00:00:00",
2553 "y": 25.6
2554 },
2555 {
2556 "x": "2020-03-01 00:00:00",
2557 "y": 36
2558 },
2559 {
2560 "x": "2020-04-01 00:00:00",
2561 "y": 35.2
2562 },
2563 {
2564 "x": "2020-05-01 00:00:00",
2565 "y": 37.4
2566 }
2567 ],
2568 "name": "Bureau",
2569 "unit": "°C",
2570 "hide": false
2571 },
2572 "Temp_Nord_temperature": {
2573 "data": [
2574 {
2575 "x": "2012-08-01 00:00:00",
2576 "y": 22.9
2577 },
2578 {
2579 "x": "2012-09-01 00:00:00",
2580 "y": 15.4
2581 },
2582 {
2583 "x": "2012-10-01 00:00:00",
2584 "y": 12.8
2585 },
2586 {
2587 "x": "2012-11-01 00:00:00",
2588 "y": 8.5
2589 },
2590 {
2591 "x": "2012-12-01 00:00:00",
2592 "y": 18.1
2593 },
2594 {
2595 "x": "2013-01-01 00:00:00",
2596 "y": 22
2597 },
2598 {
2599 "x": "2013-02-01 00:00:00",
2600 "y": 16.8
2601 },
2602 {
2603 "x": "2013-03-01 00:00:00",
2604 "y": 21.2
2605 },
2606 {
2607 "x": "2013-04-01 00:00:00",
2608 "y": 21.3
2609 },
2610 {
2611 "x": "2013-05-01 00:00:00",
2612 "y": 21.9
2613 },
2614 {
2615 "x": "2013-06-01 00:00:00",
2616 "y": 22.7
2617 },
2618 {
2619 "x": "2013-07-01 00:00:00",
2620 "y": 26.2
2621 },
2622 {
2623 "x": "2013-08-01 00:00:00",
2624 "y": 24.5
2625 },
2626 {
2627 "x": "2013-09-01 00:00:00",
2628 "y": 23.6
2629 },
2630 {
2631 "x": "2013-10-01 00:00:00",
2632 "y": 22
2633 },
2634 {
2635 "x": "2013-11-01 00:00:00",
2636 "y": 22.5
2637 },
2638 {
2639 "x": "2013-12-01 00:00:00",
2640 "y": 22.7
2641 },
2642 {
2643 "x": "2014-01-01 00:00:00",
2644 "y": 22.5
2645 },
2646 {
2647 "x": "2014-02-01 00:00:00",
2648 "y": 20.7
2649 },
2650 {
2651 "x": "2014-03-01 00:00:00",
2652 "y": 21.5
2653 },
2654 {
2655 "x": "2014-04-01 00:00:00",
2656 "y": 22.4
2657 },
2658 {
2659 "x": "2014-05-01 00:00:00",
2660 "y": 23.4
2661 },
2662 {
2663 "x": "2014-06-01 00:00:00",
2664 "y": 26.8
2665 },
2666 {
2667 "x": "2014-10-01 00:00:00",
2668 "y": 23.7
2669 },
2670 {
2671 "x": "2014-11-01 00:00:00",
2672 "y": 22.1
2673 },
2674 {
2675 "x": "2014-12-01 00:00:00",
2676 "y": 19.2
2677 }
2678 ],
2679 "name": "Temp_Nord",
2680 "unit": "°C",
2681 "hide": true
2682 },
2683 "Chambre_RDC_hygrometrie": {
2684 "data": [
2685 {
2686 "x": "2012-06-01 00:00:00",
2687 "y": 63
2688 },
2689 {
2690 "x": "2012-07-01 00:00:00",
2691 "y": 59
2692 },
2693 {
2694 "x": "2012-08-01 00:00:00",
2695 "y": 56
2696 },
2697 {
2698 "x": "2012-09-01 00:00:00",
2699 "y": 54
2700 },
2701 {
2702 "x": "2012-10-01 00:00:00",
2703 "y": 59
2704 },
2705 {
2706 "x": "2012-11-01 00:00:00",
2707 "y": 67
2708 },
2709 {
2710 "x": "2012-12-01 00:00:00",
2711 "y": 62
2712 },
2713 {
2714 "x": "2013-01-01 00:00:00",
2715 "y": 46
2716 },
2717 {
2718 "x": "2013-02-01 00:00:00",
2719 "y": 42
2720 },
2721 {
2722 "x": "2013-03-01 00:00:00",
2723 "y": 44
2724 },
2725 {
2726 "x": "2013-04-01 00:00:00",
2727 "y": 47
2728 },
2729 {
2730 "x": "2013-05-01 00:00:00",
2731 "y": 50
2732 },
2733 {
2734 "x": "2013-06-01 00:00:00",
2735 "y": 56
2736 },
2737 {
2738 "x": "2013-07-01 00:00:00",
2739 "y": 60
2740 },
2741 {
2742 "x": "2013-08-01 00:00:00",
2743 "y": 59
2744 },
2745 {
2746 "x": "2013-09-01 00:00:00",
2747 "y": 59
2748 },
2749 {
2750 "x": "2013-10-01 00:00:00",
2751 "y": 62
2752 },
2753 {
2754 "x": "2013-11-01 00:00:00",
2755 "y": 49
2756 },
2757 {
2758 "x": "2013-12-01 00:00:00",
2759 "y": 45
2760 },
2761 {
2762 "x": "2014-01-01 00:00:00",
2763 "y": 52
2764 },
2765 {
2766 "x": "2014-02-01 00:00:00",
2767 "y": 48
2768 },
2769 {
2770 "x": "2014-03-01 00:00:00",
2771 "y": 47
2772 },
2773 {
2774 "x": "2014-04-01 00:00:00",
2775 "y": 48
2776 },
2777 {
2778 "x": "2014-05-01 00:00:00",
2779 "y": 53
2780 },
2781 {
2782 "x": "2014-06-01 00:00:00",
2783 "y": 63
2784 },
2785 {
2786 "x": "2014-10-01 00:00:00",
2787 "y": 57
2788 },
2789 {
2790 "x": "2014-11-01 00:00:00",
2791 "y": 56
2792 },
2793 {
2794 "x": "2014-12-01 00:00:00",
2795 "y": 47
2796 },
2797 {
2798 "x": "2015-01-01 00:00:00",
2799 "y": 47
2800 },
2801 {
2802 "x": "2015-02-01 00:00:00",
2803 "y": 43
2804 },
2805 {
2806 "x": "2015-03-01 00:00:00",
2807 "y": 47
2808 },
2809 {
2810 "x": "2015-04-01 00:00:00",
2811 "y": 47
2812 },
2813 {
2814 "x": "2015-05-01 00:00:00",
2815 "y": 46
2816 },
2817 {
2818 "x": "2015-06-01 00:00:00",
2819 "y": 56
2820 },
2821 {
2822 "x": "2015-07-01 00:00:00",
2823 "y": 54
2824 },
2825 {
2826 "x": "2015-08-01 00:00:00",
2827 "y": 59
2828 },
2829 {
2830 "x": "2015-09-01 00:00:00",
2831 "y": 54
2832 },
2833 {
2834 "x": "2015-10-01 00:00:00",
2835 "y": 57
2836 },
2837 {
2838 "x": "2015-11-01 00:00:00",
2839 "y": 59
2840 },
2841 {
2842 "x": "2015-12-01 00:00:00",
2843 "y": 63
2844 },
2845 {
2846 "x": "2016-01-01 00:00:00",
2847 "y": 64
2848 },
2849 {
2850 "x": "2016-02-01 00:00:00",
2851 "y": 59
2852 },
2853 {
2854 "x": "2016-03-01 00:00:00",
2855 "y": 55
2856 },
2857 {
2858 "x": "2016-04-01 00:00:00",
2859 "y": 53
2860 },
2861 {
2862 "x": "2016-05-01 00:00:00",
2863 "y": 52
2864 },
2865 {
2866 "x": "2016-06-01 00:00:00",
2867 "y": 61
2868 },
2869 {
2870 "x": "2016-07-01 00:00:00",
2871 "y": 58
2872 },
2873 {
2874 "x": "2016-08-01 00:00:00",
2875 "y": 52
2876 },
2877 {
2878 "x": "2016-09-01 00:00:00",
2879 "y": 54
2880 },
2881 {
2882 "x": "2017-03-01 00:00:00",
2883 "y": 56
2884 },
2885 {
2886 "x": "2017-04-01 00:00:00",
2887 "y": 51
2888 },
2889 {
2890 "x": "2017-05-01 00:00:00",
2891 "y": 58
2892 },
2893 {
2894 "x": "2017-06-01 00:00:00",
2895 "y": 60
2896 },
2897 {
2898 "x": "2017-07-01 00:00:00",
2899 "y": 60
2900 },
2901 {
2902 "x": "2017-08-01 00:00:00",
2903 "y": 59
2904 },
2905 {
2906 "x": "2017-09-01 00:00:00",
2907 "y": 55
2908 },
2909 {
2910 "x": "2017-10-01 00:00:00",
2911 "y": 54
2912 },
2913 {
2914 "x": "2017-11-01 00:00:00",
2915 "y": 60
2916 },
2917 {
2918 "x": "2017-12-01 00:00:00",
2919 "y": 49
2920 },
2921 {
2922 "x": "2018-01-01 00:00:00",
2923 "y": 51
2924 },
2925 {
2926 "x": "2018-02-01 00:00:00",
2927 "y": 43
2928 },
2929 {
2930 "x": "2018-03-01 00:00:00",
2931 "y": 44
2932 },
2933 {
2934 "x": "2018-04-01 00:00:00",
2935 "y": 49
2936 },
2937 {
2938 "x": "2018-05-01 00:00:00",
2939 "y": 59
2940 },
2941 {
2942 "x": "2018-06-01 00:00:00",
2943 "y": 61
2944 },
2945 {
2946 "x": "2018-07-01 00:00:00",
2947 "y": 56
2948 },
2949 {
2950 "x": "2018-08-01 00:00:00",
2951 "y": 51
2952 },
2953 {
2954 "x": "2019-03-01 00:00:00",
2955 "y": 41
2956 },
2957 {
2958 "x": "2019-04-01 00:00:00",
2959 "y": 43
2960 },
2961 {
2962 "x": "2019-05-01 00:00:00",
2963 "y": 50
2964 },
2965 {
2966 "x": "2019-06-01 00:00:00",
2967 "y": 57
2968 },
2969 {
2970 "x": "2019-07-01 00:00:00",
2971 "y": 52
2972 },
2973 {
2974 "x": "2019-08-01 00:00:00",
2975 "y": 48
2976 },
2977 {
2978 "x": "2020-03-01 00:00:00",
2979 "y": 51
2980 }
2981 ],
2982 "name": "Chambre_RDC",
2983 "unit": "%",
2984 "hide": false
2985 },
2986 "Exterieure_hygrometrie": {
2987 "data": [
2988 {
2989 "x": "2012-06-01 00:00:00",
2990 "y": 63
2991 },
2992 {
2993 "x": "2012-07-01 00:00:00",
2994 "y": 59
2995 },
2996 {
2997 "x": "2012-08-01 00:00:00",
2998 "y": 50
2999 },
3000 {
3001 "x": "2012-09-01 00:00:00",
3002 "y": 49
3003 },
3004 {
3005 "x": "2012-10-01 00:00:00",
3006 "y": 53
3007 },
3008 {
3009 "x": "2012-11-01 00:00:00",
3010 "y": 69
3011 },
3012 {
3013 "x": "2012-12-01 00:00:00",
3014 "y": 82
3015 },
3016 {
3017 "x": "2013-01-01 00:00:00",
3018 "y": 85
3019 },
3020 {
3021 "x": "2013-02-01 00:00:00",
3022 "y": 80
3023 },
3024 {
3025 "x": "2013-03-01 00:00:00",
3026 "y": 72
3027 },
3028 {
3029 "x": "2013-04-01 00:00:00",
3030 "y": 67
3031 },
3032 {
3033 "x": "2013-05-01 00:00:00",
3034 "y": 74
3035 },
3036 {
3037 "x": "2013-06-01 00:00:00",
3038 "y": 70
3039 },
3040 {
3041 "x": "2013-07-01 00:00:00",
3042 "y": 40
3043 },
3044 {
3045 "x": "2013-10-01 00:00:00",
3046 "y": 75
3047 },
3048 {
3049 "x": "2013-11-01 00:00:00",
3050 "y": 84
3051 },
3052 {
3053 "x": "2013-12-01 00:00:00",
3054 "y": 74
3055 },
3056 {
3057 "x": "2014-01-01 00:00:00",
3058 "y": 79
3059 },
3060 {
3061 "x": "2014-02-01 00:00:00",
3062 "y": 74
3063 },
3064 {
3065 "x": "2014-03-01 00:00:00",
3066 "y": 65
3067 },
3068 {
3069 "x": "2014-04-01 00:00:00",
3070 "y": 66
3071 },
3072 {
3073 "x": "2014-05-01 00:00:00",
3074 "y": 67
3075 },
3076 {
3077 "x": "2014-06-01 00:00:00",
3078 "y": 68
3079 },
3080 {
3081 "x": "2014-10-01 00:00:00",
3082 "y": 76
3083 },
3084 {
3085 "x": "2014-11-01 00:00:00",
3086 "y": 79
3087 },
3088 {
3089 "x": "2014-12-01 00:00:00",
3090 "y": 82
3091 },
3092 {
3093 "x": "2015-01-01 00:00:00",
3094 "y": 81
3095 },
3096 {
3097 "x": "2015-02-01 00:00:00",
3098 "y": 70
3099 },
3100 {
3101 "x": "2015-03-01 00:00:00",
3102 "y": 69
3103 },
3104 {
3105 "x": "2015-04-01 00:00:00",
3106 "y": 60
3107 },
3108 {
3109 "x": "2015-05-01 00:00:00",
3110 "y": 82
3111 },
3112 {
3113 "x": "2015-06-01 00:00:00",
3114 "y": 68
3115 },
3116 {
3117 "x": "2015-07-01 00:00:00",
3118 "y": 55
3119 },
3120 {
3121 "x": "2015-08-01 00:00:00",
3122 "y": 59
3123 },
3124 {
3125 "x": "2015-09-01 00:00:00",
3126 "y": 65
3127 },
3128 {
3129 "x": "2015-10-01 00:00:00",
3130 "y": 74
3131 },
3132 {
3133 "x": "2015-11-01 00:00:00",
3134 "y": 75
3135 },
3136 {
3137 "x": "2015-12-01 00:00:00",
3138 "y": 69
3139 },
3140 {
3141 "x": "2016-01-01 00:00:00",
3142 "y": 78
3143 },
3144 {
3145 "x": "2016-02-01 00:00:00",
3146 "y": 76
3147 },
3148 {
3149 "x": "2016-03-01 00:00:00",
3150 "y": 67
3151 },
3152 {
3153 "x": "2016-04-01 00:00:00",
3154 "y": 67
3155 },
3156 {
3157 "x": "2016-05-01 00:00:00",
3158 "y": 64
3159 },
3160 {
3161 "x": "2016-06-01 00:00:00",
3162 "y": 68
3163 },
3164 {
3165 "x": "2016-07-01 00:00:00",
3166 "y": 54
3167 },
3168 {
3169 "x": "2016-08-01 00:00:00",
3170 "y": 48
3171 },
3172 {
3173 "x": "2017-03-01 00:00:00",
3174 "y": 49
3175 },
3176 {
3177 "x": "2017-04-01 00:00:00",
3178 "y": 46
3179 },
3180 {
3181 "x": "2017-05-01 00:00:00",
3182 "y": 48
3183 },
3184 {
3185 "x": "2017-06-01 00:00:00",
3186 "y": 41
3187 },
3188 {
3189 "x": "2017-07-01 00:00:00",
3190 "y": 48
3191 },
3192 {
3193 "x": "2017-08-01 00:00:00",
3194 "y": 62
3195 },
3196 {
3197 "x": "2017-09-01 00:00:00",
3198 "y": 54
3199 },
3200 {
3201 "x": "2017-10-01 00:00:00",
3202 "y": 56
3203 },
3204 {
3205 "x": "2017-11-01 00:00:00",
3206 "y": 59
3207 },
3208 {
3209 "x": "2017-12-01 00:00:00",
3210 "y": 62
3211 },
3212 {
3213 "x": "2018-03-01 00:00:00",
3214 "y": 50
3215 },
3216 {
3217 "x": "2018-04-01 00:00:00",
3218 "y": 41
3219 },
3220 {
3221 "x": "2018-05-01 00:00:00",
3222 "y": 61
3223 },
3224 {
3225 "x": "2018-06-01 00:00:00",
3226 "y": 43
3227 },
3228 {
3229 "x": "2018-07-01 00:00:00",
3230 "y": 35
3231 },
3232 {
3233 "x": "2018-08-01 00:00:00",
3234 "y": 37
3235 }
3236 ],
3237 "name": "Exterieure",
3238 "unit": "%",
3239 "hide": false
3240 },
3241 "Sejour_hygrometrie": {
3242 "data": [
3243 {
3244 "x": "2012-06-01 00:00:00",
3245 "y": 60
3246 },
3247 {
3248 "x": "2012-07-01 00:00:00",
3249 "y": 57
3250 },
3251 {
3252 "x": "2012-08-01 00:00:00",
3253 "y": 54
3254 },
3255 {
3256 "x": "2012-09-01 00:00:00",
3257 "y": 52
3258 },
3259 {
3260 "x": "2012-10-01 00:00:00",
3261 "y": 55
3262 },
3263 {
3264 "x": "2012-11-01 00:00:00",
3265 "y": 63
3266 },
3267 {
3268 "x": "2012-12-01 00:00:00",
3269 "y": 61
3270 },
3271 {
3272 "x": "2013-01-01 00:00:00",
3273 "y": 45
3274 },
3275 {
3276 "x": "2013-02-01 00:00:00",
3277 "y": 41
3278 },
3279 {
3280 "x": "2013-03-01 00:00:00",
3281 "y": 43
3282 },
3283 {
3284 "x": "2013-04-01 00:00:00",
3285 "y": 45
3286 },
3287 {
3288 "x": "2013-05-01 00:00:00",
3289 "y": 52
3290 },
3291 {
3292 "x": "2013-06-01 00:00:00",
3293 "y": 57
3294 },
3295 {
3296 "x": "2013-07-01 00:00:00",
3297 "y": 60
3298 },
3299 {
3300 "x": "2013-08-01 00:00:00",
3301 "y": 58
3302 },
3303 {
3304 "x": "2013-09-01 00:00:00",
3305 "y": 56
3306 },
3307 {
3308 "x": "2013-10-01 00:00:00",
3309 "y": 60
3310 },
3311 {
3312 "x": "2013-11-01 00:00:00",
3313 "y": 48
3314 },
3315 {
3316 "x": "2013-12-01 00:00:00",
3317 "y": 44
3318 },
3319 {
3320 "x": "2014-01-01 00:00:00",
3321 "y": 51
3322 },
3323 {
3324 "x": "2014-02-01 00:00:00",
3325 "y": 46
3326 },
3327 {
3328 "x": "2014-03-01 00:00:00",
3329 "y": 44
3330 },
3331 {
3332 "x": "2014-04-01 00:00:00",
3333 "y": 45
3334 },
3335 {
3336 "x": "2014-05-01 00:00:00",
3337 "y": 49
3338 },
3339 {
3340 "x": "2014-06-01 00:00:00",
3341 "y": 61
3342 },
3343 {
3344 "x": "2014-10-01 00:00:00",
3345 "y": 54
3346 },
3347 {
3348 "x": "2014-11-01 00:00:00",
3349 "y": 52
3350 },
3351 {
3352 "x": "2014-12-01 00:00:00",
3353 "y": 46
3354 },
3355 {
3356 "x": "2015-01-01 00:00:00",
3357 "y": 46
3358 },
3359 {
3360 "x": "2015-02-01 00:00:00",
3361 "y": 41
3362 },
3363 {
3364 "x": "2015-03-01 00:00:00",
3365 "y": 45
3366 },
3367 {
3368 "x": "2015-04-01 00:00:00",
3369 "y": 44
3370 },
3371 {
3372 "x": "2015-05-01 00:00:00",
3373 "y": 47
3374 },
3375 {
3376 "x": "2015-06-01 00:00:00",
3377 "y": 54
3378 },
3379 {
3380 "x": "2015-07-01 00:00:00",
3381 "y": 53
3382 },
3383 {
3384 "x": "2015-08-01 00:00:00",
3385 "y": 55
3386 },
3387 {
3388 "x": "2015-09-01 00:00:00",
3389 "y": 49
3390 },
3391 {
3392 "x": "2015-10-01 00:00:00",
3393 "y": 54
3394 },
3395 {
3396 "x": "2015-11-01 00:00:00",
3397 "y": 55
3398 },
3399 {
3400 "x": "2015-12-01 00:00:00",
3401 "y": 59
3402 },
3403 {
3404 "x": "2016-01-01 00:00:00",
3405 "y": 63
3406 },
3407 {
3408 "x": "2016-02-01 00:00:00",
3409 "y": 60
3410 },
3411 {
3412 "x": "2016-03-01 00:00:00",
3413 "y": 52
3414 },
3415 {
3416 "x": "2016-04-01 00:00:00",
3417 "y": 50
3418 },
3419 {
3420 "x": "2016-05-01 00:00:00",
3421 "y": 48
3422 },
3423 {
3424 "x": "2016-06-01 00:00:00",
3425 "y": 57
3426 },
3427 {
3428 "x": "2016-07-01 00:00:00",
3429 "y": 55
3430 },
3431 {
3432 "x": "2016-08-01 00:00:00",
3433 "y": 49
3434 },
3435 {
3436 "x": "2016-09-01 00:00:00",
3437 "y": 51
3438 },
3439 {
3440 "x": "2017-03-01 00:00:00",
3441 "y": 51
3442 },
3443 {
3444 "x": "2017-04-01 00:00:00",
3445 "y": 47
3446 },
3447 {
3448 "x": "2017-05-01 00:00:00",
3449 "y": 54
3450 },
3451 {
3452 "x": "2017-06-01 00:00:00",
3453 "y": 57
3454 },
3455 {
3456 "x": "2017-07-01 00:00:00",
3457 "y": 57
3458 },
3459 {
3460 "x": "2017-08-01 00:00:00",
3461 "y": 57
3462 },
3463 {
3464 "x": "2017-09-01 00:00:00",
3465 "y": 52
3466 },
3467 {
3468 "x": "2017-10-01 00:00:00",
3469 "y": 50
3470 },
3471 {
3472 "x": "2017-11-01 00:00:00",
3473 "y": 56
3474 },
3475 {
3476 "x": "2017-12-01 00:00:00",
3477 "y": 47
3478 },
3479 {
3480 "x": "2018-01-01 00:00:00",
3481 "y": 50
3482 },
3483 {
3484 "x": "2018-02-01 00:00:00",
3485 "y": 41
3486 },
3487 {
3488 "x": "2018-03-01 00:00:00",
3489 "y": 41
3490 },
3491 {
3492 "x": "2018-04-01 00:00:00",
3493 "y": 46
3494 },
3495 {
3496 "x": "2018-05-01 00:00:00",
3497 "y": 56
3498 },
3499 {
3500 "x": "2018-06-01 00:00:00",
3501 "y": 58
3502 },
3503 {
3504 "x": "2018-07-01 00:00:00",
3505 "y": 54
3506 },
3507 {
3508 "x": "2018-08-01 00:00:00",
3509 "y": 48
3510 },
3511 {
3512 "x": "2019-03-01 00:00:00",
3513 "y": 36
3514 },
3515 {
3516 "x": "2019-04-01 00:00:00",
3517 "y": 39
3518 },
3519 {
3520 "x": "2019-05-01 00:00:00",
3521 "y": 46
3522 },
3523 {
3524 "x": "2019-06-01 00:00:00",
3525 "y": 54
3526 },
3527 {
3528 "x": "2019-07-01 00:00:00",
3529 "y": 49
3530 },
3531 {
3532 "x": "2019-08-01 00:00:00",
3533 "y": 45
3534 },
3535 {
3536 "x": "2020-03-01 00:00:00",
3537 "y": 45
3538 }
3539 ],
3540 "name": "Sejour",
3541 "unit": "%",
3542 "hide": false
3543 },
3544 "Soufflage_hygrometrie": {
3545 "data": [
3546 {
3547 "x": "2012-06-01 00:00:00",
3548 "y": 64
3549 },
3550 {
3551 "x": "2012-07-01 00:00:00",
3552 "y": 59
3553 },
3554 {
3555 "x": "2012-08-01 00:00:00",
3556 "y": 58
3557 },
3558 {
3559 "x": "2012-09-01 00:00:00",
3560 "y": 60
3561 },
3562 {
3563 "x": "2012-10-01 00:00:00",
3564 "y": 71
3565 },
3566 {
3567 "x": "2012-11-01 00:00:00",
3568 "y": 84
3569 },
3570 {
3571 "x": "2012-12-01 00:00:00",
3572 "y": 66
3573 },
3574 {
3575 "x": "2013-01-01 00:00:00",
3576 "y": 40
3577 },
3578 {
3579 "x": "2013-02-01 00:00:00",
3580 "y": 41
3581 },
3582 {
3583 "x": "2013-03-01 00:00:00",
3584 "y": 38
3585 },
3586 {
3587 "x": "2013-04-01 00:00:00",
3588 "y": 39
3589 },
3590 {
3591 "x": "2013-05-01 00:00:00",
3592 "y": 43
3593 },
3594 {
3595 "x": "2013-06-01 00:00:00",
3596 "y": 50
3597 },
3598 {
3599 "x": "2013-07-01 00:00:00",
3600 "y": 57
3601 },
3602 {
3603 "x": "2013-08-01 00:00:00",
3604 "y": 58
3605 },
3606 {
3607 "x": "2013-09-01 00:00:00",
3608 "y": 55
3609 },
3610 {
3611 "x": "2013-10-01 00:00:00",
3612 "y": 57
3613 },
3614 {
3615 "x": "2013-11-01 00:00:00",
3616 "y": 47
3617 },
3618 {
3619 "x": "2013-12-01 00:00:00",
3620 "y": 40
3621 },
3622 {
3623 "x": "2014-01-01 00:00:00",
3624 "y": 48
3625 },
3626 {
3627 "x": "2014-02-01 00:00:00",
3628 "y": 40
3629 },
3630 {
3631 "x": "2014-03-01 00:00:00",
3632 "y": 37
3633 },
3634 {
3635 "x": "2014-04-01 00:00:00",
3636 "y": 45
3637 },
3638 {
3639 "x": "2014-11-01 00:00:00",
3640 "y": 47
3641 },
3642 {
3643 "x": "2014-12-01 00:00:00",
3644 "y": 82
3645 },
3646 {
3647 "x": "2015-01-01 00:00:00",
3648 "y": 84
3649 },
3650 {
3651 "x": "2015-02-01 00:00:00",
3652 "y": 78
3653 },
3654 {
3655 "x": "2015-03-01 00:00:00",
3656 "y": 72
3657 },
3658 {
3659 "x": "2015-04-01 00:00:00",
3660 "y": 54
3661 },
3662 {
3663 "x": "2015-05-01 00:00:00",
3664 "y": 75
3665 },
3666 {
3667 "x": "2015-06-01 00:00:00",
3668 "y": 72
3669 },
3670 {
3671 "x": "2015-07-01 00:00:00",
3672 "y": 60
3673 },
3674 {
3675 "x": "2015-08-01 00:00:00",
3676 "y": 61
3677 },
3678 {
3679 "x": "2015-09-01 00:00:00",
3680 "y": 61
3681 },
3682 {
3683 "x": "2015-10-01 00:00:00",
3684 "y": 80
3685 },
3686 {
3687 "x": "2015-11-01 00:00:00",
3688 "y": 88
3689 },
3690 {
3691 "x": "2015-12-01 00:00:00",
3692 "y": 90
3693 },
3694 {
3695 "x": "2016-01-01 00:00:00",
3696 "y": 96
3697 },
3698 {
3699 "x": "2016-02-01 00:00:00",
3700 "y": 97
3701 },
3702 {
3703 "x": "2017-03-01 00:00:00",
3704 "y": 68
3705 },
3706 {
3707 "x": "2017-04-01 00:00:00",
3708 "y": 64
3709 },
3710 {
3711 "x": "2017-05-01 00:00:00",
3712 "y": 71
3713 },
3714 {
3715 "x": "2017-06-01 00:00:00",
3716 "y": 73
3717 },
3718 {
3719 "x": "2017-07-01 00:00:00",
3720 "y": 74
3721 },
3722 {
3723 "x": "2017-08-01 00:00:00",
3724 "y": 76
3725 },
3726 {
3727 "x": "2017-09-01 00:00:00",
3728 "y": 72
3729 },
3730 {
3731 "x": "2017-10-01 00:00:00",
3732 "y": 72
3733 },
3734 {
3735 "x": "2017-11-01 00:00:00",
3736 "y": 82
3737 },
3738 {
3739 "x": "2017-12-01 00:00:00",
3740 "y": 67
3741 },
3742 {
3743 "x": "2018-01-01 00:00:00",
3744 "y": 72
3745 },
3746 {
3747 "x": "2018-02-01 00:00:00",
3748 "y": 57
3749 },
3750 {
3751 "x": "2018-03-01 00:00:00",
3752 "y": 59
3753 }
3754 ],
3755 "name": "Soufflage",
3756 "unit": "%",
3757 "hide": true
3758 },
3759 "Mezzanine_hygrometrie": {
3760 "data": [
3761 {
3762 "x": "2012-06-01 00:00:00",
3763 "y": 59
3764 },
3765 {
3766 "x": "2012-07-01 00:00:00",
3767 "y": 56
3768 },
3769 {
3770 "x": "2012-08-01 00:00:00",
3771 "y": 52
3772 },
3773 {
3774 "x": "2012-09-01 00:00:00",
3775 "y": 52
3776 },
3777 {
3778 "x": "2012-10-01 00:00:00",
3779 "y": 56
3780 },
3781 {
3782 "x": "2012-11-01 00:00:00",
3783 "y": 64
3784 },
3785 {
3786 "x": "2012-12-01 00:00:00",
3787 "y": 64
3788 },
3789 {
3790 "x": "2013-01-01 00:00:00",
3791 "y": 49
3792 },
3793 {
3794 "x": "2013-02-01 00:00:00",
3795 "y": 43
3796 },
3797 {
3798 "x": "2013-03-01 00:00:00",
3799 "y": 45
3800 },
3801 {
3802 "x": "2013-04-01 00:00:00",
3803 "y": 46
3804 },
3805 {
3806 "x": "2013-05-01 00:00:00",
3807 "y": 53
3808 },
3809 {
3810 "x": "2013-06-01 00:00:00",
3811 "y": 57
3812 },
3813 {
3814 "x": "2013-07-01 00:00:00",
3815 "y": 58
3816 },
3817 {
3818 "x": "2013-08-01 00:00:00",
3819 "y": 57
3820 },
3821 {
3822 "x": "2013-09-01 00:00:00",
3823 "y": 57
3824 },
3825 {
3826 "x": "2013-10-01 00:00:00",
3827 "y": 61
3828 },
3829 {
3830 "x": "2013-11-01 00:00:00",
3831 "y": 51
3832 },
3833 {
3834 "x": "2013-12-01 00:00:00",
3835 "y": 45
3836 },
3837 {
3838 "x": "2014-01-01 00:00:00",
3839 "y": 54
3840 },
3841 {
3842 "x": "2014-02-01 00:00:00",
3843 "y": 48
3844 },
3845 {
3846 "x": "2014-03-01 00:00:00",
3847 "y": 45
3848 },
3849 {
3850 "x": "2014-04-01 00:00:00",
3851 "y": 46
3852 },
3853 {
3854 "x": "2014-05-01 00:00:00",
3855 "y": 50
3856 },
3857 {
3858 "x": "2014-06-01 00:00:00",
3859 "y": 60
3860 },
3861 {
3862 "x": "2015-09-01 00:00:00",
3863 "y": 52
3864 },
3865 {
3866 "x": "2015-10-01 00:00:00",
3867 "y": 55
3868 },
3869 {
3870 "x": "2015-11-01 00:00:00",
3871 "y": 57
3872 },
3873 {
3874 "x": "2015-12-01 00:00:00",
3875 "y": 60
3876 },
3877 {
3878 "x": "2016-01-01 00:00:00",
3879 "y": 66
3880 },
3881 {
3882 "x": "2016-02-01 00:00:00",
3883 "y": 65
3884 },
3885 {
3886 "x": "2016-03-01 00:00:00",
3887 "y": 55
3888 },
3889 {
3890 "x": "2016-04-01 00:00:00",
3891 "y": 51
3892 },
3893 {
3894 "x": "2016-05-01 00:00:00",
3895 "y": 50
3896 },
3897 {
3898 "x": "2016-06-01 00:00:00",
3899 "y": 58
3900 },
3901 {
3902 "x": "2016-07-01 00:00:00",
3903 "y": 55
3904 },
3905 {
3906 "x": "2016-08-01 00:00:00",
3907 "y": 49
3908 },
3909 {
3910 "x": "2016-09-01 00:00:00",
3911 "y": 52
3912 },
3913 {
3914 "x": "2017-03-01 00:00:00",
3915 "y": 54
3916 },
3917 {
3918 "x": "2017-04-01 00:00:00",
3919 "y": 50
3920 },
3921 {
3922 "x": "2017-05-01 00:00:00",
3923 "y": 55
3924 },
3925 {
3926 "x": "2017-06-01 00:00:00",
3927 "y": 55
3928 },
3929 {
3930 "x": "2017-07-01 00:00:00",
3931 "y": 57
3932 },
3933 {
3934 "x": "2017-08-01 00:00:00",
3935 "y": 56
3936 },
3937 {
3938 "x": "2017-09-01 00:00:00",
3939 "y": 54
3940 },
3941 {
3942 "x": "2019-03-01 00:00:00",
3943 "y": 39
3944 },
3945 {
3946 "x": "2019-04-01 00:00:00",
3947 "y": 40
3948 },
3949 {
3950 "x": "2019-05-01 00:00:00",
3951 "y": 48
3952 },
3953 {
3954 "x": "2019-06-01 00:00:00",
3955 "y": 53
3956 },
3957 {
3958 "x": "2019-07-01 00:00:00",
3959 "y": 48
3960 },
3961 {
3962 "x": "2019-08-01 00:00:00",
3963 "y": 46
3964 }
3965 ],
3966 "name": "Mezzanine",
3967 "unit": "%",
3968 "hide": false
3969 },
3970 "Extraction_hygrometrie": {
3971 "data": [
3972 {
3973 "x": "2012-06-01 00:00:00",
3974 "y": 64
3975 },
3976 {
3977 "x": "2012-07-01 00:00:00",
3978 "y": 60
3979 },
3980 {
3981 "x": "2012-08-01 00:00:00",
3982 "y": 56
3983 },
3984 {
3985 "x": "2012-09-01 00:00:00",
3986 "y": 59
3987 },
3988 {
3989 "x": "2012-10-01 00:00:00",
3990 "y": 65
3991 },
3992 {
3993 "x": "2012-11-01 00:00:00",
3994 "y": 77
3995 },
3996 {
3997 "x": "2012-12-01 00:00:00",
3998 "y": 62
3999 },
4000 {
4001 "x": "2013-01-01 00:00:00",
4002 "y": 43
4003 },
4004 {
4005 "x": "2013-02-01 00:00:00",
4006 "y": 40
4007 },
4008 {
4009 "x": "2013-03-01 00:00:00",
4010 "y": 40
4011 },
4012 {
4013 "x": "2013-04-01 00:00:00",
4014 "y": 42
4015 },
4016 {
4017 "x": "2013-05-01 00:00:00",
4018 "y": 45
4019 },
4020 {
4021 "x": "2013-06-01 00:00:00",
4022 "y": 52
4023 },
4024 {
4025 "x": "2013-07-01 00:00:00",
4026 "y": 57
4027 },
4028 {
4029 "x": "2013-08-01 00:00:00",
4030 "y": 57
4031 },
4032 {
4033 "x": "2013-09-01 00:00:00",
4034 "y": 55
4035 },
4036 {
4037 "x": "2013-10-01 00:00:00",
4038 "y": 58
4039 },
4040 {
4041 "x": "2013-11-01 00:00:00",
4042 "y": 47
4043 },
4044 {
4045 "x": "2013-12-01 00:00:00",
4046 "y": 39
4047 },
4048 {
4049 "x": "2014-11-01 00:00:00",
4050 "y": 55
4051 },
4052 {
4053 "x": "2014-12-01 00:00:00",
4054 "y": 47
4055 },
4056 {
4057 "x": "2015-01-01 00:00:00",
4058 "y": 89
4059 },
4060 {
4061 "x": "2017-03-01 00:00:00",
4062 "y": 50
4063 },
4064 {
4065 "x": "2017-04-01 00:00:00",
4066 "y": 50
4067 },
4068 {
4069 "x": "2017-05-01 00:00:00",
4070 "y": 56
4071 },
4072 {
4073 "x": "2017-06-01 00:00:00",
4074 "y": 59
4075 },
4076 {
4077 "x": "2017-07-01 00:00:00",
4078 "y": 58
4079 },
4080 {
4081 "x": "2017-08-01 00:00:00",
4082 "y": 60
4083 },
4084 {
4085 "x": "2017-09-01 00:00:00",
4086 "y": 55
4087 },
4088 {
4089 "x": "2017-10-01 00:00:00",
4090 "y": 54
4091 },
4092 {
4093 "x": "2017-11-01 00:00:00",
4094 "y": 57
4095 }
4096 ],
4097 "name": "Extraction",
4098 "unit": "%",
4099 "hide": true
4100 }
4101}
diff --git a/modules/private/websites/papa/maison_bbc_static/favicon.ico b/modules/private/websites/papa/maison_bbc_static/favicon.ico
deleted file mode 100644
index 03990f9..0000000
--- a/modules/private/websites/papa/maison_bbc_static/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/modules/private/websites/papa/maison_bbc_static/index.html b/modules/private/websites/papa/maison_bbc_static/index.html
deleted file mode 100644
index 78c318c..0000000
--- a/modules/private/websites/papa/maison_bbc_static/index.html
+++ /dev/null
@@ -1,164 +0,0 @@
1<!doctype html>
2<html>
3 <head>
4 <title>Pause</title>
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6 <script src="https://assets.immae.eu/jquery/3.5.1/jquery.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
7 <script src="https://assets.immae.eu/chart.js/2.9.3/Chart.bundle.min.js" integrity="sha256-TQq84xX6vkwR0Qs1qH5ADkP+MvH0W+9E7TdHJsoIQiM=" crossorigin="anonymous"></script>
8 <script src="https://assets.immae.eu/hammerjs/2.0.8/hammer.min.js" integrity="sha256-eVNjHw5UeU0jUqPPpZHAkU1z4U+QFBBY488WvueTm88=" crossorigin="anonymous"></script>
9 <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>
10 <style>
11 body {
12 padding-left: 5px;
13 padding-right: 5px;
14 text-align: center;
15 margin: auto;
16 font: 20px Helvetica, sans-serif;
17 color: #333;
18 }
19 h1 {
20 margin: 0px;
21 font-size: 40px;
22 }
23 article {
24 display: block;
25 max-width: 850px;
26 margin: 0 auto;
27 padding-top: 30px;
28 }
29 article + article {
30 border-top: 1px solid lightgrey;
31 }
32 article div {
33 text-align: center;
34 }
35 a {
36 color: #dc8100;
37 text-decoration: none;
38 }
39 a:hover {
40 color: #333;
41 }
42 button.selected {
43 background-color: lightgreen;
44 background-opacity: 40%;
45 }
46 img.banner {
47 max-width: 100%;
48 }
49 .button-row {
50 padding: 10px;
51 }
52 </style>
53 </head>
54 <body>
55 <article>
56 <h1>Site web en pause&nbsp;!</h1>
57 <div>
58 <img class="banner" src="/lamaison.png" />
59 <p>Le site est actuellement en pause.</p>
60 </div>
61 <h1>Données historiques</h1>
62 <div class="button-row">
63 <button class="chart-choice" data-type="kW" id="mean_consumption">Consommation moyenne</button>
64 <button class="chart-choice" data-type="kWh" id="total_consumption">Consommation totale</button>
65 <button class="chart-choice" data-type="%" id="hygrometrie">Hygrométrie</button>
66 <button class="chart-choice" data-type="°C" id="temperature">Température</button>
67 </div>
68 <canvas id="chart" width="400" height="400"></canvas>
69 </article>
70 <script>
71 $(".chart-choice").click(function() {
72 drawData($(this).data("type"));
73 $(".chart-choice").removeClass("selected");
74 $(this).addClass("selected");
75 });
76 var allData = {};
77 var myChart;
78 var colors = [
79 "#DDDF0D", "#7798BF", "#55BF3B", "#DF5353", "#aaeeee",
80 "#ff0066", "#eeaaee", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"
81 ];
82
83 $.ajax({
84 type: "GET",
85 url: "/data.json",
86 dataType: "json",
87 success: function(data) {
88 allData = data;
89 $(".chart-choice")[3].click();
90 },
91 });
92
93 var getData = function(key, colorIndex) {
94 var d = allData[key];
95 return {
96 borderColor: colors[colorIndex],
97 hidden: d.hide,
98 fill: false,
99 label: d.name + " (" + d.unit + ")",
100 data: d.data.map(function(value) {
101 return {
102 "x": new Date(value.x),
103 "y": Math.max(0,value.y),
104 };
105 }),
106 };
107 };
108
109 var getDataByType = function(type) {
110 var colorIndex = 0;
111 return Object.keys(allData)
112 .filter(function (key) { return allData[key].unit === type; })
113 .map(function (key) { return getData(key, colorIndex++); });
114 };
115
116 var drawData = function (type) {
117 $('#chart').replaceWith('<canvas id="chart" width="400" height="400"></canvas>');
118 var ctx = document.getElementById('chart').getContext('2d');
119 myChart = new Chart(ctx, {
120 type: 'line',
121 options: {
122 scales: {
123 xAxes: [
124 {
125 type: "time",
126 time: {
127 displayFormats: {
128 'millisecond': 'YYYY-MM',
129 'second': 'YYYY-MM',
130 'minute': 'YYYY-MM',
131 'hour': 'YYYY-MM',
132 'day': 'YYYY-MM',
133 'week': 'YYYY-MM',
134 'month': 'YYYY-MM',
135 'quarter': 'YYYY-MM',
136 'year': 'YYYY-MM',
137 }
138 }
139 }
140 ],
141 yAxes: [
142 {
143 ticks: {
144 callback: function(value, index, values) { return value + " " + type; }
145 }
146 }
147 ],
148 },
149 plugins: {
150 zoom: {
151 pan: { enabled: true, mode: "x" },
152 zoom: { enabled: true, mode: "x" },
153 }
154 },
155 },
156 data: {
157 datasets: getDataByType(type),
158 }
159 });
160 }
161 </script>
162 </body>
163</html>
164
diff --git a/modules/private/websites/papa/maison_bbc_static/lamaison.png b/modules/private/websites/papa/maison_bbc_static/lamaison.png
deleted file mode 100644
index dad243c..0000000
--- a/modules/private/websites/papa/maison_bbc_static/lamaison.png
+++ /dev/null
Binary files differ
diff --git a/modules/private/websites/papa/surveillance.nix b/modules/private/websites/papa/surveillance.nix
deleted file mode 100644
index a8e5149..0000000
--- a/modules/private/websites/papa/surveillance.nix
+++ /dev/null
@@ -1,50 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.papa.surveillance;
4 varDir = "/var/lib/ftp/papa";
5 apacheUser = config.services.httpd.Prod.user;
6in {
7 options.myServices.websites.papa.surveillance.enable = lib.mkEnableOption "enable Papa surveillance's website";
8
9 config = lib.mkIf cfg.enable {
10 security.acme.certs."ftp".extraDomains."surveillance.maison.bbc.bouya.org" = null;
11
12 services.cron = {
13 systemCronJobs = let
14 script = pkgs.writeScript "cleanup-papa" ''
15 #!${pkgs.stdenv.shell}
16 d=$(date -d "7 days ago" +%Y%m%d)
17 for i in /var/lib/ftp/papa/*/20[0-9][0-9][0-9][0-9][0-9][0-9]; do
18 if [ "$d" -gt $(basename $i) ]; then
19 rm -rf "$i"
20 fi
21 done
22 '';
23 in
24 [
25 ''
26 0 6 * * * ${apacheUser} ${script}
27 ''
28 ];
29 };
30
31 services.websites.env.production.vhostConfs.papa_surveillance = {
32 certName = "papa";
33 certMainHost = "surveillance.maison.bbc.bouya.org";
34 hosts = [ "surveillance.maison.bbc.bouya.org" ];
35 root = varDir;
36 extraConfig = [
37 ''
38 Use Apaxy "${varDir}" "title .duplicity-ignore"
39 <Directory ${varDir}>
40 Use LDAPConnect
41 Options Indexes
42 AllowOverride None
43 Require ldap-group cn=surveillance.maison.bbc.bouya.org,cn=httpd,ou=services,dc=immae,dc=eu
44 </Directory>
45 ''
46 ];
47 };
48 };
49}
50
diff --git a/modules/private/websites/patrick_fodella/altermondia.nix b/modules/private/websites/patrick_fodella/altermondia.nix
deleted file mode 100644
index 2a41aa3..0000000
--- a/modules/private/websites/patrick_fodella/altermondia.nix
+++ /dev/null
@@ -1,73 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.patrick_fodella.altermondia;
4 varDir = "/var/lib/ftp/patrick_fodella/altermondia";
5 apacheUser = config.services.httpd.Prod.user;
6 apacheGroup = config.services.httpd.Prod.group;
7in {
8 options.myServices.websites.patrick_fodella.altermondia.enable = lib.mkEnableOption "enable Patrick Fodella Altermondia's website";
9
10 config = lib.mkIf cfg.enable {
11 services.webstats.sites = [ { name = "altermondia.org"; } ];
12
13 system.activationScripts.patrick_fodella_altermondia = {
14 deps = [ "httpd" ];
15 text = ''
16 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/patrick_fodella_altermondia
17 '';
18 };
19 systemd.services.phpfpm-patrick_fodella_altermondia.after = lib.mkAfter [ "mysql.service" ];
20 systemd.services.phpfpm-patrick_fodella_altermondia.wants = [ "mysql.service" ];
21 services.phpfpm.pools.patrick_fodella_altermondia = {
22 user = apacheUser;
23 group = apacheGroup;
24 settings = {
25 "listen.owner" = apacheUser;
26 "listen.group" = apacheGroup;
27
28 "pm" = "ondemand";
29 "pm.max_children" = "5";
30 "pm.process_idle_timeout" = "60";
31
32 "php_admin_value[open_basedir]" = "/var/lib/php/sessions/patrick_fodella_altermondia:${varDir}:/tmp";
33 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/patrick_fodella_altermondia";
34 };
35 phpOptions = config.services.phpfpm.phpOptions + ''
36 disable_functions = "mail"
37 '';
38 phpPackage = pkgs.php72;
39 };
40 services.websites.env.production.modules = [ "proxy_fcgi" ];
41 services.websites.env.production.vhostConfs.patrick_fodella_altermondia = {
42 certName = "patrick_fodella";
43 addToCerts = true;
44 hosts = ["altermondia.org" "www.altermondia.org" ];
45 root = varDir;
46 extraConfig = [
47 ''
48 Use Stats altermondia.org
49
50 RewriteEngine on
51 RewriteCond "%{HTTP_HOST}" "!^altermondia\.org$" [NC]
52 RewriteRule ^(.+)$ https://altermondia.org$1 [R=302,L]
53
54 <FilesMatch "\.php$">
55 SetHandler "proxy:unix:${config.services.phpfpm.pools.patrick_fodella_altermondia.socket}|fcgi://localhost"
56 </FilesMatch>
57
58 <Location /xmlrpc.php>
59 AllowOverride None
60 Require all denied
61 </Location>
62 <Directory ${varDir}>
63 DirectoryIndex index.php index.htm index.html
64 Options Indexes FollowSymLinks MultiViews Includes
65 AllowOverride all
66 Require all granted
67 </Directory>
68 ''
69 ];
70 };
71 };
72}
73
diff --git a/modules/private/websites/patrick_fodella/ecolyeu.nix b/modules/private/websites/patrick_fodella/ecolyeu.nix
deleted file mode 100644
index 00dab76..0000000
--- a/modules/private/websites/patrick_fodella/ecolyeu.nix
+++ /dev/null
@@ -1,72 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.patrick_fodella.ecolyeu;
4 varDir = "/var/lib/ftp/patrick_fodella/ecolyeu_pessicart";
5 apacheUser = config.services.httpd.Prod.user;
6 apacheGroup = config.services.httpd.Prod.group;
7in {
8 options.myServices.websites.patrick_fodella.ecolyeu.enable = lib.mkEnableOption "enable Patrick Fodella Ecolyeu's website";
9
10 config = lib.mkIf cfg.enable {
11 services.webstats.sites = [ { name = "ecolyeu-pessicart-nice.fr"; } ];
12
13 system.activationScripts.patrick_fodella_ecolyeu = {
14 deps = [ "httpd" ];
15 text = ''
16 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/patrick_fodella_ecolyeu
17 '';
18 };
19 systemd.services.phpfpm-patrick_fodella_ecolyeu.after = lib.mkAfter [ "mysql.service" ];
20 systemd.services.phpfpm-patrick_fodella_ecolyeu.wants = [ "mysql.service" ];
21 services.phpfpm.pools.patrick_fodella_ecolyeu = {
22 user = apacheUser;
23 group = apacheGroup;
24 settings = {
25 "listen.owner" = apacheUser;
26 "listen.group" = apacheGroup;
27
28 "pm" = "ondemand";
29 "pm.max_children" = "5";
30 "pm.process_idle_timeout" = "60";
31
32 "php_admin_value[open_basedir]" = "/var/lib/php/sessions/patrick_fodella_ecolyeu:${varDir}:/tmp";
33 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/patrick_fodella_ecolyeu";
34 };
35 phpOptions = config.services.phpfpm.phpOptions + ''
36 disable_functions = "mail"
37 '';
38 phpPackage = pkgs.php72;
39 };
40 services.websites.env.production.modules = [ "proxy_fcgi" ];
41 services.websites.env.production.vhostConfs.patrick_fodella_ecolyeu = {
42 certName = "patrick_fodella";
43 certMainHost = "ecolyeu-pessicart-nice.fr";
44 hosts = ["ecolyeu-pessicart-nice.fr" "www.ecolyeu-pessicart-nice.fr" ];
45 root = varDir;
46 extraConfig = [
47 ''
48 Use Stats ecolyeu-pessicart-nice.fr
49
50 RewriteEngine on
51 RewriteCond "%{HTTP_HOST}" "!^www\.ecolyeu-pessicart-nice\.fr$" [NC]
52 RewriteRule ^(.+)$ https://www.ecolyeu-pessicart-nice.fr$1 [R=302,L]
53
54 <FilesMatch "\.php$">
55 SetHandler "proxy:unix:${config.services.phpfpm.pools.patrick_fodella_ecolyeu.socket}|fcgi://localhost"
56 </FilesMatch>
57
58 <Location /xmlrpc.php>
59 AllowOverride None
60 Require all denied
61 </Location>
62 <Directory ${varDir}>
63 DirectoryIndex index.php index.htm index.html
64 Options Indexes FollowSymLinks MultiViews Includes
65 AllowOverride all
66 Require all granted
67 </Directory>
68 ''
69 ];
70 };
71 };
72}
diff --git a/modules/private/websites/piedsjaloux/app/default.nix b/modules/private/websites/piedsjaloux/app/default.nix
deleted file mode 100644
index 4525a18..0000000
--- a/modules/private/websites/piedsjaloux/app/default.nix
+++ /dev/null
@@ -1,29 +0,0 @@
1{ environment, varDir, secretsPath
2, composerEnv, fetchurl, fetchgit, sources }:
3let
4 app = composerEnv.buildPackage (
5 import ./php-packages.nix { inherit composerEnv fetchurl fetchgit; } //
6 rec {
7 version = sources.websites-piedsjaloux-app.version;
8 pname = "piedsjaloux";
9 name = "${pname}-${version}";
10 src = sources.websites-piedsjaloux-app;
11 noDev = (environment == "prod");
12 preInstall = ''
13 export SYMFONY_ENV="${environment}"
14 '';
15 # /!\ miniatures and data need to be in the same physical dir due to a
16 # bug in leapt.im (searches for data/../miniatures)
17 postInstall = ''
18 cd $out
19 rm app/config/parameters.yml
20 ln -sf ${secretsPath} app/config/parameters.yml
21 rm -rf var/{logs,cache,data,miniatures,tmp}
22 ln -sf ${varDir}/{logs,cache,data,miniatures,tmp} var/
23 '';
24 passthru = {
25 inherit varDir environment secretsPath;
26 webRoot = "${app}/web";
27 };
28 });
29in app
diff --git a/modules/private/websites/piedsjaloux/app/php-packages.nix b/modules/private/websites/piedsjaloux/app/php-packages.nix
deleted file mode 100644
index 7b99936..0000000
--- a/modules/private/websites/piedsjaloux/app/php-packages.nix
+++ /dev/null
@@ -1,1009 +0,0 @@
1# Generated with composer2nix and adapted to return only the list of
2# packages
3{ composerEnv, fetchurl, fetchgit ? null }:
4{
5 packages = {
6 "behat/transliterator" = {
7 targetDir = "";
8 src = composerEnv.buildZipPackage {
9 name = "behat-transliterator-826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c";
10 src = fetchurl {
11 url = https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c;
12 sha256 = "1mgc9azx79fkrxahji3xwbgqhlcnvh3xk6llqdvhjb7vgzj4bqq0";
13 };
14 };
15 };
16 "components/bootstrap" = {
17 targetDir = "";
18 src = composerEnv.buildZipPackage {
19 name = "components-bootstrap-5d60b2efd3159e1a9e203901849b3493c5aac61f";
20 src = fetchurl {
21 url = https://api.github.com/repos/components/bootstrap/zipball/5d60b2efd3159e1a9e203901849b3493c5aac61f;
22 sha256 = "0jdyxl86dr2lf8az1vby84i7kdn1qcqkp8fy60rs18gav0aqp4fg";
23 };
24 };
25 };
26 "components/jquery" = {
27 targetDir = "";
28 src = composerEnv.buildZipPackage {
29 name = "components-jquery-459648cda77875519c5da3ae1dd0ed5d170aa649";
30 src = fetchurl {
31 url = https://api.github.com/repos/components/jquery/zipball/459648cda77875519c5da3ae1dd0ed5d170aa649;
32 sha256 = "04jv8yifhwx0cpkw3y3ng0bs2dv77pzrdd640p59rjxwba6r1lbb";
33 };
34 };
35 };
36 "components/jqueryui" = {
37 targetDir = "";
38 src = composerEnv.buildZipPackage {
39 name = "components-jqueryui-c34f8dbf3ba57b3784b93f26119f436c0e8288e1";
40 src = fetchurl {
41 url = https://api.github.com/repos/components/jqueryui/zipball/c34f8dbf3ba57b3784b93f26119f436c0e8288e1;
42 sha256 = "00nkg6z8g6l3jysyzsfmfxhxqcdsd3jfqib28j8kn2frzx508xv9";
43 };
44 };
45 };
46 "composer/ca-bundle" = {
47 targetDir = "";
48 src = composerEnv.buildZipPackage {
49 name = "composer-ca-bundle-8afa52cd417f4ec417b4bfe86b68106538a87660";
50 src = fetchurl {
51 url = https://api.github.com/repos/composer/ca-bundle/zipball/8afa52cd417f4ec417b4bfe86b68106538a87660;
52 sha256 = "18b0gq29frjf4yhl4sl3i3zbz6zr3qjgsjb8cjdhz65vpb50581p";
53 };
54 };
55 };
56 "container-interop/container-interop" = {
57 targetDir = "";
58 src = composerEnv.buildZipPackage {
59 name = "container-interop-container-interop-79cbf1341c22ec75643d841642dd5d6acd83bdb8";
60 src = fetchurl {
61 url = https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8;
62 sha256 = "1pxm461g5flcq50yabr01nw8w17n3g7klpman9ps3im4z0604m52";
63 };
64 };
65 };
66 "dmishh/settings-bundle" = {
67 targetDir = "";
68 src = composerEnv.buildZipPackage {
69 name = "dmishh-settings-bundle-0ee48b015691694a8dcbd3ee654d33386e7bf478";
70 src = fetchurl {
71 url = https://api.github.com/repos/dmishh/SettingsBundle/zipball/0ee48b015691694a8dcbd3ee654d33386e7bf478;
72 sha256 = "0m2fw5shvnkqlz0nm27ggpmkipfh377y1hjsw343zv1nn72nxfqf";
73 };
74 };
75 };
76 "doctrine/annotations" = {
77 targetDir = "";
78 src = composerEnv.buildZipPackage {
79 name = "doctrine-annotations-c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5";
80 src = fetchurl {
81 url = https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5;
82 sha256 = "0b80xpqd3j99xgm0c41kbgy0k6knrfnd29223c93295sb12112g7";
83 };
84 };
85 };
86 "doctrine/cache" = {
87 targetDir = "";
88 src = composerEnv.buildZipPackage {
89 name = "doctrine-cache-d768d58baee9a4862ca783840eca1b9add7a7f57";
90 src = fetchurl {
91 url = https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57;
92 sha256 = "1kljhw4gqp12iz88h6ymsrlfir2fis7icn6dffyizfc1csyb4s2i";
93 };
94 };
95 };
96 "doctrine/collections" = {
97 targetDir = "";
98 src = composerEnv.buildZipPackage {
99 name = "doctrine-collections-a01ee38fcd999f34d9bfbcee59dbda5105449cbf";
100 src = fetchurl {
101 url = https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf;
102 sha256 = "0d36zc21ka0pdac9xpkxsgf5zzw9gp0m9lk3r3xs5y70j0lkkkis";
103 };
104 };
105 };
106 "doctrine/common" = {
107 targetDir = "";
108 src = composerEnv.buildZipPackage {
109 name = "doctrine-common-30e33f60f64deec87df728c02b107f82cdafad9d";
110 src = fetchurl {
111 url = https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d;
112 sha256 = "0s4vv14ibyx62a9aj3wn5cs2bbxd72fajmfmi8qb5l11gx0375na";
113 };
114 };
115 };
116 "doctrine/dbal" = {
117 targetDir = "";
118 src = composerEnv.buildZipPackage {
119 name = "doctrine-dbal-22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9";
120 src = fetchurl {
121 url = https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9;
122 sha256 = "0kbahs699jd8pxf512dgg7arv49dc7qzi3mx8snxqm4h15n5brnj";
123 };
124 };
125 };
126 "doctrine/doctrine-bundle" = {
127 targetDir = "";
128 src = composerEnv.buildZipPackage {
129 name = "doctrine-doctrine-bundle-82d2c63cd09acbde2332f55d9aa7b28aefe4983d";
130 src = fetchurl {
131 url = https://api.github.com/repos/doctrine/DoctrineBundle/zipball/82d2c63cd09acbde2332f55d9aa7b28aefe4983d;
132 sha256 = "0gzrigv360rp50yxpwidbkf8vlagym0w1if010yz5xcfrz37cpn3";
133 };
134 };
135 };
136 "doctrine/doctrine-cache-bundle" = {
137 targetDir = "";
138 src = composerEnv.buildZipPackage {
139 name = "doctrine-doctrine-cache-bundle-5514c90d9fb595e1095e6d66ebb98ce9ef049927";
140 src = fetchurl {
141 url = https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927;
142 sha256 = "04njrfhw4fc2ifacd9h0wd9i14l7ycv3hanbqrw5ilsai02j6asa";
143 };
144 };
145 };
146 "doctrine/doctrine-migrations-bundle" = {
147 targetDir = "";
148 src = composerEnv.buildZipPackage {
149 name = "doctrine-doctrine-migrations-bundle-49fa399181db4bf4f9f725126bd1cb65c4398dce";
150 src = fetchurl {
151 url = https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce;
152 sha256 = "1a73xjhjrjlvkh8d253kfc2rbxd2h4hwafhv5078dy7rg6x9blyn";
153 };
154 };
155 };
156 "doctrine/event-manager" = {
157 targetDir = "";
158 src = composerEnv.buildZipPackage {
159 name = "doctrine-event-manager-a520bc093a0170feeb6b14e9d83f3a14452e64b3";
160 src = fetchurl {
161 url = https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3;
162 sha256 = "165cxvw4idqj01l63nya2whpdb3fz6ld54rx198b71bzwfrydl88";
163 };
164 };
165 };
166 "doctrine/inflector" = {
167 targetDir = "";
168 src = composerEnv.buildZipPackage {
169 name = "doctrine-inflector-5527a48b7313d15261292c149e55e26eae771b0a";
170 src = fetchurl {
171 url = https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a;
172 sha256 = "0ng6vlwjr8h6hqwa32ynykz1mhlfsff5hirjidlk086ab6njppa5";
173 };
174 };
175 };
176 "doctrine/instantiator" = {
177 targetDir = "";
178 src = composerEnv.buildZipPackage {
179 name = "doctrine-instantiator-185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda";
180 src = fetchurl {
181 url = https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda;
182 sha256 = "1mah9a6mb30qad1zryzjain2dxw29d8h4bjkbcs3srpm3p891msy";
183 };
184 };
185 };
186 "doctrine/lexer" = {
187 targetDir = "";
188 src = composerEnv.buildZipPackage {
189 name = "doctrine-lexer-83893c552fd2045dd78aef794c31e694c37c0b8c";
190 src = fetchurl {
191 url = https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c;
192 sha256 = "0cyh3vwcl163cx1vrcwmhlh5jg9h47xwiqgzc6rwscxw0ppd1v74";
193 };
194 };
195 };
196 "doctrine/migrations" = {
197 targetDir = "";
198 src = composerEnv.buildZipPackage {
199 name = "doctrine-migrations-215438c0eef3e5f9b7da7d09c6b90756071b43e6";
200 src = fetchurl {
201 url = https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6;
202 sha256 = "0k6sgw65vji9rgib10mq2m634m41a67inspkrcw4qixig2lnb3ld";
203 };
204 };
205 };
206 "doctrine/orm" = {
207 targetDir = "";
208 src = composerEnv.buildZipPackage {
209 name = "doctrine-orm-434820973cadf2da2d66e7184be370084cc32ca8";
210 src = fetchurl {
211 url = https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8;
212 sha256 = "114fyq8kaf5qzfkp8sdygqflf3z94va1cs5c3scycfpg9cmi4gls";
213 };
214 };
215 };
216 "doctrine/persistence" = {
217 targetDir = "";
218 src = composerEnv.buildZipPackage {
219 name = "doctrine-persistence-c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38";
220 src = fetchurl {
221 url = https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38;
222 sha256 = "0xdm5n38rjas1mlyxc15sg1as5h7y012mdb0j9lr6cvphgnaxxv7";
223 };
224 };
225 };
226 "doctrine/reflection" = {
227 targetDir = "";
228 src = composerEnv.buildZipPackage {
229 name = "doctrine-reflection-02538d3f95e88eb397a5f86274deb2c6175c2ab6";
230 src = fetchurl {
231 url = https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6;
232 sha256 = "12n9zik4lxb9lx1jf0nbvg9vl9nv958a7z1yjx48scfxd1d1sxjy";
233 };
234 };
235 };
236 "eko/feedbundle" = {
237 targetDir = "";
238 src = composerEnv.buildZipPackage {
239 name = "eko-feedbundle-d4e626616d9ccf6527212d3bdda15f9af3838e4f";
240 src = fetchurl {
241 url = https://api.github.com/repos/eko/FeedBundle/zipball/d4e626616d9ccf6527212d3bdda15f9af3838e4f;
242 sha256 = "145f4mq2bpsdayaiqmgz1asmjx2is4v327h2ny2wp03knnkjvnfq";
243 };
244 };
245 };
246 "fig/link-util" = {
247 targetDir = "";
248 src = composerEnv.buildZipPackage {
249 name = "fig-link-util-1a07821801a148be4add11ab0603e4af55a72fac";
250 src = fetchurl {
251 url = https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac;
252 sha256 = "0ky1pq4a17br5zvcychjghgwr6wpkgp409hdv0ljdk3ks90w5w64";
253 };
254 };
255 };
256 "gedmo/doctrine-extensions" = {
257 targetDir = "";
258 src = composerEnv.buildZipPackage {
259 name = "gedmo-doctrine-extensions-87c78ff9fd4b90460386f753d95622f6fbbfcb27";
260 src = fetchurl {
261 url = https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/87c78ff9fd4b90460386f753d95622f6fbbfcb27;
262 sha256 = "1i33xy9s18rncc1fllwi2qi7hrxj8g762fvgl9np7xndxa7kclyb";
263 };
264 };
265 };
266 "gregwar/captcha" = {
267 targetDir = "";
268 src = composerEnv.buildZipPackage {
269 name = "gregwar-captcha-cf953dd79748406e0292cea8c565399681e4d345";
270 src = fetchurl {
271 url = https://api.github.com/repos/Gregwar/Captcha/zipball/cf953dd79748406e0292cea8c565399681e4d345;
272 sha256 = "153m7bkhs3drxk0jfbq67a8vr1m13g7isc4ck44k5hyfzpcazb5i";
273 };
274 };
275 };
276 "gregwar/captcha-bundle" = {
277 targetDir = "";
278 src = composerEnv.buildZipPackage {
279 name = "gregwar-captcha-bundle-c2d5468556890dd25e0b53bd345fc205562c86f7";
280 src = fetchurl {
281 url = https://api.github.com/repos/Gregwar/CaptchaBundle/zipball/c2d5468556890dd25e0b53bd345fc205562c86f7;
282 sha256 = "04wcvqq457h6v7mzmrar946swd9akk27fmfig4qj8hpxzj250cgk";
283 };
284 };
285 };
286 "helios-ag/fm-bbcode-bundle" = {
287 targetDir = "";
288 src = composerEnv.buildZipPackage {
289 name = "helios-ag-fm-bbcode-bundle-d88ff5ca6c0ab71ec094d5a7d56b0bc8bc100363";
290 src = fetchurl {
291 url = https://api.github.com/repos/helios-ag/FMBbCodeBundle/zipball/d88ff5ca6c0ab71ec094d5a7d56b0bc8bc100363;
292 sha256 = "13g9ddd2p3nf1vrbkf6l00qdqz89rq6d8l20p68dmiy7mb6kpynl";
293 };
294 };
295 };
296 "immae/piedsjaloux-ckeditor-component" = {
297 targetDir = "";
298 src = fetchgit {
299 name = "immae-piedsjaloux-ckeditor-component-9946db9daaa76448d0e43247472cdedd2a5ea22a";
300 url = "https://git.immae.eu/perso/Immae/Projets/packagist/piedsjaloux-ckeditor-component.git";
301 rev = "9946db9daaa76448d0e43247472cdedd2a5ea22a";
302 sha256 = "183rgl23li3bqsynfmvv2s7jvlmqf6a5pskgrcxlaxcrr0d09n8c";
303 };
304 };
305 "incenteev/composer-parameter-handler" = {
306 targetDir = "";
307 src = composerEnv.buildZipPackage {
308 name = "incenteev-composer-parameter-handler-933c45a34814f27f2345c11c37d46b3ca7303550";
309 src = fetchurl {
310 url = https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550;
311 sha256 = "1zqdwlcl790kjyz4rkpva35xkfsp8kslds82fzznj0yigkgnbifm";
312 };
313 };
314 };
315 "jdorn/sql-formatter" = {
316 targetDir = "";
317 src = composerEnv.buildZipPackage {
318 name = "jdorn-sql-formatter-64990d96e0959dff8e059dfcdc1af130728d92bc";
319 src = fetchurl {
320 url = https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc;
321 sha256 = "1dnmkm8mxylvxjwi0bdkzrlklncqx92fa4fwqp5bh2ypj8gaagzi";
322 };
323 };
324 };
325 "kriswallsmith/assetic" = {
326 targetDir = "";
327 src = composerEnv.buildZipPackage {
328 name = "kriswallsmith-assetic-e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1";
329 src = fetchurl {
330 url = https://api.github.com/repos/kriswallsmith/assetic/zipball/e911c437dbdf006a8f62c2f59b15b2d69a5e0aa1;
331 sha256 = "1dqk4zvx8fgqf8rb81sj9bipl5431jib2b9kcvxyig5fw99irpf8";
332 };
333 };
334 };
335 "leapt/im-bundle" = {
336 targetDir = "";
337 src = composerEnv.buildZipPackage {
338 name = "leapt-im-bundle-83442778d118f6edb537b93f9746c3a97e56c3d1";
339 src = fetchurl {
340 url = https://api.github.com/repos/leapt/im-bundle/zipball/83442778d118f6edb537b93f9746c3a97e56c3d1;
341 sha256 = "1gm4ih3v1j0xjm7mrpspd3yacdwvbqgag22cyqmix0hc9hw3pc6a";
342 };
343 };
344 };
345 "luxifer/doctrine-functions" = {
346 targetDir = "";
347 src = composerEnv.buildZipPackage {
348 name = "luxifer-doctrine-functions-e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c";
349 src = fetchurl {
350 url = https://api.github.com/repos/luxifer/doctrine-functions/zipball/e1c0bb1a5cb002d9fc82d8b32a5da28c02d34c6c;
351 sha256 = "1sw4826nvs5q0y2na9m26rbxfiaw0kfqwhky7x7apicgx5adqfa9";
352 };
353 };
354 };
355 "mjohnson/decoda" = {
356 targetDir = "";
357 src = composerEnv.buildZipPackage {
358 name = "mjohnson-decoda-8cd0928b78a4bf5ade48b80c934370fc1f5f84a1";
359 src = fetchurl {
360 url = https://api.github.com/repos/milesj/decoda/zipball/8cd0928b78a4bf5ade48b80c934370fc1f5f84a1;
361 sha256 = "0wcxz9yirz4zir06xvnlchqgppmyasymak06gn46jn6v6c9dsykc";
362 };
363 };
364 };
365 "monolog/monolog" = {
366 targetDir = "";
367 src = composerEnv.buildZipPackage {
368 name = "monolog-monolog-bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266";
369 src = fetchurl {
370 url = https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266;
371 sha256 = "0h3nnxjf2bdh7nmpqnpij99lqv6bw13r2bx83d8vn5zvblwg5png";
372 };
373 };
374 };
375 "ocramius/package-versions" = {
376 targetDir = "";
377 needsModifyRights = true;
378 src = composerEnv.buildZipPackage {
379 name = "ocramius-package-versions-4489d5002c49d55576fa0ba786f42dbb009be46f";
380 src = fetchurl {
381 url = https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f;
382 sha256 = "039c404g9597x45xh04bnn8kmcyknkbnr57yb9s7vf29vfrg4881";
383 };
384 };
385 };
386 "ocramius/proxy-manager" = {
387 targetDir = "";
388 src = composerEnv.buildZipPackage {
389 name = "ocramius-proxy-manager-14b137b06b0f911944132df9d51e445a35920ab1";
390 src = fetchurl {
391 url = https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1;
392 sha256 = "10y5msgh2jdlw4w075fasv40yq01szjy15m3f0wgc89hlfmqz0sn";
393 };
394 };
395 };
396 "paragonie/random_compat" = {
397 targetDir = "";
398 src = composerEnv.buildZipPackage {
399 name = "paragonie-random_compat-84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95";
400 src = fetchurl {
401 url = https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95;
402 sha256 = "03nsccdvcb79l64b7lsmx0n8ldf5z3v8niqr7bpp6wg401qp9p09";
403 };
404 };
405 };
406 "psr/cache" = {
407 targetDir = "";
408 src = composerEnv.buildZipPackage {
409 name = "psr-cache-d11b50ad223250cf17b86e38383413f5a6764bf8";
410 src = fetchurl {
411 url = https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8;
412 sha256 = "06i2k3dx3b4lgn9a4v1dlgv8l9wcl4kl7vzhh63lbji0q96hv8qz";
413 };
414 };
415 };
416 "psr/container" = {
417 targetDir = "";
418 src = composerEnv.buildZipPackage {
419 name = "psr-container-b7ce3b176482dbbc1245ebf52b181af44c2cf55f";
420 src = fetchurl {
421 url = https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f;
422 sha256 = "0rkz64vgwb0gfi09klvgay4qnw993l1dc03vyip7d7m2zxi6cy4j";
423 };
424 };
425 };
426 "psr/link" = {
427 targetDir = "";
428 src = composerEnv.buildZipPackage {
429 name = "psr-link-eea8e8662d5cd3ae4517c9b864493f59fca95562";
430 src = fetchurl {
431 url = https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562;
432 sha256 = "091k4p9irkqnmq9b0p792wz1hb7dm4rafpjilw9im9xhsxgkmr13";
433 };
434 };
435 };
436 "psr/log" = {
437 targetDir = "";
438 src = composerEnv.buildZipPackage {
439 name = "psr-log-6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd";
440 src = fetchurl {
441 url = https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd;
442 sha256 = "1i351p3gd1pgjcjxv7mwwkiw79f1xiqr38irq22156h05zlcx80d";
443 };
444 };
445 };
446 "psr/simple-cache" = {
447 targetDir = "";
448 src = composerEnv.buildZipPackage {
449 name = "psr-simple-cache-408d5eafb83c57f6365a3ca330ff23aa4a5fa39b";
450 src = fetchurl {
451 url = https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b;
452 sha256 = "1djgzclkamjxi9jy4m9ggfzgq1vqxaga2ip7l3cj88p7rwkzjxgw";
453 };
454 };
455 };
456 "robloach/component-installer" = {
457 targetDir = "";
458 src = composerEnv.buildZipPackage {
459 name = "robloach-component-installer-908a859aa7c4949ba9ad67091e67bac10b66d3d7";
460 src = fetchurl {
461 url = https://api.github.com/repos/RobLoach/component-installer/zipball/908a859aa7c4949ba9ad67091e67bac10b66d3d7;
462 sha256 = "19y5sv4k338bihzmm8iac6q43r18vxhmbpvrdhz8jn39r51ampq9";
463 };
464 };
465 };
466 "sensio/distribution-bundle" = {
467 targetDir = "";
468 src = composerEnv.buildZipPackage {
469 name = "sensio-distribution-bundle-59eac70f15f97ee945924948a6f5e2f6f86b7a4b";
470 src = fetchurl {
471 url = https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/59eac70f15f97ee945924948a6f5e2f6f86b7a4b;
472 sha256 = "05mj4c0ahwg6l2wipyqfyyjjp1m2vvl7ymp61nvwv7zhvqacvljs";
473 };
474 };
475 };
476 "sensio/framework-extra-bundle" = {
477 targetDir = "";
478 src = composerEnv.buildZipPackage {
479 name = "sensio-framework-extra-bundle-bb907234df776b68922eb4b25bfa061683597b6a";
480 src = fetchurl {
481 url = https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/bb907234df776b68922eb4b25bfa061683597b6a;
482 sha256 = "011hcljjcfq5qy4a7mlf0hwqxyb58yci40ini0n5rqandcyk2nck";
483 };
484 };
485 };
486 "sensiolabs/security-checker" = {
487 targetDir = "";
488 src = composerEnv.buildZipPackage {
489 name = "sensiolabs-security-checker-46be3f58adac13084497961e10eed9a7fb4d44d1";
490 src = fetchurl {
491 url = https://api.github.com/repos/sensiolabs/security-checker/zipball/46be3f58adac13084497961e10eed9a7fb4d44d1;
492 sha256 = "1caqf3hdfsajj9nb8fpinvs6apv90g1srwxcyxdnr6a8d6g0p6qi";
493 };
494 };
495 };
496 "swiftmailer/swiftmailer" = {
497 targetDir = "";
498 src = composerEnv.buildZipPackage {
499 name = "swiftmailer-swiftmailer-181b89f18a90f8925ef805f950d47a7190e9b950";
500 src = fetchurl {
501 url = https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950;
502 sha256 = "0hkmawv3bhbqdavy4wxqhzajg5zqd7chsi8w27y2zdi5r35az75d";
503 };
504 };
505 };
506 "symfony/assetic-bundle" = {
507 targetDir = "";
508 src = composerEnv.buildZipPackage {
509 name = "symfony-assetic-bundle-2e0a23a4874838e26de6f025e02fc63328921a4c";
510 src = fetchurl {
511 url = https://api.github.com/repos/symfony/assetic-bundle/zipball/2e0a23a4874838e26de6f025e02fc63328921a4c;
512 sha256 = "17rxrkyzxa6x5nn7qhhhdgx4z0nlznnq5fifza4wv9znca8bbwyc";
513 };
514 };
515 };
516 "symfony/monolog-bundle" = {
517 targetDir = "";
518 src = composerEnv.buildZipPackage {
519 name = "symfony-monolog-bundle-572e143afc03419a75ab002c80a2fd99299195ff";
520 src = fetchurl {
521 url = https://api.github.com/repos/symfony/monolog-bundle/zipball/572e143afc03419a75ab002c80a2fd99299195ff;
522 sha256 = "0g8icydnwfbqcbc56pqyc8bv1vp31331w0r75r3hqh225p2j1nd7";
523 };
524 };
525 };
526 "symfony/polyfill-apcu" = {
527 targetDir = "";
528 src = composerEnv.buildZipPackage {
529 name = "symfony-polyfill-apcu-19e1b73bf255265ad0b568f81766ae2a3266d8d2";
530 src = fetchurl {
531 url = https://api.github.com/repos/symfony/polyfill-apcu/zipball/19e1b73bf255265ad0b568f81766ae2a3266d8d2;
532 sha256 = "0jg33c81kwkpxk0b18jkslz9jkbkxl5k48h6m5b33dm63p1fj05r";
533 };
534 };
535 };
536 "symfony/polyfill-ctype" = {
537 targetDir = "";
538 src = composerEnv.buildZipPackage {
539 name = "symfony-polyfill-ctype-e3d826245268269cd66f8326bd8bc066687b4a19";
540 src = fetchurl {
541 url = https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19;
542 sha256 = "16md0qmy5jvvl7lc6n6r5hxjdr5i30vl6n9rpkm4b11rh2nqh7mh";
543 };
544 };
545 };
546 "symfony/polyfill-intl-icu" = {
547 targetDir = "";
548 src = composerEnv.buildZipPackage {
549 name = "symfony-polyfill-intl-icu-f22a90256d577c7ef7efad8df1f0201663d57644";
550 src = fetchurl {
551 url = https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644;
552 sha256 = "0x7h8l248l1gc07xmvfixq6p80ifdaa29qympfq3jzfb79k69slq";
553 };
554 };
555 };
556 "symfony/polyfill-mbstring" = {
557 targetDir = "";
558 src = composerEnv.buildZipPackage {
559 name = "symfony-polyfill-mbstring-c79c051f5b3a46be09205c73b80b346e4153e494";
560 src = fetchurl {
561 url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494;
562 sha256 = "18v2777cky55ah6xi4dh383mp4iddwzmnvx81qd86y1kgfykwhpi";
563 };
564 };
565 };
566 "symfony/polyfill-php56" = {
567 targetDir = "";
568 src = composerEnv.buildZipPackage {
569 name = "symfony-polyfill-php56-ff208829fe1aa48ab9af356992bb7199fed551af";
570 src = fetchurl {
571 url = https://api.github.com/repos/symfony/polyfill-php56/zipball/ff208829fe1aa48ab9af356992bb7199fed551af;
572 sha256 = "0vmpiwakc7hpbr6jwpk7cqcy41ybgwl6jkn3q8c4ryxynknn5hfk";
573 };
574 };
575 };
576 "symfony/polyfill-php70" = {
577 targetDir = "";
578 src = composerEnv.buildZipPackage {
579 name = "symfony-polyfill-php70-6b88000cdd431cd2e940caa2cb569201f3f84224";
580 src = fetchurl {
581 url = https://api.github.com/repos/symfony/polyfill-php70/zipball/6b88000cdd431cd2e940caa2cb569201f3f84224;
582 sha256 = "08h77r1i2q4pwdd0yk3pfhqqgk0z7gwmkzmvykx9bfv1z7a0h8ik";
583 };
584 };
585 };
586 "symfony/polyfill-util" = {
587 targetDir = "";
588 src = composerEnv.buildZipPackage {
589 name = "symfony-polyfill-util-3b58903eae668d348a7126f999b0da0f2f93611c";
590 src = fetchurl {
591 url = https://api.github.com/repos/symfony/polyfill-util/zipball/3b58903eae668d348a7126f999b0da0f2f93611c;
592 sha256 = "00bb5mgljk6d54nyvd4gmc7mbzfr4b4q7h3rxmv8rzq613wcjp3i";
593 };
594 };
595 };
596 "symfony/swiftmailer-bundle" = {
597 targetDir = "";
598 src = composerEnv.buildZipPackage {
599 name = "symfony-swiftmailer-bundle-c4808f5169efc05567be983909d00f00521c53ec";
600 src = fetchurl {
601 url = https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/c4808f5169efc05567be983909d00f00521c53ec;
602 sha256 = "0jmd3slhb3gf3c3krmk2a9fi4ixdxvqlimdkfpj0sfaaq0115y01";
603 };
604 };
605 };
606 "symfony/symfony" = {
607 targetDir = "";
608 src = composerEnv.buildZipPackage {
609 name = "symfony-symfony-f6b8ddc362b1cf3fb06548693c3adbb736092412";
610 src = fetchurl {
611 url = https://api.github.com/repos/symfony/symfony/zipball/f6b8ddc362b1cf3fb06548693c3adbb736092412;
612 sha256 = "0ip7k5xf34w4p1zvv2nkv4nyik3asidk3zlgzyc1v57429z0f28q";
613 };
614 };
615 };
616 "twig/extensions" = {
617 targetDir = "";
618 src = composerEnv.buildZipPackage {
619 name = "twig-extensions-57873c8b0c1be51caa47df2cdb824490beb16202";
620 src = fetchurl {
621 url = https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202;
622 sha256 = "1sjajjd6vnczvdrl9b8zhzr06l5dflzqiwg9d33d92q8gli4j7jn";
623 };
624 };
625 };
626 "twig/twig" = {
627 targetDir = "";
628 src = composerEnv.buildZipPackage {
629 name = "twig-twig-a11dd39f5b6589e14f0ff3b36675d06047c589b1";
630 src = fetchurl {
631 url = https://api.github.com/repos/twigphp/Twig/zipball/a11dd39f5b6589e14f0ff3b36675d06047c589b1;
632 sha256 = "0rnwam9379gj5m4ik0fh6c81dbr7kwj2b3x1gnmpf6awa5fm261n";
633 };
634 };
635 };
636 "zendframework/zend-code" = {
637 targetDir = "";
638 src = composerEnv.buildZipPackage {
639 name = "zendframework-zend-code-c21db169075c6ec4b342149f446e7b7b724f95eb";
640 src = fetchurl {
641 url = https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb;
642 sha256 = "031mfsahjkl63348020wq05273kvszx0dv2766zmzncnd6fcggw1";
643 };
644 };
645 };
646 "zendframework/zend-escaper" = {
647 targetDir = "";
648 src = composerEnv.buildZipPackage {
649 name = "zendframework-zend-escaper-31d8aafae982f9568287cb4dce987e6aff8fd074";
650 src = fetchurl {
651 url = https://api.github.com/repos/zendframework/zend-escaper/zipball/31d8aafae982f9568287cb4dce987e6aff8fd074;
652 sha256 = "16gwqh9zpclc3fmf89cf738mxfh36ar3wdf9i0wvby0g0nhknkd7";
653 };
654 };
655 };
656 "zendframework/zend-eventmanager" = {
657 targetDir = "";
658 src = composerEnv.buildZipPackage {
659 name = "zendframework-zend-eventmanager-a5e2583a211f73604691586b8406ff7296a946dd";
660 src = fetchurl {
661 url = https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd;
662 sha256 = "08a05gn40hfdy2zhz4gcd3r6q7m7zcaks5kpvb9dx1awgx0pzr8n";
663 };
664 };
665 };
666 "zendframework/zend-feed" = {
667 targetDir = "";
668 src = composerEnv.buildZipPackage {
669 name = "zendframework-zend-feed-6641f4cf3f4586c63f83fd70b6d19966025c8888";
670 src = fetchurl {
671 url = https://api.github.com/repos/zendframework/zend-feed/zipball/6641f4cf3f4586c63f83fd70b6d19966025c8888;
672 sha256 = "0wl2pf4cq0snlp3gbl2ia662i48yils464qlfqf7gdmbn1ryzcpi";
673 };
674 };
675 };
676 "zendframework/zend-http" = {
677 targetDir = "";
678 src = composerEnv.buildZipPackage {
679 name = "zendframework-zend-http-2c8aed3d25522618573194e7cc51351f8cd4a45b";
680 src = fetchurl {
681 url = https://api.github.com/repos/zendframework/zend-http/zipball/2c8aed3d25522618573194e7cc51351f8cd4a45b;
682 sha256 = "1vy6b24ihwv1g08hjnw4pd7c5171g866jnlr3j6fg0xqv79s4dn9";
683 };
684 };
685 };
686 "zendframework/zend-loader" = {
687 targetDir = "";
688 src = composerEnv.buildZipPackage {
689 name = "zendframework-zend-loader-78f11749ea340f6ca316bca5958eef80b38f9b6c";
690 src = fetchurl {
691 url = https://api.github.com/repos/zendframework/zend-loader/zipball/78f11749ea340f6ca316bca5958eef80b38f9b6c;
692 sha256 = "056zp0xchc4ckijg969im5him3j4cji6hsy26fiaycwprniaqdmg";
693 };
694 };
695 };
696 "zendframework/zend-servicemanager" = {
697 targetDir = "";
698 src = composerEnv.buildZipPackage {
699 name = "zendframework-zend-servicemanager-a1ed6140d0d3ee803fec96582593ed024950067b";
700 src = fetchurl {
701 url = https://api.github.com/repos/zendframework/zend-servicemanager/zipball/a1ed6140d0d3ee803fec96582593ed024950067b;
702 sha256 = "0s3aplkilrd8b18xh55h9m1yvnp9b6vnlgby4gqhqv8npnxxqir9";
703 };
704 };
705 };
706 "zendframework/zend-stdlib" = {
707 targetDir = "";
708 src = composerEnv.buildZipPackage {
709 name = "zendframework-zend-stdlib-66536006722aff9e62d1b331025089b7ec71c065";
710 src = fetchurl {
711 url = https://api.github.com/repos/zendframework/zend-stdlib/zipball/66536006722aff9e62d1b331025089b7ec71c065;
712 sha256 = "0cl0lcgqb5aja6iijp0wrclxra57imwsmhkfpahdl2bsgs1inf2f";
713 };
714 };
715 };
716 "zendframework/zend-uri" = {
717 targetDir = "";
718 src = composerEnv.buildZipPackage {
719 name = "zendframework-zend-uri-3b6463645c6766f78ce537c70cb4fdabee1e725f";
720 src = fetchurl {
721 url = https://api.github.com/repos/zendframework/zend-uri/zipball/3b6463645c6766f78ce537c70cb4fdabee1e725f;
722 sha256 = "0zkb88y9qbgshm8ys5yjxhz6a7fhxl7waygwn37pqsbvz74mbbvp";
723 };
724 };
725 };
726 "zendframework/zend-validator" = {
727 targetDir = "";
728 src = composerEnv.buildZipPackage {
729 name = "zendframework-zend-validator-f0789b4c4c099afdd2ecc58cc209a26c64bd4f17";
730 src = fetchurl {
731 url = https://api.github.com/repos/zendframework/zend-validator/zipball/f0789b4c4c099afdd2ecc58cc209a26c64bd4f17;
732 sha256 = "1lwxbr3jlldll4ccw5cn2ny1cbzh279mnfz7m1djqc8qnw16c8jl";
733 };
734 };
735 };
736 };
737 devPackages = {
738 "doctrine/data-fixtures" = {
739 targetDir = "";
740 src = composerEnv.buildZipPackage {
741 name = "doctrine-data-fixtures-3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a";
742 src = fetchurl {
743 url = https://api.github.com/repos/doctrine/data-fixtures/zipball/3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a;
744 sha256 = "0wbxhy7hq17laqgnq9x9ygysv0n1kn7s4x3v89pk7iy622pil3sm";
745 };
746 };
747 };
748 "doctrine/doctrine-fixtures-bundle" = {
749 targetDir = "";
750 src = composerEnv.buildZipPackage {
751 name = "doctrine-doctrine-fixtures-bundle-74b8cc70a4a25b774628ee59f4cdf3623a146273";
752 src = fetchurl {
753 url = https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/74b8cc70a4a25b774628ee59f4cdf3623a146273;
754 sha256 = "1bbflq8k6izwqgp9ka2gyb5y96a80b4lnlc5wrgc5gnih7hqidlf";
755 };
756 };
757 };
758 "fzaninotto/faker" = {
759 targetDir = "";
760 src = composerEnv.buildZipPackage {
761 name = "fzaninotto-faker-d0190b156bcca848d401fb80f31f504f37141c8d";
762 src = fetchurl {
763 url = https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d;
764 sha256 = "1x7xrxw14x7b0iq7sxi9ynswk8ljga62i77ch7xip4dwgq1dypvi";
765 };
766 };
767 };
768 "league/factory-muffin" = {
769 targetDir = "";
770 src = composerEnv.buildZipPackage {
771 name = "league-factory-muffin-316ed2bac70178567f995d877b831804c9c58d5a";
772 src = fetchurl {
773 url = https://api.github.com/repos/thephpleague/factory-muffin/zipball/316ed2bac70178567f995d877b831804c9c58d5a;
774 sha256 = "1fxh0hsqifmnhgkwyd460x3w9wn74369lmak3f1m24mn2asiynxq";
775 };
776 };
777 };
778 "league/factory-muffin-faker" = {
779 targetDir = "";
780 src = composerEnv.buildZipPackage {
781 name = "league-factory-muffin-faker-30dbd11bb6be03b47e52bd60006ae198d20ab426";
782 src = fetchurl {
783 url = https://api.github.com/repos/thephpleague/factory-muffin-faker/zipball/30dbd11bb6be03b47e52bd60006ae198d20ab426;
784 sha256 = "0dsimjdnsmzdd4vwjzw1gz1bb4zlhmv66g3fc9k4nj5bqch6mny1";
785 };
786 };
787 };
788 "mikey179/vfsStream" = {
789 targetDir = "";
790 src = composerEnv.buildZipPackage {
791 name = "mikey179-vfsStream-d5fec95f541d4d71c4823bb5e30cf9b9e5b96145";
792 src = fetchurl {
793 url = https://github.com/bovigo/vfsStream/archive/v1.6.5.zip;
794 sha256 = "16vi7ci8nxq5hxnzzjmmia73gdm55qcwn006c6hgdwa3i58dnr4l";
795 };
796 };
797 };
798 "phpdocumentor/reflection-common" = {
799 targetDir = "";
800 src = composerEnv.buildZipPackage {
801 name = "phpdocumentor-reflection-common-21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6";
802 src = fetchurl {
803 url = https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6;
804 sha256 = "1yaf1zg9lnkfnq2ndpviv0hg5bza9vjvv5l4wgcn25lx1p8a94w2";
805 };
806 };
807 };
808 "phpdocumentor/reflection-docblock" = {
809 targetDir = "";
810 src = composerEnv.buildZipPackage {
811 name = "phpdocumentor-reflection-docblock-94fd0001232e47129dd3504189fa1c7225010d08";
812 src = fetchurl {
813 url = https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08;
814 sha256 = "03zvxqb5n9ddvysj8mjdwf59h7sagj5x5z15nhs7mqpcky1w388x";
815 };
816 };
817 };
818 "phpdocumentor/type-resolver" = {
819 targetDir = "";
820 src = composerEnv.buildZipPackage {
821 name = "phpdocumentor-type-resolver-9c977708995954784726e25d0cd1dddf4e65b0f7";
822 src = fetchurl {
823 url = https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7;
824 sha256 = "0h888r2iy2290yp9i3fij8wd5b7960yi7yn1rwh26x1xxd83n2mb";
825 };
826 };
827 };
828 "phpspec/prophecy" = {
829 targetDir = "";
830 src = composerEnv.buildZipPackage {
831 name = "phpspec-prophecy-4ba436b55987b4bf311cb7c6ba82aa528aac0a06";
832 src = fetchurl {
833 url = https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06;
834 sha256 = "0sz9fg8r4yvpgrhsh6qaic3p89pafdj8bdf4izbcccq6mdhclxn6";
835 };
836 };
837 };
838 "phpunit/php-code-coverage" = {
839 targetDir = "";
840 src = composerEnv.buildZipPackage {
841 name = "phpunit-php-code-coverage-eabf68b476ac7d0f73793aada060f1c1a9bf8979";
842 src = fetchurl {
843 url = https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979;
844 sha256 = "0xfkf2kaqrid0ajr8qfh3qnpiqqddl0cmmdy6hd7l9y7ziy6qz8d";
845 };
846 };
847 };
848 "phpunit/php-file-iterator" = {
849 targetDir = "";
850 src = composerEnv.buildZipPackage {
851 name = "phpunit-php-file-iterator-730b01bc3e867237eaac355e06a36b85dd93a8b4";
852 src = fetchurl {
853 url = https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4;
854 sha256 = "0kbg907g9hrx7pv8v0wnf4ifqywdgvigq6y6z00lyhgd0b8is060";
855 };
856 };
857 };
858 "phpunit/php-text-template" = {
859 targetDir = "";
860 src = composerEnv.buildZipPackage {
861 name = "phpunit-php-text-template-31f8b717e51d9a2afca6c9f046f5d69fc27c8686";
862 src = fetchurl {
863 url = https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686;
864 sha256 = "1y03m38qqvsbvyakd72v4dram81dw3swyn5jpss153i5nmqr4p76";
865 };
866 };
867 };
868 "phpunit/php-timer" = {
869 targetDir = "";
870 src = composerEnv.buildZipPackage {
871 name = "phpunit-php-timer-3dcf38ca72b158baf0bc245e9184d3fdffa9c46f";
872 src = fetchurl {
873 url = https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f;
874 sha256 = "1j04r0hqzrv6m1jk5nb92k2nnana72nscqpfk3rgv3fzrrv69ljr";
875 };
876 };
877 };
878 "phpunit/php-token-stream" = {
879 targetDir = "";
880 src = composerEnv.buildZipPackage {
881 name = "phpunit-php-token-stream-1ce90ba27c42e4e44e6d8458241466380b51fa16";
882 src = fetchurl {
883 url = https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16;
884 sha256 = "0j1v83m268cddhyzi8qvqfzhpz12hrm3dyw6skyqvljdp7l9x6lk";
885 };
886 };
887 };
888 "phpunit/phpunit" = {
889 targetDir = "";
890 src = composerEnv.buildZipPackage {
891 name = "phpunit-phpunit-46023de9a91eec7dfb06cc56cb4e260017298517";
892 src = fetchurl {
893 url = https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517;
894 sha256 = "0mxhgcmc575hw3n7czindgqiha8jhdi4p19h883vf15fg6xf5iv6";
895 };
896 };
897 };
898 "phpunit/phpunit-mock-objects" = {
899 targetDir = "";
900 src = composerEnv.buildZipPackage {
901 name = "phpunit-phpunit-mock-objects-ac8e7a3db35738d56ee9a76e78a4e03d97628983";
902 src = fetchurl {
903 url = https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983;
904 sha256 = "0s7nyyafdqw2hp7wsd2mxnjxpk26630vv3wii6hcdb0q8xy8r78i";
905 };
906 };
907 };
908 "sebastian/comparator" = {
909 targetDir = "";
910 src = composerEnv.buildZipPackage {
911 name = "sebastian-comparator-2b7424b55f5047b47ac6e5ccb20b2aea4011d9be";
912 src = fetchurl {
913 url = https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be;
914 sha256 = "0ymarxgnr8b3iy0w18h5z13iiv0ja17vjryryzfcwlqqhlc6w7iq";
915 };
916 };
917 };
918 "sebastian/diff" = {
919 targetDir = "";
920 src = composerEnv.buildZipPackage {
921 name = "sebastian-diff-7f066a26a962dbe58ddea9f72a4e82874a3975a4";
922 src = fetchurl {
923 url = https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4;
924 sha256 = "1ppx21vjj79z6d584ryq451k7kvdc511awmqjkj9g4vxj1s1h3j6";
925 };
926 };
927 };
928 "sebastian/environment" = {
929 targetDir = "";
930 src = composerEnv.buildZipPackage {
931 name = "sebastian-environment-be2c607e43ce4c89ecd60e75c6a85c126e754aea";
932 src = fetchurl {
933 url = https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea;
934 sha256 = "0gzgnk847kf18krq4ybbi2knzj7i0kdghsdlj6qynzzrlf7idij0";
935 };
936 };
937 };
938 "sebastian/exporter" = {
939 targetDir = "";
940 src = composerEnv.buildZipPackage {
941 name = "sebastian-exporter-42c4c2eec485ee3e159ec9884f95b431287edde4";
942 src = fetchurl {
943 url = https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4;
944 sha256 = "1p5mc4lqwxn79v06jjlgqxynblywcxw2mkhbf6r4jlz0bsrqafxn";
945 };
946 };
947 };
948 "sebastian/global-state" = {
949 targetDir = "";
950 src = composerEnv.buildZipPackage {
951 name = "sebastian-global-state-bc37d50fea7d017d3d340f230811c9f1d7280af4";
952 src = fetchurl {
953 url = https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4;
954 sha256 = "0y1x16mf9q38s7rlc7k2s6sxn2ccxmyk1q5zgh24hr4yp035f0pb";
955 };
956 };
957 };
958 "sebastian/recursion-context" = {
959 targetDir = "";
960 src = composerEnv.buildZipPackage {
961 name = "sebastian-recursion-context-b19cc3298482a335a95f3016d2f8a6950f0fbcd7";
962 src = fetchurl {
963 url = https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7;
964 sha256 = "1i9xdv55nkg1yy5q4lmpq1jsjif69hjrwmr1zha6b5qjf6ivlvjm";
965 };
966 };
967 };
968 "sebastian/version" = {
969 targetDir = "";
970 src = composerEnv.buildZipPackage {
971 name = "sebastian-version-58b3a85e7999757d6ad81c787a1fbf5ff6c628c6";
972 src = fetchurl {
973 url = https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6;
974 sha256 = "1s71b6ss29pcsm0120myriwnzla1kpj13f3f739c7k1wfm69h4wz";
975 };
976 };
977 };
978 "sensio/generator-bundle" = {
979 targetDir = "";
980 src = composerEnv.buildZipPackage {
981 name = "sensio-generator-bundle-28cbaa244bd0816fd8908b93f90380bcd7b67a65";
982 src = fetchurl {
983 url = https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65;
984 sha256 = "1j09y037xk843q8gcyfmwgy6dmn0h67pd5jnsvhj08h92ssbl0c3";
985 };
986 };
987 };
988 "symfony/phpunit-bridge" = {
989 targetDir = "";
990 src = composerEnv.buildZipPackage {
991 name = "symfony-phpunit-bridge-2155067dfc73e0e77dbc26f236af17e4df552de5";
992 src = fetchurl {
993 url = https://api.github.com/repos/symfony/phpunit-bridge/zipball/2155067dfc73e0e77dbc26f236af17e4df552de5;
994 sha256 = "1fhqyhvns69pkv086d1sp918bakqq9pk9d16nzck2s4pfdf097pj";
995 };
996 };
997 };
998 "webmozart/assert" = {
999 targetDir = "";
1000 src = composerEnv.buildZipPackage {
1001 name = "webmozart-assert-83e253c8e0be5b0257b881e1827274667c5c17a9";
1002 src = fetchurl {
1003 url = https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9;
1004 sha256 = "04w7rrjy43k93376an7xhnxqn2ibbw5fra7rqky7j1dl1f0hkn6d";
1005 };
1006 };
1007 };
1008 };
1009}
diff --git a/modules/private/websites/piedsjaloux/integration.nix b/modules/private/websites/piedsjaloux/integration.nix
deleted file mode 100644
index 3502964..0000000
--- a/modules/private/websites/piedsjaloux/integration.nix
+++ /dev/null
@@ -1,135 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 secrets = config.myEnv.websites.piedsjaloux.integration;
4 webRoot = "/var/lib/ftp/immae/piedsjaloux/web";
5 cfg = config.myServices.websites.piedsjaloux.integration;
6 pcfg = config.services.phpApplication;
7 texlive = pkgs.texlive.combine { inherit (pkgs.texlive) attachfile preprint scheme-small; };
8in {
9 options.myServices.websites.piedsjaloux.integration.enable = lib.mkEnableOption "enable PiedsJaloux's website in integration";
10
11 config = lib.mkIf cfg.enable {
12 services.phpApplication.apps.piedsjaloux_integration = {
13 websiteEnv = "integration";
14 httpdUser = config.services.httpd.Inte.user;
15 httpdGroup = config.services.httpd.Inte.group;
16 inherit webRoot;
17 varDir = "/var/lib/ftp/immae/piedsjaloux_var";
18 varDirPaths = {
19 "tmp" = "0700";
20 };
21 app = "/var/lib/ftp/immae/piedsjaloux";
22 serviceDeps = [ "mysql.service" ];
23 preStartActions = [
24 "./bin/console --env=dev cache:clear --no-warmup"
25 ];
26 phpOpenbasedir = [ "/tmp" ];
27 phpPool = {
28 "php_admin_value[upload_max_filesize]" = "20M";
29 "php_admin_value[post_max_size]" = "20M";
30 #"php_admin_flag[log_errors]" = "on";
31 "pm" = "ondemand";
32 "pm.max_children" = "5";
33 "pm.process_idle_timeout" = "60";
34 };
35 phpEnv = {
36 PATH = lib.makeBinPath [
37 pkgs.apg pkgs.unzip
38 # below ones don't need to be in the PATH but they’re used in
39 # secrets
40 pkgs.imagemagick texlive
41 ];
42 SYMFONY_DEBUG_MODE = "\"yes\"";
43 };
44 phpWatchFiles = [
45 config.secrets.fullPaths."websites/piedsjaloux/integration"
46 ];
47 phpPackage = pkgs.php72;
48 };
49
50 secrets.keys."websites/piedsjaloux/integration" = {
51 user = config.services.httpd.Inte.user;
52 group = config.services.httpd.Inte.group;
53 permissions = "0400";
54 text = ''
55 # This file is auto-generated during the composer install
56 parameters:
57 database_host: ${secrets.mysql.host}
58 database_port: ${secrets.mysql.port}
59 database_name: ${secrets.mysql.database}
60 database_user: ${secrets.mysql.user}
61 database_password: ${secrets.mysql.password}
62 database_server_version: ${pkgs.mariadb.mysqlVersion}
63 mailer_transport: smtp
64 mailer_host: 127.0.0.1
65 mailer_user: null
66 mailer_password: null
67 secret: ${secrets.secret}
68 pdflatex: "${texlive}/bin/pdflatex"
69 leapt_im:
70 binary_path: ${pkgs.imagemagick}/bin
71 '';
72 };
73
74 services.websites.env.integration.vhostConfs.piedsjaloux_integration = {
75 certName = "integration";
76 addToCerts = true;
77 hosts = [ "test.pj.immae.dev" ];
78 root = webRoot;
79 extraConfig = [
80 ''
81 <FilesMatch "\.php$">
82 SetHandler "proxy:unix:${pcfg.phpListenPaths.piedsjaloux_integration}|fcgi://localhost"
83 </FilesMatch>
84
85 <Location />
86 Use LDAPConnect
87 Require ldap-group cn=pj.immae.dev,cn=httpd,ou=services,dc=immae,dc=eu
88 ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=https://piedsjaloux.fr\"></html>"
89 </Location>
90
91 <Directory ${webRoot}>
92 Options Indexes FollowSymLinks MultiViews Includes
93 AllowOverride None
94 Require all granted
95
96 DirectoryIndex app_dev.php
97
98 <IfModule mod_negotiation.c>
99 Options -MultiViews
100 </IfModule>
101
102 <IfModule mod_rewrite.c>
103 RewriteEngine On
104
105 RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
106 RewriteRule ^(.*) - [E=BASE:%1]
107
108 # Maintenance script
109 RewriteCond %{DOCUMENT_ROOT}/maintenance.php -f
110 RewriteCond %{SCRIPT_FILENAME} !maintenance.php
111 RewriteRule ^.*$ %{ENV:BASE}/maintenance.php [R=503,L]
112 ErrorDocument 503 /maintenance.php
113
114 # Sets the HTTP_AUTHORIZATION header removed by Apache
115 RewriteCond %{HTTP:Authorization} .
116 RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
117
118 RewriteCond %{ENV:REDIRECT_STATUS} ^$
119 RewriteRule ^app_dev\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
120
121 # If the requested filename exists, simply serve it.
122 # We only want to let Apache serve files and not directories.
123 RewriteCond %{REQUEST_FILENAME} -f
124 RewriteRule ^ - [L]
125
126 # Rewrite all other queries to the front controller.
127 RewriteRule ^ %{ENV:BASE}/app_dev.php [L]
128 </IfModule>
129
130 </Directory>
131 ''
132 ];
133 };
134 };
135}
diff --git a/modules/private/websites/piedsjaloux/production.nix b/modules/private/websites/piedsjaloux/production.nix
deleted file mode 100644
index 422c7f0..0000000
--- a/modules/private/websites/piedsjaloux/production.nix
+++ /dev/null
@@ -1,106 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 secrets = config.myEnv.websites.piedsjaloux.production;
4 app = pkgs.callPackage ./app {
5 composerEnv = pkgs.composerEnv.override { php = pkgs.php72; };
6 environment = secrets.environment;
7 varDir = "/var/lib/piedsjaloux_production";
8 secretsPath = config.secrets.fullPaths."websites/piedsjaloux/production";
9 };
10 cfg = config.myServices.websites.piedsjaloux.production;
11 pcfg = config.services.phpApplication;
12 texlive = pkgs.texlive.combine { inherit (pkgs.texlive) attachfile preprint scheme-small; };
13in {
14 options.myServices.websites.piedsjaloux.production.enable = lib.mkEnableOption "enable PiedsJaloux's website in production";
15
16 config = lib.mkIf cfg.enable {
17 services.webstats.sites = [ { name = "piedsjaloux.fr"; } ];
18 services.phpApplication.apps.piedsjaloux_production = {
19 websiteEnv = "production";
20 httpdUser = config.services.httpd.Prod.user;
21 httpdGroup = config.services.httpd.Prod.group;
22 inherit (app) webRoot varDir;
23 varDirPaths = {
24 "tmp" = "0700";
25 };
26 inherit app;
27 serviceDeps = [ "mysql.service" ];
28 preStartActions = [
29 "./bin/console --env=${app.environment} cache:clear --no-warmup"
30 ];
31 phpOpenbasedir = [ "/tmp" ];
32 phpPool = {
33 "php_admin_value[upload_max_filesize]" = "20M";
34 "php_admin_value[post_max_size]" = "20M";
35 #"php_admin_flag[log_errors]" = "on";
36 "pm" = "dynamic";
37 "pm.max_children" = "20";
38 "pm.start_servers" = "2";
39 "pm.min_spare_servers" = "1";
40 "pm.max_spare_servers" = "3";
41 };
42 phpEnv = {
43 PATH = lib.makeBinPath [
44 pkgs.apg pkgs.unzip
45 # below ones don't need to be in the PATH but they’re used in
46 # secrets
47 pkgs.imagemagick texlive
48 ];
49 };
50 phpWatchFiles = [
51 app.secretsPath
52 ];
53 phpPackage = pkgs.php72;
54 };
55
56 secrets.keys."websites/piedsjaloux/production" = {
57 user = config.services.httpd.Prod.user;
58 group = config.services.httpd.Prod.group;
59 permissions = "0400";
60 text = ''
61 # This file is auto-generated during the composer install
62 parameters:
63 database_host: ${secrets.mysql.host}
64 database_port: ${secrets.mysql.port}
65 database_name: ${secrets.mysql.database}
66 database_user: ${secrets.mysql.user}
67 database_password: ${secrets.mysql.password}
68 database_server_version: ${pkgs.mariadb.mysqlVersion}
69 mailer_transport: smtp
70 mailer_host: 127.0.0.1
71 mailer_user: null
72 mailer_password: null
73 secret: ${secrets.secret}
74 pdflatex: "${texlive}/bin/pdflatex"
75 leapt_im:
76 binary_path: ${pkgs.imagemagick}/bin
77 '';
78 };
79
80 services.websites.env.production.vhostConfs.piedsjaloux_production = {
81 certName = "piedsjaloux";
82 certMainHost = "piedsjaloux.fr";
83 hosts = [ "piedsjaloux.fr" "www.piedsjaloux.fr" ];
84 root = app.webRoot;
85 extraConfig = [
86 ''
87 RewriteEngine on
88 RewriteCond "%{HTTP_HOST}" "!^www.piedsjaloux\.fr$" [NC]
89 RewriteRule ^(.+)$ https://www.piedsjaloux.fr$1 [R=302,L]
90
91 <FilesMatch "\.php$">
92 SetHandler "proxy:unix:${pcfg.phpListenPaths.piedsjaloux_production}|fcgi://localhost"
93 </FilesMatch>
94
95 Use Stats piedsjaloux.fr
96
97 <Directory ${app.webRoot}>
98 Options Indexes FollowSymLinks MultiViews Includes
99 AllowOverride All
100 Require all granted
101 </Directory>
102 ''
103 ];
104 };
105 };
106}
diff --git a/modules/private/websites/ressourcerie_banon/cloud.nix b/modules/private/websites/ressourcerie_banon/cloud.nix
deleted file mode 100644
index 5179218..0000000
--- a/modules/private/websites/ressourcerie_banon/cloud.nix
+++ /dev/null
@@ -1,20 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.ressourcerie_banon.cloud;
4 nextcloud = config.myServices.tools.cloud.farm.package;
5in {
6 options.myServices.websites.ressourcerie_banon.cloud.enable = lib.mkEnableOption "enable Ressourcerie Banon’s cloud";
7
8 config = lib.mkIf cfg.enable {
9 myServices.tools.cloud.farm.instances = [ "ressourcerie_banon" ];
10 services.websites.env.production.modules = [ "proxy_fcgi" ];
11 services.websites.env.production.vhostConfs.ressourcerie_banon_cloud = {
12 certName = "ressourcerie_banon";
13 addToCerts = true;
14 hosts = ["cloud.le-garage-autonome.org"];
15 root = nextcloud;
16 extraConfig = [ config.myServices.tools.cloud.farm.vhosts.ressourcerie_banon ];
17 };
18 };
19}
20
diff --git a/modules/private/websites/ressourcerie_banon/cryptpad.nix b/modules/private/websites/ressourcerie_banon/cryptpad.nix
deleted file mode 100644
index 7aea728..0000000
--- a/modules/private/websites/ressourcerie_banon/cryptpad.nix
+++ /dev/null
@@ -1,49 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.ressourcerie_banon.cryptpad;
4 envCfg = config.myEnv.tools.cryptpad.ressourcerie_banon;
5 port = envCfg.port;
6 configFile = pkgs.writeText "config.js" ''
7 // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js
8 module.exports = {
9 httpUnsafeOrigin: 'https://${domain}',
10 httpPort: ${toString port},
11 adminEmail: '${envCfg.email}',
12 filePath: './datastore/',
13 archivePath: './data/archive',
14 pinPath: './data/pins',
15 taskPath: './data/tasks',
16 blockPath: './block',
17 blobPath: './blob',
18 blobStagingPath: './data/blobstage',
19 decreePath: './data/decrees',
20 logPath: './data/logs',
21 logToStdout: false,
22 logLevel: 'info',
23 logFeedback: false,
24 verbose: false,
25 inactiveTime: false,
26 adminKeys: ${builtins.toJSON envCfg.admins},
27 };
28 '';
29 domain = "pad.le-garage-autonome.org";
30in {
31 options.myServices.websites.ressourcerie_banon.cryptpad.enable = lib.mkEnableOption "Enable Ressourcerie Banon’s cryptpad";
32
33 config = lib.mkIf cfg.enable {
34 myServices.tools.cryptpad.farm.hosts.ressourcerie_banon = {
35 inherit domain port;
36 config = configFile;
37 };
38 services.websites.env.production.modules = [ "proxy_wstunnel" ];
39 services.websites.env.production.vhostConfs.ressourcerie_banon_cryptpad = {
40 certName = "ressourcerie_banon";
41 addToCerts = true;
42 hosts = [domain];
43 root = config.myServices.tools.cryptpad.farm.vhostRoots.ressourcerie_banon;
44 extraConfig = [
45 config.myServices.tools.cryptpad.farm.vhosts.ressourcerie_banon
46 ];
47 };
48 };
49}
diff --git a/modules/private/websites/ressourcerie_banon/production.nix b/modules/private/websites/ressourcerie_banon/production.nix
deleted file mode 100644
index fa00d92..0000000
--- a/modules/private/websites/ressourcerie_banon/production.nix
+++ /dev/null
@@ -1,70 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.ressourcerie_banon.production;
4 varDir = "/var/lib/ftp/ressourcerie_banon";
5 apacheUser = config.services.httpd.Prod.user;
6 apacheGroup = config.services.httpd.Prod.group;
7in {
8 options.myServices.websites.ressourcerie_banon.production.enable = lib.mkEnableOption "enable Ressourcerie Banon's website";
9
10 config = lib.mkIf cfg.enable {
11 services.webstats.sites = [ { name = "ressourcerie-banon.org"; } ];
12
13 system.activationScripts.ressourcerie_banon = {
14 deps = [ "httpd" ];
15 text = ''
16 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/ressourcerie_banon
17 '';
18 };
19 systemd.services.phpfpm-ressourcerie_banon.after = lib.mkAfter [ "mysql.service" ];
20 systemd.services.phpfpm-ressourcerie_banon.wants = [ "mysql.service" ];
21 services.phpfpm.pools.ressourcerie_banon = {
22 user = apacheUser;
23 group = apacheGroup;
24 settings = {
25 "listen.owner" = apacheUser;
26 "listen.group" = apacheGroup;
27
28 "pm" = "ondemand";
29 "pm.max_children" = "5";
30 "pm.process_idle_timeout" = "60";
31
32 "php_admin_value[open_basedir]" = "/var/lib/php/sessions/ressourcerie_banon:${varDir}:/tmp";
33 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/ressourcerie_banon";
34 };
35 phpOptions = config.services.phpfpm.phpOptions + ''
36 disable_functions = "mail"
37 '';
38 phpPackage = pkgs.php72;
39 };
40 services.websites.env.production.modules = [ "proxy_fcgi" ];
41 services.websites.env.production.vhostConfs.ressourcerie_banon = {
42 certName = "ressourcerie_banon";
43 certMainHost = "ressourcerie-banon.org";
44 hosts = ["ressourcerie-banon.org" "www.ressourcerie-banon.org" "ressourcerie-sault.org" "www.ressourcerie-sault.org" "le-garage-autonome.org"
45 "www.le-garage-autonome.org"];
46 root = varDir;
47 extraConfig = [
48 ''
49 Use Stats ressourcerie-banon.org
50
51 RewriteEngine on
52 RewriteCond "%{HTTP_HOST}" "!^ressourcerie-banon\.org$" [NC]
53 RewriteRule ^(.+)$ https://ressourcerie-banon.org$1 [R=302,L]
54
55 <FilesMatch "\.php$">
56 SetHandler "proxy:unix:${config.services.phpfpm.pools.ressourcerie_banon.socket}|fcgi://localhost"
57 </FilesMatch>
58
59 <Directory ${varDir}>
60 DirectoryIndex index.php index.htm index.html
61 Options Indexes FollowSymLinks MultiViews Includes
62 AllowOverride all
63 Require all granted
64 </Directory>
65 ''
66 ];
67 };
68 };
69}
70
diff --git a/modules/private/websites/richie/production.nix b/modules/private/websites/richie/production.nix
deleted file mode 100644
index a548cff..0000000
--- a/modules/private/websites/richie/production.nix
+++ /dev/null
@@ -1,106 +0,0 @@
1{ lib, config, pkgs, ... }:
2let
3 cfg = config.myServices.websites.richie.production;
4 vardir = "/var/lib/richie_production";
5 richieSrc = pkgs.stdenv.mkDerivation rec {
6 version = pkgs.sources.websites-richie-app.version;
7 pname = "richie";
8 name = "${pname}-${version}";
9 src = pkgs.sources.websites-richie-app;
10 phases = "installPhase";
11 installPhase = ''
12 cp -a $src $out
13 chmod -R u+w $out
14 ln -sf ${vardir}/files $out/
15 ln -sf ${vardir}/drapeaux $out/images/
16 ln -sf ${vardir}/photos $out/
17 sed -i "s@localedef --list-archive@localedef --list-archive /run/current-system/sw/lib/locale/locale-archive@" $out/admin/parametres.php
18 '';
19 };
20 secretPath = config.secrets.fullPaths."websites/richie/production";
21 apacheUser = config.services.httpd.Prod.user;
22 apacheGroup = config.services.httpd.Prod.group;
23in
24{
25 options.myServices.websites.richie.production.enable = lib.mkEnableOption "enable Richie's website";
26 config = lib.mkIf cfg.enable {
27 services.webstats.sites = [ { name = "europe-richie.org"; } ];
28
29 secrets.keys."websites/richie/production" = {
30 user = apacheUser;
31 group = apacheGroup;
32 permissions = "0400";
33 text = with config.myEnv.websites.richie; ''
34 <?php
35
36 $hote_sql = '${mysql.host}';
37 $login_sql = '${mysql.user}';
38 $bdd_sql = '${mysql.database}';
39 $mdp_sql = '${mysql.password}';
40
41 $db = mysqli_connect($hote_sql,$login_sql,$mdp_sql);
42 unset($mdp_sql);
43
44 $smtp_mailer->Auth('${smtp_mailer.user}', '${smtp_mailer.password}');
45 ?>
46 '';
47 };
48 system.activationScripts.richie_production = {
49 deps = [ "httpd" ];
50 text = ''
51 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/richie_production
52 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${vardir}
53 '';
54 };
55 services.phpfpm.pools.richie_production = {
56 user = apacheUser;
57 group = apacheGroup;
58 settings = {
59 "listen.owner" = apacheUser;
60 "listen.group" = apacheGroup;
61
62 "pm" = "ondemand";
63 "pm.max_children" = "5";
64 "pm.process_idle_timeout" = "60";
65
66 "php_admin_value[open_basedir]" = "${vardir}:/var/lib/php/sessions/richie_production:${secretPath}:${richieSrc}:/tmp";
67 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/richie_production";
68 };
69 phpEnv = {
70 PATH = "/run/current-system/sw/bin:${lib.makeBinPath [ pkgs.imagemagick ]}";
71 BDD_CONNECT = secretPath;
72 };
73 phpOptions = config.services.phpfpm.phpOptions + ''
74 date.timezone = 'Europe/Paris'
75 '';
76 phpPackage = pkgs.php72;
77 };
78 services.websites.env.production.modules = [ "proxy_fcgi" ];
79 services.websites.env.production.vhostConfs.richie_production = {
80 certName = "richie";
81 addToCerts = true;
82 certMainHost = "europe-richie.org";
83 hosts = [ "europe-richie.org" "www.europe-richie.org" ];
84 root = richieSrc;
85 extraConfig = [
86 ''
87 Use Stats europe-richie.org
88 ErrorDocument 404 /404.html
89 <LocationMatch "^/files/.*/admin/">
90 Require all denied
91 </LocationMatch>
92 <Directory ${richieSrc}>
93 DirectoryIndex index.php index.htm index.html
94 Options Indexes FollowSymLinks MultiViews Includes
95 AllowOverride None
96 Require all granted
97
98 <FilesMatch "\.php$">
99 SetHandler "proxy:unix:${config.services.phpfpm.pools.richie_production.socket}|fcgi://localhost"
100 </FilesMatch>
101 </Directory>
102 ''
103 ];
104 };
105 };
106}
diff --git a/modules/private/websites/syden/peertube.nix b/modules/private/websites/syden/peertube.nix
deleted file mode 100644
index 64d4a5d..0000000
--- a/modules/private/websites/syden/peertube.nix
+++ /dev/null
@@ -1,132 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 scfg = config.myServices.websites.syden.peertube;
4 name = "peertube";
5 dataDir = "/var/lib/syden_peertube";
6 package = (pkgs.mylibs.flakeCompat ../../../../flakes/private/peertube).packages.x86_64-linux.peertube_syden;
7 env = config.myEnv.tools.syden_peertube;
8in
9{
10 options.myServices.websites.syden.peertube.enable = lib.mkEnableOption "enable Syden's website";
11
12 config = lib.mkIf scfg.enable {
13 users.users.peertube = {
14 uid = config.ids.uids.peertube;
15 group = "peertube";
16 description = "Peertube user";
17 useDefaultShell = true;
18 extraGroups = [ "keys" ];
19 };
20 users.groups.peertube.gid = config.ids.gids.peertube;
21
22 secrets.keys."websites/syden/peertube" = {
23 user = "peertube";
24 group = "peertube";
25 permissions = "0640";
26 text = ''
27 listen:
28 hostname: 'localhost'
29 port: ${toString env.listenPort}
30 webserver:
31 https: true
32 hostname: 'record-links.immae.eu'
33 port: 443
34 database:
35 hostname: '${env.postgresql.socket}'
36 port: 5432
37 suffix: '_syden'
38 username: '${env.postgresql.user}'
39 password: '${env.postgresql.password}'
40 pool:
41 max: 5
42 redis:
43 socket: '${env.redis.socket}'
44 auth: null
45 db: ${env.redis.db}
46 smtp:
47 transport: sendmail
48 sendmail: '/run/wrappers/bin/sendmail'
49 from_address: 'peertube@tools.immae.eu'
50 storage:
51 tmp: '${dataDir}/storage/tmp/'
52 avatars: '${dataDir}/storage/avatars/'
53 videos: '${dataDir}/storage/videos/'
54 streaming_playlists: '${dataDir}/storage/streaming-playlists/'
55 redundancy: '${dataDir}/storage/videos/'
56 logs: '${dataDir}/storage/logs/'
57 previews: '${dataDir}/storage/previews/'
58 thumbnails: '${dataDir}/storage/thumbnails/'
59 torrents: '${dataDir}/storage/torrents/'
60 captions: '${dataDir}/storage/captions/'
61 cache: '${dataDir}/storage/cache/'
62 plugins: '${dataDir}/storage/plugins/'
63 client_overrides: '${dataDir}/storage/client-overrides/'
64 '';
65 };
66
67 services.filesWatcher.syden_peertube = {
68 restart = true;
69 paths = [ config.secrets.fullPaths."websites/syden/peertube" ];
70 };
71
72 systemd.services.syden_peertube = {
73 description = "Peertube";
74 wantedBy = [ "multi-user.target" ];
75 after = [ "network.target" "postgresql.service" ];
76 wants = [ "postgresql.service" ];
77
78 environment.NODE_CONFIG_DIR = "${dataDir}/config";
79 environment.NODE_ENV = "production";
80 environment.HOME = package;
81
82 path = [ pkgs.nodejs pkgs.bashInteractive pkgs.ffmpeg pkgs.openssl ];
83
84 script = ''
85 install -m 0750 -d ${dataDir}/config
86 ln -sf ${config.secrets.fullPaths."websites/syden/peertube"} ${dataDir}/config/production.yaml
87 ln -sf ${package}/config/default.yaml ${dataDir}/config/default.yaml
88 exec npm run start
89 '';
90
91 serviceConfig = {
92 User = "peertube";
93 Group = "peertube";
94 WorkingDirectory = package;
95 StateDirectory = "syden_peertube";
96 StateDirectoryMode = 0750;
97 PrivateTmp = true;
98 ProtectHome = true;
99 ProtectControlGroups = true;
100 Restart = "always";
101 Type = "simple";
102 TimeoutSec = 60;
103 };
104
105 unitConfig.RequiresMountsFor = dataDir;
106 };
107
108 services.websites.env.production.vhostConfs.syden_peertube = {
109 certName = "syden";
110 addToCerts = true;
111 certMainHost = "record-links.immae.eu";
112 hosts = [ "record-links.immae.eu" ];
113 root = null;
114 extraConfig = [ ''
115 RewriteEngine On
116
117 RewriteCond %{REQUEST_URI} ^/socket.io [NC]
118 RewriteCond %{QUERY_STRING} transport=websocket [NC]
119 RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L]
120
121 RewriteCond %{REQUEST_URI} ^/tracker/socket [NC]
122 RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L]
123
124 ProxyPass / http://localhost:${toString env.listenPort}/
125 ProxyPassReverse / http://localhost:${toString env.listenPort}/
126
127 ProxyPreserveHost On
128 RequestHeader set X-Real-IP %{REMOTE_ADDR}s
129 '' ];
130 };
131 };
132}
diff --git a/modules/private/websites/telio_tortay/production.nix b/modules/private/websites/telio_tortay/production.nix
deleted file mode 100644
index 16eca74..0000000
--- a/modules/private/websites/telio_tortay/production.nix
+++ /dev/null
@@ -1,81 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 adminer = pkgs.callPackage ../commons/adminer.nix { inherit config; };
4 cfg = config.myServices.websites.telio_tortay.production;
5 varDir = "/var/lib/ftp/telio_tortay";
6 env = config.myEnv.websites.telio_tortay;
7 apacheUser = config.services.httpd.Prod.user;
8 apacheGroup = config.services.httpd.Prod.group;
9in {
10 options.myServices.websites.telio_tortay.production.enable = lib.mkEnableOption "enable Telio Tortay's website";
11
12 config = lib.mkIf cfg.enable {
13 services.webstats.sites = [ { name = "telio-tortay.immae.eu"; } ];
14
15 security.acme.certs."ftp".extraDomains."telio-tortay.immae.eu" = null;
16
17 system.activationScripts.telio_tortay = {
18 deps = [ "httpd" ];
19 text = ''
20 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/ftp/telio_tortay/logs
21 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/php/sessions/telio_tortay
22 '';
23 };
24 systemd.services.phpfpm-telio_tortay.after = lib.mkAfter [ "mysql.service" ];
25 systemd.services.phpfpm-telio_tortay.wants = [ "mysql.service" ];
26 services.phpfpm.pools.telio_tortay = {
27 user = apacheUser;
28 group = apacheGroup;
29 settings = {
30 "listen.owner" = apacheUser;
31 "listen.group" = apacheGroup;
32
33 "pm" = "ondemand";
34 "pm.max_children" = "5";
35 "pm.process_idle_timeout" = "60";
36
37 "php_admin_value[open_basedir]" = "/var/lib/php/sessions/telio_tortay:${varDir}:/tmp";
38 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/telio_tortay";
39 };
40 phpOptions = config.services.phpfpm.phpOptions + ''
41 disable_functions = "mail"
42 '';
43 phpPackage = pkgs.php72;
44 };
45 services.websites.env.production.modules = adminer.apache.modules ++ [ "proxy_fcgi" ];
46 services.websites.env.production.vhostConfs.telio_tortay = {
47 certName = "telio_tortay";
48 certMainHost = "telio-tortay.immae.eu";
49 hosts = ["telio-tortay.immae.eu" "realistesmedia.fr" "www.realistesmedia.fr" ];
50 root = varDir;
51 extraConfig = [
52 (adminer.apache.vhostConf null)
53 ''
54 Use Stats telio-tortay.immae.eu
55 ServerAdmin ${env.server_admin}
56 ErrorLog "${varDir}/logs/error_log"
57 CustomLog "${varDir}/logs/access_log" combined
58
59 <FilesMatch "\.php$">
60 SetHandler "proxy:unix:${config.services.phpfpm.pools.telio_tortay.socket}|fcgi://localhost"
61 </FilesMatch>
62
63 <Location /xmlrpc.php>
64 AllowOverride None
65 Require all denied
66 </Location>
67 <Directory ${varDir}/logs>
68 AllowOverride None
69 Require all denied
70 </Directory>
71 <Directory ${varDir}>
72 DirectoryIndex index.php index.htm index.html
73 Options Indexes FollowSymLinks MultiViews Includes
74 AllowOverride all
75 Require all granted
76 </Directory>
77 ''
78 ];
79 };
80 };
81}
diff --git a/modules/private/websites/tools/assets/default.nix b/modules/private/websites/tools/assets/default.nix
deleted file mode 100644
index 0eb476d..0000000
--- a/modules/private/websites/tools/assets/default.nix
+++ /dev/null
@@ -1,39 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.tools.assets;
4 assets_urls = lib.mapAttrs (k: v: pkgs.fetchurl v) config.myEnv.tools.assets;
5 assets = pkgs.runCommand "assets" {} (''
6 mkdir -p $out
7 cp -a ${./static}/* $out/
8 '' + builtins.concatStringsSep "\n"
9 (lib.mapAttrsToList (k: v: ''
10 install -D -m644 -T ${v} $out/${k}
11 '') assets_urls));
12in
13{
14 options.myServices.websites.tools.assets = {
15 enable = lib.mkEnableOption "Enable assets website";
16 };
17 config = lib.mkIf cfg.enable {
18 services.websites.env.tools.vhostConfs.assets = {
19 certName = "eldiron";
20 addToCerts = true;
21 hosts = [ "assets.immae.eu" ];
22 root = assets;
23 extraConfig = [
24 ''
25 Use Apaxy "${assets}" "title"
26 <Directory "${assets}">
27 Options Indexes FollowSymlinks
28 AllowOverride None
29 Require all granted
30 Header always set Last-Modified "Tue, 01 Jan 2020 00:00:00 GMT"
31 Header always set Cache-Control "public, max-age=31536000, immutable"
32 Header always set Access-Control-Allow-Origin "*"
33 Header always set Access-Control-Expose-Headers "*"
34 </Directory>
35 ''
36 ];
37 };
38 };
39}
diff --git a/modules/private/websites/tools/cloud/default.nix b/modules/private/websites/tools/cloud/default.nix
deleted file mode 100644
index 44163de..0000000
--- a/modules/private/websites/tools/cloud/default.nix
+++ /dev/null
@@ -1,184 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 nextcloud = pkgs.webapps.nextcloud.withApps (a: [
4 a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.contacts
5 a.cookbook a.deck a.extract a.files_markdown a.files_readmemd
6 a.flowupload a.gpxedit a.gpxpod a.keeweb a.maps a.metadata a.music
7 a.notes a.ocsms a.passman a.polls a.spreed a.tasks
8 ]);
9 env = config.myEnv.tools.nextcloud;
10 varDir = "/var/lib/nextcloud";
11 cfg = config.myServices.websites.tools.cloud;
12 phpFpm = rec {
13 basedir = builtins.concatStringsSep ":" ([ nextcloud varDir ] ++ nextcloud.apps);
14 pool = {
15 "listen.owner" = "wwwrun";
16 "listen.group" = "wwwrun";
17 "pm" = "ondemand";
18 "pm.max_children" = "60";
19 "pm.process_idle_timeout" = "60";
20
21 "php_admin_value[output_buffering]" = "0";
22 "php_admin_value[max_execution_time]" = "1800";
23 "php_admin_value[zend_extension]" = "opcache";
24 #already enabled by default?
25 #"php_value[opcache.enable]" = "1";
26 "php_value[opcache.enable_cli]" = "1";
27 "php_value[opcache.interned_strings_buffer]" = "8";
28 "php_value[opcache.max_accelerated_files]" = "10000";
29 "php_value[opcache.memory_consumption]" = "128";
30 "php_value[opcache.save_comments]" = "1";
31 "php_value[opcache.revalidate_freq]" = "1";
32 "php_admin_value[memory_limit]" = "512M";
33
34 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp";
35 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
36 };
37 };
38in {
39 options.myServices.websites.tools.cloud = {
40 enable = lib.mkEnableOption "enable cloud website";
41 };
42
43 config = lib.mkIf cfg.enable {
44 services.websites.env.tools.modules = [ "proxy_fcgi" ];
45
46 services.websites.env.tools.vhostConfs.cloud = {
47 certName = "eldiron";
48 addToCerts = true;
49 hosts = ["cloud.immae.eu" ];
50 root = nextcloud;
51 extraConfig = [
52 ''
53 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
54 <Directory ${nextcloud}>
55 AcceptPathInfo On
56 DirectoryIndex index.php
57 Options FollowSymlinks
58 Require all granted
59 AllowOverride all
60
61 <IfModule mod_headers.c>
62 Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
63 </IfModule>
64 <FilesMatch "\.php$">
65 CGIPassAuth on
66 SetHandler "proxy:unix:${config.services.phpfpm.pools.nextcloud.socket}|fcgi://localhost"
67 </FilesMatch>
68
69 </Directory>
70 ''
71 ];
72 };
73
74 secrets.keys."webapps/tools-nextcloud" = {
75 user = "wwwrun";
76 group = "wwwrun";
77 permissions = "0600";
78 # This file is not actually included, see activationScript below
79 text = ''
80 <?php
81 include('${nextcloud}/version.php');
82 $CONFIG = array (
83 // FIXME: change this value when nextcloud starts getting slow
84 'instanceid' => '${env.instance_id}',
85 'datadirectory' => '/var/lib/nextcloud/',
86 'passwordsalt' => '${env.password_salt}',
87 'debug' => false,
88 'dbtype' => 'pgsql',
89 'version' => implode($OC_Version, '.'),
90 'dbname' => '${env.postgresql.database}',
91 'dbhost' => '${env.postgresql.socket}',
92 'dbtableprefix' => 'oc_',
93 'dbuser' => '${env.postgresql.user}',
94 'dbpassword' => '${env.postgresql.password}',
95 'installed' => true,
96 'maxZipInputSize' => 0,
97 'allowZipDownload' => true,
98 'forcessl' => true,
99 'theme' => ${"''"},
100 'maintenance' => false,
101 'trusted_domains' =>
102 array (
103 0 => 'cloud.immae.eu',
104 ),
105 'secret' => '${env.secret}',
106 'appstoreenabled' => false,
107 'appstore.experimental.enabled' => true,
108 'loglevel' => 2,
109 'trashbin_retention_obligation' => 'auto',
110 'htaccess.RewriteBase' => '/',
111 'mail_smtpmode' => 'sendmail',
112 'mail_smtphost' => '127.0.0.1',
113 'mail_smtpname' => ''',
114 'mail_smtppassword' => ''',
115 'mail_from_address' => 'nextcloud',
116 'mail_smtpauth' => false,
117 'mail_domain' => 'tools.immae.eu',
118 'memcache.local' => '\\OC\\Memcache\\APCu',
119 'memcache.locking' => '\\OC\\Memcache\\Redis',
120 'filelocking.enabled' => true,
121 'redis' =>
122 array (
123 'host' => '${env.redis.socket}',
124 'port' => 0,
125 'dbindex' => ${env.redis.db},
126 ),
127 'overwrite.cli.url' => 'https://cloud.immae.eu',
128 'ldapIgnoreNamingRules' => false,
129 'ldapProviderFactory' => '\\OCA\\User_LDAP\\LDAPProviderFactory',
130 'has_rebuilt_cache' => true,
131 );
132 '';
133 };
134 users.users.root.packages = let
135 occ = pkgs.writeScriptBin "nextcloud-occ" ''
136 #! ${pkgs.stdenv.shell}
137 cd ${nextcloud}
138 NEXTCLOUD_CONFIG_DIR="${nextcloud}/config" \
139 exec \
140 sudo -E -u wwwrun ${pkgs.php74}/bin/php \
141 -c ${pkgs.php74}/etc/php.ini \
142 occ $*
143 '';
144 in [ occ ];
145
146 system.activationScripts.nextcloud = {
147 deps = [ "secrets" ];
148 text = let
149 confs = lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) nextcloud.otherConfig;
150 in
151 ''
152 install -m 0755 -o wwwrun -g wwwrun -d ${varDir}
153 install -m 0750 -o wwwrun -g wwwrun -d ${varDir}/phpSessions
154 ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: v:
155 "install -D -m 0644 -o wwwrun -g wwwrun -T ${v} ${varDir}/config/${n}.json"
156 ) confs)}
157 #install -D -m 0600 -o wwwrun -g wwwrun -T ${config.secrets.fullPaths."webapps/tools-nextcloud"} ${varDir}/config/config.php
158 '';
159 };
160
161 services.phpfpm.pools.nextcloud = {
162 user = "wwwrun";
163 group = "wwwrun";
164 settings = phpFpm.pool;
165 phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache ]);
166 };
167
168 services.cron = {
169 enable = true;
170 systemCronJobs = let
171 script = pkgs.writeScriptBin "nextcloud-cron" ''
172 #! ${pkgs.stdenv.shell}
173 export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive
174 export PATH=/run/wrappers/bin:$PATH
175 ${pkgs.php74}/bin/php -d memory_limit=2048M -f ${nextcloud}/cron.php
176 '';
177 in [
178 ''
179 */15 * * * * wwwrun ${script}/bin/nextcloud-cron
180 ''
181 ];
182 };
183 };
184}
diff --git a/modules/private/websites/tools/cloud/farm.nix b/modules/private/websites/tools/cloud/farm.nix
deleted file mode 100644
index 7be774c..0000000
--- a/modules/private/websites/tools/cloud/farm.nix
+++ /dev/null
@@ -1,123 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.tools.cloud.farm;
4 apacheUser = config.services.httpd.Prod.user;
5 apacheGroup = config.services.httpd.Prod.group;
6 nextcloud = (pkgs.webapps.nextcloud.override { varDir = null; }).withApps (a: [
7 a.apporder a.audioplayer a.bookmarks a.calendar a.carnet a.contacts
8 a.cookbook a.deck a.extract a.files_markdown a.files_readmemd
9 a.flowupload a.gpxedit a.gpxpod a.impersonate a.keeweb a.maps
10 a.metadata a.music a.notes a.ocsms a.passman a.polls a.spreed
11 a.tasks
12 ]);
13 toVardir = name: "/var/lib/nextcloud_farm/${name}";
14 varDirs = map toVardir cfg.instances;
15 phpBaseDir = builtins.concatStringsSep ":" ([ nextcloud ] ++ varDirs ++ nextcloud.apps);
16 toVhost = name: ''
17 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
18 SetEnv NEXTCLOUD_CONFIG_DIR "${toVardir name}"
19 <Directory ${nextcloud}>
20 AcceptPathInfo On
21 DirectoryIndex index.php
22 Options FollowSymlinks
23 Require all granted
24 AllowOverride all
25
26 <IfModule mod_headers.c>
27 Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
28 </IfModule>
29 <FilesMatch "\.php$">
30 CGIPassAuth on
31 SetHandler "proxy:unix:${config.services.phpfpm.pools.nextcloud_farm.socket}|fcgi://localhost"
32 </FilesMatch>
33
34 </Directory>
35 '';
36in
37{
38 options.myServices.tools.cloud.farm = {
39 instances = lib.mkOption {
40 description = "Instances names for the nextcloud Farm";
41 default = [];
42 type = lib.types.listOf lib.types.str;
43 };
44 vhosts = lib.mkOption {
45 description = "Instance vhosts configs";
46 readOnly = true;
47 type = lib.types.attrsOf lib.types.str;
48 default = lib.genAttrs cfg.instances toVhost;
49 };
50 package = lib.mkOption {
51 description = "Nextcloud derivation";
52 readOnly = true;
53 type = lib.types.package;
54 default = nextcloud;
55 };
56 };
57
58 config = lib.mkIf (builtins.length cfg.instances > 0) {
59 system.activationScripts.cloud_farm_vardirs = {
60 deps = [ "httpd" ];
61 text = ''
62 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${builtins.concatStringsSep " " varDirs}
63 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d /var/lib/nextcloud_farm/phpSessions
64 '';
65 };
66 systemd.services.phpfpm-nextcloud_farm.after = lib.mkAfter [ "postgresql.service" ];
67 systemd.services.phpfpm-nextcloud_farm.wants = [ "postgresql.service" ];
68 services.phpfpm.pools.nextcloud_farm = {
69 user = apacheUser;
70 group = apacheGroup;
71 settings = {
72 "listen.owner" = apacheUser;
73 "listen.group" = apacheGroup;
74 "pm" = "ondemand";
75 "pm.max_children" = "60";
76 "pm.process_idle_timeout" = "60";
77
78 "php_admin_value[output_buffering]" = "0";
79 "php_admin_value[max_execution_time]" = "1800";
80 "php_admin_value[zend_extension]" = "opcache";
81 #already enabled by default?
82 #"php_value[opcache.enable]" = "1";
83 "php_value[opcache.enable_cli]" = "1";
84 "php_value[opcache.interned_strings_buffer]" = "8";
85 "php_value[opcache.max_accelerated_files]" = "10000";
86 "php_value[opcache.memory_consumption]" = "128";
87 "php_value[opcache.save_comments]" = "1";
88 "php_value[opcache.revalidate_freq]" = "1";
89 "php_admin_value[memory_limit]" = "512M";
90
91 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${phpBaseDir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp";
92 "php_admin_value[session.save_path]" = "/var/lib/nextcloud_farm/phpSessions";
93 };
94 phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache ]);
95 };
96 users.users.root.packages = let
97 toOcc = name: pkgs.writeScriptBin "nextcloud-occ-${name}" ''
98 #! ${pkgs.stdenv.shell}
99 cd ${nextcloud}
100 NEXTCLOUD_CONFIG_DIR="${toVardir name}" \
101 exec \
102 sudo -E -u wwwrun ${pkgs.php74}/bin/php \
103 -c ${pkgs.php74}/etc/php.ini \
104 occ $*
105 '';
106 in map toOcc cfg.instances;
107 services.cron = {
108 enable = true;
109 systemCronJobs = let
110 toScript = name: pkgs.writeScriptBin "nextcloud-cron" ''
111 #! ${pkgs.stdenv.shell}
112 export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive
113 export PATH=/run/wrappers/bin:$PATH
114 export NEXTCLOUD_CONFIG_DIR="${toVardir name}"
115 ${pkgs.php74}/bin/php -d memory_limit=512M -f ${nextcloud}/cron.php
116 '';
117 toLine = name: ''
118 */15 * * * * wwwrun ${toScript name}/bin/nextcloud-cron
119 '';
120 in map toLine cfg.instances;
121 };
122 };
123}
diff --git a/modules/private/websites/tools/commento/default.nix b/modules/private/websites/tools/commento/default.nix
deleted file mode 100644
index c36255b..0000000
--- a/modules/private/websites/tools/commento/default.nix
+++ /dev/null
@@ -1,59 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.tools.commento;
4 env = config.myEnv.tools.commento;
5 webPort = "${host}:${port}";
6 port = toString env.listenPort;
7 host = "localhost";
8 postgresql_url = "postgres://${env.postgresql.user}:${env.postgresql.password}@localhost:${env.postgresql.port}/${env.postgresql.database}?sslmode=disable";
9in
10{
11 options.myServices.websites.tools.commento = {
12 enable = lib.mkEnableOption "Enable commento website";
13 };
14 config = lib.mkIf cfg.enable {
15 secrets.keys = {
16 "commento/env" = {
17 permissions = "0400";
18 text = ''
19 COMMENTO_ORIGIN=https://commento.immae.eu/
20 COMMENTO_PORT=${port}
21 COMMENTO_POSTGRES=${postgresql_url}
22 COMMENTO_FORBID_NEW_OWNERS=true
23 COMMENTO_BIND_ADDRESS=${host}
24 COMMENTO_GZIP_STATIC=true
25 COMMENTO_SMTP_HOST=${env.smtp.host}
26 COMMENTO_SMTP_PORT=${env.smtp.port}
27 COMMENTO_SMTP_USERNAME=${env.smtp.email}
28 COMMENTO_SMTP_PASSWORD=${env.smtp.password}
29 COMMENTO_SMTP_FROM_ADDRESS=${env.smtp.email}
30 '';
31 };
32 };
33
34 services.websites.env.tools.vhostConfs.commento = {
35 certName = "eldiron";
36 addToCerts = true;
37 hosts = [ "commento.immae.eu" ];
38 root = null;
39 extraConfig = [
40 ''
41 ProxyPass / http://${webPort}/
42 ProxyPassReverse / http://${webPort}/
43 ProxyPreserveHost On
44 ''
45 ];
46 };
47 systemd.services.commento = {
48 description = "Commento";
49 wantedBy = [ "multi-user.target" ];
50 requires = ["postgresql.service"];
51 after = ["network.target" "postgresql.service"];
52 serviceConfig = {
53 User = "wwwrun";
54 ExecStart = "${pkgs.commento}/commento";
55 EnvironmentFile = config.secrets.fullPaths."commento/env";
56 };
57 };
58 };
59}
diff --git a/modules/private/websites/tools/cryptpad/default.nix b/modules/private/websites/tools/cryptpad/default.nix
deleted file mode 100644
index 69b9877..0000000
--- a/modules/private/websites/tools/cryptpad/default.nix
+++ /dev/null
@@ -1,50 +0,0 @@
1{ config, pkgs, lib, ... }:
2let
3 cfg = config.myServices.websites.tools.cryptpad;
4 envCfg = config.myEnv.tools.cryptpad.immaeEu;
5 domain = "cryptpad.immae.eu";
6 port = envCfg.port;
7 configFile = pkgs.writeText "config.js" ''
8 // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js
9 module.exports = {
10 httpUnsafeOrigin: 'https://${domain}',
11 httpPort: ${toString port},
12 adminEmail: '${envCfg.email}',
13 filePath: './datastore/',
14 archivePath: './data/archive',
15 pinPath: './data/pins',
16 taskPath: './data/tasks',
17 blockPath: './block',
18 blobPath: './blob',
19 blobStagingPath: './data/blobstage',
20 decreePath: './data/decrees',
21 logPath: './data/logs',
22 logToStdout: false,
23 logLevel: 'info',
24 logFeedback: false,
25 verbose: false,
26 inactiveTime: false,
27 maxUploadSize: 100 * 1024 * 1024,
28 adminKeys: ${builtins.toJSON envCfg.admins},
29 };
30 '';
31in
32{
33 options.myServices.websites.tools.cryptpad.enable = lib.mkEnableOption "Enable Cryptpad";
34 config = lib.mkIf cfg.enable {
35 myServices.tools.cryptpad.farm.hosts.immaeEu = {
36 inherit domain port;
37 config = configFile;
38 };
39 services.websites.env.tools.modules = [ "proxy_wstunnel" ];
40 services.websites.env.tools.vhostConfs.cryptpad = {
41 certName = "eldiron";
42 addToCerts = true;
43 hosts = [domain];
44 root = config.myServices.tools.cryptpad.farm.vhostRoots.immaeEu;
45 extraConfig = [
46 config.myServices.tools.cryptpad.farm.vhosts.immaeEu
47 ];
48 };
49 };
50}
diff --git a/modules/private/websites/tools/cryptpad/farm.nix b/modules/private/websites/tools/cryptpad/farm.nix
deleted file mode 100644
index b35f348..0000000
--- a/modules/private/websites/tools/cryptpad/farm.nix
+++ /dev/null
@@ -1,180 +0,0 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.tools.cryptpad.farm;
4 toService = name:
5 let
6 inherit (cfg.hosts.${name}) package config;
7 in {
8 description = "Cryptpad ${name} Service";
9 wantedBy = [ "multi-user.target" ];
10 after = [ "networking.target" ];
11 serviceConfig = {
12 User = "cryptpad";
13 Group = "cryptpad";
14 Environment = [
15 "CRYPTPAD_CONFIG=${config}"
16 "HOME=%S/cryptpad/${name}"
17 ];
18 ExecStart = "${package}/bin/cryptpad";
19 PrivateTmp = true;
20 Restart = "always";
21 StateDirectory = "cryptpad/${name}";
22 WorkingDirectory = "%S/cryptpad/${name}";
23 };
24 };
25 toVhostRoot = name: "${cfg.hosts.${name}.package}/lib/node_modules/cryptpad";
26 toVhost = name:
27 let
28 inherit (cfg.hosts.${name}) package domain port;
29 api_domain = domain;
30 files_domain = domain;
31 in ''
32 RewriteEngine On
33
34 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
35 Header set X-XSS-Protection "1; mode=block"
36 Header set X-Content-Type-Options "nosniff"
37 Header set Access-Control-Allow-Origin "*"
38 Header set Permissions-Policy "interest-cohort=()"
39
40 Header set Cross-Origin-Resource-Policy "cross-origin"
41 <If "%{REQUEST_URI} =~ m#^/(sheet|presentation|doc)/.*$#">
42 Header set Cross-Origin-Opener-Policy "same-origin"
43 </If>
44 Header set Cross-Origin-Embedder-Policy "require-corp"
45
46 ErrorDocument 404 /customize.dist/404.html
47
48 <If "%{QUERY_STRING} =~ m#ver=.*?#">
49 Header set Cache-Control "max-age=31536000"
50 </If>
51 <If "%{REQUEST_URI} =~ m#^/.*(\/|\.html)$#">
52 Header set Cache-Control "no-cache"
53 </If>
54
55 SetEnv styleSrc "'unsafe-inline' 'self' ${domain}"
56 SetEnv connectSrc "'self' https://${domain} ${domain} https://${api_domain} blob: wss://${api_domain} ${api_domain} ${files_domain}"
57 SetEnv fontSrc "'self' data: ${domain}"
58 SetEnv imgSrc "'self' data: * blob: ${domain}"
59 SetEnv frameSrc "'self' blob:"
60 SetEnv mediaSrc "'self' data: * blob: ${domain}"
61 SetEnv childSrc "https://${domain}"
62 SetEnv workerSrc "https://${domain}"
63 SetEnv scriptSrc "'self' 'unsafe-eval' 'unsafe-inline' resource: ${domain}"
64
65 Header set Content-Security-Policy "default-src 'none'; child-src %{childSrc}e; worker-src %{workerSrc}e; media-src %{mediaSrc}e; style-src %{styleSrc}e; script-src %{scriptSrc}e; connect-src %{connectSrc}e; font-src %{fontSrc}e; img-src %{imgSrc}e; frame-src %{frameSrc}e;"
66
67 RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
68 RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
69 RewriteRule .* ws://localhost:${toString port}%{REQUEST_URI} [P,NE,QSA,L]
70
71 RewriteRule ^/customize/(.*)$ /customize.dist/$1 [L]
72
73 ProxyPassMatch "^/(api/(config|broadcast).*)$" "http://localhost:${toString port}/$1"
74 ProxyPassReverse /api http://localhost:${toString port}/api
75 ProxyPreserveHost On
76 RequestHeader set X-Real-IP %{REMOTE_ADDR}s
77
78 Alias /blob /var/lib/cryptpad/${name}/blob
79 <Directory /var/lib/cryptpad/${name}/blob>
80 Require all granted
81 AllowOverride None
82 </Directory>
83 Alias /block /var/lib/cryptpad/${name}/block
84 <Directory /var/lib/cryptpad/${name}/block>
85 Require all granted
86 AllowOverride None
87 </Directory>
88 <LocationMatch /blob/>
89 Header set Cache-Control "max-age=31536000"
90 Header set Access-Control-Allow-Origin "*"
91 Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
92 Header set Access-Control-Allow-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Content-Length"
93 Header set Access-Control-Expose-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Content-Length"
94
95 RewriteCond %{REQUEST_METHOD} OPTIONS
96 RewriteRule ^(.*)$ $1 [R=204,L]
97 </LocationMatch>
98
99 <LocationMatch /block/>
100 Header set Cache-Control "max-age=0"
101 </locationMatch>
102
103 RewriteRule ^/(register|login|settings|user|pad|drive|poll|slide|code|whiteboard|file|media|profile|contacts|todo|filepicker|debug|kanban|sheet|support|admin|notifications|teams|calendar|presentation|doc)$ $1/ [R=302,L]
104
105 RewriteCond %{DOCUMENT_ROOT}/www/%{REQUEST_URI} -f
106 RewriteRule (.*) /www/$1 [L]
107
108 RewriteCond %{DOCUMENT_ROOT}/www/%{REQUEST_URI}/index.html -f
109 RewriteRule (.*) /www/$1/index.html [L]
110
111 RewriteCond %{DOCUMENT_ROOT}/customize.dist/%{REQUEST_URI} -f
112 RewriteRule (.*) /customize.dist/$1 [L]
113
114 <Directory ${package}/lib/node_modules/cryptpad/www>
115 AllowOverride None
116 Require all granted
117 DirectoryIndex index.html
118 </Directory>
119 <Directory ${package}/lib/node_modules/cryptpad/customize.dist>
120 AllowOverride None
121 Require all granted
122 DirectoryIndex index.html
123 </Directory>
124 '';
125in
126{
127 options.myServices.tools.cryptpad.farm = {
128 hosts = lib.mkOption {
129 default = {};
130 description = "Hosts to install";
131 type = lib.types.attrsOf (lib.types.submodule {
132 options = {
133 port = lib.mkOption {
134 type = lib.types.port;
135 };
136 package = lib.mkOption {
137 type = lib.types.package;
138 description = "Cryptpad package to use";
139 default = pkgs.cryptpad;
140 };
141 domain = lib.mkOption {
142 type = lib.types.str;
143 description = "Domain for main host";
144 };
145 config = lib.mkOption {
146 type = lib.types.path;
147 description = "Path to configuration";
148 };
149 };
150 });
151 };
152 vhosts = lib.mkOption {
153 description = "Instance vhosts configs";
154 readOnly = true;
155 type = lib.types.attrsOf lib.types.str;
156 default = lib.genAttrs (builtins.attrNames cfg.hosts) toVhost;
157 };
158 vhostRoots = lib.mkOption {
159 description = "Instance vhosts document roots";
160 readOnly = true;
161 type = lib.types.attrsOf lib.types.path;
162 default = lib.genAttrs (builtins.attrNames cfg.hosts) toVhostRoot;
163 };
164 };
165 config = {
166 users.users = lib.optionalAttrs (cfg.hosts != {}) {
167 cryptpad = {
168 uid = config.ids.uids.cryptpad;
169 group = "cryptpad";
170 description = "Cryptpad user";
171 };
172 };
173 users.groups = lib.optionalAttrs (cfg.hosts != {}) {
174 cryptpad = {
175 gid = config.ids.gids.cryptpad;
176 };
177 };
178 systemd.services = lib.listToAttrs (map (n: lib.nameValuePair "cryptpad-${n}" (toService n)) (builtins.attrNames cfg.hosts));
179 };
180}
diff --git a/modules/private/websites/tools/dav/davical.nix b/modules/private/websites/tools/dav/davical.nix
deleted file mode 100644
index bc5ecf6..0000000
--- a/modules/private/websites/tools/dav/davical.nix
+++ /dev/null
@@ -1,133 +0,0 @@
1{ stdenv, fetchurl, gettext, writeText, env, awl, davical, config }:
2rec {
3 activationScript = {
4 deps = [ "httpd" ];
5 text = ''
6 install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/davical
7 '';
8 };
9 keys."webapps/dav-davical" = {
10 user = apache.user;
11 group = apache.group;
12 permissions = "0400";
13 text = ''
14 <?php
15 $c->pg_connect[] = "dbname=${env.postgresql.database} user=${env.postgresql.user} host=${env.postgresql.socket} password=${env.postgresql.password}";
16
17 $c->readonly_webdav_collections = false;
18
19 $c->admin_email ='davical@tools.immae.eu';
20
21 $c->restrict_setup_to_admin = true;
22
23 $c->collections_always_exist = false;
24
25 $c->external_refresh = 60;
26
27 $c->enable_scheduling = true;
28
29 $c->iMIP = (object) array("send_email" => true);
30
31 $c->authenticate_hook['optional'] = false;
32 $c->authenticate_hook['call'] = 'LDAP_check';
33 $c->authenticate_hook['config'] = array(
34 'host' => '${env.ldap.host}',
35 'port' => '389',
36 'startTLS' => 'yes',
37 'bindDN'=> '${env.ldap.dn}',
38 'passDN'=> '${env.ldap.password}',
39 'protocolVersion' => '3',
40 'baseDNUsers'=> array('ou=users,${env.ldap.base}', 'ou=group_users,${env.ldap.base}'),
41 'filterUsers' => '${env.ldap.filter}',
42 'baseDNGroups' => 'ou=groups,${env.ldap.base}',
43 'filterGroups' => 'memberOf=cn=groups,${env.ldap.dn}',
44 'mapping_field' => array(
45 "username" => "uid",
46 "fullname" => "cn",
47 "email" => "mail",
48 "modified" => "modifyTimestamp",
49 ),
50 'format_updated'=> array('Y' => array(0,4),'m' => array(4,2),'d'=> array(6,2),'H' => array(8,2),'M'=>array(10,2),'S' => array(12,2)),
51 /** used to set default value for all users, will be overcharged by ldap if defined also in mapping_field **/
52 // 'default_value' => array("date_format_type" => "E","locale" => "fr_FR"),
53 'group_mapping_field' => array(
54 "username" => "cn",
55 "updated" => "modifyTimestamp",
56 "fullname" => "givenName",
57 "displayname" => "givenName",
58 "members" => "memberUid",
59 "email" => "mail",
60 ),
61 );
62
63 $c->do_not_sync_from_ldap = array('admin' => true);
64 include('drivers_ldap.php');
65 '';
66 };
67 webapp = davical.override { davical_config = config.secrets.fullPaths."webapps/dav-davical"; };
68 webRoot = "${webapp}/htdocs";
69 apache = rec {
70 user = "wwwrun";
71 group = "wwwrun";
72 modules = [ "proxy_fcgi" ];
73 root = webRoot;
74 vhostConf = socket: ''
75 Alias /davical "${root}"
76 Alias /caldav.php "${root}/caldav.php"
77 <Directory "${root}">
78 DirectoryIndex index.php index.html
79 AcceptPathInfo On
80 AllowOverride None
81 Require all granted
82
83 <FilesMatch "\.php$">
84 CGIPassAuth on
85 SetHandler "proxy:unix:${socket}|fcgi://localhost"
86 </FilesMatch>
87
88 RewriteEngine On
89 <IfModule mod_headers.c>
90 Header unset Access-Control-Allow-Origin
91 Header unset Access-Control-Allow-Methods
92 Header unset Access-Control-Allow-Headers
93 Header unset Access-Control-Allow-Credentials
94 Header unset Access-Control-Expose-Headers
95
96 Header always set Access-Control-Allow-Origin "*"
97 Header always set Access-Control-Allow-Methods "GET,POST,OPTIONS,PROPFIND,PROPPATCH,REPORT,PUT,MOVE,DELETE,LOCK,UNLOCK"
98 Header always set Access-Control-Allow-Headers "User-Agent,Authorization,Content-type,Depth,If-match,If-None-Match,Lock-Token,Timeout,Destination,Overwrite,Prefer,X-client,X-Requested-With"
99 Header always set Access-Control-Allow-Credentials false
100 Header always set Access-Control-Expose-Headers "Etag,Preference-Applied"
101
102 RewriteCond %{HTTP:Access-Control-Request-Method} !^$
103 RewriteCond %{REQUEST_METHOD} OPTIONS
104 RewriteRule ^(.*)$ $1 [R=200,L]
105 </IfModule>
106 </Directory>
107 '';
108 };
109 phpFpm = rec {
110 serviceDeps = [ "postgresql.service" "openldap.service" ];
111 basedir = builtins.concatStringsSep ":" [ webapp config.secrets.fullPaths."webapps/dav-davical" awl ];
112 pool = {
113 "listen.owner" = apache.user;
114 "listen.group" = apache.group;
115 "pm" = "dynamic";
116 "pm.max_children" = "60";
117 "pm.start_servers" = "2";
118 "pm.min_spare_servers" = "1";
119 "pm.max_spare_servers" = "10";
120
121 # Needed to avoid clashes in browser cookies (same domain)
122 "php_value[session.name]" = "DavicalPHPSESSID";
123 "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/davical";
124 "php_admin_value[include_path]" = "${awl}/inc:${webapp}/inc";
125 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/davical";
126 "php_flag[magic_quotes_gpc]" = "Off";
127 "php_flag[register_globals]" = "Off";
128 "php_admin_value[error_reporting]" = "E_ALL & ~E_NOTICE";
129 "php_admin_value[default_charset]" = "utf-8";
130 "php_flag[magic_quotes_runtime]" = "Off";
131 };
132 };
133}
diff --git a/modules/private/websites/tools/dav/default.nix b/modules/private/websites/tools/dav/default.nix
deleted file mode 100644
index b3aa03d..0000000
--- a/modules/private/websites/tools/dav/default.nix
+++ /dev/null
@@ -1,55 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 infcloud = rec {
4 root = pkgs.webapps.infcloud;
5 vhostConf = ''
6 Alias /carddavmate ${root}
7 Alias /caldavzap ${root}
8 Alias /infcloud ${root}
9 <Directory ${root}>
10 AllowOverride All
11 Options FollowSymlinks
12 Require all granted
13 DirectoryIndex index.html
14 </Directory>
15 '';
16 };
17 davical = pkgs.callPackage ./davical.nix {
18 env = config.myEnv.tools.davical;
19 inherit (pkgs.webapps) davical awl;
20 inherit config;
21 };
22
23 cfg = config.myServices.websites.tools.dav;
24in {
25 options.myServices.websites.tools.dav = {
26 enable = lib.mkEnableOption "enable dav website";
27 };
28
29 config = lib.mkIf cfg.enable {
30 system.activationScripts.davical = davical.activationScript;
31 secrets.keys = davical.keys;
32 services.websites.env.tools.modules = davical.apache.modules;
33
34 services.websites.env.tools.vhostConfs.dav = {
35 certName = "eldiron";
36 addToCerts = true;
37 hosts = ["dav.immae.eu" ];
38 root = ./www;
39 extraConfig = [
40 infcloud.vhostConf
41 (davical.apache.vhostConf config.services.phpfpm.pools.davical.socket)
42 ];
43 };
44
45 services.phpfpm.pools = {
46 davical = {
47 user = config.services.httpd.Tools.user;
48 group = config.services.httpd.Tools.group;
49 settings = davical.phpFpm.pool;
50 phpPackage = pkgs.php72;
51 };
52 };
53 };
54}
55
diff --git a/modules/private/websites/tools/db/default.nix b/modules/private/websites/tools/db/default.nix
deleted file mode 100644
index fc8d989..0000000
--- a/modules/private/websites/tools/db/default.nix
+++ /dev/null
@@ -1,21 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 adminer = pkgs.callPackage ../../commons/adminer.nix { inherit config; };
4
5 cfg = config.myServices.websites.tools.db;
6in {
7 options.myServices.websites.tools.db = {
8 enable = lib.mkEnableOption "enable database's website";
9 };
10
11 config = lib.mkIf cfg.enable {
12 services.websites.env.tools.modules = adminer.apache.modules;
13 services.websites.env.tools.vhostConfs.db-1 = {
14 certName = "eldiron";
15 addToCerts = true;
16 hosts = ["db-1.immae.eu" ];
17 root = null;
18 extraConfig = [ (adminer.apache.vhostConf null) ];
19 };
20 };
21}
diff --git a/modules/private/websites/tools/diaspora/default.nix b/modules/private/websites/tools/diaspora/default.nix
deleted file mode 100644
index 3a115ed..0000000
--- a/modules/private/websites/tools/diaspora/default.nix
+++ /dev/null
@@ -1,185 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 env = config.myEnv.tools.diaspora;
4 root = "${dcfg.workdir}/public/";
5 cfg = config.myServices.websites.tools.diaspora;
6 dcfg = config.services.diaspora;
7in {
8 options.myServices.websites.tools.diaspora = {
9 enable = lib.mkEnableOption "enable diaspora's website";
10 };
11
12 config = lib.mkIf cfg.enable {
13 users.users.diaspora.extraGroups = [ "keys" ];
14
15 secrets.keys = {
16 "webapps/diaspora" = {
17 isDir = true;
18 user = "diaspora";
19 group = "diaspora";
20 permissions = "0500";
21 };
22 "webapps/diaspora/diaspora.yml" = {
23 user = "diaspora";
24 group = "diaspora";
25 permissions = "0400";
26 text = ''
27 configuration:
28 environment:
29 url: "https://diaspora.immae.eu/"
30 certificate_authorities: '${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt'
31 redis: 'redis://${env.redis.host}:${env.redis.port}/${env.redis.db}'
32 sidekiq:
33 s3:
34 assets:
35 logging:
36 logrotate:
37 debug:
38 server:
39 listen: '${dcfg.sockets.rails}'
40 rails_environment: 'production'
41 chat:
42 server:
43 bosh:
44 log:
45 map:
46 mapbox:
47 privacy:
48 piwik:
49 statistics:
50 camo:
51 settings:
52 enable_registrations: false
53 welcome_message:
54 invitations:
55 open: false
56 paypal_donations:
57 community_spotlight:
58 captcha:
59 enable: false
60 terms:
61 maintenance:
62 remove_old_users:
63 default_metas:
64 csp:
65 services:
66 twitter:
67 tumblr:
68 wordpress:
69 mail:
70 enable: true
71 sender_address: 'diaspora@tools.immae.eu'
72 method: 'sendmail'
73 smtp:
74 sendmail:
75 location: '/run/wrappers/bin/sendmail'
76 admins:
77 account: "ismael"
78 podmin_email: 'diaspora@tools.immae.eu'
79 relay:
80 outbound:
81 inbound:
82 ldap:
83 enable: true
84 host: ${env.ldap.host}
85 port: 636
86 only_ldap: true
87 mail_attribute: mail
88 skip_email_confirmation: true
89 use_bind_dn: true
90 bind_dn: "${env.ldap.dn}"
91 bind_pw: "${env.ldap.password}"
92 search_base: "${env.ldap.base}"
93 search_filter: "${env.ldap.filter}"
94 production:
95 environment:
96 development:
97 environment:
98 '';
99 };
100 "webapps/diaspora/database.yml" = {
101 user = "diaspora";
102 group = "diaspora";
103 permissions = "0400";
104 text = ''
105 postgresql: &postgresql
106 adapter: postgresql
107 host: "${env.postgresql.socket}"
108 port: "${env.postgresql.port}"
109 username: "${env.postgresql.user}"
110 password: "${env.postgresql.password}"
111 encoding: unicode
112 common: &common
113 <<: *postgresql
114 combined: &combined
115 <<: *common
116 development:
117 <<: *combined
118 database: diaspora_development
119 production:
120 <<: *combined
121 database: ${env.postgresql.database}
122 test:
123 <<: *combined
124 database: "diaspora_test"
125 integration1:
126 <<: *combined
127 database: diaspora_integration1
128 integration2:
129 <<: *combined
130 database: diaspora_integration2
131 '';
132 };
133 "webapps/diaspora/secret_token.rb" = {
134 user = "diaspora";
135 group = "diaspora";
136 permissions = "0400";
137 text = ''
138 Diaspora::Application.config.secret_key_base = '${env.secret_token}'
139 '';
140 };
141 };
142
143 services.diaspora = {
144 enable = true;
145 package = pkgs.webapps.diaspora.override { ldap = true; };
146 dataDir = "/var/lib/diaspora_immae";
147 adminEmail = "diaspora@tools.immae.eu";
148 configDir = config.secrets.fullPaths."webapps/diaspora";
149 };
150
151 services.filesWatcher.diaspora = {
152 restart = true;
153 paths = [ dcfg.configDir ];
154 };
155
156 services.websites.env.tools.modules = [
157 "headers" "proxy" "proxy_http"
158 ];
159 services.websites.env.tools.vhostConfs.diaspora = {
160 certName = "eldiron";
161 addToCerts = true;
162 hosts = [ "diaspora.immae.eu" ];
163 root = root;
164 extraConfig = [ ''
165 RewriteEngine On
166 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
167 RewriteRule ^/(.*)$ unix://${dcfg.sockets.rails}|http://diaspora.immae.eu/%{REQUEST_URI} [P,NE,QSA,L]
168
169 ProxyRequests Off
170 ProxyVia On
171 ProxyPreserveHost On
172 RequestHeader set X_FORWARDED_PROTO https
173
174 <Proxy *>
175 Require all granted
176 </Proxy>
177
178 <Directory ${root}>
179 Require all granted
180 Options -MultiViews
181 </Directory>
182 '' ];
183 };
184 };
185}
diff --git a/modules/private/websites/tools/ether/default.nix b/modules/private/websites/tools/ether/default.nix
deleted file mode 100644
index 0539095..0000000
--- a/modules/private/websites/tools/ether/default.nix
+++ /dev/null
@@ -1,216 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 env = config.myEnv.tools.etherpad-lite;
4 cfg = config.myServices.websites.tools.etherpad-lite;
5 # Make sure we’re not rebuilding whole libreoffice just because of a
6 # dependency
7 libreoffice = (import <nixpkgs> { overlays = []; }).libreoffice-fresh;
8 ecfg = config.services.etherpad-lite;
9in {
10 options.myServices.websites.tools.etherpad-lite = {
11 enable = lib.mkEnableOption "enable etherpad's website";
12 };
13
14 config = lib.mkIf cfg.enable {
15 secrets.keys = {
16 "webapps/tools-etherpad-apikey" = {
17 permissions = "0400";
18 text = env.api_key;
19 };
20 "webapps/tools-etherpad-sessionkey" = {
21 permissions = "0400";
22 text = env.session_key;
23 };
24 "webapps/tools-etherpad" = {
25 permissions = "0400";
26 text = ''
27 {
28 "title": "Etherpad",
29 "favicon": "favicon.ico",
30 "skinName": "colibris",
31 "skinVariants": "dark-toolbar light-background super-light-editor full-width-editor",
32
33 "ip": "",
34 "port" : "${ecfg.sockets.node}",
35 "showSettingsInAdminPage" : false,
36 "dbType" : "postgres",
37 "dbSettings" : {
38 "user" : "${env.postgresql.user}",
39 "host" : "${env.postgresql.socket}",
40 "password": "${env.postgresql.password}",
41 "database": "${env.postgresql.database}",
42 "charset" : "utf8mb4"
43 },
44
45 "defaultPadText" : "Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nGet involved with Etherpad at http:\/\/etherpad.org\n",
46 "padOptions": {
47 "noColors": false,
48 "showControls": true,
49 "showChat": true,
50 "showLineNumbers": true,
51 "useMonospaceFont": false,
52 "userName": false,
53 "userColor": false,
54 "rtl": false,
55 "alwaysShowChat": false,
56 "chatAndUsers": false,
57 "lang": "fr"
58 },
59
60 "suppressErrorsInPadText" : false,
61 "requireSession" : false,
62 "editOnly" : false,
63 "sessionNoPassword" : false,
64 "minify" : true,
65 "maxAge" : 21600,
66 "abiword" : null,
67 "soffice" : "${libreoffice}/bin/soffice",
68 "tidyHtml" : "",
69 "allowUnknownFileEnds" : true,
70 "requireAuthentication" : false,
71 "requireAuthorization" : false,
72 "trustProxy" : false,
73 "disableIPlogging" : false,
74 "automaticReconnectionTimeout" : 0,
75 "scrollWhenFocusLineIsOutOfViewport": {
76 "percentage": {
77 "editionAboveViewport": 0,
78 "editionBelowViewport": 0
79 },
80 "duration": 0,
81 "scrollWhenCaretIsInTheLastLineOfViewport": false,
82 "percentageToScrollWhenUserPressesArrowUp": 0
83 },
84 "users": {
85 "admin": {
86 "password": "${env.adminPassword}",
87 "is_admin": true
88 },
89 "ldapauth": {
90 "hash": "invalid",
91 "url": "ldaps://${env.ldap.host}",
92 "accountBase": "${env.ldap.base}",
93 "accountPattern": "${env.ldap.filter}",
94 "displayNameAttribute": "cn",
95 "searchDN": "${env.ldap.dn}",
96 "searchPWD": "${env.ldap.password}",
97 "groupSearchBase": "${env.ldap.base}",
98 "groupAttribute": "member",
99 "groupAttributeIsDN": true,
100 "searchScope": "sub",
101 "groupSearch": "${env.ldap.group_filter}",
102 "anonymousReadonly": false
103 }
104 },
105 "ep_mypads": {
106 "warning": "This hash is stored in database, changing anything here will not have any consequence",
107 "ldap": {
108 "url": "ldaps://${env.ldap.host}",
109 "bindDN": "${env.ldap.dn}",
110 "bindCredentials": "${env.ldap.password}",
111 "searchBase": "${env.ldap.base}",
112 "searchFilter": "${env.ldap.filter}",
113 "properties": {
114 "login": "uid",
115 "email": "mail",
116 "firstname": "givenName",
117 "lastname": "sn"
118 },
119 "defaultLang": "fr"
120 }
121 },
122 "ep_comments_page": {
123 "displayCommentAsIcon": true,
124 "highlightSelectedText": true
125 },
126 "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"],
127 "loadTest": false,
128 "indentationOnNewLine": false,
129 "toolbar": {
130 "left": [
131 ["bold", "italic", "underline", "strikethrough"],
132 ["orderedlist", "unorderedlist", "indent", "outdent"],
133 ["undo", "redo"],
134 ["clearauthorship"]
135 ],
136 "right": [
137 ["importexport", "timeslider", "savedrevision"],
138 ["settings", "embed"],
139 ["showusers"]
140 ],
141 "timeslider": [
142 ["timeslider_export", "timeslider_returnToPad"]
143 ]
144 },
145 "loglevel": "INFO",
146 "logconfig" : { "appenders": [ { "type": "console" } ] }
147 }
148 '';
149 };
150 };
151 services.etherpad-lite = {
152 enable = true;
153 package = pkgs.webapps.etherpad-lite.withModules (p: [
154 p.ep_align p.ep_bookmark p.ep_colors p.ep_comments_page
155 p.ep_cursortrace p.ep_delete_empty_pads p.ep_embedmedia
156 p.ep_font_size p.ep_headings2 p.ep_immae_buttons p.ep_ldapauth
157 p.ep_line_height p.ep_markdown p.ep_mypads p.ep_page_view
158 p.ep_previewimages p.ep_ruler p.ep_scrollto
159 p.ep_set_title_on_pad p.ep_subscript_and_superscript
160 p.ep_timesliderdiff
161 ]);
162 modules = [];
163 sessionKeyFile = config.secrets.fullPaths."webapps/tools-etherpad-sessionkey";
164 apiKeyFile = config.secrets.fullPaths."webapps/tools-etherpad-apikey";
165 configFile = config.secrets.fullPaths."webapps/tools-etherpad";
166 };
167
168 systemd.services.etherpad-lite.serviceConfig.SupplementaryGroups = "keys";
169 # Needed so that they get in the closure
170 systemd.services.etherpad-lite.path = [ libreoffice pkgs.html-tidy ];
171
172 services.filesWatcher.etherpad-lite = {
173 restart = true;
174 paths = [ ecfg.sessionKeyFile ecfg.apiKeyFile ecfg.configFile ];
175 };
176
177 services.websites.env.tools.modules = [
178 "headers" "proxy" "proxy_http" "proxy_wstunnel"
179 ];
180 services.websites.env.tools.vhostConfs.etherpad-lite = {
181 certName = "eldiron";
182 addToCerts = true;
183 hosts = [ "ether.immae.eu" ];
184 root = null;
185 extraConfig = [ ''
186 Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
187 RequestHeader set X-Forwarded-Proto "https"
188
189 RewriteEngine On
190
191 RewriteMap redirects "txt:${pkgs.writeText "redirects.txt" config.myEnv.tools.etherpad-lite.redirects}"
192 RewriteCond %{QUERY_STRING} "!noredirect"
193 RewriteCond %{REQUEST_URI} "^(.*)$"
194 RewriteCond ''${redirects:$1|Unknown} "!Unknown"
195 RewriteRule "^(.*)$" ''${redirects:$1} [L,NE,R=301,QSD]
196
197 RewriteCond %{REQUEST_URI} ^/socket.io [NC]
198 RewriteCond %{QUERY_STRING} transport=websocket [NC]
199 RewriteRule /(.*) unix://${ecfg.sockets.node}|ws://ether.immae.eu/$1 [P,NE,QSA,L]
200
201 <IfModule mod_proxy.c>
202 ProxyVia On
203 ProxyRequests Off
204 ProxyPreserveHost On
205 ProxyPass / unix://${ecfg.sockets.node}|http://ether.immae.eu/
206 ProxyPassReverse / unix://${ecfg.sockets.node}|http://ether.immae.eu/
207 <Proxy *>
208 Options FollowSymLinks MultiViews
209 AllowOverride None
210 Require all granted
211 </Proxy>
212 </IfModule>
213 '' ];
214 };
215 };
216}
diff --git a/modules/private/websites/tools/games/codenames/default.nix b/modules/private/websites/tools/games/codenames/default.nix
deleted file mode 100644
index 25eb62d..0000000
--- a/modules/private/websites/tools/games/codenames/default.nix
+++ /dev/null
@@ -1,50 +0,0 @@
1{ config, lib, pkgs, ... }:
2let
3 greenapid = pkgs.callPackage ./greenapid.nix {};
4 frontend = pkgs.callPackage ./frontend.nix { nodeEnv = pkgs.callPackage pkgs.mylibs.nodeEnv {}; };
5 wordlists = pkgs.runCommand "wordlists" {} ''
6 mkdir -p $out
7 cp -r ${./wordlists} $out/wordlists
8 '';
9 cfg = config.myServices.websites.games.codenames;
10in
11{
12 options.myServices.websites.games.codenames.enable = lib.mkEnableOption "Enable Codenames game";
13 config = lib.mkIf cfg.enable {
14 systemd.services.codenames_api = {
15 description = "Api for codenames game";
16 wantedBy = [ "multi-user.target" ];
17 script = "${greenapid}/bin/greenapid";
18 postStart = ''
19 sleep 5;
20 chown :wwwrun /run/codenamesgreen/socket.sock
21 chmod g+w /run/codenamesgreen/socket.sock
22 '';
23 serviceConfig = {
24 User = "codenames";
25 DynamicUser = true;
26 SupplementaryGroups = [ "wwwrun" ];
27 Type = "simple";
28 RuntimeDirectory = "codenamesgreen";
29 WorkingDirectory = builtins.toString wordlists;
30 };
31 };
32
33 services.websites.env.tools.vhostConfs.games_codenames = {
34 certName = "games";
35 certMainHost = "games.immae.eu";
36 hosts = [ "codenames.games.immae.eu" ];
37 root = frontend;
38 extraConfig = [
39 ''
40 ProxyPass /api/ unix:///run/codenamesgreen/socket.sock|http://codenames.games.immae.eu/
41 ProxyPassReverse /api/ unix:///run/codenamesgreen/socket.sock|http://codenames.games.immae.eu/
42
43 <Directory ${frontend}>
44 FallbackResource index.html
45 </Directory>
46 ''
47 ];
48 };
49 };
50}
diff --git a/modules/private/websites/tools/games/codenames/node-packages.nix b/modules/private/websites/tools/games/codenames/node-packages.nix
deleted file mode 100644
index 02595c5..0000000
--- a/modules/private/websites/tools/games/codenames/node-packages.nix
+++ /dev/null
@@ -1,7621 +0,0 @@
1# This file has been generated by node2nix 1.8.0. Do not edit!
2
3{nodeEnv, fetchurl, fetchgit, fetchFromGitHub, runCommand, globalBuildInputs ? []}:
4
5let
6 sources = {
7 "@babel/code-frame-7.0.0" = {
8 name = "_at_babel_slash_code-frame";
9 packageName = "@babel/code-frame";
10 version = "7.0.0";
11 src = fetchurl {
12 url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz";
13 sha512 = "OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==";
14 };
15 };
16 "@babel/code-frame-7.8.3" = {
17 name = "_at_babel_slash_code-frame";
18 packageName = "@babel/code-frame";
19 version = "7.8.3";
20 src = fetchurl {
21 url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz";
22 sha512 = "a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==";
23 };
24 };
25 "@babel/core-7.3.4" = {
26 name = "_at_babel_slash_core";
27 packageName = "@babel/core";
28 version = "7.3.4";
29 src = fetchurl {
30 url = "https://registry.npmjs.org/@babel/core/-/core-7.3.4.tgz";
31 sha512 = "jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA==";
32 };
33 };
34 "@babel/generator-7.3.4" = {
35 name = "_at_babel_slash_generator";
36 packageName = "@babel/generator";
37 version = "7.3.4";
38 src = fetchurl {
39 url = "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz";
40 sha512 = "8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==";
41 };
42 };
43 "@babel/generator-7.9.5" = {
44 name = "_at_babel_slash_generator";
45 packageName = "@babel/generator";
46 version = "7.9.5";
47 src = fetchurl {
48 url = "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz";
49 sha512 = "GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==";
50 };
51 };
52 "@babel/helper-annotate-as-pure-7.8.3" = {
53 name = "_at_babel_slash_helper-annotate-as-pure";
54 packageName = "@babel/helper-annotate-as-pure";
55 version = "7.8.3";
56 src = fetchurl {
57 url = "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz";
58 sha512 = "6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==";
59 };
60 };
61 "@babel/helper-builder-binary-assignment-operator-visitor-7.8.3" = {
62 name = "_at_babel_slash_helper-builder-binary-assignment-operator-visitor";
63 packageName = "@babel/helper-builder-binary-assignment-operator-visitor";
64 version = "7.8.3";
65 src = fetchurl {
66 url = "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz";
67 sha512 = "5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==";
68 };
69 };
70 "@babel/helper-builder-react-jsx-7.9.0" = {
71 name = "_at_babel_slash_helper-builder-react-jsx";
72 packageName = "@babel/helper-builder-react-jsx";
73 version = "7.9.0";
74 src = fetchurl {
75 url = "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz";
76 sha512 = "weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==";
77 };
78 };
79 "@babel/helper-create-regexp-features-plugin-7.8.8" = {
80 name = "_at_babel_slash_helper-create-regexp-features-plugin";
81 packageName = "@babel/helper-create-regexp-features-plugin";
82 version = "7.8.8";
83 src = fetchurl {
84 url = "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz";
85 sha512 = "LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==";
86 };
87 };
88 "@babel/helper-define-map-7.8.3" = {
89 name = "_at_babel_slash_helper-define-map";
90 packageName = "@babel/helper-define-map";
91 version = "7.8.3";
92 src = fetchurl {
93 url = "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz";
94 sha512 = "PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==";
95 };
96 };
97 "@babel/helper-explode-assignable-expression-7.8.3" = {
98 name = "_at_babel_slash_helper-explode-assignable-expression";
99 packageName = "@babel/helper-explode-assignable-expression";
100 version = "7.8.3";
101 src = fetchurl {
102 url = "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz";
103 sha512 = "N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==";
104 };
105 };
106 "@babel/helper-function-name-7.9.5" = {
107 name = "_at_babel_slash_helper-function-name";
108 packageName = "@babel/helper-function-name";
109 version = "7.9.5";
110 src = fetchurl {
111 url = "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz";
112 sha512 = "JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==";
113 };
114 };
115 "@babel/helper-get-function-arity-7.8.3" = {
116 name = "_at_babel_slash_helper-get-function-arity";
117 packageName = "@babel/helper-get-function-arity";
118 version = "7.8.3";
119 src = fetchurl {
120 url = "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz";
121 sha512 = "FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==";
122 };
123 };
124 "@babel/helper-hoist-variables-7.8.3" = {
125 name = "_at_babel_slash_helper-hoist-variables";
126 packageName = "@babel/helper-hoist-variables";
127 version = "7.8.3";
128 src = fetchurl {
129 url = "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz";
130 sha512 = "ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==";
131 };
132 };
133 "@babel/helper-member-expression-to-functions-7.8.3" = {
134 name = "_at_babel_slash_helper-member-expression-to-functions";
135 packageName = "@babel/helper-member-expression-to-functions";
136 version = "7.8.3";
137 src = fetchurl {
138 url = "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz";
139 sha512 = "fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==";
140 };
141 };
142 "@babel/helper-module-imports-7.8.3" = {
143 name = "_at_babel_slash_helper-module-imports";
144 packageName = "@babel/helper-module-imports";
145 version = "7.8.3";
146 src = fetchurl {
147 url = "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz";
148 sha512 = "R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==";
149 };
150 };
151 "@babel/helper-module-transforms-7.9.0" = {
152 name = "_at_babel_slash_helper-module-transforms";
153 packageName = "@babel/helper-module-transforms";
154 version = "7.9.0";
155 src = fetchurl {
156 url = "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz";
157 sha512 = "0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==";
158 };
159 };
160 "@babel/helper-optimise-call-expression-7.8.3" = {
161 name = "_at_babel_slash_helper-optimise-call-expression";
162 packageName = "@babel/helper-optimise-call-expression";
163 version = "7.8.3";
164 src = fetchurl {
165 url = "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz";
166 sha512 = "Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==";
167 };
168 };
169 "@babel/helper-plugin-utils-7.8.3" = {
170 name = "_at_babel_slash_helper-plugin-utils";
171 packageName = "@babel/helper-plugin-utils";
172 version = "7.8.3";
173 src = fetchurl {
174 url = "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz";
175 sha512 = "j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==";
176 };
177 };
178 "@babel/helper-regex-7.8.3" = {
179 name = "_at_babel_slash_helper-regex";
180 packageName = "@babel/helper-regex";
181 version = "7.8.3";
182 src = fetchurl {
183 url = "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz";
184 sha512 = "BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==";
185 };
186 };
187 "@babel/helper-remap-async-to-generator-7.8.3" = {
188 name = "_at_babel_slash_helper-remap-async-to-generator";
189 packageName = "@babel/helper-remap-async-to-generator";
190 version = "7.8.3";
191 src = fetchurl {
192 url = "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz";
193 sha512 = "kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==";
194 };
195 };
196 "@babel/helper-replace-supers-7.8.6" = {
197 name = "_at_babel_slash_helper-replace-supers";
198 packageName = "@babel/helper-replace-supers";
199 version = "7.8.6";
200 src = fetchurl {
201 url = "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz";
202 sha512 = "PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==";
203 };
204 };
205 "@babel/helper-simple-access-7.8.3" = {
206 name = "_at_babel_slash_helper-simple-access";
207 packageName = "@babel/helper-simple-access";
208 version = "7.8.3";
209 src = fetchurl {
210 url = "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz";
211 sha512 = "VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==";
212 };
213 };
214 "@babel/helper-split-export-declaration-7.8.3" = {
215 name = "_at_babel_slash_helper-split-export-declaration";
216 packageName = "@babel/helper-split-export-declaration";
217 version = "7.8.3";
218 src = fetchurl {
219 url = "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz";
220 sha512 = "3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==";
221 };
222 };
223 "@babel/helper-validator-identifier-7.9.5" = {
224 name = "_at_babel_slash_helper-validator-identifier";
225 packageName = "@babel/helper-validator-identifier";
226 version = "7.9.5";
227 src = fetchurl {
228 url = "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz";
229 sha512 = "/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==";
230 };
231 };
232 "@babel/helper-wrap-function-7.8.3" = {
233 name = "_at_babel_slash_helper-wrap-function";
234 packageName = "@babel/helper-wrap-function";
235 version = "7.8.3";
236 src = fetchurl {
237 url = "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz";
238 sha512 = "LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==";
239 };
240 };
241 "@babel/helpers-7.9.2" = {
242 name = "_at_babel_slash_helpers";
243 packageName = "@babel/helpers";
244 version = "7.9.2";
245 src = fetchurl {
246 url = "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz";
247 sha512 = "JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==";
248 };
249 };
250 "@babel/highlight-7.9.0" = {
251 name = "_at_babel_slash_highlight";
252 packageName = "@babel/highlight";
253 version = "7.9.0";
254 src = fetchurl {
255 url = "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz";
256 sha512 = "lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==";
257 };
258 };
259 "@babel/parser-7.3.4" = {
260 name = "_at_babel_slash_parser";
261 packageName = "@babel/parser";
262 version = "7.3.4";
263 src = fetchurl {
264 url = "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz";
265 sha512 = "tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==";
266 };
267 };
268 "@babel/parser-7.9.4" = {
269 name = "_at_babel_slash_parser";
270 packageName = "@babel/parser";
271 version = "7.9.4";
272 src = fetchurl {
273 url = "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz";
274 sha512 = "bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==";
275 };
276 };
277 "@babel/plugin-proposal-async-generator-functions-7.8.3" = {
278 name = "_at_babel_slash_plugin-proposal-async-generator-functions";
279 packageName = "@babel/plugin-proposal-async-generator-functions";
280 version = "7.8.3";
281 src = fetchurl {
282 url = "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz";
283 sha512 = "NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==";
284 };
285 };
286 "@babel/plugin-proposal-json-strings-7.8.3" = {
287 name = "_at_babel_slash_plugin-proposal-json-strings";
288 packageName = "@babel/plugin-proposal-json-strings";
289 version = "7.8.3";
290 src = fetchurl {
291 url = "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz";
292 sha512 = "KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==";
293 };
294 };
295 "@babel/plugin-proposal-object-rest-spread-7.9.5" = {
296 name = "_at_babel_slash_plugin-proposal-object-rest-spread";
297 packageName = "@babel/plugin-proposal-object-rest-spread";
298 version = "7.9.5";
299 src = fetchurl {
300 url = "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz";
301 sha512 = "VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==";
302 };
303 };
304 "@babel/plugin-proposal-optional-catch-binding-7.8.3" = {
305 name = "_at_babel_slash_plugin-proposal-optional-catch-binding";
306 packageName = "@babel/plugin-proposal-optional-catch-binding";
307 version = "7.8.3";
308 src = fetchurl {
309 url = "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz";
310 sha512 = "0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==";
311 };
312 };
313 "@babel/plugin-proposal-unicode-property-regex-7.8.8" = {
314 name = "_at_babel_slash_plugin-proposal-unicode-property-regex";
315 packageName = "@babel/plugin-proposal-unicode-property-regex";
316 version = "7.8.8";
317 src = fetchurl {
318 url = "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz";
319 sha512 = "EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==";
320 };
321 };
322 "@babel/plugin-syntax-async-generators-7.8.4" = {
323 name = "_at_babel_slash_plugin-syntax-async-generators";
324 packageName = "@babel/plugin-syntax-async-generators";
325 version = "7.8.4";
326 src = fetchurl {
327 url = "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz";
328 sha512 = "tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==";
329 };
330 };
331 "@babel/plugin-syntax-flow-7.8.3" = {
332 name = "_at_babel_slash_plugin-syntax-flow";
333 packageName = "@babel/plugin-syntax-flow";
334 version = "7.8.3";
335 src = fetchurl {
336 url = "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz";
337 sha512 = "innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==";
338 };
339 };
340 "@babel/plugin-syntax-json-strings-7.8.3" = {
341 name = "_at_babel_slash_plugin-syntax-json-strings";
342 packageName = "@babel/plugin-syntax-json-strings";
343 version = "7.8.3";
344 src = fetchurl {
345 url = "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz";
346 sha512 = "lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==";
347 };
348 };
349 "@babel/plugin-syntax-jsx-7.8.3" = {
350 name = "_at_babel_slash_plugin-syntax-jsx";
351 packageName = "@babel/plugin-syntax-jsx";
352 version = "7.8.3";
353 src = fetchurl {
354 url = "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz";
355 sha512 = "WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==";
356 };
357 };
358 "@babel/plugin-syntax-object-rest-spread-7.8.3" = {
359 name = "_at_babel_slash_plugin-syntax-object-rest-spread";
360 packageName = "@babel/plugin-syntax-object-rest-spread";
361 version = "7.8.3";
362 src = fetchurl {
363 url = "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz";
364 sha512 = "XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==";
365 };
366 };
367 "@babel/plugin-syntax-optional-catch-binding-7.8.3" = {
368 name = "_at_babel_slash_plugin-syntax-optional-catch-binding";
369 packageName = "@babel/plugin-syntax-optional-catch-binding";
370 version = "7.8.3";
371 src = fetchurl {
372 url = "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz";
373 sha512 = "6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==";
374 };
375 };
376 "@babel/plugin-transform-arrow-functions-7.8.3" = {
377 name = "_at_babel_slash_plugin-transform-arrow-functions";
378 packageName = "@babel/plugin-transform-arrow-functions";
379 version = "7.8.3";
380 src = fetchurl {
381 url = "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz";
382 sha512 = "0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==";
383 };
384 };
385 "@babel/plugin-transform-async-to-generator-7.8.3" = {
386 name = "_at_babel_slash_plugin-transform-async-to-generator";
387 packageName = "@babel/plugin-transform-async-to-generator";
388 version = "7.8.3";
389 src = fetchurl {
390 url = "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz";
391 sha512 = "imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==";
392 };
393 };
394 "@babel/plugin-transform-block-scoped-functions-7.8.3" = {
395 name = "_at_babel_slash_plugin-transform-block-scoped-functions";
396 packageName = "@babel/plugin-transform-block-scoped-functions";
397 version = "7.8.3";
398 src = fetchurl {
399 url = "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz";
400 sha512 = "vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==";
401 };
402 };
403 "@babel/plugin-transform-block-scoping-7.8.3" = {
404 name = "_at_babel_slash_plugin-transform-block-scoping";
405 packageName = "@babel/plugin-transform-block-scoping";
406 version = "7.8.3";
407 src = fetchurl {
408 url = "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz";
409 sha512 = "pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==";
410 };
411 };
412 "@babel/plugin-transform-classes-7.9.5" = {
413 name = "_at_babel_slash_plugin-transform-classes";
414 packageName = "@babel/plugin-transform-classes";
415 version = "7.9.5";
416 src = fetchurl {
417 url = "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz";
418 sha512 = "x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==";
419 };
420 };
421 "@babel/plugin-transform-computed-properties-7.8.3" = {
422 name = "_at_babel_slash_plugin-transform-computed-properties";
423 packageName = "@babel/plugin-transform-computed-properties";
424 version = "7.8.3";
425 src = fetchurl {
426 url = "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz";
427 sha512 = "O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==";
428 };
429 };
430 "@babel/plugin-transform-destructuring-7.9.5" = {
431 name = "_at_babel_slash_plugin-transform-destructuring";
432 packageName = "@babel/plugin-transform-destructuring";
433 version = "7.9.5";
434 src = fetchurl {
435 url = "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz";
436 sha512 = "j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==";
437 };
438 };
439 "@babel/plugin-transform-dotall-regex-7.8.3" = {
440 name = "_at_babel_slash_plugin-transform-dotall-regex";
441 packageName = "@babel/plugin-transform-dotall-regex";
442 version = "7.8.3";
443 src = fetchurl {
444 url = "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz";
445 sha512 = "kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==";
446 };
447 };
448 "@babel/plugin-transform-duplicate-keys-7.8.3" = {
449 name = "_at_babel_slash_plugin-transform-duplicate-keys";
450 packageName = "@babel/plugin-transform-duplicate-keys";
451 version = "7.8.3";
452 src = fetchurl {
453 url = "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz";
454 sha512 = "s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==";
455 };
456 };
457 "@babel/plugin-transform-exponentiation-operator-7.8.3" = {
458 name = "_at_babel_slash_plugin-transform-exponentiation-operator";
459 packageName = "@babel/plugin-transform-exponentiation-operator";
460 version = "7.8.3";
461 src = fetchurl {
462 url = "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz";
463 sha512 = "zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==";
464 };
465 };
466 "@babel/plugin-transform-flow-strip-types-7.3.4" = {
467 name = "_at_babel_slash_plugin-transform-flow-strip-types";
468 packageName = "@babel/plugin-transform-flow-strip-types";
469 version = "7.3.4";
470 src = fetchurl {
471 url = "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.3.4.tgz";
472 sha512 = "PmQC9R7DwpBFA+7ATKMyzViz3zCaMNouzZMPZN2K5PnbBbtL3AXFYTkDk+Hey5crQq2A90UG5Uthz0mel+XZrA==";
473 };
474 };
475 "@babel/plugin-transform-for-of-7.9.0" = {
476 name = "_at_babel_slash_plugin-transform-for-of";
477 packageName = "@babel/plugin-transform-for-of";
478 version = "7.9.0";
479 src = fetchurl {
480 url = "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz";
481 sha512 = "lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==";
482 };
483 };
484 "@babel/plugin-transform-function-name-7.8.3" = {
485 name = "_at_babel_slash_plugin-transform-function-name";
486 packageName = "@babel/plugin-transform-function-name";
487 version = "7.8.3";
488 src = fetchurl {
489 url = "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz";
490 sha512 = "rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==";
491 };
492 };
493 "@babel/plugin-transform-literals-7.8.3" = {
494 name = "_at_babel_slash_plugin-transform-literals";
495 packageName = "@babel/plugin-transform-literals";
496 version = "7.8.3";
497 src = fetchurl {
498 url = "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz";
499 sha512 = "3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==";
500 };
501 };
502 "@babel/plugin-transform-modules-amd-7.9.0" = {
503 name = "_at_babel_slash_plugin-transform-modules-amd";
504 packageName = "@babel/plugin-transform-modules-amd";
505 version = "7.9.0";
506 src = fetchurl {
507 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz";
508 sha512 = "vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==";
509 };
510 };
511 "@babel/plugin-transform-modules-commonjs-7.2.0" = {
512 name = "_at_babel_slash_plugin-transform-modules-commonjs";
513 packageName = "@babel/plugin-transform-modules-commonjs";
514 version = "7.2.0";
515 src = fetchurl {
516 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz";
517 sha512 = "V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==";
518 };
519 };
520 "@babel/plugin-transform-modules-systemjs-7.9.0" = {
521 name = "_at_babel_slash_plugin-transform-modules-systemjs";
522 packageName = "@babel/plugin-transform-modules-systemjs";
523 version = "7.9.0";
524 src = fetchurl {
525 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz";
526 sha512 = "FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==";
527 };
528 };
529 "@babel/plugin-transform-modules-umd-7.9.0" = {
530 name = "_at_babel_slash_plugin-transform-modules-umd";
531 packageName = "@babel/plugin-transform-modules-umd";
532 version = "7.9.0";
533 src = fetchurl {
534 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz";
535 sha512 = "uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==";
536 };
537 };
538 "@babel/plugin-transform-named-capturing-groups-regex-7.8.3" = {
539 name = "_at_babel_slash_plugin-transform-named-capturing-groups-regex";
540 packageName = "@babel/plugin-transform-named-capturing-groups-regex";
541 version = "7.8.3";
542 src = fetchurl {
543 url = "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz";
544 sha512 = "f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==";
545 };
546 };
547 "@babel/plugin-transform-new-target-7.8.3" = {
548 name = "_at_babel_slash_plugin-transform-new-target";
549 packageName = "@babel/plugin-transform-new-target";
550 version = "7.8.3";
551 src = fetchurl {
552 url = "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz";
553 sha512 = "QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==";
554 };
555 };
556 "@babel/plugin-transform-object-super-7.8.3" = {
557 name = "_at_babel_slash_plugin-transform-object-super";
558 packageName = "@babel/plugin-transform-object-super";
559 version = "7.8.3";
560 src = fetchurl {
561 url = "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz";
562 sha512 = "57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==";
563 };
564 };
565 "@babel/plugin-transform-parameters-7.9.5" = {
566 name = "_at_babel_slash_plugin-transform-parameters";
567 packageName = "@babel/plugin-transform-parameters";
568 version = "7.9.5";
569 src = fetchurl {
570 url = "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz";
571 sha512 = "0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==";
572 };
573 };
574 "@babel/plugin-transform-react-jsx-7.3.0" = {
575 name = "_at_babel_slash_plugin-transform-react-jsx";
576 packageName = "@babel/plugin-transform-react-jsx";
577 version = "7.3.0";
578 src = fetchurl {
579 url = "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz";
580 sha512 = "a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==";
581 };
582 };
583 "@babel/plugin-transform-regenerator-7.8.7" = {
584 name = "_at_babel_slash_plugin-transform-regenerator";
585 packageName = "@babel/plugin-transform-regenerator";
586 version = "7.8.7";
587 src = fetchurl {
588 url = "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz";
589 sha512 = "TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==";
590 };
591 };
592 "@babel/plugin-transform-shorthand-properties-7.8.3" = {
593 name = "_at_babel_slash_plugin-transform-shorthand-properties";
594 packageName = "@babel/plugin-transform-shorthand-properties";
595 version = "7.8.3";
596 src = fetchurl {
597 url = "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz";
598 sha512 = "I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==";
599 };
600 };
601 "@babel/plugin-transform-spread-7.8.3" = {
602 name = "_at_babel_slash_plugin-transform-spread";
603 packageName = "@babel/plugin-transform-spread";
604 version = "7.8.3";
605 src = fetchurl {
606 url = "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz";
607 sha512 = "CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==";
608 };
609 };
610 "@babel/plugin-transform-sticky-regex-7.8.3" = {
611 name = "_at_babel_slash_plugin-transform-sticky-regex";
612 packageName = "@babel/plugin-transform-sticky-regex";
613 version = "7.8.3";
614 src = fetchurl {
615 url = "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz";
616 sha512 = "9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==";
617 };
618 };
619 "@babel/plugin-transform-template-literals-7.8.3" = {
620 name = "_at_babel_slash_plugin-transform-template-literals";
621 packageName = "@babel/plugin-transform-template-literals";
622 version = "7.8.3";
623 src = fetchurl {
624 url = "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz";
625 sha512 = "820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==";
626 };
627 };
628 "@babel/plugin-transform-typeof-symbol-7.8.4" = {
629 name = "_at_babel_slash_plugin-transform-typeof-symbol";
630 packageName = "@babel/plugin-transform-typeof-symbol";
631 version = "7.8.4";
632 src = fetchurl {
633 url = "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz";
634 sha512 = "2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==";
635 };
636 };
637 "@babel/plugin-transform-unicode-regex-7.8.3" = {
638 name = "_at_babel_slash_plugin-transform-unicode-regex";
639 packageName = "@babel/plugin-transform-unicode-regex";
640 version = "7.8.3";
641 src = fetchurl {
642 url = "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz";
643 sha512 = "+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==";
644 };
645 };
646 "@babel/preset-env-7.3.4" = {
647 name = "_at_babel_slash_preset-env";
648 packageName = "@babel/preset-env";
649 version = "7.3.4";
650 src = fetchurl {
651 url = "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.4.tgz";
652 sha512 = "2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==";
653 };
654 };
655 "@babel/runtime-7.3.4" = {
656 name = "_at_babel_slash_runtime";
657 packageName = "@babel/runtime";
658 version = "7.3.4";
659 src = fetchurl {
660 url = "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz";
661 sha512 = "IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==";
662 };
663 };
664 "@babel/runtime-7.9.2" = {
665 name = "_at_babel_slash_runtime";
666 packageName = "@babel/runtime";
667 version = "7.9.2";
668 src = fetchurl {
669 url = "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz";
670 sha512 = "NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==";
671 };
672 };
673 "@babel/template-7.2.2" = {
674 name = "_at_babel_slash_template";
675 packageName = "@babel/template";
676 version = "7.2.2";
677 src = fetchurl {
678 url = "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz";
679 sha512 = "zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==";
680 };
681 };
682 "@babel/template-7.8.6" = {
683 name = "_at_babel_slash_template";
684 packageName = "@babel/template";
685 version = "7.8.6";
686 src = fetchurl {
687 url = "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz";
688 sha512 = "zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==";
689 };
690 };
691 "@babel/traverse-7.3.4" = {
692 name = "_at_babel_slash_traverse";
693 packageName = "@babel/traverse";
694 version = "7.3.4";
695 src = fetchurl {
696 url = "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz";
697 sha512 = "TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==";
698 };
699 };
700 "@babel/traverse-7.9.5" = {
701 name = "_at_babel_slash_traverse";
702 packageName = "@babel/traverse";
703 version = "7.9.5";
704 src = fetchurl {
705 url = "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz";
706 sha512 = "c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==";
707 };
708 };
709 "@babel/types-7.3.4" = {
710 name = "_at_babel_slash_types";
711 packageName = "@babel/types";
712 version = "7.3.4";
713 src = fetchurl {
714 url = "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz";
715 sha512 = "WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==";
716 };
717 };
718 "@babel/types-7.9.5" = {
719 name = "_at_babel_slash_types";
720 packageName = "@babel/types";
721 version = "7.9.5";
722 src = fetchurl {
723 url = "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz";
724 sha512 = "XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==";
725 };
726 };
727 "@iarna/toml-2.2.5" = {
728 name = "_at_iarna_slash_toml";
729 packageName = "@iarna/toml";
730 version = "2.2.5";
731 src = fetchurl {
732 url = "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz";
733 sha512 = "trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==";
734 };
735 };
736 "@mrmlnc/readdir-enhanced-2.2.1" = {
737 name = "_at_mrmlnc_slash_readdir-enhanced";
738 packageName = "@mrmlnc/readdir-enhanced";
739 version = "2.2.1";
740 src = fetchurl {
741 url = "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz";
742 sha512 = "bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==";
743 };
744 };
745 "@nodelib/fs.stat-1.1.3" = {
746 name = "_at_nodelib_slash_fs.stat";
747 packageName = "@nodelib/fs.stat";
748 version = "1.1.3";
749 src = fetchurl {
750 url = "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz";
751 sha512 = "shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==";
752 };
753 };
754 "@parcel/fs-1.11.0" = {
755 name = "_at_parcel_slash_fs";
756 packageName = "@parcel/fs";
757 version = "1.11.0";
758 src = fetchurl {
759 url = "https://registry.npmjs.org/@parcel/fs/-/fs-1.11.0.tgz";
760 sha512 = "86RyEqULbbVoeo8OLcv+LQ1Vq2PKBAvWTU9fCgALxuCTbbs5Ppcvll4Vr+Ko1AnmMzja/k++SzNAwJfeQXVlpA==";
761 };
762 };
763 "@parcel/logger-1.11.1" = {
764 name = "_at_parcel_slash_logger";
765 packageName = "@parcel/logger";
766 version = "1.11.1";
767 src = fetchurl {
768 url = "https://registry.npmjs.org/@parcel/logger/-/logger-1.11.1.tgz";
769 sha512 = "9NF3M6UVeP2udOBDILuoEHd8VrF4vQqoWHEafymO1pfSoOMfxrSJZw1MfyAAIUN/IFp9qjcpDCUbDZB+ioVevA==";
770 };
771 };
772 "@parcel/utils-1.11.0" = {
773 name = "_at_parcel_slash_utils";
774 packageName = "@parcel/utils";
775 version = "1.11.0";
776 src = fetchurl {
777 url = "https://registry.npmjs.org/@parcel/utils/-/utils-1.11.0.tgz";
778 sha512 = "cA3p4jTlaMeOtAKR/6AadanOPvKeg8VwgnHhOyfi0yClD0TZS/hi9xu12w4EzA/8NtHu0g6o4RDfcNjqN8l1AQ==";
779 };
780 };
781 "@parcel/watcher-1.12.1" = {
782 name = "_at_parcel_slash_watcher";
783 packageName = "@parcel/watcher";
784 version = "1.12.1";
785 src = fetchurl {
786 url = "https://registry.npmjs.org/@parcel/watcher/-/watcher-1.12.1.tgz";
787 sha512 = "od+uCtCxC/KoNQAIE1vWx1YTyKYY+7CTrxBJPRh3cDWw/C0tCtlBMVlrbplscGoEpt6B27KhJDCv82PBxOERNA==";
788 };
789 };
790 "@parcel/workers-1.11.0" = {
791 name = "_at_parcel_slash_workers";
792 packageName = "@parcel/workers";
793 version = "1.11.0";
794 src = fetchurl {
795 url = "https://registry.npmjs.org/@parcel/workers/-/workers-1.11.0.tgz";
796 sha512 = "USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ==";
797 };
798 };
799 "@types/q-1.5.2" = {
800 name = "_at_types_slash_q";
801 packageName = "@types/q";
802 version = "1.5.2";
803 src = fetchurl {
804 url = "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz";
805 sha512 = "ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==";
806 };
807 };
808 "abab-2.0.3" = {
809 name = "abab";
810 packageName = "abab";
811 version = "2.0.3";
812 src = fetchurl {
813 url = "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz";
814 sha512 = "tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==";
815 };
816 };
817 "abbrev-1.1.1" = {
818 name = "abbrev";
819 packageName = "abbrev";
820 version = "1.1.1";
821 src = fetchurl {
822 url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";
823 sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==";
824 };
825 };
826 "acorn-6.4.1" = {
827 name = "acorn";
828 packageName = "acorn";
829 version = "6.4.1";
830 src = fetchurl {
831 url = "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz";
832 sha512 = "ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==";
833 };
834 };
835 "acorn-7.1.1" = {
836 name = "acorn";
837 packageName = "acorn";
838 version = "7.1.1";
839 src = fetchurl {
840 url = "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz";
841 sha512 = "add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==";
842 };
843 };
844 "acorn-globals-4.3.4" = {
845 name = "acorn-globals";
846 packageName = "acorn-globals";
847 version = "4.3.4";
848 src = fetchurl {
849 url = "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz";
850 sha512 = "clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==";
851 };
852 };
853 "acorn-walk-6.2.0" = {
854 name = "acorn-walk";
855 packageName = "acorn-walk";
856 version = "6.2.0";
857 src = fetchurl {
858 url = "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz";
859 sha512 = "7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==";
860 };
861 };
862 "ajv-6.12.2" = {
863 name = "ajv";
864 packageName = "ajv";
865 version = "6.12.2";
866 src = fetchurl {
867 url = "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz";
868 sha512 = "k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==";
869 };
870 };
871 "alphanum-sort-1.0.2" = {
872 name = "alphanum-sort";
873 packageName = "alphanum-sort";
874 version = "1.0.2";
875 src = fetchurl {
876 url = "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz";
877 sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3";
878 };
879 };
880 "ansi-regex-2.1.1" = {
881 name = "ansi-regex";
882 packageName = "ansi-regex";
883 version = "2.1.1";
884 src = fetchurl {
885 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
886 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
887 };
888 };
889 "ansi-regex-3.0.0" = {
890 name = "ansi-regex";
891 packageName = "ansi-regex";
892 version = "3.0.0";
893 src = fetchurl {
894 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz";
895 sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
896 };
897 };
898 "ansi-regex-4.1.0" = {
899 name = "ansi-regex";
900 packageName = "ansi-regex";
901 version = "4.1.0";
902 src = fetchurl {
903 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz";
904 sha512 = "1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==";
905 };
906 };
907 "ansi-styles-2.2.1" = {
908 name = "ansi-styles";
909 packageName = "ansi-styles";
910 version = "2.2.1";
911 src = fetchurl {
912 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
913 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
914 };
915 };
916 "ansi-styles-3.2.1" = {
917 name = "ansi-styles";
918 packageName = "ansi-styles";
919 version = "3.2.1";
920 src = fetchurl {
921 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";
922 sha512 = "VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==";
923 };
924 };
925 "ansi-to-html-0.6.14" = {
926 name = "ansi-to-html";
927 packageName = "ansi-to-html";
928 version = "0.6.14";
929 src = fetchurl {
930 url = "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.14.tgz";
931 sha512 = "7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA==";
932 };
933 };
934 "anymatch-2.0.0" = {
935 name = "anymatch";
936 packageName = "anymatch";
937 version = "2.0.0";
938 src = fetchurl {
939 url = "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz";
940 sha512 = "5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==";
941 };
942 };
943 "argparse-1.0.10" = {
944 name = "argparse";
945 packageName = "argparse";
946 version = "1.0.10";
947 src = fetchurl {
948 url = "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz";
949 sha512 = "o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==";
950 };
951 };
952 "arr-diff-4.0.0" = {
953 name = "arr-diff";
954 packageName = "arr-diff";
955 version = "4.0.0";
956 src = fetchurl {
957 url = "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz";
958 sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
959 };
960 };
961 "arr-flatten-1.1.0" = {
962 name = "arr-flatten";
963 packageName = "arr-flatten";
964 version = "1.1.0";
965 src = fetchurl {
966 url = "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz";
967 sha512 = "L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==";
968 };
969 };
970 "arr-union-3.1.0" = {
971 name = "arr-union";
972 packageName = "arr-union";
973 version = "3.1.0";
974 src = fetchurl {
975 url = "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz";
976 sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
977 };
978 };
979 "array-equal-1.0.0" = {
980 name = "array-equal";
981 packageName = "array-equal";
982 version = "1.0.0";
983 src = fetchurl {
984 url = "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz";
985 sha1 = "8c2a5ef2472fd9ea742b04c77a75093ba2757c93";
986 };
987 };
988 "array-unique-0.3.2" = {
989 name = "array-unique";
990 packageName = "array-unique";
991 version = "0.3.2";
992 src = fetchurl {
993 url = "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz";
994 sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
995 };
996 };
997 "asn1-0.2.4" = {
998 name = "asn1";
999 packageName = "asn1";
1000 version = "0.2.4";
1001 src = fetchurl {
1002 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
1003 sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
1004 };
1005 };
1006 "asn1.js-4.10.1" = {
1007 name = "asn1.js";
1008 packageName = "asn1.js";
1009 version = "4.10.1";
1010 src = fetchurl {
1011 url = "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz";
1012 sha512 = "p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==";
1013 };
1014 };
1015 "assert-1.5.0" = {
1016 name = "assert";
1017 packageName = "assert";
1018 version = "1.5.0";
1019 src = fetchurl {
1020 url = "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz";
1021 sha512 = "EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==";
1022 };
1023 };
1024 "assert-plus-1.0.0" = {
1025 name = "assert-plus";
1026 packageName = "assert-plus";
1027 version = "1.0.0";
1028 src = fetchurl {
1029 url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
1030 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
1031 };
1032 };
1033 "assign-symbols-1.0.0" = {
1034 name = "assign-symbols";
1035 packageName = "assign-symbols";
1036 version = "1.0.0";
1037 src = fetchurl {
1038 url = "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz";
1039 sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
1040 };
1041 };
1042 "async-each-1.0.3" = {
1043 name = "async-each";
1044 packageName = "async-each";
1045 version = "1.0.3";
1046 src = fetchurl {
1047 url = "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz";
1048 sha512 = "z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==";
1049 };
1050 };
1051 "async-limiter-1.0.1" = {
1052 name = "async-limiter";
1053 packageName = "async-limiter";
1054 version = "1.0.1";
1055 src = fetchurl {
1056 url = "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz";
1057 sha512 = "csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==";
1058 };
1059 };
1060 "asynckit-0.4.0" = {
1061 name = "asynckit";
1062 packageName = "asynckit";
1063 version = "0.4.0";
1064 src = fetchurl {
1065 url = "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";
1066 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
1067 };
1068 };
1069 "atob-2.1.2" = {
1070 name = "atob";
1071 packageName = "atob";
1072 version = "2.1.2";
1073 src = fetchurl {
1074 url = "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz";
1075 sha512 = "Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==";
1076 };
1077 };
1078 "aws-sign2-0.7.0" = {
1079 name = "aws-sign2";
1080 packageName = "aws-sign2";
1081 version = "0.7.0";
1082 src = fetchurl {
1083 url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";
1084 sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
1085 };
1086 };
1087 "aws4-1.9.1" = {
1088 name = "aws4";
1089 packageName = "aws4";
1090 version = "1.9.1";
1091 src = fetchurl {
1092 url = "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz";
1093 sha512 = "wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==";
1094 };
1095 };
1096 "babel-plugin-dynamic-import-node-2.3.3" = {
1097 name = "babel-plugin-dynamic-import-node";
1098 packageName = "babel-plugin-dynamic-import-node";
1099 version = "2.3.3";
1100 src = fetchurl {
1101 url = "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz";
1102 sha512 = "jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==";
1103 };
1104 };
1105 "babel-runtime-6.26.0" = {
1106 name = "babel-runtime";
1107 packageName = "babel-runtime";
1108 version = "6.26.0";
1109 src = fetchurl {
1110 url = "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz";
1111 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
1112 };
1113 };
1114 "babel-types-6.26.0" = {
1115 name = "babel-types";
1116 packageName = "babel-types";
1117 version = "6.26.0";
1118 src = fetchurl {
1119 url = "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz";
1120 sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497";
1121 };
1122 };
1123 "babylon-walk-1.0.2" = {
1124 name = "babylon-walk";
1125 packageName = "babylon-walk";
1126 version = "1.0.2";
1127 src = fetchurl {
1128 url = "https://registry.npmjs.org/babylon-walk/-/babylon-walk-1.0.2.tgz";
1129 sha1 = "3b15a5ddbb482a78b4ce9c01c8ba181702d9d6ce";
1130 };
1131 };
1132 "balanced-match-1.0.0" = {
1133 name = "balanced-match";
1134 packageName = "balanced-match";
1135 version = "1.0.0";
1136 src = fetchurl {
1137 url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
1138 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
1139 };
1140 };
1141 "base-0.11.2" = {
1142 name = "base";
1143 packageName = "base";
1144 version = "0.11.2";
1145 src = fetchurl {
1146 url = "https://registry.npmjs.org/base/-/base-0.11.2.tgz";
1147 sha512 = "5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==";
1148 };
1149 };
1150 "base64-js-1.3.1" = {
1151 name = "base64-js";
1152 packageName = "base64-js";
1153 version = "1.3.1";
1154 src = fetchurl {
1155 url = "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz";
1156 sha512 = "mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==";
1157 };
1158 };
1159 "bcrypt-pbkdf-1.0.2" = {
1160 name = "bcrypt-pbkdf";
1161 packageName = "bcrypt-pbkdf";
1162 version = "1.0.2";
1163 src = fetchurl {
1164 url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
1165 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
1166 };
1167 };
1168 "binary-extensions-1.13.1" = {
1169 name = "binary-extensions";
1170 packageName = "binary-extensions";
1171 version = "1.13.1";
1172 src = fetchurl {
1173 url = "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz";
1174 sha512 = "Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==";
1175 };
1176 };
1177 "bindings-1.5.0" = {
1178 name = "bindings";
1179 packageName = "bindings";
1180 version = "1.5.0";
1181 src = fetchurl {
1182 url = "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz";
1183 sha512 = "p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==";
1184 };
1185 };
1186 "bn.js-4.11.8" = {
1187 name = "bn.js";
1188 packageName = "bn.js";
1189 version = "4.11.8";
1190 src = fetchurl {
1191 url = "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz";
1192 sha512 = "ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==";
1193 };
1194 };
1195 "boolbase-1.0.0" = {
1196 name = "boolbase";
1197 packageName = "boolbase";
1198 version = "1.0.0";
1199 src = fetchurl {
1200 url = "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz";
1201 sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
1202 };
1203 };
1204 "brace-expansion-1.1.11" = {
1205 name = "brace-expansion";
1206 packageName = "brace-expansion";
1207 version = "1.1.11";
1208 src = fetchurl {
1209 url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
1210 sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
1211 };
1212 };
1213 "braces-2.3.2" = {
1214 name = "braces";
1215 packageName = "braces";
1216 version = "2.3.2";
1217 src = fetchurl {
1218 url = "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz";
1219 sha512 = "aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==";
1220 };
1221 };
1222 "brfs-1.6.1" = {
1223 name = "brfs";
1224 packageName = "brfs";
1225 version = "1.6.1";
1226 src = fetchurl {
1227 url = "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz";
1228 sha512 = "OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==";
1229 };
1230 };
1231 "brorand-1.1.0" = {
1232 name = "brorand";
1233 packageName = "brorand";
1234 version = "1.1.0";
1235 src = fetchurl {
1236 url = "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz";
1237 sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
1238 };
1239 };
1240 "browser-process-hrtime-1.0.0" = {
1241 name = "browser-process-hrtime";
1242 packageName = "browser-process-hrtime";
1243 version = "1.0.0";
1244 src = fetchurl {
1245 url = "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz";
1246 sha512 = "9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==";
1247 };
1248 };
1249 "browserify-aes-1.2.0" = {
1250 name = "browserify-aes";
1251 packageName = "browserify-aes";
1252 version = "1.2.0";
1253 src = fetchurl {
1254 url = "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz";
1255 sha512 = "+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==";
1256 };
1257 };
1258 "browserify-cipher-1.0.1" = {
1259 name = "browserify-cipher";
1260 packageName = "browserify-cipher";
1261 version = "1.0.1";
1262 src = fetchurl {
1263 url = "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz";
1264 sha512 = "sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==";
1265 };
1266 };
1267 "browserify-des-1.0.2" = {
1268 name = "browserify-des";
1269 packageName = "browserify-des";
1270 version = "1.0.2";
1271 src = fetchurl {
1272 url = "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz";
1273 sha512 = "BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==";
1274 };
1275 };
1276 "browserify-rsa-4.0.1" = {
1277 name = "browserify-rsa";
1278 packageName = "browserify-rsa";
1279 version = "4.0.1";
1280 src = fetchurl {
1281 url = "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz";
1282 sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524";
1283 };
1284 };
1285 "browserify-sign-4.0.4" = {
1286 name = "browserify-sign";
1287 packageName = "browserify-sign";
1288 version = "4.0.4";
1289 src = fetchurl {
1290 url = "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz";
1291 sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298";
1292 };
1293 };
1294 "browserify-zlib-0.2.0" = {
1295 name = "browserify-zlib";
1296 packageName = "browserify-zlib";
1297 version = "0.2.0";
1298 src = fetchurl {
1299 url = "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz";
1300 sha512 = "Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==";
1301 };
1302 };
1303 "browserslist-4.12.0" = {
1304 name = "browserslist";
1305 packageName = "browserslist";
1306 version = "4.12.0";
1307 src = fetchurl {
1308 url = "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz";
1309 sha512 = "UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==";
1310 };
1311 };
1312 "buffer-4.9.2" = {
1313 name = "buffer";
1314 packageName = "buffer";
1315 version = "4.9.2";
1316 src = fetchurl {
1317 url = "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz";
1318 sha512 = "xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==";
1319 };
1320 };
1321 "buffer-equal-0.0.1" = {
1322 name = "buffer-equal";
1323 packageName = "buffer-equal";
1324 version = "0.0.1";
1325 src = fetchurl {
1326 url = "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz";
1327 sha1 = "91bc74b11ea405bc916bc6aa908faafa5b4aac4b";
1328 };
1329 };
1330 "buffer-from-1.1.1" = {
1331 name = "buffer-from";
1332 packageName = "buffer-from";
1333 version = "1.1.1";
1334 src = fetchurl {
1335 url = "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz";
1336 sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==";
1337 };
1338 };
1339 "buffer-xor-1.0.3" = {
1340 name = "buffer-xor";
1341 packageName = "buffer-xor";
1342 version = "1.0.3";
1343 src = fetchurl {
1344 url = "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz";
1345 sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
1346 };
1347 };
1348 "builtin-status-codes-3.0.0" = {
1349 name = "builtin-status-codes";
1350 packageName = "builtin-status-codes";
1351 version = "3.0.0";
1352 src = fetchurl {
1353 url = "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz";
1354 sha1 = "85982878e21b98e1c66425e03d0174788f569ee8";
1355 };
1356 };
1357 "cache-base-1.0.1" = {
1358 name = "cache-base";
1359 packageName = "cache-base";
1360 version = "1.0.1";
1361 src = fetchurl {
1362 url = "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz";
1363 sha512 = "AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==";
1364 };
1365 };
1366 "call-me-maybe-1.0.1" = {
1367 name = "call-me-maybe";
1368 packageName = "call-me-maybe";
1369 version = "1.0.1";
1370 src = fetchurl {
1371 url = "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz";
1372 sha1 = "26d208ea89e37b5cbde60250a15f031c16a4d66b";
1373 };
1374 };
1375 "caller-callsite-2.0.0" = {
1376 name = "caller-callsite";
1377 packageName = "caller-callsite";
1378 version = "2.0.0";
1379 src = fetchurl {
1380 url = "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz";
1381 sha1 = "847e0fce0a223750a9a027c54b33731ad3154134";
1382 };
1383 };
1384 "caller-path-2.0.0" = {
1385 name = "caller-path";
1386 packageName = "caller-path";
1387 version = "2.0.0";
1388 src = fetchurl {
1389 url = "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz";
1390 sha1 = "468f83044e369ab2010fac5f06ceee15bb2cb1f4";
1391 };
1392 };
1393 "callsites-2.0.0" = {
1394 name = "callsites";
1395 packageName = "callsites";
1396 version = "2.0.0";
1397 src = fetchurl {
1398 url = "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz";
1399 sha1 = "06eb84f00eea413da86affefacbffb36093b3c50";
1400 };
1401 };
1402 "camelcase-5.3.1" = {
1403 name = "camelcase";
1404 packageName = "camelcase";
1405 version = "5.3.1";
1406 src = fetchurl {
1407 url = "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz";
1408 sha512 = "L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==";
1409 };
1410 };
1411 "caniuse-api-3.0.0" = {
1412 name = "caniuse-api";
1413 packageName = "caniuse-api";
1414 version = "3.0.0";
1415 src = fetchurl {
1416 url = "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz";
1417 sha512 = "bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==";
1418 };
1419 };
1420 "caniuse-lite-1.0.30001048" = {
1421 name = "caniuse-lite";
1422 packageName = "caniuse-lite";
1423 version = "1.0.30001048";
1424 src = fetchurl {
1425 url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz";
1426 sha512 = "g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==";
1427 };
1428 };
1429 "caseless-0.12.0" = {
1430 name = "caseless";
1431 packageName = "caseless";
1432 version = "0.12.0";
1433 src = fetchurl {
1434 url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
1435 sha1 = "1b681c21ff84033c826543090689420d187151dc";
1436 };
1437 };
1438 "chalk-1.1.3" = {
1439 name = "chalk";
1440 packageName = "chalk";
1441 version = "1.1.3";
1442 src = fetchurl {
1443 url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
1444 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
1445 };
1446 };
1447 "chalk-2.4.2" = {
1448 name = "chalk";
1449 packageName = "chalk";
1450 version = "2.4.2";
1451 src = fetchurl {
1452 url = "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz";
1453 sha512 = "Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==";
1454 };
1455 };
1456 "chokidar-2.1.8" = {
1457 name = "chokidar";
1458 packageName = "chokidar";
1459 version = "2.1.8";
1460 src = fetchurl {
1461 url = "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz";
1462 sha512 = "ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==";
1463 };
1464 };
1465 "cipher-base-1.0.4" = {
1466 name = "cipher-base";
1467 packageName = "cipher-base";
1468 version = "1.0.4";
1469 src = fetchurl {
1470 url = "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz";
1471 sha512 = "Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==";
1472 };
1473 };
1474 "class-utils-0.3.6" = {
1475 name = "class-utils";
1476 packageName = "class-utils";
1477 version = "0.3.6";
1478 src = fetchurl {
1479 url = "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz";
1480 sha512 = "qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==";
1481 };
1482 };
1483 "cli-cursor-2.1.0" = {
1484 name = "cli-cursor";
1485 packageName = "cli-cursor";
1486 version = "2.1.0";
1487 src = fetchurl {
1488 url = "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz";
1489 sha1 = "b35dac376479facc3e94747d41d0d0f5238ffcb5";
1490 };
1491 };
1492 "cli-spinners-1.3.1" = {
1493 name = "cli-spinners";
1494 packageName = "cli-spinners";
1495 version = "1.3.1";
1496 src = fetchurl {
1497 url = "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz";
1498 sha512 = "1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==";
1499 };
1500 };
1501 "cliui-5.0.0" = {
1502 name = "cliui";
1503 packageName = "cliui";
1504 version = "5.0.0";
1505 src = fetchurl {
1506 url = "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz";
1507 sha512 = "PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==";
1508 };
1509 };
1510 "clone-1.0.4" = {
1511 name = "clone";
1512 packageName = "clone";
1513 version = "1.0.4";
1514 src = fetchurl {
1515 url = "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz";
1516 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
1517 };
1518 };
1519 "clone-2.1.2" = {
1520 name = "clone";
1521 packageName = "clone";
1522 version = "2.1.2";
1523 src = fetchurl {
1524 url = "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz";
1525 sha1 = "1b7f4b9f591f1e8f83670401600345a02887435f";
1526 };
1527 };
1528 "clones-1.2.0" = {
1529 name = "clones";
1530 packageName = "clones";
1531 version = "1.2.0";
1532 src = fetchurl {
1533 url = "https://registry.npmjs.org/clones/-/clones-1.2.0.tgz";
1534 sha512 = "FXDYw4TjR8wgPZYui2LeTqWh1BLpfQ8lB6upMtlpDF6WlOOxghmTTxWyngdKTgozqBgKnHbTVwTE+hOHqAykuQ==";
1535 };
1536 };
1537 "coa-2.0.2" = {
1538 name = "coa";
1539 packageName = "coa";
1540 version = "2.0.2";
1541 src = fetchurl {
1542 url = "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz";
1543 sha512 = "q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==";
1544 };
1545 };
1546 "collection-visit-1.0.0" = {
1547 name = "collection-visit";
1548 packageName = "collection-visit";
1549 version = "1.0.0";
1550 src = fetchurl {
1551 url = "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz";
1552 sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
1553 };
1554 };
1555 "color-3.1.2" = {
1556 name = "color";
1557 packageName = "color";
1558 version = "3.1.2";
1559 src = fetchurl {
1560 url = "https://registry.npmjs.org/color/-/color-3.1.2.tgz";
1561 sha512 = "vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==";
1562 };
1563 };
1564 "color-convert-1.9.3" = {
1565 name = "color-convert";
1566 packageName = "color-convert";
1567 version = "1.9.3";
1568 src = fetchurl {
1569 url = "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz";
1570 sha512 = "QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==";
1571 };
1572 };
1573 "color-name-1.1.3" = {
1574 name = "color-name";
1575 packageName = "color-name";
1576 version = "1.1.3";
1577 src = fetchurl {
1578 url = "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz";
1579 sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
1580 };
1581 };
1582 "color-string-1.5.3" = {
1583 name = "color-string";
1584 packageName = "color-string";
1585 version = "1.5.3";
1586 src = fetchurl {
1587 url = "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz";
1588 sha512 = "dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==";
1589 };
1590 };
1591 "combined-stream-1.0.8" = {
1592 name = "combined-stream";
1593 packageName = "combined-stream";
1594 version = "1.0.8";
1595 src = fetchurl {
1596 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz";
1597 sha512 = "FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==";
1598 };
1599 };
1600 "command-exists-1.2.9" = {
1601 name = "command-exists";
1602 packageName = "command-exists";
1603 version = "1.2.9";
1604 src = fetchurl {
1605 url = "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz";
1606 sha512 = "LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==";
1607 };
1608 };
1609 "commander-2.20.3" = {
1610 name = "commander";
1611 packageName = "commander";
1612 version = "2.20.3";
1613 src = fetchurl {
1614 url = "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz";
1615 sha512 = "GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==";
1616 };
1617 };
1618 "component-emitter-1.3.0" = {
1619 name = "component-emitter";
1620 packageName = "component-emitter";
1621 version = "1.3.0";
1622 src = fetchurl {
1623 url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz";
1624 sha512 = "Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==";
1625 };
1626 };
1627 "concat-map-0.0.1" = {
1628 name = "concat-map";
1629 packageName = "concat-map";
1630 version = "0.0.1";
1631 src = fetchurl {
1632 url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
1633 sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
1634 };
1635 };
1636 "concat-stream-1.6.2" = {
1637 name = "concat-stream";
1638 packageName = "concat-stream";
1639 version = "1.6.2";
1640 src = fetchurl {
1641 url = "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz";
1642 sha512 = "27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==";
1643 };
1644 };
1645 "config-chain-1.1.12" = {
1646 name = "config-chain";
1647 packageName = "config-chain";
1648 version = "1.1.12";
1649 src = fetchurl {
1650 url = "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz";
1651 sha512 = "a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==";
1652 };
1653 };
1654 "console-browserify-1.2.0" = {
1655 name = "console-browserify";
1656 packageName = "console-browserify";
1657 version = "1.2.0";
1658 src = fetchurl {
1659 url = "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz";
1660 sha512 = "ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==";
1661 };
1662 };
1663 "constants-browserify-1.0.0" = {
1664 name = "constants-browserify";
1665 packageName = "constants-browserify";
1666 version = "1.0.0";
1667 src = fetchurl {
1668 url = "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz";
1669 sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
1670 };
1671 };
1672 "convert-source-map-1.7.0" = {
1673 name = "convert-source-map";
1674 packageName = "convert-source-map";
1675 version = "1.7.0";
1676 src = fetchurl {
1677 url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz";
1678 sha512 = "4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==";
1679 };
1680 };
1681 "copy-descriptor-0.1.1" = {
1682 name = "copy-descriptor";
1683 packageName = "copy-descriptor";
1684 version = "0.1.1";
1685 src = fetchurl {
1686 url = "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
1687 sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
1688 };
1689 };
1690 "core-js-2.6.11" = {
1691 name = "core-js";
1692 packageName = "core-js";
1693 version = "2.6.11";
1694 src = fetchurl {
1695 url = "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz";
1696 sha512 = "5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==";
1697 };
1698 };
1699 "core-util-is-1.0.2" = {
1700 name = "core-util-is";
1701 packageName = "core-util-is";
1702 version = "1.0.2";
1703 src = fetchurl {
1704 url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
1705 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
1706 };
1707 };
1708 "cosmiconfig-5.2.1" = {
1709 name = "cosmiconfig";
1710 packageName = "cosmiconfig";
1711 version = "5.2.1";
1712 src = fetchurl {
1713 url = "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz";
1714 sha512 = "H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==";
1715 };
1716 };
1717 "create-ecdh-4.0.3" = {
1718 name = "create-ecdh";
1719 packageName = "create-ecdh";
1720 version = "4.0.3";
1721 src = fetchurl {
1722 url = "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz";
1723 sha512 = "GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==";
1724 };
1725 };
1726 "create-hash-1.2.0" = {
1727 name = "create-hash";
1728 packageName = "create-hash";
1729 version = "1.2.0";
1730 src = fetchurl {
1731 url = "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz";
1732 sha512 = "z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==";
1733 };
1734 };
1735 "create-hmac-1.1.7" = {
1736 name = "create-hmac";
1737 packageName = "create-hmac";
1738 version = "1.1.7";
1739 src = fetchurl {
1740 url = "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz";
1741 sha512 = "MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==";
1742 };
1743 };
1744 "cross-spawn-6.0.5" = {
1745 name = "cross-spawn";
1746 packageName = "cross-spawn";
1747 version = "6.0.5";
1748 src = fetchurl {
1749 url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz";
1750 sha512 = "eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==";
1751 };
1752 };
1753 "crypto-browserify-3.12.0" = {
1754 name = "crypto-browserify";
1755 packageName = "crypto-browserify";
1756 version = "3.12.0";
1757 src = fetchurl {
1758 url = "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz";
1759 sha512 = "fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==";
1760 };
1761 };
1762 "css-color-names-0.0.4" = {
1763 name = "css-color-names";
1764 packageName = "css-color-names";
1765 version = "0.0.4";
1766 src = fetchurl {
1767 url = "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz";
1768 sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0";
1769 };
1770 };
1771 "css-declaration-sorter-4.0.1" = {
1772 name = "css-declaration-sorter";
1773 packageName = "css-declaration-sorter";
1774 version = "4.0.1";
1775 src = fetchurl {
1776 url = "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz";
1777 sha512 = "BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==";
1778 };
1779 };
1780 "css-modules-loader-core-1.1.0" = {
1781 name = "css-modules-loader-core";
1782 packageName = "css-modules-loader-core";
1783 version = "1.1.0";
1784 src = fetchurl {
1785 url = "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz";
1786 sha1 = "5908668294a1becd261ae0a4ce21b0b551f21d16";
1787 };
1788 };
1789 "css-select-2.1.0" = {
1790 name = "css-select";
1791 packageName = "css-select";
1792 version = "2.1.0";
1793 src = fetchurl {
1794 url = "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz";
1795 sha512 = "Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==";
1796 };
1797 };
1798 "css-select-base-adapter-0.1.1" = {
1799 name = "css-select-base-adapter";
1800 packageName = "css-select-base-adapter";
1801 version = "0.1.1";
1802 src = fetchurl {
1803 url = "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz";
1804 sha512 = "jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==";
1805 };
1806 };
1807 "css-selector-tokenizer-0.7.2" = {
1808 name = "css-selector-tokenizer";
1809 packageName = "css-selector-tokenizer";
1810 version = "0.7.2";
1811 src = fetchurl {
1812 url = "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz";
1813 sha512 = "yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==";
1814 };
1815 };
1816 "css-tree-1.0.0-alpha.37" = {
1817 name = "css-tree";
1818 packageName = "css-tree";
1819 version = "1.0.0-alpha.37";
1820 src = fetchurl {
1821 url = "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz";
1822 sha512 = "DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==";
1823 };
1824 };
1825 "css-tree-1.0.0-alpha.39" = {
1826 name = "css-tree";
1827 packageName = "css-tree";
1828 version = "1.0.0-alpha.39";
1829 src = fetchurl {
1830 url = "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz";
1831 sha512 = "7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==";
1832 };
1833 };
1834 "css-what-3.2.1" = {
1835 name = "css-what";
1836 packageName = "css-what";
1837 version = "3.2.1";
1838 src = fetchurl {
1839 url = "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz";
1840 sha512 = "WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==";
1841 };
1842 };
1843 "cssesc-3.0.0" = {
1844 name = "cssesc";
1845 packageName = "cssesc";
1846 version = "3.0.0";
1847 src = fetchurl {
1848 url = "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz";
1849 sha512 = "/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==";
1850 };
1851 };
1852 "cssnano-4.1.10" = {
1853 name = "cssnano";
1854 packageName = "cssnano";
1855 version = "4.1.10";
1856 src = fetchurl {
1857 url = "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz";
1858 sha512 = "5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==";
1859 };
1860 };
1861 "cssnano-preset-default-4.0.7" = {
1862 name = "cssnano-preset-default";
1863 packageName = "cssnano-preset-default";
1864 version = "4.0.7";
1865 src = fetchurl {
1866 url = "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz";
1867 sha512 = "x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==";
1868 };
1869 };
1870 "cssnano-util-get-arguments-4.0.0" = {
1871 name = "cssnano-util-get-arguments";
1872 packageName = "cssnano-util-get-arguments";
1873 version = "4.0.0";
1874 src = fetchurl {
1875 url = "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz";
1876 sha1 = "ed3a08299f21d75741b20f3b81f194ed49cc150f";
1877 };
1878 };
1879 "cssnano-util-get-match-4.0.0" = {
1880 name = "cssnano-util-get-match";
1881 packageName = "cssnano-util-get-match";
1882 version = "4.0.0";
1883 src = fetchurl {
1884 url = "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz";
1885 sha1 = "c0e4ca07f5386bb17ec5e52250b4f5961365156d";
1886 };
1887 };
1888 "cssnano-util-raw-cache-4.0.1" = {
1889 name = "cssnano-util-raw-cache";
1890 packageName = "cssnano-util-raw-cache";
1891 version = "4.0.1";
1892 src = fetchurl {
1893 url = "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz";
1894 sha512 = "qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==";
1895 };
1896 };
1897 "cssnano-util-same-parent-4.0.1" = {
1898 name = "cssnano-util-same-parent";
1899 packageName = "cssnano-util-same-parent";
1900 version = "4.0.1";
1901 src = fetchurl {
1902 url = "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz";
1903 sha512 = "WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==";
1904 };
1905 };
1906 "csso-4.0.3" = {
1907 name = "csso";
1908 packageName = "csso";
1909 version = "4.0.3";
1910 src = fetchurl {
1911 url = "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz";
1912 sha512 = "NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==";
1913 };
1914 };
1915 "cssom-0.3.8" = {
1916 name = "cssom";
1917 packageName = "cssom";
1918 version = "0.3.8";
1919 src = fetchurl {
1920 url = "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz";
1921 sha512 = "b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==";
1922 };
1923 };
1924 "cssstyle-1.4.0" = {
1925 name = "cssstyle";
1926 packageName = "cssstyle";
1927 version = "1.4.0";
1928 src = fetchurl {
1929 url = "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz";
1930 sha512 = "GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==";
1931 };
1932 };
1933 "dashdash-1.14.1" = {
1934 name = "dashdash";
1935 packageName = "dashdash";
1936 version = "1.14.1";
1937 src = fetchurl {
1938 url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
1939 sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
1940 };
1941 };
1942 "data-urls-1.1.0" = {
1943 name = "data-urls";
1944 packageName = "data-urls";
1945 version = "1.1.0";
1946 src = fetchurl {
1947 url = "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz";
1948 sha512 = "YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==";
1949 };
1950 };
1951 "deasync-0.1.19" = {
1952 name = "deasync";
1953 packageName = "deasync";
1954 version = "0.1.19";
1955 src = fetchurl {
1956 url = "https://registry.npmjs.org/deasync/-/deasync-0.1.19.tgz";
1957 sha512 = "oh3MRktfnPlLysCPpBpKZZzb4cUC/p0aA3SyRGp15lN30juJBTo/CiD0d4fR+f1kBtUQoJj1NE9RPNWQ7BQ9Mg==";
1958 };
1959 };
1960 "debug-2.6.9" = {
1961 name = "debug";
1962 packageName = "debug";
1963 version = "2.6.9";
1964 src = fetchurl {
1965 url = "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz";
1966 sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
1967 };
1968 };
1969 "debug-4.1.1" = {
1970 name = "debug";
1971 packageName = "debug";
1972 version = "4.1.1";
1973 src = fetchurl {
1974 url = "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz";
1975 sha512 = "pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==";
1976 };
1977 };
1978 "decamelize-1.2.0" = {
1979 name = "decamelize";
1980 packageName = "decamelize";
1981 version = "1.2.0";
1982 src = fetchurl {
1983 url = "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz";
1984 sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
1985 };
1986 };
1987 "decode-uri-component-0.2.0" = {
1988 name = "decode-uri-component";
1989 packageName = "decode-uri-component";
1990 version = "0.2.0";
1991 src = fetchurl {
1992 url = "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
1993 sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
1994 };
1995 };
1996 "deep-is-0.1.3" = {
1997 name = "deep-is";
1998 packageName = "deep-is";
1999 version = "0.1.3";
2000 src = fetchurl {
2001 url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz";
2002 sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
2003 };
2004 };
2005 "defaults-1.0.3" = {
2006 name = "defaults";
2007 packageName = "defaults";
2008 version = "1.0.3";
2009 src = fetchurl {
2010 url = "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz";
2011 sha1 = "c656051e9817d9ff08ed881477f3fe4019f3ef7d";
2012 };
2013 };
2014 "define-properties-1.1.3" = {
2015 name = "define-properties";
2016 packageName = "define-properties";
2017 version = "1.1.3";
2018 src = fetchurl {
2019 url = "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz";
2020 sha512 = "3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==";
2021 };
2022 };
2023 "define-property-0.2.5" = {
2024 name = "define-property";
2025 packageName = "define-property";
2026 version = "0.2.5";
2027 src = fetchurl {
2028 url = "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz";
2029 sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
2030 };
2031 };
2032 "define-property-1.0.0" = {
2033 name = "define-property";
2034 packageName = "define-property";
2035 version = "1.0.0";
2036 src = fetchurl {
2037 url = "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz";
2038 sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
2039 };
2040 };
2041 "define-property-2.0.2" = {
2042 name = "define-property";
2043 packageName = "define-property";
2044 version = "2.0.2";
2045 src = fetchurl {
2046 url = "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz";
2047 sha512 = "jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==";
2048 };
2049 };
2050 "delayed-stream-1.0.0" = {
2051 name = "delayed-stream";
2052 packageName = "delayed-stream";
2053 version = "1.0.0";
2054 src = fetchurl {
2055 url = "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";
2056 sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
2057 };
2058 };
2059 "depd-1.1.2" = {
2060 name = "depd";
2061 packageName = "depd";
2062 version = "1.1.2";
2063 src = fetchurl {
2064 url = "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz";
2065 sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
2066 };
2067 };
2068 "des.js-1.0.1" = {
2069 name = "des.js";
2070 packageName = "des.js";
2071 version = "1.0.1";
2072 src = fetchurl {
2073 url = "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz";
2074 sha512 = "Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==";
2075 };
2076 };
2077 "destroy-1.0.4" = {
2078 name = "destroy";
2079 packageName = "destroy";
2080 version = "1.0.4";
2081 src = fetchurl {
2082 url = "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz";
2083 sha1 = "978857442c44749e4206613e37946205826abd80";
2084 };
2085 };
2086 "diffie-hellman-5.0.3" = {
2087 name = "diffie-hellman";
2088 packageName = "diffie-hellman";
2089 version = "5.0.3";
2090 src = fetchurl {
2091 url = "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz";
2092 sha512 = "kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==";
2093 };
2094 };
2095 "dom-serializer-0.2.2" = {
2096 name = "dom-serializer";
2097 packageName = "dom-serializer";
2098 version = "0.2.2";
2099 src = fetchurl {
2100 url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz";
2101 sha512 = "2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==";
2102 };
2103 };
2104 "domain-browser-1.2.0" = {
2105 name = "domain-browser";
2106 packageName = "domain-browser";
2107 version = "1.2.0";
2108 src = fetchurl {
2109 url = "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz";
2110 sha512 = "jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==";
2111 };
2112 };
2113 "domelementtype-1.3.1" = {
2114 name = "domelementtype";
2115 packageName = "domelementtype";
2116 version = "1.3.1";
2117 src = fetchurl {
2118 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz";
2119 sha512 = "BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==";
2120 };
2121 };
2122 "domelementtype-2.0.1" = {
2123 name = "domelementtype";
2124 packageName = "domelementtype";
2125 version = "2.0.1";
2126 src = fetchurl {
2127 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz";
2128 sha512 = "5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==";
2129 };
2130 };
2131 "domexception-1.0.1" = {
2132 name = "domexception";
2133 packageName = "domexception";
2134 version = "1.0.1";
2135 src = fetchurl {
2136 url = "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz";
2137 sha512 = "raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==";
2138 };
2139 };
2140 "domhandler-2.4.2" = {
2141 name = "domhandler";
2142 packageName = "domhandler";
2143 version = "2.4.2";
2144 src = fetchurl {
2145 url = "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz";
2146 sha512 = "JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==";
2147 };
2148 };
2149 "domutils-1.7.0" = {
2150 name = "domutils";
2151 packageName = "domutils";
2152 version = "1.7.0";
2153 src = fetchurl {
2154 url = "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz";
2155 sha512 = "Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==";
2156 };
2157 };
2158 "dot-prop-5.2.0" = {
2159 name = "dot-prop";
2160 packageName = "dot-prop";
2161 version = "5.2.0";
2162 src = fetchurl {
2163 url = "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz";
2164 sha512 = "uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==";
2165 };
2166 };
2167 "dotenv-5.0.1" = {
2168 name = "dotenv";
2169 packageName = "dotenv";
2170 version = "5.0.1";
2171 src = fetchurl {
2172 url = "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz";
2173 sha512 = "4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==";
2174 };
2175 };
2176 "dotenv-expand-4.2.0" = {
2177 name = "dotenv-expand";
2178 packageName = "dotenv-expand";
2179 version = "4.2.0";
2180 src = fetchurl {
2181 url = "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz";
2182 sha1 = "def1f1ca5d6059d24a766e587942c21106ce1275";
2183 };
2184 };
2185 "duplexer2-0.1.4" = {
2186 name = "duplexer2";
2187 packageName = "duplexer2";
2188 version = "0.1.4";
2189 src = fetchurl {
2190 url = "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz";
2191 sha1 = "8b12dab878c0d69e3e7891051662a32fc6bddcc1";
2192 };
2193 };
2194 "ecc-jsbn-0.1.2" = {
2195 name = "ecc-jsbn";
2196 packageName = "ecc-jsbn";
2197 version = "0.1.2";
2198 src = fetchurl {
2199 url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
2200 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
2201 };
2202 };
2203 "editorconfig-0.15.3" = {
2204 name = "editorconfig";
2205 packageName = "editorconfig";
2206 version = "0.15.3";
2207 src = fetchurl {
2208 url = "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz";
2209 sha512 = "M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==";
2210 };
2211 };
2212 "ee-first-1.1.1" = {
2213 name = "ee-first";
2214 packageName = "ee-first";
2215 version = "1.1.1";
2216 src = fetchurl {
2217 url = "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz";
2218 sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
2219 };
2220 };
2221 "electron-to-chromium-1.3.418" = {
2222 name = "electron-to-chromium";
2223 packageName = "electron-to-chromium";
2224 version = "1.3.418";
2225 src = fetchurl {
2226 url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.418.tgz";
2227 sha512 = "i2QrQtHes5fK/F9QGG5XacM5WKEuR322fxTYF9e8O9Gu0mc0WmjjwGpV8c7Htso6Zf2Di18lc3SIPxmMeRFBug==";
2228 };
2229 };
2230 "elliptic-6.5.2" = {
2231 name = "elliptic";
2232 packageName = "elliptic";
2233 version = "6.5.2";
2234 src = fetchurl {
2235 url = "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz";
2236 sha512 = "f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==";
2237 };
2238 };
2239 "elm-hot-1.1.1" = {
2240 name = "elm-hot";
2241 packageName = "elm-hot";
2242 version = "1.1.1";
2243 src = fetchurl {
2244 url = "https://registry.npmjs.org/elm-hot/-/elm-hot-1.1.1.tgz";
2245 sha512 = "ZHjoHd2Ev6riNXNQirj3J+GKKXXwedAUikfFBYzlVL/+3CdGs96cpZ7nhAk4c5l//Qa9ymltrqX36mOlr0pPFA==";
2246 };
2247 };
2248 "emoji-regex-7.0.3" = {
2249 name = "emoji-regex";
2250 packageName = "emoji-regex";
2251 version = "7.0.3";
2252 src = fetchurl {
2253 url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz";
2254 sha512 = "CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==";
2255 };
2256 };
2257 "encodeurl-1.0.2" = {
2258 name = "encodeurl";
2259 packageName = "encodeurl";
2260 version = "1.0.2";
2261 src = fetchurl {
2262 url = "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz";
2263 sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
2264 };
2265 };
2266 "entities-1.1.2" = {
2267 name = "entities";
2268 packageName = "entities";
2269 version = "1.1.2";
2270 src = fetchurl {
2271 url = "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz";
2272 sha512 = "f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==";
2273 };
2274 };
2275 "entities-2.0.0" = {
2276 name = "entities";
2277 packageName = "entities";
2278 version = "2.0.0";
2279 src = fetchurl {
2280 url = "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz";
2281 sha512 = "D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==";
2282 };
2283 };
2284 "error-ex-1.3.2" = {
2285 name = "error-ex";
2286 packageName = "error-ex";
2287 version = "1.3.2";
2288 src = fetchurl {
2289 url = "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz";
2290 sha512 = "7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==";
2291 };
2292 };
2293 "es-abstract-1.17.5" = {
2294 name = "es-abstract";
2295 packageName = "es-abstract";
2296 version = "1.17.5";
2297 src = fetchurl {
2298 url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz";
2299 sha512 = "BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==";
2300 };
2301 };
2302 "es-to-primitive-1.2.1" = {
2303 name = "es-to-primitive";
2304 packageName = "es-to-primitive";
2305 version = "1.2.1";
2306 src = fetchurl {
2307 url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz";
2308 sha512 = "QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==";
2309 };
2310 };
2311 "escape-html-1.0.3" = {
2312 name = "escape-html";
2313 packageName = "escape-html";
2314 version = "1.0.3";
2315 src = fetchurl {
2316 url = "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz";
2317 sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
2318 };
2319 };
2320 "escape-string-regexp-1.0.5" = {
2321 name = "escape-string-regexp";
2322 packageName = "escape-string-regexp";
2323 version = "1.0.5";
2324 src = fetchurl {
2325 url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
2326 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
2327 };
2328 };
2329 "escodegen-1.14.1" = {
2330 name = "escodegen";
2331 packageName = "escodegen";
2332 version = "1.14.1";
2333 src = fetchurl {
2334 url = "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz";
2335 sha512 = "Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==";
2336 };
2337 };
2338 "escodegen-1.9.1" = {
2339 name = "escodegen";
2340 packageName = "escodegen";
2341 version = "1.9.1";
2342 src = fetchurl {
2343 url = "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz";
2344 sha512 = "6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==";
2345 };
2346 };
2347 "esprima-3.1.3" = {
2348 name = "esprima";
2349 packageName = "esprima";
2350 version = "3.1.3";
2351 src = fetchurl {
2352 url = "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz";
2353 sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633";
2354 };
2355 };
2356 "esprima-4.0.1" = {
2357 name = "esprima";
2358 packageName = "esprima";
2359 version = "4.0.1";
2360 src = fetchurl {
2361 url = "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz";
2362 sha512 = "eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==";
2363 };
2364 };
2365 "estraverse-4.3.0" = {
2366 name = "estraverse";
2367 packageName = "estraverse";
2368 version = "4.3.0";
2369 src = fetchurl {
2370 url = "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz";
2371 sha512 = "39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==";
2372 };
2373 };
2374 "esutils-2.0.3" = {
2375 name = "esutils";
2376 packageName = "esutils";
2377 version = "2.0.3";
2378 src = fetchurl {
2379 url = "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz";
2380 sha512 = "kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==";
2381 };
2382 };
2383 "etag-1.8.1" = {
2384 name = "etag";
2385 packageName = "etag";
2386 version = "1.8.1";
2387 src = fetchurl {
2388 url = "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz";
2389 sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
2390 };
2391 };
2392 "events-3.1.0" = {
2393 name = "events";
2394 packageName = "events";
2395 version = "3.1.0";
2396 src = fetchurl {
2397 url = "https://registry.npmjs.org/events/-/events-3.1.0.tgz";
2398 sha512 = "Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==";
2399 };
2400 };
2401 "evp_bytestokey-1.0.3" = {
2402 name = "evp_bytestokey";
2403 packageName = "evp_bytestokey";
2404 version = "1.0.3";
2405 src = fetchurl {
2406 url = "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz";
2407 sha512 = "/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==";
2408 };
2409 };
2410 "expand-brackets-2.1.4" = {
2411 name = "expand-brackets";
2412 packageName = "expand-brackets";
2413 version = "2.1.4";
2414 src = fetchurl {
2415 url = "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz";
2416 sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
2417 };
2418 };
2419 "extend-3.0.2" = {
2420 name = "extend";
2421 packageName = "extend";
2422 version = "3.0.2";
2423 src = fetchurl {
2424 url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
2425 sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
2426 };
2427 };
2428 "extend-shallow-2.0.1" = {
2429 name = "extend-shallow";
2430 packageName = "extend-shallow";
2431 version = "2.0.1";
2432 src = fetchurl {
2433 url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz";
2434 sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
2435 };
2436 };
2437 "extend-shallow-3.0.2" = {
2438 name = "extend-shallow";
2439 packageName = "extend-shallow";
2440 version = "3.0.2";
2441 src = fetchurl {
2442 url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz";
2443 sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
2444 };
2445 };
2446 "extglob-2.0.4" = {
2447 name = "extglob";
2448 packageName = "extglob";
2449 version = "2.0.4";
2450 src = fetchurl {
2451 url = "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz";
2452 sha512 = "Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==";
2453 };
2454 };
2455 "extsprintf-1.3.0" = {
2456 name = "extsprintf";
2457 packageName = "extsprintf";
2458 version = "1.3.0";
2459 src = fetchurl {
2460 url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
2461 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
2462 };
2463 };
2464 "falafel-2.2.4" = {
2465 name = "falafel";
2466 packageName = "falafel";
2467 version = "2.2.4";
2468 src = fetchurl {
2469 url = "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz";
2470 sha512 = "0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==";
2471 };
2472 };
2473 "fast-deep-equal-3.1.1" = {
2474 name = "fast-deep-equal";
2475 packageName = "fast-deep-equal";
2476 version = "3.1.1";
2477 src = fetchurl {
2478 url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz";
2479 sha512 = "8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==";
2480 };
2481 };
2482 "fast-glob-2.2.7" = {
2483 name = "fast-glob";
2484 packageName = "fast-glob";
2485 version = "2.2.7";
2486 src = fetchurl {
2487 url = "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz";
2488 sha512 = "g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==";
2489 };
2490 };
2491 "fast-json-stable-stringify-2.1.0" = {
2492 name = "fast-json-stable-stringify";
2493 packageName = "fast-json-stable-stringify";
2494 version = "2.1.0";
2495 src = fetchurl {
2496 url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
2497 sha512 = "lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==";
2498 };
2499 };
2500 "fast-levenshtein-2.0.6" = {
2501 name = "fast-levenshtein";
2502 packageName = "fast-levenshtein";
2503 version = "2.0.6";
2504 src = fetchurl {
2505 url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
2506 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
2507 };
2508 };
2509 "fastparse-1.1.2" = {
2510 name = "fastparse";
2511 packageName = "fastparse";
2512 version = "1.1.2";
2513 src = fetchurl {
2514 url = "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz";
2515 sha512 = "483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==";
2516 };
2517 };
2518 "file-uri-to-path-1.0.0" = {
2519 name = "file-uri-to-path";
2520 packageName = "file-uri-to-path";
2521 version = "1.0.0";
2522 src = fetchurl {
2523 url = "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz";
2524 sha512 = "0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==";
2525 };
2526 };
2527 "filesize-3.6.1" = {
2528 name = "filesize";
2529 packageName = "filesize";
2530 version = "3.6.1";
2531 src = fetchurl {
2532 url = "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz";
2533 sha512 = "7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==";
2534 };
2535 };
2536 "fill-range-4.0.0" = {
2537 name = "fill-range";
2538 packageName = "fill-range";
2539 version = "4.0.0";
2540 src = fetchurl {
2541 url = "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz";
2542 sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
2543 };
2544 };
2545 "find-elm-dependencies-2.0.2" = {
2546 name = "find-elm-dependencies";
2547 packageName = "find-elm-dependencies";
2548 version = "2.0.2";
2549 src = fetchurl {
2550 url = "https://registry.npmjs.org/find-elm-dependencies/-/find-elm-dependencies-2.0.2.tgz";
2551 sha512 = "nM5UCbccD1G8CGK2GsM7ykG3ksOAl9E+34jiDfl07CAl2OPnLpBVWY2hlxEmIkSBfdJjSopEowWHrO0cI8RhxQ==";
2552 };
2553 };
2554 "find-up-2.1.0" = {
2555 name = "find-up";
2556 packageName = "find-up";
2557 version = "2.1.0";
2558 src = fetchurl {
2559 url = "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz";
2560 sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
2561 };
2562 };
2563 "find-up-3.0.0" = {
2564 name = "find-up";
2565 packageName = "find-up";
2566 version = "3.0.0";
2567 src = fetchurl {
2568 url = "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz";
2569 sha512 = "1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==";
2570 };
2571 };
2572 "firstline-1.2.0" = {
2573 name = "firstline";
2574 packageName = "firstline";
2575 version = "1.2.0";
2576 src = fetchurl {
2577 url = "https://registry.npmjs.org/firstline/-/firstline-1.2.0.tgz";
2578 sha1 = "c9f4886e7f7fbf0afc12d71941dce06b192aea05";
2579 };
2580 };
2581 "for-in-1.0.2" = {
2582 name = "for-in";
2583 packageName = "for-in";
2584 version = "1.0.2";
2585 src = fetchurl {
2586 url = "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz";
2587 sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
2588 };
2589 };
2590 "foreach-2.0.5" = {
2591 name = "foreach";
2592 packageName = "foreach";
2593 version = "2.0.5";
2594 src = fetchurl {
2595 url = "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz";
2596 sha1 = "0bee005018aeb260d0a3af3ae658dd0136ec1b99";
2597 };
2598 };
2599 "forever-agent-0.6.1" = {
2600 name = "forever-agent";
2601 packageName = "forever-agent";
2602 version = "0.6.1";
2603 src = fetchurl {
2604 url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
2605 sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
2606 };
2607 };
2608 "form-data-2.3.3" = {
2609 name = "form-data";
2610 packageName = "form-data";
2611 version = "2.3.3";
2612 src = fetchurl {
2613 url = "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";
2614 sha512 = "1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==";
2615 };
2616 };
2617 "fragment-cache-0.2.1" = {
2618 name = "fragment-cache";
2619 packageName = "fragment-cache";
2620 version = "0.2.1";
2621 src = fetchurl {
2622 url = "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz";
2623 sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
2624 };
2625 };
2626 "fresh-0.5.2" = {
2627 name = "fresh";
2628 packageName = "fresh";
2629 version = "0.5.2";
2630 src = fetchurl {
2631 url = "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz";
2632 sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
2633 };
2634 };
2635 "fs.realpath-1.0.0" = {
2636 name = "fs.realpath";
2637 packageName = "fs.realpath";
2638 version = "1.0.0";
2639 src = fetchurl {
2640 url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
2641 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
2642 };
2643 };
2644 "fsevents-1.2.12" = {
2645 name = "fsevents";
2646 packageName = "fsevents";
2647 version = "1.2.12";
2648 src = fetchurl {
2649 url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz";
2650 sha512 = "Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==";
2651 };
2652 };
2653 "function-bind-1.1.1" = {
2654 name = "function-bind";
2655 packageName = "function-bind";
2656 version = "1.1.1";
2657 src = fetchurl {
2658 url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz";
2659 sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==";
2660 };
2661 };
2662 "get-caller-file-2.0.5" = {
2663 name = "get-caller-file";
2664 packageName = "get-caller-file";
2665 version = "2.0.5";
2666 src = fetchurl {
2667 url = "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz";
2668 sha512 = "DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==";
2669 };
2670 };
2671 "get-port-3.2.0" = {
2672 name = "get-port";
2673 packageName = "get-port";
2674 version = "3.2.0";
2675 src = fetchurl {
2676 url = "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz";
2677 sha1 = "dd7ce7de187c06c8bf353796ac71e099f0980ebc";
2678 };
2679 };
2680 "get-value-2.0.6" = {
2681 name = "get-value";
2682 packageName = "get-value";
2683 version = "2.0.6";
2684 src = fetchurl {
2685 url = "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz";
2686 sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
2687 };
2688 };
2689 "getpass-0.1.7" = {
2690 name = "getpass";
2691 packageName = "getpass";
2692 version = "0.1.7";
2693 src = fetchurl {
2694 url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
2695 sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
2696 };
2697 };
2698 "glob-7.1.4" = {
2699 name = "glob";
2700 packageName = "glob";
2701 version = "7.1.4";
2702 src = fetchurl {
2703 url = "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz";
2704 sha512 = "hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==";
2705 };
2706 };
2707 "glob-parent-3.1.0" = {
2708 name = "glob-parent";
2709 packageName = "glob-parent";
2710 version = "3.1.0";
2711 src = fetchurl {
2712 url = "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz";
2713 sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
2714 };
2715 };
2716 "glob-to-regexp-0.3.0" = {
2717 name = "glob-to-regexp";
2718 packageName = "glob-to-regexp";
2719 version = "0.3.0";
2720 src = fetchurl {
2721 url = "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz";
2722 sha1 = "8c5a1494d2066c570cc3bfe4496175acc4d502ab";
2723 };
2724 };
2725 "globals-11.12.0" = {
2726 name = "globals";
2727 packageName = "globals";
2728 version = "11.12.0";
2729 src = fetchurl {
2730 url = "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz";
2731 sha512 = "WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==";
2732 };
2733 };
2734 "graceful-fs-4.2.3" = {
2735 name = "graceful-fs";
2736 packageName = "graceful-fs";
2737 version = "4.2.3";
2738 src = fetchurl {
2739 url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz";
2740 sha512 = "a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==";
2741 };
2742 };
2743 "grapheme-breaker-0.3.2" = {
2744 name = "grapheme-breaker";
2745 packageName = "grapheme-breaker";
2746 version = "0.3.2";
2747 src = fetchurl {
2748 url = "https://registry.npmjs.org/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz";
2749 sha1 = "5b9e6b78c3832452d2ba2bb1cb830f96276410ac";
2750 };
2751 };
2752 "har-schema-2.0.0" = {
2753 name = "har-schema";
2754 packageName = "har-schema";
2755 version = "2.0.0";
2756 src = fetchurl {
2757 url = "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";
2758 sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
2759 };
2760 };
2761 "har-validator-5.1.3" = {
2762 name = "har-validator";
2763 packageName = "har-validator";
2764 version = "5.1.3";
2765 src = fetchurl {
2766 url = "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz";
2767 sha512 = "sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==";
2768 };
2769 };
2770 "has-1.0.3" = {
2771 name = "has";
2772 packageName = "has";
2773 version = "1.0.3";
2774 src = fetchurl {
2775 url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz";
2776 sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==";
2777 };
2778 };
2779 "has-ansi-2.0.0" = {
2780 name = "has-ansi";
2781 packageName = "has-ansi";
2782 version = "2.0.0";
2783 src = fetchurl {
2784 url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
2785 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
2786 };
2787 };
2788 "has-flag-1.0.0" = {
2789 name = "has-flag";
2790 packageName = "has-flag";
2791 version = "1.0.0";
2792 src = fetchurl {
2793 url = "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz";
2794 sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa";
2795 };
2796 };
2797 "has-flag-3.0.0" = {
2798 name = "has-flag";
2799 packageName = "has-flag";
2800 version = "3.0.0";
2801 src = fetchurl {
2802 url = "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz";
2803 sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
2804 };
2805 };
2806 "has-symbols-1.0.1" = {
2807 name = "has-symbols";
2808 packageName = "has-symbols";
2809 version = "1.0.1";
2810 src = fetchurl {
2811 url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz";
2812 sha512 = "PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==";
2813 };
2814 };
2815 "has-value-0.3.1" = {
2816 name = "has-value";
2817 packageName = "has-value";
2818 version = "0.3.1";
2819 src = fetchurl {
2820 url = "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz";
2821 sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
2822 };
2823 };
2824 "has-value-1.0.0" = {
2825 name = "has-value";
2826 packageName = "has-value";
2827 version = "1.0.0";
2828 src = fetchurl {
2829 url = "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz";
2830 sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
2831 };
2832 };
2833 "has-values-0.1.4" = {
2834 name = "has-values";
2835 packageName = "has-values";
2836 version = "0.1.4";
2837 src = fetchurl {
2838 url = "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz";
2839 sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
2840 };
2841 };
2842 "has-values-1.0.0" = {
2843 name = "has-values";
2844 packageName = "has-values";
2845 version = "1.0.0";
2846 src = fetchurl {
2847 url = "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz";
2848 sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
2849 };
2850 };
2851 "hash-base-3.0.4" = {
2852 name = "hash-base";
2853 packageName = "hash-base";
2854 version = "3.0.4";
2855 src = fetchurl {
2856 url = "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz";
2857 sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918";
2858 };
2859 };
2860 "hash.js-1.1.7" = {
2861 name = "hash.js";
2862 packageName = "hash.js";
2863 version = "1.1.7";
2864 src = fetchurl {
2865 url = "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz";
2866 sha512 = "taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==";
2867 };
2868 };
2869 "hex-color-regex-1.1.0" = {
2870 name = "hex-color-regex";
2871 packageName = "hex-color-regex";
2872 version = "1.1.0";
2873 src = fetchurl {
2874 url = "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz";
2875 sha512 = "l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==";
2876 };
2877 };
2878 "hmac-drbg-1.0.1" = {
2879 name = "hmac-drbg";
2880 packageName = "hmac-drbg";
2881 version = "1.0.1";
2882 src = fetchurl {
2883 url = "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz";
2884 sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1";
2885 };
2886 };
2887 "hsl-regex-1.0.0" = {
2888 name = "hsl-regex";
2889 packageName = "hsl-regex";
2890 version = "1.0.0";
2891 src = fetchurl {
2892 url = "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz";
2893 sha1 = "d49330c789ed819e276a4c0d272dffa30b18fe6e";
2894 };
2895 };
2896 "hsla-regex-1.0.0" = {
2897 name = "hsla-regex";
2898 packageName = "hsla-regex";
2899 version = "1.0.0";
2900 src = fetchurl {
2901 url = "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz";
2902 sha1 = "c1ce7a3168c8c6614033a4b5f7877f3b225f9c38";
2903 };
2904 };
2905 "html-comment-regex-1.1.2" = {
2906 name = "html-comment-regex";
2907 packageName = "html-comment-regex";
2908 version = "1.1.2";
2909 src = fetchurl {
2910 url = "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz";
2911 sha512 = "P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==";
2912 };
2913 };
2914 "html-encoding-sniffer-1.0.2" = {
2915 name = "html-encoding-sniffer";
2916 packageName = "html-encoding-sniffer";
2917 version = "1.0.2";
2918 src = fetchurl {
2919 url = "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz";
2920 sha512 = "71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==";
2921 };
2922 };
2923 "html-tags-1.2.0" = {
2924 name = "html-tags";
2925 packageName = "html-tags";
2926 version = "1.2.0";
2927 src = fetchurl {
2928 url = "https://registry.npmjs.org/html-tags/-/html-tags-1.2.0.tgz";
2929 sha1 = "c78de65b5663aa597989dd2b7ab49200d7e4db98";
2930 };
2931 };
2932 "htmlnano-0.2.5" = {
2933 name = "htmlnano";
2934 packageName = "htmlnano";
2935 version = "0.2.5";
2936 src = fetchurl {
2937 url = "https://registry.npmjs.org/htmlnano/-/htmlnano-0.2.5.tgz";
2938 sha512 = "X1iPSwXG/iF9bVs+/obt2n6F64uH0ETkA8zp7qFDmLW9/+A6ueHGeb/+qD67T21qUY22owZPMdawljN50ajkqA==";
2939 };
2940 };
2941 "htmlparser2-3.10.1" = {
2942 name = "htmlparser2";
2943 packageName = "htmlparser2";
2944 version = "3.10.1";
2945 src = fetchurl {
2946 url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz";
2947 sha512 = "IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==";
2948 };
2949 };
2950 "http-errors-1.7.3" = {
2951 name = "http-errors";
2952 packageName = "http-errors";
2953 version = "1.7.3";
2954 src = fetchurl {
2955 url = "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz";
2956 sha512 = "ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==";
2957 };
2958 };
2959 "http-signature-1.2.0" = {
2960 name = "http-signature";
2961 packageName = "http-signature";
2962 version = "1.2.0";
2963 src = fetchurl {
2964 url = "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";
2965 sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
2966 };
2967 };
2968 "https-browserify-1.0.0" = {
2969 name = "https-browserify";
2970 packageName = "https-browserify";
2971 version = "1.0.0";
2972 src = fetchurl {
2973 url = "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz";
2974 sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
2975 };
2976 };
2977 "iconv-lite-0.4.24" = {
2978 name = "iconv-lite";
2979 packageName = "iconv-lite";
2980 version = "0.4.24";
2981 src = fetchurl {
2982 url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz";
2983 sha512 = "v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==";
2984 };
2985 };
2986 "icss-replace-symbols-1.1.0" = {
2987 name = "icss-replace-symbols";
2988 packageName = "icss-replace-symbols";
2989 version = "1.1.0";
2990 src = fetchurl {
2991 url = "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz";
2992 sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded";
2993 };
2994 };
2995 "ieee754-1.1.13" = {
2996 name = "ieee754";
2997 packageName = "ieee754";
2998 version = "1.1.13";
2999 src = fetchurl {
3000 url = "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz";
3001 sha512 = "4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==";
3002 };
3003 };
3004 "import-fresh-2.0.0" = {
3005 name = "import-fresh";
3006 packageName = "import-fresh";
3007 version = "2.0.0";
3008 src = fetchurl {
3009 url = "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz";
3010 sha1 = "d81355c15612d386c61f9ddd3922d4304822a546";
3011 };
3012 };
3013 "indexes-of-1.0.1" = {
3014 name = "indexes-of";
3015 packageName = "indexes-of";
3016 version = "1.0.1";
3017 src = fetchurl {
3018 url = "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz";
3019 sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607";
3020 };
3021 };
3022 "inflight-1.0.6" = {
3023 name = "inflight";
3024 packageName = "inflight";
3025 version = "1.0.6";
3026 src = fetchurl {
3027 url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
3028 sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
3029 };
3030 };
3031 "inherits-2.0.1" = {
3032 name = "inherits";
3033 packageName = "inherits";
3034 version = "2.0.1";
3035 src = fetchurl {
3036 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz";
3037 sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
3038 };
3039 };
3040 "inherits-2.0.3" = {
3041 name = "inherits";
3042 packageName = "inherits";
3043 version = "2.0.3";
3044 src = fetchurl {
3045 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
3046 sha1 = "633c2c83e3da42a502f52466022480f4208261de";
3047 };
3048 };
3049 "inherits-2.0.4" = {
3050 name = "inherits";
3051 packageName = "inherits";
3052 version = "2.0.4";
3053 src = fetchurl {
3054 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz";
3055 sha512 = "k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==";
3056 };
3057 };
3058 "ini-1.3.5" = {
3059 name = "ini";
3060 packageName = "ini";
3061 version = "1.3.5";
3062 src = fetchurl {
3063 url = "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz";
3064 sha512 = "RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==";
3065 };
3066 };
3067 "invariant-2.2.4" = {
3068 name = "invariant";
3069 packageName = "invariant";
3070 version = "2.2.4";
3071 src = fetchurl {
3072 url = "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz";
3073 sha512 = "phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==";
3074 };
3075 };
3076 "is-absolute-url-2.1.0" = {
3077 name = "is-absolute-url";
3078 packageName = "is-absolute-url";
3079 version = "2.1.0";
3080 src = fetchurl {
3081 url = "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz";
3082 sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6";
3083 };
3084 };
3085 "is-absolute-url-3.0.3" = {
3086 name = "is-absolute-url";
3087 packageName = "is-absolute-url";
3088 version = "3.0.3";
3089 src = fetchurl {
3090 url = "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz";
3091 sha512 = "opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==";
3092 };
3093 };
3094 "is-accessor-descriptor-0.1.6" = {
3095 name = "is-accessor-descriptor";
3096 packageName = "is-accessor-descriptor";
3097 version = "0.1.6";
3098 src = fetchurl {
3099 url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
3100 sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
3101 };
3102 };
3103 "is-accessor-descriptor-1.0.0" = {
3104 name = "is-accessor-descriptor";
3105 packageName = "is-accessor-descriptor";
3106 version = "1.0.0";
3107 src = fetchurl {
3108 url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
3109 sha512 = "m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==";
3110 };
3111 };
3112 "is-arrayish-0.2.1" = {
3113 name = "is-arrayish";
3114 packageName = "is-arrayish";
3115 version = "0.2.1";
3116 src = fetchurl {
3117 url = "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz";
3118 sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
3119 };
3120 };
3121 "is-arrayish-0.3.2" = {
3122 name = "is-arrayish";
3123 packageName = "is-arrayish";
3124 version = "0.3.2";
3125 src = fetchurl {
3126 url = "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz";
3127 sha512 = "eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==";
3128 };
3129 };
3130 "is-binary-path-1.0.1" = {
3131 name = "is-binary-path";
3132 packageName = "is-binary-path";
3133 version = "1.0.1";
3134 src = fetchurl {
3135 url = "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz";
3136 sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
3137 };
3138 };
3139 "is-buffer-1.1.6" = {
3140 name = "is-buffer";
3141 packageName = "is-buffer";
3142 version = "1.1.6";
3143 src = fetchurl {
3144 url = "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz";
3145 sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==";
3146 };
3147 };
3148 "is-callable-1.1.5" = {
3149 name = "is-callable";
3150 packageName = "is-callable";
3151 version = "1.1.5";
3152 src = fetchurl {
3153 url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz";
3154 sha512 = "ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==";
3155 };
3156 };
3157 "is-color-stop-1.1.0" = {
3158 name = "is-color-stop";
3159 packageName = "is-color-stop";
3160 version = "1.1.0";
3161 src = fetchurl {
3162 url = "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz";
3163 sha1 = "cfff471aee4dd5c9e158598fbe12967b5cdad345";
3164 };
3165 };
3166 "is-data-descriptor-0.1.4" = {
3167 name = "is-data-descriptor";
3168 packageName = "is-data-descriptor";
3169 version = "0.1.4";
3170 src = fetchurl {
3171 url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
3172 sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
3173 };
3174 };
3175 "is-data-descriptor-1.0.0" = {
3176 name = "is-data-descriptor";
3177 packageName = "is-data-descriptor";
3178 version = "1.0.0";
3179 src = fetchurl {
3180 url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
3181 sha512 = "jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==";
3182 };
3183 };
3184 "is-date-object-1.0.2" = {
3185 name = "is-date-object";
3186 packageName = "is-date-object";
3187 version = "1.0.2";
3188 src = fetchurl {
3189 url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz";
3190 sha512 = "USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==";
3191 };
3192 };
3193 "is-descriptor-0.1.6" = {
3194 name = "is-descriptor";
3195 packageName = "is-descriptor";
3196 version = "0.1.6";
3197 src = fetchurl {
3198 url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz";
3199 sha512 = "avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==";
3200 };
3201 };
3202 "is-descriptor-1.0.2" = {
3203 name = "is-descriptor";
3204 packageName = "is-descriptor";
3205 version = "1.0.2";
3206 src = fetchurl {
3207 url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz";
3208 sha512 = "2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==";
3209 };
3210 };
3211 "is-directory-0.3.1" = {
3212 name = "is-directory";
3213 packageName = "is-directory";
3214 version = "0.3.1";
3215 src = fetchurl {
3216 url = "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz";
3217 sha1 = "61339b6f2475fc772fd9c9d83f5c8575dc154ae1";
3218 };
3219 };
3220 "is-extendable-0.1.1" = {
3221 name = "is-extendable";
3222 packageName = "is-extendable";
3223 version = "0.1.1";
3224 src = fetchurl {
3225 url = "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz";
3226 sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
3227 };
3228 };
3229 "is-extendable-1.0.1" = {
3230 name = "is-extendable";
3231 packageName = "is-extendable";
3232 version = "1.0.1";
3233 src = fetchurl {
3234 url = "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz";
3235 sha512 = "arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==";
3236 };
3237 };
3238 "is-extglob-2.1.1" = {
3239 name = "is-extglob";
3240 packageName = "is-extglob";
3241 version = "2.1.1";
3242 src = fetchurl {
3243 url = "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz";
3244 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
3245 };
3246 };
3247 "is-fullwidth-code-point-2.0.0" = {
3248 name = "is-fullwidth-code-point";
3249 packageName = "is-fullwidth-code-point";
3250 version = "2.0.0";
3251 src = fetchurl {
3252 url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
3253 sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
3254 };
3255 };
3256 "is-glob-3.1.0" = {
3257 name = "is-glob";
3258 packageName = "is-glob";
3259 version = "3.1.0";
3260 src = fetchurl {
3261 url = "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz";
3262 sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
3263 };
3264 };
3265 "is-glob-4.0.1" = {
3266 name = "is-glob";
3267 packageName = "is-glob";
3268 version = "4.0.1";
3269 src = fetchurl {
3270 url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz";
3271 sha512 = "5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==";
3272 };
3273 };
3274 "is-html-1.1.0" = {
3275 name = "is-html";
3276 packageName = "is-html";
3277 version = "1.1.0";
3278 src = fetchurl {
3279 url = "https://registry.npmjs.org/is-html/-/is-html-1.1.0.tgz";
3280 sha1 = "e04f1c18d39485111396f9a0273eab51af218464";
3281 };
3282 };
3283 "is-number-3.0.0" = {
3284 name = "is-number";
3285 packageName = "is-number";
3286 version = "3.0.0";
3287 src = fetchurl {
3288 url = "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz";
3289 sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
3290 };
3291 };
3292 "is-obj-2.0.0" = {
3293 name = "is-obj";
3294 packageName = "is-obj";
3295 version = "2.0.0";
3296 src = fetchurl {
3297 url = "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz";
3298 sha512 = "drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==";
3299 };
3300 };
3301 "is-plain-object-2.0.4" = {
3302 name = "is-plain-object";
3303 packageName = "is-plain-object";
3304 version = "2.0.4";
3305 src = fetchurl {
3306 url = "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz";
3307 sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==";
3308 };
3309 };
3310 "is-regex-1.0.5" = {
3311 name = "is-regex";
3312 packageName = "is-regex";
3313 version = "1.0.5";
3314 src = fetchurl {
3315 url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz";
3316 sha512 = "vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==";
3317 };
3318 };
3319 "is-resolvable-1.1.0" = {
3320 name = "is-resolvable";
3321 packageName = "is-resolvable";
3322 version = "1.1.0";
3323 src = fetchurl {
3324 url = "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz";
3325 sha512 = "qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==";
3326 };
3327 };
3328 "is-svg-3.0.0" = {
3329 name = "is-svg";
3330 packageName = "is-svg";
3331 version = "3.0.0";
3332 src = fetchurl {
3333 url = "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz";
3334 sha512 = "gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==";
3335 };
3336 };
3337 "is-symbol-1.0.3" = {
3338 name = "is-symbol";
3339 packageName = "is-symbol";
3340 version = "1.0.3";
3341 src = fetchurl {
3342 url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz";
3343 sha512 = "OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==";
3344 };
3345 };
3346 "is-typedarray-1.0.0" = {
3347 name = "is-typedarray";
3348 packageName = "is-typedarray";
3349 version = "1.0.0";
3350 src = fetchurl {
3351 url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
3352 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
3353 };
3354 };
3355 "is-url-1.2.4" = {
3356 name = "is-url";
3357 packageName = "is-url";
3358 version = "1.2.4";
3359 src = fetchurl {
3360 url = "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz";
3361 sha512 = "ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==";
3362 };
3363 };
3364 "is-windows-1.0.2" = {
3365 name = "is-windows";
3366 packageName = "is-windows";
3367 version = "1.0.2";
3368 src = fetchurl {
3369 url = "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz";
3370 sha512 = "eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==";
3371 };
3372 };
3373 "is-wsl-1.1.0" = {
3374 name = "is-wsl";
3375 packageName = "is-wsl";
3376 version = "1.1.0";
3377 src = fetchurl {
3378 url = "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz";
3379 sha1 = "1f16e4aa22b04d1336b66188a66af3c600c3a66d";
3380 };
3381 };
3382 "isarray-1.0.0" = {
3383 name = "isarray";
3384 packageName = "isarray";
3385 version = "1.0.0";
3386 src = fetchurl {
3387 url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
3388 sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
3389 };
3390 };
3391 "isarray-2.0.5" = {
3392 name = "isarray";
3393 packageName = "isarray";
3394 version = "2.0.5";
3395 src = fetchurl {
3396 url = "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz";
3397 sha512 = "xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==";
3398 };
3399 };
3400 "isexe-2.0.0" = {
3401 name = "isexe";
3402 packageName = "isexe";
3403 version = "2.0.0";
3404 src = fetchurl {
3405 url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";
3406 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
3407 };
3408 };
3409 "isobject-2.1.0" = {
3410 name = "isobject";
3411 packageName = "isobject";
3412 version = "2.1.0";
3413 src = fetchurl {
3414 url = "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz";
3415 sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
3416 };
3417 };
3418 "isobject-3.0.1" = {
3419 name = "isobject";
3420 packageName = "isobject";
3421 version = "3.0.1";
3422 src = fetchurl {
3423 url = "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz";
3424 sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
3425 };
3426 };
3427 "isstream-0.1.2" = {
3428 name = "isstream";
3429 packageName = "isstream";
3430 version = "0.1.2";
3431 src = fetchurl {
3432 url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
3433 sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
3434 };
3435 };
3436 "js-beautify-1.11.0" = {
3437 name = "js-beautify";
3438 packageName = "js-beautify";
3439 version = "1.11.0";
3440 src = fetchurl {
3441 url = "https://registry.npmjs.org/js-beautify/-/js-beautify-1.11.0.tgz";
3442 sha512 = "a26B+Cx7USQGSWnz9YxgJNMmML/QG2nqIaL7VVYPCXbqiKz8PN0waSNvroMtvAK6tY7g/wPdNWGEP+JTNIBr6A==";
3443 };
3444 };
3445 "js-levenshtein-1.1.6" = {
3446 name = "js-levenshtein";
3447 packageName = "js-levenshtein";
3448 version = "1.1.6";
3449 src = fetchurl {
3450 url = "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz";
3451 sha512 = "X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==";
3452 };
3453 };
3454 "js-tokens-4.0.0" = {
3455 name = "js-tokens";
3456 packageName = "js-tokens";
3457 version = "4.0.0";
3458 src = fetchurl {
3459 url = "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz";
3460 sha512 = "RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==";
3461 };
3462 };
3463 "js-yaml-3.13.1" = {
3464 name = "js-yaml";
3465 packageName = "js-yaml";
3466 version = "3.13.1";
3467 src = fetchurl {
3468 url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz";
3469 sha512 = "YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==";
3470 };
3471 };
3472 "jsbn-0.1.1" = {
3473 name = "jsbn";
3474 packageName = "jsbn";
3475 version = "0.1.1";
3476 src = fetchurl {
3477 url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
3478 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
3479 };
3480 };
3481 "jsdom-14.1.0" = {
3482 name = "jsdom";
3483 packageName = "jsdom";
3484 version = "14.1.0";
3485 src = fetchurl {
3486 url = "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz";
3487 sha512 = "O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==";
3488 };
3489 };
3490 "jsesc-0.5.0" = {
3491 name = "jsesc";
3492 packageName = "jsesc";
3493 version = "0.5.0";
3494 src = fetchurl {
3495 url = "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz";
3496 sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
3497 };
3498 };
3499 "jsesc-2.5.2" = {
3500 name = "jsesc";
3501 packageName = "jsesc";
3502 version = "2.5.2";
3503 src = fetchurl {
3504 url = "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz";
3505 sha512 = "OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==";
3506 };
3507 };
3508 "json-parse-better-errors-1.0.2" = {
3509 name = "json-parse-better-errors";
3510 packageName = "json-parse-better-errors";
3511 version = "1.0.2";
3512 src = fetchurl {
3513 url = "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz";
3514 sha512 = "mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==";
3515 };
3516 };
3517 "json-schema-0.2.3" = {
3518 name = "json-schema";
3519 packageName = "json-schema";
3520 version = "0.2.3";
3521 src = fetchurl {
3522 url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
3523 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
3524 };
3525 };
3526 "json-schema-traverse-0.4.1" = {
3527 name = "json-schema-traverse";
3528 packageName = "json-schema-traverse";
3529 version = "0.4.1";
3530 src = fetchurl {
3531 url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
3532 sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
3533 };
3534 };
3535 "json-stringify-safe-5.0.1" = {
3536 name = "json-stringify-safe";
3537 packageName = "json-stringify-safe";
3538 version = "5.0.1";
3539 src = fetchurl {
3540 url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
3541 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
3542 };
3543 };
3544 "json5-1.0.1" = {
3545 name = "json5";
3546 packageName = "json5";
3547 version = "1.0.1";
3548 src = fetchurl {
3549 url = "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz";
3550 sha512 = "aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==";
3551 };
3552 };
3553 "json5-2.1.3" = {
3554 name = "json5";
3555 packageName = "json5";
3556 version = "2.1.3";
3557 src = fetchurl {
3558 url = "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz";
3559 sha512 = "KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==";
3560 };
3561 };
3562 "jsprim-1.4.1" = {
3563 name = "jsprim";
3564 packageName = "jsprim";
3565 version = "1.4.1";
3566 src = fetchurl {
3567 url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
3568 sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
3569 };
3570 };
3571 "kind-of-3.2.2" = {
3572 name = "kind-of";
3573 packageName = "kind-of";
3574 version = "3.2.2";
3575 src = fetchurl {
3576 url = "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz";
3577 sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
3578 };
3579 };
3580 "kind-of-4.0.0" = {
3581 name = "kind-of";
3582 packageName = "kind-of";
3583 version = "4.0.0";
3584 src = fetchurl {
3585 url = "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz";
3586 sha1 = "20813df3d712928b207378691a45066fae72dd57";
3587 };
3588 };
3589 "kind-of-5.1.0" = {
3590 name = "kind-of";
3591 packageName = "kind-of";
3592 version = "5.1.0";
3593 src = fetchurl {
3594 url = "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz";
3595 sha512 = "NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==";
3596 };
3597 };
3598 "kind-of-6.0.3" = {
3599 name = "kind-of";
3600 packageName = "kind-of";
3601 version = "6.0.3";
3602 src = fetchurl {
3603 url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz";
3604 sha512 = "dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==";
3605 };
3606 };
3607 "levn-0.3.0" = {
3608 name = "levn";
3609 packageName = "levn";
3610 version = "0.3.0";
3611 src = fetchurl {
3612 url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
3613 sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
3614 };
3615 };
3616 "locate-path-2.0.0" = {
3617 name = "locate-path";
3618 packageName = "locate-path";
3619 version = "2.0.0";
3620 src = fetchurl {
3621 url = "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz";
3622 sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
3623 };
3624 };
3625 "locate-path-3.0.0" = {
3626 name = "locate-path";
3627 packageName = "locate-path";
3628 version = "3.0.0";
3629 src = fetchurl {
3630 url = "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz";
3631 sha512 = "7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==";
3632 };
3633 };
3634 "lodash-4.17.15" = {
3635 name = "lodash";
3636 packageName = "lodash";
3637 version = "4.17.15";
3638 src = fetchurl {
3639 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";
3640 sha512 = "8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==";
3641 };
3642 };
3643 "lodash.clone-4.5.0" = {
3644 name = "lodash.clone";
3645 packageName = "lodash.clone";
3646 version = "4.5.0";
3647 src = fetchurl {
3648 url = "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz";
3649 sha1 = "195870450f5a13192478df4bc3d23d2dea1907b6";
3650 };
3651 };
3652 "lodash.memoize-4.1.2" = {
3653 name = "lodash.memoize";
3654 packageName = "lodash.memoize";
3655 version = "4.1.2";
3656 src = fetchurl {
3657 url = "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz";
3658 sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe";
3659 };
3660 };
3661 "lodash.sortby-4.7.0" = {
3662 name = "lodash.sortby";
3663 packageName = "lodash.sortby";
3664 version = "4.7.0";
3665 src = fetchurl {
3666 url = "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz";
3667 sha1 = "edd14c824e2cc9c1e0b0a1b42bb5210516a42438";
3668 };
3669 };
3670 "lodash.uniq-4.5.0" = {
3671 name = "lodash.uniq";
3672 packageName = "lodash.uniq";
3673 version = "4.5.0";
3674 src = fetchurl {
3675 url = "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
3676 sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
3677 };
3678 };
3679 "log-symbols-2.2.0" = {
3680 name = "log-symbols";
3681 packageName = "log-symbols";
3682 version = "2.2.0";
3683 src = fetchurl {
3684 url = "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz";
3685 sha512 = "VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==";
3686 };
3687 };
3688 "loose-envify-1.4.0" = {
3689 name = "loose-envify";
3690 packageName = "loose-envify";
3691 version = "1.4.0";
3692 src = fetchurl {
3693 url = "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz";
3694 sha512 = "lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==";
3695 };
3696 };
3697 "lru-cache-4.1.5" = {
3698 name = "lru-cache";
3699 packageName = "lru-cache";
3700 version = "4.1.5";
3701 src = fetchurl {
3702 url = "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz";
3703 sha512 = "sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==";
3704 };
3705 };
3706 "magic-string-0.22.5" = {
3707 name = "magic-string";
3708 packageName = "magic-string";
3709 version = "0.22.5";
3710 src = fetchurl {
3711 url = "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz";
3712 sha512 = "oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==";
3713 };
3714 };
3715 "map-cache-0.2.2" = {
3716 name = "map-cache";
3717 packageName = "map-cache";
3718 version = "0.2.2";
3719 src = fetchurl {
3720 url = "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz";
3721 sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
3722 };
3723 };
3724 "map-visit-1.0.0" = {
3725 name = "map-visit";
3726 packageName = "map-visit";
3727 version = "1.0.0";
3728 src = fetchurl {
3729 url = "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz";
3730 sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
3731 };
3732 };
3733 "md5.js-1.3.5" = {
3734 name = "md5.js";
3735 packageName = "md5.js";
3736 version = "1.3.5";
3737 src = fetchurl {
3738 url = "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz";
3739 sha512 = "xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==";
3740 };
3741 };
3742 "mdn-data-2.0.4" = {
3743 name = "mdn-data";
3744 packageName = "mdn-data";
3745 version = "2.0.4";
3746 src = fetchurl {
3747 url = "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz";
3748 sha512 = "iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==";
3749 };
3750 };
3751 "mdn-data-2.0.6" = {
3752 name = "mdn-data";
3753 packageName = "mdn-data";
3754 version = "2.0.6";
3755 src = fetchurl {
3756 url = "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz";
3757 sha512 = "rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==";
3758 };
3759 };
3760 "merge-source-map-1.0.4" = {
3761 name = "merge-source-map";
3762 packageName = "merge-source-map";
3763 version = "1.0.4";
3764 src = fetchurl {
3765 url = "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz";
3766 sha1 = "a5de46538dae84d4114cc5ea02b4772a6346701f";
3767 };
3768 };
3769 "merge2-1.3.0" = {
3770 name = "merge2";
3771 packageName = "merge2";
3772 version = "1.3.0";
3773 src = fetchurl {
3774 url = "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz";
3775 sha512 = "2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==";
3776 };
3777 };
3778 "micromatch-3.1.10" = {
3779 name = "micromatch";
3780 packageName = "micromatch";
3781 version = "3.1.10";
3782 src = fetchurl {
3783 url = "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz";
3784 sha512 = "MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==";
3785 };
3786 };
3787 "miller-rabin-4.0.1" = {
3788 name = "miller-rabin";
3789 packageName = "miller-rabin";
3790 version = "4.0.1";
3791 src = fetchurl {
3792 url = "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz";
3793 sha512 = "115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==";
3794 };
3795 };
3796 "mime-1.6.0" = {
3797 name = "mime";
3798 packageName = "mime";
3799 version = "1.6.0";
3800 src = fetchurl {
3801 url = "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz";
3802 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
3803 };
3804 };
3805 "mime-db-1.44.0" = {
3806 name = "mime-db";
3807 packageName = "mime-db";
3808 version = "1.44.0";
3809 src = fetchurl {
3810 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz";
3811 sha512 = "/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==";
3812 };
3813 };
3814 "mime-types-2.1.27" = {
3815 name = "mime-types";
3816 packageName = "mime-types";
3817 version = "2.1.27";
3818 src = fetchurl {
3819 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz";
3820 sha512 = "JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==";
3821 };
3822 };
3823 "mimic-fn-1.2.0" = {
3824 name = "mimic-fn";
3825 packageName = "mimic-fn";
3826 version = "1.2.0";
3827 src = fetchurl {
3828 url = "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz";
3829 sha512 = "jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==";
3830 };
3831 };
3832 "minimalistic-assert-1.0.1" = {
3833 name = "minimalistic-assert";
3834 packageName = "minimalistic-assert";
3835 version = "1.0.1";
3836 src = fetchurl {
3837 url = "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
3838 sha512 = "UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==";
3839 };
3840 };
3841 "minimalistic-crypto-utils-1.0.1" = {
3842 name = "minimalistic-crypto-utils";
3843 packageName = "minimalistic-crypto-utils";
3844 version = "1.0.1";
3845 src = fetchurl {
3846 url = "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz";
3847 sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
3848 };
3849 };
3850 "minimatch-3.0.4" = {
3851 name = "minimatch";
3852 packageName = "minimatch";
3853 version = "3.0.4";
3854 src = fetchurl {
3855 url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
3856 sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
3857 };
3858 };
3859 "minimist-1.2.5" = {
3860 name = "minimist";
3861 packageName = "minimist";
3862 version = "1.2.5";
3863 src = fetchurl {
3864 url = "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";
3865 sha512 = "FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==";
3866 };
3867 };
3868 "mixin-deep-1.3.2" = {
3869 name = "mixin-deep";
3870 packageName = "mixin-deep";
3871 version = "1.3.2";
3872 src = fetchurl {
3873 url = "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz";
3874 sha512 = "WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==";
3875 };
3876 };
3877 "mkdirp-0.5.5" = {
3878 name = "mkdirp";
3879 packageName = "mkdirp";
3880 version = "0.5.5";
3881 src = fetchurl {
3882 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz";
3883 sha512 = "NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==";
3884 };
3885 };
3886 "mkdirp-1.0.4" = {
3887 name = "mkdirp";
3888 packageName = "mkdirp";
3889 version = "1.0.4";
3890 src = fetchurl {
3891 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz";
3892 sha512 = "vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==";
3893 };
3894 };
3895 "ms-2.0.0" = {
3896 name = "ms";
3897 packageName = "ms";
3898 version = "2.0.0";
3899 src = fetchurl {
3900 url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz";
3901 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
3902 };
3903 };
3904 "ms-2.1.1" = {
3905 name = "ms";
3906 packageName = "ms";
3907 version = "2.1.1";
3908 src = fetchurl {
3909 url = "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz";
3910 sha512 = "tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==";
3911 };
3912 };
3913 "ms-2.1.2" = {
3914 name = "ms";
3915 packageName = "ms";
3916 version = "2.1.2";
3917 src = fetchurl {
3918 url = "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz";
3919 sha512 = "sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==";
3920 };
3921 };
3922 "nan-2.14.1" = {
3923 name = "nan";
3924 packageName = "nan";
3925 version = "2.14.1";
3926 src = fetchurl {
3927 url = "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz";
3928 sha512 = "isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==";
3929 };
3930 };
3931 "nanomatch-1.2.13" = {
3932 name = "nanomatch";
3933 packageName = "nanomatch";
3934 version = "1.2.13";
3935 src = fetchurl {
3936 url = "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz";
3937 sha512 = "fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==";
3938 };
3939 };
3940 "nice-try-1.0.5" = {
3941 name = "nice-try";
3942 packageName = "nice-try";
3943 version = "1.0.5";
3944 src = fetchurl {
3945 url = "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz";
3946 sha512 = "1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==";
3947 };
3948 };
3949 "node-addon-api-1.7.1" = {
3950 name = "node-addon-api";
3951 packageName = "node-addon-api";
3952 version = "1.7.1";
3953 src = fetchurl {
3954 url = "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.1.tgz";
3955 sha512 = "2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ==";
3956 };
3957 };
3958 "node-elm-compiler-5.0.4" = {
3959 name = "node-elm-compiler";
3960 packageName = "node-elm-compiler";
3961 version = "5.0.4";
3962 src = fetchurl {
3963 url = "https://registry.npmjs.org/node-elm-compiler/-/node-elm-compiler-5.0.4.tgz";
3964 sha512 = "VQsT8QSierYGkHzRed+b4MnccQVF1+qPHunE8jBoU7jD6YpuRqCDPzEoC2zfyEJS80qVnlMZrqobLnyjzX9lJg==";
3965 };
3966 };
3967 "node-forge-0.7.6" = {
3968 name = "node-forge";
3969 packageName = "node-forge";
3970 version = "0.7.6";
3971 src = fetchurl {
3972 url = "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz";
3973 sha512 = "sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==";
3974 };
3975 };
3976 "node-libs-browser-2.2.1" = {
3977 name = "node-libs-browser";
3978 packageName = "node-libs-browser";
3979 version = "2.2.1";
3980 src = fetchurl {
3981 url = "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz";
3982 sha512 = "h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==";
3983 };
3984 };
3985 "node-releases-1.1.53" = {
3986 name = "node-releases";
3987 packageName = "node-releases";
3988 version = "1.1.53";
3989 src = fetchurl {
3990 url = "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz";
3991 sha512 = "wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==";
3992 };
3993 };
3994 "nopt-4.0.3" = {
3995 name = "nopt";
3996 packageName = "nopt";
3997 version = "4.0.3";
3998 src = fetchurl {
3999 url = "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz";
4000 sha512 = "CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==";
4001 };
4002 };
4003 "normalize-html-whitespace-1.0.0" = {
4004 name = "normalize-html-whitespace";
4005 packageName = "normalize-html-whitespace";
4006 version = "1.0.0";
4007 src = fetchurl {
4008 url = "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz";
4009 sha512 = "9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==";
4010 };
4011 };
4012 "normalize-path-2.1.1" = {
4013 name = "normalize-path";
4014 packageName = "normalize-path";
4015 version = "2.1.1";
4016 src = fetchurl {
4017 url = "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz";
4018 sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
4019 };
4020 };
4021 "normalize-path-3.0.0" = {
4022 name = "normalize-path";
4023 packageName = "normalize-path";
4024 version = "3.0.0";
4025 src = fetchurl {
4026 url = "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz";
4027 sha512 = "6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==";
4028 };
4029 };
4030 "normalize-url-3.3.0" = {
4031 name = "normalize-url";
4032 packageName = "normalize-url";
4033 version = "3.3.0";
4034 src = fetchurl {
4035 url = "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz";
4036 sha512 = "U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==";
4037 };
4038 };
4039 "nth-check-1.0.2" = {
4040 name = "nth-check";
4041 packageName = "nth-check";
4042 version = "1.0.2";
4043 src = fetchurl {
4044 url = "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz";
4045 sha512 = "WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==";
4046 };
4047 };
4048 "nwsapi-2.2.0" = {
4049 name = "nwsapi";
4050 packageName = "nwsapi";
4051 version = "2.2.0";
4052 src = fetchurl {
4053 url = "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz";
4054 sha512 = "h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==";
4055 };
4056 };
4057 "oauth-sign-0.9.0" = {
4058 name = "oauth-sign";
4059 packageName = "oauth-sign";
4060 version = "0.9.0";
4061 src = fetchurl {
4062 url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";
4063 sha512 = "fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==";
4064 };
4065 };
4066 "object-assign-4.1.1" = {
4067 name = "object-assign";
4068 packageName = "object-assign";
4069 version = "4.1.1";
4070 src = fetchurl {
4071 url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";
4072 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
4073 };
4074 };
4075 "object-copy-0.1.0" = {
4076 name = "object-copy";
4077 packageName = "object-copy";
4078 version = "0.1.0";
4079 src = fetchurl {
4080 url = "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz";
4081 sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
4082 };
4083 };
4084 "object-inspect-1.4.1" = {
4085 name = "object-inspect";
4086 packageName = "object-inspect";
4087 version = "1.4.1";
4088 src = fetchurl {
4089 url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz";
4090 sha512 = "wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==";
4091 };
4092 };
4093 "object-inspect-1.7.0" = {
4094 name = "object-inspect";
4095 packageName = "object-inspect";
4096 version = "1.7.0";
4097 src = fetchurl {
4098 url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz";
4099 sha512 = "a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==";
4100 };
4101 };
4102 "object-keys-1.1.1" = {
4103 name = "object-keys";
4104 packageName = "object-keys";
4105 version = "1.1.1";
4106 src = fetchurl {
4107 url = "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz";
4108 sha512 = "NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==";
4109 };
4110 };
4111 "object-visit-1.0.1" = {
4112 name = "object-visit";
4113 packageName = "object-visit";
4114 version = "1.0.1";
4115 src = fetchurl {
4116 url = "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz";
4117 sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
4118 };
4119 };
4120 "object.assign-4.1.0" = {
4121 name = "object.assign";
4122 packageName = "object.assign";
4123 version = "4.1.0";
4124 src = fetchurl {
4125 url = "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz";
4126 sha512 = "exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==";
4127 };
4128 };
4129 "object.getownpropertydescriptors-2.1.0" = {
4130 name = "object.getownpropertydescriptors";
4131 packageName = "object.getownpropertydescriptors";
4132 version = "2.1.0";
4133 src = fetchurl {
4134 url = "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz";
4135 sha512 = "Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==";
4136 };
4137 };
4138 "object.pick-1.3.0" = {
4139 name = "object.pick";
4140 packageName = "object.pick";
4141 version = "1.3.0";
4142 src = fetchurl {
4143 url = "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz";
4144 sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
4145 };
4146 };
4147 "object.values-1.1.1" = {
4148 name = "object.values";
4149 packageName = "object.values";
4150 version = "1.1.1";
4151 src = fetchurl {
4152 url = "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz";
4153 sha512 = "WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==";
4154 };
4155 };
4156 "on-finished-2.3.0" = {
4157 name = "on-finished";
4158 packageName = "on-finished";
4159 version = "2.3.0";
4160 src = fetchurl {
4161 url = "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz";
4162 sha1 = "20f1336481b083cd75337992a16971aa2d906947";
4163 };
4164 };
4165 "once-1.4.0" = {
4166 name = "once";
4167 packageName = "once";
4168 version = "1.4.0";
4169 src = fetchurl {
4170 url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
4171 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
4172 };
4173 };
4174 "onetime-2.0.1" = {
4175 name = "onetime";
4176 packageName = "onetime";
4177 version = "2.0.1";
4178 src = fetchurl {
4179 url = "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz";
4180 sha1 = "067428230fd67443b2794b22bba528b6867962d4";
4181 };
4182 };
4183 "opn-5.5.0" = {
4184 name = "opn";
4185 packageName = "opn";
4186 version = "5.5.0";
4187 src = fetchurl {
4188 url = "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz";
4189 sha512 = "PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==";
4190 };
4191 };
4192 "optionator-0.8.3" = {
4193 name = "optionator";
4194 packageName = "optionator";
4195 version = "0.8.3";
4196 src = fetchurl {
4197 url = "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz";
4198 sha512 = "+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==";
4199 };
4200 };
4201 "ora-2.1.0" = {
4202 name = "ora";
4203 packageName = "ora";
4204 version = "2.1.0";
4205 src = fetchurl {
4206 url = "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz";
4207 sha512 = "hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==";
4208 };
4209 };
4210 "os-browserify-0.3.0" = {
4211 name = "os-browserify";
4212 packageName = "os-browserify";
4213 version = "0.3.0";
4214 src = fetchurl {
4215 url = "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz";
4216 sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
4217 };
4218 };
4219 "os-homedir-1.0.2" = {
4220 name = "os-homedir";
4221 packageName = "os-homedir";
4222 version = "1.0.2";
4223 src = fetchurl {
4224 url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
4225 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
4226 };
4227 };
4228 "os-tmpdir-1.0.2" = {
4229 name = "os-tmpdir";
4230 packageName = "os-tmpdir";
4231 version = "1.0.2";
4232 src = fetchurl {
4233 url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
4234 sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
4235 };
4236 };
4237 "osenv-0.1.5" = {
4238 name = "osenv";
4239 packageName = "osenv";
4240 version = "0.1.5";
4241 src = fetchurl {
4242 url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";
4243 sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
4244 };
4245 };
4246 "p-limit-1.3.0" = {
4247 name = "p-limit";
4248 packageName = "p-limit";
4249 version = "1.3.0";
4250 src = fetchurl {
4251 url = "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz";
4252 sha512 = "vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==";
4253 };
4254 };
4255 "p-limit-2.3.0" = {
4256 name = "p-limit";
4257 packageName = "p-limit";
4258 version = "2.3.0";
4259 src = fetchurl {
4260 url = "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz";
4261 sha512 = "//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==";
4262 };
4263 };
4264 "p-locate-2.0.0" = {
4265 name = "p-locate";
4266 packageName = "p-locate";
4267 version = "2.0.0";
4268 src = fetchurl {
4269 url = "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz";
4270 sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
4271 };
4272 };
4273 "p-locate-3.0.0" = {
4274 name = "p-locate";
4275 packageName = "p-locate";
4276 version = "3.0.0";
4277 src = fetchurl {
4278 url = "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz";
4279 sha512 = "x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==";
4280 };
4281 };
4282 "p-try-1.0.0" = {
4283 name = "p-try";
4284 packageName = "p-try";
4285 version = "1.0.0";
4286 src = fetchurl {
4287 url = "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz";
4288 sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
4289 };
4290 };
4291 "p-try-2.2.0" = {
4292 name = "p-try";
4293 packageName = "p-try";
4294 version = "2.2.0";
4295 src = fetchurl {
4296 url = "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz";
4297 sha512 = "R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==";
4298 };
4299 };
4300 "pako-0.2.9" = {
4301 name = "pako";
4302 packageName = "pako";
4303 version = "0.2.9";
4304 src = fetchurl {
4305 url = "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz";
4306 sha1 = "f3f7522f4ef782348da8161bad9ecfd51bf83a75";
4307 };
4308 };
4309 "pako-1.0.11" = {
4310 name = "pako";
4311 packageName = "pako";
4312 version = "1.0.11";
4313 src = fetchurl {
4314 url = "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz";
4315 sha512 = "4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==";
4316 };
4317 };
4318 "parcel-bundler-1.12.3" = {
4319 name = "parcel-bundler";
4320 packageName = "parcel-bundler";
4321 version = "1.12.3";
4322 src = fetchurl {
4323 url = "https://registry.npmjs.org/parcel-bundler/-/parcel-bundler-1.12.3.tgz";
4324 sha512 = "8bq6lj0hhQeGxD9f9xEkFMXQ3d8TIlf2+isKxoi9bciB0KVEILRGllaPkUgp++5t0anToBh9+tG6ZyInXOC1/A==";
4325 };
4326 };
4327 "parse-asn1-5.1.5" = {
4328 name = "parse-asn1";
4329 packageName = "parse-asn1";
4330 version = "5.1.5";
4331 src = fetchurl {
4332 url = "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz";
4333 sha512 = "jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==";
4334 };
4335 };
4336 "parse-json-4.0.0" = {
4337 name = "parse-json";
4338 packageName = "parse-json";
4339 version = "4.0.0";
4340 src = fetchurl {
4341 url = "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz";
4342 sha1 = "be35f5425be1f7f6c747184f98a788cb99477ee0";
4343 };
4344 };
4345 "parse5-5.1.0" = {
4346 name = "parse5";
4347 packageName = "parse5";
4348 version = "5.1.0";
4349 src = fetchurl {
4350 url = "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz";
4351 sha512 = "fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==";
4352 };
4353 };
4354 "parseurl-1.3.3" = {
4355 name = "parseurl";
4356 packageName = "parseurl";
4357 version = "1.3.3";
4358 src = fetchurl {
4359 url = "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz";
4360 sha512 = "CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==";
4361 };
4362 };
4363 "pascalcase-0.1.1" = {
4364 name = "pascalcase";
4365 packageName = "pascalcase";
4366 version = "0.1.1";
4367 src = fetchurl {
4368 url = "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz";
4369 sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
4370 };
4371 };
4372 "path-browserify-0.0.1" = {
4373 name = "path-browserify";
4374 packageName = "path-browserify";
4375 version = "0.0.1";
4376 src = fetchurl {
4377 url = "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz";
4378 sha512 = "BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==";
4379 };
4380 };
4381 "path-dirname-1.0.2" = {
4382 name = "path-dirname";
4383 packageName = "path-dirname";
4384 version = "1.0.2";
4385 src = fetchurl {
4386 url = "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz";
4387 sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
4388 };
4389 };
4390 "path-exists-3.0.0" = {
4391 name = "path-exists";
4392 packageName = "path-exists";
4393 version = "3.0.0";
4394 src = fetchurl {
4395 url = "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz";
4396 sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
4397 };
4398 };
4399 "path-is-absolute-1.0.1" = {
4400 name = "path-is-absolute";
4401 packageName = "path-is-absolute";
4402 version = "1.0.1";
4403 src = fetchurl {
4404 url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
4405 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
4406 };
4407 };
4408 "path-key-2.0.1" = {
4409 name = "path-key";
4410 packageName = "path-key";
4411 version = "2.0.1";
4412 src = fetchurl {
4413 url = "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz";
4414 sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
4415 };
4416 };
4417 "path-parse-1.0.6" = {
4418 name = "path-parse";
4419 packageName = "path-parse";
4420 version = "1.0.6";
4421 src = fetchurl {
4422 url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz";
4423 sha512 = "GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==";
4424 };
4425 };
4426 "pbkdf2-3.0.17" = {
4427 name = "pbkdf2";
4428 packageName = "pbkdf2";
4429 version = "3.0.17";
4430 src = fetchurl {
4431 url = "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz";
4432 sha512 = "U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==";
4433 };
4434 };
4435 "performance-now-2.1.0" = {
4436 name = "performance-now";
4437 packageName = "performance-now";
4438 version = "2.1.0";
4439 src = fetchurl {
4440 url = "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";
4441 sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
4442 };
4443 };
4444 "physical-cpu-count-2.0.0" = {
4445 name = "physical-cpu-count";
4446 packageName = "physical-cpu-count";
4447 version = "2.0.0";
4448 src = fetchurl {
4449 url = "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz";
4450 sha1 = "18de2f97e4bf7a9551ad7511942b5496f7aba660";
4451 };
4452 };
4453 "pkg-up-2.0.0" = {
4454 name = "pkg-up";
4455 packageName = "pkg-up";
4456 version = "2.0.0";
4457 src = fetchurl {
4458 url = "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz";
4459 sha1 = "c819ac728059a461cab1c3889a2be3c49a004d7f";
4460 };
4461 };
4462 "pn-1.1.0" = {
4463 name = "pn";
4464 packageName = "pn";
4465 version = "1.1.0";
4466 src = fetchurl {
4467 url = "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz";
4468 sha512 = "2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==";
4469 };
4470 };
4471 "posix-character-classes-0.1.1" = {
4472 name = "posix-character-classes";
4473 packageName = "posix-character-classes";
4474 version = "0.1.1";
4475 src = fetchurl {
4476 url = "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
4477 sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
4478 };
4479 };
4480 "postcss-6.0.1" = {
4481 name = "postcss";
4482 packageName = "postcss";
4483 version = "6.0.1";
4484 src = fetchurl {
4485 url = "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz";
4486 sha1 = "000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2";
4487 };
4488 };
4489 "postcss-6.0.23" = {
4490 name = "postcss";
4491 packageName = "postcss";
4492 version = "6.0.23";
4493 src = fetchurl {
4494 url = "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz";
4495 sha512 = "soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==";
4496 };
4497 };
4498 "postcss-7.0.27" = {
4499 name = "postcss";
4500 packageName = "postcss";
4501 version = "7.0.27";
4502 src = fetchurl {
4503 url = "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz";
4504 sha512 = "WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==";
4505 };
4506 };
4507 "postcss-calc-7.0.2" = {
4508 name = "postcss-calc";
4509 packageName = "postcss-calc";
4510 version = "7.0.2";
4511 src = fetchurl {
4512 url = "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz";
4513 sha512 = "rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==";
4514 };
4515 };
4516 "postcss-colormin-4.0.3" = {
4517 name = "postcss-colormin";
4518 packageName = "postcss-colormin";
4519 version = "4.0.3";
4520 src = fetchurl {
4521 url = "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz";
4522 sha512 = "WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==";
4523 };
4524 };
4525 "postcss-convert-values-4.0.1" = {
4526 name = "postcss-convert-values";
4527 packageName = "postcss-convert-values";
4528 version = "4.0.1";
4529 src = fetchurl {
4530 url = "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz";
4531 sha512 = "Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==";
4532 };
4533 };
4534 "postcss-discard-comments-4.0.2" = {
4535 name = "postcss-discard-comments";
4536 packageName = "postcss-discard-comments";
4537 version = "4.0.2";
4538 src = fetchurl {
4539 url = "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz";
4540 sha512 = "RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==";
4541 };
4542 };
4543 "postcss-discard-duplicates-4.0.2" = {
4544 name = "postcss-discard-duplicates";
4545 packageName = "postcss-discard-duplicates";
4546 version = "4.0.2";
4547 src = fetchurl {
4548 url = "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz";
4549 sha512 = "ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==";
4550 };
4551 };
4552 "postcss-discard-empty-4.0.1" = {
4553 name = "postcss-discard-empty";
4554 packageName = "postcss-discard-empty";
4555 version = "4.0.1";
4556 src = fetchurl {
4557 url = "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz";
4558 sha512 = "B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==";
4559 };
4560 };
4561 "postcss-discard-overridden-4.0.1" = {
4562 name = "postcss-discard-overridden";
4563 packageName = "postcss-discard-overridden";
4564 version = "4.0.1";
4565 src = fetchurl {
4566 url = "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz";
4567 sha512 = "IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==";
4568 };
4569 };
4570 "postcss-merge-longhand-4.0.11" = {
4571 name = "postcss-merge-longhand";
4572 packageName = "postcss-merge-longhand";
4573 version = "4.0.11";
4574 src = fetchurl {
4575 url = "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz";
4576 sha512 = "alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==";
4577 };
4578 };
4579 "postcss-merge-rules-4.0.3" = {
4580 name = "postcss-merge-rules";
4581 packageName = "postcss-merge-rules";
4582 version = "4.0.3";
4583 src = fetchurl {
4584 url = "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz";
4585 sha512 = "U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==";
4586 };
4587 };
4588 "postcss-minify-font-values-4.0.2" = {
4589 name = "postcss-minify-font-values";
4590 packageName = "postcss-minify-font-values";
4591 version = "4.0.2";
4592 src = fetchurl {
4593 url = "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz";
4594 sha512 = "j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==";
4595 };
4596 };
4597 "postcss-minify-gradients-4.0.2" = {
4598 name = "postcss-minify-gradients";
4599 packageName = "postcss-minify-gradients";
4600 version = "4.0.2";
4601 src = fetchurl {
4602 url = "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz";
4603 sha512 = "qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==";
4604 };
4605 };
4606 "postcss-minify-params-4.0.2" = {
4607 name = "postcss-minify-params";
4608 packageName = "postcss-minify-params";
4609 version = "4.0.2";
4610 src = fetchurl {
4611 url = "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz";
4612 sha512 = "G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==";
4613 };
4614 };
4615 "postcss-minify-selectors-4.0.2" = {
4616 name = "postcss-minify-selectors";
4617 packageName = "postcss-minify-selectors";
4618 version = "4.0.2";
4619 src = fetchurl {
4620 url = "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz";
4621 sha512 = "D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==";
4622 };
4623 };
4624 "postcss-modules-extract-imports-1.1.0" = {
4625 name = "postcss-modules-extract-imports";
4626 packageName = "postcss-modules-extract-imports";
4627 version = "1.1.0";
4628 src = fetchurl {
4629 url = "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz";
4630 sha1 = "b614c9720be6816eaee35fb3a5faa1dba6a05ddb";
4631 };
4632 };
4633 "postcss-modules-local-by-default-1.2.0" = {
4634 name = "postcss-modules-local-by-default";
4635 packageName = "postcss-modules-local-by-default";
4636 version = "1.2.0";
4637 src = fetchurl {
4638 url = "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz";
4639 sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069";
4640 };
4641 };
4642 "postcss-modules-scope-1.1.0" = {
4643 name = "postcss-modules-scope";
4644 packageName = "postcss-modules-scope";
4645 version = "1.1.0";
4646 src = fetchurl {
4647 url = "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz";
4648 sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90";
4649 };
4650 };
4651 "postcss-modules-values-1.3.0" = {
4652 name = "postcss-modules-values";
4653 packageName = "postcss-modules-values";
4654 version = "1.3.0";
4655 src = fetchurl {
4656 url = "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz";
4657 sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20";
4658 };
4659 };
4660 "postcss-normalize-charset-4.0.1" = {
4661 name = "postcss-normalize-charset";
4662 packageName = "postcss-normalize-charset";
4663 version = "4.0.1";
4664 src = fetchurl {
4665 url = "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz";
4666 sha512 = "gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==";
4667 };
4668 };
4669 "postcss-normalize-display-values-4.0.2" = {
4670 name = "postcss-normalize-display-values";
4671 packageName = "postcss-normalize-display-values";
4672 version = "4.0.2";
4673 src = fetchurl {
4674 url = "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz";
4675 sha512 = "3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==";
4676 };
4677 };
4678 "postcss-normalize-positions-4.0.2" = {
4679 name = "postcss-normalize-positions";
4680 packageName = "postcss-normalize-positions";
4681 version = "4.0.2";
4682 src = fetchurl {
4683 url = "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz";
4684 sha512 = "Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==";
4685 };
4686 };
4687 "postcss-normalize-repeat-style-4.0.2" = {
4688 name = "postcss-normalize-repeat-style";
4689 packageName = "postcss-normalize-repeat-style";
4690 version = "4.0.2";
4691 src = fetchurl {
4692 url = "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz";
4693 sha512 = "qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==";
4694 };
4695 };
4696 "postcss-normalize-string-4.0.2" = {
4697 name = "postcss-normalize-string";
4698 packageName = "postcss-normalize-string";
4699 version = "4.0.2";
4700 src = fetchurl {
4701 url = "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz";
4702 sha512 = "RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==";
4703 };
4704 };
4705 "postcss-normalize-timing-functions-4.0.2" = {
4706 name = "postcss-normalize-timing-functions";
4707 packageName = "postcss-normalize-timing-functions";
4708 version = "4.0.2";
4709 src = fetchurl {
4710 url = "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz";
4711 sha512 = "acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==";
4712 };
4713 };
4714 "postcss-normalize-unicode-4.0.1" = {
4715 name = "postcss-normalize-unicode";
4716 packageName = "postcss-normalize-unicode";
4717 version = "4.0.1";
4718 src = fetchurl {
4719 url = "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz";
4720 sha512 = "od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==";
4721 };
4722 };
4723 "postcss-normalize-url-4.0.1" = {
4724 name = "postcss-normalize-url";
4725 packageName = "postcss-normalize-url";
4726 version = "4.0.1";
4727 src = fetchurl {
4728 url = "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz";
4729 sha512 = "p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==";
4730 };
4731 };
4732 "postcss-normalize-whitespace-4.0.2" = {
4733 name = "postcss-normalize-whitespace";
4734 packageName = "postcss-normalize-whitespace";
4735 version = "4.0.2";
4736 src = fetchurl {
4737 url = "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz";
4738 sha512 = "tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==";
4739 };
4740 };
4741 "postcss-ordered-values-4.1.2" = {
4742 name = "postcss-ordered-values";
4743 packageName = "postcss-ordered-values";
4744 version = "4.1.2";
4745 src = fetchurl {
4746 url = "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz";
4747 sha512 = "2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==";
4748 };
4749 };
4750 "postcss-reduce-initial-4.0.3" = {
4751 name = "postcss-reduce-initial";
4752 packageName = "postcss-reduce-initial";
4753 version = "4.0.3";
4754 src = fetchurl {
4755 url = "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz";
4756 sha512 = "gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==";
4757 };
4758 };
4759 "postcss-reduce-transforms-4.0.2" = {
4760 name = "postcss-reduce-transforms";
4761 packageName = "postcss-reduce-transforms";
4762 version = "4.0.2";
4763 src = fetchurl {
4764 url = "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz";
4765 sha512 = "EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==";
4766 };
4767 };
4768 "postcss-selector-parser-3.1.2" = {
4769 name = "postcss-selector-parser";
4770 packageName = "postcss-selector-parser";
4771 version = "3.1.2";
4772 src = fetchurl {
4773 url = "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz";
4774 sha512 = "h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==";
4775 };
4776 };
4777 "postcss-selector-parser-6.0.2" = {
4778 name = "postcss-selector-parser";
4779 packageName = "postcss-selector-parser";
4780 version = "6.0.2";
4781 src = fetchurl {
4782 url = "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz";
4783 sha512 = "36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==";
4784 };
4785 };
4786 "postcss-svgo-4.0.2" = {
4787 name = "postcss-svgo";
4788 packageName = "postcss-svgo";
4789 version = "4.0.2";
4790 src = fetchurl {
4791 url = "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz";
4792 sha512 = "C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==";
4793 };
4794 };
4795 "postcss-unique-selectors-4.0.1" = {
4796 name = "postcss-unique-selectors";
4797 packageName = "postcss-unique-selectors";
4798 version = "4.0.1";
4799 src = fetchurl {
4800 url = "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz";
4801 sha512 = "+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==";
4802 };
4803 };
4804 "postcss-value-parser-3.3.1" = {
4805 name = "postcss-value-parser";
4806 packageName = "postcss-value-parser";
4807 version = "3.3.1";
4808 src = fetchurl {
4809 url = "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz";
4810 sha512 = "pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==";
4811 };
4812 };
4813 "postcss-value-parser-4.0.3" = {
4814 name = "postcss-value-parser";
4815 packageName = "postcss-value-parser";
4816 version = "4.0.3";
4817 src = fetchurl {
4818 url = "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz";
4819 sha512 = "N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==";
4820 };
4821 };
4822 "posthtml-0.11.6" = {
4823 name = "posthtml";
4824 packageName = "posthtml";
4825 version = "0.11.6";
4826 src = fetchurl {
4827 url = "https://registry.npmjs.org/posthtml/-/posthtml-0.11.6.tgz";
4828 sha512 = "C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw==";
4829 };
4830 };
4831 "posthtml-0.12.3" = {
4832 name = "posthtml";
4833 packageName = "posthtml";
4834 version = "0.12.3";
4835 src = fetchurl {
4836 url = "https://registry.npmjs.org/posthtml/-/posthtml-0.12.3.tgz";
4837 sha512 = "Fbpi95+JJyR0tqU7pUy1zTSQFjAsluuwB9pJ1h0jtnGk7n/O2TBtP5nDl9rV0JVACjQ1Lm5wSp4ppChr8u3MhA==";
4838 };
4839 };
4840 "posthtml-parser-0.4.2" = {
4841 name = "posthtml-parser";
4842 packageName = "posthtml-parser";
4843 version = "0.4.2";
4844 src = fetchurl {
4845 url = "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.4.2.tgz";
4846 sha512 = "BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg==";
4847 };
4848 };
4849 "posthtml-render-1.2.2" = {
4850 name = "posthtml-render";
4851 packageName = "posthtml-render";
4852 version = "1.2.2";
4853 src = fetchurl {
4854 url = "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.2.2.tgz";
4855 sha512 = "MbIXTWwAfJ9qET6Zl29UNwJcDJEEz9Zkr5oDhiujitJa7YBJwEpbkX2cmuklCDxubTMoRWpid3q8DrSyGnUUzQ==";
4856 };
4857 };
4858 "prelude-ls-1.1.2" = {
4859 name = "prelude-ls";
4860 packageName = "prelude-ls";
4861 version = "1.1.2";
4862 src = fetchurl {
4863 url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
4864 sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
4865 };
4866 };
4867 "private-0.1.8" = {
4868 name = "private";
4869 packageName = "private";
4870 version = "0.1.8";
4871 src = fetchurl {
4872 url = "https://registry.npmjs.org/private/-/private-0.1.8.tgz";
4873 sha512 = "VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==";
4874 };
4875 };
4876 "process-0.11.10" = {
4877 name = "process";
4878 packageName = "process";
4879 version = "0.11.10";
4880 src = fetchurl {
4881 url = "https://registry.npmjs.org/process/-/process-0.11.10.tgz";
4882 sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182";
4883 };
4884 };
4885 "process-nextick-args-2.0.1" = {
4886 name = "process-nextick-args";
4887 packageName = "process-nextick-args";
4888 version = "2.0.1";
4889 src = fetchurl {
4890 url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
4891 sha512 = "3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==";
4892 };
4893 };
4894 "proto-list-1.2.4" = {
4895 name = "proto-list";
4896 packageName = "proto-list";
4897 version = "1.2.4";
4898 src = fetchurl {
4899 url = "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz";
4900 sha1 = "212d5bfe1318306a420f6402b8e26ff39647a849";
4901 };
4902 };
4903 "pseudomap-1.0.2" = {
4904 name = "pseudomap";
4905 packageName = "pseudomap";
4906 version = "1.0.2";
4907 src = fetchurl {
4908 url = "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz";
4909 sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
4910 };
4911 };
4912 "psl-1.8.0" = {
4913 name = "psl";
4914 packageName = "psl";
4915 version = "1.8.0";
4916 src = fetchurl {
4917 url = "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz";
4918 sha512 = "RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==";
4919 };
4920 };
4921 "public-encrypt-4.0.3" = {
4922 name = "public-encrypt";
4923 packageName = "public-encrypt";
4924 version = "4.0.3";
4925 src = fetchurl {
4926 url = "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz";
4927 sha512 = "zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==";
4928 };
4929 };
4930 "punycode-1.3.2" = {
4931 name = "punycode";
4932 packageName = "punycode";
4933 version = "1.3.2";
4934 src = fetchurl {
4935 url = "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz";
4936 sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
4937 };
4938 };
4939 "punycode-1.4.1" = {
4940 name = "punycode";
4941 packageName = "punycode";
4942 version = "1.4.1";
4943 src = fetchurl {
4944 url = "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz";
4945 sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
4946 };
4947 };
4948 "punycode-2.1.1" = {
4949 name = "punycode";
4950 packageName = "punycode";
4951 version = "2.1.1";
4952 src = fetchurl {
4953 url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz";
4954 sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==";
4955 };
4956 };
4957 "purgecss-1.4.2" = {
4958 name = "purgecss";
4959 packageName = "purgecss";
4960 version = "1.4.2";
4961 src = fetchurl {
4962 url = "https://registry.npmjs.org/purgecss/-/purgecss-1.4.2.tgz";
4963 sha512 = "hkOreFTgiyMHMmC2BxzdIw5DuC6kxAbP/gGOGd3MEsF3+5m69rIvUEPaxrnoUtfODTFKe9hcXjGwC6jcjoyhOw==";
4964 };
4965 };
4966 "q-1.5.1" = {
4967 name = "q";
4968 packageName = "q";
4969 version = "1.5.1";
4970 src = fetchurl {
4971 url = "https://registry.npmjs.org/q/-/q-1.5.1.tgz";
4972 sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7";
4973 };
4974 };
4975 "qs-6.5.2" = {
4976 name = "qs";
4977 packageName = "qs";
4978 version = "6.5.2";
4979 src = fetchurl {
4980 url = "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz";
4981 sha512 = "N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==";
4982 };
4983 };
4984 "querystring-0.2.0" = {
4985 name = "querystring";
4986 packageName = "querystring";
4987 version = "0.2.0";
4988 src = fetchurl {
4989 url = "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz";
4990 sha1 = "b209849203bb25df820da756e747005878521620";
4991 };
4992 };
4993 "querystring-es3-0.2.1" = {
4994 name = "querystring-es3";
4995 packageName = "querystring-es3";
4996 version = "0.2.1";
4997 src = fetchurl {
4998 url = "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz";
4999 sha1 = "9ec61f79049875707d69414596fd907a4d711e73";
5000 };
5001 };
5002 "quote-stream-1.0.2" = {
5003 name = "quote-stream";
5004 packageName = "quote-stream";
5005 version = "1.0.2";
5006 src = fetchurl {
5007 url = "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz";
5008 sha1 = "84963f8c9c26b942e153feeb53aae74652b7e0b2";
5009 };
5010 };
5011 "randombytes-2.1.0" = {
5012 name = "randombytes";
5013 packageName = "randombytes";
5014 version = "2.1.0";
5015 src = fetchurl {
5016 url = "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz";
5017 sha512 = "vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==";
5018 };
5019 };
5020 "randomfill-1.0.4" = {
5021 name = "randomfill";
5022 packageName = "randomfill";
5023 version = "1.0.4";
5024 src = fetchurl {
5025 url = "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz";
5026 sha512 = "87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==";
5027 };
5028 };
5029 "range-parser-1.2.1" = {
5030 name = "range-parser";
5031 packageName = "range-parser";
5032 version = "1.2.1";
5033 src = fetchurl {
5034 url = "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz";
5035 sha512 = "Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==";
5036 };
5037 };
5038 "readable-stream-2.3.7" = {
5039 name = "readable-stream";
5040 packageName = "readable-stream";
5041 version = "2.3.7";
5042 src = fetchurl {
5043 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz";
5044 sha512 = "Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==";
5045 };
5046 };
5047 "readable-stream-3.6.0" = {
5048 name = "readable-stream";
5049 packageName = "readable-stream";
5050 version = "3.6.0";
5051 src = fetchurl {
5052 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz";
5053 sha512 = "BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==";
5054 };
5055 };
5056 "readdirp-2.2.1" = {
5057 name = "readdirp";
5058 packageName = "readdirp";
5059 version = "2.2.1";
5060 src = fetchurl {
5061 url = "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz";
5062 sha512 = "1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==";
5063 };
5064 };
5065 "regenerate-1.4.0" = {
5066 name = "regenerate";
5067 packageName = "regenerate";
5068 version = "1.4.0";
5069 src = fetchurl {
5070 url = "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz";
5071 sha512 = "1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==";
5072 };
5073 };
5074 "regenerate-unicode-properties-8.2.0" = {
5075 name = "regenerate-unicode-properties";
5076 packageName = "regenerate-unicode-properties";
5077 version = "8.2.0";
5078 src = fetchurl {
5079 url = "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz";
5080 sha512 = "F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==";
5081 };
5082 };
5083 "regenerator-runtime-0.11.1" = {
5084 name = "regenerator-runtime";
5085 packageName = "regenerator-runtime";
5086 version = "0.11.1";
5087 src = fetchurl {
5088 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
5089 sha512 = "MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==";
5090 };
5091 };
5092 "regenerator-runtime-0.12.1" = {
5093 name = "regenerator-runtime";
5094 packageName = "regenerator-runtime";
5095 version = "0.12.1";
5096 src = fetchurl {
5097 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz";
5098 sha512 = "odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==";
5099 };
5100 };
5101 "regenerator-runtime-0.13.5" = {
5102 name = "regenerator-runtime";
5103 packageName = "regenerator-runtime";
5104 version = "0.13.5";
5105 src = fetchurl {
5106 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz";
5107 sha512 = "ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==";
5108 };
5109 };
5110 "regenerator-transform-0.14.4" = {
5111 name = "regenerator-transform";
5112 packageName = "regenerator-transform";
5113 version = "0.14.4";
5114 src = fetchurl {
5115 url = "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz";
5116 sha512 = "EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==";
5117 };
5118 };
5119 "regex-not-1.0.2" = {
5120 name = "regex-not";
5121 packageName = "regex-not";
5122 version = "1.0.2";
5123 src = fetchurl {
5124 url = "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz";
5125 sha512 = "J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==";
5126 };
5127 };
5128 "regexpu-core-4.7.0" = {
5129 name = "regexpu-core";
5130 packageName = "regexpu-core";
5131 version = "4.7.0";
5132 src = fetchurl {
5133 url = "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz";
5134 sha512 = "TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==";
5135 };
5136 };
5137 "regjsgen-0.5.1" = {
5138 name = "regjsgen";
5139 packageName = "regjsgen";
5140 version = "0.5.1";
5141 src = fetchurl {
5142 url = "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz";
5143 sha512 = "5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==";
5144 };
5145 };
5146 "regjsparser-0.6.4" = {
5147 name = "regjsparser";
5148 packageName = "regjsparser";
5149 version = "0.6.4";
5150 src = fetchurl {
5151 url = "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz";
5152 sha512 = "64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==";
5153 };
5154 };
5155 "remove-trailing-separator-1.1.0" = {
5156 name = "remove-trailing-separator";
5157 packageName = "remove-trailing-separator";
5158 version = "1.1.0";
5159 src = fetchurl {
5160 url = "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
5161 sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
5162 };
5163 };
5164 "repeat-element-1.1.3" = {
5165 name = "repeat-element";
5166 packageName = "repeat-element";
5167 version = "1.1.3";
5168 src = fetchurl {
5169 url = "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz";
5170 sha512 = "ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==";
5171 };
5172 };
5173 "repeat-string-1.6.1" = {
5174 name = "repeat-string";
5175 packageName = "repeat-string";
5176 version = "1.6.1";
5177 src = fetchurl {
5178 url = "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz";
5179 sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
5180 };
5181 };
5182 "request-2.88.2" = {
5183 name = "request";
5184 packageName = "request";
5185 version = "2.88.2";
5186 src = fetchurl {
5187 url = "https://registry.npmjs.org/request/-/request-2.88.2.tgz";
5188 sha512 = "MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==";
5189 };
5190 };
5191 "request-promise-core-1.1.3" = {
5192 name = "request-promise-core";
5193 packageName = "request-promise-core";
5194 version = "1.1.3";
5195 src = fetchurl {
5196 url = "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz";
5197 sha512 = "QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==";
5198 };
5199 };
5200 "request-promise-native-1.0.8" = {
5201 name = "request-promise-native";
5202 packageName = "request-promise-native";
5203 version = "1.0.8";
5204 src = fetchurl {
5205 url = "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz";
5206 sha512 = "dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==";
5207 };
5208 };
5209 "require-directory-2.1.1" = {
5210 name = "require-directory";
5211 packageName = "require-directory";
5212 version = "2.1.1";
5213 src = fetchurl {
5214 url = "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz";
5215 sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
5216 };
5217 };
5218 "require-main-filename-2.0.0" = {
5219 name = "require-main-filename";
5220 packageName = "require-main-filename";
5221 version = "2.0.0";
5222 src = fetchurl {
5223 url = "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz";
5224 sha512 = "NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==";
5225 };
5226 };
5227 "resolve-1.17.0" = {
5228 name = "resolve";
5229 packageName = "resolve";
5230 version = "1.17.0";
5231 src = fetchurl {
5232 url = "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz";
5233 sha512 = "ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==";
5234 };
5235 };
5236 "resolve-from-3.0.0" = {
5237 name = "resolve-from";
5238 packageName = "resolve-from";
5239 version = "3.0.0";
5240 src = fetchurl {
5241 url = "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz";
5242 sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
5243 };
5244 };
5245 "resolve-url-0.2.1" = {
5246 name = "resolve-url";
5247 packageName = "resolve-url";
5248 version = "0.2.1";
5249 src = fetchurl {
5250 url = "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz";
5251 sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
5252 };
5253 };
5254 "restore-cursor-2.0.0" = {
5255 name = "restore-cursor";
5256 packageName = "restore-cursor";
5257 version = "2.0.0";
5258 src = fetchurl {
5259 url = "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz";
5260 sha1 = "9f7ee287f82fd326d4fd162923d62129eee0dfaf";
5261 };
5262 };
5263 "ret-0.1.15" = {
5264 name = "ret";
5265 packageName = "ret";
5266 version = "0.1.15";
5267 src = fetchurl {
5268 url = "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz";
5269 sha512 = "TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==";
5270 };
5271 };
5272 "rgb-regex-1.0.1" = {
5273 name = "rgb-regex";
5274 packageName = "rgb-regex";
5275 version = "1.0.1";
5276 src = fetchurl {
5277 url = "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz";
5278 sha1 = "c0e0d6882df0e23be254a475e8edd41915feaeb1";
5279 };
5280 };
5281 "rgba-regex-1.0.0" = {
5282 name = "rgba-regex";
5283 packageName = "rgba-regex";
5284 version = "1.0.0";
5285 src = fetchurl {
5286 url = "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz";
5287 sha1 = "43374e2e2ca0968b0ef1523460b7d730ff22eeb3";
5288 };
5289 };
5290 "rimraf-2.6.3" = {
5291 name = "rimraf";
5292 packageName = "rimraf";
5293 version = "2.6.3";
5294 src = fetchurl {
5295 url = "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";
5296 sha512 = "mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==";
5297 };
5298 };
5299 "ripemd160-2.0.2" = {
5300 name = "ripemd160";
5301 packageName = "ripemd160";
5302 version = "2.0.2";
5303 src = fetchurl {
5304 url = "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz";
5305 sha512 = "ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==";
5306 };
5307 };
5308 "safe-buffer-5.1.2" = {
5309 name = "safe-buffer";
5310 packageName = "safe-buffer";
5311 version = "5.1.2";
5312 src = fetchurl {
5313 url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";
5314 sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
5315 };
5316 };
5317 "safe-regex-1.1.0" = {
5318 name = "safe-regex";
5319 packageName = "safe-regex";
5320 version = "1.1.0";
5321 src = fetchurl {
5322 url = "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz";
5323 sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
5324 };
5325 };
5326 "safer-buffer-2.1.2" = {
5327 name = "safer-buffer";
5328 packageName = "safer-buffer";
5329 version = "2.1.2";
5330 src = fetchurl {
5331 url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";
5332 sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
5333 };
5334 };
5335 "safer-eval-1.3.6" = {
5336 name = "safer-eval";
5337 packageName = "safer-eval";
5338 version = "1.3.6";
5339 src = fetchurl {
5340 url = "https://registry.npmjs.org/safer-eval/-/safer-eval-1.3.6.tgz";
5341 sha512 = "DN9tBsZgtUOHODzSfO1nGCLhZtxc7Qq/d8/2SNxQZ9muYXZspSh1fO7HOsrf4lcelBNviAJLCxB/ggmG+jV1aw==";
5342 };
5343 };
5344 "sax-1.2.4" = {
5345 name = "sax";
5346 packageName = "sax";
5347 version = "1.2.4";
5348 src = fetchurl {
5349 url = "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";
5350 sha512 = "NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==";
5351 };
5352 };
5353 "saxes-3.1.11" = {
5354 name = "saxes";
5355 packageName = "saxes";
5356 version = "3.1.11";
5357 src = fetchurl {
5358 url = "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz";
5359 sha512 = "Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==";
5360 };
5361 };
5362 "semver-5.7.1" = {
5363 name = "semver";
5364 packageName = "semver";
5365 version = "5.7.1";
5366 src = fetchurl {
5367 url = "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz";
5368 sha512 = "sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==";
5369 };
5370 };
5371 "send-0.17.1" = {
5372 name = "send";
5373 packageName = "send";
5374 version = "0.17.1";
5375 src = fetchurl {
5376 url = "https://registry.npmjs.org/send/-/send-0.17.1.tgz";
5377 sha512 = "BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==";
5378 };
5379 };
5380 "serialize-to-js-1.2.2" = {
5381 name = "serialize-to-js";
5382 packageName = "serialize-to-js";
5383 version = "1.2.2";
5384 src = fetchurl {
5385 url = "https://registry.npmjs.org/serialize-to-js/-/serialize-to-js-1.2.2.tgz";
5386 sha512 = "mUc8vA5iJghe+O+3s0YDGFLMJcqitVFk787YKiv8a4sf6RX5W0u81b+gcHrp15O0fFa010dRBVZvwcKXOWsL9Q==";
5387 };
5388 };
5389 "serve-static-1.14.1" = {
5390 name = "serve-static";
5391 packageName = "serve-static";
5392 version = "1.14.1";
5393 src = fetchurl {
5394 url = "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz";
5395 sha512 = "JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==";
5396 };
5397 };
5398 "set-blocking-2.0.0" = {
5399 name = "set-blocking";
5400 packageName = "set-blocking";
5401 version = "2.0.0";
5402 src = fetchurl {
5403 url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";
5404 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
5405 };
5406 };
5407 "set-value-2.0.1" = {
5408 name = "set-value";
5409 packageName = "set-value";
5410 version = "2.0.1";
5411 src = fetchurl {
5412 url = "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz";
5413 sha512 = "JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==";
5414 };
5415 };
5416 "setimmediate-1.0.5" = {
5417 name = "setimmediate";
5418 packageName = "setimmediate";
5419 version = "1.0.5";
5420 src = fetchurl {
5421 url = "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz";
5422 sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285";
5423 };
5424 };
5425 "setprototypeof-1.1.1" = {
5426 name = "setprototypeof";
5427 packageName = "setprototypeof";
5428 version = "1.1.1";
5429 src = fetchurl {
5430 url = "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz";
5431 sha512 = "JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==";
5432 };
5433 };
5434 "sha.js-2.4.11" = {
5435 name = "sha.js";
5436 packageName = "sha.js";
5437 version = "2.4.11";
5438 src = fetchurl {
5439 url = "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz";
5440 sha512 = "QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==";
5441 };
5442 };
5443 "shallow-copy-0.0.1" = {
5444 name = "shallow-copy";
5445 packageName = "shallow-copy";
5446 version = "0.0.1";
5447 src = fetchurl {
5448 url = "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz";
5449 sha1 = "415f42702d73d810330292cc5ee86eae1a11a170";
5450 };
5451 };
5452 "shebang-command-1.2.0" = {
5453 name = "shebang-command";
5454 packageName = "shebang-command";
5455 version = "1.2.0";
5456 src = fetchurl {
5457 url = "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz";
5458 sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
5459 };
5460 };
5461 "shebang-regex-1.0.0" = {
5462 name = "shebang-regex";
5463 packageName = "shebang-regex";
5464 version = "1.0.0";
5465 src = fetchurl {
5466 url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz";
5467 sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
5468 };
5469 };
5470 "sigmund-1.0.1" = {
5471 name = "sigmund";
5472 packageName = "sigmund";
5473 version = "1.0.1";
5474 src = fetchurl {
5475 url = "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz";
5476 sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
5477 };
5478 };
5479 "signal-exit-3.0.3" = {
5480 name = "signal-exit";
5481 packageName = "signal-exit";
5482 version = "3.0.3";
5483 src = fetchurl {
5484 url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz";
5485 sha512 = "VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==";
5486 };
5487 };
5488 "simple-swizzle-0.2.2" = {
5489 name = "simple-swizzle";
5490 packageName = "simple-swizzle";
5491 version = "0.2.2";
5492 src = fetchurl {
5493 url = "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz";
5494 sha1 = "a4da6b635ffcccca33f70d17cb92592de95e557a";
5495 };
5496 };
5497 "snapdragon-0.8.2" = {
5498 name = "snapdragon";
5499 packageName = "snapdragon";
5500 version = "0.8.2";
5501 src = fetchurl {
5502 url = "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz";
5503 sha512 = "FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==";
5504 };
5505 };
5506 "snapdragon-node-2.1.1" = {
5507 name = "snapdragon-node";
5508 packageName = "snapdragon-node";
5509 version = "2.1.1";
5510 src = fetchurl {
5511 url = "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
5512 sha512 = "O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==";
5513 };
5514 };
5515 "snapdragon-util-3.0.1" = {
5516 name = "snapdragon-util";
5517 packageName = "snapdragon-util";
5518 version = "3.0.1";
5519 src = fetchurl {
5520 url = "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
5521 sha512 = "mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==";
5522 };
5523 };
5524 "source-map-0.5.7" = {
5525 name = "source-map";
5526 packageName = "source-map";
5527 version = "0.5.7";
5528 src = fetchurl {
5529 url = "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz";
5530 sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
5531 };
5532 };
5533 "source-map-0.6.1" = {
5534 name = "source-map";
5535 packageName = "source-map";
5536 version = "0.6.1";
5537 src = fetchurl {
5538 url = "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz";
5539 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
5540 };
5541 };
5542 "source-map-resolve-0.5.3" = {
5543 name = "source-map-resolve";
5544 packageName = "source-map-resolve";
5545 version = "0.5.3";
5546 src = fetchurl {
5547 url = "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz";
5548 sha512 = "Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==";
5549 };
5550 };
5551 "source-map-support-0.5.19" = {
5552 name = "source-map-support";
5553 packageName = "source-map-support";
5554 version = "0.5.19";
5555 src = fetchurl {
5556 url = "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz";
5557 sha512 = "Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==";
5558 };
5559 };
5560 "source-map-url-0.4.0" = {
5561 name = "source-map-url";
5562 packageName = "source-map-url";
5563 version = "0.4.0";
5564 src = fetchurl {
5565 url = "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz";
5566 sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
5567 };
5568 };
5569 "split-string-3.1.0" = {
5570 name = "split-string";
5571 packageName = "split-string";
5572 version = "3.1.0";
5573 src = fetchurl {
5574 url = "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz";
5575 sha512 = "NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==";
5576 };
5577 };
5578 "sprintf-js-1.0.3" = {
5579 name = "sprintf-js";
5580 packageName = "sprintf-js";
5581 version = "1.0.3";
5582 src = fetchurl {
5583 url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz";
5584 sha1 = "04e6926f662895354f3dd015203633b857297e2c";
5585 };
5586 };
5587 "sshpk-1.16.1" = {
5588 name = "sshpk";
5589 packageName = "sshpk";
5590 version = "1.16.1";
5591 src = fetchurl {
5592 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz";
5593 sha512 = "HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==";
5594 };
5595 };
5596 "stable-0.1.8" = {
5597 name = "stable";
5598 packageName = "stable";
5599 version = "0.1.8";
5600 src = fetchurl {
5601 url = "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz";
5602 sha512 = "ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==";
5603 };
5604 };
5605 "static-eval-2.0.5" = {
5606 name = "static-eval";
5607 packageName = "static-eval";
5608 version = "2.0.5";
5609 src = fetchurl {
5610 url = "https://registry.npmjs.org/static-eval/-/static-eval-2.0.5.tgz";
5611 sha512 = "nNbV6LbGtMBgv7e9LFkt5JV8RVlRsyJrphfAt9tOtBBW/SfnzZDf2KnS72an8e434A+9e/BmJuTxeGPvrAK7KA==";
5612 };
5613 };
5614 "static-extend-0.1.2" = {
5615 name = "static-extend";
5616 packageName = "static-extend";
5617 version = "0.1.2";
5618 src = fetchurl {
5619 url = "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz";
5620 sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
5621 };
5622 };
5623 "static-module-2.2.5" = {
5624 name = "static-module";
5625 packageName = "static-module";
5626 version = "2.2.5";
5627 src = fetchurl {
5628 url = "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz";
5629 sha512 = "D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==";
5630 };
5631 };
5632 "statuses-1.5.0" = {
5633 name = "statuses";
5634 packageName = "statuses";
5635 version = "1.5.0";
5636 src = fetchurl {
5637 url = "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz";
5638 sha1 = "161c7dac177659fd9811f43771fa99381478628c";
5639 };
5640 };
5641 "stealthy-require-1.1.1" = {
5642 name = "stealthy-require";
5643 packageName = "stealthy-require";
5644 version = "1.1.1";
5645 src = fetchurl {
5646 url = "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz";
5647 sha1 = "35b09875b4ff49f26a777e509b3090a3226bf24b";
5648 };
5649 };
5650 "stream-browserify-2.0.2" = {
5651 name = "stream-browserify";
5652 packageName = "stream-browserify";
5653 version = "2.0.2";
5654 src = fetchurl {
5655 url = "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz";
5656 sha512 = "nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==";
5657 };
5658 };
5659 "stream-http-2.8.3" = {
5660 name = "stream-http";
5661 packageName = "stream-http";
5662 version = "2.8.3";
5663 src = fetchurl {
5664 url = "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz";
5665 sha512 = "+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==";
5666 };
5667 };
5668 "string-width-3.1.0" = {
5669 name = "string-width";
5670 packageName = "string-width";
5671 version = "3.1.0";
5672 src = fetchurl {
5673 url = "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz";
5674 sha512 = "vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==";
5675 };
5676 };
5677 "string.prototype.trimend-1.0.1" = {
5678 name = "string.prototype.trimend";
5679 packageName = "string.prototype.trimend";
5680 version = "1.0.1";
5681 src = fetchurl {
5682 url = "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz";
5683 sha512 = "LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==";
5684 };
5685 };
5686 "string.prototype.trimleft-2.1.2" = {
5687 name = "string.prototype.trimleft";
5688 packageName = "string.prototype.trimleft";
5689 version = "2.1.2";
5690 src = fetchurl {
5691 url = "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz";
5692 sha512 = "gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==";
5693 };
5694 };
5695 "string.prototype.trimright-2.1.2" = {
5696 name = "string.prototype.trimright";
5697 packageName = "string.prototype.trimright";
5698 version = "2.1.2";
5699 src = fetchurl {
5700 url = "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz";
5701 sha512 = "ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==";
5702 };
5703 };
5704 "string.prototype.trimstart-1.0.1" = {
5705 name = "string.prototype.trimstart";
5706 packageName = "string.prototype.trimstart";
5707 version = "1.0.1";
5708 src = fetchurl {
5709 url = "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz";
5710 sha512 = "XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==";
5711 };
5712 };
5713 "string_decoder-1.1.1" = {
5714 name = "string_decoder";
5715 packageName = "string_decoder";
5716 version = "1.1.1";
5717 src = fetchurl {
5718 url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
5719 sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
5720 };
5721 };
5722 "strip-ansi-3.0.1" = {
5723 name = "strip-ansi";
5724 packageName = "strip-ansi";
5725 version = "3.0.1";
5726 src = fetchurl {
5727 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
5728 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
5729 };
5730 };
5731 "strip-ansi-4.0.0" = {
5732 name = "strip-ansi";
5733 packageName = "strip-ansi";
5734 version = "4.0.0";
5735 src = fetchurl {
5736 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz";
5737 sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
5738 };
5739 };
5740 "strip-ansi-5.2.0" = {
5741 name = "strip-ansi";
5742 packageName = "strip-ansi";
5743 version = "5.2.0";
5744 src = fetchurl {
5745 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz";
5746 sha512 = "DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==";
5747 };
5748 };
5749 "stylehacks-4.0.3" = {
5750 name = "stylehacks";
5751 packageName = "stylehacks";
5752 version = "4.0.3";
5753 src = fetchurl {
5754 url = "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz";
5755 sha512 = "7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==";
5756 };
5757 };
5758 "supports-color-2.0.0" = {
5759 name = "supports-color";
5760 packageName = "supports-color";
5761 version = "2.0.0";
5762 src = fetchurl {
5763 url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
5764 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
5765 };
5766 };
5767 "supports-color-3.2.3" = {
5768 name = "supports-color";
5769 packageName = "supports-color";
5770 version = "3.2.3";
5771 src = fetchurl {
5772 url = "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz";
5773 sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6";
5774 };
5775 };
5776 "supports-color-5.5.0" = {
5777 name = "supports-color";
5778 packageName = "supports-color";
5779 version = "5.5.0";
5780 src = fetchurl {
5781 url = "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";
5782 sha512 = "QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==";
5783 };
5784 };
5785 "supports-color-6.1.0" = {
5786 name = "supports-color";
5787 packageName = "supports-color";
5788 version = "6.1.0";
5789 src = fetchurl {
5790 url = "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz";
5791 sha512 = "qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==";
5792 };
5793 };
5794 "svgo-1.3.2" = {
5795 name = "svgo";
5796 packageName = "svgo";
5797 version = "1.3.2";
5798 src = fetchurl {
5799 url = "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz";
5800 sha512 = "yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==";
5801 };
5802 };
5803 "symbol-tree-3.2.4" = {
5804 name = "symbol-tree";
5805 packageName = "symbol-tree";
5806 version = "3.2.4";
5807 src = fetchurl {
5808 url = "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz";
5809 sha512 = "9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==";
5810 };
5811 };
5812 "temp-0.9.0" = {
5813 name = "temp";
5814 packageName = "temp";
5815 version = "0.9.0";
5816 src = fetchurl {
5817 url = "https://registry.npmjs.org/temp/-/temp-0.9.0.tgz";
5818 sha512 = "YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ==";
5819 };
5820 };
5821 "terser-3.17.0" = {
5822 name = "terser";
5823 packageName = "terser";
5824 version = "3.17.0";
5825 src = fetchurl {
5826 url = "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz";
5827 sha512 = "/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==";
5828 };
5829 };
5830 "terser-4.6.12" = {
5831 name = "terser";
5832 packageName = "terser";
5833 version = "4.6.12";
5834 src = fetchurl {
5835 url = "https://registry.npmjs.org/terser/-/terser-4.6.12.tgz";
5836 sha512 = "fnIwuaKjFPANG6MAixC/k1TDtnl1YlPLUlLVIxxGZUn1gfUx2+l3/zGNB72wya+lgsb50QBi2tUV75RiODwnww==";
5837 };
5838 };
5839 "through2-2.0.5" = {
5840 name = "through2";
5841 packageName = "through2";
5842 version = "2.0.5";
5843 src = fetchurl {
5844 url = "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz";
5845 sha512 = "/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==";
5846 };
5847 };
5848 "timers-browserify-2.0.11" = {
5849 name = "timers-browserify";
5850 packageName = "timers-browserify";
5851 version = "2.0.11";
5852 src = fetchurl {
5853 url = "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz";
5854 sha512 = "60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==";
5855 };
5856 };
5857 "timsort-0.3.0" = {
5858 name = "timsort";
5859 packageName = "timsort";
5860 version = "0.3.0";
5861 src = fetchurl {
5862 url = "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz";
5863 sha1 = "405411a8e7e6339fe64db9a234de11dc31e02bd4";
5864 };
5865 };
5866 "tiny-inflate-1.0.3" = {
5867 name = "tiny-inflate";
5868 packageName = "tiny-inflate";
5869 version = "1.0.3";
5870 src = fetchurl {
5871 url = "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz";
5872 sha512 = "pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==";
5873 };
5874 };
5875 "to-arraybuffer-1.0.1" = {
5876 name = "to-arraybuffer";
5877 packageName = "to-arraybuffer";
5878 version = "1.0.1";
5879 src = fetchurl {
5880 url = "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
5881 sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
5882 };
5883 };
5884 "to-fast-properties-1.0.3" = {
5885 name = "to-fast-properties";
5886 packageName = "to-fast-properties";
5887 version = "1.0.3";
5888 src = fetchurl {
5889 url = "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz";
5890 sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47";
5891 };
5892 };
5893 "to-fast-properties-2.0.0" = {
5894 name = "to-fast-properties";
5895 packageName = "to-fast-properties";
5896 version = "2.0.0";
5897 src = fetchurl {
5898 url = "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz";
5899 sha1 = "dc5e698cbd079265bc73e0377681a4e4e83f616e";
5900 };
5901 };
5902 "to-object-path-0.3.0" = {
5903 name = "to-object-path";
5904 packageName = "to-object-path";
5905 version = "0.3.0";
5906 src = fetchurl {
5907 url = "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz";
5908 sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
5909 };
5910 };
5911 "to-regex-3.0.2" = {
5912 name = "to-regex";
5913 packageName = "to-regex";
5914 version = "3.0.2";
5915 src = fetchurl {
5916 url = "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz";
5917 sha512 = "FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==";
5918 };
5919 };
5920 "to-regex-range-2.1.1" = {
5921 name = "to-regex-range";
5922 packageName = "to-regex-range";
5923 version = "2.1.1";
5924 src = fetchurl {
5925 url = "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz";
5926 sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
5927 };
5928 };
5929 "toidentifier-1.0.0" = {
5930 name = "toidentifier";
5931 packageName = "toidentifier";
5932 version = "1.0.0";
5933 src = fetchurl {
5934 url = "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz";
5935 sha512 = "yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==";
5936 };
5937 };
5938 "tough-cookie-2.5.0" = {
5939 name = "tough-cookie";
5940 packageName = "tough-cookie";
5941 version = "2.5.0";
5942 src = fetchurl {
5943 url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz";
5944 sha512 = "nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==";
5945 };
5946 };
5947 "tr46-1.0.1" = {
5948 name = "tr46";
5949 packageName = "tr46";
5950 version = "1.0.1";
5951 src = fetchurl {
5952 url = "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz";
5953 sha1 = "a8b13fd6bfd2489519674ccde55ba3693b706d09";
5954 };
5955 };
5956 "trim-right-1.0.1" = {
5957 name = "trim-right";
5958 packageName = "trim-right";
5959 version = "1.0.1";
5960 src = fetchurl {
5961 url = "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz";
5962 sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003";
5963 };
5964 };
5965 "tty-browserify-0.0.0" = {
5966 name = "tty-browserify";
5967 packageName = "tty-browserify";
5968 version = "0.0.0";
5969 src = fetchurl {
5970 url = "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz";
5971 sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6";
5972 };
5973 };
5974 "tunnel-agent-0.6.0" = {
5975 name = "tunnel-agent";
5976 packageName = "tunnel-agent";
5977 version = "0.6.0";
5978 src = fetchurl {
5979 url = "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
5980 sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
5981 };
5982 };
5983 "tweetnacl-0.14.5" = {
5984 name = "tweetnacl";
5985 packageName = "tweetnacl";
5986 version = "0.14.5";
5987 src = fetchurl {
5988 url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
5989 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
5990 };
5991 };
5992 "type-check-0.3.2" = {
5993 name = "type-check";
5994 packageName = "type-check";
5995 version = "0.3.2";
5996 src = fetchurl {
5997 url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
5998 sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
5999 };
6000 };
6001 "typedarray-0.0.6" = {
6002 name = "typedarray";
6003 packageName = "typedarray";
6004 version = "0.0.6";
6005 src = fetchurl {
6006 url = "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz";
6007 sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
6008 };
6009 };
6010 "uncss-0.17.3" = {
6011 name = "uncss";
6012 packageName = "uncss";
6013 version = "0.17.3";
6014 src = fetchurl {
6015 url = "https://registry.npmjs.org/uncss/-/uncss-0.17.3.tgz";
6016 sha512 = "ksdDWl81YWvF/X14fOSw4iu8tESDHFIeyKIeDrK6GEVTQvqJc1WlOEXqostNwOCi3qAj++4EaLsdAgPmUbEyog==";
6017 };
6018 };
6019 "unicode-canonical-property-names-ecmascript-1.0.4" = {
6020 name = "unicode-canonical-property-names-ecmascript";
6021 packageName = "unicode-canonical-property-names-ecmascript";
6022 version = "1.0.4";
6023 src = fetchurl {
6024 url = "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz";
6025 sha512 = "jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==";
6026 };
6027 };
6028 "unicode-match-property-ecmascript-1.0.4" = {
6029 name = "unicode-match-property-ecmascript";
6030 packageName = "unicode-match-property-ecmascript";
6031 version = "1.0.4";
6032 src = fetchurl {
6033 url = "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz";
6034 sha512 = "L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==";
6035 };
6036 };
6037 "unicode-match-property-value-ecmascript-1.2.0" = {
6038 name = "unicode-match-property-value-ecmascript";
6039 packageName = "unicode-match-property-value-ecmascript";
6040 version = "1.2.0";
6041 src = fetchurl {
6042 url = "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz";
6043 sha512 = "wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==";
6044 };
6045 };
6046 "unicode-property-aliases-ecmascript-1.1.0" = {
6047 name = "unicode-property-aliases-ecmascript";
6048 packageName = "unicode-property-aliases-ecmascript";
6049 version = "1.1.0";
6050 src = fetchurl {
6051 url = "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz";
6052 sha512 = "PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==";
6053 };
6054 };
6055 "unicode-trie-0.3.1" = {
6056 name = "unicode-trie";
6057 packageName = "unicode-trie";
6058 version = "0.3.1";
6059 src = fetchurl {
6060 url = "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz";
6061 sha1 = "d671dddd89101a08bac37b6a5161010602052085";
6062 };
6063 };
6064 "union-value-1.0.1" = {
6065 name = "union-value";
6066 packageName = "union-value";
6067 version = "1.0.1";
6068 src = fetchurl {
6069 url = "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz";
6070 sha512 = "tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==";
6071 };
6072 };
6073 "uniq-1.0.1" = {
6074 name = "uniq";
6075 packageName = "uniq";
6076 version = "1.0.1";
6077 src = fetchurl {
6078 url = "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz";
6079 sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
6080 };
6081 };
6082 "uniqs-2.0.0" = {
6083 name = "uniqs";
6084 packageName = "uniqs";
6085 version = "2.0.0";
6086 src = fetchurl {
6087 url = "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz";
6088 sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02";
6089 };
6090 };
6091 "unquote-1.1.1" = {
6092 name = "unquote";
6093 packageName = "unquote";
6094 version = "1.1.1";
6095 src = fetchurl {
6096 url = "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz";
6097 sha1 = "8fded7324ec6e88a0ff8b905e7c098cdc086d544";
6098 };
6099 };
6100 "unset-value-1.0.0" = {
6101 name = "unset-value";
6102 packageName = "unset-value";
6103 version = "1.0.0";
6104 src = fetchurl {
6105 url = "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz";
6106 sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
6107 };
6108 };
6109 "upath-1.2.0" = {
6110 name = "upath";
6111 packageName = "upath";
6112 version = "1.2.0";
6113 src = fetchurl {
6114 url = "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz";
6115 sha512 = "aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==";
6116 };
6117 };
6118 "uri-js-4.2.2" = {
6119 name = "uri-js";
6120 packageName = "uri-js";
6121 version = "4.2.2";
6122 src = fetchurl {
6123 url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz";
6124 sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==";
6125 };
6126 };
6127 "urix-0.1.0" = {
6128 name = "urix";
6129 packageName = "urix";
6130 version = "0.1.0";
6131 src = fetchurl {
6132 url = "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz";
6133 sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
6134 };
6135 };
6136 "url-0.11.0" = {
6137 name = "url";
6138 packageName = "url";
6139 version = "0.11.0";
6140 src = fetchurl {
6141 url = "https://registry.npmjs.org/url/-/url-0.11.0.tgz";
6142 sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
6143 };
6144 };
6145 "use-3.1.1" = {
6146 name = "use";
6147 packageName = "use";
6148 version = "3.1.1";
6149 src = fetchurl {
6150 url = "https://registry.npmjs.org/use/-/use-3.1.1.tgz";
6151 sha512 = "cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==";
6152 };
6153 };
6154 "util-0.10.3" = {
6155 name = "util";
6156 packageName = "util";
6157 version = "0.10.3";
6158 src = fetchurl {
6159 url = "https://registry.npmjs.org/util/-/util-0.10.3.tgz";
6160 sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
6161 };
6162 };
6163 "util-0.11.1" = {
6164 name = "util";
6165 packageName = "util";
6166 version = "0.11.1";
6167 src = fetchurl {
6168 url = "https://registry.npmjs.org/util/-/util-0.11.1.tgz";
6169 sha512 = "HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==";
6170 };
6171 };
6172 "util-deprecate-1.0.2" = {
6173 name = "util-deprecate";
6174 packageName = "util-deprecate";
6175 version = "1.0.2";
6176 src = fetchurl {
6177 url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
6178 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
6179 };
6180 };
6181 "util.promisify-1.0.1" = {
6182 name = "util.promisify";
6183 packageName = "util.promisify";
6184 version = "1.0.1";
6185 src = fetchurl {
6186 url = "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz";
6187 sha512 = "g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==";
6188 };
6189 };
6190 "uuid-3.4.0" = {
6191 name = "uuid";
6192 packageName = "uuid";
6193 version = "3.4.0";
6194 src = fetchurl {
6195 url = "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz";
6196 sha512 = "HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==";
6197 };
6198 };
6199 "v8-compile-cache-2.1.0" = {
6200 name = "v8-compile-cache";
6201 packageName = "v8-compile-cache";
6202 version = "2.1.0";
6203 src = fetchurl {
6204 url = "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz";
6205 sha512 = "usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==";
6206 };
6207 };
6208 "vendors-1.0.4" = {
6209 name = "vendors";
6210 packageName = "vendors";
6211 version = "1.0.4";
6212 src = fetchurl {
6213 url = "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz";
6214 sha512 = "/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==";
6215 };
6216 };
6217 "verror-1.10.0" = {
6218 name = "verror";
6219 packageName = "verror";
6220 version = "1.10.0";
6221 src = fetchurl {
6222 url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
6223 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
6224 };
6225 };
6226 "vlq-0.2.3" = {
6227 name = "vlq";
6228 packageName = "vlq";
6229 version = "0.2.3";
6230 src = fetchurl {
6231 url = "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz";
6232 sha512 = "DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==";
6233 };
6234 };
6235 "vm-browserify-1.1.2" = {
6236 name = "vm-browserify";
6237 packageName = "vm-browserify";
6238 version = "1.1.2";
6239 src = fetchurl {
6240 url = "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz";
6241 sha512 = "2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==";
6242 };
6243 };
6244 "w3c-hr-time-1.0.2" = {
6245 name = "w3c-hr-time";
6246 packageName = "w3c-hr-time";
6247 version = "1.0.2";
6248 src = fetchurl {
6249 url = "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz";
6250 sha512 = "z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==";
6251 };
6252 };
6253 "w3c-xmlserializer-1.1.2" = {
6254 name = "w3c-xmlserializer";
6255 packageName = "w3c-xmlserializer";
6256 version = "1.1.2";
6257 src = fetchurl {
6258 url = "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz";
6259 sha512 = "p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==";
6260 };
6261 };
6262 "wcwidth-1.0.1" = {
6263 name = "wcwidth";
6264 packageName = "wcwidth";
6265 version = "1.0.1";
6266 src = fetchurl {
6267 url = "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz";
6268 sha1 = "f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8";
6269 };
6270 };
6271 "webidl-conversions-4.0.2" = {
6272 name = "webidl-conversions";
6273 packageName = "webidl-conversions";
6274 version = "4.0.2";
6275 src = fetchurl {
6276 url = "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz";
6277 sha512 = "YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==";
6278 };
6279 };
6280 "whatwg-encoding-1.0.5" = {
6281 name = "whatwg-encoding";
6282 packageName = "whatwg-encoding";
6283 version = "1.0.5";
6284 src = fetchurl {
6285 url = "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz";
6286 sha512 = "b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==";
6287 };
6288 };
6289 "whatwg-mimetype-2.3.0" = {
6290 name = "whatwg-mimetype";
6291 packageName = "whatwg-mimetype";
6292 version = "2.3.0";
6293 src = fetchurl {
6294 url = "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz";
6295 sha512 = "M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==";
6296 };
6297 };
6298 "whatwg-url-7.1.0" = {
6299 name = "whatwg-url";
6300 packageName = "whatwg-url";
6301 version = "7.1.0";
6302 src = fetchurl {
6303 url = "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz";
6304 sha512 = "WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==";
6305 };
6306 };
6307 "which-1.3.1" = {
6308 name = "which";
6309 packageName = "which";
6310 version = "1.3.1";
6311 src = fetchurl {
6312 url = "https://registry.npmjs.org/which/-/which-1.3.1.tgz";
6313 sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
6314 };
6315 };
6316 "which-module-2.0.0" = {
6317 name = "which-module";
6318 packageName = "which-module";
6319 version = "2.0.0";
6320 src = fetchurl {
6321 url = "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz";
6322 sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
6323 };
6324 };
6325 "word-wrap-1.2.3" = {
6326 name = "word-wrap";
6327 packageName = "word-wrap";
6328 version = "1.2.3";
6329 src = fetchurl {
6330 url = "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz";
6331 sha512 = "Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==";
6332 };
6333 };
6334 "wrap-ansi-5.1.0" = {
6335 name = "wrap-ansi";
6336 packageName = "wrap-ansi";
6337 version = "5.1.0";
6338 src = fetchurl {
6339 url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz";
6340 sha512 = "QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==";
6341 };
6342 };
6343 "wrappy-1.0.2" = {
6344 name = "wrappy";
6345 packageName = "wrappy";
6346 version = "1.0.2";
6347 src = fetchurl {
6348 url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
6349 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
6350 };
6351 };
6352 "ws-5.2.2" = {
6353 name = "ws";
6354 packageName = "ws";
6355 version = "5.2.2";
6356 src = fetchurl {
6357 url = "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz";
6358 sha512 = "jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==";
6359 };
6360 };
6361 "ws-6.2.1" = {
6362 name = "ws";
6363 packageName = "ws";
6364 version = "6.2.1";
6365 src = fetchurl {
6366 url = "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz";
6367 sha512 = "GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==";
6368 };
6369 };
6370 "xml-name-validator-3.0.0" = {
6371 name = "xml-name-validator";
6372 packageName = "xml-name-validator";
6373 version = "3.0.0";
6374 src = fetchurl {
6375 url = "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz";
6376 sha512 = "A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==";
6377 };
6378 };
6379 "xmlchars-2.2.0" = {
6380 name = "xmlchars";
6381 packageName = "xmlchars";
6382 version = "2.2.0";
6383 src = fetchurl {
6384 url = "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz";
6385 sha512 = "JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==";
6386 };
6387 };
6388 "xtend-4.0.2" = {
6389 name = "xtend";
6390 packageName = "xtend";
6391 version = "4.0.2";
6392 src = fetchurl {
6393 url = "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz";
6394 sha512 = "LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==";
6395 };
6396 };
6397 "y18n-4.0.0" = {
6398 name = "y18n";
6399 packageName = "y18n";
6400 version = "4.0.0";
6401 src = fetchurl {
6402 url = "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz";
6403 sha512 = "r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==";
6404 };
6405 };
6406 "yallist-2.1.2" = {
6407 name = "yallist";
6408 packageName = "yallist";
6409 version = "2.1.2";
6410 src = fetchurl {
6411 url = "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz";
6412 sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
6413 };
6414 };
6415 "yargs-14.2.3" = {
6416 name = "yargs";
6417 packageName = "yargs";
6418 version = "14.2.3";
6419 src = fetchurl {
6420 url = "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz";
6421 sha512 = "ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==";
6422 };
6423 };
6424 "yargs-parser-15.0.1" = {
6425 name = "yargs-parser";
6426 packageName = "yargs-parser";
6427 version = "15.0.1";
6428 src = fetchurl {
6429 url = "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz";
6430 sha512 = "0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==";
6431 };
6432 };
6433 };
6434 args = {
6435 name = "codenamesgreen";
6436 packageName = "codenamesgreen";
6437 version = "1.0.0";
6438 src = let
6439 upstream = fetchFromGitHub {
6440 owner = "jbowens";
6441 repo = "codenamesgreen";
6442 rev = "6d014d0df14bee72495e01f12885ef31cba3bd6b";
6443 sha256 = "0bkaf52rnjw792q0755in4k5jbcrmgq06cl03fdl6zdr8kq2mhm0";
6444 };
6445 in
6446 runCommand "codenamesgreen-src" {} ''
6447 cp -a ${upstream} $out
6448 chmod -R u+w $out
6449 cd $out
6450 patch -p1 < ${./codenames.patch}
6451 '';
6452 dependencies = [
6453 sources."@babel/code-frame-7.0.0"
6454 (sources."@babel/core-7.3.4" // {
6455 dependencies = [
6456 sources."json5-2.1.3"
6457 sources."source-map-0.5.7"
6458 ];
6459 })
6460 (sources."@babel/generator-7.3.4" // {
6461 dependencies = [
6462 sources."source-map-0.5.7"
6463 ];
6464 })
6465 (sources."@babel/helper-annotate-as-pure-7.8.3" // {
6466 dependencies = [
6467 sources."@babel/types-7.9.5"
6468 ];
6469 })
6470 (sources."@babel/helper-builder-binary-assignment-operator-visitor-7.8.3" // {
6471 dependencies = [
6472 sources."@babel/types-7.9.5"
6473 ];
6474 })
6475 (sources."@babel/helper-builder-react-jsx-7.9.0" // {
6476 dependencies = [
6477 sources."@babel/types-7.9.5"
6478 ];
6479 })
6480 sources."@babel/helper-create-regexp-features-plugin-7.8.8"
6481 (sources."@babel/helper-define-map-7.8.3" // {
6482 dependencies = [
6483 sources."@babel/types-7.9.5"
6484 ];
6485 })
6486 (sources."@babel/helper-explode-assignable-expression-7.8.3" // {
6487 dependencies = [
6488 sources."@babel/code-frame-7.8.3"
6489 sources."@babel/generator-7.9.5"
6490 sources."@babel/parser-7.9.4"
6491 sources."@babel/traverse-7.9.5"
6492 sources."@babel/types-7.9.5"
6493 sources."source-map-0.5.7"
6494 ];
6495 })
6496 (sources."@babel/helper-function-name-7.9.5" // {
6497 dependencies = [
6498 sources."@babel/code-frame-7.8.3"
6499 sources."@babel/parser-7.9.4"
6500 sources."@babel/template-7.8.6"
6501 sources."@babel/types-7.9.5"
6502 ];
6503 })
6504 (sources."@babel/helper-get-function-arity-7.8.3" // {
6505 dependencies = [
6506 sources."@babel/types-7.9.5"
6507 ];
6508 })
6509 (sources."@babel/helper-hoist-variables-7.8.3" // {
6510 dependencies = [
6511 sources."@babel/types-7.9.5"
6512 ];
6513 })
6514 (sources."@babel/helper-member-expression-to-functions-7.8.3" // {
6515 dependencies = [
6516 sources."@babel/types-7.9.5"
6517 ];
6518 })
6519 (sources."@babel/helper-module-imports-7.8.3" // {
6520 dependencies = [
6521 sources."@babel/types-7.9.5"
6522 ];
6523 })
6524 (sources."@babel/helper-module-transforms-7.9.0" // {
6525 dependencies = [
6526 sources."@babel/code-frame-7.8.3"
6527 sources."@babel/parser-7.9.4"
6528 sources."@babel/template-7.8.6"
6529 sources."@babel/types-7.9.5"
6530 ];
6531 })
6532 (sources."@babel/helper-optimise-call-expression-7.8.3" // {
6533 dependencies = [
6534 sources."@babel/types-7.9.5"
6535 ];
6536 })
6537 sources."@babel/helper-plugin-utils-7.8.3"
6538 sources."@babel/helper-regex-7.8.3"
6539 (sources."@babel/helper-remap-async-to-generator-7.8.3" // {
6540 dependencies = [
6541 sources."@babel/code-frame-7.8.3"
6542 sources."@babel/generator-7.9.5"
6543 sources."@babel/parser-7.9.4"
6544 sources."@babel/template-7.8.6"
6545 sources."@babel/traverse-7.9.5"
6546 sources."@babel/types-7.9.5"
6547 sources."source-map-0.5.7"
6548 ];
6549 })
6550 (sources."@babel/helper-replace-supers-7.8.6" // {
6551 dependencies = [
6552 sources."@babel/code-frame-7.8.3"
6553 sources."@babel/generator-7.9.5"
6554 sources."@babel/parser-7.9.4"
6555 sources."@babel/traverse-7.9.5"
6556 sources."@babel/types-7.9.5"
6557 sources."source-map-0.5.7"
6558 ];
6559 })
6560 (sources."@babel/helper-simple-access-7.8.3" // {
6561 dependencies = [
6562 sources."@babel/code-frame-7.8.3"
6563 sources."@babel/parser-7.9.4"
6564 sources."@babel/template-7.8.6"
6565 sources."@babel/types-7.9.5"
6566 ];
6567 })
6568 (sources."@babel/helper-split-export-declaration-7.8.3" // {
6569 dependencies = [
6570 sources."@babel/types-7.9.5"
6571 ];
6572 })
6573 sources."@babel/helper-validator-identifier-7.9.5"
6574 (sources."@babel/helper-wrap-function-7.8.3" // {
6575 dependencies = [
6576 sources."@babel/code-frame-7.8.3"
6577 sources."@babel/generator-7.9.5"
6578 sources."@babel/parser-7.9.4"
6579 sources."@babel/template-7.8.6"
6580 sources."@babel/traverse-7.9.5"
6581 sources."@babel/types-7.9.5"
6582 sources."source-map-0.5.7"
6583 ];
6584 })
6585 (sources."@babel/helpers-7.9.2" // {
6586 dependencies = [
6587 sources."@babel/code-frame-7.8.3"
6588 sources."@babel/generator-7.9.5"
6589 sources."@babel/parser-7.9.4"
6590 sources."@babel/template-7.8.6"
6591 sources."@babel/traverse-7.9.5"
6592 sources."@babel/types-7.9.5"
6593 sources."source-map-0.5.7"
6594 ];
6595 })
6596 sources."@babel/highlight-7.9.0"
6597 sources."@babel/parser-7.3.4"
6598 sources."@babel/plugin-proposal-async-generator-functions-7.8.3"
6599 sources."@babel/plugin-proposal-json-strings-7.8.3"
6600 sources."@babel/plugin-proposal-object-rest-spread-7.9.5"
6601 sources."@babel/plugin-proposal-optional-catch-binding-7.8.3"
6602 sources."@babel/plugin-proposal-unicode-property-regex-7.8.8"
6603 sources."@babel/plugin-syntax-async-generators-7.8.4"
6604 sources."@babel/plugin-syntax-flow-7.8.3"
6605 sources."@babel/plugin-syntax-json-strings-7.8.3"
6606 sources."@babel/plugin-syntax-jsx-7.8.3"
6607 sources."@babel/plugin-syntax-object-rest-spread-7.8.3"
6608 sources."@babel/plugin-syntax-optional-catch-binding-7.8.3"
6609 sources."@babel/plugin-transform-arrow-functions-7.8.3"
6610 sources."@babel/plugin-transform-async-to-generator-7.8.3"
6611 sources."@babel/plugin-transform-block-scoped-functions-7.8.3"
6612 sources."@babel/plugin-transform-block-scoping-7.8.3"
6613 sources."@babel/plugin-transform-classes-7.9.5"
6614 sources."@babel/plugin-transform-computed-properties-7.8.3"
6615 sources."@babel/plugin-transform-destructuring-7.9.5"
6616 sources."@babel/plugin-transform-dotall-regex-7.8.3"
6617 sources."@babel/plugin-transform-duplicate-keys-7.8.3"
6618 sources."@babel/plugin-transform-exponentiation-operator-7.8.3"
6619 sources."@babel/plugin-transform-flow-strip-types-7.3.4"
6620 sources."@babel/plugin-transform-for-of-7.9.0"
6621 sources."@babel/plugin-transform-function-name-7.8.3"
6622 sources."@babel/plugin-transform-literals-7.8.3"
6623 sources."@babel/plugin-transform-modules-amd-7.9.0"
6624 sources."@babel/plugin-transform-modules-commonjs-7.2.0"
6625 sources."@babel/plugin-transform-modules-systemjs-7.9.0"
6626 sources."@babel/plugin-transform-modules-umd-7.9.0"
6627 sources."@babel/plugin-transform-named-capturing-groups-regex-7.8.3"
6628 sources."@babel/plugin-transform-new-target-7.8.3"
6629 sources."@babel/plugin-transform-object-super-7.8.3"
6630 sources."@babel/plugin-transform-parameters-7.9.5"
6631 sources."@babel/plugin-transform-react-jsx-7.3.0"
6632 sources."@babel/plugin-transform-regenerator-7.8.7"
6633 sources."@babel/plugin-transform-shorthand-properties-7.8.3"
6634 sources."@babel/plugin-transform-spread-7.8.3"
6635 sources."@babel/plugin-transform-sticky-regex-7.8.3"
6636 sources."@babel/plugin-transform-template-literals-7.8.3"
6637 sources."@babel/plugin-transform-typeof-symbol-7.8.4"
6638 sources."@babel/plugin-transform-unicode-regex-7.8.3"
6639 sources."@babel/preset-env-7.3.4"
6640 (sources."@babel/runtime-7.3.4" // {
6641 dependencies = [
6642 sources."regenerator-runtime-0.12.1"
6643 ];
6644 })
6645 sources."@babel/template-7.2.2"
6646 sources."@babel/traverse-7.3.4"
6647 sources."@babel/types-7.3.4"
6648 sources."@iarna/toml-2.2.5"
6649 sources."@mrmlnc/readdir-enhanced-2.2.1"
6650 sources."@nodelib/fs.stat-1.1.3"
6651 sources."@parcel/fs-1.11.0"
6652 sources."@parcel/logger-1.11.1"
6653 sources."@parcel/utils-1.11.0"
6654 sources."@parcel/watcher-1.12.1"
6655 sources."@parcel/workers-1.11.0"
6656 sources."@types/q-1.5.2"
6657 sources."abab-2.0.3"
6658 sources."abbrev-1.1.1"
6659 sources."acorn-7.1.1"
6660 (sources."acorn-globals-4.3.4" // {
6661 dependencies = [
6662 sources."acorn-6.4.1"
6663 ];
6664 })
6665 sources."acorn-walk-6.2.0"
6666 sources."ajv-6.12.2"
6667 sources."alphanum-sort-1.0.2"
6668 sources."ansi-regex-3.0.0"
6669 sources."ansi-styles-3.2.1"
6670 (sources."ansi-to-html-0.6.14" // {
6671 dependencies = [
6672 sources."entities-1.1.2"
6673 ];
6674 })
6675 (sources."anymatch-2.0.0" // {
6676 dependencies = [
6677 sources."normalize-path-2.1.1"
6678 ];
6679 })
6680 sources."argparse-1.0.10"
6681 sources."arr-diff-4.0.0"
6682 sources."arr-flatten-1.1.0"
6683 sources."arr-union-3.1.0"
6684 sources."array-equal-1.0.0"
6685 sources."array-unique-0.3.2"
6686 sources."asn1-0.2.4"
6687 sources."asn1.js-4.10.1"
6688 (sources."assert-1.5.0" // {
6689 dependencies = [
6690 sources."inherits-2.0.1"
6691 sources."util-0.10.3"
6692 ];
6693 })
6694 sources."assert-plus-1.0.0"
6695 sources."assign-symbols-1.0.0"
6696 sources."async-each-1.0.3"
6697 sources."async-limiter-1.0.1"
6698 sources."asynckit-0.4.0"
6699 sources."atob-2.1.2"
6700 sources."aws-sign2-0.7.0"
6701 sources."aws4-1.9.1"
6702 sources."babel-plugin-dynamic-import-node-2.3.3"
6703 (sources."babel-runtime-6.26.0" // {
6704 dependencies = [
6705 sources."regenerator-runtime-0.11.1"
6706 ];
6707 })
6708 (sources."babel-types-6.26.0" // {
6709 dependencies = [
6710 sources."to-fast-properties-1.0.3"
6711 ];
6712 })
6713 sources."babylon-walk-1.0.2"
6714 sources."balanced-match-1.0.0"
6715 (sources."base-0.11.2" // {
6716 dependencies = [
6717 sources."define-property-1.0.0"
6718 sources."is-accessor-descriptor-1.0.0"
6719 sources."is-data-descriptor-1.0.0"
6720 sources."is-descriptor-1.0.2"
6721 ];
6722 })
6723 sources."base64-js-1.3.1"
6724 sources."bcrypt-pbkdf-1.0.2"
6725 sources."binary-extensions-1.13.1"
6726 sources."bindings-1.5.0"
6727 sources."bn.js-4.11.8"
6728 sources."boolbase-1.0.0"
6729 sources."brace-expansion-1.1.11"
6730 (sources."braces-2.3.2" // {
6731 dependencies = [
6732 sources."extend-shallow-2.0.1"
6733 ];
6734 })
6735 sources."brfs-1.6.1"
6736 sources."brorand-1.1.0"
6737 sources."browser-process-hrtime-1.0.0"
6738 sources."browserify-aes-1.2.0"
6739 sources."browserify-cipher-1.0.1"
6740 sources."browserify-des-1.0.2"
6741 sources."browserify-rsa-4.0.1"
6742 sources."browserify-sign-4.0.4"
6743 (sources."browserify-zlib-0.2.0" // {
6744 dependencies = [
6745 sources."pako-1.0.11"
6746 ];
6747 })
6748 sources."browserslist-4.12.0"
6749 sources."buffer-4.9.2"
6750 sources."buffer-equal-0.0.1"
6751 sources."buffer-from-1.1.1"
6752 sources."buffer-xor-1.0.3"
6753 sources."builtin-status-codes-3.0.0"
6754 sources."cache-base-1.0.1"
6755 sources."call-me-maybe-1.0.1"
6756 sources."caller-callsite-2.0.0"
6757 sources."caller-path-2.0.0"
6758 sources."callsites-2.0.0"
6759 sources."camelcase-5.3.1"
6760 sources."caniuse-api-3.0.0"
6761 sources."caniuse-lite-1.0.30001048"
6762 sources."caseless-0.12.0"
6763 (sources."chalk-2.4.2" // {
6764 dependencies = [
6765 sources."supports-color-5.5.0"
6766 ];
6767 })
6768 (sources."chokidar-2.1.8" // {
6769 dependencies = [
6770 sources."fsevents-1.2.12"
6771 ];
6772 })
6773 sources."cipher-base-1.0.4"
6774 (sources."class-utils-0.3.6" // {
6775 dependencies = [
6776 sources."define-property-0.2.5"
6777 ];
6778 })
6779 sources."cli-cursor-2.1.0"
6780 sources."cli-spinners-1.3.1"
6781 (sources."cliui-5.0.0" // {
6782 dependencies = [
6783 sources."ansi-regex-4.1.0"
6784 sources."strip-ansi-5.2.0"
6785 ];
6786 })
6787 sources."clone-2.1.2"
6788 sources."clones-1.2.0"
6789 sources."coa-2.0.2"
6790 sources."collection-visit-1.0.0"
6791 sources."color-3.1.2"
6792 sources."color-convert-1.9.3"
6793 sources."color-name-1.1.3"
6794 sources."color-string-1.5.3"
6795 sources."combined-stream-1.0.8"
6796 sources."command-exists-1.2.9"
6797 sources."commander-2.20.3"
6798 sources."component-emitter-1.3.0"
6799 sources."concat-map-0.0.1"
6800 sources."concat-stream-1.6.2"
6801 sources."config-chain-1.1.12"
6802 sources."console-browserify-1.2.0"
6803 sources."constants-browserify-1.0.0"
6804 sources."convert-source-map-1.7.0"
6805 sources."copy-descriptor-0.1.1"
6806 sources."core-js-2.6.11"
6807 sources."core-util-is-1.0.2"
6808 sources."cosmiconfig-5.2.1"
6809 sources."create-ecdh-4.0.3"
6810 sources."create-hash-1.2.0"
6811 sources."create-hmac-1.1.7"
6812 sources."cross-spawn-6.0.5"
6813 sources."crypto-browserify-3.12.0"
6814 sources."css-color-names-0.0.4"
6815 sources."css-declaration-sorter-4.0.1"
6816 (sources."css-modules-loader-core-1.1.0" // {
6817 dependencies = [
6818 sources."ansi-regex-2.1.1"
6819 sources."ansi-styles-2.2.1"
6820 (sources."chalk-1.1.3" // {
6821 dependencies = [
6822 sources."supports-color-2.0.0"
6823 ];
6824 })
6825 sources."has-flag-1.0.0"
6826 sources."postcss-6.0.1"
6827 sources."source-map-0.5.7"
6828 sources."strip-ansi-3.0.1"
6829 sources."supports-color-3.2.3"
6830 ];
6831 })
6832 sources."css-select-2.1.0"
6833 sources."css-select-base-adapter-0.1.1"
6834 sources."css-selector-tokenizer-0.7.2"
6835 sources."css-tree-1.0.0-alpha.37"
6836 sources."css-what-3.2.1"
6837 sources."cssesc-3.0.0"
6838 sources."cssnano-4.1.10"
6839 sources."cssnano-preset-default-4.0.7"
6840 sources."cssnano-util-get-arguments-4.0.0"
6841 sources."cssnano-util-get-match-4.0.0"
6842 sources."cssnano-util-raw-cache-4.0.1"
6843 sources."cssnano-util-same-parent-4.0.1"
6844 (sources."csso-4.0.3" // {
6845 dependencies = [
6846 sources."css-tree-1.0.0-alpha.39"
6847 sources."mdn-data-2.0.6"
6848 ];
6849 })
6850 sources."cssom-0.3.8"
6851 sources."cssstyle-1.4.0"
6852 sources."dashdash-1.14.1"
6853 sources."data-urls-1.1.0"
6854 sources."deasync-0.1.19"
6855 sources."debug-4.1.1"
6856 sources."decamelize-1.2.0"
6857 sources."decode-uri-component-0.2.0"
6858 sources."deep-is-0.1.3"
6859 (sources."defaults-1.0.3" // {
6860 dependencies = [
6861 sources."clone-1.0.4"
6862 ];
6863 })
6864 sources."define-properties-1.1.3"
6865 (sources."define-property-2.0.2" // {
6866 dependencies = [
6867 sources."is-accessor-descriptor-1.0.0"
6868 sources."is-data-descriptor-1.0.0"
6869 sources."is-descriptor-1.0.2"
6870 ];
6871 })
6872 sources."delayed-stream-1.0.0"
6873 sources."depd-1.1.2"
6874 sources."des.js-1.0.1"
6875 sources."destroy-1.0.4"
6876 sources."diffie-hellman-5.0.3"
6877 (sources."dom-serializer-0.2.2" // {
6878 dependencies = [
6879 sources."domelementtype-2.0.1"
6880 ];
6881 })
6882 sources."domain-browser-1.2.0"
6883 sources."domelementtype-1.3.1"
6884 sources."domexception-1.0.1"
6885 sources."domhandler-2.4.2"
6886 sources."domutils-1.7.0"
6887 sources."dot-prop-5.2.0"
6888 sources."dotenv-5.0.1"
6889 sources."dotenv-expand-4.2.0"
6890 sources."duplexer2-0.1.4"
6891 sources."ecc-jsbn-0.1.2"
6892 sources."editorconfig-0.15.3"
6893 sources."ee-first-1.1.1"
6894 sources."electron-to-chromium-1.3.418"
6895 sources."elliptic-6.5.2"
6896 sources."elm-hot-1.1.1"
6897 sources."emoji-regex-7.0.3"
6898 sources."encodeurl-1.0.2"
6899 sources."entities-2.0.0"
6900 sources."error-ex-1.3.2"
6901 sources."es-abstract-1.17.5"
6902 sources."es-to-primitive-1.2.1"
6903 sources."escape-html-1.0.3"
6904 sources."escape-string-regexp-1.0.5"
6905 (sources."escodegen-1.9.1" // {
6906 dependencies = [
6907 sources."esprima-3.1.3"
6908 ];
6909 })
6910 sources."esprima-4.0.1"
6911 sources."estraverse-4.3.0"
6912 sources."esutils-2.0.3"
6913 sources."etag-1.8.1"
6914 sources."events-3.1.0"
6915 sources."evp_bytestokey-1.0.3"
6916 (sources."expand-brackets-2.1.4" // {
6917 dependencies = [
6918 sources."debug-2.6.9"
6919 sources."define-property-0.2.5"
6920 sources."extend-shallow-2.0.1"
6921 sources."ms-2.0.0"
6922 ];
6923 })
6924 sources."extend-3.0.2"
6925 (sources."extend-shallow-3.0.2" // {
6926 dependencies = [
6927 sources."is-extendable-1.0.1"
6928 ];
6929 })
6930 (sources."extglob-2.0.4" // {
6931 dependencies = [
6932 sources."define-property-1.0.0"
6933 sources."extend-shallow-2.0.1"
6934 sources."is-accessor-descriptor-1.0.0"
6935 sources."is-data-descriptor-1.0.0"
6936 sources."is-descriptor-1.0.2"
6937 ];
6938 })
6939 sources."extsprintf-1.3.0"
6940 (sources."falafel-2.2.4" // {
6941 dependencies = [
6942 sources."isarray-2.0.5"
6943 ];
6944 })
6945 sources."fast-deep-equal-3.1.1"
6946 sources."fast-glob-2.2.7"
6947 sources."fast-json-stable-stringify-2.1.0"
6948 sources."fast-levenshtein-2.0.6"
6949 sources."fastparse-1.1.2"
6950 sources."file-uri-to-path-1.0.0"
6951 sources."filesize-3.6.1"
6952 (sources."fill-range-4.0.0" // {
6953 dependencies = [
6954 sources."extend-shallow-2.0.1"
6955 ];
6956 })
6957 sources."find-elm-dependencies-2.0.2"
6958 sources."find-up-2.1.0"
6959 sources."firstline-1.2.0"
6960 sources."for-in-1.0.2"
6961 sources."foreach-2.0.5"
6962 sources."forever-agent-0.6.1"
6963 sources."form-data-2.3.3"
6964 sources."fragment-cache-0.2.1"
6965 sources."fresh-0.5.2"
6966 sources."fs.realpath-1.0.0"
6967 sources."function-bind-1.1.1"
6968 sources."get-caller-file-2.0.5"
6969 sources."get-port-3.2.0"
6970 sources."get-value-2.0.6"
6971 sources."getpass-0.1.7"
6972 sources."glob-7.1.4"
6973 (sources."glob-parent-3.1.0" // {
6974 dependencies = [
6975 sources."is-glob-3.1.0"
6976 ];
6977 })
6978 sources."glob-to-regexp-0.3.0"
6979 sources."globals-11.12.0"
6980 sources."graceful-fs-4.2.3"
6981 sources."grapheme-breaker-0.3.2"
6982 sources."har-schema-2.0.0"
6983 sources."har-validator-5.1.3"
6984 sources."has-1.0.3"
6985 (sources."has-ansi-2.0.0" // {
6986 dependencies = [
6987 sources."ansi-regex-2.1.1"
6988 ];
6989 })
6990 sources."has-flag-3.0.0"
6991 sources."has-symbols-1.0.1"
6992 sources."has-value-1.0.0"
6993 (sources."has-values-1.0.0" // {
6994 dependencies = [
6995 sources."kind-of-4.0.0"
6996 ];
6997 })
6998 sources."hash-base-3.0.4"
6999 sources."hash.js-1.1.7"
7000 sources."hex-color-regex-1.1.0"
7001 sources."hmac-drbg-1.0.1"
7002 sources."hsl-regex-1.0.0"
7003 sources."hsla-regex-1.0.0"
7004 sources."html-comment-regex-1.1.2"
7005 sources."html-encoding-sniffer-1.0.2"
7006 sources."html-tags-1.2.0"
7007 (sources."htmlnano-0.2.5" // {
7008 dependencies = [
7009 sources."posthtml-0.12.3"
7010 sources."terser-4.6.12"
7011 ];
7012 })
7013 (sources."htmlparser2-3.10.1" // {
7014 dependencies = [
7015 sources."entities-1.1.2"
7016 sources."readable-stream-3.6.0"
7017 ];
7018 })
7019 sources."http-errors-1.7.3"
7020 sources."http-signature-1.2.0"
7021 sources."https-browserify-1.0.0"
7022 sources."iconv-lite-0.4.24"
7023 sources."icss-replace-symbols-1.1.0"
7024 sources."ieee754-1.1.13"
7025 sources."import-fresh-2.0.0"
7026 sources."indexes-of-1.0.1"
7027 sources."inflight-1.0.6"
7028 sources."inherits-2.0.4"
7029 sources."ini-1.3.5"
7030 sources."invariant-2.2.4"
7031 sources."is-absolute-url-2.1.0"
7032 (sources."is-accessor-descriptor-0.1.6" // {
7033 dependencies = [
7034 sources."kind-of-3.2.2"
7035 ];
7036 })
7037 sources."is-arrayish-0.2.1"
7038 sources."is-binary-path-1.0.1"
7039 sources."is-buffer-1.1.6"
7040 sources."is-callable-1.1.5"
7041 sources."is-color-stop-1.1.0"
7042 (sources."is-data-descriptor-0.1.4" // {
7043 dependencies = [
7044 sources."kind-of-3.2.2"
7045 ];
7046 })
7047 sources."is-date-object-1.0.2"
7048 (sources."is-descriptor-0.1.6" // {
7049 dependencies = [
7050 sources."kind-of-5.1.0"
7051 ];
7052 })
7053 sources."is-directory-0.3.1"
7054 sources."is-extendable-0.1.1"
7055 sources."is-extglob-2.1.1"
7056 sources."is-fullwidth-code-point-2.0.0"
7057 sources."is-glob-4.0.1"
7058 sources."is-html-1.1.0"
7059 (sources."is-number-3.0.0" // {
7060 dependencies = [
7061 sources."kind-of-3.2.2"
7062 ];
7063 })
7064 sources."is-obj-2.0.0"
7065 sources."is-plain-object-2.0.4"
7066 sources."is-regex-1.0.5"
7067 sources."is-resolvable-1.1.0"
7068 sources."is-svg-3.0.0"
7069 sources."is-symbol-1.0.3"
7070 sources."is-typedarray-1.0.0"
7071 sources."is-url-1.2.4"
7072 sources."is-windows-1.0.2"
7073 sources."is-wsl-1.1.0"
7074 sources."isarray-1.0.0"
7075 sources."isexe-2.0.0"
7076 sources."isobject-3.0.1"
7077 sources."isstream-0.1.2"
7078 (sources."js-beautify-1.11.0" // {
7079 dependencies = [
7080 sources."mkdirp-1.0.4"
7081 ];
7082 })
7083 sources."js-levenshtein-1.1.6"
7084 sources."js-tokens-4.0.0"
7085 sources."js-yaml-3.13.1"
7086 sources."jsbn-0.1.1"
7087 (sources."jsdom-14.1.0" // {
7088 dependencies = [
7089 sources."acorn-6.4.1"
7090 sources."escodegen-1.14.1"
7091 sources."ws-6.2.1"
7092 ];
7093 })
7094 sources."jsesc-2.5.2"
7095 sources."json-parse-better-errors-1.0.2"
7096 sources."json-schema-0.2.3"
7097 sources."json-schema-traverse-0.4.1"
7098 sources."json-stringify-safe-5.0.1"
7099 sources."json5-1.0.1"
7100 sources."jsprim-1.4.1"
7101 sources."kind-of-6.0.3"
7102 sources."levn-0.3.0"
7103 sources."locate-path-2.0.0"
7104 sources."lodash-4.17.15"
7105 sources."lodash.clone-4.5.0"
7106 sources."lodash.memoize-4.1.2"
7107 sources."lodash.sortby-4.7.0"
7108 sources."lodash.uniq-4.5.0"
7109 sources."log-symbols-2.2.0"
7110 sources."loose-envify-1.4.0"
7111 sources."lru-cache-4.1.5"
7112 sources."magic-string-0.22.5"
7113 sources."map-cache-0.2.2"
7114 sources."map-visit-1.0.0"
7115 sources."md5.js-1.3.5"
7116 sources."mdn-data-2.0.4"
7117 (sources."merge-source-map-1.0.4" // {
7118 dependencies = [
7119 sources."source-map-0.5.7"
7120 ];
7121 })
7122 sources."merge2-1.3.0"
7123 sources."micromatch-3.1.10"
7124 sources."miller-rabin-4.0.1"
7125 sources."mime-1.6.0"
7126 sources."mime-db-1.44.0"
7127 sources."mime-types-2.1.27"
7128 sources."mimic-fn-1.2.0"
7129 sources."minimalistic-assert-1.0.1"
7130 sources."minimalistic-crypto-utils-1.0.1"
7131 sources."minimatch-3.0.4"
7132 sources."minimist-1.2.5"
7133 (sources."mixin-deep-1.3.2" // {
7134 dependencies = [
7135 sources."is-extendable-1.0.1"
7136 ];
7137 })
7138 sources."mkdirp-0.5.5"
7139 sources."ms-2.1.2"
7140 sources."nan-2.14.1"
7141 sources."nanomatch-1.2.13"
7142 sources."nice-try-1.0.5"
7143 sources."node-addon-api-1.7.1"
7144 sources."node-elm-compiler-5.0.4"
7145 sources."node-forge-0.7.6"
7146 (sources."node-libs-browser-2.2.1" // {
7147 dependencies = [
7148 sources."punycode-1.4.1"
7149 ];
7150 })
7151 sources."node-releases-1.1.53"
7152 sources."nopt-4.0.3"
7153 sources."normalize-html-whitespace-1.0.0"
7154 sources."normalize-path-3.0.0"
7155 sources."normalize-url-3.3.0"
7156 sources."nth-check-1.0.2"
7157 sources."nwsapi-2.2.0"
7158 sources."oauth-sign-0.9.0"
7159 sources."object-assign-4.1.1"
7160 (sources."object-copy-0.1.0" // {
7161 dependencies = [
7162 sources."define-property-0.2.5"
7163 sources."kind-of-3.2.2"
7164 ];
7165 })
7166 sources."object-inspect-1.7.0"
7167 sources."object-keys-1.1.1"
7168 sources."object-visit-1.0.1"
7169 sources."object.assign-4.1.0"
7170 sources."object.getownpropertydescriptors-2.1.0"
7171 sources."object.pick-1.3.0"
7172 sources."object.values-1.1.1"
7173 sources."on-finished-2.3.0"
7174 sources."once-1.4.0"
7175 sources."onetime-2.0.1"
7176 sources."opn-5.5.0"
7177 sources."optionator-0.8.3"
7178 sources."ora-2.1.0"
7179 sources."os-browserify-0.3.0"
7180 sources."os-homedir-1.0.2"
7181 sources."os-tmpdir-1.0.2"
7182 sources."osenv-0.1.5"
7183 sources."p-limit-1.3.0"
7184 sources."p-locate-2.0.0"
7185 sources."p-try-1.0.0"
7186 sources."pako-0.2.9"
7187 (sources."parcel-bundler-1.12.3" // {
7188 dependencies = [
7189 sources."postcss-value-parser-3.3.1"
7190 ];
7191 })
7192 sources."parse-asn1-5.1.5"
7193 sources."parse-json-4.0.0"
7194 sources."parse5-5.1.0"
7195 sources."parseurl-1.3.3"
7196 sources."pascalcase-0.1.1"
7197 sources."path-browserify-0.0.1"
7198 sources."path-dirname-1.0.2"
7199 sources."path-exists-3.0.0"
7200 sources."path-is-absolute-1.0.1"
7201 sources."path-key-2.0.1"
7202 sources."path-parse-1.0.6"
7203 sources."pbkdf2-3.0.17"
7204 sources."performance-now-2.1.0"
7205 sources."physical-cpu-count-2.0.0"
7206 sources."pkg-up-2.0.0"
7207 sources."pn-1.1.0"
7208 sources."posix-character-classes-0.1.1"
7209 sources."postcss-7.0.27"
7210 sources."postcss-calc-7.0.2"
7211 (sources."postcss-colormin-4.0.3" // {
7212 dependencies = [
7213 sources."postcss-value-parser-3.3.1"
7214 ];
7215 })
7216 (sources."postcss-convert-values-4.0.1" // {
7217 dependencies = [
7218 sources."postcss-value-parser-3.3.1"
7219 ];
7220 })
7221 sources."postcss-discard-comments-4.0.2"
7222 sources."postcss-discard-duplicates-4.0.2"
7223 sources."postcss-discard-empty-4.0.1"
7224 sources."postcss-discard-overridden-4.0.1"
7225 (sources."postcss-merge-longhand-4.0.11" // {
7226 dependencies = [
7227 sources."postcss-value-parser-3.3.1"
7228 ];
7229 })
7230 (sources."postcss-merge-rules-4.0.3" // {
7231 dependencies = [
7232 sources."postcss-selector-parser-3.1.2"
7233 ];
7234 })
7235 (sources."postcss-minify-font-values-4.0.2" // {
7236 dependencies = [
7237 sources."postcss-value-parser-3.3.1"
7238 ];
7239 })
7240 (sources."postcss-minify-gradients-4.0.2" // {
7241 dependencies = [
7242 sources."postcss-value-parser-3.3.1"
7243 ];
7244 })
7245 (sources."postcss-minify-params-4.0.2" // {
7246 dependencies = [
7247 sources."postcss-value-parser-3.3.1"
7248 ];
7249 })
7250 (sources."postcss-minify-selectors-4.0.2" // {
7251 dependencies = [
7252 sources."postcss-selector-parser-3.1.2"
7253 ];
7254 })
7255 (sources."postcss-modules-extract-imports-1.1.0" // {
7256 dependencies = [
7257 sources."postcss-6.0.23"
7258 sources."supports-color-5.5.0"
7259 ];
7260 })
7261 (sources."postcss-modules-local-by-default-1.2.0" // {
7262 dependencies = [
7263 sources."postcss-6.0.23"
7264 sources."supports-color-5.5.0"
7265 ];
7266 })
7267 (sources."postcss-modules-scope-1.1.0" // {
7268 dependencies = [
7269 sources."postcss-6.0.23"
7270 sources."supports-color-5.5.0"
7271 ];
7272 })
7273 (sources."postcss-modules-values-1.3.0" // {
7274 dependencies = [
7275 sources."postcss-6.0.23"
7276 sources."supports-color-5.5.0"
7277 ];
7278 })
7279 sources."postcss-normalize-charset-4.0.1"
7280 (sources."postcss-normalize-display-values-4.0.2" // {
7281 dependencies = [
7282 sources."postcss-value-parser-3.3.1"
7283 ];
7284 })
7285 (sources."postcss-normalize-positions-4.0.2" // {
7286 dependencies = [
7287 sources."postcss-value-parser-3.3.1"
7288 ];
7289 })
7290 (sources."postcss-normalize-repeat-style-4.0.2" // {
7291 dependencies = [
7292 sources."postcss-value-parser-3.3.1"
7293 ];
7294 })
7295 (sources."postcss-normalize-string-4.0.2" // {
7296 dependencies = [
7297 sources."postcss-value-parser-3.3.1"
7298 ];
7299 })
7300 (sources."postcss-normalize-timing-functions-4.0.2" // {
7301 dependencies = [
7302 sources."postcss-value-parser-3.3.1"
7303 ];
7304 })
7305 (sources."postcss-normalize-unicode-4.0.1" // {
7306 dependencies = [
7307 sources."postcss-value-parser-3.3.1"
7308 ];
7309 })
7310 (sources."postcss-normalize-url-4.0.1" // {
7311 dependencies = [
7312 sources."postcss-value-parser-3.3.1"
7313 ];
7314 })
7315 (sources."postcss-normalize-whitespace-4.0.2" // {
7316 dependencies = [
7317 sources."postcss-value-parser-3.3.1"
7318 ];
7319 })
7320 (sources."postcss-ordered-values-4.1.2" // {
7321 dependencies = [
7322 sources."postcss-value-parser-3.3.1"
7323 ];
7324 })
7325 sources."postcss-reduce-initial-4.0.3"
7326 (sources."postcss-reduce-transforms-4.0.2" // {
7327 dependencies = [
7328 sources."postcss-value-parser-3.3.1"
7329 ];
7330 })
7331 sources."postcss-selector-parser-6.0.2"
7332 (sources."postcss-svgo-4.0.2" // {
7333 dependencies = [
7334 sources."postcss-value-parser-3.3.1"
7335 ];
7336 })
7337 sources."postcss-unique-selectors-4.0.1"
7338 sources."postcss-value-parser-4.0.3"
7339 sources."posthtml-0.11.6"
7340 sources."posthtml-parser-0.4.2"
7341 sources."posthtml-render-1.2.2"
7342 sources."prelude-ls-1.1.2"
7343 sources."private-0.1.8"
7344 sources."process-0.11.10"
7345 sources."process-nextick-args-2.0.1"
7346 sources."proto-list-1.2.4"
7347 sources."pseudomap-1.0.2"
7348 sources."psl-1.8.0"
7349 sources."public-encrypt-4.0.3"
7350 sources."punycode-2.1.1"
7351 sources."purgecss-1.4.2"
7352 sources."q-1.5.1"
7353 sources."qs-6.5.2"
7354 sources."querystring-0.2.0"
7355 sources."querystring-es3-0.2.1"
7356 sources."quote-stream-1.0.2"
7357 sources."randombytes-2.1.0"
7358 sources."randomfill-1.0.4"
7359 sources."range-parser-1.2.1"
7360 sources."readable-stream-2.3.7"
7361 sources."readdirp-2.2.1"
7362 sources."regenerate-1.4.0"
7363 sources."regenerate-unicode-properties-8.2.0"
7364 sources."regenerator-runtime-0.13.5"
7365 (sources."regenerator-transform-0.14.4" // {
7366 dependencies = [
7367 sources."@babel/runtime-7.9.2"
7368 ];
7369 })
7370 sources."regex-not-1.0.2"
7371 sources."regexpu-core-4.7.0"
7372 sources."regjsgen-0.5.1"
7373 (sources."regjsparser-0.6.4" // {
7374 dependencies = [
7375 sources."jsesc-0.5.0"
7376 ];
7377 })
7378 sources."remove-trailing-separator-1.1.0"
7379 sources."repeat-element-1.1.3"
7380 sources."repeat-string-1.6.1"
7381 sources."request-2.88.2"
7382 sources."request-promise-core-1.1.3"
7383 sources."request-promise-native-1.0.8"
7384 sources."require-directory-2.1.1"
7385 sources."require-main-filename-2.0.0"
7386 sources."resolve-1.17.0"
7387 sources."resolve-from-3.0.0"
7388 sources."resolve-url-0.2.1"
7389 sources."restore-cursor-2.0.0"
7390 sources."ret-0.1.15"
7391 sources."rgb-regex-1.0.1"
7392 sources."rgba-regex-1.0.0"
7393 sources."rimraf-2.6.3"
7394 sources."ripemd160-2.0.2"
7395 sources."safe-buffer-5.1.2"
7396 sources."safe-regex-1.1.0"
7397 sources."safer-buffer-2.1.2"
7398 sources."safer-eval-1.3.6"
7399 sources."sax-1.2.4"
7400 sources."saxes-3.1.11"
7401 sources."semver-5.7.1"
7402 (sources."send-0.17.1" // {
7403 dependencies = [
7404 (sources."debug-2.6.9" // {
7405 dependencies = [
7406 sources."ms-2.0.0"
7407 ];
7408 })
7409 sources."ms-2.1.1"
7410 ];
7411 })
7412 sources."serialize-to-js-1.2.2"
7413 sources."serve-static-1.14.1"
7414 sources."set-blocking-2.0.0"
7415 (sources."set-value-2.0.1" // {
7416 dependencies = [
7417 sources."extend-shallow-2.0.1"
7418 ];
7419 })
7420 sources."setimmediate-1.0.5"
7421 sources."setprototypeof-1.1.1"
7422 sources."sha.js-2.4.11"
7423 sources."shallow-copy-0.0.1"
7424 sources."shebang-command-1.2.0"
7425 sources."shebang-regex-1.0.0"
7426 sources."sigmund-1.0.1"
7427 sources."signal-exit-3.0.3"
7428 (sources."simple-swizzle-0.2.2" // {
7429 dependencies = [
7430 sources."is-arrayish-0.3.2"
7431 ];
7432 })
7433 (sources."snapdragon-0.8.2" // {
7434 dependencies = [
7435 sources."debug-2.6.9"
7436 sources."define-property-0.2.5"
7437 sources."extend-shallow-2.0.1"
7438 sources."ms-2.0.0"
7439 sources."source-map-0.5.7"
7440 ];
7441 })
7442 (sources."snapdragon-node-2.1.1" // {
7443 dependencies = [
7444 sources."define-property-1.0.0"
7445 sources."is-accessor-descriptor-1.0.0"
7446 sources."is-data-descriptor-1.0.0"
7447 sources."is-descriptor-1.0.2"
7448 ];
7449 })
7450 (sources."snapdragon-util-3.0.1" // {
7451 dependencies = [
7452 sources."kind-of-3.2.2"
7453 ];
7454 })
7455 sources."source-map-0.6.1"
7456 sources."source-map-resolve-0.5.3"
7457 sources."source-map-support-0.5.19"
7458 sources."source-map-url-0.4.0"
7459 sources."split-string-3.1.0"
7460 sources."sprintf-js-1.0.3"
7461 sources."sshpk-1.16.1"
7462 sources."stable-0.1.8"
7463 (sources."static-eval-2.0.5" // {
7464 dependencies = [
7465 sources."escodegen-1.14.1"
7466 ];
7467 })
7468 (sources."static-extend-0.1.2" // {
7469 dependencies = [
7470 sources."define-property-0.2.5"
7471 ];
7472 })
7473 (sources."static-module-2.2.5" // {
7474 dependencies = [
7475 sources."object-inspect-1.4.1"
7476 ];
7477 })
7478 sources."statuses-1.5.0"
7479 sources."stealthy-require-1.1.1"
7480 sources."stream-browserify-2.0.2"
7481 sources."stream-http-2.8.3"
7482 (sources."string-width-3.1.0" // {
7483 dependencies = [
7484 sources."ansi-regex-4.1.0"
7485 sources."strip-ansi-5.2.0"
7486 ];
7487 })
7488 sources."string.prototype.trimend-1.0.1"
7489 sources."string.prototype.trimleft-2.1.2"
7490 sources."string.prototype.trimright-2.1.2"
7491 sources."string.prototype.trimstart-1.0.1"
7492 sources."string_decoder-1.1.1"
7493 sources."strip-ansi-4.0.0"
7494 (sources."stylehacks-4.0.3" // {
7495 dependencies = [
7496 sources."postcss-selector-parser-3.1.2"
7497 ];
7498 })
7499 sources."supports-color-6.1.0"
7500 sources."svgo-1.3.2"
7501 sources."symbol-tree-3.2.4"
7502 sources."temp-0.9.0"
7503 sources."terser-3.17.0"
7504 sources."through2-2.0.5"
7505 sources."timers-browserify-2.0.11"
7506 sources."timsort-0.3.0"
7507 sources."tiny-inflate-1.0.3"
7508 sources."to-arraybuffer-1.0.1"
7509 sources."to-fast-properties-2.0.0"
7510 (sources."to-object-path-0.3.0" // {
7511 dependencies = [
7512 sources."kind-of-3.2.2"
7513 ];
7514 })
7515 sources."to-regex-3.0.2"
7516 sources."to-regex-range-2.1.1"
7517 sources."toidentifier-1.0.0"
7518 sources."tough-cookie-2.5.0"
7519 sources."tr46-1.0.1"
7520 sources."trim-right-1.0.1"
7521 sources."tty-browserify-0.0.0"
7522 sources."tunnel-agent-0.6.0"
7523 sources."tweetnacl-0.14.5"
7524 sources."type-check-0.3.2"
7525 sources."typedarray-0.0.6"
7526 (sources."uncss-0.17.3" // {
7527 dependencies = [
7528 sources."is-absolute-url-3.0.3"
7529 ];
7530 })
7531 sources."unicode-canonical-property-names-ecmascript-1.0.4"
7532 sources."unicode-match-property-ecmascript-1.0.4"
7533 sources."unicode-match-property-value-ecmascript-1.2.0"
7534 sources."unicode-property-aliases-ecmascript-1.1.0"
7535 sources."unicode-trie-0.3.1"
7536 sources."union-value-1.0.1"
7537 sources."uniq-1.0.1"
7538 sources."uniqs-2.0.0"
7539 sources."unquote-1.1.1"
7540 (sources."unset-value-1.0.0" // {
7541 dependencies = [
7542 (sources."has-value-0.3.1" // {
7543 dependencies = [
7544 sources."isobject-2.1.0"
7545 ];
7546 })
7547 sources."has-values-0.1.4"
7548 ];
7549 })
7550 sources."upath-1.2.0"
7551 sources."uri-js-4.2.2"
7552 sources."urix-0.1.0"
7553 (sources."url-0.11.0" // {
7554 dependencies = [
7555 sources."punycode-1.3.2"
7556 ];
7557 })
7558 sources."use-3.1.1"
7559 (sources."util-0.11.1" // {
7560 dependencies = [
7561 sources."inherits-2.0.3"
7562 ];
7563 })
7564 sources."util-deprecate-1.0.2"
7565 sources."util.promisify-1.0.1"
7566 sources."uuid-3.4.0"
7567 sources."v8-compile-cache-2.1.0"
7568 sources."vendors-1.0.4"
7569 sources."verror-1.10.0"
7570 sources."vlq-0.2.3"
7571 sources."vm-browserify-1.1.2"
7572 sources."w3c-hr-time-1.0.2"
7573 sources."w3c-xmlserializer-1.1.2"
7574 sources."wcwidth-1.0.1"
7575 sources."webidl-conversions-4.0.2"
7576 sources."whatwg-encoding-1.0.5"
7577 sources."whatwg-mimetype-2.3.0"
7578 sources."whatwg-url-7.1.0"
7579 sources."which-1.3.1"
7580 sources."which-module-2.0.0"
7581 sources."word-wrap-1.2.3"
7582 (sources."wrap-ansi-5.1.0" // {
7583 dependencies = [
7584 sources."ansi-regex-4.1.0"
7585 sources."strip-ansi-5.2.0"
7586 ];
7587 })
7588 sources."wrappy-1.0.2"
7589 sources."ws-5.2.2"
7590 sources."xml-name-validator-3.0.0"
7591 sources."xmlchars-2.2.0"
7592 sources."xtend-4.0.2"
7593 sources."y18n-4.0.0"
7594 sources."yallist-2.1.2"
7595 (sources."yargs-14.2.3" // {
7596 dependencies = [
7597 sources."find-up-3.0.0"
7598 sources."locate-path-3.0.0"
7599 sources."p-limit-2.3.0"
7600 sources."p-locate-3.0.0"
7601 sources."p-try-2.2.0"
7602 ];
7603 })
7604 sources."yargs-parser-15.0.1"
7605 ];
7606 buildInputs = globalBuildInputs;
7607 meta = {
7608 license = "MIT";
7609 };
7610 production = false;
7611 bypassCache = true;
7612 reconstructLock = false;
7613 };
7614in
7615{
7616 args = args;
7617 sources = sources;
7618 tarball = nodeEnv.buildNodeSourceDist args;
7619 package = nodeEnv.buildNodePackage args;
7620 shell = nodeEnv.buildNodeShell args;
7621}
diff --git a/modules/private/websites/tools/games/terraforming-mars/default.nix b/modules/private/websites/tools/games/terraforming-mars/default.nix
deleted file mode 100644
index 0df5363..0000000
--- a/modules/private/websites/tools/games/terraforming-mars/default.nix
+++ /dev/null
@@ -1,48 +0,0 @@
1{ config, lib, pkgs, ... }:
2let
3 cfg = config.myServices.websites.games.terraforming-mars;
4 terraforming-mars = pkgs.callPackage ./terraforming-mars.nix {};
5in
6{
7 options.myServices.websites.games.terraforming-mars.enable = lib.mkEnableOption "Enable Terraforming mars game";
8 config = lib.mkIf cfg.enable {
9 systemd.services.terraforming-mars = {
10 path = [ pkgs.nodejs pkgs.bashInteractive ];
11 description = "Terraforming mars game";
12 wantedBy = [ "multi-user.target" ];
13 script = ''
14 export PORT=/run/terraforming-mars/socket.sock
15 export NODE_ENV=production
16 mkdir -p /var/lib/terraforming-mars/db
17 npm run start
18 '';
19 postStart = ''
20 sleep 5;
21 chown :wwwrun /run/terraforming-mars/socket.sock
22 chmod g+w /run/terraforming-mars/socket.sock
23 '';
24 serviceConfig = {
25 User = "terraformingmars";
26 DynamicUser = true;
27 SupplementaryGroups = [ "wwwrun" ];
28 Type = "simple";
29 WorkingDirectory = terraforming-mars;
30 RuntimeDirectory = "terraforming-mars";
31 StateDirectory = "terraforming-mars";
32 };
33 };
34
35 services.websites.env.tools.vhostConfs.games_terraforming-mars = {
36 certName = "games";
37 certMainHost = "games.immae.eu";
38 hosts = [ "terraforming-mars.games.immae.eu" ];
39 root = null;
40 extraConfig = [
41 ''
42 ProxyPass / unix:///run/terraforming-mars/socket.sock|http://terraforming-mars.games.immae.eu/
43 ProxyPassReverse / unix:///run/terraforming-mars/socket.sock|http://terraforming-mars.games.immae.eu/
44 ''
45 ];
46 };
47 };
48}
diff --git a/modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix b/modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix
deleted file mode 100644
index 502a553..0000000
--- a/modules/private/websites/tools/games/terraforming-mars/terraforming-mars.nix
+++ /dev/null
@@ -1,36 +0,0 @@
1{ fetchgit, runCommand, callPackage, mylibs, nodePackages, nodejs, git }:
2let
3 source = fetchgit {
4 url = "https://github.com/bafolts/terraforming-mars";
5 rev = "25b3f80e276cc0c1fc283a78b6ae94b13c545ab6";
6 sha256 = "03xcwvxv2mlmswngklzqp3lf30hgkvdilqq7p1z4h8xmy50cy12k";
7 leaveDotGit = true;
8 fetchSubmodules = true;
9 };
10 patchedSource = runCommand "patch-source" {} ''
11 cp -r ${source} $out
12 chmod -R u+w $out
13 sed -i -e 's/"lockfileVersion": 2,/"lockfileVersion": 1,/' $out/package-lock.json
14 '';
15 packages = callPackage ./node-packages.nix {
16 src = patchedSource;
17 nodeEnv = callPackage mylibs.nodeEnv {};
18 globalBuildInputs = [ nodePackages.node-pre-gyp ];
19 };
20 terraforming-mars = runCommand "terraforming-mars" {
21 buildInputs = [ nodejs git ];
22 } ''
23 cp -r ${source} ./source
24 chmod -R u+w source
25 cd source
26 ln -s ${packages.package}/lib/node_modules/terraforming-mars/node_modules .
27 npm run build
28 mkdir $out
29 cp -a build $out/
30 cp -a assets $out/
31 cp package.json $out/
32 ln -s ${packages.package}/lib/node_modules/terraforming-mars/node_modules $out
33 ln -s /var/lib/terraforming-mars/db $out/db
34 '';
35in
36 terraforming-mars
diff --git a/modules/private/websites/tools/git/default.nix b/modules/private/websites/tools/git/default.nix
deleted file mode 100644
index 8f611ee..0000000
--- a/modules/private/websites/tools/git/default.nix
+++ /dev/null
@@ -1,49 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 mantisbt = pkgs.callPackage ./mantisbt.nix {
4 inherit (pkgs.webapps) mantisbt_2 mantisbt_2-plugins;
5 env = config.myEnv.tools.mantisbt;
6 inherit config;
7 };
8 gitweb = pkgs.callPackage ./gitweb.nix {
9 gitoliteDir = config.myServices.gitolite.gitoliteDir;
10 };
11
12 cfg = config.myServices.websites.tools.git;
13in {
14 options.myServices.websites.tools.git = {
15 enable = lib.mkEnableOption "enable git's website";
16 };
17
18 config = lib.mkIf cfg.enable {
19 secrets.keys = mantisbt.keys;
20 services.websites.env.tools.modules =
21 gitweb.apache.modules ++
22 mantisbt.apache.modules;
23
24 system.activationScripts.mantisbt = mantisbt.activationScript;
25 services.websites.env.tools.vhostConfs.git = {
26 certName = "eldiron";
27 addToCerts = true;
28 hosts = ["git.immae.eu" ];
29 root = gitweb.apache.root;
30 extraConfig = [
31 gitweb.apache.vhostConf
32 (mantisbt.apache.vhostConf config.services.phpfpm.pools.mantisbt.socket)
33 ''
34 RewriteEngine on
35 RewriteCond %{REQUEST_URI} ^/releases
36 RewriteRule /releases(.*) https://release.immae.eu$1 [P,L]
37 ''
38 ];
39 };
40 services.phpfpm.pools = {
41 mantisbt = {
42 user = config.services.httpd.Tools.user;
43 group = config.services.httpd.Tools.group;
44 settings = mantisbt.phpFpm.pool;
45 phpPackage = pkgs.php72;
46 };
47 };
48 };
49}
diff --git a/modules/private/websites/tools/git/gitweb.nix b/modules/private/websites/tools/git/gitweb.nix
deleted file mode 100644
index ff34da5..0000000
--- a/modules/private/websites/tools/git/gitweb.nix
+++ /dev/null
@@ -1,119 +0,0 @@
1{ gitweb, writeText, stdenv, coreutils, writeScript, gitolite, git, cgit, gitoliteDir, mailcap, highlight }:
2rec {
3 varDir = gitoliteDir;
4 config = writeText "gitweb.conf" ''
5 $git_temp = "/tmp";
6
7 # The directories where your projects are. Must not end with a
8 # slash.
9 $projectroot = "${varDir}/repositories";
10
11 $projects_list = "${varDir}/projects.list";
12 $strict_export = "true";
13
14 # Base URLs for links displayed in the web interface.
15 our @git_base_url_list = qw(ssh://gitolite@git.immae.eu https://git.immae.eu);
16
17 $feature{'blame'}{'default'} = [1];
18 $feature{'avatar'}{'default'} = ['gravatar'];
19 $feature{'highlight'}{'default'} = [1];
20
21 @stylesheets = ("gitweb-theme/gitweb.css");
22 $logo = "gitweb-theme/git-logo.png";
23 $favicon = "gitweb-theme/git-favicon.png";
24 $javascript = "gitweb-theme/gitweb.js";
25 $logo_url = "https://git.immae.eu/";
26 $projects_list_group_categories = "true";
27 $projects_list_description_width = 60;
28 $project_list_default_category = "__Others__";
29 $highlight_bin = "${highlight}/bin/highlight";
30 '';
31 aboutFilter = writeScript "about-filter.sh" ''
32 #!${stdenv.shell}
33
34 if [ -f "$CGIT_REPO_PATH/README.html" ]; then
35 cat "$CGIT_REPO_PATH/README.html"
36 else
37 ${cgit}/lib/cgit/filters/about-formatting.sh "$@"
38 fi
39 '';
40 cgitConfig = writeText "cgitrc" ''
41 css=/cgit-css/cgit.css
42 logo=/cgit-css/cgit.png
43 favicon=/cgit-css/favicon.ico
44
45 root-title=Immae’s git
46 root-desc=To go back to the old interface: https://git.immae.eu/?old
47 readme=:README.md
48 readme=:readme.md
49 readme=:README
50 readme=:DOCUMENTATION.md
51 about-filter=${aboutFilter}
52 #${cgit}/lib/cgit/filters/about-formatting.sh
53 source-filter=${cgit}/lib/cgit/filters/syntax-highlighting.py
54
55 enable-blame=1
56 enable-index-links=1
57 enable-commit-graph=1
58 enable-log-filecount=1
59 enable-log-linecount=1
60
61 enable-html-serving=1
62 # Allow using gitweb.* keys
63 enable-git-config=1
64
65 side-by-side-diffs=1
66 snapshots=tar.gz tar.zst zip
67 mimetype-file=${mailcap}/etc/mime.types
68
69 section=__Others__
70 clone-url=ssh://gitolite@git.immae.eu/$CGIT_REPO_URL https://git.immae.eu/$CGIT_REPO_URL
71 #section-from-path=1
72 project-list=${varDir}/projects.list
73 scan-path=${varDir}/repositories
74 '';
75 apache = rec {
76 user = "wwwrun";
77 group = "wwwrun";
78 modules = [ "cgid" ];
79 root = gitweb;
80 vhostConf = ''
81 SetEnv GIT_PROJECT_ROOT ${varDir}/repositories/
82 ScriptAliasMatch \
83 "(?x)^/(.*/(HEAD | \
84 info/refs | \
85 objects/(info/[^/]+ | \
86 [0-9a-f]{2}/[0-9a-f]{38} | \
87 pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
88 git-(upload|receive)-pack))$" \
89 ${git}/libexec/git-core/git-http-backend/$1
90
91 <Directory "${git}/libexec/git-core">
92 Require all granted
93 </Directory>
94 <Directory "${root}">
95 DirectoryIndex gitweb.cgi
96 Require all granted
97 AllowOverride None
98 Options ExecCGI FollowSymLinks
99 <Files gitweb.cgi>
100 SetHandler cgi-script
101 SetEnv GITWEB_CONFIG "${config}"
102 </Files>
103 </Directory>
104
105 SetEnv CGIT_CONFIG ${cgitConfig}
106 ScriptAlias /cgit "${cgit}/cgit/cgit.cgi/"
107 Alias /cgit-css "${cgit}/cgit"
108 <Directory "${cgit}/cgit/">
109 AllowOverride None
110 Options ExecCGI FollowSymlinks
111 Require all granted
112 </Directory>
113
114 RewriteEngine On
115 RewriteCond %{QUERY_STRING} ^$
116 RewriteRule ^/?$ /cgit [L,R=302]
117 '';
118 };
119}
diff --git a/modules/private/websites/tools/git/mantisbt.nix b/modules/private/websites/tools/git/mantisbt.nix
deleted file mode 100644
index 2ef76af..0000000
--- a/modules/private/websites/tools/git/mantisbt.nix
+++ /dev/null
@@ -1,91 +0,0 @@
1{ env, mantisbt_2, mantisbt_2-plugins, config }:
2rec {
3 activationScript = {
4 deps = [ "httpd" ];
5 text = ''
6 install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/mantisbt
7 '';
8 };
9 keys."webapps/tools-mantisbt" = {
10 user = apache.user;
11 group = apache.group;
12 permissions = "0400";
13 text = ''
14 <?php
15 $g_hostname = '${env.postgresql.socket}';
16 $g_db_username = '${env.postgresql.user}';
17 $g_db_password = '${env.postgresql.password}';
18 $g_database_name = '${env.postgresql.database}';
19 $g_db_type = 'pgsql';
20 $g_crypto_master_salt = '${env.master_salt}';
21 $g_allow_signup = OFF;
22 $g_allow_anonymous_login = ON;
23 $g_anonymous_account = 'anonymous';
24
25 $g_phpMailer_method = PHPMAILER_METHOD_SENDMAIL;
26 $g_smtp_host = 'localhost';
27 $g_smtp_username = ''';
28 $g_smtp_password = ''';
29 $g_webmaster_email = 'mantisbt@tools.immae.eu';
30 $g_from_email = 'mantisbt@tools.immae.eu';
31 $g_return_path_email = 'mantisbt@tools.immae.eu';
32 $g_from_name = 'Mantis Bug Tracker at git.immae.eu';
33 $g_email_receive_own = ON;
34 # --- LDAP ---
35 $g_login_method = LDAP;
36 $g_ldap_protocol_version = 3;
37 $g_ldap_server = 'ldaps://${env.ldap.host}:636';
38 $g_ldap_root_dn = 'ou=users,${env.ldap.base}';
39 $g_ldap_bind_dn = '${env.ldap.dn}';
40 $g_ldap_bind_passwd = '${env.ldap.password}';
41 $g_use_ldap_email = ON;
42 $g_use_ldap_realname = ON;
43 $g_ldap_uid_field = 'uid';
44 $g_ldap_realname_field = 'cn';
45 $g_ldap_organization = '${env.ldap.filter}';
46 '';
47 };
48 webRoot = (mantisbt_2.override { mantis_config = config.secrets.fullPaths."webapps/tools-mantisbt"; }).withPlugins (p: [p.slack p.source-integration]);
49 apache = rec {
50 user = "wwwrun";
51 group = "wwwrun";
52 modules = [ "proxy_fcgi" ];
53 root = webRoot;
54 vhostConf = socket: ''
55 Alias /mantisbt "${root}"
56 <Directory "${root}">
57 DirectoryIndex index.php
58 <FilesMatch "\.php$">
59 SetHandler "proxy:unix:${socket}|fcgi://localhost"
60 </FilesMatch>
61
62 AllowOverride All
63 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
64 Options FollowSymlinks
65 Require all granted
66 </Directory>
67 <Directory "${root}/admin">
68 #Reenable during upgrade
69 Require all denied
70 </Directory>
71 '';
72 };
73 phpFpm = rec {
74 serviceDeps = [ "postgresql.service" "openldap.service" ];
75 basedir = builtins.concatStringsSep ":" (
76 [ webRoot config.secrets.fullPaths."webapps/tools-mantisbt" ]
77 ++ webRoot.plugins);
78 pool = {
79 "listen.owner" = apache.user;
80 "listen.group" = apache.group;
81 "pm" = "ondemand";
82 "pm.max_children" = "60";
83 "pm.process_idle_timeout" = "60";
84
85 "php_admin_value[upload_max_filesize]" = "5000000";
86
87 "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/mantisbt";
88 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/mantisbt";
89 };
90 };
91}
diff --git a/modules/private/websites/tools/im/default.nix b/modules/private/websites/tools/im/default.nix
deleted file mode 100644
index 94dc4f8..0000000
--- a/modules/private/websites/tools/im/default.nix
+++ /dev/null
@@ -1,42 +0,0 @@
1{ config, lib, pkgs, ... }:
2let
3 cfg = config.myServices.websites.tools.im;
4in
5{
6 options.myServices.websites.tools.im = {
7 enable = lib.mkEnableOption "enable im website";
8 };
9
10 config = lib.mkIf cfg.enable {
11 services.websites.env.tools.vhostConfs.im = {
12 certName = "eldiron";
13 addToCerts = true;
14 hosts = ["im.immae.fr"];
15 root = ./www;
16 extraConfig = [
17 ''
18 Alias /glowing-bear ${pkgs.glowing-bear}
19 Alias /converse ${./www}/converse.html
20 ProxyPreserveHost On
21 <Location "/bosh">
22 ProxyPass http://localhost:5280/bosh
23 ProxyPassReverse http://localhost:5280/bosh
24 </Location>
25 <Location "/ws">
26 ProxyPass ws://localhost:5280/ws
27 </Location>
28 ProxyPass /upload http://localhost:5280/upload
29 ProxyPassReverse /upload http://localhost:5280/upload
30 ProxyPass /admin http://localhost:5280/admin
31 ProxyPassReverse /admin http://localhost:5280/admin
32 ProxyPass /api http://localhost:5280/api
33 ProxyPassReverse /api http://localhost:5280/api
34 <Directory ${pkgs.glowing-bear}>
35 AllowOverride none
36 Require all granted
37 </Directory>
38 ''
39 ];
40 };
41 };
42}
diff --git a/modules/private/websites/tools/im/www/converse.html b/modules/private/websites/tools/im/www/converse.html
deleted file mode 100644
index 936dde4..0000000
--- a/modules/private/websites/tools/im/www/converse.html
+++ /dev/null
@@ -1,57 +0,0 @@
1<!DOCTYPE html>
2<html lang="en">
3 <head>
4 <title>Converse</title>
5 <meta charset="utf-8">
6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8 <meta name="description" content="Converse: An XMPP chat client which can be integrated into any website" />
9 <meta name="keywords" content="xmpp chat webchat converse.js Converse" />
10
11 <link type="text/css" rel="stylesheet" media="screen" href="https://assets.immae.eu/converse/5.0.4/converse.min.css" />
12 <style type="text/css">
13 #conversejs div.chat-msg__text pre {
14 background-color: #eee;
15 padding: 10px;
16 }
17 </style>
18 <script src="https://assets.immae.eu/converse/5.0.4/libsignal-protocol.min.js"></script>
19 <script src="https://assets.immae.eu/converse/5.0.4/converse.min.js"></script>
20 <script src="https://assets.immae.eu/marked/1.2.6/marked.min.js"></script>
21 <script src="https://assets.immae.eu/markdown-it/10.0.0/markdown-it.min.js"></script>
22 <script>
23 var md = window.markdownit({
24 html: true,
25 });
26 converse.plugins.add('markdown', {
27 //initialize () {
28 // const { _converse } = this;
29 // _converse.api.listen.on('afterMessageBodyTransformed', (view, text) => {
30 // let newtext = text.replace(/<br\/>/g, '\n').replace(/```/g, "\n```\n");
31 // newtext = md.render(newtext).replace(/^<p>/, "").replace(/<\/p>\s*$/, "");
32 // view.model.save({'message': newtext}, {'silent': true });
33 // });
34 //}
35 overrides: {
36 MessageView: {
37 transformBodyText: async function(text) {
38 let newtext = await this.__super__.transformBodyText.apply(this, arguments);
39 newtext = newtext.replace(/<br\/>/g, '\n').replace(/```/g, "\n```\n");
40 return md.render(newtext).replace(/^<p>/, "").replace(/<\/p>\s*$/, "");
41 }
42 }
43 }
44 });
45 converse.initialize({
46 //bosh_service_url: 'https://im.immae.fr/bosh',
47 websocket_url: 'wss://im.immae.fr/ws',
48 view_mode: 'fullscreen',
49 show_controlbox_by_default: true,
50 whitelisted_plugins: ['markdown'],
51 });
52 </script>
53 </head>
54 <body>
55 </body>
56</html>
57
diff --git a/modules/private/websites/tools/mail/default.nix b/modules/private/websites/tools/mail/default.nix
deleted file mode 100644
index 390f7ad..0000000
--- a/modules/private/websites/tools/mail/default.nix
+++ /dev/null
@@ -1,79 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 roundcubemail = pkgs.callPackage ./roundcubemail.nix {
4 inherit (pkgs.webapps) roundcubemail;
5 env = config.myEnv.tools.roundcubemail;
6 inherit config;
7 };
8 rainloop = pkgs.callPackage ./rainloop.nix {
9 rainloop = pkgs.rainloop-community;
10 };
11 cfg = config.myServices.websites.tools.email;
12 pcfg = config.services.phpfpm.pools;
13in
14{
15 options.myServices.websites.tools.email = {
16 enable = lib.mkEnableOption "enable email website";
17 };
18
19 imports = [
20 ./mta-sts.nix
21 ];
22
23 config = lib.mkIf cfg.enable {
24 secrets.keys = roundcubemail.keys;
25
26 services.websites.env.tools.modules =
27 [ "proxy_fcgi" ]
28 ++ rainloop.apache.modules
29 ++ roundcubemail.apache.modules;
30
31 services.websites.env.tools.vhostConfs.mail = {
32 certName = "mail";
33 addToCerts = true;
34 hosts = ["mail.immae.eu"];
35 root = ./www;
36 extraConfig = [
37 (rainloop.apache.vhostConf pcfg.rainloop.socket)
38 (roundcubemail.apache.vhostConf pcfg.roundcubemail.socket)
39 ''
40 <Directory ${./www}>
41 Require all granted
42 Options -Indexes
43 </Directory>
44 ''
45 ];
46 };
47 systemd.services = {
48 phpfpm-rainloop = {
49 after = lib.mkAfter rainloop.phpFpm.serviceDeps;
50 wants = rainloop.phpFpm.serviceDeps;
51 };
52 phpfpm-roundcubemail = {
53 after = lib.mkAfter roundcubemail.phpFpm.serviceDeps;
54 wants = roundcubemail.phpFpm.serviceDeps;
55 };
56 };
57
58 services.phpfpm.pools.roundcubemail = {
59 user = "wwwrun";
60 group = "wwwrun";
61 settings = roundcubemail.phpFpm.pool;
62 phpOptions = config.services.phpfpm.phpOptions + ''
63 date.timezone = 'CET'
64 '';
65 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick ]);
66 };
67 services.phpfpm.pools.rainloop = {
68 user = "wwwrun";
69 group = "wwwrun";
70 settings = rainloop.phpFpm.pool;
71 phpPackage = pkgs.php72;
72 };
73 system.activationScripts = {
74 roundcubemail = roundcubemail.activationScript;
75 rainloop = rainloop.activationScript;
76 };
77 };
78
79}
diff --git a/modules/private/websites/tools/mail/mta-sts.nix b/modules/private/websites/tools/mail/mta-sts.nix
deleted file mode 100644
index 77ba2d4..0000000
--- a/modules/private/websites/tools/mail/mta-sts.nix
+++ /dev/null
@@ -1,54 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 domains = (lib.remove null (lib.flatten (map
4 (zone: map
5 (e: if e.receive
6 then {
7 domain = "${e.domain}${lib.optionalString (e.domain != "") "."}${zone.name}";
8 mail = zone.name;
9 }
10 else null
11 )
12 (zone.withEmail or [])
13 )
14 config.myEnv.dns.masterZones
15 )));
16 mxes = lib.mapAttrsToList
17 (n: v: v.mx.subdomain)
18 (lib.attrsets.filterAttrs (n: v: v.mx.enable) config.myEnv.servers);
19 # FIXME: increase the id number in modules/private/dns.nix when this
20 # file change (date -u +'%Y%m%d%H%M%S'Z)
21 file = domain: pkgs.writeText "mta-sts-${domain.domain}.txt" (
22 builtins.concatStringsSep "\r\n" ([ "version: STSv1" "mode: testing" ]
23 ++ (map (v: "mx: ${v}.${domain.mail}") mxes)
24 ++ [ "max_age: 604800" ]
25 ));
26 root = pkgs.runCommand "mta-sts_root" {} ''
27 mkdir -p $out
28 ${builtins.concatStringsSep "\n" (map (d:
29 "cp ${file d} $out/${d.domain}.txt"
30 ) domains)}
31 '';
32 cfg = config.myServices.websites.tools.email;
33in
34{
35 config = lib.mkIf cfg.enable {
36 services.websites.env.tools.vhostConfs.mta_sts = {
37 certName = "mail";
38 addToCerts = true;
39 hosts = ["mta-sts.mail.immae.eu"] ++ map (v: "mta-sts.${v.domain}") domains;
40 root = root;
41 extraConfig = [
42 ''
43 RewriteEngine on
44 RewriteCond %{HTTP_HOST} ^mta-sts.(.*)$
45 RewriteRule ^/.well-known/mta-sts.txt$ %{DOCUMENT_ROOT}/%1.txt [L]
46 <Directory ${root}>
47 Require all granted
48 Options -Indexes
49 </Directory>
50 ''
51 ];
52 };
53 };
54}
diff --git a/modules/private/websites/tools/mail/rainloop.nix b/modules/private/websites/tools/mail/rainloop.nix
deleted file mode 100644
index 20e43a1..0000000
--- a/modules/private/websites/tools/mail/rainloop.nix
+++ /dev/null
@@ -1,54 +0,0 @@
1{ lib, rainloop, writeText, stdenv, fetchurl }:
2rec {
3 varDir = "/var/lib/rainloop";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}
8 install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
9 install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
10 '';
11 };
12 webRoot = rainloop.override { dataPath = "${varDir}/data"; };
13 apache = rec {
14 user = "wwwrun";
15 group = "wwwrun";
16 modules = [ "proxy_fcgi" ];
17 root = webRoot;
18 vhostConf = socket: ''
19 Alias /rainloop "${root}"
20 <Directory "${root}">
21 DirectoryIndex index.php
22 AllowOverride All
23 Options -FollowSymlinks
24 Require all granted
25
26 <FilesMatch "\.php$">
27 SetHandler "proxy:unix:${socket}|fcgi://localhost"
28 </FilesMatch>
29 </Directory>
30
31 <DirectoryMatch "${root}/data">
32 Require all denied
33 </DirectoryMatch>
34 '';
35 };
36 phpFpm = rec {
37 serviceDeps = [ "postgresql.service" ];
38 basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
39 pool = {
40 "listen.owner" = apache.user;
41 "listen.group" = apache.group;
42 "pm" = "ondemand";
43 "pm.max_children" = "60";
44 "pm.process_idle_timeout" = "60";
45
46 # Needed to avoid clashes in browser cookies (same domain)
47 "php_value[session.name]" = "RainloopPHPSESSID";
48 "php_admin_value[upload_max_filesize]" = "200M";
49 "php_admin_value[post_max_size]" = "200M";
50 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
51 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
52 };
53 };
54}
diff --git a/modules/private/websites/tools/mail/roundcubemail.nix b/modules/private/websites/tools/mail/roundcubemail.nix
deleted file mode 100644
index 2661b55..0000000
--- a/modules/private/websites/tools/mail/roundcubemail.nix
+++ /dev/null
@@ -1,118 +0,0 @@
1{ env, roundcubemail, apacheHttpd, config }:
2rec {
3 varDir = "/var/lib/roundcubemail";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
8 ${varDir}/cache ${varDir}/logs
9 install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
10 '';
11 };
12 keys."webapps/tools-roundcube" = {
13 user = apache.user;
14 group = apache.group;
15 permissions = "0400";
16 text =
17 let
18 psql_url = with env.postgresql; "pgsql://${user}:${password}@unix(${socket}:${port})/${database}";
19 in ''
20 <?php
21 $config['db_dsnw'] = '${psql_url}';
22 $config['default_host'] = 'ssl://imap.immae.eu';
23 $config['username_domain'] = array(
24 "imap.immae.eu" => "mail.immae.eu"
25 );
26 $config['imap_conn_options'] = array("ssl" => array("verify_peer" => false));
27 $config['smtp_server'] = 'tls://smtp.immae.eu';
28 $config['smtp_port'] = '587';
29 $config['managesieve_host'] = 'imap.immae.eu';
30 $config['managesieve_port'] = '4190';
31 $config['managesieve_usetls'] = true;
32 $config['managesieve_conn_options'] = array("ssl" => array("verify_peer" => false));
33
34 $config['imap_cache'] = 'db';
35 $config['messages_cache'] = 'db';
36
37 $config['support_url'] = ''';
38
39 $config['des_key'] = '${env.secret}';
40
41 $config['skin'] = 'elastic';
42 $config['plugins'] = array(
43 'attachment_reminder',
44 'emoticons',
45 'filesystem_attachments',
46 'hide_blockquote',
47 'identicon',
48 'identity_select',
49 'jqueryui',
50 'markasjunk',
51 'managesieve',
52 'newmail_notifier',
53 'vcard_attachments',
54 'zipdownload',
55
56 'automatic_addressbook',
57 'message_highlight',
58 'carddav',
59 // Ne marche pas ?: 'ident_switch',
60 // Ne marche pas ?: 'thunderbird_labels',
61 );
62
63 $config['language'] = 'fr_FR';
64
65 $config['drafts_mbox'] = 'Drafts';
66 $config['junk_mbox'] = 'Junk';
67 $config['sent_mbox'] = 'Sent';
68 $config['trash_mbox'] = 'Trash';
69 $config['default_folders'] = array('INBOX', 'Drafts', 'Sent', 'Junk', 'Trash');
70 $config['draft_autosave'] = 60;
71 $config['enable_installer'] = false;
72 $config['log_driver'] = 'file';
73 $config['temp_dir'] = '${varDir}/cache';
74 $config['mime_types'] = '${apacheHttpd}/conf/mime.types';
75 '';
76 };
77 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 ]);
78 apache = rec {
79 user = "wwwrun";
80 group = "wwwrun";
81 modules = [ "proxy_fcgi" ];
82 root = webRoot;
83 vhostConf = socket: ''
84 Alias /roundcube "${root}"
85 <Directory "${root}">
86 DirectoryIndex index.php
87 AllowOverride All
88 Options FollowSymlinks
89 Require all granted
90
91 <FilesMatch "\.php$">
92 SetHandler "proxy:unix:${socket}|fcgi://localhost"
93 </FilesMatch>
94 </Directory>
95 '';
96 };
97 phpFpm = rec {
98 serviceDeps = [ "postgresql.service" ];
99 basedir = builtins.concatStringsSep ":" (
100 [ webRoot config.secrets.fullPaths."webapps/tools-roundcube" varDir ]
101 ++ webRoot.plugins
102 ++ webRoot.skins);
103 pool = {
104 "listen.owner" = apache.user;
105 "listen.group" = apache.group;
106 "pm" = "ondemand";
107 "pm.max_children" = "60";
108 "pm.process_idle_timeout" = "60";
109
110 # Needed to avoid clashes in browser cookies (same domain)
111 "php_value[session.name]" = "RoundcubemailPHPSESSID";
112 "php_admin_value[upload_max_filesize]" = "200M";
113 "php_admin_value[post_max_size]" = "200M";
114 "php_admin_value[open_basedir]" = "${basedir}:${apacheHttpd}/conf/mime.types:/tmp";
115 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
116 };
117 };
118}
diff --git a/modules/private/websites/tools/mastodon/default.nix b/modules/private/websites/tools/mastodon/default.nix
deleted file mode 100644
index 173a4b8..0000000
--- a/modules/private/websites/tools/mastodon/default.nix
+++ /dev/null
@@ -1,136 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 env = config.myEnv.tools.mastodon;
4 root = "${mcfg.workdir}/public/";
5 cfg = config.myServices.websites.tools.mastodon;
6 mcfg = config.services.mastodon;
7in {
8 options.myServices.websites.tools.mastodon = {
9 enable = lib.mkEnableOption "enable mastodon's website";
10 };
11
12 config = lib.mkIf cfg.enable {
13 secrets.keys."webapps/tools-mastodon" = {
14 user = "mastodon";
15 group = "mastodon";
16 permissions = "0400";
17 text = ''
18 REDIS_HOST=${env.redis.host}
19 REDIS_PORT=${env.redis.port}
20 REDIS_DB=${env.redis.db}
21 DB_HOST=${env.postgresql.socket}
22 DB_USER=${env.postgresql.user}
23 DB_NAME=${env.postgresql.database}
24 DB_PASS=${env.postgresql.password}
25 DB_PORT=${env.postgresql.port}
26
27 LOCAL_DOMAIN=mastodon.immae.eu
28 LOCAL_HTTPS=true
29 ALTERNATE_DOMAINS=immae.eu
30
31 PAPERCLIP_SECRET=${env.paperclip_secret}
32 SECRET_KEY_BASE=${env.secret_key_base}
33 OTP_SECRET=${env.otp_secret}
34
35 VAPID_PRIVATE_KEY=${env.vapid.private}
36 VAPID_PUBLIC_KEY=${env.vapid.public}
37
38 SMTP_DELIVERY_METHOD=sendmail
39 SMTP_FROM_ADDRESS=mastodon@tools.immae.eu
40 SENDMAIL_LOCATION="/run/wrappers/bin/sendmail"
41 PAPERCLIP_ROOT_PATH=${mcfg.dataDir}
42
43 STREAMING_CLUSTER_NUM=1
44
45 RAILS_LOG_LEVEL=warn
46
47 # LDAP authentication (optional)
48 LDAP_ENABLED=true
49 LDAP_HOST=${env.ldap.host}
50 LDAP_PORT=636
51 LDAP_METHOD=simple_tls
52 LDAP_BASE="${env.ldap.base}"
53 LDAP_BIND_DN="${env.ldap.dn}"
54 LDAP_PASSWORD="${env.ldap.password}"
55 LDAP_UID="uid"
56 LDAP_SEARCH_FILTER="${env.ldap.filter}"
57 '';
58 };
59 services.mastodon = {
60 enable = true;
61 configFile = config.secrets.fullPaths."webapps/tools-mastodon";
62 socketsPrefix = "live_immae";
63 dataDir = "/var/lib/mastodon_immae";
64 };
65 services.filesWatcher.mastodon-streaming = {
66 restart = true;
67 paths = [ mcfg.configFile ];
68 };
69 services.filesWatcher.mastodon-web = {
70 restart = true;
71 paths = [ mcfg.configFile ];
72 };
73 services.filesWatcher.mastodon-sidekiq = {
74 restart = true;
75 paths = [ mcfg.configFile ];
76 };
77
78
79 services.websites.env.tools.modules = [
80 "headers" "proxy" "proxy_wstunnel" "proxy_http"
81 ];
82 services.websites.env.tools.vhostConfs.mastodon = {
83 certName = "eldiron";
84 addToCerts = true;
85 hosts = ["mastodon.immae.eu" ];
86 root = root;
87 extraConfig = [ ''
88 Header always set Referrer-Policy "strict-origin-when-cross-origin"
89 Header always set Strict-Transport-Security "max-age=31536000"
90
91 <LocationMatch "^/(assets|avatars|emoji|headers|packs|sounds|system)>
92 Header always set Cache-Control "public, max-age=31536000, immutable"
93 Require all granted
94 </LocationMatch>
95
96 ProxyPreserveHost On
97 RequestHeader set X-Forwarded-Proto "https"
98
99 RewriteEngine On
100
101 ProxyPass /500.html !
102 ProxyPass /sw.js !
103 ProxyPass /embed.js !
104 ProxyPass /robots.txt !
105 ProxyPass /manifest.json !
106 ProxyPass /browserconfig.xml !
107 ProxyPass /mask-icon.svg !
108 ProxyPassMatch ^(/.*\.(png|ico|gif)$) !
109 ProxyPassMatch ^/(assets|avatars|emoji|headers|packs|sounds|system|.well-known/acme-challenge) !
110
111 RewriteRule ^/api/v1/streaming/(.+)$ unix://${mcfg.sockets.node}|http://mastodon.immae.eu/api/v1/streaming/$1 [P,NE,QSA,L]
112 RewriteRule ^/api/v1/streaming/$ unix://${mcfg.sockets.node}|ws://mastodon.immae.eu/ [P,NE,QSA,L]
113 ProxyPass / unix://${mcfg.sockets.rails}|http://mastodon.immae.eu/
114 ProxyPassReverse / unix://${mcfg.sockets.rails}|http://mastodon.immae.eu/
115
116 Alias /system ${mcfg.dataDir}
117
118 <Directory ${mcfg.dataDir}>
119 Require all granted
120 Options -MultiViews
121 </Directory>
122
123 <Directory ${root}>
124 Require all granted
125 Options -MultiViews +FollowSymlinks
126 </Directory>
127
128 ErrorDocument 500 /500.html
129 ErrorDocument 501 /500.html
130 ErrorDocument 502 /500.html
131 ErrorDocument 503 /500.html
132 ErrorDocument 504 /500.html
133 '' ];
134 };
135 };
136}
diff --git a/modules/private/websites/tools/mgoblin/default.nix b/modules/private/websites/tools/mgoblin/default.nix
deleted file mode 100644
index 1e5f5a0..0000000
--- a/modules/private/websites/tools/mgoblin/default.nix
+++ /dev/null
@@ -1,134 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 env = config.myEnv.tools.mediagoblin;
4 cfg = config.myServices.websites.tools.mediagoblin;
5 mcfg = config.services.mediagoblin;
6in {
7 options.myServices.websites.tools.mediagoblin = {
8 enable = lib.mkEnableOption "enable mediagoblin's website";
9 };
10
11 config = lib.mkIf cfg.enable {
12 secrets.keys."webapps/tools-mediagoblin" = {
13 user = "mediagoblin";
14 group = "mediagoblin";
15 permissions = "0400";
16 text =
17 let
18 psql_url = with env.postgresql; "postgresql://${user}:${password}@:${port}/${database}?host=${socket}";
19 redis_url = with env.redis; "redis+socket://${socket}?virtual_host=${db}";
20 in
21 ''
22 [DEFAULT]
23 data_basedir = "${mcfg.dataDir}"
24
25 [mediagoblin]
26 direct_remote_path = /mgoblin_static/
27 email_sender_address = "mediagoblin@tools.immae.eu"
28
29 #sql_engine = sqlite:///%(data_basedir)s/mediagoblin.db
30 sql_engine = ${psql_url}
31
32 email_debug_mode = false
33 allow_registration = false
34 allow_reporting = true
35
36 theme = airymodified
37
38 user_privilege_scheme = "uploader,commenter,reporter"
39
40 # We need to redefine them here since we override data_basedir
41 # cf /usr/share/webapps/mediagoblin/mediagoblin/config_spec.ini
42 workbench_path = %(data_basedir)s/media/workbench
43 crypto_path = %(data_basedir)s/crypto
44 theme_install_dir = %(data_basedir)s/themes/
45 theme_linked_assets_dir = %(data_basedir)s/theme_static/
46 plugin_linked_assets_dir = %(data_basedir)s/plugin_static/
47
48 [storage:queuestore]
49 base_dir = %(data_basedir)s/media/queue
50
51 [storage:publicstore]
52 base_dir = %(data_basedir)s/media/public
53 base_url = /mgoblin_media/
54
55 [celery]
56 CELERY_RESULT_DBURI = ${redis_url}
57 BROKER_URL = ${redis_url}
58 CELERYD_CONCURRENCY = 1
59
60 [plugins]
61 [[mediagoblin.plugins.geolocation]]
62 [[mediagoblin.plugins.ldap]]
63 [[[immae.eu]]]
64 LDAP_SERVER_URI = 'ldaps://${env.ldap.host}:636'
65 LDAP_SEARCH_BASE = '${env.ldap.base}'
66 LDAP_BIND_DN = '${env.ldap.dn}'
67 LDAP_BIND_PW = '${env.ldap.password}'
68 LDAP_SEARCH_FILTER = '${env.ldap.filter}'
69 EMAIL_SEARCH_FIELD = 'mail'
70 [[mediagoblin.plugins.basicsearch]]
71 [[mediagoblin.plugins.piwigo]]
72 [[mediagoblin.plugins.processing_info]]
73 [[mediagoblin.media_types.image]]
74 [[mediagoblin.media_types.video]]
75 '';
76 };
77
78 users.users.mediagoblin.extraGroups = [ "keys" ];
79
80 services.mediagoblin = {
81 enable = true;
82 package = pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch]);
83 configFile = config.secrets.fullPaths."webapps/tools-mediagoblin";
84 };
85 services.filesWatcher.mediagoblin-web = {
86 restart = true;
87 paths = [ mcfg.configFile ];
88 };
89 services.filesWatcher.mediagoblin-celeryd = {
90 restart = true;
91 paths = [ mcfg.configFile ];
92 };
93
94 services.websites.env.tools.modules = [
95 "proxy" "proxy_http"
96 ];
97 users.users.wwwrun.extraGroups = [ "mediagoblin" ];
98 services.websites.env.tools.vhostConfs.mgoblin = {
99 certName = "eldiron";
100 addToCerts = true;
101 hosts = ["mgoblin.immae.eu" ];
102 root = null;
103 extraConfig = [ ''
104 Alias /mgoblin_media ${mcfg.dataDir}/media/public
105 <Directory ${mcfg.dataDir}/media/public>
106 Options -Indexes +FollowSymLinks +MultiViews +Includes
107 Require all granted
108 </Directory>
109
110 Alias /theme_static ${mcfg.dataDir}/theme_static
111 <Directory ${mcfg.dataDir}/theme_static>
112 Options -Indexes +FollowSymLinks +MultiViews +Includes
113 Require all granted
114 </Directory>
115
116 Alias /plugin_static ${mcfg.dataDir}/plugin_static
117 <Directory ${mcfg.dataDir}/plugin_static>
118 Options -Indexes +FollowSymLinks +MultiViews +Includes
119 Require all granted
120 </Directory>
121
122 ProxyPreserveHost on
123 ProxyVia On
124 ProxyRequests Off
125 ProxyPass /mgoblin_media !
126 ProxyPass /theme_static !
127 ProxyPass /plugin_static !
128 ProxyPassMatch ^/.well-known/acme-challenge !
129 ProxyPass / unix://${mcfg.sockets.paster}|http://mgoblin.immae.eu/
130 ProxyPassReverse / unix://${mcfg.sockets.paster}|http://mgoblin.immae.eu/
131 '' ];
132 };
133 };
134}
diff --git a/modules/private/websites/tools/peertube/default.nix b/modules/private/websites/tools/peertube/default.nix
deleted file mode 100644
index 68c992f..0000000
--- a/modules/private/websites/tools/peertube/default.nix
+++ /dev/null
@@ -1,94 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 env = config.myEnv.tools.peertube;
4 cfg = config.myServices.websites.tools.peertube;
5 pcfg = config.services.peertube;
6in {
7 options.myServices.websites.tools.peertube = {
8 enable = lib.mkEnableOption "enable Peertube's website";
9 };
10
11 config = lib.mkIf cfg.enable {
12 services.peertube = {
13 enable = true;
14 configFile = config.secrets.fullPaths."webapps/tools-peertube";
15 };
16 users.users.peertube.extraGroups = [ "keys" ];
17
18 secrets.keys."webapps/tools-peertube" = {
19 user = "peertube";
20 group = "peertube";
21 permissions = "0640";
22 text = ''
23 listen:
24 hostname: 'localhost'
25 port: ${toString config.myEnv.ports.peertube}
26 webserver:
27 https: true
28 hostname: 'peertube.immae.eu'
29 port: 443
30 database:
31 hostname: '${env.postgresql.socket}'
32 port: 5432
33 suffix: '_prod'
34 username: '${env.postgresql.user}'
35 password: '${env.postgresql.password}'
36 pool:
37 max: 5
38 redis:
39 socket: '${env.redis.socket}'
40 auth: null
41 db: ${env.redis.db}
42 smtp:
43 transport: sendmail
44 sendmail: '/run/wrappers/bin/sendmail'
45 from_address: 'peertube@tools.immae.eu'
46 storage:
47 tmp: '${pcfg.dataDir}/storage/tmp/'
48 avatars: '${pcfg.dataDir}/storage/avatars/'
49 videos: '${pcfg.dataDir}/storage/videos/'
50 streaming_playlists: '${pcfg.dataDir}/storage/streaming-playlists/'
51 redundancy: '${pcfg.dataDir}/storage/videos/'
52 logs: '${pcfg.dataDir}/storage/logs/'
53 previews: '${pcfg.dataDir}/storage/previews/'
54 thumbnails: '${pcfg.dataDir}/storage/thumbnails/'
55 torrents: '${pcfg.dataDir}/storage/torrents/'
56 captions: '${pcfg.dataDir}/storage/captions/'
57 cache: '${pcfg.dataDir}/storage/cache/'
58 plugins: '${pcfg.dataDir}/storage/plugins/'
59 client_overrides: '${pcfg.dataDir}/storage/client-overrides/'
60 '';
61 };
62
63 services.websites.env.tools.modules = [
64 "headers" "proxy" "proxy_http" "proxy_wstunnel"
65 ];
66 services.filesWatcher.peertube = {
67 restart = true;
68 paths = [ pcfg.configFile ];
69 };
70
71 services.websites.env.tools.vhostConfs.peertube = {
72 certName = "eldiron";
73 addToCerts = true;
74 hosts = [ "peertube.immae.eu" ];
75 root = null;
76 extraConfig = [ ''
77 RewriteEngine On
78
79 RewriteCond %{REQUEST_URI} ^/socket.io [NC]
80 RewriteCond %{QUERY_STRING} transport=websocket [NC]
81 RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L]
82
83 RewriteCond %{REQUEST_URI} ^/tracker/socket [NC]
84 RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L]
85
86 ProxyPass / http://localhost:${toString env.listenPort}/
87 ProxyPassReverse / http://localhost:${toString env.listenPort}/
88
89 ProxyPreserveHost On
90 RequestHeader set X-Real-IP %{REMOTE_ADDR}s
91 '' ];
92 };
93 };
94}
diff --git a/modules/private/websites/tools/performance/default.nix b/modules/private/websites/tools/performance/default.nix
deleted file mode 100644
index 5715ff0..0000000
--- a/modules/private/websites/tools/performance/default.nix
+++ /dev/null
@@ -1,88 +0,0 @@
1{ pkgs, lib, config, ... }:
2let
3 env = config.myEnv.tools.status_engine;
4 package = pkgs.status_engine.interface.override({ config_file = config.secrets.fullPaths."status_engine_ui"; });
5 apacheRoot = "${package}/public";
6 cfg = config.myServices.websites.tools.performance;
7in
8{
9 options.myServices.websites.tools.performance = {
10 enable = lib.mkEnableOption "Enable performance website";
11 };
12
13 config = lib.mkIf cfg.enable {
14 secrets.keys = {
15 status_engine_ui = {
16 permissions = "0400";
17 user = "wwwrun";
18 group = "wwwrun";
19 text = ''
20 allow_anonymous: 0
21 anonymous_can_submit_commands: 0
22 urls_without_login:
23 - login
24 - loginstate
25 auth_type: ldap
26 ldap_server: ${env.ldap.host}
27 ldap_use_ssl: 1
28 ldap_port: 636
29 ldap_bind_dn: ${env.ldap.dn}
30 ldap_bind_password: ${env.ldap.password}
31 ldap_base_dn: ${env.ldap.base}
32 ldap_filter: "${env.ldap.filter}"
33 ldap_attribute:
34 - memberOf
35 use_crate: 0
36 use_mysql: 1
37 mysql:
38 host: 127.0.0.1
39 port: ${env.mysql.port}
40 username: ${env.mysql.user}
41 password: ${env.mysql.password}
42 database: ${env.mysql.database}
43 display_perfdata: 1
44 perfdata_backend: mysql
45 '';
46 };
47 };
48
49 services.websites.env.tools.modules = [ "proxy_fcgi" ];
50
51 services.websites.env.tools.vhostConfs.performance = {
52 certName = "eldiron";
53 addToCerts = true;
54 hosts = [ "performance.immae.eu" ];
55 root = apacheRoot;
56 extraConfig = [
57 ''
58 <Directory ${apacheRoot}>
59 DirectoryIndex index.html
60 AllowOverride None
61 Require all granted
62 <FilesMatch "\.php$">
63 SetHandler "proxy:unix:${config.services.phpfpm.pools.status_engine.socket}|fcgi://localhost"
64 </FilesMatch>
65 </Directory>
66 ''
67 ];
68 };
69
70 services.phpfpm.pools.status_engine = {
71 user = "wwwrun";
72 group = "wwwrun";
73 settings = {
74 "listen.owner" = "wwwrun";
75 "listen.group" = "wwwrun";
76 "pm" = "dynamic";
77 "pm.max_children" = "60";
78 "pm.start_servers" = "2";
79 "pm.min_spare_servers" = "1";
80 "pm.max_spare_servers" = "10";
81
82 "php_admin_value[open_basedir]" = "${package}:/tmp:${config.secrets.fullPaths."status_engine_ui"}";
83 };
84 phpPackage = pkgs.php74;
85 };
86
87 };
88}
diff --git a/modules/private/websites/tools/stats/default.nix b/modules/private/websites/tools/stats/default.nix
deleted file mode 100644
index 71e31a3..0000000
--- a/modules/private/websites/tools/stats/default.nix
+++ /dev/null
@@ -1,51 +0,0 @@
1{ config, lib, pkgs, ... }:
2let
3 cfg = config.myServices.websites.tools.stats;
4 myCfg = config.myEnv.tools.umami;
5in
6{
7 options.myServices.websites.tools.stats.enable = lib.mkEnableOption "Enable stats site";
8 config = lib.mkIf cfg.enable {
9 secrets.keys = {
10 "uami/env" = {
11 permission = "0400";
12 text = ''
13 PORT=${toString myCfg.listenPort}
14 HOSTNAME=127.0.0.1
15 DATABASE_URL=postgresql://${myCfg.postgresql.user}:${myCfg.postgresql.password}@localhost:${myCfg.postgresql.port}/${myCfg.postgresql.database}?sslmode=disable&host=${myCfg.postgresql.socket}
16 HASH_SALT=${myCfg.hashSalt}
17 '';
18 };
19 };
20
21 services.websites.env.tools.vhostConfs.stats = {
22 certName = "eldiron";
23 addToCerts = true;
24 hosts = [ "stats.immae.eu" ];
25 root = null;
26 extraConfig = [
27 ''
28 ProxyPass / http://localhost:${toString myCfg.listenPort}/
29 ProxyPassReverse / http://localhost:${toString myCfg.listenPort}/
30 ProxyPreserveHost On
31 ''
32 ];
33 };
34 systemd.services.umami = {
35 description = "Umami service";
36 wantedBy = [ "multi-user.target" ];
37 after = [ "network.target" ];
38 wants = [ "postgresql.service" ];
39 path = [ pkgs.nodejs pkgs.bashInteractive ];
40 serviceConfig = {
41 Type = "simple";
42 User = "umami";
43 Group = "umami";
44 DynamicUser = true;
45 SupplementaryGroups = [ "keys" ];
46 ExecStart = "${pkgs.umami}/bin/umami";
47 EnvironmentFile = config.secrets.fullPaths."umami/env";
48 };
49 };
50 };
51}
diff --git a/modules/private/websites/tools/tools/adminer.nix b/modules/private/websites/tools/tools/adminer.nix
deleted file mode 100644
index c280684..0000000
--- a/modules/private/websites/tools/tools/adminer.nix
+++ /dev/null
@@ -1,46 +0,0 @@
1{ webapps, php74, myPhpPackages, lib, forcePhpSocket ? null }:
2rec {
3 activationScript = {
4 deps = [ "httpd" ];
5 text = ''
6 install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/adminer
7 '';
8 };
9 webRoot = webapps.adminer;
10 phpFpm = rec {
11 user = apache.user;
12 group = apache.group;
13 phpPackage = php74.withExtensions ({ enabled, all }: (lib.remove all.mysqli enabled) ++ [myPhpPackages.mysqli_pam]);
14 settings = {
15 "listen.owner" = apache.user;
16 "listen.group" = apache.group;
17 "pm" = "ondemand";
18 "pm.max_children" = "5";
19 "pm.process_idle_timeout" = "60";
20 #"php_admin_flag[log_errors]" = "on";
21 # Needed to avoid clashes in browser cookies (same domain)
22 "php_value[session.name]" = "AdminerPHPSESSID";
23 "php_admin_value[open_basedir]" = "${webRoot}:/tmp:/var/lib/php/sessions/adminer";
24 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/adminer";
25 };
26 };
27 apache = rec {
28 user = "wwwrun";
29 group = "wwwrun";
30 modules = [ "proxy_fcgi" ];
31 root = webRoot;
32 vhostConf = socket: ''
33 Alias /adminer ${webRoot}
34 <Directory ${webRoot}>
35 DirectoryIndex index.php
36 <FilesMatch "\.php$">
37 SetHandler "proxy:unix:${if forcePhpSocket != null then forcePhpSocket else socket}|fcgi://localhost"
38 </FilesMatch>
39
40 Use LDAPConnect
41 Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu
42 Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu
43 </Directory>
44 '';
45 };
46}
diff --git a/modules/private/websites/tools/tools/csp_reports.nix b/modules/private/websites/tools/tools/csp_reports.nix
deleted file mode 100644
index 9b3f0cf..0000000
--- a/modules/private/websites/tools/tools/csp_reports.nix
+++ /dev/null
@@ -1,11 +0,0 @@
1{ env }:
2rec {
3 keys."webapps/tools-csp-reports.conf" = {
4 user = "wwwrun";
5 group = "wwwrun";
6 permissions = "0400";
7 text = with env.postgresql; ''
8 env[CSP_REPORT_URI] = "host=${socket} dbname=${database} user=${user} password=${password}"
9 '';
10 };
11}
diff --git a/modules/private/websites/tools/tools/default.nix b/modules/private/websites/tools/tools/default.nix
deleted file mode 100644
index 90fcbe1..0000000
--- a/modules/private/websites/tools/tools/default.nix
+++ /dev/null
@@ -1,429 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 flakeCompat = import ../../../../../lib/flake-compat.nix;
4
5 adminer = pkgs.callPackage ./adminer.nix {};
6 ympd = pkgs.callPackage ./ympd.nix {
7 env = config.myEnv.tools.ympd;
8 };
9 ttrss = pkgs.callPackage ./ttrss.nix {
10 inherit (pkgs.webapps) ttrss ttrss-plugins;
11 env = config.myEnv.tools.ttrss;
12 php = pkgs.php72;
13 inherit config;
14 };
15 kanboard = pkgs.callPackage ./kanboard.nix {
16 inherit config;
17 env = config.myEnv.tools.kanboard;
18 };
19 wallabag = pkgs.callPackage ./wallabag.nix {
20 wallabag = pkgs.webapps.wallabag.override {
21 composerEnv = pkgs.composerEnv.override {
22 php = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy]);
23 };
24 };
25 env = config.myEnv.tools.wallabag;
26 inherit config;
27 };
28 yourls = pkgs.callPackage ./yourls.nix {
29 inherit (pkgs.webapps) yourls yourls-plugins;
30 env = config.myEnv.tools.yourls;
31 inherit config;
32 };
33 rompr = pkgs.callPackage ./rompr.nix {
34 inherit (pkgs.webapps) rompr;
35 env = config.myEnv.tools.rompr;
36 };
37 shaarli = pkgs.callPackage ./shaarli.nix {
38 env = config.myEnv.tools.shaarli;
39 inherit config;
40 };
41 dokuwiki = pkgs.callPackage ./dokuwiki.nix {
42 inherit (pkgs.webapps) dokuwiki dokuwiki-plugins;
43 };
44 ldap = pkgs.callPackage ./ldap.nix {
45 inherit (pkgs.webapps) phpldapadmin;
46 env = config.myEnv.tools.phpldapadmin;
47 inherit config;
48 };
49 grocy = pkgs.callPackage ./grocy.nix {
50 grocy = pkgs.webapps.grocy.override { composerEnv = pkgs.composerEnv.override { php = pkgs.php72; }; };
51 };
52 phpbb = pkgs.callPackage ./phpbb.nix {
53 phpbb = (pkgs.webapps.phpbb.withLangs (l: [ l.fr ])).withExts (e: [
54 e.alfredoramos.markdown e.davidiq.mailinglist e.dmzx.mchat
55 e.empteintesduweb.monitoranswers e.lr94.autosubscribe
56 e.phpbbmodders.adduser ]);
57 };
58 webhooks = pkgs.callPackage ./webhooks.nix {
59 env = config.myEnv.tools.webhooks;
60 };
61 dmarc-reports = pkgs.callPackage ./dmarc_reports.nix {
62 env = config.myEnv.tools.dmarc_reports;
63 inherit config;
64 };
65 csp-reports = pkgs.callPackage ./csp_reports.nix {
66 env = config.myEnv.tools.csp_reports;
67 };
68
69 landing = pkgs.callPackage ./landing.nix {};
70
71 cfg = config.myServices.websites.tools.tools;
72 pcfg = config.services.phpfpm.pools;
73in {
74 imports =
75 builtins.attrValues (flakeCompat ../../../../../flakes/private/paste).nixosModules;
76
77 options.myServices.websites.tools.tools = {
78 enable = lib.mkEnableOption "enable tools website";
79 };
80
81 config = lib.mkIf cfg.enable {
82 secrets.keys =
83 kanboard.keys
84 // ldap.keys
85 // shaarli.keys
86 // ttrss.keys
87 // wallabag.keys
88 // yourls.keys
89 // dmarc-reports.keys
90 // csp-reports.keys
91 // webhooks.keys;
92
93 services.websites.env.tools.modules =
94 [ "proxy_fcgi" ]
95 ++ adminer.apache.modules
96 ++ ympd.apache.modules
97 ++ ttrss.apache.modules
98 ++ wallabag.apache.modules
99 ++ yourls.apache.modules
100 ++ rompr.apache.modules
101 ++ shaarli.apache.modules
102 ++ dokuwiki.apache.modules
103 ++ dmarc-reports.apache.modules
104 ++ phpbb.apache.modules
105 ++ ldap.apache.modules
106 ++ kanboard.apache.modules;
107
108 services.websites.env.integration.vhostConfs.devtools = {
109 certName = "integration";
110 certMainHost = "tools.immae.dev";
111 addToCerts = true;
112 hosts = [ "tools.immae.dev" ];
113 root = "/var/lib/ftp/immae/devtools";
114 extraConfig = [
115 ''
116 Use Apaxy "/var/lib/ftp/immae/devtools" "title"
117 Timeout 600
118 ProxyTimeout 600
119 Header always set Content-Security-Policy-Report-Only "${config.myEnv.tools.csp_reports.policies.inline}"
120 <Directory "/var/lib/ftp/immae/devtools">
121 DirectoryIndex index.php index.htm index.html
122 AllowOverride all
123 Require all granted
124 <FilesMatch "\.php$">
125 SetHandler "proxy:unix:${pcfg.devtools.socket}|fcgi://localhost"
126 </FilesMatch>
127 </Directory>
128 ''
129 ];
130 };
131
132 services.websites.env.tools.vhostConfs.tools = {
133 certName = "eldiron";
134 addToCerts = true;
135 hosts = ["tools.immae.eu" ];
136 root = landing;
137 extraConfig = [
138 ''
139 RedirectMatch 301 ^/vpn(.*)$ https://vpn.immae.eu$1
140 RedirectMatch 301 ^/roundcube(.*)$ https://mail.immae.eu/roundcube$1
141 RedirectMatch 301 ^/jappix(.*)$ https://im.immae.fr/converse
142
143 <Directory "${landing}">
144 DirectoryIndex index.html
145 AllowOverride None
146 Require all granted
147
148 <FilesMatch "\.php$">
149 SetHandler "proxy:unix:${pcfg.tools.socket}|fcgi://localhost"
150 </FilesMatch>
151 </Directory>
152 ''
153 (adminer.apache.vhostConf pcfg.adminer.socket)
154 ympd.apache.vhostConf
155 (ttrss.apache.vhostConf pcfg.ttrss.socket)
156 (wallabag.apache.vhostConf pcfg.wallabag.socket)
157 (yourls.apache.vhostConf pcfg.yourls.socket)
158 (rompr.apache.vhostConf pcfg.rompr.socket)
159 (shaarli.apache.vhostConf pcfg.shaarli.socket)
160 (dokuwiki.apache.vhostConf pcfg.dokuwiki.socket)
161 (ldap.apache.vhostConf pcfg.ldap.socket)
162 (kanboard.apache.vhostConf pcfg.kanboard.socket)
163 (grocy.apache.vhostConf pcfg.grocy.socket)
164 (phpbb.apache.vhostConf pcfg.phpbb.socket)
165 (dmarc-reports.apache.vhostConf pcfg.dmarc-reports.socket)
166 ''
167 <Location "/paste/">
168 ProxyPass unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
169 ProxyPassReverse unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
170 ProxyPreserveHost on
171 </Location>
172 <Location "/paste">
173 ProxyPass unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
174 ProxyPassReverse unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
175 ProxyPreserveHost on
176 </Location>
177
178 Alias /BIP39 /var/lib/buildbot/outputs/immae/bip39
179 <Directory "/var/lib/buildbot/outputs/immae/bip39">
180 DirectoryIndex index.html
181 AllowOverride None
182 Require all granted
183 </Directory>
184
185 Alias /webhooks ${config.secrets.fullPaths."webapps/webhooks"}
186 <Directory "${config.secrets.fullPaths."webapps/webhooks"}">
187 Options -Indexes
188 Require all granted
189 AllowOverride None
190 <FilesMatch "\.php$">
191 SetHandler "proxy:unix:${pcfg.tools.socket}|fcgi://localhost"
192 </FilesMatch>
193 </Directory>
194 ''
195 ];
196 };
197
198 services.websites.env.tools.vhostConfs.outils = {
199 certName = "eldiron";
200 addToCerts = true;
201 hosts = [ "outils.immae.eu" ];
202 root = null;
203 extraConfig = [
204 ''
205 RedirectMatch 301 ^/mediagoblin(.*)$ https://mgoblin.immae.eu$1
206
207 RedirectMatch 301 ^/ether(.*)$ https://ether.immae.eu$1
208
209 RedirectMatch 301 ^/nextcloud(.*)$ https://cloud.immae.eu$1
210 RedirectMatch 301 ^/owncloud(.*)$ https://cloud.immae.eu$1
211
212 RedirectMatch 301 ^/carddavmate(.*)$ https://dav.immae.eu/infcloud$1
213 RedirectMatch 301 ^/caldavzap(.*)$ https://dav.immae.eu/infcloud$1
214 RedirectMatch 301 ^/caldav.php(.*)$ https://dav.immae.eu/caldav.php$1
215 RedirectMatch 301 ^/davical(.*)$ https://dav.immae.eu/davical$1
216
217 RedirectMatch 301 ^/taskweb(.*)$ https://task.immae.eu/taskweb$1
218
219 RedirectMatch 301 ^/roundcube(.*)$ https://mail.immae.eu/roundcube$1
220
221 RedirectMatch 301 ^/jappix(.*)$ https://im.immae.fr/converse
222
223 RedirectMatch 301 ^/vpn(.*)$ https://vpn.immae.eu$1
224
225 RedirectMatch 301 ^/(.*)$ https://tools.immae.eu/$1
226 ''
227 ];
228 };
229
230 systemd.services = {
231 phpfpm-dokuwiki = {
232 after = lib.mkAfter dokuwiki.phpFpm.serviceDeps;
233 wants = dokuwiki.phpFpm.serviceDeps;
234 };
235 phpfpm-phpbb = {
236 after = lib.mkAfter phpbb.phpFpm.serviceDeps;
237 wants = phpbb.phpFpm.serviceDeps;
238 };
239 phpfpm-kanboard = {
240 after = lib.mkAfter kanboard.phpFpm.serviceDeps;
241 wants = kanboard.phpFpm.serviceDeps;
242 };
243 phpfpm-ldap = {
244 after = lib.mkAfter ldap.phpFpm.serviceDeps;
245 wants = ldap.phpFpm.serviceDeps;
246 };
247 phpfpm-shaarli = {
248 after = lib.mkAfter shaarli.phpFpm.serviceDeps;
249 wants = shaarli.phpFpm.serviceDeps;
250 };
251 phpfpm-ttrss = {
252 after = lib.mkAfter ttrss.phpFpm.serviceDeps;
253 wants = ttrss.phpFpm.serviceDeps;
254 };
255 phpfpm-wallabag = {
256 after = lib.mkAfter wallabag.phpFpm.serviceDeps;
257 wants = wallabag.phpFpm.serviceDeps;
258 preStart = lib.mkAfter wallabag.phpFpm.preStart;
259 };
260 phpfpm-yourls = {
261 after = lib.mkAfter yourls.phpFpm.serviceDeps;
262 wants = yourls.phpFpm.serviceDeps;
263 };
264 ympd = {
265 description = "Standalone MPD Web GUI written in C";
266 wantedBy = [ "multi-user.target" ];
267 script = ''
268 export MPD_PASSWORD=$(cat ${config.secrets.fullPaths."mpd"})
269 ${pkgs.ympd}/bin/ympd --host ${ympd.config.host} --port ${toString ympd.config.port} --webport ${ympd.config.webPort} --user nobody
270 '';
271 };
272 tt-rss = {
273 description = "Tiny Tiny RSS feeds update daemon";
274 serviceConfig = {
275 User = "wwwrun";
276 ExecStart = "${pkgs.php72}/bin/php ${ttrss.webRoot}/update.php --daemon";
277 StandardOutput = "syslog";
278 StandardError = "syslog";
279 PermissionsStartOnly = true;
280 };
281
282 wantedBy = [ "multi-user.target" ];
283 requires = ["postgresql.service"];
284 after = ["network.target" "postgresql.service"];
285 };
286 };
287
288 services.filesWatcher.ympd = {
289 restart = true;
290 paths = [ config.secrets.fullPaths."mpd" ];
291 };
292
293 services.phpfpm.pools = {
294 tools = {
295 user = "wwwrun";
296 group = "wwwrun";
297 settings = {
298 "listen.owner" = "wwwrun";
299 "listen.group" = "wwwrun";
300 "pm" = "dynamic";
301 "pm.max_children" = "60";
302 "pm.start_servers" = "2";
303 "pm.min_spare_servers" = "1";
304 "pm.max_spare_servers" = "10";
305
306 # Needed to avoid clashes in browser cookies (same domain)
307 "php_value[session.name]" = "ToolsPHPSESSID";
308 "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" [
309 "/run/wrappers/bin/sendmail" landing "/tmp"
310 config.secrets.fullPaths."webapps/webhooks"
311 ];
312 "include" = config.secrets.fullPaths."webapps/tools-csp-reports.conf";
313 };
314 phpEnv = {
315 CONTACT_EMAIL = config.myEnv.tools.contact;
316 };
317 phpPackage = pkgs.php72;
318 };
319 devtools = {
320 user = "wwwrun";
321 group = "wwwrun";
322 settings = {
323 "listen.owner" = "wwwrun";
324 "listen.group" = "wwwrun";
325 "pm" = "dynamic";
326 "pm.max_children" = "60";
327 "pm.start_servers" = "2";
328 "pm.min_spare_servers" = "1";
329 "pm.max_spare_servers" = "10";
330
331 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:/var/lib/ftp/immae/devtools:/tmp";
332 };
333 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.mysqli all.redis all.apcu all.opcache ]);
334 };
335 adminer = adminer.phpFpm;
336 ttrss = {
337 user = "wwwrun";
338 group = "wwwrun";
339 settings = ttrss.phpFpm.pool;
340 phpPackage = pkgs.php72;
341 };
342 wallabag = {
343 user = "wwwrun";
344 group = "wwwrun";
345 settings = wallabag.phpFpm.pool;
346 phpPackage = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy]);
347 };
348 yourls = {
349 user = "wwwrun";
350 group = "wwwrun";
351 settings = yourls.phpFpm.pool;
352 phpPackage = pkgs.php72;
353 };
354 rompr = {
355 user = "wwwrun";
356 group = "wwwrun";
357 settings = rompr.phpFpm.pool;
358 phpPackage = pkgs.php72;
359 };
360 shaarli = {
361 user = "wwwrun";
362 group = "wwwrun";
363 settings = shaarli.phpFpm.pool;
364 phpPackage = pkgs.php72;
365 };
366 dmarc-reports = {
367 user = "wwwrun";
368 group = "wwwrun";
369 settings = dmarc-reports.phpFpm.pool;
370 phpEnv = dmarc-reports.phpFpm.phpEnv;
371 phpPackage = pkgs.php72;
372 };
373 dokuwiki = {
374 user = "wwwrun";
375 group = "wwwrun";
376 settings = dokuwiki.phpFpm.pool;
377 phpPackage = pkgs.php72;
378 };
379 phpbb = {
380 user = "wwwrun";
381 group = "wwwrun";
382 settings = phpbb.phpFpm.pool;
383 phpPackage = pkgs.php72;
384 };
385 ldap = {
386 user = "wwwrun";
387 group = "wwwrun";
388 settings = ldap.phpFpm.pool;
389 phpPackage = pkgs.php72;
390 };
391 kanboard = {
392 user = "wwwrun";
393 group = "wwwrun";
394 settings = kanboard.phpFpm.pool;
395 phpPackage = pkgs.php72;
396 };
397 grocy = {
398 user = "wwwrun";
399 group = "wwwrun";
400 settings = grocy.phpFpm.pool;
401 phpPackage = pkgs.php72;
402 };
403 };
404
405 system.activationScripts = {
406 adminer = adminer.activationScript;
407 grocy = grocy.activationScript;
408 ttrss = ttrss.activationScript;
409 wallabag = wallabag.activationScript;
410 yourls = yourls.activationScript;
411 rompr = rompr.activationScript;
412 shaarli = shaarli.activationScript;
413 dokuwiki = dokuwiki.activationScript;
414 phpbb = phpbb.activationScript;
415 kanboard = kanboard.activationScript;
416 ldap = ldap.activationScript;
417 };
418
419 services.websites.env.tools.watchPaths = [
420 config.secrets.fullPaths."webapps/tools-shaarli"
421 ];
422 services.filesWatcher.phpfpm-wallabag = {
423 restart = true;
424 paths = [ config.secrets.fullPaths."webapps/tools-wallabag" ];
425 };
426
427 };
428}
429
diff --git a/modules/private/websites/tools/tools/dmarc_reports.nix b/modules/private/websites/tools/tools/dmarc_reports.nix
deleted file mode 100644
index 8a77b13..0000000
--- a/modules/private/websites/tools/tools/dmarc_reports.nix
+++ /dev/null
@@ -1,59 +0,0 @@
1{ env, config }:
2rec {
3 keys."webapps/tools-dmarc-reports.php" = {
4 user = "wwwrun";
5 group = "wwwrun";
6 permissions = "0400";
7 text = ''
8 <?php
9 $dbhost = "${env.mysql.host}";
10 $dbname = "${env.mysql.database}";
11 $dbuser = "${env.mysql.user}";
12 $dbpass = "${env.mysql.password}";
13 $dbport = "${env.mysql.port}";
14 $anonymous_key = "${env.anonymous_key}";
15 ?>
16 '';
17 };
18 webRoot = ./dmarc_reports;
19 apache = rec {
20 user = "wwwrun";
21 group = "wwwrun";
22 modules = [ "proxy_fcgi" ];
23 root = webRoot;
24 vhostConf = socket: ''
25 Alias /dmarc-reports "${root}"
26 <Directory "${root}">
27 DirectoryIndex index.html
28 <FilesMatch "\.php$">
29 SetHandler "proxy:unix:${socket}|fcgi://localhost"
30 </FilesMatch>
31
32 AllowOverride None
33 Options +FollowSymlinks
34
35 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
36 Use LDAPConnect
37 Require all granted
38 Require ldap-attribute uid=immae
39 </Directory>
40 '';
41 };
42 phpFpm = rec {
43 basedir = builtins.concatStringsSep ":"
44 [ webRoot config.secrets.fullPaths."webapps/tools-dmarc-reports.php" ];
45 pool = {
46 "listen.owner" = apache.user;
47 "listen.group" = apache.group;
48 "pm" = "ondemand";
49 "pm.max_children" = "60";
50 "pm.process_idle_timeout" = "60";
51
52 # Needed to avoid clashes in browser cookies (same domain)
53 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
54 };
55 phpEnv = {
56 SECRETS_FILE = config.secrets.fullPaths."webapps/tools-dmarc-reports.php";
57 };
58 };
59}
diff --git a/modules/private/websites/tools/tools/dokuwiki.nix b/modules/private/websites/tools/tools/dokuwiki.nix
deleted file mode 100644
index aee495a..0000000
--- a/modules/private/websites/tools/tools/dokuwiki.nix
+++ /dev/null
@@ -1,56 +0,0 @@
1{ lib, stdenv, dokuwiki, dokuwiki-plugins }:
2rec {
3 varDir = "/var/lib/dokuwiki";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 if [ ! -d ${varDir} ]; then
8 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
9 ${varDir}/animals
10 cp -a ${webRoot}/conf.dist ${varDir}/conf
11 cp -a ${webRoot}/data.dist ${varDir}/data
12 cp -a ${webRoot}/
13 chown -R ${apache.user}:${apache.user} ${varDir}/config ${varDir}/data
14 chmod -R 755 ${varDir}/config ${varDir}/data
15 fi
16 install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
17 '';
18 };
19 webRoot = dokuwiki.withPlugins (p: [ p.farmer p.todo ]);
20 apache = rec {
21 user = "wwwrun";
22 group = "wwwrun";
23 modules = [ "proxy_fcgi" ];
24 root = webRoot;
25 vhostConf = socket: ''
26 Alias /dokuwiki "${root}"
27 <Directory "${root}">
28 DirectoryIndex index.php
29 <FilesMatch "\.php$">
30 SetHandler "proxy:unix:${socket}|fcgi://localhost"
31 </FilesMatch>
32
33 AllowOverride All
34 Options +FollowSymlinks
35 Require all granted
36 </Directory>
37 '';
38 };
39 phpFpm = rec {
40 serviceDeps = [ "openldap.service" ];
41 basedir = builtins.concatStringsSep ":" (
42 [ webRoot varDir ] ++ webRoot.plugins);
43 pool = {
44 "listen.owner" = apache.user;
45 "listen.group" = apache.group;
46 "pm" = "ondemand";
47 "pm.max_children" = "60";
48 "pm.process_idle_timeout" = "60";
49
50 # Needed to avoid clashes in browser cookies (same domain)
51 "php_value[session.name]" = "DokuwikiPHPSESSID";
52 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
53 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
54 };
55 };
56}
diff --git a/modules/private/websites/tools/tools/grocy.nix b/modules/private/websites/tools/tools/grocy.nix
deleted file mode 100644
index 3c45261..0000000
--- a/modules/private/websites/tools/tools/grocy.nix
+++ /dev/null
@@ -1,48 +0,0 @@
1{ lib, stdenv, grocy }:
2rec {
3 varDir = "/var/lib/grocy";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
8 install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
9 '';
10 };
11 webRoot = grocy.webRoot;
12 apache = rec {
13 user = "wwwrun";
14 group = "wwwrun";
15 modules = [ "proxy_fcgi" ];
16 root = webRoot;
17 vhostConf = socket: ''
18 Alias /grocy "${root}"
19 <Directory "${root}">
20 DirectoryIndex index.php
21 <FilesMatch "\.php$">
22 SetHandler "proxy:unix:${socket}|fcgi://localhost"
23 </FilesMatch>
24
25 AllowOverride All
26 Options +FollowSymlinks
27 Require all granted
28 </Directory>
29 '';
30 };
31 phpFpm = rec {
32 basedir = builtins.concatStringsSep ":" (
33 [ grocy grocy.yarnModules varDir ]);
34 pool = {
35 "listen.owner" = apache.user;
36 "listen.group" = apache.group;
37 "pm" = "ondemand";
38 "pm.max_children" = "60";
39 "pm.process_idle_timeout" = "60";
40
41 # Needed to avoid clashes in browser cookies (same domain)
42 "php_value[session.name]" = "grocyPHPSESSID";
43 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
44 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
45 };
46 };
47}
48
diff --git a/modules/private/websites/tools/tools/kanboard.nix b/modules/private/websites/tools/tools/kanboard.nix
deleted file mode 100644
index 4809a42..0000000
--- a/modules/private/websites/tools/tools/kanboard.nix
+++ /dev/null
@@ -1,80 +0,0 @@
1{ env, kanboard, config }:
2rec {
3 varDir = "/var/lib/kanboard";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
8 install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
9 install -TDm644 ${webRoot}/dataold/.htaccess ${varDir}/data/.htaccess
10 install -TDm644 ${webRoot}/dataold/web.config ${varDir}/data/web.config
11 '';
12 };
13 keys."webapps/tools-kanboard" = {
14 user = apache.user;
15 group = apache.group;
16 permissions = "0400";
17 text = ''
18 <?php
19 define('MAIL_FROM', 'kanboard@tools.immae.eu');
20
21 define('DB_DRIVER', 'postgres');
22 define('DB_USERNAME', '${env.postgresql.user}');
23 define('DB_PASSWORD', '${env.postgresql.password}');
24 define('DB_HOSTNAME', '${env.postgresql.socket}');
25 define('DB_NAME', '${env.postgresql.database}');
26
27 define('DATA_DIR', '${varDir}');
28 define('LDAP_AUTH', true);
29 define('LDAP_SERVER', '${env.ldap.host}');
30 define('LDAP_START_TLS', true);
31
32 define('LDAP_BIND_TYPE', 'proxy');
33 define('LDAP_USERNAME', '${env.ldap.dn}');
34 define('LDAP_PASSWORD', '${env.ldap.password}');
35 define('LDAP_USER_BASE_DN', '${env.ldap.base}');
36 define('LDAP_USER_FILTER', '${env.ldap.filter}');
37 define('LDAP_GROUP_ADMIN_DN', '${env.ldap.admin_dn}');
38 ?>
39 '';
40 };
41 webRoot = kanboard { kanboard_config = config.secrets.fullPaths."webapps/tools-kanboard"; };
42 apache = rec {
43 user = "wwwrun";
44 group = "wwwrun";
45 modules = [ "proxy_fcgi" ];
46 root = webRoot;
47 vhostConf = socket: ''
48 Alias /kanboard "${root}"
49 <Directory "${root}">
50 DirectoryIndex index.php
51 AllowOverride All
52 Options FollowSymlinks
53 Require all granted
54
55 <FilesMatch "\.php$">
56 SetHandler "proxy:unix:${socket}|fcgi://localhost"
57 </FilesMatch>
58 </Directory>
59 <DirectoryMatch "${root}/data">
60 Require all denied
61 </DirectoryMatch>
62 '';
63 };
64 phpFpm = rec {
65 serviceDeps = [ "postgresql.service" "openldap.service" ];
66 basedir = builtins.concatStringsSep ":" [ webRoot varDir config.secrets.fullPaths."webapps/tools-kanboard" ];
67 pool = {
68 "listen.owner" = apache.user;
69 "listen.group" = apache.group;
70 "pm" = "ondemand";
71 "pm.max_children" = "60";
72 "pm.process_idle_timeout" = "60";
73
74 # Needed to avoid clashes in browser cookies (same domain)
75 "php_value[session.name]" = "KanboardPHPSESSID";
76 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
77 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
78 };
79 };
80}
diff --git a/modules/private/websites/tools/tools/landing.nix b/modules/private/websites/tools/tools/landing.nix
deleted file mode 100644
index 2acc323..0000000
--- a/modules/private/websites/tools/tools/landing.nix
+++ /dev/null
@@ -1,29 +0,0 @@
1{ sources, stdenv, yarn2nix-moretea }:
2let
3 yarnModules = yarn2nix-moretea.mkYarnModules rec {
4 name = "landing";
5 pname = name;
6 version = "v1.0.0";
7 packageJSON = "${sources.webapps-landing}/package.json";
8 yarnLock = "${sources.webapps-landing}/yarn.lock";
9 yarnNix = ./landing/yarn-packages.nix;
10 };
11in
12 stdenv.mkDerivation rec {
13 pname = "landing";
14 version = "v1.0.0";
15 src = sources.webapps-landing;
16
17 buildInputs = [ yarnModules yarn2nix-moretea.yarn ];
18 configurePhase = ''
19 ln -s ${yarnModules}/node_modules .
20 '';
21 buildPhase = ''
22 yarn build
23 '';
24 installPhase = ''
25 cp -a dist $out
26 cp ${./landing}/*.php $out/
27 ln -s service-worker.js $out/worker.js
28 '';
29 }
diff --git a/modules/private/websites/tools/tools/landing/ldap_password.php b/modules/private/websites/tools/tools/landing/ldap_password.php
deleted file mode 100644
index b6079e5..0000000
--- a/modules/private/websites/tools/tools/landing/ldap_password.php
+++ /dev/null
@@ -1,140 +0,0 @@
1<?php
2
3/**
4 * LDAP PHP Change Password Webpage
5 * @author: Matt Rude <http://mattrude.com>
6 * @website: http://technology.mattrude.com/2010/11/ldap-php-change-password-webpage/
7 *
8 *
9 * GNU GENERAL PUBLIC LICENSE
10 * Version 2, June 1991
11 *
12 * Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
13 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
14 * Everyone is permitted to copy and distribute verbatim copies
15 * of this license document, but changing it is not allowed.
16 */
17
18$message = array();
19$message_css = "";
20
21function changePassword($user,$oldPassword,$newPassword,$newPasswordCnf){
22 global $message;
23 global $message_css;
24
25 $server = "ldaps://ldap.immae.eu";
26
27 error_reporting(0);
28 $con = ldap_connect($server);
29 ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
30
31 $user_dn = "uid=$user,ou=users,dc=immae,dc=eu";
32
33 if (ldap_bind($con, $user_dn, $oldPassword) === false) {
34 $user_dn = "uid=$user,ou=group_users,dc=immae,dc=eu";
35 if (ldap_bind($con, $user_dn, $oldPassword) === false) {
36 $message[] = "Error E101 - Current Username or Password is wrong.";
37 return false;
38 }
39 }
40 if ($newPassword != $newPasswordCnf ) {
41 $message[] = "Error E102 - Your New passwords do not match!";
42 return false;
43 }
44 if (strlen($newPassword) < 6 ) {
45 $message[] = "Error E103 - Your new password is too short.<br/>Your password must be at least 6 characters long.";
46 return false;
47 }
48
49 $salt = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',4)),0,4);
50 $encoded_newPassword = "{SSHA}" . base64_encode(pack("H*", sha1($newPassword.$salt)).$salt);
51
52 $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)");
53 $auth_entry = ldap_first_entry($con, $user_search);
54
55 $mail_addresses = ldap_get_values($con, $auth_entry, "mail");
56 $given_names = ldap_get_values($con, $auth_entry, "givenName");
57 $mail_address = $mail_addresses[0];
58 $first_name = $given_names[0];
59
60 /* And Finally, Change the password */
61 $entry = array();
62 $entry["userPassword"] = "$encoded_newPassword";
63
64 if (ldap_modify($con,$user_dn,$entry) === false){
65 $error = ldap_error($con);
66 $errno = ldap_errno($con);
67 $message[] = "E201 - Your password cannot be changed, please contact the administrator.";
68 $message[] = "$errno - $error";
69 } else {
70 $message_css = "yes";
71 mail($mail_address,"Password change notice","Dear $first_name,
72Your password on https://tools.immae.eu/ldap_password.php for account $user was just changed.
73If you did not make this change, please contact me.
74If you were the one who changed your password, you may disregard this message.
75
76Thanks
77--
78Immae / Ismaël", "From: " . getenv("CONTACT_EMAIL"));
79 $message[] = "The password for $user has been changed.<br/>An informational email has been sent to $mail_address.<br/>Your new password is now fully active.";
80 }
81}
82
83?>
84<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
85<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
86<head>
87<title>Password Change Page</title>
88<meta name="viewport" content="width=device-width, initial-scale=1" />
89<link rel="stylesheet" href="https://assets.immae.eu/skeleton/2.0.4/skeleton.min.css" integrity="sha256-2YQRJMXD7pIAPHiXr0s+vlRWA7GYJEK0ARns7k2sbHY=" crossorigin="anonymous" />
90<style type="text/css">
91 body { font-family: Verdana,Arial,Courier New; margin: auto; }
92
93 .msg_yes { margin: 0 auto; text-align: center; color: green; background: #D4EAD4; border: 1px solid green; border-radius: 10px; margin: 2px; }
94 .msg_no { margin: 0 auto; text-align: center; color: red; background: #FFF0F0; border: 1px solid red; border-radius: 10px; margin: 2px; }
95</style>
96<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
97</head>
98<body>
99<div class="container">
100<form action="<?php print $_SERVER['PHP_SELF']; ?>" name="passwordChange" method="post">
101<h3>Password Change Page</h3>
102<?php
103if (isset($_POST["submitted"])) {
104 echo '<div class="row">';
105 changePassword($_POST['username'],$_POST['oldPassword'],$_POST['newPassword1'],$_POST['newPassword2']);
106 global $message_css;
107 if ($message_css == "yes") {
108 echo '<div class="msg_yes">';
109 } else {
110 echo '<div class="msg_no">';
111 $message[] = "Your password was not changed.";
112 }
113 foreach ( $message as $one ) { echo "<p>$one</p>"; }
114 ?></div></div><?php
115} ?>
116 <div class="row">
117 <div class="one-third column"><label for="username">Username</label></div>
118 <div class="two-thirds column"><input id="username" name="username" type="text" autocomplete="off" /></div>
119 </div>
120 <div class="row">
121 <div class="one-third column"><label for="oldPassword">Current password</label></div>
122 <div class="two-thirds column"><input id="oldPassword" name="oldPassword" type="password" /></div>
123 </div>
124 <div class="row">
125 <div class="one-third column"><label for="newPassword1">New password</label></div>
126 <div class="two-thirds column"><input id="newPassword1" name="newPassword1" type="password" /></div>
127 </div>
128 <div class="row">
129 <div class="one-third column"><label for="newPassword2">New password (again)</label></div>
130 <div class="two-thirds column"><input id="newPassword2" name="newPassword2" type="password" /></div>
131 </div>
132 <div class="row">
133 <div class="column">
134 <input name="submitted" type="submit" value="Change Password"/>
135 </div>
136 </div>
137</form>
138</div>
139</body>
140</html>
diff --git a/modules/private/websites/tools/tools/landing/ldap_ssh_keys.php b/modules/private/websites/tools/tools/landing/ldap_ssh_keys.php
deleted file mode 100644
index 259e28d..0000000
--- a/modules/private/websites/tools/tools/landing/ldap_ssh_keys.php
+++ /dev/null
@@ -1,348 +0,0 @@
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
3 <head>
4 <title>ImmaeEu Account</title>
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6 <meta name="viewport" content="width=device-width, initial-scale=1" />
7 <link rel="stylesheet" href="https://assets.immae.eu/skeleton/2.0.4/skeleton.min.css" integrity="sha256-2YQRJMXD7pIAPHiXr0s+vlRWA7GYJEK0ARns7k2sbHY=" crossorigin="anonymous" />
8 <style type="text/css">
9 body {
10 font-family: Verdana,Arial,Courier New;
11 margin: auto;
12 }
13 table#ssh_keys_list textarea {
14 width: 100%;
15 height: 100%;
16 }
17 table#ssh_keys_list tbody tr.sshkeyrow {
18 height: 130px;
19 }
20 table#ssh_keys_list tbody tr.headrow th {
21 border-bottom: 0px !important;
22 padding-bottom: 0px !important;
23 }
24 table#ssh_keys_list tbody tr.mainrow td:not(.delete-button) {
25 border-bottom: 0px !important;
26 padding-bottom: 0px !important;
27 }
28 table#ssh_keys_list td.sshkey {
29 min-width: 600px;
30 height: 100%;
31 padding-top: 0px !important;
32 }
33
34 table#ssh_keys_list td.comment {
35 min-width: 160px;
36 }
37
38 </style>
39 </head>
40 <body>
41 <div class="container">
42 <h1>Gestion des clés SSH</h1>
43<?php
44
45$connection = NULL;
46
47session_start();
48
49// Liste des applications gérées
50const apps = [
51 'git',
52 'pub',
53 'ftp',
54 'ssh',
55 'forward',
56];
57
58function checkSshKey($sshKey)
59{
60 $exploded = explode(' ', $sshKey);
61 if (count($exploded) != 2) {
62 return false;
63 }
64 if (!in_array($exploded[0], array('ssh-rsa', 'ssh-ed25519'))) {
65 return false;
66 }
67 $decoded = base64_decode($exploded[1], true);
68 if ($decoded === FALSE) {
69 return false;
70 }
71 $decoded = preg_replace("/[^\w\-]/","", (string) $decoded);
72 if (substr($decoded, 0, strlen($exploded[0])) !== $exploded[0]) {
73 return false;
74 }
75
76 return true;
77}
78
79function isUserLogged()
80{
81 return (isset($_SESSION["login"]) && doConnect() !== NULL);
82}
83
84function doConnect()
85{
86 global $connection;
87 $server = "ldaps://ldap.immae.eu";
88
89 if ($connection === NULL) {
90 $connection = ldap_connect($server);
91 ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, 3);
92 if (isset($_SESSION["user_dn"]) && isset($_SESSION["password"])) {
93 if (ldap_bind($connection, $_SESSION["user_dn"], $_SESSION["password"]) === false) {
94 $connection = NULL;
95 unset($_SESSION["user_dn"]);
96 unset($_SESSION["password"]);
97 unset($_SESSION["login"]);
98 }
99 }
100 }
101
102 return $connection;
103}
104
105function checkLogin($user, $password)
106{
107 $con = doConnect();
108
109 $user_dn = "uid=$user,ou=users,dc=immae,dc=eu";
110
111 if (ldap_bind($con, $user_dn, $password) === false) {
112 return false;
113 }
114 $_SESSION["user_dn"] = $user_dn;
115 $_SESSION["password"] = $password;
116
117 $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)");
118 $auth_entry = ldap_first_entry($con, $user_search);
119
120 return true;
121}
122
123function getLdapInfo()
124{
125 $con = doConnect();
126 if (!isset($_SESSION["user_dn"])) {
127 $sortieLdap = [];
128 } else {
129 $user_read = ldap_read($con, $_SESSION["user_dn"], "(objectclass=*)", array("uid","immaeSshKey"));
130 $user_entry = ldap_first_entry($con, $user_read);
131 $sortieLdap = ldap_get_values($con, $user_entry, "immaeSshKey");
132 unset($sortieLdap["count"]);
133 }
134
135 $keys = [];
136 foreach ($sortieLdap as $line) {
137 $exploded = explode(' ', $line);
138
139 $apps = explode('|', $exploded[0]);
140 $publicKey = $exploded[1] . ' ' . $exploded[2];
141
142 unset($exploded[0]);
143 unset($exploded[1]);
144 unset($exploded[2]);
145
146 $comment = implode(' ', $exploded);
147
148 $keys[] = [
149 'apps' => $apps,
150 'public_key' => $publicKey,
151 'comment' => $comment,
152 ];
153 }
154
155 return $keys;
156}
157
158function pushLdapInfos($keys)
159{
160 $con = doConnect();
161 if (!isset($_SESSION["user_dn"]))
162 return false;
163
164 return ldap_mod_replace($con, $_SESSION["user_dn"], array("immaeSshKey" => $keys));
165}
166
167
168// Script
169if (isset($_POST['deconnexion'])) {
170 $_SESSION = [];
171}
172
173if (isset($_POST['sauvegarder'])) {
174 $editedKeys = [];
175 $errors = false;
176 $keysToSave = [];
177 foreach($_POST['keys'] as $id => $key) {
178 $editedKeys[$id] = $key;
179 if (!checkSshKey($key['public_key'])) {
180 $editedKeys[$id]['error'] = true;
181 $errors = true;
182 }
183
184 if (!isset($key['apps'])) {
185 $editedKeys[$id]['apps'] = $key['apps'] = [];
186
187 }
188 foreach ($key['apps'] as $app) {
189 if (!in_array($app, apps)) {
190 die("integrity");
191 }
192 }
193
194 if (!isset($editedKeys[$id]['error']) || $editedKeys[$id]['error'] !== true) {
195 $keysToSave[] = implode('|', $key['apps']) . ' ' . $key['public_key'] . ' ' . $key['comment'];
196 }
197 }
198
199 if (!$errors) {
200 $successSave = pushLdapInfos($keysToSave);
201 }
202}
203
204$loginErrors = "";
205if (isset($_POST['login'])) {
206 if (empty($_POST['username']) || empty($_POST['password'])) {
207 $loginErrors = "Le nom d'utilisateur et le mot de passe sont requis.";
208 } elseif (!checkLogin($_POST['username'], $_POST['password'])) {
209 $loginErrors = "Identifiants incorrects.";
210 } else {
211 $_SESSION['login'] = $_POST['username'];
212 }
213}
214
215if (isUserLogged()) :
216 $keys = isset($editedKeys) ? $editedKeys : getLdapInfo();
217?>
218 <p>Connecté en tant que <b><?= $_SESSION['login']; ?></b></p>
219
220 <form method="post">
221 <input type="submit" name="deconnexion" value="Déconnexion">
222 </form>
223
224 <?php if (isset($successSave) && $successSave === true) : ?>
225 <p style="color: green;">Clés enregistrées avec succès.</p>
226 <?php endif; ?>
227
228 <form method="post">
229 <table id="ssh_keys_list">
230 <tbody>
231 <?php
232 foreach ($keys as $id => $sshKey) :
233 ?>
234 <tr class="headrow">
235 <th>Description</th>
236 <?php foreach (apps as $app) : ?>
237 <th><?= $app ?></th>
238 <?php endforeach; ?>
239 <th></th>
240 </tr>
241 <tr class="mainrow">
242 <td class="comment"><textarea name="keys[<?= $id ?>][comment]"><?= $sshKey['comment'] ?></textarea></td>
243 <?php
244 foreach (apps as $app) :
245 $checked = in_array($app, $sshKey['apps']);
246 ?>
247 <td><input type="checkbox" name="keys[<?= $id ?>][apps][]" value="<?= $app ?>"<?= $checked ? ' checked' : '' ?>></td>
248 <?php endforeach; ?>
249 <td class="delete-button" rowspan="2"><button class="delete">Suppr.</button></td>
250 </tr>
251 <tr class="sshkeyrow">
252 <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>
253 </tr>
254 <?php
255 endforeach;
256 ?>
257 </tbody>
258 </table>
259
260 <button id="add">Ajouter</button>
261
262 <hr>
263
264 <input type="submit" value="Sauvegarder" name="sauvegarder">
265 </form>
266 <script>
267 function deleteLine(element) {
268 element.addEventListener('click', function(e) {
269 e.preventDefault();
270 e.target.closest('tr').remove();
271 }, false);
272 }
273
274 var suppr = document.getElementsByClassName('delete');
275 var add = document.getElementById('add');
276 var list = document.querySelector('#ssh_keys_list > tbody');
277
278 for (var i = 0; i < suppr.length; i++) {
279 deleteLine(suppr[i]);
280 }
281
282 add.addEventListener('click', function (e) {
283 e.preventDefault();
284 i++;
285
286 var newLine = `
287 <tr class="headrow">
288 <th>Description</th>
289 <?php foreach (apps as $app) : ?>
290 <th><?= $app ?></th>
291 <?php endforeach; ?>
292 <th></th>
293 </tr>
294 <tr class="mainrow">
295 <td class="comment"><textarea name="keys[${i}][comment]"></textarea></td>
296 `;
297
298
299 <?php
300 foreach (apps as $app) :
301 ?>
302 newLine += `<td><input type="checkbox" name="keys[${i}][apps][]" value="<?= $app ?>"></td>`;
303 <?php endforeach; ?>
304
305 newLine += `<td class="delete-button" rowspan="2"><button class="delete" id="delete-${i}">Suppr.</button></td>
306 </tr>`;
307
308 newLine += `<tr class="sshkeyrow">
309 <td colspan="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name="keys[$[i}][public_key]"></textarea></td>
310 </tr>`;
311
312
313 list.insertAdjacentHTML('beforeend', newLine);
314
315 deleteLine(document.getElementById("delete-" + i));
316
317 }, false)
318 </script>
319<?php
320else:
321?>
322 <form action="" method="post">
323 <h2>Login</h2>
324
325 <?php
326 if (!empty($loginErrors)):
327 ?>
328 <p style="color: red;"><?= $loginErrors; ?></p>
329 <?php
330 endif;
331 ?>
332
333 <label for="username">Utilisateur :</label>
334 <input type="text" id="username" name="username"/>
335
336 <label for="password">Mot de passe :</label>
337 <input type="password" id="password" name="password"/>
338
339 <input type="submit" value="OK" name="login" />
340 </form>
341<?php
342endif;
343?>
344 </div>
345 </body>
346</html>
347
348
diff --git a/modules/private/websites/tools/tools/landing/report_csp_violation.php b/modules/private/websites/tools/tools/landing/report_csp_violation.php
deleted file mode 100644
index 30140b2..0000000
--- a/modules/private/websites/tools/tools/landing/report_csp_violation.php
+++ /dev/null
@@ -1,22 +0,0 @@
1<?php
2http_response_code(204);
3
4$dbconn = pg_connect(getenv("CSP_REPORT_URI")) or die();
5
6function _get(&$var, $default=null) {
7 return isset($var) ? $var : $default;
8}
9
10$json_data = file_get_contents('php://input');
11if ($json_data = json_decode($json_data, true)) {
12 $report = _get($json_data["csp-report"], Array());
13 $blocked_uri = _get($report["blocked-uri"], "");
14 $document_uri = _get($report["document-uri"], "");
15 $original_policy = _get($report["original-policy"], "");
16 $referrer = _get($report["referrer"], "");
17 $violated_directive = _get($report["violated-directive"], "");
18
19 $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');
20
21 pg_execute($dbconn, "insert_query", Array($blocked_uri, $document_uri, $original_policy, $referrer, $violated_directive));
22}
diff --git a/modules/private/websites/tools/tools/ldap.nix b/modules/private/websites/tools/tools/ldap.nix
deleted file mode 100644
index 2ca59f7..0000000
--- a/modules/private/websites/tools/tools/ldap.nix
+++ /dev/null
@@ -1,69 +0,0 @@
1{ lib, php, env, writeText, phpldapadmin, config }:
2rec {
3 activationScript = {
4 deps = [ "httpd" ];
5 text = ''
6 install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/phpldapadmin
7 '';
8 };
9 keys."webapps/tools-ldap" = {
10 user = apache.user;
11 group = apache.group;
12 permissions = "0400";
13 text = ''
14 <?php
15 $config->custom->appearance['show_clear_password'] = true;
16 $config->custom->appearance['hide_template_warning'] = true;
17 $config->custom->appearance['theme'] = "tango";
18 $config->custom->appearance['minimalMode'] = false;
19 $config->custom->appearance['tree'] = 'AJAXTree';
20
21 $servers = new Datastore();
22
23 $servers->newServer('ldap_pla');
24 $servers->setValue('server','name','Immae&#x2019;s LDAP');
25 $servers->setValue('server','host','ldaps://${env.ldap.host}');
26 $servers->setValue('login','auth_type','cookie');
27 $servers->setValue('login','bind_id','${env.ldap.dn}');
28 $servers->setValue('login','bind_pass','${env.ldap.password}');
29 $servers->setValue('appearance','pla_password_hash','ssha');
30 $servers->setValue('login','attr','uid');
31 $servers->setValue('login','fallback_dn',true);
32 '';
33 };
34 webRoot = phpldapadmin.override { config = config.secrets.fullPaths."webapps/tools-ldap"; };
35 apache = rec {
36 user = "wwwrun";
37 group = "wwwrun";
38 modules = [ "proxy_fcgi" ];
39 root = "${webRoot}/htdocs";
40 vhostConf = socket: ''
41 Alias /ldap "${root}"
42 <Directory "${root}">
43 DirectoryIndex index.php
44 <FilesMatch "\.php$">
45 SetHandler "proxy:unix:${socket}|fcgi://localhost"
46 </FilesMatch>
47
48 AllowOverride None
49 Require all granted
50 </Directory>
51 '';
52 };
53 phpFpm = rec {
54 serviceDeps = [ "openldap.service" ];
55 basedir = builtins.concatStringsSep ":" [ webRoot config.secrets.fullPaths."webapps/tools-ldap" ];
56 pool = {
57 "listen.owner" = apache.user;
58 "listen.group" = apache.group;
59 "pm" = "ondemand";
60 "pm.max_children" = "60";
61 "pm.process_idle_timeout" = "60";
62
63 # Needed to avoid clashes in browser cookies (same domain)
64 "php_value[session.name]" = "LdapPHPSESSID";
65 "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/phpldapadmin";
66 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/phpldapadmin";
67 };
68 };
69}
diff --git a/modules/private/websites/tools/tools/phpbb.nix b/modules/private/websites/tools/tools/phpbb.nix
deleted file mode 100644
index 77845c3..0000000
--- a/modules/private/websites/tools/tools/phpbb.nix
+++ /dev/null
@@ -1,55 +0,0 @@
1{ lib, phpbb, gnused }:
2rec {
3 varDir = "/var/lib/phpbb";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 if [ ! -d ${varDir} ]; then
8 install -m 0755 -o ${apache.user} -g ${apache.user} -d ${varDir}
9 cp -a ${phpbb}/vars/* ${varDir}
10 chown -R ${apache.user}:${apache.user} ${varDir}
11 fi
12 install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
13 '';
14 };
15 webRoot = phpbb;
16 apache = rec {
17 user = "wwwrun";
18 group = "wwwrun";
19 modules = [ "proxy_fcgi" ];
20 root = webRoot;
21 vhostConf = socket: ''
22 Alias /forum "${root}"
23 <Directory "${root}">
24 DirectoryIndex index.php
25 <FilesMatch "\.php$">
26 SetHandler "proxy:unix:${socket}|fcgi://localhost"
27 </FilesMatch>
28
29 AllowOverride All
30 Options FollowSymlinks
31 Require all granted
32 </Directory>
33 # add instal to the list after install
34 <LocationMatch "^/(cache|files|install|store)>
35 Require all denied
36 </LocationMatch>
37 '';
38 };
39 phpFpm = rec {
40 serviceDeps = [ "postgresql.service" ];
41 basedir = builtins.concatStringsSep ":" [ "/run/wrappers/bin/sendmail" phpbb varDir ];
42 pool = {
43 "listen.owner" = apache.user;
44 "listen.group" = apache.group;
45 "pm" = "ondemand";
46 "pm.max_children" = "60";
47 "pm.process_idle_timeout" = "60";
48
49 # Needed to avoid clashes in browser cookies (same domain)
50 "php_value[session.name]" = "PhpBBPHPSESSID";
51 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
52 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
53 };
54 };
55}
diff --git a/modules/private/websites/tools/tools/rompr.nix b/modules/private/websites/tools/tools/rompr.nix
deleted file mode 100644
index e80d6b2..0000000
--- a/modules/private/websites/tools/tools/rompr.nix
+++ /dev/null
@@ -1,72 +0,0 @@
1{ lib, env, rompr }:
2rec {
3 varDir = "/var/lib/rompr";
4 activationScript = ''
5 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
6 ${varDir}/prefs ${varDir}/albumart ${varDir}/phpSessions
7 '';
8 webRoot = rompr;
9 apache = rec {
10 user = "wwwrun";
11 group = "wwwrun";
12 modules = [ "headers" "mime" "proxy_fcgi" ];
13 root = webRoot;
14 vhostConf = socket: ''
15 Alias /rompr ${root}
16
17 <Directory ${root}>
18 Options Indexes FollowSymLinks
19 DirectoryIndex index.php
20 AllowOverride all
21 Require all granted
22 Order allow,deny
23 Allow from all
24 ErrorDocument 404 /rompr/404.php
25 AddType image/x-icon .ico
26
27 <FilesMatch "\.php$">
28 SetHandler "proxy:unix:${socket}|fcgi://localhost"
29 </FilesMatch>
30 </Directory>
31
32 <Directory ${root}/albumart/small>
33 Header Set Cache-Control "max-age=0, no-store"
34 Header Set Cache-Control "no-cache, must-revalidate"
35 </Directory>
36
37 <Directory ${root}/albumart/asdownloaded>
38 Header Set Cache-Control "max-age=0, no-store"
39 Header Set Cache-Control "no-cache, must-revalidate"
40 </Directory>
41
42 <LocationMatch "^/rompr">
43 Use LDAPConnect
44 Require ldap-group cn=users,cn=mpd,ou=services,dc=immae,dc=eu
45 </LocationMatch>
46 '';
47 };
48 phpFpm = rec {
49 basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
50 pool = {
51 "listen.owner" = apache.user;
52 "listen.group" = apache.group;
53 "pm" = "ondemand";
54 "pm.max_children" = "60";
55 "pm.process_idle_timeout" = "60";
56
57 # Needed to avoid clashes in browser cookies (same domain)
58 "php_value[session.name]" = "RomprPHPSESSID";
59 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
60 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
61 "php_flag[magic_quotes_gpc]" = "Off";
62 "php_flag[track_vars]" = "On";
63 "php_flag[register_globals]" = "Off";
64 "php_admin_flag[allow_url_fopen]" = "On";
65 "php_value[include_path]" = "${webRoot}";
66 "php_admin_value[upload_tmp_dir]" = "${varDir}/prefs";
67 "php_admin_value[post_max_size]" = "32M";
68 "php_admin_value[upload_max_filesize]" = "32M";
69 "php_admin_value[memory_limit]" = "256M";
70 };
71 };
72}
diff --git a/modules/private/websites/tools/tools/shaarli.nix b/modules/private/websites/tools/tools/shaarli.nix
deleted file mode 100644
index d128465..0000000
--- a/modules/private/websites/tools/tools/shaarli.nix
+++ /dev/null
@@ -1,66 +0,0 @@
1{ lib, env, stdenv, fetchurl, shaarli, config }:
2let
3 varDir = "/var/lib/shaarli";
4in rec {
5 activationScript = ''
6 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
7 ${varDir}/cache ${varDir}/pagecache ${varDir}/tmp ${varDir}/data \
8 ${varDir}/phpSessions
9 '';
10 webRoot = shaarli varDir;
11 apache = rec {
12 user = "wwwrun";
13 group = "wwwrun";
14 modules = [ "proxy_fcgi" "rewrite" "env" ];
15 root = webRoot;
16 vhostConf = socket: ''
17 Alias /Shaarli "${root}"
18
19 Include ${config.secrets.fullPaths."webapps/tools-shaarli"}
20 <Location /Shaarli>
21 Header set Access-Control-Allow-Origin "*"
22 Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
23 Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization, Client-Security-Token, Accept-Encoding"
24 </Location>
25 <Directory "${root}">
26 DirectoryIndex index.php index.htm index.html
27 Options Indexes FollowSymLinks MultiViews Includes
28 AllowOverride All
29 Require all granted
30 <FilesMatch "\.php$">
31 SetHandler "proxy:unix:${socket}|fcgi://localhost"
32 </FilesMatch>
33 </Directory>
34 '';
35 };
36 keys."webapps/tools-shaarli" = {
37 user = apache.user;
38 group = apache.group;
39 permissions = "0400";
40 text = ''
41 SetEnv SHAARLI_LDAP_PASSWORD "${env.ldap.password}"
42 SetEnv SHAARLI_LDAP_DN "${env.ldap.dn}"
43 SetEnv SHAARLI_LDAP_HOST "ldaps://${env.ldap.host}"
44 SetEnv SHAARLI_LDAP_BASE "${env.ldap.base}"
45 SetEnv SHAARLI_LDAP_FILTER "${env.ldap.filter}"
46 '';
47 };
48 phpFpm = rec {
49 serviceDeps = [ "openldap.service" ];
50 basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
51 pool = {
52 "listen.owner" = apache.user;
53 "listen.group" = apache.group;
54 "pm" = "ondemand";
55 "pm.max_children" = "60";
56 "pm.process_idle_timeout" = "60";
57
58 # Needed to avoid clashes in browser cookies (same domain)
59 "php_value[session.name]" = "ShaarliPHPSESSID";
60 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
61 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
62 "php_admin_value[upload_max_filesize]" = "200M";
63 "php_admin_value[post_max_size]" = "200M";
64 };
65 };
66}
diff --git a/modules/private/websites/tools/tools/ttrss.nix b/modules/private/websites/tools/tools/ttrss.nix
deleted file mode 100644
index 1dc99ed..0000000
--- a/modules/private/websites/tools/tools/ttrss.nix
+++ /dev/null
@@ -1,129 +0,0 @@
1{ php, env, ttrss, ttrss-plugins, config }:
2rec {
3 varDir = "/var/lib/ttrss";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
8 ${varDir}/lock ${varDir}/cache ${varDir}/feed-icons
9 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/cache/export/ \
10 ${varDir}/cache/feeds/ \
11 ${varDir}/cache/images/ \
12 ${varDir}/cache/js/ \
13 ${varDir}/cache/simplepie/ \
14 ${varDir}/cache/upload/
15 touch ${varDir}/feed-icons/index.html
16 install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/phpSessions
17 '';
18 };
19 keys."webapps/tools-ttrss" = {
20 user = apache.user;
21 group = apache.group;
22 permissions = "0400";
23 text = ''
24 <?php
25
26 define('PHP_EXECUTABLE', '${php}/bin/php');
27
28 define('LOCK_DIRECTORY', 'lock');
29 define('CACHE_DIR', 'cache');
30 define('ICONS_DIR', 'feed-icons');
31 define('ICONS_URL', 'feed-icons');
32 define('SELF_URL_PATH', 'https://tools.immae.eu/ttrss/');
33
34 define('MYSQL_CHARSET', 'UTF8');
35
36 define('DB_TYPE', 'pgsql');
37 define('DB_HOST', '${env.postgresql.socket}');
38 define('DB_USER', '${env.postgresql.user}');
39 define('DB_NAME', '${env.postgresql.database}');
40 define('DB_PASS', '${env.postgresql.password}');
41 define('DB_PORT', '${env.postgresql.port}');
42
43 define('AUTH_AUTO_CREATE', true);
44 define('AUTH_AUTO_LOGIN', true);
45
46 define('SINGLE_USER_MODE', false);
47
48 define('SIMPLE_UPDATE_MODE', false);
49 define('CHECK_FOR_UPDATES', true);
50
51 define('FORCE_ARTICLE_PURGE', 0);
52 define('SESSION_COOKIE_LIFETIME', 60*60*24*120);
53 define('ENABLE_GZIP_OUTPUT', false);
54
55 define('PLUGINS', 'auth_ldap, note, instances');
56
57 define('LOG_DESTINATION', ''');
58 define('CONFIG_VERSION', 26);
59
60
61 define('SPHINX_SERVER', 'localhost:9312');
62 define('SPHINX_INDEX', 'ttrss, delta');
63
64 define('ENABLE_REGISTRATION', false);
65 define('REG_NOTIFY_ADDRESS', 'ttrss@tools.immae.eu');
66 define('REG_MAX_USERS', 10);
67
68 define('SMTP_FROM_NAME', 'Tiny Tiny RSS');
69 define('SMTP_FROM_ADDRESS', 'ttrss@tools.immae.eu');
70 define('DIGEST_SUBJECT', '[tt-rss] New headlines for last 24 hours');
71
72 define('LDAP_AUTH_SERVER_URI', 'ldap://${env.ldap.host}:389/');
73 define('LDAP_AUTH_USETLS', TRUE);
74 define('LDAP_AUTH_ALLOW_UNTRUSTED_CERT', TRUE);
75 define('LDAP_AUTH_BASEDN', '${env.ldap.base}');
76 define('LDAP_AUTH_ANONYMOUSBEFOREBIND', FALSE);
77 define('LDAP_AUTH_SEARCHFILTER', '${env.ldap.filter}');
78
79 define('LDAP_AUTH_BINDDN', '${env.ldap.dn}');
80 define('LDAP_AUTH_BINDPW', '${env.ldap.password}');
81 define('LDAP_AUTH_LOGIN_ATTRIB', 'immaeTtrssLogin');
82
83 define('LDAP_AUTH_LOG_ATTEMPTS', FALSE);
84 define('LDAP_AUTH_DEBUG', FALSE);
85 '';
86 };
87 webRoot = (ttrss.override { ttrss_config = config.secrets.fullPaths."webapps/tools-ttrss"; }).withPlugins (p: [
88 p.auth_ldap p.ff_instagram p.tumblr_gdpr_ua
89 (p.af_feedmod.override { patched = true; })
90 (p.feediron.override { patched = true; })
91 ]);
92 apache = rec {
93 user = "wwwrun";
94 group = "wwwrun";
95 modules = [ "proxy_fcgi" ];
96 root = webRoot;
97 vhostConf = socket: ''
98 Alias /ttrss "${root}"
99 <Directory "${root}">
100 DirectoryIndex index.php
101 <FilesMatch "\.php$">
102 SetHandler "proxy:unix:${socket}|fcgi://localhost"
103 </FilesMatch>
104
105 AllowOverride All
106 Options FollowSymlinks
107 Require all granted
108 </Directory>
109 '';
110 };
111 phpFpm = rec {
112 serviceDeps = [ "postgresql.service" "openldap.service" ];
113 basedir = builtins.concatStringsSep ":" (
114 [ webRoot config.secrets.fullPaths."webapps/tools-ttrss" varDir ]
115 ++ webRoot.plugins);
116 pool = {
117 "listen.owner" = apache.user;
118 "listen.group" = apache.group;
119 "pm" = "ondemand";
120 "pm.max_children" = "60";
121 "pm.process_idle_timeout" = "60";
122
123 # Needed to avoid clashes in browser cookies (same domain)
124 "php_value[session.name]" = "TtrssPHPSESSID";
125 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
126 "php_admin_value[session.save_path]" = "${varDir}/phpSessions";
127 };
128 };
129}
diff --git a/modules/private/websites/tools/tools/wallabag.nix b/modules/private/websites/tools/tools/wallabag.nix
deleted file mode 100644
index 0ebdb0b..0000000
--- a/modules/private/websites/tools/tools/wallabag.nix
+++ /dev/null
@@ -1,142 +0,0 @@
1{ env, wallabag, mylibs, config }:
2rec {
3 varDir = "/var/lib/wallabag";
4 keys."webapps/tools-wallabag" = {
5 user = apache.user;
6 group = apache.group;
7 permissions = "0400";
8 text = ''
9 # This file is auto-generated during the composer install
10 parameters:
11 database_driver: pdo_pgsql
12 database_driver_class: Wallabag\CoreBundle\Doctrine\DBAL\Driver\CustomPostgreSQLDriver
13 database_host: ${env.postgresql.socket}
14 database_port: ${env.postgresql.port}
15 database_name: ${env.postgresql.database}
16 database_user: ${env.postgresql.user}
17 database_password: ${env.postgresql.password}
18 database_path: null
19 database_table_prefix: wallabag_
20 database_socket: null
21 database_charset: utf8
22 domain_name: https://tools.immae.eu/wallabag
23 mailer_transport: sendmail
24 mailer_host: 127.0.0.1
25 mailer_user: null
26 mailer_password: null
27 locale: fr
28 secret: ${env.secret}
29 twofactor_auth: true
30 twofactor_sender: wallabag@tools.immae.eu
31 fosuser_registration: false
32 fosuser_confirmation: true
33 from_email: wallabag@tools.immae.eu
34 rss_limit: 50
35 rabbitmq_host: localhost
36 rabbitmq_port: 5672
37 rabbitmq_user: guest
38 rabbitmq_password: guest
39 rabbitmq_prefetch_count: 10
40 redis_scheme: unix
41 redis_host: null
42 redis_port: null
43 redis_path: ${env.redis.socket}
44 redis_password: null
45 sites_credentials: { }
46 ldap_enabled: true
47 ldap_host: ${env.ldap.host}
48 ldap_port: 636
49 ldap_tls: false
50 ldap_ssl: true
51 ldap_bind_requires_dn: true
52 ldap_base: '${env.ldap.base}'
53 ldap_manager_dn: '${env.ldap.dn}'
54 ldap_manager_pw: ${env.ldap.password}
55 ldap_filter: '${env.ldap.filter}'
56 ldap_admin_filter: '${env.ldap.admin_filter}'
57 ldap_username_attribute: uid
58 ldap_email_attribute: mail
59 ldap_name_attribute: cn
60 ldap_enabled_attribute: null
61 services:
62 swiftmailer.mailer.default.transport:
63 class: Swift_SendmailTransport
64 arguments: ['/run/wrappers/bin/sendmail -bs']
65 '';
66 };
67 webappDir = wallabag.override { ldap = true; wallabag_config = config.secrets.fullPaths."webapps/tools-wallabag"; };
68 activationScript = ''
69 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
70 ${varDir}/var ${varDir}/data/db ${varDir}/assets/images
71 '';
72 webRoot = "${webappDir}/web";
73 # Domain migration: Table wallabag_entry contains whole
74 # https://tools.immae.eu/wallabag domain name in preview_picture
75 apache = rec {
76 user = "wwwrun";
77 group = "wwwrun";
78 modules = [ "proxy_fcgi" ];
79 root = webRoot;
80 vhostConf = socket: ''
81 Alias /wallabag "${root}"
82 <Directory "${root}">
83 AllowOverride None
84 Require all granted
85 # For OAuth (apps)
86 CGIPassAuth On
87
88 <FilesMatch "\.php$">
89 SetHandler "proxy:unix:${socket}|fcgi://localhost"
90 </FilesMatch>
91
92 <IfModule mod_rewrite.c>
93 Options -MultiViews
94 RewriteEngine On
95 RewriteCond %{REQUEST_FILENAME} !-f
96 RewriteRule ^(.*)$ app.php [QSA,L]
97 </IfModule>
98 </Directory>
99 <Directory "${root}/bundles">
100 <IfModule mod_rewrite.c>
101 RewriteEngine Off
102 </IfModule>
103 </Directory>
104 <Directory "${varDir}/assets">
105 AllowOverride None
106 Require all granted
107 </Directory>
108 '';
109 };
110 phpFpm = rec {
111 preStart = ''
112 if [ ! -f "${varDir}/currentWebappDir" -o \
113 ! -f "${varDir}/currentKey" -o \
114 "${webappDir}" != "$(cat ${varDir}/currentWebappDir 2>/dev/null)" ] \
115 || ! sha512sum -c --status ${varDir}/currentKey; then
116 pushd ${webappDir} > /dev/null
117 /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod cache:clear
118 rm -rf /var/lib/wallabag/var/cache/pro_
119 /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod doctrine:migrations:migrate --no-interaction
120 popd > /dev/null
121 echo -n "${webappDir}" > ${varDir}/currentWebappDir
122 sha512sum ${config.secrets.fullPaths."webapps/tools-wallabag"} > ${varDir}/currentKey
123 fi
124 '';
125 serviceDeps = [ "postgresql.service" "openldap.service" ];
126 basedir = builtins.concatStringsSep ":" [ webappDir config.secrets.fullPaths."webapps/tools-wallabag" varDir ];
127 pool = {
128 "listen.owner" = apache.user;
129 "listen.group" = apache.group;
130 "pm" = "dynamic";
131 "pm.max_children" = "60";
132 "pm.start_servers" = "2";
133 "pm.min_spare_servers" = "1";
134 "pm.max_spare_servers" = "10";
135
136 # Needed to avoid clashes in browser cookies (same domain)
137 "php_value[session.name]" = "WallabagPHPSESSID";
138 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/tmp";
139 "php_value[max_execution_time]" = "300";
140 };
141 };
142}
diff --git a/modules/private/websites/tools/tools/webhooks.nix b/modules/private/websites/tools/tools/webhooks.nix
deleted file mode 100644
index 785e22b..0000000
--- a/modules/private/websites/tools/tools/webhooks.nix
+++ /dev/null
@@ -1,17 +0,0 @@
1{ lib, env }:
2{
3 keys = lib.attrsets.mapAttrs' (k: v:
4 lib.nameValuePair "webapps/webhooks/${k}.php" {
5 user = "wwwrun";
6 group = "wwwrun";
7 permissions = "0400";
8 text = v;
9 }) env // {
10 "webapps/webhooks" = {
11 isDir = true;
12 user = "wwwrun";
13 group = "wwwrun";
14 permissions = "0500";
15 };
16 };
17}
diff --git a/modules/private/websites/tools/tools/ympd.nix b/modules/private/websites/tools/tools/ympd.nix
deleted file mode 100644
index 531b1a9..0000000
--- a/modules/private/websites/tools/tools/ympd.nix
+++ /dev/null
@@ -1,40 +0,0 @@
1{ env }:
2let
3 ympd = rec {
4 config = {
5 webPort = "localhost:${toString env.listenPort}";
6 host = env.mpd.host;
7 port = env.mpd.port;
8 };
9 apache = {
10 modules = [
11 "proxy_wstunnel"
12 ];
13 vhostConf = ''
14 <LocationMatch "^/mpd(?!/music.(mp3|ogg))">
15 Use LDAPConnect
16 Require ldap-group cn=users,cn=mpd,ou=services,dc=immae,dc=eu
17 </LocationMatch>
18
19 RedirectMatch permanent "^/mpd$" "/mpd/"
20 <Location "/mpd/">
21 ProxyPass http://${config.webPort}/
22 ProxyPassReverse http://${config.webPort}/
23 ProxyPreserveHost on
24 </Location>
25 <Location "/mpd/ws">
26 ProxyPass ws://${config.webPort}/ws
27 </Location>
28 <Location "/mpd/music.mp3">
29 ProxyPass unix:///run/mpd/mp3.sock|http://tools.immae.eu/mpd/mp3
30 ProxyPassReverse unix:///run/mpd/mp3.sock|http://tools.immae.eu/mpd/mp3
31 </Location>
32 <Location "/mpd/music.ogg">
33 ProxyPass unix:///run/mpd/ogg.sock|http://tools.immae.eu/mpd/ogg
34 ProxyPassReverse unix:///run/mpd/ogg.sock|http://tools.immae.eu/mpd/ogg
35 </Location>
36 '';
37 };
38 };
39in
40 ympd
diff --git a/modules/private/websites/tools/tools/yourls.nix b/modules/private/websites/tools/tools/yourls.nix
deleted file mode 100644
index 3717520..0000000
--- a/modules/private/websites/tools/tools/yourls.nix
+++ /dev/null
@@ -1,86 +0,0 @@
1{ env, yourls, yourls-plugins, config }:
2rec {
3 activationScript = {
4 deps = [ "httpd" ];
5 text = ''
6 install -m 0755 -o ${apache.user} -g ${apache.group} -d /var/lib/php/sessions/yourls
7 '';
8 };
9 keys."webapps/tools-yourls" = {
10 user = apache.user;
11 group = apache.group;
12 permissions = "0400";
13 text = ''
14 <?php
15 define( 'YOURLS_DB_USER', '${env.mysql.user}' );
16 define( 'YOURLS_DB_PASS', '${env.mysql.password}' );
17 define( 'YOURLS_DB_NAME', '${env.mysql.database}' );
18 define( 'YOURLS_DB_HOST', '${env.mysql.host}' );
19 define( 'YOURLS_DB_PREFIX', 'yourls_' );
20 define( 'YOURLS_SITE', 'https://tools.immae.eu/url' );
21 define( 'YOURLS_HOURS_OFFSET', 0 );
22 define( 'YOURLS_LANG', ''' );
23 define( 'YOURLS_UNIQUE_URLS', true );
24 define( 'YOURLS_PRIVATE', true );
25 define( 'YOURLS_COOKIEKEY', '${env.cookieKey}' );
26 $yourls_user_passwords = array();
27 define( 'YOURLS_DEBUG', false );
28 define( 'YOURLS_URL_CONVERT', 36 );
29 $yourls_reserved_URL = array();
30 define( 'LDAPAUTH_HOST', 'ldaps://${env.ldap.host}' );
31 define( 'LDAPAUTH_PORT', '636' );
32 define( 'LDAPAUTH_BASE', '${env.ldap.base}' );
33 define( 'LDAPAUTH_SEARCH_USER', '${env.ldap.dn}' );
34 define( 'LDAPAUTH_SEARCH_PASS', '${env.ldap.password}' );
35
36 define( 'LDAPAUTH_GROUP_ATTR', 'memberof' );
37 define( 'LDAPAUTH_GROUP_REQ', 'cn=admin,cn=yourls,ou=services,dc=immae,dc=eu');
38
39 define( 'LDAPAUTH_USERCACHE_TYPE', 0);
40 '';
41 };
42 webRoot = (yourls.override { yourls_config = config.secrets.fullPaths."webapps/tools-yourls"; }).withPlugins (p: [p.ldap]);
43 apache = rec {
44 user = "wwwrun";
45 group = "wwwrun";
46 modules = [ "proxy_fcgi" ];
47 root = webRoot;
48 vhostConf = socket: ''
49 Alias /url "${root}"
50 <Directory "${root}">
51 <FilesMatch "\.php$">
52 SetHandler "proxy:unix:${socket}|fcgi://localhost"
53 </FilesMatch>
54
55 AllowOverride None
56 Require all granted
57 <IfModule mod_rewrite.c>
58 RewriteEngine On
59 RewriteBase /url/
60 RewriteCond %{REQUEST_FILENAME} !-f
61 RewriteCond %{REQUEST_FILENAME} !-d
62 RewriteRule ^.*$ /url/yourls-loader.php [L]
63 </IfModule>
64 DirectoryIndex index.php
65 </Directory>
66 '';
67 };
68 phpFpm = rec {
69 serviceDeps = [ "mysql.service" "openldap.service" ];
70 basedir = builtins.concatStringsSep ":" (
71 [ webRoot config.secrets.fullPaths."webapps/tools-yourls" ]
72 ++ webRoot.plugins);
73 pool = {
74 "listen.owner" = apache.user;
75 "listen.group" = apache.group;
76 "pm" = "ondemand";
77 "pm.max_children" = "60";
78 "pm.process_idle_timeout" = "60";
79
80 # Needed to avoid clashes in browser cookies (same domain)
81 "php_value[session.name]" = "YourlsPHPSESSID";
82 "php_admin_value[open_basedir]" = "${basedir}:/tmp:/var/lib/php/sessions/yourls";
83 "php_admin_value[session.save_path]" = "/var/lib/php/sessions/yourls";
84 };
85 };
86}
diff --git a/modules/private/websites/tools/vpn/default.nix b/modules/private/websites/tools/vpn/default.nix
deleted file mode 100644
index 9cd499b..0000000
--- a/modules/private/websites/tools/vpn/default.nix
+++ /dev/null
@@ -1,13 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.vpn;
4in {
5 config = lib.mkIf cfg.enable {
6 services.websites.env.tools.vhostConfs.vpn = {
7 certName = "eldiron";
8 addToCerts = true;
9 hosts = [ "vpn.immae.eu" ];
10 root = ./www;
11 };
12 };
13}
diff --git a/modules/webapps/diaspora.nix b/modules/webapps/diaspora.nix
deleted file mode 100644
index d9e9989..0000000
--- a/modules/webapps/diaspora.nix
+++ /dev/null
@@ -1,173 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 name = "diaspora";
4 cfg = config.services.diaspora;
5
6 uid = config.ids.uids.diaspora;
7 gid = config.ids.gids.diaspora;
8in
9{
10 options.services.diaspora = {
11 enable = lib.mkEnableOption "Enable Diaspora’s service";
12 user = lib.mkOption {
13 type = lib.types.str;
14 default = name;
15 description = "User account under which Diaspora runs";
16 };
17 group = lib.mkOption {
18 type = lib.types.str;
19 default = name;
20 description = "Group under which Diaspora runs";
21 };
22 adminEmail = lib.mkOption {
23 type = lib.types.str;
24 example = "admin@example.com";
25 description = "Admin e-mail for Diaspora";
26 };
27 dataDir = lib.mkOption {
28 type = lib.types.path;
29 default = "/var/lib/${name}";
30 description = ''
31 The directory where Diaspora stores its data.
32 '';
33 };
34 socketsDir = lib.mkOption {
35 type = lib.types.path;
36 default = "/run/${name}";
37 description = ''
38 The directory where Diaspora puts runtime files and sockets.
39 '';
40 };
41 configDir = lib.mkOption {
42 type = lib.types.path;
43 description = ''
44 The configuration path for Diaspora.
45 '';
46 };
47 package = lib.mkOption {
48 type = lib.types.package;
49 default = pkgs.webapps.diaspora;
50 description = ''
51 Diaspora package to use.
52 '';
53 };
54 # Output variables
55 systemdStateDirectory = lib.mkOption {
56 type = lib.types.str;
57 # Use ReadWritePaths= instead if varDir is outside of /var/lib
58 default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
59 lib.strings.removePrefix "/var/lib/" cfg.dataDir;
60 description = ''
61 Adjusted Diaspora data directory for systemd
62 '';
63 readOnly = true;
64 };
65 systemdRuntimeDirectory = lib.mkOption {
66 type = lib.types.str;
67 # Use ReadWritePaths= instead if socketsDir is outside of /run
68 default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
69 lib.strings.removePrefix "/run/" cfg.socketsDir;
70 description = ''
71 Adjusted Diaspora sockets directory for systemd
72 '';
73 readOnly = true;
74 };
75 workdir = lib.mkOption {
76 type = lib.types.package;
77 default = cfg.package.override {
78 varDir = cfg.dataDir;
79 podmin_email = cfg.adminEmail;
80 config_dir = cfg.configDir;
81 };
82 description = ''
83 Adjusted diaspora package with overriden values
84 '';
85 readOnly = true;
86 };
87 sockets = lib.mkOption {
88 type = lib.types.attrsOf lib.types.path;
89 default = {
90 rails = "${cfg.socketsDir}/diaspora.sock";
91 eye = "${cfg.socketsDir}/eye.sock";
92 };
93 readOnly = true;
94 description = ''
95 Diaspora sockets
96 '';
97 };
98 pids = lib.mkOption {
99 type = lib.types.attrsOf lib.types.path;
100 default = {
101 eye = "${cfg.socketsDir}/eye.pid";
102 };
103 readOnly = true;
104 description = ''
105 Diaspora pids
106 '';
107 };
108 };
109
110 config = lib.mkIf cfg.enable {
111 users.users = lib.optionalAttrs (cfg.user == name) {
112 "${name}" = {
113 inherit uid;
114 group = cfg.group;
115 description = "Diaspora user";
116 home = cfg.dataDir;
117 packages = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby ];
118 useDefaultShell = true;
119 };
120 };
121 users.groups = lib.optionalAttrs (cfg.group == name) {
122 "${name}" = {
123 inherit gid;
124 };
125 };
126
127 systemd.services.diaspora = {
128 description = "Diaspora";
129 wantedBy = [ "multi-user.target" ];
130 after = [
131 "network.target" "redis.service" "postgresql.service"
132 ];
133 wants = [
134 "redis.service" "postgresql.service"
135 ];
136
137 environment.RAILS_ENV = "production";
138 environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
139 environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
140 environment.EYE_SOCK = cfg.sockets.eye;
141 environment.EYE_PID = cfg.pids.eye;
142
143 path = [ cfg.workdir.gems pkgs.nodejs cfg.workdir.gems.ruby pkgs.curl pkgs.which pkgs.gawk ];
144
145 preStart = ''
146 install -m 0755 -d ${cfg.dataDir}/uploads ${cfg.dataDir}/tmp ${cfg.dataDir}/log
147 install -m 0700 -d ${cfg.dataDir}/tmp/pids
148 if [ ! -f ${cfg.dataDir}/schedule.yml ]; then
149 echo "{}" > ${cfg.dataDir}/schedule.yml
150 fi
151 ./bin/bundle exec rails db:migrate
152 '';
153
154 script = ''
155 exec ${cfg.workdir}/script/server
156 '';
157
158 serviceConfig = {
159 User = cfg.user;
160 PrivateTmp = true;
161 Restart = "always";
162 Type = "simple";
163 WorkingDirectory = cfg.workdir;
164 StateDirectory = cfg.systemdStateDirectory;
165 RuntimeDirectory = cfg.systemdRuntimeDirectory;
166 StandardInput = "null";
167 KillMode = "control-group";
168 };
169
170 unitConfig.RequiresMountsFor = cfg.dataDir;
171 };
172 };
173}
diff --git a/modules/webapps/etherpad-lite.nix b/modules/webapps/etherpad-lite.nix
deleted file mode 100644
index 2e09952..0000000
--- a/modules/webapps/etherpad-lite.nix
+++ /dev/null
@@ -1,162 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 name = "etherpad-lite";
4 cfg = config.services.etherpad-lite;
5
6 uid = config.ids.uids.etherpad-lite;
7 gid = config.ids.gids.etherpad-lite;
8in
9{
10 options.services.etherpad-lite = {
11 enable = lib.mkEnableOption "Enable Etherpad lite’s service";
12 user = lib.mkOption {
13 type = lib.types.str;
14 default = name;
15 description = "User account under which Etherpad lite runs";
16 };
17 group = lib.mkOption {
18 type = lib.types.str;
19 default = name;
20 description = "Group under which Etherpad lite runs";
21 };
22 dataDir = lib.mkOption {
23 type = lib.types.path;
24 default = "/var/lib/${name}";
25 description = ''
26 The directory where Etherpad lite stores its data.
27 '';
28 };
29 socketsDir = lib.mkOption {
30 type = lib.types.path;
31 default = "/run/${name}";
32 description = ''
33 The directory where Etherpad lite stores its sockets.
34 '';
35 };
36 configFile = lib.mkOption {
37 type = lib.types.path;
38 description = ''
39 The config file path for Etherpad lite.
40 '';
41 };
42 sessionKeyFile = lib.mkOption {
43 type = lib.types.path;
44 description = ''
45 The Session key file path for Etherpad lite.
46 '';
47 };
48 apiKeyFile = lib.mkOption {
49 type = lib.types.path;
50 description = ''
51 The API key file path for Etherpad lite.
52 '';
53 };
54 package = lib.mkOption {
55 type = lib.types.package;
56 default = pkgs.webapps.etherpad-lite;
57 description = ''
58 Etherpad lite package to use.
59 '';
60 example = lib.literalExample ''
61 pkgs.webapps.etherpad-lite.withModules (p: [ p.ep_align ]);
62 '';
63 };
64 modules = lib.mkOption {
65 type = lib.types.listOf lib.types.package;
66 default = [];
67 description = ''
68 Etherpad lite modules to use.
69 DEPRECATED: use package directly
70 '';
71 };
72 # Output variables
73 workdir = lib.mkOption {
74 type = lib.types.package;
75 default = cfg.package.withModules (_: cfg.modules);
76 description = ''
77 Adjusted Etherpad lite package with plugins
78 '';
79 readOnly = true;
80 };
81 systemdStateDirectory = lib.mkOption {
82 type = lib.types.str;
83 # Use ReadWritePaths= instead if varDir is outside of /var/lib
84 default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
85 lib.strings.removePrefix "/var/lib/" cfg.dataDir;
86 description = ''
87 Adjusted Etherpad lite data directory for systemd
88 '';
89 readOnly = true;
90 };
91 systemdRuntimeDirectory = lib.mkOption {
92 type = lib.types.str;
93 # Use ReadWritePaths= instead if socketsDir is outside of /run
94 default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
95 lib.strings.removePrefix "/run/" cfg.socketsDir;
96 description = ''
97 Adjusted Etherpad lite sockets directory for systemd
98 '';
99 readOnly = true;
100 };
101 sockets = lib.mkOption {
102 type = lib.types.attrsOf lib.types.path;
103 default = {
104 node = "${cfg.socketsDir}/etherpad-lite.sock";
105 };
106 readOnly = true;
107 description = ''
108 Etherpad lite sockets
109 '';
110 };
111 };
112
113 config = lib.mkIf cfg.enable {
114 systemd.services.etherpad-lite = {
115 description = "Etherpad-lite";
116 wantedBy = [ "multi-user.target" ];
117 after = [ "network.target" "postgresql.service" ];
118 wants = [ "postgresql.service" ];
119
120 environment.NODE_ENV = "production";
121 environment.HOME = cfg.workdir;
122
123 path = [ pkgs.nodejs ];
124
125 script = ''
126 exec ${pkgs.nodejs}/bin/node ${cfg.workdir}/src/node/server.js \
127 --sessionkey ${cfg.sessionKeyFile} \
128 --apikey ${cfg.apiKeyFile} \
129 --settings ${cfg.configFile}
130 '';
131
132 postStart = ''
133 while [ ! -S ${cfg.sockets.node} ]; do
134 sleep 0.5
135 done
136 chmod a+w ${cfg.sockets.node}
137 '';
138 serviceConfig = {
139 DynamicUser = true;
140 User = cfg.user;
141 Group = cfg.group;
142 WorkingDirectory = cfg.workdir;
143 PrivateTmp = true;
144 NoNewPrivileges = true;
145 PrivateDevices = true;
146 ProtectHome = true;
147 ProtectControlGroups = true;
148 ProtectKernelModules = true;
149 Restart = "always";
150 Type = "simple";
151 TimeoutSec = 60;
152 RuntimeDirectory = cfg.systemdRuntimeDirectory;
153 StateDirectory= cfg.systemdStateDirectory;
154 ExecStartPre = [
155 "+${pkgs.coreutils}/bin/install -d -m 0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dataDir}/ep_initialized"
156 "+${pkgs.coreutils}/bin/chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir} ${cfg.configFile} ${cfg.sessionKeyFile} ${cfg.apiKeyFile}"
157 ];
158 };
159 };
160
161 };
162}
diff --git a/modules/webapps/mastodon.nix b/modules/webapps/mastodon.nix
deleted file mode 100644
index df2dbb2..0000000
--- a/modules/webapps/mastodon.nix
+++ /dev/null
@@ -1,265 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 name = "mastodon";
4 cfg = config.services.mastodon;
5
6 uid = config.ids.uids.mastodon;
7 gid = config.ids.gids.mastodon;
8in
9{
10 options.services.mastodon = {
11 enable = lib.mkEnableOption "Enable Mastodon’s service";
12 user = lib.mkOption {
13 type = lib.types.str;
14 default = name;
15 description = "User account under which Mastodon runs";
16 };
17 group = lib.mkOption {
18 type = lib.types.str;
19 default = name;
20 description = "Group under which Mastodon runs";
21 };
22 dataDir = lib.mkOption {
23 type = lib.types.path;
24 default = "/var/lib/${name}";
25 description = ''
26 The directory where Mastodon stores its data.
27 '';
28 };
29 socketsPrefix = lib.mkOption {
30 type = lib.types.str;
31 default = "live";
32 description = ''
33 The prefix to use for Mastodon sockets.
34 '';
35 };
36 socketsDir = lib.mkOption {
37 type = lib.types.path;
38 default = "/run/${name}";
39 description = ''
40 The directory where Mastodon puts runtime files and sockets.
41 '';
42 };
43 configFile = lib.mkOption {
44 type = lib.types.path;
45 description = ''
46 The configuration file path for Mastodon.
47 '';
48 };
49 package = lib.mkOption {
50 type = lib.types.package;
51 default = pkgs.webapps.mastodon;
52 description = ''
53 Mastodon package to use.
54 '';
55 };
56 # Output variables
57 workdir = lib.mkOption {
58 type = lib.types.package;
59 default = cfg.package.override { varDir = cfg.dataDir; };
60 description = ''
61 Adjusted mastodon package with overriden varDir
62 '';
63 readOnly = true;
64 };
65 systemdStateDirectory = lib.mkOption {
66 type = lib.types.str;
67 # Use ReadWritePaths= instead if varDir is outside of /var/lib
68 default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
69 lib.strings.removePrefix "/var/lib/" cfg.dataDir;
70 description = ''
71 Adjusted Mastodon data directory for systemd
72 '';
73 readOnly = true;
74 };
75 systemdRuntimeDirectory = lib.mkOption {
76 type = lib.types.str;
77 # Use ReadWritePaths= instead if socketsDir is outside of /run
78 default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
79 lib.strings.removePrefix "/run/" cfg.socketsDir;
80 description = ''
81 Adjusted Mastodon sockets directory for systemd
82 '';
83 readOnly = true;
84 };
85 sockets = lib.mkOption {
86 type = lib.types.attrsOf lib.types.path;
87 default = {
88 node = "${cfg.socketsDir}/${cfg.socketsPrefix}_node.sock";
89 rails = "${cfg.socketsDir}/${cfg.socketsPrefix}_puma.sock";
90 };
91 readOnly = true;
92 description = ''
93 Mastodon sockets
94 '';
95 };
96 };
97
98 config = lib.mkIf cfg.enable {
99 users.users = lib.optionalAttrs (cfg.user == name) {
100 "${name}" = {
101 inherit uid;
102 group = cfg.group;
103 description = "Mastodon user";
104 home = cfg.dataDir;
105 useDefaultShell = true;
106 };
107 };
108 users.groups = lib.optionalAttrs (cfg.group == name) {
109 "${name}" = {
110 inherit gid;
111 };
112 };
113
114 systemd.slices.mastodon = {
115 description = "Mastodon slice";
116 };
117
118 systemd.services.mastodon-streaming = {
119 description = "Mastodon Streaming";
120 wantedBy = [ "multi-user.target" ];
121 after = [ "network.target" "mastodon-web.service" ];
122
123 environment.NODE_ENV = "production";
124 environment.SOCKET = cfg.sockets.node;
125
126 path = [ pkgs.nodejs pkgs.bashInteractive ];
127
128 script = ''
129 exec npm run start
130 '';
131
132 postStart = ''
133 while [ ! -S $SOCKET ]; do
134 sleep 0.5
135 done
136 chmod a+w $SOCKET
137 '';
138
139 postStop = ''
140 rm $SOCKET
141 '';
142
143 serviceConfig = {
144 Slice = "mastodon.slice";
145 User = cfg.user;
146 EnvironmentFile = cfg.configFile;
147 PrivateTmp = true;
148 Restart = "always";
149 TimeoutSec = 15;
150 Type = "simple";
151 WorkingDirectory = cfg.workdir;
152 StateDirectory = cfg.systemdStateDirectory;
153 RuntimeDirectory = cfg.systemdRuntimeDirectory;
154 RuntimeDirectoryPreserve = "yes";
155 };
156
157 unitConfig.RequiresMountsFor = cfg.dataDir;
158 };
159
160 systemd.services.mastodon-web = {
161 description = "Mastodon Web app";
162 wantedBy = [ "multi-user.target" ];
163 after = [ "network.target" ];
164
165 environment.RAILS_ENV = "production";
166 environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
167 environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
168 environment.SOCKET = cfg.sockets.rails;
169
170 path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file pkgs.imagemagick ];
171
172 preStart = ''
173 install -m 0755 -d ${cfg.dataDir}/tmp/cache
174 ./bin/bundle exec rails db:migrate
175 '';
176
177 script = ''
178 exec ./bin/bundle exec puma -C config/puma.rb
179 '';
180
181 postStart = ''
182 exec ./bin/tootctl cache clear
183 '';
184 serviceConfig = {
185 Slice = "mastodon.slice";
186 User = cfg.user;
187 EnvironmentFile = cfg.configFile;
188 PrivateTmp = true;
189 Restart = "always";
190 TimeoutSec = 60;
191 Type = "simple";
192 WorkingDirectory = cfg.workdir;
193 StateDirectory = cfg.systemdStateDirectory;
194 RuntimeDirectory = cfg.systemdRuntimeDirectory;
195 RuntimeDirectoryPreserve = "yes";
196 };
197
198 unitConfig.RequiresMountsFor = cfg.dataDir;
199 };
200
201 systemd.services.mastodon-cleanup = {
202 description = "Cleanup mastodon";
203 startAt = "daily";
204 restartIfChanged = false;
205
206 environment.RAILS_ENV = "production";
207 environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
208 environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
209 environment.SOCKET = cfg.sockets.rails;
210
211 path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ];
212
213 script = ''
214 exec ./bin/tootctl media remove --days 30
215 '';
216
217 serviceConfig = {
218 User = cfg.user;
219 EnvironmentFile = cfg.configFile;
220 PrivateTmp = true;
221 Type = "oneshot";
222 WorkingDirectory = cfg.workdir;
223 StateDirectory = cfg.systemdStateDirectory;
224 RuntimeDirectory = cfg.systemdRuntimeDirectory;
225 RuntimeDirectoryPreserve = "yes";
226 };
227
228 unitConfig.RequiresMountsFor = cfg.dataDir;
229 };
230
231 systemd.services.mastodon-sidekiq = {
232 description = "Mastodon Sidekiq";
233 wantedBy = [ "multi-user.target" ];
234 after = [ "network.target" "mastodon-web.service" ];
235
236 environment.RAILS_ENV="production";
237 environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}";
238 environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile";
239 environment.DB_POOL="5";
240
241 path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.imagemagick pkgs.ffmpeg pkgs.file ];
242
243 script = ''
244 exec ./bin/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push
245 '';
246
247 serviceConfig = {
248 Slice = "mastodon.slice";
249 User = cfg.user;
250 EnvironmentFile = cfg.configFile;
251 PrivateTmp = true;
252 Restart = "always";
253 TimeoutSec = 15;
254 Type = "simple";
255 WorkingDirectory = cfg.workdir;
256 StateDirectory = cfg.systemdStateDirectory;
257 RuntimeDirectory = cfg.systemdRuntimeDirectory;
258 RuntimeDirectoryPreserve = "yes";
259 };
260
261 unitConfig.RequiresMountsFor = cfg.dataDir;
262 };
263
264 };
265}
diff --git a/modules/webapps/mediagoblin.nix b/modules/webapps/mediagoblin.nix
deleted file mode 100644
index 3fe5e38..0000000
--- a/modules/webapps/mediagoblin.nix
+++ /dev/null
@@ -1,231 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 name = "mediagoblin";
4 cfg = config.services.mediagoblin;
5
6 uid = config.ids.uids.mediagoblin;
7 gid = config.ids.gids.mediagoblin;
8
9 paste_local = pkgs.writeText "paste_local.ini" ''
10 [DEFAULT]
11 debug = false
12
13 [pipeline:main]
14 pipeline = mediagoblin
15
16 [app:mediagoblin]
17 use = egg:mediagoblin#app
18 config = ${cfg.configFile} ${cfg.package}/mediagoblin.ini
19 /mgoblin_static = ${cfg.package}/mediagoblin/static
20
21 [loggers]
22 keys = root
23
24 [handlers]
25 keys = console
26
27 [formatters]
28 keys = generic
29
30 [logger_root]
31 level = INFO
32 handlers = console
33
34 [handler_console]
35 class = StreamHandler
36 args = (sys.stderr,)
37 level = NOTSET
38 formatter = generic
39
40 [formatter_generic]
41 format = %(levelname)-7.7s [%(name)s] %(message)s
42
43 [filter:errors]
44 use = egg:mediagoblin#errors
45 debug = false
46
47 [server:main]
48 use = egg:waitress#main
49 unix_socket = ${cfg.sockets.paster}
50 unix_socket_perms = 777
51 url_scheme = https
52 '';
53in
54{
55 options.services.mediagoblin = {
56 enable = lib.mkEnableOption "Enable Mediagoblin’s service";
57 user = lib.mkOption {
58 type = lib.types.str;
59 default = name;
60 description = "User account under which Mediagoblin runs";
61 };
62 group = lib.mkOption {
63 type = lib.types.str;
64 default = name;
65 description = "Group under which Mediagoblin runs";
66 };
67 dataDir = lib.mkOption {
68 type = lib.types.path;
69 default = "/var/lib/${name}";
70 description = ''
71 The directory where Mediagoblin stores its data.
72 '';
73 };
74 socketsDir = lib.mkOption {
75 type = lib.types.path;
76 default = "/run/${name}";
77 description = ''
78 The directory where Mediagoblin puts runtime files and sockets.
79 '';
80 };
81 configFile = lib.mkOption {
82 type = lib.types.path;
83 description = ''
84 The configuration file path for Mediagoblin.
85 '';
86 };
87 package = lib.mkOption {
88 type = lib.types.package;
89 default = pkgs.webapps.mediagoblin;
90 example = lib.literalExample ''
91 pkgs.webapps.mediagoblin.withPlugins (p: [p.basicsearch])
92 '';
93 description = ''
94 Mediagoblin package to use.
95 '';
96 };
97 systemdStateDirectory = lib.mkOption {
98 type = lib.types.str;
99 # Use ReadWritePaths= instead if varDir is outside of /var/lib
100 default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir;
101 lib.strings.removePrefix "/var/lib/" cfg.dataDir;
102 description = ''
103 Adjusted Mediagoblin data directory for systemd
104 '';
105 readOnly = true;
106 };
107 systemdRuntimeDirectory = lib.mkOption {
108 type = lib.types.str;
109 # Use ReadWritePaths= instead if socketsDir is outside of /run
110 default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir;
111 lib.strings.removePrefix "/run/" cfg.socketsDir;
112 description = ''
113 Adjusted Mediagoblin sockets directory for systemd
114 '';
115 readOnly = true;
116 };
117 sockets = lib.mkOption {
118 type = lib.types.attrsOf lib.types.path;
119 default = {
120 paster = "${cfg.socketsDir}/mediagoblin.sock";
121 };
122 readOnly = true;
123 description = ''
124 Mediagoblin sockets
125 '';
126 };
127 pids = lib.mkOption {
128 type = lib.types.attrsOf lib.types.path;
129 default = {
130 paster = "${cfg.socketsDir}/mediagoblin.pid";
131 celery = "${cfg.socketsDir}/mediagoblin-celeryd.pid";
132 };
133 readOnly = true;
134 description = ''
135 Mediagoblin pid files
136 '';
137 };
138 };
139
140 config = lib.mkIf cfg.enable {
141 users.users = lib.optionalAttrs (cfg.user == name) {
142 "${name}" = {
143 inherit uid;
144 group = cfg.group;
145 description = "Mediagoblin user";
146 home = cfg.dataDir;
147 useDefaultShell = true;
148 };
149 };
150 users.groups = lib.optionalAttrs (cfg.group == name) {
151 "${name}" = {
152 inherit gid;
153 };
154 };
155
156 systemd.slices.mediagoblin = {
157 description = "Mediagoblin slice";
158 };
159 systemd.services.mediagoblin-web = {
160 description = "Mediagoblin service";
161 wantedBy = [ "multi-user.target" ];
162 after = [ "network.target" ];
163 wants = [ "postgresql.service" "redis.service" ];
164
165 environment.SCRIPT_NAME = "/mediagoblin/";
166
167 script = ''
168 exec ./bin/paster serve \
169 ${paste_local} \
170 --pid-file=${cfg.pids.paster}
171 '';
172 preStop = ''
173 exec ./bin/paster serve \
174 --pid-file=${cfg.pids.paster} \
175 ${paste_local} stop
176 '';
177 preStart = ''
178 if [ -d ${cfg.dataDir}/plugin_static/ ]; then
179 rm ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
180 ln -sf ${cfg.package}/mediagoblin/plugins/basic_auth/static ${cfg.dataDir}/plugin_static/coreplugin_basic_auth
181 fi
182 ./bin/gmg -cf ${cfg.configFile} dbupdate
183 '';
184
185 serviceConfig = {
186 Slice = "mediagoblin.slice";
187 User = cfg.user;
188 PrivateTmp = true;
189 Restart = "always";
190 TimeoutSec = 15;
191 Type = "simple";
192 WorkingDirectory = cfg.package;
193 RuntimeDirectory = cfg.systemdRuntimeDirectory;
194 StateDirectory= cfg.systemdStateDirectory;
195 PIDFile = cfg.pids.paster;
196 };
197
198 unitConfig.RequiresMountsFor = cfg.dataDir;
199 };
200
201 systemd.services.mediagoblin-celeryd = {
202 description = "Mediagoblin service";
203 wantedBy = [ "multi-user.target" ];
204 after = [ "network.target" "mediagoblin-web.service" ];
205
206 environment.MEDIAGOBLIN_CONFIG = cfg.configFile;
207 environment.CELERY_CONFIG_MODULE = "mediagoblin.init.celery.from_celery";
208
209 script = ''
210 exec ./bin/celery worker \
211 --logfile=${cfg.dataDir}/celery.log \
212 --loglevel=INFO
213 '';
214
215 serviceConfig = {
216 Slice = "mediagoblin.slice";
217 User = cfg.user;
218 PrivateTmp = true;
219 Restart = "always";
220 TimeoutSec = 60;
221 Type = "simple";
222 WorkingDirectory = cfg.package;
223 RuntimeDirectory = cfg.systemdRuntimeDirectory;
224 StateDirectory= cfg.systemdStateDirectory;
225 PIDFile = cfg.pids.celery;
226 };
227
228 unitConfig.RequiresMountsFor = cfg.dataDir;
229 };
230 };
231}
diff --git a/modules/webapps/webstats/default.nix b/modules/webapps/webstats/default.nix
deleted file mode 100644
index e873af2..0000000
--- a/modules/webapps/webstats/default.nix
+++ /dev/null
@@ -1,80 +0,0 @@
1{ lib, pkgs, config, ... }:
2let
3 name = "goaccess";
4 cfg = config.services.webstats;
5in {
6 options.services.webstats = {
7 dataDir = lib.mkOption {
8 type = lib.types.path;
9 default = "/var/lib/${name}";
10 description = ''
11 The directory where Goaccess stores its data.
12 '';
13 };
14 sites = lib.mkOption {
15 type = lib.types.listOf (lib.types.submodule {
16 options = {
17 conf = lib.mkOption {
18 type = lib.types.nullOr lib.types.path;
19 default = null;
20 description = ''
21 use custom goaccess configuration file instead of the
22 default one.
23 '';
24 };
25 name = lib.mkOption {
26 type = lib.types.str;
27 description = ''
28 Domain name. Corresponds to the Apache file name and the
29 folder name in which the state will be saved.
30 '';
31 };
32 };
33 });
34 default = [];
35 description = "Sites to generate stats";
36 };
37 };
38
39 config = lib.mkIf (builtins.length cfg.sites > 0) {
40 users.users.root.packages = [
41 pkgs.goaccess
42 ];
43
44 services.cron = {
45 enable = true;
46 systemCronJobs = let
47 stats = domain: conf: let
48 config = if builtins.isNull conf
49 then pkgs.runCommand "goaccess.conf" {
50 dbPath = "${cfg.dataDir}/${domain}";
51 } "substituteAll ${./goaccess.conf} $out"
52 else conf;
53 d = pkgs.writeScriptBin "stats-${domain}" ''
54 #!${pkgs.stdenv.shell}
55 set -e
56 shopt -s nullglob
57 TMPFILE=$(mktemp)
58 trap "rm -f $TMPFILE" EXIT
59
60 mkdir -p ${cfg.dataDir}/${domain}
61 for i in /var/log/httpd/access-${domain}*.gz; do
62 zcat "$i" >> $TMPFILE
63 done
64 cat /var/log/httpd/access-${domain}.log > $TMPFILE
65 ${pkgs.goaccess}/bin/goaccess $TMPFILE --no-progress -o ${cfg.dataDir}/${domain}/index.html -p ${config}
66 '';
67 in "${d}/bin/stats-${domain}";
68 allStats = sites: pkgs.writeScript "stats" ''
69 #!${pkgs.stdenv.shell}
70
71 mkdir -p ${cfg.dataDir}
72 ${builtins.concatStringsSep "\n" (map (v: stats v.name v.conf) sites)}
73 '';
74 in
75 [
76 "5 0 * * * root ${allStats cfg.sites}"
77 ];
78 };
79 };
80}
diff --git a/modules/websites/default.nix b/modules/websites/default.nix
deleted file mode 100644
index 6658c66..0000000
--- a/modules/websites/default.nix
+++ /dev/null
@@ -1,281 +0,0 @@
1{ lib, config, pkgs, ... }: with lib;
2let
3 cfg = config.services.websites;
4in
5{
6 options.services.websites = with types; {
7 certs = mkOption {
8 description = "Default websites configuration for certificates as accepted by acme";
9 };
10 env = mkOption {
11 default = {};
12 description = "Each type of website to enable will target a distinct httpd server";
13 type = attrsOf (submodule {
14 options = {
15 enable = mkEnableOption "Enable websites of this type";
16 adminAddr = mkOption {
17 type = str;
18 description = "Admin e-mail address of the instance";
19 };
20 httpdName = mkOption {
21 type = str;
22 description = "Name of the httpd instance to assign this type to";
23 };
24 ips = mkOption {
25 type = listOf str;
26 default = [];
27 description = "ips to listen to";
28 };
29 modules = mkOption {
30 type = listOf str;
31 default = [];
32 description = "Additional modules to load in Apache";
33 };
34 extraConfig = mkOption {
35 type = listOf lines;
36 default = [];
37 description = "Additional configuration to append to Apache";
38 };
39 nosslVhost = mkOption {
40 description = "A default nossl vhost for captive portals";
41 default = {};
42 type = submodule {
43 options = {
44 enable = mkEnableOption "Add default no-ssl vhost for this instance";
45 host = mkOption {
46 type = str;
47 description = "The hostname to use for this vhost";
48 };
49 root = mkOption {
50 type = path;
51 default = ./nosslVhost;
52 description = "The root folder to serve";
53 };
54 indexFile = mkOption {
55 type = str;
56 default = "index.html";
57 description = "The index file to show.";
58 };
59 };
60 };
61 };
62 fallbackVhost = mkOption {
63 description = "The fallback vhost that will be defined as first vhost in Apache";
64 type = submodule {
65 options = {
66 certName = mkOption { type = str; };
67 hosts = mkOption { type = listOf str; };
68 root = mkOption { type = nullOr path; };
69 forceSSL = mkOption {
70 type = bool;
71 default = true;
72 description = ''
73 Automatically create a corresponding non-ssl vhost
74 that will only redirect to the ssl version
75 '';
76 };
77 extraConfig = mkOption { type = listOf lines; default = []; };
78 };
79 };
80 };
81 vhostNoSSLConfs = mkOption {
82 default = {};
83 description = "List of no ssl vhosts to define for Apache";
84 type = attrsOf (submodule {
85 options = {
86 hosts = mkOption { type = listOf str; };
87 root = mkOption { type = nullOr path; };
88 extraConfig = mkOption { type = listOf lines; default = []; };
89 };
90 });
91 };
92 vhostConfs = mkOption {
93 default = {};
94 description = "List of vhosts to define for Apache";
95 type = attrsOf (submodule {
96 options = {
97 certName = mkOption { type = str; };
98 addToCerts = mkOption {
99 type = bool;
100 default = false;
101 description = "Use these to certificates. Is ignored (considered true) if certMainHost is not null";
102 };
103 certMainHost = mkOption {
104 type = nullOr str;
105 description = "Use that host as 'main host' for acme certs";
106 default = null;
107 };
108 hosts = mkOption { type = listOf str; };
109 root = mkOption { type = nullOr path; };
110 forceSSL = mkOption {
111 type = bool;
112 default = true;
113 description = ''
114 Automatically create a corresponding non-ssl vhost
115 that will only redirect to the ssl version
116 '';
117 };
118 extraConfig = mkOption { type = listOf lines; default = []; };
119 };
120 });
121 };
122 watchPaths = mkOption {
123 type = listOf str;
124 default = [];
125 description = ''
126 Paths to watch that should trigger a reload of httpd
127 '';
128 };
129 };
130 });
131 };
132 };
133
134 config.services.httpd = let
135 nosslVhost = ips: cfg: {
136 listen = map (ip: { inherit ip; port = 80; }) ips;
137 hostName = cfg.host;
138 logFormat = "combinedVhost";
139 documentRoot = cfg.root;
140 extraConfig = ''
141 <Directory ${cfg.root}>
142 DirectoryIndex ${cfg.indexFile}
143 AllowOverride None
144 Require all granted
145
146 RewriteEngine on
147 RewriteRule ^/(.+) / [L]
148 </Directory>
149 '';
150 };
151 toVhost = ips: vhostConf: {
152 forceSSL = vhostConf.forceSSL or true;
153 useACMEHost = vhostConf.certName;
154 logFormat = "combinedVhost";
155 listen = if vhostConf.forceSSL
156 then lists.flatten (map (ip: [{ inherit ip; port = 443; ssl = true; } { inherit ip; port = 80; }]) ips)
157 else map (ip: { inherit ip; port = 443; ssl = true; }) ips;
158 hostName = builtins.head vhostConf.hosts;
159 serverAliases = builtins.tail vhostConf.hosts or [];
160 documentRoot = vhostConf.root;
161 extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig;
162 };
163 toVhostNoSSL = ips: vhostConf: {
164 logFormat = "combinedVhost";
165 listen = map (ip: { inherit ip; port = 80; }) ips;
166 hostName = builtins.head vhostConf.hosts;
167 serverAliases = builtins.tail vhostConf.hosts or [];
168 documentRoot = vhostConf.root;
169 extraConfig = builtins.concatStringsSep "\n" vhostConf.extraConfig;
170 };
171 in attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
172 icfg.httpdName (mkIf icfg.enable {
173 enable = true;
174 logPerVirtualHost = true;
175 multiProcessingModule = "worker";
176 # https://ssl-config.mozilla.org/#server=apache&version=2.4.41&config=intermediate&openssl=1.0.2t&guideline=5.4
177 # test with https://www.ssllabs.com/ssltest/analyze.html?d=www.immae.eu&s=176.9.151.154&latest
178 sslProtocols = "all -SSLv3 -TLSv1 -TLSv1.1";
179 sslCiphers = builtins.concatStringsSep ":" [
180 "ECDHE-ECDSA-AES128-GCM-SHA256" "ECDHE-RSA-AES128-GCM-SHA256"
181 "ECDHE-ECDSA-AES256-GCM-SHA384" "ECDHE-RSA-AES256-GCM-SHA384"
182 "ECDHE-ECDSA-CHACHA20-POLY1305" "ECDHE-RSA-CHACHA20-POLY1305"
183 "DHE-RSA-AES128-GCM-SHA256" "DHE-RSA-AES256-GCM-SHA384"
184 ];
185 inherit (icfg) adminAddr;
186 logFormat = "combinedVhost";
187 extraModules = lists.unique icfg.modules;
188 extraConfig = builtins.concatStringsSep "\n" icfg.extraConfig;
189
190 virtualHosts = with attrsets; {
191 ___fallbackVhost = toVhost icfg.ips icfg.fallbackVhost;
192 } // (optionalAttrs icfg.nosslVhost.enable {
193 nosslVhost = nosslVhost icfg.ips icfg.nosslVhost;
194 }) // (mapAttrs' (n: v: nameValuePair ("nossl_" + n) (toVhostNoSSL icfg.ips v)) icfg.vhostNoSSLConfs)
195 // (mapAttrs' (n: v: nameValuePair ("ssl_" + n) (toVhost icfg.ips v)) icfg.vhostConfs);
196 })
197 ) cfg.env;
198
199 config.services.filesWatcher = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
200 "httpd${icfg.httpdName}" {
201 paths = icfg.watchPaths;
202 waitTime = 5;
203 }
204 ) cfg.env;
205
206 config.security.acme.certs = let
207 typesToManage = attrsets.filterAttrs (k: v: v.enable) cfg.env;
208 flatVhosts = lists.flatten (attrsets.mapAttrsToList (k: v:
209 attrValues v.vhostConfs
210 ) typesToManage);
211 groupedCerts = attrsets.filterAttrs
212 (_: group: builtins.any (v: v.addToCerts || !isNull v.certMainHost) group)
213 (lists.groupBy (v: v.certName) flatVhosts);
214 groupToDomain = group:
215 let
216 nonNull = builtins.filter (v: !isNull v.certMainHost) group;
217 domains = lists.unique (map (v: v.certMainHost) nonNull);
218 in
219 if builtins.length domains == 0
220 then null
221 else assert (builtins.length domains == 1); (elemAt domains 0);
222 extraDomains = group:
223 let
224 mainDomain = groupToDomain group;
225 in
226 lists.remove mainDomain (
227 lists.unique (
228 lists.flatten (map (c: optionals (c.addToCerts || !isNull c.certMainHost) c.hosts) group)
229 )
230 );
231 in attrsets.mapAttrs (k: g:
232 if (!isNull (groupToDomain g))
233 then cfg.certs // {
234 domain = groupToDomain g;
235 extraDomains = builtins.listToAttrs (
236 map (d: attrsets.nameValuePair d null) (extraDomains g));
237 }
238 else {
239 extraDomains = builtins.listToAttrs (
240 map (d: attrsets.nameValuePair d null) (extraDomains g));
241 }
242 ) groupedCerts;
243
244 config.systemd.services = let
245 package = httpdName: config.services.httpd.${httpdName}.package.out;
246 cfgFile = httpdName: config.services.httpd.${httpdName}.configFile;
247 serviceChange = attrsets.mapAttrs' (name: icfg:
248 attrsets.nameValuePair
249 "httpd${icfg.httpdName}" {
250 stopIfChanged = false;
251 serviceConfig.ExecStart =
252 lib.mkForce "@${package icfg.httpdName}/bin/httpd httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf";
253 serviceConfig.ExecStop =
254 lib.mkForce "${package icfg.httpdName}/bin/httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf -k graceful-stop";
255 serviceConfig.ExecReload =
256 lib.mkForce "${package icfg.httpdName}/bin/httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf -k graceful";
257 }
258 ) cfg.env;
259 serviceReload = attrsets.mapAttrs' (name: icfg:
260 attrsets.nameValuePair
261 "httpd${icfg.httpdName}-config-reload" {
262 wants = [ "httpd${icfg.httpdName}.service" ];
263 wantedBy = [ "multi-user.target" ];
264 restartTriggers = [ (cfgFile icfg.httpdName) ];
265 # commented, because can cause extra delays during activate for this config:
266 # services.nginx.virtualHosts."_".locations."/".proxyPass = "http://blabla:3000";
267 # stopIfChanged = false;
268 serviceConfig.Type = "oneshot";
269 serviceConfig.TimeoutSec = 60;
270 script = ''
271 if ${pkgs.systemd}/bin/systemctl -q is-active httpd${icfg.httpdName}.service ; then
272 ${package icfg.httpdName}/bin/httpd -f /etc/httpd/httpd_${icfg.httpdName}.conf -t && \
273 ${pkgs.systemd}/bin/systemctl reload httpd${icfg.httpdName}.service
274 fi
275 '';
276 serviceConfig.RemainAfterExit = true;
277 }
278 ) cfg.env;
279 in
280 serviceChange // serviceReload;
281}
diff --git a/modules/websites/httpd-service-builder.nix b/modules/websites/httpd-service-builder.nix
deleted file mode 100644
index 1f7488d..0000000
--- a/modules/websites/httpd-service-builder.nix
+++ /dev/null
@@ -1,735 +0,0 @@
1# to help backporting this builder should stay as close as possible to
2# nixos/modules/services/web-servers/apache-httpd/default.nix
3{ httpdName, withUsers ? true }:
4{ config, lib, pkgs, ... }:
5
6with lib;
7
8let
9
10 cfg = config.services.httpd."${httpdName}";
11
12 runtimeDir = "/run/httpd_${httpdName}";
13
14 pkg = cfg.package.out;
15
16 httpdConf = cfg.configFile;
17
18 php = cfg.phpPackage.override { apacheHttpd = pkg.dev; /* otherwise it only gets .out */ };
19
20 phpMajorVersion = lib.versions.major (lib.getVersion php);
21
22 mod_perl = pkgs.apacheHttpdPackages.mod_perl.override { apacheHttpd = pkg; };
23
24 vhosts = attrValues cfg.virtualHosts;
25
26 mkListenInfo = hostOpts:
27 if hostOpts.listen != [] then hostOpts.listen
28 else (
29 optional (hostOpts.onlySSL || hostOpts.addSSL || hostOpts.forceSSL) { ip = "*"; port = 443; ssl = true; } ++
30 optional (!hostOpts.onlySSL) { ip = "*"; port = 80; ssl = false; }
31 );
32
33 listenInfo = unique (concatMap mkListenInfo vhosts);
34
35 enableHttp2 = any (vhost: vhost.http2) vhosts;
36 enableSSL = any (listen: listen.ssl) listenInfo;
37 enableUserDir = any (vhost: vhost.enableUserDir) vhosts;
38
39 # NOTE: generally speaking order of modules is very important
40 modules =
41 [ # required apache modules our httpd service cannot run without
42 "authn_core" "authz_core"
43 "log_config"
44 "mime" "autoindex" "negotiation" "dir"
45 "alias" "rewrite"
46 "unixd" "slotmem_shm" "socache_shmcb"
47 "mpm_${cfg.multiProcessingModule}"
48 ]
49 ++ (if cfg.multiProcessingModule == "prefork" then [ "cgi" ] else [ "cgid" ])
50 ++ optional enableHttp2 "http2"
51 ++ optional enableSSL "ssl"
52 ++ optional enableUserDir "userdir"
53 ++ optional cfg.enableMellon { name = "auth_mellon"; path = "${pkgs.apacheHttpdPackages.mod_auth_mellon}/modules/mod_auth_mellon.so"; }
54 ++ optional cfg.enablePHP { name = "php${phpMajorVersion}"; path = "${php}/modules/libphp${phpMajorVersion}.so"; }
55 ++ optional cfg.enablePerl { name = "perl"; path = "${mod_perl}/modules/mod_perl.so"; }
56 ++ cfg.extraModules;
57
58 loggingConf = (if cfg.logFormat != "none" then ''
59 ErrorLog ${cfg.logDir}/error.log
60
61 LogLevel notice
62
63 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
64 LogFormat "%h %l %u %t \"%r\" %>s %b" common
65 LogFormat "%{Referer}i -> %U" referer
66 LogFormat "%{User-agent}i" agent
67
68 CustomLog ${cfg.logDir}/access.log ${cfg.logFormat}
69 '' else ''
70 ErrorLog /dev/null
71 '');
72
73
74 browserHacks = ''
75 <IfModule mod_setenvif.c>
76 BrowserMatch "Mozilla/2" nokeepalive
77 BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
78 BrowserMatch "RealPlayer 4\.0" force-response-1.0
79 BrowserMatch "Java/1\.0" force-response-1.0
80 BrowserMatch "JDK/1\.0" force-response-1.0
81 BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
82 BrowserMatch "^WebDrive" redirect-carefully
83 BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully
84 BrowserMatch "^gnome-vfs" redirect-carefully
85 </IfModule>
86 '';
87
88
89 sslConf = ''
90 <IfModule mod_ssl.c>
91 SSLSessionCache shmcb:${runtimeDir}/ssl_scache(512000)
92
93 Mutex posixsem
94
95 SSLRandomSeed startup builtin
96 SSLRandomSeed connect builtin
97
98 SSLProtocol ${cfg.sslProtocols}
99 SSLCipherSuite ${cfg.sslCiphers}
100 SSLHonorCipherOrder on
101 </IfModule>
102 '';
103
104
105 mimeConf = ''
106 TypesConfig ${pkg}/conf/mime.types
107
108 AddType application/x-x509-ca-cert .crt
109 AddType application/x-pkcs7-crl .crl
110 AddType application/x-httpd-php .php .phtml
111
112 <IfModule mod_mime_magic.c>
113 MIMEMagicFile ${pkg}/conf/magic
114 </IfModule>
115 '';
116
117 mkVHostConf = hostOpts:
118 let
119 adminAddr = if hostOpts.adminAddr != null then hostOpts.adminAddr else cfg.adminAddr;
120 listen = filter (listen: !listen.ssl) (mkListenInfo hostOpts);
121 listenSSL = filter (listen: listen.ssl) (mkListenInfo hostOpts);
122
123 useACME = hostOpts.enableACME || hostOpts.useACMEHost != null;
124 sslCertDir =
125 if hostOpts.enableACME then config.security.acme.certs.${hostOpts.hostName}.directory
126 else if hostOpts.useACMEHost != null then config.security.acme.certs.${hostOpts.useACMEHost}.directory
127 else abort "This case should never happen.";
128
129 sslServerCert = if useACME then "${sslCertDir}/full.pem" else hostOpts.sslServerCert;
130 sslServerKey = if useACME then "${sslCertDir}/key.pem" else hostOpts.sslServerKey;
131 sslServerChain = if useACME then "${sslCertDir}/fullchain.pem" else hostOpts.sslServerChain;
132
133 acmeChallenge = optionalString useACME ''
134 Alias /.well-known/acme-challenge/ "${hostOpts.acmeRoot}/.well-known/acme-challenge/"
135 <Directory "${hostOpts.acmeRoot}">
136 AllowOverride None
137 Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
138 Require method GET POST OPTIONS
139 Require all granted
140 </Directory>
141 '';
142 in
143 optionalString (listen != []) ''
144 <VirtualHost ${concatMapStringsSep " " (listen: "${listen.ip}:${toString listen.port}") listen}>
145 ServerName ${hostOpts.hostName}
146 ${concatMapStrings (alias: "ServerAlias ${alias}\n") hostOpts.serverAliases}
147 ServerAdmin ${adminAddr}
148 <IfModule mod_ssl.c>
149 SSLEngine off
150 </IfModule>
151 ${acmeChallenge}
152 ${if hostOpts.forceSSL then ''
153 <IfModule mod_rewrite.c>
154 RewriteEngine on
155 RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge [NC]
156 RewriteCond %{HTTPS} off
157 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
158 </IfModule>
159 '' else mkVHostCommonConf hostOpts}
160 </VirtualHost>
161 '' +
162 optionalString (listenSSL != []) ''
163 <VirtualHost ${concatMapStringsSep " " (listen: "${listen.ip}:${toString listen.port}") listenSSL}>
164 ServerName ${hostOpts.hostName}
165 ${concatMapStrings (alias: "ServerAlias ${alias}\n") hostOpts.serverAliases}
166 ServerAdmin ${adminAddr}
167 SSLEngine on
168 SSLCertificateFile ${sslServerCert}
169 SSLCertificateKeyFile ${sslServerKey}
170 ${optionalString hostOpts.http2 "Protocols h2 h2c http/1.1"}
171 ${acmeChallenge}
172 ${mkVHostCommonConf hostOpts}
173 </VirtualHost>
174 ''
175 ;
176
177 mkVHostCommonConf = hostOpts:
178 let
179 documentRoot = if hostOpts.documentRoot != null
180 then hostOpts.documentRoot
181 else pkgs.runCommand "empty" { preferLocalBuild = true; } "mkdir -p $out"
182 ;
183
184 mkLocations = locations: concatStringsSep "\n" (map (config: ''
185 <Location ${config.location}>
186 ${optionalString (config.proxyPass != null) ''
187 <IfModule mod_proxy.c>
188 ProxyPass ${config.proxyPass}
189 ProxyPassReverse ${config.proxyPass}
190 </IfModule>
191 ''}
192 ${optionalString (config.index != null) ''
193 <IfModule mod_dir.c>
194 DirectoryIndex ${config.index}
195 </IfModule>
196 ''}
197 ${optionalString (config.alias != null) ''
198 <IfModule mod_alias.c>
199 Alias "${config.alias}"
200 </IfModule>
201 ''}
202 ${config.extraConfig}
203 </Location>
204 '') (sortProperties (mapAttrsToList (k: v: v // { location = k; }) locations)));
205 in
206 ''
207 ${optionalString cfg.logPerVirtualHost ''
208 ErrorLog ${cfg.logDir}/error-${hostOpts.hostName}.log
209 CustomLog ${cfg.logDir}/access-${hostOpts.hostName}.log ${hostOpts.logFormat}
210 ''}
211
212 ${optionalString (hostOpts.robotsEntries != "") ''
213 Alias /robots.txt ${pkgs.writeText "robots.txt" hostOpts.robotsEntries}
214 ''}
215
216 DocumentRoot "${documentRoot}"
217
218 <Directory "${documentRoot}">
219 Options Indexes FollowSymLinks
220 AllowOverride None
221 Require all granted
222 </Directory>
223
224 ${optionalString hostOpts.enableUserDir ''
225 UserDir public_html
226 UserDir disabled root
227 <Directory "/home/*/public_html">
228 AllowOverride FileInfo AuthConfig Limit Indexes
229 Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
230 <Limit GET POST OPTIONS>
231 Require all granted
232 </Limit>
233 <LimitExcept GET POST OPTIONS>
234 Require all denied
235 </LimitExcept>
236 </Directory>
237 ''}
238
239 ${optionalString (hostOpts.globalRedirect != null && hostOpts.globalRedirect != "") ''
240 RedirectPermanent / ${hostOpts.globalRedirect}
241 ''}
242
243 ${
244 let makeDirConf = elem: ''
245 Alias ${elem.urlPath} ${elem.dir}/
246 <Directory ${elem.dir}>
247 Options +Indexes
248 Require all granted
249 AllowOverride All
250 </Directory>
251 '';
252 in concatMapStrings makeDirConf hostOpts.servedDirs
253 }
254
255 ${mkLocations hostOpts.locations}
256 ${hostOpts.extraConfig}
257 ''
258 ;
259
260
261 confFile = pkgs.writeText "httpd.conf" ''
262
263 ServerRoot ${pkg}
264 ServerName ${config.networking.hostName}
265 DefaultRuntimeDir ${runtimeDir}/runtime
266
267 PidFile ${runtimeDir}/httpd.pid
268
269 ${optionalString (cfg.multiProcessingModule != "prefork") ''
270 # mod_cgid requires this.
271 ScriptSock ${runtimeDir}/cgisock
272 ''}
273
274 <IfModule prefork.c>
275 MaxClients ${toString cfg.maxClients}
276 MaxRequestsPerChild ${toString cfg.maxRequestsPerChild}
277 </IfModule>
278
279 ${let
280 toStr = listen: "Listen ${listen.ip}:${toString listen.port} ${if listen.ssl then "https" else "http"}";
281 uniqueListen = uniqList {inputList = map toStr listenInfo;};
282 in concatStringsSep "\n" uniqueListen
283 }
284
285 User ${cfg.user}
286 Group ${cfg.group}
287
288 ${let
289 mkModule = module:
290 if isString module then { name = module; path = "${pkg}/modules/mod_${module}.so"; }
291 else if isAttrs module then { inherit (module) name path; }
292 else throw "Expecting either a string or attribute set including a name and path.";
293 in
294 concatMapStringsSep "\n" (module: "LoadModule ${module.name}_module ${module.path}") (unique (map mkModule modules))
295 }
296
297 AddHandler type-map var
298
299 <Files ~ "^\.ht">
300 Require all denied
301 </Files>
302
303 ${mimeConf}
304 ${loggingConf}
305 ${browserHacks}
306
307 Include ${pkg}/conf/extra/httpd-default.conf
308 Include ${pkg}/conf/extra/httpd-autoindex.conf
309 Include ${pkg}/conf/extra/httpd-multilang-errordoc.conf
310 Include ${pkg}/conf/extra/httpd-languages.conf
311
312 TraceEnable off
313
314 ${sslConf}
315
316 # Fascist default - deny access to everything.
317 <Directory />
318 Options FollowSymLinks
319 AllowOverride None
320 Require all denied
321 </Directory>
322
323 ${cfg.extraConfig}
324
325 ${concatMapStringsSep "\n" mkVHostConf vhosts}
326 '';
327
328 # Generate the PHP configuration file. Should probably be factored
329 # out into a separate module.
330 phpIni = pkgs.runCommand "php.ini"
331 { options = cfg.phpOptions;
332 preferLocalBuild = true;
333 }
334 ''
335 cat ${php}/etc/php.ini > $out
336 echo "$options" >> $out
337 '';
338
339in
340
341
342{
343
344 imports = [
345 (mkRemovedOptionModule [ "services" "httpd" httpdName "extraSubservices" ] "Most existing subservices have been ported to the NixOS module system. Please update your configuration accordingly.")
346 (mkRemovedOptionModule [ "services" "httpd" httpdName "stateDir" ] "The httpd module now uses /run/httpd as a runtime directory.")
347
348 # virtualHosts options
349 (mkRemovedOptionModule [ "services" "httpd" httpdName "documentRoot" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
350 (mkRemovedOptionModule [ "services" "httpd" httpdName "enableSSL" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
351 (mkRemovedOptionModule [ "services" "httpd" httpdName "enableUserDir" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
352 (mkRemovedOptionModule [ "services" "httpd" httpdName "globalRedirect" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
353 (mkRemovedOptionModule [ "services" "httpd" httpdName "hostName" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
354 (mkRemovedOptionModule [ "services" "httpd" httpdName "listen" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
355 (mkRemovedOptionModule [ "services" "httpd" httpdName "robotsEntries" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
356 (mkRemovedOptionModule [ "services" "httpd" httpdName "servedDirs" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
357 (mkRemovedOptionModule [ "services" "httpd" httpdName "servedFiles" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
358 (mkRemovedOptionModule [ "services" "httpd" httpdName "serverAliases" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
359 (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerCert" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
360 (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerChain" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
361 (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerKey" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
362 ];
363
364 # interface
365
366 options = {
367
368 services.httpd."${httpdName}" = {
369
370 enable = mkEnableOption "the Apache HTTP Server";
371
372 package = mkOption {
373 type = types.package;
374 default = pkgs.apacheHttpd;
375 defaultText = "pkgs.apacheHttpd";
376 description = ''
377 Overridable attribute of the Apache HTTP Server package to use.
378 '';
379 };
380
381 configFile = mkOption {
382 type = types.path;
383 default = confFile;
384 defaultText = "confFile";
385 example = literalExample ''pkgs.writeText "httpd.conf" "# my custom config file ..."'';
386 description = ''
387 Override the configuration file used by Apache. By default,
388 NixOS generates one automatically.
389 '';
390 };
391
392 extraConfig = mkOption {
393 type = types.lines;
394 default = "";
395 description = ''
396 Configuration lines appended to the generated Apache
397 configuration file. Note that this mechanism will not work
398 when <option>configFile</option> is overridden.
399 '';
400 };
401
402 extraModules = mkOption {
403 type = types.listOf types.unspecified;
404 default = [];
405 example = literalExample ''
406 [
407 "proxy_connect"
408 { name = "jk"; path = "''${pkgs.tomcat_connectors}/modules/mod_jk.so"; }
409 ]
410 '';
411 description = ''
412 Additional Apache modules to be used. These can be
413 specified as a string in the case of modules distributed
414 with Apache, or as an attribute set specifying the
415 <varname>name</varname> and <varname>path</varname> of the
416 module.
417 '';
418 };
419
420 adminAddr = mkOption {
421 type = types.str;
422 example = "admin@example.org";
423 description = "E-mail address of the server administrator.";
424 };
425
426 logFormat = mkOption {
427 type = types.str;
428 default = "common";
429 example = "combined";
430 description = ''
431 Log format for log files. Possible values are: combined, common, referer, agent.
432 See <link xlink:href="https://httpd.apache.org/docs/2.4/logs.html"/> for more details.
433 '';
434 };
435
436 logPerVirtualHost = mkOption {
437 type = types.bool;
438 default = true;
439 description = ''
440 If enabled, each virtual host gets its own
441 <filename>access.log</filename> and
442 <filename>error.log</filename>, namely suffixed by the
443 <option>hostName</option> of the virtual host.
444 '';
445 };
446
447 user = mkOption {
448 type = types.str;
449 default = "wwwrun";
450 description = ''
451 User account under which httpd runs.
452 '';
453 };
454
455 group = mkOption {
456 type = types.str;
457 default = "wwwrun";
458 description = ''
459 Group under which httpd runs.
460 '';
461 };
462
463 logDir = mkOption {
464 type = types.path;
465 default = "/var/log/httpd";
466 description = ''
467 Directory for Apache's log files. It is created automatically.
468 '';
469 };
470
471 virtualHosts = mkOption {
472 type = with types; attrsOf (submodule (import <nixpkgs/nixos/modules/services/web-servers/apache-httpd/vhost-options.nix>));
473 default = {
474 localhost = {
475 documentRoot = "${pkg}/htdocs";
476 };
477 };
478 example = literalExample ''
479 {
480 "foo.example.com" = {
481 forceSSL = true;
482 documentRoot = "/var/www/foo.example.com"
483 };
484 "bar.example.com" = {
485 addSSL = true;
486 documentRoot = "/var/www/bar.example.com";
487 };
488 }
489 '';
490 description = ''
491 Specification of the virtual hosts served by Apache. Each
492 element should be an attribute set specifying the
493 configuration of the virtual host.
494 '';
495 };
496
497 enableMellon = mkOption {
498 type = types.bool;
499 default = false;
500 description = "Whether to enable the mod_auth_mellon module.";
501 };
502
503 enablePHP = mkOption {
504 type = types.bool;
505 default = false;
506 description = "Whether to enable the PHP module.";
507 };
508
509 phpPackage = mkOption {
510 type = types.package;
511 default = pkgs.php;
512 defaultText = "pkgs.php";
513 description = ''
514 Overridable attribute of the PHP package to use.
515 '';
516 };
517
518 enablePerl = mkOption {
519 type = types.bool;
520 default = false;
521 description = "Whether to enable the Perl module (mod_perl).";
522 };
523
524 phpOptions = mkOption {
525 type = types.lines;
526 default = "";
527 example =
528 ''
529 date.timezone = "CET"
530 '';
531 description = ''
532 Options appended to the PHP configuration file <filename>php.ini</filename>.
533 '';
534 };
535
536 multiProcessingModule = mkOption {
537 type = types.enum [ "event" "prefork" "worker" ];
538 default = "prefork";
539 example = "worker";
540 description =
541 ''
542 Multi-processing module to be used by Apache. Available
543 modules are <literal>prefork</literal> (the default;
544 handles each request in a separate child process),
545 <literal>worker</literal> (hybrid approach that starts a
546 number of child processes each running a number of
547 threads) and <literal>event</literal> (a recent variant of
548 <literal>worker</literal> that handles persistent
549 connections more efficiently).
550 '';
551 };
552
553 maxClients = mkOption {
554 type = types.int;
555 default = 150;
556 example = 8;
557 description = "Maximum number of httpd processes (prefork)";
558 };
559
560 maxRequestsPerChild = mkOption {
561 type = types.int;
562 default = 0;
563 example = 500;
564 description = ''
565 Maximum number of httpd requests answered per httpd child (prefork), 0 means unlimited.
566 '';
567 };
568
569 sslCiphers = mkOption {
570 type = types.str;
571 default = "HIGH:!aNULL:!MD5:!EXP";
572 description = "Cipher Suite available for negotiation in SSL proxy handshake.";
573 };
574
575 sslProtocols = mkOption {
576 type = types.str;
577 default = "All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1";
578 example = "All -SSLv2 -SSLv3";
579 description = "Allowed SSL/TLS protocol versions.";
580 };
581 };
582
583 };
584
585 # implementation
586
587 config = mkIf cfg.enable {
588
589 assertions = [
590 {
591 assertion = all (hostOpts: !hostOpts.enableSSL) vhosts;
592 message = ''
593 The option `services.httpd.virtualHosts.<name>.enableSSL` no longer has any effect; please remove it.
594 Select one of `services.httpd.virtualHosts.<name>.addSSL`, `services.httpd.virtualHosts.<name>.forceSSL`,
595 or `services.httpd.virtualHosts.<name>.onlySSL`.
596 '';
597 }
598 {
599 assertion = all (hostOpts: with hostOpts; !(addSSL && onlySSL) && !(forceSSL && onlySSL) && !(addSSL && forceSSL)) vhosts;
600 message = ''
601 Options `services.httpd.virtualHosts.<name>.addSSL`,
602 `services.httpd.virtualHosts.<name>.onlySSL` and `services.httpd.virtualHosts.<name>.forceSSL`
603 are mutually exclusive.
604 '';
605 }
606 {
607 assertion = all (hostOpts: !(hostOpts.enableACME && hostOpts.useACMEHost != null)) vhosts;
608 message = ''
609 Options `services.httpd.virtualHosts.<name>.enableACME` and
610 `services.httpd.virtualHosts.<name>.useACMEHost` are mutually exclusive.
611 '';
612 }
613 ];
614
615 warnings =
616 mapAttrsToList (name: hostOpts: ''
617 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.
618 '') (filterAttrs (name: hostOpts: hostOpts.servedFiles != []) cfg.virtualHosts);
619
620 users.users = optionalAttrs (withUsers && cfg.user == "wwwrun") {
621 wwwrun = {
622 group = cfg.group;
623 description = "Apache httpd user";
624 uid = config.ids.uids.wwwrun;
625 };
626 };
627
628 users.groups = optionalAttrs (withUsers && cfg.group == "wwwrun") {
629 wwwrun.gid = config.ids.gids.wwwrun;
630 };
631
632 security.acme.certs = mapAttrs (name: hostOpts: {
633 user = cfg.user;
634 group = mkDefault cfg.group;
635 email = if hostOpts.adminAddr != null then hostOpts.adminAddr else cfg.adminAddr;
636 webroot = hostOpts.acmeRoot;
637 extraDomains = genAttrs hostOpts.serverAliases (alias: null);
638 postRun = "systemctl reload httpd.service";
639 }) (filterAttrs (name: hostOpts: hostOpts.enableACME) cfg.virtualHosts);
640
641 environment.systemPackages = [ pkg ];
642
643 # required for "apachectl configtest"
644 environment.etc."httpd/httpd_${httpdName}.conf".source = httpdConf;
645
646 services.httpd."${httpdName}" = { phpOptions =
647 ''
648 ; Needed for PHP's mail() function.
649 sendmail_path = sendmail -t -i
650
651 ; Don't advertise PHP
652 expose_php = off
653 '' + optionalString (config.time.timeZone != null) ''
654
655 ; Apparently PHP doesn't use $TZ.
656 date.timezone = "${config.time.timeZone}"
657 '';
658
659 extraModules = mkBefore [
660 # HTTP authentication mechanisms: basic and digest.
661 "auth_basic" "auth_digest"
662
663 # Authentication: is the user who he claims to be?
664 "authn_file" "authn_dbm" "authn_anon"
665
666 # Authorization: is the user allowed access?
667 "authz_user" "authz_groupfile" "authz_host"
668
669 # Other modules.
670 "ext_filter" "include" "env" "mime_magic"
671 "cern_meta" "expires" "headers" "usertrack" "setenvif"
672 "dav" "status" "asis" "info" "dav_fs"
673 "vhost_alias" "imagemap" "actions" "speling"
674 "proxy" "proxy_http"
675 "cache" "cache_disk"
676
677 # For compatibility with old configurations, the new module mod_access_compat is provided.
678 "access_compat"
679 ];
680 };
681
682 systemd.tmpfiles.rules =
683 let
684 svc = config.systemd.services."httpd${httpdName}".serviceConfig;
685 in
686 [
687 "d '${cfg.logDir}' 0700 ${svc.User} ${svc.Group}"
688 "Z '${cfg.logDir}' - ${svc.User} ${svc.Group}"
689 ];
690
691 systemd.services."httpd${httpdName}" =
692 let
693 vhostsACME = filter (hostOpts: hostOpts.enableACME) vhosts;
694 in
695 { description = "Apache HTTPD";
696
697 wantedBy = [ "multi-user.target" ];
698 wants = concatLists (map (hostOpts: [ "acme-${hostOpts.hostName}.service" "acme-selfsigned-${hostOpts.hostName}.service" ]) vhostsACME);
699 after = [ "network.target" "fs.target" ] ++ map (hostOpts: "acme-selfsigned-${hostOpts.hostName}.service") vhostsACME;
700
701 path =
702 [ pkg pkgs.coreutils pkgs.gnugrep ]
703 ++ optional cfg.enablePHP pkgs.system-sendmail; # Needed for PHP's mail() function.
704
705 environment =
706 optionalAttrs cfg.enablePHP { PHPRC = phpIni; }
707 // optionalAttrs cfg.enableMellon { LD_LIBRARY_PATH = "${pkgs.xmlsec}/lib"; };
708
709 preStart =
710 ''
711 # Get rid of old semaphores. These tend to accumulate across
712 # server restarts, eventually preventing it from restarting
713 # successfully.
714 for i in $(${pkgs.utillinux}/bin/ipcs -s | grep ' ${cfg.user} ' | cut -f2 -d ' '); do
715 ${pkgs.utillinux}/bin/ipcrm -s $i
716 done
717 '';
718
719 serviceConfig = {
720 ExecStart = "@${pkg}/bin/httpd httpd -f ${httpdConf}";
721 ExecStop = "${pkg}/bin/httpd -f ${httpdConf} -k graceful-stop";
722 ExecReload = "${pkg}/bin/httpd -f ${httpdConf} -k graceful";
723 User = "root";
724 Group = cfg.group;
725 Type = "forking";
726 PIDFile = "${runtimeDir}/httpd.pid";
727 Restart = "always";
728 RestartSec = "5s";
729 RuntimeDirectory = "httpd_${httpdName} httpd_${httpdName}/runtime";
730 RuntimeDirectoryMode = "0750";
731 };
732 };
733
734 };
735}
diff --git a/modules/websites/httpd-service-builder.patch b/modules/websites/httpd-service-builder.patch
deleted file mode 100644
index f0ad836..0000000
--- a/modules/websites/httpd-service-builder.patch
+++ /dev/null
@@ -1,150 +0,0 @@
1--- /nix/store/xj651aslybfsma20hpbi5nznfcffq8ky-nixexprs.tar.xz/nixos/modules/services/web-servers/apache-httpd/default.nix 1970-01-01 01:00:01.000000000 +0100
2+++ modules/websites/httpd-service-builder.nix 2020-04-04 03:08:29.068490345 +0200
3@@ -1,12 +1,15 @@
4+# to help backporting this builder should stay as close as possible to
5+# nixos/modules/services/web-servers/apache-httpd/default.nix
6+{ httpdName, withUsers ? true }:
7 { config, lib, pkgs, ... }:
8
9 with lib;
10
11 let
12
13- cfg = config.services.httpd;
14+ cfg = config.services.httpd."${httpdName}";
15
16- runtimeDir = "/run/httpd";
17+ runtimeDir = "/run/httpd_${httpdName}";
18
19 pkg = cfg.package.out;
20
21@@ -318,13 +321,6 @@
22 Require all denied
23 </Directory>
24
25- # But do allow access to files in the store so that we don't have
26- # to generate <Directory> clauses for every generated file that we
27- # want to serve.
28- <Directory /nix/store>
29- Require all granted
30- </Directory>
31-
32 ${cfg.extraConfig}
33
34 ${concatMapStringsSep "\n" mkVHostConf vhosts}
35@@ -347,30 +343,30 @@
36 {
37
38 imports = [
39- (mkRemovedOptionModule [ "services" "httpd" "extraSubservices" ] "Most existing subservices have been ported to the NixOS module system. Please update your configuration accordingly.")
40- (mkRemovedOptionModule [ "services" "httpd" "stateDir" ] "The httpd module now uses /run/httpd as a runtime directory.")
41+ (mkRemovedOptionModule [ "services" "httpd" httpdName "extraSubservices" ] "Most existing subservices have been ported to the NixOS module system. Please update your configuration accordingly.")
42+ (mkRemovedOptionModule [ "services" "httpd" httpdName "stateDir" ] "The httpd module now uses /run/httpd as a runtime directory.")
43
44 # virtualHosts options
45- (mkRemovedOptionModule [ "services" "httpd" "documentRoot" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
46- (mkRemovedOptionModule [ "services" "httpd" "enableSSL" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
47- (mkRemovedOptionModule [ "services" "httpd" "enableUserDir" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
48- (mkRemovedOptionModule [ "services" "httpd" "globalRedirect" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
49- (mkRemovedOptionModule [ "services" "httpd" "hostName" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
50- (mkRemovedOptionModule [ "services" "httpd" "listen" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
51- (mkRemovedOptionModule [ "services" "httpd" "robotsEntries" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
52- (mkRemovedOptionModule [ "services" "httpd" "servedDirs" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
53- (mkRemovedOptionModule [ "services" "httpd" "servedFiles" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
54- (mkRemovedOptionModule [ "services" "httpd" "serverAliases" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
55- (mkRemovedOptionModule [ "services" "httpd" "sslServerCert" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
56- (mkRemovedOptionModule [ "services" "httpd" "sslServerChain" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
57- (mkRemovedOptionModule [ "services" "httpd" "sslServerKey" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
58+ (mkRemovedOptionModule [ "services" "httpd" httpdName "documentRoot" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
59+ (mkRemovedOptionModule [ "services" "httpd" httpdName "enableSSL" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
60+ (mkRemovedOptionModule [ "services" "httpd" httpdName "enableUserDir" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
61+ (mkRemovedOptionModule [ "services" "httpd" httpdName "globalRedirect" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
62+ (mkRemovedOptionModule [ "services" "httpd" httpdName "hostName" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
63+ (mkRemovedOptionModule [ "services" "httpd" httpdName "listen" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
64+ (mkRemovedOptionModule [ "services" "httpd" httpdName "robotsEntries" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
65+ (mkRemovedOptionModule [ "services" "httpd" httpdName "servedDirs" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
66+ (mkRemovedOptionModule [ "services" "httpd" httpdName "servedFiles" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
67+ (mkRemovedOptionModule [ "services" "httpd" httpdName "serverAliases" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
68+ (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerCert" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
69+ (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerChain" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
70+ (mkRemovedOptionModule [ "services" "httpd" httpdName "sslServerKey" ] "Please define a virtual host using `services.httpd.virtualHosts`.")
71 ];
72
73 # interface
74
75 options = {
76
77- services.httpd = {
78+ services.httpd."${httpdName}" = {
79
80 enable = mkEnableOption "the Apache HTTP Server";
81
82@@ -622,7 +618,7 @@
83 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.
84 '') (filterAttrs (name: hostOpts: hostOpts.servedFiles != []) cfg.virtualHosts);
85
86- users.users = optionalAttrs (cfg.user == "wwwrun") {
87+ users.users = optionalAttrs (withUsers && cfg.user == "wwwrun") {
88 wwwrun = {
89 group = cfg.group;
90 description = "Apache httpd user";
91@@ -630,7 +626,7 @@
92 };
93 };
94
95- users.groups = optionalAttrs (cfg.group == "wwwrun") {
96+ users.groups = optionalAttrs (withUsers && cfg.group == "wwwrun") {
97 wwwrun.gid = config.ids.gids.wwwrun;
98 };
99
100@@ -646,9 +642,9 @@
101 environment.systemPackages = [ pkg ];
102
103 # required for "apachectl configtest"
104- environment.etc."httpd/httpd.conf".source = httpdConf;
105+ environment.etc."httpd/httpd_${httpdName}.conf".source = httpdConf;
106
107- services.httpd.phpOptions =
108+ services.httpd."${httpdName}" = { phpOptions =
109 ''
110 ; Needed for PHP's mail() function.
111 sendmail_path = sendmail -t -i
112@@ -661,7 +657,7 @@
113 date.timezone = "${config.time.timeZone}"
114 '';
115
116- services.httpd.extraModules = mkBefore [
117+ extraModules = mkBefore [
118 # HTTP authentication mechanisms: basic and digest.
119 "auth_basic" "auth_digest"
120
121@@ -682,17 +678,18 @@
122 # For compatibility with old configurations, the new module mod_access_compat is provided.
123 "access_compat"
124 ];
125+ };
126
127 systemd.tmpfiles.rules =
128 let
129- svc = config.systemd.services.httpd.serviceConfig;
130+ svc = config.systemd.services."httpd${httpdName}".serviceConfig;
131 in
132 [
133 "d '${cfg.logDir}' 0700 ${svc.User} ${svc.Group}"
134 "Z '${cfg.logDir}' - ${svc.User} ${svc.Group}"
135 ];
136
137- systemd.services.httpd =
138+ systemd.services."httpd${httpdName}" =
139 let
140 vhostsACME = filter (hostOpts: hostOpts.enableACME) vhosts;
141 in
142@@ -730,7 +727,7 @@
143 PIDFile = "${runtimeDir}/httpd.pid";
144 Restart = "always";
145 RestartSec = "5s";
146- RuntimeDirectory = "httpd httpd/runtime";
147+ RuntimeDirectory = "httpd_${httpdName} httpd_${httpdName}/runtime";
148 RuntimeDirectoryMode = "0750";
149 };
150 };
diff --git a/modules/websites/php-application.nix b/modules/websites/php-application.nix
deleted file mode 100644
index 3a43a45..0000000
--- a/modules/websites/php-application.nix
+++ /dev/null
@@ -1,224 +0,0 @@
1{ lib, config, pkgs, ... }:
2with lib;
3let
4 cfg = config.services.phpApplication;
5 cfgByEnv = lists.groupBy (x: x.websiteEnv) (builtins.attrValues cfg.apps);
6in
7{
8 options = with types; {
9 services.phpApplication.apps = mkOption {
10 default = {};
11 description = ''
12 php applications to define
13 '';
14 type = attrsOf (submodule {
15 options = {
16 varDir = mkOption {
17 type = nullOr path;
18 description = ''
19 Path to application’s vardir.
20 '';
21 };
22 varDirPaths = mkOption {
23 type = attrsOf str;
24 default = {};
25 description = ''
26 Map of additional folders => mode to create under varDir
27 '';
28 };
29 mode = mkOption {
30 type = str;
31 default = "0700";
32 description = ''
33 Mode to apply to the vardir
34 '';
35 };
36 phpSession = mkOption {
37 type = bool;
38 default = true;
39 description = "Handle phpsession files separately in vardir";
40 };
41 phpListen = mkOption {
42 type = nullOr str;
43 default = null;
44 description = "Name of the socket to listen to. Defaults to app name if null";
45 };
46 phpPool = mkOption {
47 type = attrsOf str;
48 default = {};
49 description = "Pool configuration to append";
50 };
51 phpEnv = mkOption {
52 type = attrsOf str;
53 default = {};
54 description = "Pool environment to append";
55 };
56 phpPackage = mkOption {
57 type = attrsOf str;
58 default = pkgs.php;
59 description = "Php package to use";
60 };
61 phpOptions = mkOption {
62 type = lines;
63 default = "";
64 description = "php configuration to append";
65 };
66 phpOpenbasedir = mkOption {
67 type = listOf path;
68 default = [];
69 description = ''
70 paths to add to php open_basedir configuration in addition to app and vardir
71 '';
72 };
73 phpWatchFiles = mkOption {
74 type = listOf path;
75 default = [];
76 description = ''
77 Path to other files to watch to trigger preStart scripts
78 '';
79 };
80 websiteEnv = mkOption {
81 type = str;
82 description = ''
83 website instance name to use
84 '';
85 };
86 httpdUser = mkOption {
87 type = str;
88 default = config.services.httpd.user;
89 description = ''
90 httpd user to run the prestart scripts as.
91 '';
92 };
93 httpdGroup = mkOption {
94 type = str;
95 default = config.services.httpd.group;
96 description = ''
97 httpd group to run the prestart scripts as.
98 '';
99 };
100 httpdWatchFiles = mkOption {
101 type = listOf path;
102 default = [];
103 description = ''
104 Path to other files to watch to trigger httpd reload
105 '';
106 };
107 app = mkOption {
108 type = path;
109 description = ''
110 Path to application root
111 '';
112 };
113 webRoot = mkOption {
114 type = nullOr path;
115 description = ''
116 Path to the web root path of the application. May differ from the application itself (usually a subdirectory)
117 '';
118 };
119 preStartActions = mkOption {
120 type = listOf str;
121 default = [];
122 description = ''
123 List of actions to run as apache user at preStart when
124 whatchFiles or app dir changed.
125 '';
126 };
127 serviceDeps = mkOption {
128 type = listOf str;
129 default = [];
130 description = ''
131 List of systemd services this application depends on
132 '';
133 };
134 };
135 });
136 };
137 # Read-only variables
138 services.phpApplication.phpListenPaths = mkOption {
139 type = attrsOf path;
140 default = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
141 name config.services.phpfpm.pools."${name}".socket
142 ) cfg.apps;
143 readOnly = true;
144 description = ''
145 Full paths to listen for php
146 '';
147 };
148 };
149
150 config = {
151 services.websites.env = attrsets.mapAttrs' (name: cfgs: attrsets.nameValuePair
152 name {
153 modules = [ "proxy_fcgi" ];
154 watchPaths = builtins.concatLists (map (c: c.httpdWatchFiles) cfgs);
155 }
156 ) cfgByEnv;
157
158 services.phpfpm.pools = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
159 name {
160 user = icfg.httpdUser;
161 group = icfg.httpdUser;
162 settings = {
163 "listen.owner" = icfg.httpdUser;
164 "listen.group" = icfg.httpdGroup;
165 "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" ([icfg.app icfg.varDir] ++ icfg.phpWatchFiles ++ icfg.phpOpenbasedir);
166 }
167 // optionalAttrs (icfg.phpSession) { "php_admin_value[session.save_path]" = "${icfg.varDir}/phpSessions"; }
168 // icfg.phpPool;
169 phpOptions = config.services.phpfpm.phpOptions + icfg.phpOptions;
170 inherit (icfg) phpEnv phpPackage;
171 }
172 ) cfg.apps;
173
174 services.filesWatcher = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
175 "phpfpm-${name}" {
176 restart = true;
177 paths = icfg.phpWatchFiles;
178 }
179 ) (attrsets.filterAttrs (n: v: builtins.length v.phpWatchFiles > 0) cfg.apps);
180
181 systemd.services = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
182 "phpfpm-${name}" {
183 after = lib.mkAfter icfg.serviceDeps;
184 wants = icfg.serviceDeps;
185 preStart = lib.mkAfter (optionalString (!isNull icfg.varDir) ''
186 watchFilesChanged() {
187 ${optionalString (builtins.length icfg.phpWatchFiles == 0) "return 1"}
188 [ ! -f "${icfg.varDir}"/watchedFiles ] \
189 || ! sha512sum -c --status ${icfg.varDir}/watchedFiles
190 }
191 appDirChanged() {
192 [ ! -f "${icfg.varDir}/currentWebappDir" -o \
193 "${icfg.app}" != "$(cat ${icfg.varDir}/currentWebappDir 2>/dev/null)" ]
194 }
195 updateWatchFiles() {
196 ${optionalString (builtins.length icfg.phpWatchFiles == 0) "return 0"}
197 sha512sum ${builtins.concatStringsSep " " icfg.phpWatchFiles} > ${icfg.varDir}/watchedFiles
198 }
199
200 if watchFilesChanged || appDirChanged; then
201 pushd ${icfg.app} > /dev/null
202 ${builtins.concatStringsSep "\n " (map (c: "/run/wrappers/bin/sudo -u ${icfg.httpdUser} ${c}") icfg.preStartActions) }
203 popd > /dev/null
204 echo -n "${icfg.app}" > ${icfg.varDir}/currentWebappDir
205 updateWatchFiles
206 fi
207 '');
208 }
209 ) cfg.apps;
210
211 system.activationScripts = attrsets.mapAttrs' (name: icfg: attrsets.nameValuePair
212 name {
213 deps = [];
214 text = optionalString (!isNull icfg.varDir) ''
215 install -m ${icfg.mode} -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir}
216 '' + optionalString (icfg.phpSession) ''
217 install -m 0700 -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir}/phpSessions
218 '' + builtins.concatStringsSep "\n" (attrsets.mapAttrsToList (n: v: ''
219 install -m ${v} -o ${icfg.httpdUser} -g ${icfg.httpdGroup} -d ${icfg.varDir}/${n}
220 '') icfg.varDirPaths);
221 }
222 ) cfg.apps;
223 };
224}
diff --git a/modules/zrepl.nix b/modules/zrepl.nix
deleted file mode 100644
index 5bcc17b..0000000
--- a/modules/zrepl.nix
+++ /dev/null
@@ -1,45 +0,0 @@
1{ config, lib, pkgs, ... }:
2let
3 cfg = config.services.zrepl;
4in
5{
6 options = {
7 services.zrepl = {
8 enable = lib.mkEnableOption "Enable the zrepl daemon";
9
10 config = lib.mkOption {
11 type = lib.types.lines;
12 default = "";
13 description = "Configuration";
14 };
15 };
16 };
17
18 config = lib.mkIf cfg.enable {
19 secrets.keys = {
20 "zrepl/zrepl.yml" = {
21 permissions = "0400";
22 text = cfg.config;
23 user = config.systemd.services.zrepl.serviceConfig.User or "root";
24 group = config.systemd.services.zrepl.serviceConfig.Group or "root";
25 };
26 };
27 services.filesWatcher.zrepl = {
28 restart = true;
29 paths = [ config.secrets.fullPaths."zrepl/zrepl.yml" ];
30 };
31 systemd.services.zrepl = {
32 description = "zrepl daemon";
33 wantedBy = [ "multi-user.target" ];
34 path = [ pkgs.zfs pkgs.openssh ];
35 serviceConfig = {
36 ExecStart =
37 let configFile = config.secrets.fullPaths."zrepl/zrepl.yml";
38 in "${pkgs.zrepl}/bin/zrepl daemon --config ${configFile}";
39 Type = "simple";
40 RuntimeDirectory= "zrepl";
41 RuntimeDirectoryMode= "0700";
42 };
43 };
44 };
45}
diff --git a/nix/README.md b/nix/README.md
deleted file mode 100644
index 7bf996c..0000000
--- a/nix/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
1This directory is handled by niv, but it prefers to have a directory
2named "nix"
diff --git a/nix/sources.json b/nix/sources.json
deleted file mode 100644
index 1a1cf5a..0000000
--- a/nix/sources.json
+++ /dev/null
@@ -1,209 +0,0 @@
1{
2 "buildbot-cours-deps": {
3 "ref": "master",
4 "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Cours",
5 "rev": "33f139f2e2ea0a16b8ed813c5436e5a5bb506f6d",
6 "type": "git"
7 },
8 "buildbot-cours-nixpkgs": {
9 "branch": "nixos-unstable",
10 "description": "Frozen nixpkgs snapshot for texlive",
11 "homepage": "https://github.com/NixOS/nixpkgs",
12 "owner": "NixOS",
13 "repo": "nixpkgs-channels",
14 "rev": "fce7562cf46727fdaf801b232116bc9ce0512049",
15 "sha256": "14rvi69ji61x3z88vbn17rg5vxrnw2wbnanxb7y0qzyqrj7spapx",
16 "type": "tarball",
17 "url": "https://github.com/NixOS/nixpkgs-channels/archive/fce7562cf46727fdaf801b232116bc9ce0512049.tar.gz",
18 "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
19 },
20 "buildbot-denise-aventuriers-nixpkgs": {
21 "branch": "nixos-unstable",
22 "description": "Frozen nixpkgs snapshot for texlive",
23 "homepage": "https://github.com/NixOS/nixpkgs",
24 "owner": "NixOS",
25 "repo": "nixpkgs-channels",
26 "rev": "8e2b14aceb1d40c7e8b84c03a7c78955359872bb",
27 "sha256": "0zzjpd9smr7rxzrdf6raw9kbj42fbvafxb5bz36lcxgv290pgsm8",
28 "type": "tarball",
29 "url": "https://github.com/NixOS/nixpkgs-channels/archive/8e2b14aceb1d40c7e8b84c03a7c78955359872bb.tar.gz",
30 "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
31 },
32 "buildbot-history-deps": {
33 "ref": "master",
34 "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/History",
35 "rev": "5f2aae4f9c92107accfc6fb6db6cb3c1f97ed9dc",
36 "type": "git"
37 },
38 "buildbot-normalesup-deps": {
39 "ref": "master",
40 "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Projets/Sites/Normalesup",
41 "rev": "de294da4027e80a7b8bf7ec8c393ca0b60218575",
42 "type": "git"
43 },
44 "buildbot-normalesup-nixpkgs": {
45 "description": "Frozen nixpkgs snapshot for texlive",
46 "revision": "173017.85f820d6e41",
47 "sha256": "0fs390gvz8d3n7v4zj538gf3n1b14sikbf0ijrxgxib5i0704mdb",
48 "type": "tarball",
49 "url": "https://releases.nixos.org/nixos/19.03/nixos-19.03.173017.85f820d6e41/nixexprs.tar.xz",
50 "url_template": "https://releases.nixos.org/nixos/<version>/nixos-<version>.<revision>/nixexprs.tar.xz",
51 "version": "19.03"
52 },
53 "buildbot-plugin-buildslist": {
54 "ref": "master",
55 "repo": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist",
56 "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
57 "type": "git",
58 "version": "f1d42ba-master"
59 },
60 "home-manager": {
61 "branch": "master",
62 "description": "Manage a user environment using Nix",
63 "homepage": "https://rycee.gitlab.io/home-manager/",
64 "owner": "rycee",
65 "repo": "home-manager",
66 "rev": "6cf6b587b575493e7718bf08b209013d7dcf4d58",
67 "sha256": "0666ayxazbphjn5xcrczv8m7k2q62k224fvf0kz1lx9qjn93wkvr",
68 "type": "tarball",
69 "url": "https://github.com/rycee/home-manager/archive/6cf6b587b575493e7718bf08b209013d7dcf4d58.tar.gz",
70 "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
71 },
72 "niv": {
73 "branch": "master",
74 "description": "Easy dependency management for Nix projects",
75 "homepage": "https://github.com/nmattia/niv",
76 "owner": "nmattia",
77 "repo": "niv",
78 "rev": "372f96bff217a7a019de27667d04118cffa9841b",
79 "sha256": "1l0z6162zw60pdcdj03aq64qgf1vyzmf24i9pxca64i4sprl1b7p",
80 "type": "tarball",
81 "url": "https://github.com/nmattia/niv/archive/372f96bff217a7a019de27667d04118cffa9841b.tar.gz",
82 "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
83 },
84 "nixpkgs": {
85 "branch": "nixos-unstable",
86 "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
87 "homepage": "https://github.com/NixOS/nixpkgs",
88 "owner": "NixOS",
89 "repo": "nixpkgs-channels",
90 "rev": "fce7562cf46727fdaf801b232116bc9ce0512049",
91 "sha256": "14rvi69ji61x3z88vbn17rg5vxrnw2wbnanxb7y0qzyqrj7spapx",
92 "type": "tarball",
93 "url": "https://github.com/NixOS/nixpkgs-channels/archive/fce7562cf46727fdaf801b232116bc9ce0512049.tar.gz",
94 "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
95 },
96 "nixpkgs-home-manager": {
97 "branch": "nixos-unstable",
98 "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
99 "homepage": "https://github.com/NixOS/nixpkgs",
100 "owner": "NixOS",
101 "repo": "nixpkgs-channels",
102 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
103 "sha256": "1ak7jqx94fjhc68xh1lh35kh3w3ndbadprrb762qgvcfb8351x8v",
104 "type": "tarball",
105 "url": "https://github.com/NixOS/nixpkgs-channels/archive/c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38.tar.gz",
106 "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
107 },
108 "nixpkgs-nix": {
109 "branch": "nixos-unstable",
110 "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
111 "homepage": "https://github.com/NixOS/nixpkgs",
112 "owner": "NixOS",
113 "repo": "nixpkgs",
114 "rev": "891f607d5301d6730cb1f9dcf3618bcb1ab7f10e",
115 "sha256": "1cr39f0sbr0h5d83dv1q34mcpwnkwwbdk5fqlyqp2mnxghzwssng",
116 "type": "tarball",
117 "url": "https://github.com/NixOS/nixpkgs/archive/891f607d5301d6730cb1f9dcf3618bcb1ab7f10e.tar.gz",
118 "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
119 },
120 "nixpkgs-nixops": {
121 "branch": "nixos-unstable",
122 "description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
123 "homepage": "https://github.com/NixOS/nixpkgs",
124 "owner": "NixOS",
125 "repo": "nixpkgs-channels",
126 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
127 "sha256": "14q3kvnmgz19pgwyq52gxx0cs90ddf24pnplmq33pdddbb6c51zn",
128 "type": "tarball",
129 "url": "https://github.com/NixOS/nixpkgs-channels/archive/840c782d507d60aaa49aa9e3f6d0b0e780912742.tar.gz",
130 "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
131 },
132 "webapps-landing": {
133 "ref": "gitolite_local/local_changes",
134 "repo": "https://git.immae.eu/github/bastienwirtz/homer.git",
135 "rev": "bb60c5b869931f305f15c5bfa9cdb3f68702f01f",
136 "type": "git",
137 "version": "e0a72b7-local"
138 },
139 "webapps-surfer": {
140 "ref": "master",
141 "repo": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git",
142 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
143 "type": "git",
144 "version": "4761773-master"
145 },
146 "webapps-ttrss": {
147 "ref": "master",
148 "repo": "https://git.tt-rss.org/fox/tt-rss.git",
149 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
150 "type": "git",
151 "version": "986ca25-master"
152 },
153 "websites-chloe-app": {
154 "ref": "master",
155 "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Chloe",
156 "rev": "882f166999a59081ad896f26318e6a04db9f9f43",
157 "type": "git",
158 "version": "882f166-master"
159 },
160 "websites-connexionswing-app": {
161 "ref": "master",
162 "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Projets/Connexionswing",
163 "rev": "ed5874396d35766e0810a6d4e78e1a8f6b170835",
164 "type": "git",
165 "version": "ed58743-master"
166 },
167 "websites-florian-app": {
168 "ref": "master",
169 "repo": "ssh://gitolite@git.immae.eu/perso/florian_telles/stabilo",
170 "rev": "1793d5c7912d1b20ad1df1ac59be9d7f1220e919",
171 "type": "git",
172 "version": "1793d5c-master"
173 },
174 "websites-isabelle-aten": {
175 "ref": "master",
176 "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Aten",
177 "rev": "b99537fdad41291afb4f1bb8b2e2aa4081c71fae",
178 "type": "git",
179 "version": "b99537f-master"
180 },
181 "websites-isabelle-iridologie": {
182 "ref": "master",
183 "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Iridologie",
184 "rev": "2f2ec6b003f4de97e9f8651db540c9114ac877c2",
185 "type": "git",
186 "version": "2f2ec6b-master"
187 },
188 "websites-ludivine-app": {
189 "ref": "master",
190 "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Ludivine",
191 "rev": "eae633b7c5e92184b24141ebf267d51dbc5d2acc",
192 "type": "git",
193 "version": "0dacc32-master"
194 },
195 "websites-piedsjaloux-app": {
196 "ref": "master",
197 "repo": "ssh://gitolite@git.immae.eu/Pieds_jaloux/NewSite",
198 "rev": "2b67b9897180af3d34f87648362337dbf3981158",
199 "type": "git",
200 "version": "2b67b98-master"
201 },
202 "websites-richie-app": {
203 "ref": "master",
204 "repo": "ssh://gitolite@git.immae.eu/perso/Immae/Sites/Richie",
205 "rev": "2a09e29dd9fc4f6abc5add82744bedf1978a35d5",
206 "type": "git",
207 "version": "2a09e29-master"
208 }
209}
diff --git a/nix/sources.nix b/nix/sources.nix
deleted file mode 100644
index 45c97d1..0000000
--- a/nix/sources.nix
+++ /dev/null
@@ -1,135 +0,0 @@
1# This file has been generated by Niv.
2
3let
4
5 #
6 # The fetchers. fetch_<type> fetches specs of type <type>.
7 #
8
9 fetch_file = pkgs: spec:
10 if spec.builtin or true then
11 builtins_fetchurl { inherit (spec) url sha256; }
12 else
13 pkgs.fetchurl { inherit (spec) url sha256; };
14
15 fetch_tarball = pkgs: name: spec:
16 let
17 ok = str: ! builtins.isNull (builtins.match "[a-zA-Z0-9+-._?=]" str);
18 # sanitize the name, though nix will still fail if name starts with period
19 name' = stringAsChars (x: if ! ok x then "-" else x) "${name}-src";
20 in
21 if spec.builtin or true then
22 builtins_fetchTarball { name = name'; inherit (spec) url sha256; }
23 else
24 pkgs.fetchzip { name = name'; inherit (spec) url sha256; };
25
26 fetch_git = spec:
27 builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; };
28
29 fetch_builtin-tarball = name: throw
30 ''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`.
31 $ niv modify ${name} -a type=tarball -a builtin=true'';
32
33 fetch_builtin-url = name: throw
34 ''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`.
35 $ niv modify ${name} -a type=file -a builtin=true'';
36
37 #
38 # Various helpers
39 #
40
41 # The set of packages used when specs are fetched using non-builtins.
42 mkPkgs = sources:
43 let
44 sourcesNixpkgs =
45 import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {};
46 hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
47 hasThisAsNixpkgsPath = <nixpkgs> == ./.;
48 in
49 if builtins.hasAttr "nixpkgs" sources
50 then sourcesNixpkgs
51 else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then
52 import <nixpkgs> {}
53 else
54 abort
55 ''
56 Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or
57 add a package called "nixpkgs" to your sources.json.
58 '';
59
60 # The actual fetching function.
61 fetch = pkgs: name: spec:
62
63 if ! builtins.hasAttr "type" spec then
64 abort "ERROR: niv spec ${name} does not have a 'type' attribute"
65 else if spec.type == "file" then fetch_file pkgs spec
66 else if spec.type == "tarball" then fetch_tarball pkgs name spec
67 else if spec.type == "git" then fetch_git spec
68 else if spec.type == "builtin-tarball" then fetch_builtin-tarball name
69 else if spec.type == "builtin-url" then fetch_builtin-url name
70 else
71 abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}";
72
73 # Ports of functions for older nix versions
74
75 # a Nix version of mapAttrs if the built-in doesn't exist
76 mapAttrs = builtins.mapAttrs or (
77 f: set: with builtins;
78 listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set))
79 );
80
81 # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295
82 range = first: last: if first > last then [] else builtins.genList (n: first + n) (last - first + 1);
83
84 # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257
85 stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1));
86
87 # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269
88 stringAsChars = f: s: concatStrings (map f (stringToCharacters s));
89 concatStrings = builtins.concatStringsSep "";
90
91 # fetchTarball version that is compatible between all the versions of Nix
92 builtins_fetchTarball = { url, name, sha256 }@attrs:
93 let
94 inherit (builtins) lessThan nixVersion fetchTarball;
95 in
96 if lessThan nixVersion "1.12" then
97 fetchTarball { inherit name url; }
98 else
99 fetchTarball attrs;
100
101 # fetchurl version that is compatible between all the versions of Nix
102 builtins_fetchurl = { url, sha256 }@attrs:
103 let
104 inherit (builtins) lessThan nixVersion fetchurl;
105 in
106 if lessThan nixVersion "1.12" then
107 fetchurl { inherit url; }
108 else
109 fetchurl attrs;
110
111 # Create the final "sources" from the config
112 mkSources = config:
113 mapAttrs (
114 name: spec:
115 if builtins.hasAttr "outPath" spec
116 then abort
117 "The values in sources.json should not have an 'outPath' attribute"
118 else
119 spec // { outPath = fetch config.pkgs name spec; }
120 ) config.sources;
121
122 # The "config" used by the fetchers
123 mkConfig =
124 { sourcesFile ? ./sources.json
125 , sources ? builtins.fromJSON (builtins.readFile sourcesFile)
126 , pkgs ? mkPkgs sources
127 }: rec {
128 # The sources, i.e. the attribute set of spec name to spec
129 inherit sources;
130
131 # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
132 inherit pkgs;
133 };
134in
135mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }
diff --git a/nixops/.gitignore b/nixops/.gitignore
deleted file mode 100644
index 2ea467b..0000000
--- a/nixops/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
1/state
diff --git a/nixops/.sops.yaml b/nixops/.sops.yaml
deleted file mode 100644
index 04826a2..0000000
--- a/nixops/.sops.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
1keys:
2 - &Immae F82806FDA1BF5B9A1B3014E7C9FCED6CA6B79454
3 # obtained with: ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age
4 - &eldiron age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj
5 - &monitoring-1 age1dn4lzhgxusqrpjjnzm7w8ml39ptf326htuzmpqdqs2gg3wq7cqzqxuvx8k
6 - &backup-2 age1kk3nr27qu42j28mcfdag5lhq0zu2pky7gfanvne8l4z2ctevjpgskmw0sr
7 - &dilion age1x49n6qa0arkdpq8530s7umgm0gqkq90exv4jep97q30rfnzknpaqate06a
8 - &quatresaisons age1yz8u6xvh2fltvyp96ep8crce3qx4tuceyhun6pwddfe0uvcrkarscxl7e7
9creation_rules:
10 - path_regex: vars.yml
11 key_groups:
12 - pgp:
13 - *Immae
14 age:
15 - *eldiron
16 - *monitoring-1
17 - *backup-2
18 - *dilion
19 - *quatresaisons
diff --git a/nixops/Makefile b/nixops/Makefile
deleted file mode 100644
index fb9da4c..0000000
--- a/nixops/Makefile
+++ /dev/null
@@ -1,102 +0,0 @@
1ifndef NIXOPS_ENV_LOADED
2 $(error "Please load environment with direnv")
3endif
4
5###### Current channel information
6nix-info:
7 @version=$$(nix eval --raw nixpkgs.lib.version) && \
8 mainversion=$$(echo $$version | cut -d"." -f -2) && \
9 echo "https://releases.nixos.org/nixos/$$mainversion/nixos-$$version/nixexprs.tar.xz" && \
10 nix-instantiate --find-file nixpkgs
11.PHONY: nix-info
12
13###### Initial setup
14setup:
15 ./scripts/setup
16.PHONY: setup
17
18###### Morph regular tasks
19PROFILE=/nix/var/nix/profiles/per-user/immae/morph/immaeEu
20TARGET ?=
21MORPH_ARGS ?=
22ifdef TARGET
23 # multiple targets: --on="{machine1,machine2}" (works with * glob too)
24 override MORPH_ARGS +=--on=$(TARGET)
25endif
26SSH_ARGS ?=
27
28edit_env:
29 $(EDITOR) secrets/environment.nix || true
30 git -C secrets add environment.nix || true
31 git -C secrets commit -m "Edit environment.nix" environment.nix || true
32
33edit_vars:
34 sops secrets/vars.yml || true
35 git -C secrets add vars.yml || true
36 git -C secrets commit -m "Edit password for vars.yml using sops." vars.yml || true
37
38ssh-eldiron:
39 ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@eldiron $(SSH_ARGS)'
40
41ssh-dilion:
42 ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@dilion $(SSH_ARGS)'
43
44ssh-backup-2:
45 ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@backup-2 $(SSH_ARGS)'
46
47ssh-monitoring-1:
48 ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@monitoring-1 $(SSH_ARGS)'
49
50ssh-4c:
51 ./scripts/with_env bash -c 'ssh -i $$SSH_IDENTITY_FILE root@quatresaisons $(SSH_ARGS)'
52
53debug:
54 ./scripts/with_env morph build --show-trace default.nix $(MORPH_ARGS)
55
56build:
57 ./scripts/with_env morph build default.nix $(MORPH_ARGS)
58
59dry-run:
60 ./scripts/with_env morph build --dry-run default.nix $(MORPH_ARGS)
61
62upload:
63 ./scripts/with_env morph push default.nix $(MORPH_ARGS)
64
65deploy:
66 ./scripts/with_env morph deploy default.nix switch --keep-result --upload-secrets $(MORPH_ARGS)
67 nix-env -p $(PROFILE) --set .gcroots/default.nix
68
69next-boot:
70 ./scripts/with_env morph deploy default.nix boot --keep-result --upload-secrets $(MORPH_ARGS)
71 nix-env -p $(PROFILE) --set .gcroots/default.nix
72
73deploy-reboot:
74 ./scripts/with_env morph deploy default.nix boot --reboot --upload-secrets $(MORPH_ARGS)
75
76.PHONY: ssh-eldiron ssh-dilion ssh-monitoring-1 ssh-backup-2 debug build upload deploy deploy-reboot
77
78###### Cleanup generations and garbage collection
79GEN ?= "+3"
80
81list-generations:
82 nix-env -p $(PROFILE) --list-generations
83 $(MAKE) ssh-eldiron SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --list-generations"
84.PHONY: list-generations
85
86delete-generations:
87 @echo "making sure that a complete build is done before cleaning up"
88 $(MAKE) build MORPH_ARGS=--keep-result
89 nix-env -p $(PROFILE) --delete-generations $(GEN)
90 $(MAKE) ssh-eldiron SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)"
91 $(MAKE) ssh-dilion SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)"
92 $(MAKE) ssh-backup-2 SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)"
93 $(MAKE) ssh-monitoring-1 SSH_ARGS="nix-env -p /nix/var/nix/profiles/system --delete-generations $(GEN)"
94.PHONY: delete-generations
95
96cleanup: delete-generations
97 nix-store --gc
98 $(MAKE) ssh-eldiron SSH_ARGS="nix-store --gc"
99 $(MAKE) ssh-dilion SSH_ARGS="nix-store --gc"
100 $(MAKE) ssh-backup-2 SSH_ARGS="nix-store --gc"
101 $(MAKE) ssh-monitoring-1 SSH_ARGS="nix-store --gc"
102.PHONY: cleanup
diff --git a/nixops/default.nix b/nixops/default.nix
deleted file mode 100644
index 1241443..0000000
--- a/nixops/default.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{
2 dilion = import ../modules/private/system/dilion.nix;
3 eldiron = import ../modules/private/system/eldiron.nix;
4 backup-2 = import ../modules/private/system/backup-2.nix;
5 monitoring-1 = import ../modules/private/system/monitoring-1.nix;
6
7 quatresaisons = import ../modules/private/system/quatresaisons.nix;
8}
diff --git a/nixops/scripts/with_env b/nixops/scripts/with_env
deleted file mode 100755
index c570ccf..0000000
--- a/nixops/scripts/with_env
+++ /dev/null
@@ -1,22 +0,0 @@
1#!/usr/bin/env bash
2
3if [ -z "$NIXOPS_ENV_LOADED" ]; then
4 echo "Please load the environment with direnv"
5 exit 1;
6fi
7
8umask 0077
9TEMP=$(mktemp -d /tmp/XXXXXX-nixops-files)
10chmod go-rwx $TEMP
11
12finish() {
13 rm -rf "$TEMP"
14}
15
16trap finish EXIT
17
18sops -d secrets/vars.yml | yq -r .ssl_keys.nix_repository > $TEMP/id_ed25519
19
20export SSH_IDENTITY_FILE="$TEMP/id_ed25519"
21
22"$@"
diff --git a/nixops/secrets b/nixops/secrets
deleted file mode 160000
Subproject 8c6277e3c2762e13d5f1f2ac06d2e815e02fab8
diff --git a/overlays/bitlbee-discord/default.nix b/overlays/bitlbee-discord/default.nix
deleted file mode 100644
index bf8e5db..0000000
--- a/overlays/bitlbee-discord/default.nix
+++ /dev/null
@@ -1,12 +0,0 @@
1self: super: {
2 bitlbee-discord = super.bitlbee-discord.overrideAttrs(old: rec {
3 version = "master-3061edd";
4 name = "bitlbee-discord-${version}";
5 src = self.fetchFromGitHub {
6 rev = "master";
7 owner = "sm00th";
8 repo = "bitlbee-discord";
9 sha256 = "07gjd4b0g09888gpaqwcjafr8m292y2qz0gzharxjh1k2jbs88g3";
10 };
11 });
12}
diff --git a/overlays/bonfire/default.nix b/overlays/bonfire/default.nix
deleted file mode 100644
index 6dc1034..0000000
--- a/overlays/bonfire/default.nix
+++ /dev/null
@@ -1,36 +0,0 @@
1self: super: {
2 bonfire = let
3 click = self.python3Packages.click.overridePythonAttrs(old: rec {
4 version = "6.7";
5 src = self.python3Packages.fetchPypi {
6 pname = "click";
7 inherit version;
8 sha256 = "02qkfpykbq35id8glfgwc38yc430427yd05z1wc5cnld8zgicmgi";
9 };
10 postPatch = ''
11 substituteInPlace click/_unicodefun.py --replace "'locale'" "'${self.locale}/bin/locale'"
12 '';
13 doCheck = false;
14 });
15 keyring = self.python3Packages.keyring.overridePythonAttrs(old: rec {
16 version = "20.0.1";
17 src = self.python3Packages.fetchPypi {
18 pname = "keyring";
19 inherit version;
20 sha256 = "963bfa7f090269d30bdc5e25589e5fd9dad2cf2a7c6f176a7f2386910e5d0d8d";
21 };
22 });
23 in
24 super.bonfire.overridePythonAttrs(old: {
25 version = "0.0.8";
26 src = self.fetchFromGitHub {
27 owner = "blue-yonder";
28 repo = "bonfire";
29 rev = "0a0f18469d484aba6871fa7421bbb2c00ccefcb0";
30 sha256 = "1y2r537ibghhmk6jngw0zwvh1vn2bihqcvji50ffh1j0qc6q3x6x";
31 };
32 postPatch = "";
33 propagatedBuildInputs = self.lib.subtractLists [ self.python3Packages.click self.python3Packages.keyring ] old.propagatedBuildInputs ++ [ click keyring ];
34 meta.broken = false;
35 });
36}
diff --git a/overlays/bugwarrior/default.nix b/overlays/bugwarrior/default.nix
deleted file mode 100644
index 2b25985..0000000
--- a/overlays/bugwarrior/default.nix
+++ /dev/null
@@ -1,5 +0,0 @@
1self: super: {
2 bugwarrior = super.python3Packages.bugwarrior.overridePythonAttrs(old: rec {
3 patches = old.patches or [] ++ [ ./mantisbt.patch ];
4 });
5}
diff --git a/overlays/bugwarrior/mantisbt.patch b/overlays/bugwarrior/mantisbt.patch
deleted file mode 100644
index 85e5af1..0000000
--- a/overlays/bugwarrior/mantisbt.patch
+++ /dev/null
@@ -1,379 +0,0 @@
1diff --git a/bugwarrior/services/mantisbt.py b/bugwarrior/services/mantisbt.py
2new file mode 100644
3index 0000000..e54af0d
4--- /dev/null
5+++ b/bugwarrior/services/mantisbt.py
6@@ -0,0 +1,361 @@
7+from builtins import filter
8+import re
9+import six
10+
11+import requests
12+from jinja2 import Template
13+
14+from bugwarrior.config import asbool, aslist, die
15+from bugwarrior.services import IssueService, Issue, ServiceClient
16+
17+import logging
18+log = logging.getLogger(__name__)
19+
20+
21+class MantisbtClient(ServiceClient):
22+ def __init__(self, host, token):
23+ self.host = host
24+ self.session = requests.Session()
25+ self.session.headers['Authorization'] = token
26+
27+ def _api_url(self, path, **context):
28+ """ Build the full url to the API endpoint """
29+ baseurl = "https://{}/api/rest".format(self.host)
30+ return baseurl + path.format(**context)
31+
32+ def get_user(self):
33+ return self.json_response(self.session.get(self._api_url("/users/me")))
34+
35+ def get_projects(self):
36+ return self._getter(self._api_url("/projects"), subkey="projects")
37+
38+ def get_issues(self):
39+ url = self._api_url("/issues?page_size=50")
40+ return self._getter(url, page_size=50, subkey="issues")
41+
42+ def get_assigned_issues(self):
43+ """ Returns all issues assigned to authenticated user.
44+ """
45+ url = self._api_url("/issues?page_size=50&filter_id=assigned")
46+ return self._getter(url, page_size=50, subkey="issues")
47+
48+ def get_monitored_issues(self):
49+ """ Returns all issues monitored by authenticated user.
50+ """
51+ url = self._api_url("/issues?page_size=50&filter_id=monitored")
52+ return self._getter(url, page_size=50, subkey="issues")
53+
54+ def get_reported_issues(self):
55+ """ Returns all issues reported by authenticated user.
56+ """
57+ url = self._api_url("/issues?page_size=50&filter_id=reported")
58+ return self._getter(url, page_size=50, subkey="issues")
59+
60+ def _getter(self, url, page_size=None, subkey=None):
61+ """ Pagination utility. Obnoxious. """
62+
63+ results = []
64+ link = dict(next=url)
65+ page_number = 1
66+
67+ while 'next' in link:
68+ if page_size is not None:
69+ response = self.session.get(link['next'] + "&page=" + str(page_number))
70+ else:
71+ response = self.session.get(link['next'])
72+
73+ json_res = self.json_response(response)
74+
75+ if subkey is not None:
76+ json_res = json_res[subkey]
77+
78+ results += json_res
79+
80+ if page_size is not None and len(json_res) == page_size:
81+ page_number += 1
82+ else:
83+ break
84+
85+ return results
86+
87+class MantisbtIssue(Issue):
88+ TITLE = 'mantisbttitle'
89+ BODY = 'mantisbtbody'
90+ CREATED_AT = 'mantisbtcreatedon'
91+ UPDATED_AT = 'mantisbtupdatedat'
92+ CLOSED_AT = 'mantisbtclosedon'
93+ URL = 'mantisbturl'
94+ PROJECT = 'mantisbtproject'
95+ NUMBER = 'mantisbtnumber'
96+ USER = 'mantisbtuser'
97+ CATEGORY = 'mantisbtcategory'
98+ STATE = 'mantisbtstate'
99+
100+ UDAS = {
101+ TITLE: {
102+ 'type': 'string',
103+ 'label': 'Mantisbt Title',
104+ },
105+ BODY: {
106+ 'type': 'string',
107+ 'label': 'Mantisbt Body',
108+ },
109+ CREATED_AT: {
110+ 'type': 'date',
111+ 'label': 'Mantisbt Created',
112+ },
113+ UPDATED_AT: {
114+ 'type': 'date',
115+ 'label': 'Mantisbt Updated',
116+ },
117+ CLOSED_AT: {
118+ 'type': 'date',
119+ 'label': 'Mantisbt Closed',
120+ },
121+ PROJECT: {
122+ 'type': 'string',
123+ 'label': 'Mantisbt Project',
124+ },
125+ URL: {
126+ 'type': 'string',
127+ 'label': 'Mantisbt URL',
128+ },
129+ NUMBER: {
130+ 'type': 'numeric',
131+ 'label': 'Mantisbt Issue #',
132+ },
133+ USER: {
134+ 'type': 'string',
135+ 'label': 'Mantisbt User',
136+ },
137+ CATEGORY: {
138+ 'type': 'string',
139+ 'label': 'Mantisbt Category',
140+ },
141+ STATE: {
142+ 'type': 'string',
143+ 'label': 'Mantisbt State',
144+ }
145+ }
146+ UNIQUE_KEY = (URL, NUMBER, )
147+
148+ def _normalize_tag(self, label):
149+ return re.sub(r'[^a-zA-Z0-9]', '_', label)
150+
151+ def to_taskwarrior(self):
152+ body = self.record.get('description')
153+ if body:
154+ body = body.replace('\r\n', '\n')
155+
156+ created = self.parse_date(self.record.get('created_at'))
157+ updated = self.parse_date(self.record.get('updated_at'))
158+ closed_date = None
159+ if self.record["status"]["name"] in ["closed", "resolved"]:
160+ for history in self.record.get("history", []):
161+ if history.get("field", {}).get("name", "") == "status"\
162+ and history.get("new_value", {}).get("name", "") in ["closed", "resolved"]:
163+ closed_date = history["created_at"]
164+ closed = self.parse_date(closed_date)
165+
166+ return {
167+ 'project': self.record['project']['name'],
168+ 'priority': self.origin['default_priority'],
169+ 'annotations': self.get_annotations(),
170+ 'tags': self.get_tags(),
171+ 'entry': created,
172+ 'end': closed,
173+
174+ self.TITLE: self.record.get('summary'),
175+ self.BODY: body,
176+ self.CREATED_AT: created,
177+ self.UPDATED_AT: updated,
178+ self.CLOSED_AT: closed,
179+ self.URL: self.get_url(),
180+ self.PROJECT: self.record['project'].get('name'),
181+ self.NUMBER: self.record['id'],
182+ self.USER: self.record['reporter'].get('name'),
183+ self.CATEGORY: self.record['category'].get('name'),
184+ self.STATE: self.record['status'].get('label'),
185+ }
186+
187+ def get_url(self):
188+ return "https://{}view.php?id={}".format(self.extra['host'], self.record["id"])
189+
190+ def get_annotations(self):
191+ annotations = []
192+
193+ context = self.record.copy()
194+ annotation_template = Template(self.origin['annotation_template'])
195+
196+ for annotation_dict in self.record.get('notes', []):
197+ context.update({
198+ 'text': annotation_dict['text'],
199+ 'date': annotation_dict['created_at'],
200+ 'author': annotation_dict['reporter'].get('name', 'unknown'),
201+ 'view': annotation_dict['view_state']['label'],
202+ })
203+ annotations.append(
204+ annotation_template.render(context)
205+ )
206+ return annotations
207+
208+ def get_tags(self):
209+ tags = []
210+
211+ context = self.record.copy()
212+ tag_template = Template(self.origin['tag_template'])
213+
214+ for tag_dict in self.record.get('tags', []):
215+ context.update({
216+ 'tag': self._normalize_tag(tag_dict['name'])
217+ })
218+ tags.append(
219+ tag_template.render(context)
220+ )
221+
222+ return tags
223+
224+ def get_default_description(self):
225+ return self.build_default_description(
226+ title=self.record['summary'],
227+ url=self.get_processed_url(self.get_url()),
228+ number=self.record['id'],
229+ )
230+
231+
232+class MantisbtService(IssueService):
233+ ISSUE_CLASS = MantisbtIssue
234+ CONFIG_PREFIX = 'mantisbt'
235+
236+ def __init__(self, *args, **kw):
237+ super(MantisbtService, self).__init__(*args, **kw)
238+
239+ self.host = self.config.get('host', 'www.mantisbt.org/bugs/')
240+
241+ token = self.get_password('token')
242+
243+ self.client = MantisbtClient(self.host, token)
244+ self.user = None
245+
246+ self.exclude_projects = self.config.get('exclude_projects', [], aslist)
247+ self.include_projects = self.config.get('include_projects', [], aslist)
248+
249+ self.involved_issues = self.config.get(
250+ 'involved_issues', default=True, to_type=asbool
251+ )
252+ self.assigned_issues = self.config.get(
253+ 'assigned_issues', default=False, to_type=asbool
254+ )
255+ self.monitored_issues = self.config.get(
256+ 'monitored_issues', default=False, to_type=asbool
257+ )
258+ self.reported_issues = self.config.get(
259+ 'reported_issues', default=False, to_type=asbool
260+ )
261+ self.tag_template = self.config.get(
262+ 'tag_template', default='{{tag}}', to_type=six.text_type
263+ )
264+ self.annotation_template = self.config.get(
265+ 'annotation_template', default='{{date}} {{author}} ({{view}}): {{text}}', to_type=six.text_type
266+ )
267+
268+ def get_service_metadata(self):
269+ return {
270+ 'tag_template': self.tag_template,
271+ 'annotation_template': self.annotation_template,
272+ }
273+
274+ def filter_involved_issues(self, issue):
275+ _, issue = issue
276+ user = self.client.get_user()
277+ uid = user["id"]
278+ if issue["reporter"]["id"] != uid and \
279+ issue.get("handler", {}).get("id") != uid and \
280+ all([ x.get("user", {}).get("id") != uid for x in issue.get("history", [])]) and \
281+ all([ x.get("user", {}).get("id") != uid for x in issue.get("monitors", [])]):
282+ return False
283+ return self.filter_project_name(issue["project"]["name"])
284+
285+ def filter_issues(self, issue):
286+ _, issue = issue
287+ return self.filter_project_name(issue["project"]["name"])
288+
289+ def filter_project_name(self, name):
290+ if self.exclude_projects:
291+ if name in self.exclude_projects:
292+ return False
293+
294+ if self.include_projects:
295+ if name in self.include_projects:
296+ return True
297+ else:
298+ return False
299+
300+ return True
301+
302+ @staticmethod
303+ def get_keyring_service(service_config):
304+ host = service_config.get('host', 'www.mantisbt.org/bugs/')
305+ username = service_config.get('username', default='nousername')
306+ return "mantisbt://{username}@{host}".format(username=username,
307+ host=host)
308+
309+ @staticmethod
310+ def to_issue_dict(issues):
311+ return { i['id']: i for i in issues }
312+
313+ def get_owner(self, issue):
314+ return issue.get("handler", {}).get("name")
315+
316+ def get_author(self, issue):
317+ return issue.get("reporter", {}).get("name")
318+
319+ def issues(self):
320+ issues = {}
321+ is_limited = self.assigned_issues or self.monitored_issues or self.reported_issues
322+
323+ if self.assigned_issues:
324+ issues.update(
325+ filter(self.filter_issues, self.to_issue_dict(self.client.get_assigned_issues()).items())
326+ )
327+ if self.monitored_issues:
328+ issues.update(
329+ filter(self.filter_issues, self.to_issue_dict(self.client.get_monitored_issues()).items())
330+ )
331+ if self.reported_issues:
332+ issues.update(
333+ filter(self.filter_issues, self.to_issue_dict(self.client.get_reported_issues()).items())
334+ )
335+
336+ if not is_limited:
337+ all_issues = self.to_issue_dict(self.client.get_issues())
338+ if self.involved_issues:
339+ issues.update(
340+ filter(self.filter_involved_issues, all_issues.items())
341+ )
342+ else:
343+ issues.update(
344+ filter(self.filter_issues, all_issues.items())
345+ )
346+
347+ log.debug(" Found %i issues.", len(issues))
348+ if not is_limited:
349+ issues = list(filter(self.include, issues.values()))
350+ else:
351+ issues = list(issues.values())
352+ log.debug(" Pruned down to %i issues.", len(issues))
353+
354+ for issue in issues:
355+ issue_obj = self.get_issue_for_record(issue)
356+ extra = {
357+ 'host': self.host
358+ }
359+ issue_obj.update_extra(extra)
360+ yield issue_obj
361+
362+ @classmethod
363+ def validate_config(cls, service_config, target):
364+ if 'token' not in service_config:
365+ die("[%s] has no 'mantisbt.token'" % target)
366+
367+ super(MantisbtService, cls).validate_config(service_config, target)
368diff --git a/setup.py b/setup.py
369index d6d957a..665e36e 100644
370--- a/setup.py
371+++ b/setup.py
372@@ -80,6 +80,7 @@ setup(name='bugwarrior',
373 activecollab2=bugwarrior.services.activecollab2:ActiveCollab2Service
374 activecollab=bugwarrior.services.activecollab:ActiveCollabService
375 jira=bugwarrior.services.jira:JiraService
376+ mantisbt=bugwarrior.services.mantisbt:MantisbtService
377 megaplan=bugwarrior.services.megaplan:MegaplanService
378 phabricator=bugwarrior.services.phab:PhabricatorService
379 versionone=bugwarrior.services.versionone:VersionOneService
diff --git a/overlays/bundix/default.nix b/overlays/bundix/default.nix
deleted file mode 100644
index 6c4046c..0000000
--- a/overlays/bundix/default.nix
+++ /dev/null
@@ -1,7 +0,0 @@
1self: super: {
2 bundix = super.bundix.overrideAttrs (old: {
3 preBuild = (old.preBuild or "") + ''
4 sed -i -e "/case obj/a\ when nil\n nil" lib/bundix/nixer.rb
5 '';
6 });
7}
diff --git a/overlays/databases/mysql/default.nix b/overlays/databases/mysql/default.nix
deleted file mode 100644
index f9e5791..0000000
--- a/overlays/databases/mysql/default.nix
+++ /dev/null
@@ -1,24 +0,0 @@
1self: super: rec {
2 mariadb_pam = super.mariadb.overrideAttrs(old: {
3 cmakeFlags = old.cmakeFlags ++ [ "-DWITH_AUTHENTICATION_PAM=ON" ];
4 buildInputs = old.buildInputs ++ [ self.pam ];
5 outputs = old.outputs ++ [ "dev" ];
6 postInstall = ''
7 mkdir -p $dev $dev/lib $dev/share
8 cp -a $out/include $dev
9 cp -a $out/lib/{libmariadbclient.a,libmysqlclient.a,libmysqlclient_r.a,libmysqlservices.a} $dev/lib
10 cp -a $out/lib/pkgconfig $dev/lib
11 cp -a $out/share/aclocal $dev/share
12 '' + old.postInstall;
13 });
14 # This patched version includes C headers from the server part (see
15 # above). It seems to be required to build pam support in clients.
16 libmysqlclient_pam = super.libmysqlclient.overrideAttrs(old: {
17 prePatch = old.prePatch or "" + ''
18 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
19 '';
20 postInstall = old.postInstall or "" + ''
21 cp -a ${mariadb_pam.dev}/include/* $out/include/mariadb
22 '';
23 });
24}
diff --git a/overlays/default.nix b/overlays/default.nix
deleted file mode 100644
index bdc99d2..0000000
--- a/overlays/default.nix
+++ /dev/null
@@ -1,48 +0,0 @@
1let
2 flakeCompat = import ../lib/flake-compat.nix;
3 flakes = builtins.foldl' (a: b: a // b) {} (map (n: (flakeCompat n).overlays) [
4 ../flakes/backports
5 ../flakes/openarc
6 ../flakes/opendmarc
7 ../flakes/peertube
8 ../flakes/private/peertube
9 ]);
10in flakes // {
11 mylibs = self: super: { mylibs = import ../lib { pkgs = self; }; };
12 mypkgs = self: super: import ../pkgs { pkgs = self; };
13
14 bitlbee = import ./bitlbee;
15 bitlbee-discord = import ./bitlbee-discord;
16 bonfire = import ./bonfire;
17 bundix = import ./bundix;
18 bugwarrior = import ./bugwarrior;
19 dwm = import ./dwm;
20 elinks = import ./elinks;
21 gitweb = import ./gitweb;
22 gitolite = import ./gitolite;
23 goaccess = import ./goaccess;
24 kanboard = import ./kanboard;
25 ledger = import ./ledger;
26 lesspipe = import ./lesspipe;
27 mysql = import ./databases/mysql;
28 neomutt = import ./neomutt;
29 nixops = import ./nixops;
30 pass = import ./pass;
31 pelican = import ./pelican;
32 php-packages = import ./php-packages;
33 postfix = import ./postfix;
34 postgresql = import ./databases/postgresql;
35 procps-ng = import ./procps-ng;
36 sc-im = import ./sc-im;
37 shaarli = import ./shaarli;
38 slrn = import ./slrn;
39 taskwarrior = import ./taskwarrior;
40 vcsh = import ./vcsh;
41 weechat = import ./weechat;
42 ympd = import ./ympd;
43 doing = import ./doing;
44 khal = import ./khal;
45 nix-direnv = import ./nix-direnv;
46 morph = import ./morph;
47}
48// import ./python-packages
diff --git a/overlays/doing/default.nix b/overlays/doing/default.nix
deleted file mode 100644
index 7f95fb6..0000000
--- a/overlays/doing/default.nix
+++ /dev/null
@@ -1,10 +0,0 @@
1self: super: {
2 defaultGemConfig = super.defaultGemConfig // {
3 doing = attrs: {
4 postInstall = ''
5 installPath=$(cat $out/nix-support/gem-meta/install-path)
6 sed -i $installPath/lib/doing/wwid.rb -e "/Create a backup copy for the undo command/ {n;d}"
7 '';
8 };
9 };
10}
diff --git a/overlays/dwm/default.nix b/overlays/dwm/default.nix
deleted file mode 100644
index 96ed3ff..0000000
--- a/overlays/dwm/default.nix
+++ /dev/null
@@ -1,7 +0,0 @@
1self: super: {
2 dwm = super.dwm.overrideAttrs(old: rec {
3 postPatch = ''
4 cp ${./dwm_config.h} ./config.h
5 '';
6 });
7}
diff --git a/overlays/dwm/dwm_config.h b/overlays/dwm/dwm_config.h
deleted file mode 100644
index b1587e8..0000000
--- a/overlays/dwm/dwm_config.h
+++ /dev/null
@@ -1,98 +0,0 @@
1/* See LICENSE file for copyright and license details. */
2
3/* appearance */
4static const unsigned int borderpx = 1; /* border pixel of windows */
5static const unsigned int snap = 32; /* snap pixel */
6static const int showbar = 1; /* 0 means no bar */
7static const int topbar = 1; /* 0 means bottom bar */
8static const char *fonts[] = { "monospace:size=10" };
9static const char dmenufont[] = "monospace:size=10";
10static const char col_gray1[] = "#222222";
11static const char col_gray2[] = "#444444";
12static const char col_gray3[] = "#bbbbbb";
13static const char col_gray4[] = "#eeeeee";
14static const char col_cyan[] = "#005577";
15static const char *colors[][3] = {
16 /* fg bg border */
17 [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
18 [SchemeSel] = { col_gray4, col_cyan, col_cyan },
19};
20
21/* tagging */
22static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
23
24static const Rule rules[] = {
25 /* xprop(1):
26 * WM_CLASS(STRING) = instance, class
27 * WM_NAME(STRING) = title
28 */
29 /* class instance title tags mask isfloating monitor */
30 { "Nextcloud", NULL, NULL, 9 << 8, 0, -1 },
31};
32
33/* layout(s) */
34static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
35static const int nmaster = 1; /* number of clients in master area */
36static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
37
38static const Layout layouts[] = {
39 /* symbol arrange function */
40 { "[M]", monocle }, /* first entry is default */
41 { "[]=", tile },
42 { "><>", NULL }, /* no layout function means floating behavior */
43};
44
45/* key definitions */
46#define MODKEY Mod1Mask
47#define TAGKEYS(KEY,TAG) \
48 { MODKEY, KEY, view, {.ui = 1 << TAG} }, \
49 { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
50 { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
51 { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
52
53/* helper for spawning shell commands in the pre dwm-5.0 fashion */
54#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
55
56/* commands */
57static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
58static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
59static const char *termcmd[] = { "st", NULL };
60
61static Key keys[] = {
62 /* modifier key function argument */
63 { MODKEY, XK_p, spawn, {.v = dmenucmd } },
64 { MODKEY, XK_t, spawn, {.v = termcmd } },
65 { MODKEY, XK_Tab, view, {0} },
66 { MODKEY|ShiftMask, XK_c, killclient, {0} },
67 { MODKEY, XK_j, focusstack, {.i = +1 } },
68 { MODKEY, XK_k, focusstack, {.i = -1 } },
69 { MODKEY, XK_Return, zoom, {0} },
70 TAGKEYS( XK_1, 0)
71 TAGKEYS( XK_2, 1)
72 TAGKEYS( XK_3, 2)
73 TAGKEYS( XK_4, 3)
74 TAGKEYS( XK_5, 4)
75 TAGKEYS( XK_6, 5)
76 TAGKEYS( XK_7, 6)
77 TAGKEYS( XK_8, 7)
78 TAGKEYS( XK_9, 8)
79 { MODKEY|ShiftMask, XK_q, quit, {0} },
80};
81
82/* button definitions */
83/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
84static Button buttons[] = {
85 /* click event mask button function argument */
86 { ClkLtSymbol, 0, Button1, setlayout, {0} },
87 { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
88 { ClkWinTitle, 0, Button2, zoom, {0} },
89 { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
90 { ClkClientWin, MODKEY, Button1, movemouse, {0} },
91 { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
92 { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
93 { ClkTagBar, 0, Button1, view, {0} },
94 { ClkTagBar, 0, Button3, toggleview, {0} },
95 { ClkTagBar, MODKEY, Button1, tag, {0} },
96 { ClkTagBar, MODKEY, Button3, toggletag, {0} },
97};
98
diff --git a/overlays/elinks/default.nix b/overlays/elinks/default.nix
deleted file mode 100644
index 1744dc0..0000000
--- a/overlays/elinks/default.nix
+++ /dev/null
@@ -1,14 +0,0 @@
1self: super: {
2 elinks = super.elinks.overrideAttrs (old:
3 self.mylibs.fetchedGithub ./elinks.json // rec {
4 preConfigure = ''sh autogen.sh'';
5 buildInputs = old.buildInputs ++ (with self; [ gettext automake autoconf ]);
6 configureFlags = [
7 "--disable-smb" "--without-x" "--enable-cgi"
8 "--enable-leds" "--enable-256-colors"
9 "--enable-html-highlight" "--with-zlib"
10 ];
11 patches = [];
12 }
13 );
14}
diff --git a/overlays/elinks/elinks.json b/overlays/elinks/elinks.json
deleted file mode 100644
index ea13b1f..0000000
--- a/overlays/elinks/elinks.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "f86be65-master",
3 "meta": {
4 "name": "elinks",
5 "url": "https://github.com/nabetaro/elinks",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "nabetaro",
10 "repo": "elinks",
11 "rev": "f86be659718c0cd0a67f88b42f07044c23d0d028",
12 "sha256": "1jxb7xgawcjkb3gw4gqyw26g02709wwdbhyczfckh3l4njxhy14m",
13 "fetchSubmodules": true
14 }
15}
diff --git a/overlays/kanboard/default.nix b/overlays/kanboard/default.nix
deleted file mode 100644
index 05f2882..0000000
--- a/overlays/kanboard/default.nix
+++ /dev/null
@@ -1,18 +0,0 @@
1self: super: {
2 kanboard = { kanboard_config ? "/etc/kanboard/config.php" }:
3 super.kanboard.overrideAttrs(old: rec {
4 name = "kanboard-${version}";
5 version = "1.2.9";
6 src = self.fetchFromGitHub {
7 owner = "kanboard";
8 repo = "kanboard";
9 rev = "c4152316b14936556edf3bcc4d11f16ba31b8ae7";
10 sha256 = "1hdr95cpxgdzrzhffs63gdl0g7122ma2zg8bkqwp42p5xphx0xan";
11 };
12 installPhase = ''
13 cp -a . $out
14 ln -s ${kanboard_config} $out/config.php
15 mv $out/data $out/dataold
16 '';
17 });
18}
diff --git a/overlays/khal/default.nix b/overlays/khal/default.nix
deleted file mode 100644
index 597cc0e..0000000
--- a/overlays/khal/default.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1self: super: {
2 khal = super.khal.overridePythonAttrs(old: {
3 postPatch = ''
4 sed -i "s/Invalid value for \"ics\"/Invalid value for \\\'ics\\\'/" tests/cli_test.py
5 sed -i "s/Invalid value for \"\[ICS\]\"/Invalid value for \\\'[ICS]\\\'/" tests/cli_test.py
6 '';
7 });
8}
diff --git a/overlays/ledger/default.nix b/overlays/ledger/default.nix
deleted file mode 100644
index 9f2df57..0000000
--- a/overlays/ledger/default.nix
+++ /dev/null
@@ -1,20 +0,0 @@
1self: super: {
2 ledger = super.ledger.overrideAttrs(old: rec {
3 #name = "${old.pname}-${version}";
4 #version = "3.2.1";
5 #src = self.fetchFromGitHub {
6 # owner = "ledger";
7 # repo = "ledger";
8 # rev = "v${version}";
9 # sha256 = "0x6jxwss3wwzbzlwmnwb8yzjk8f9wfawif4f1b74z2qg6hc4r7f6";
10 #};
11 patches = old.patches or [] ++ [
12 (self.fetchpatch {
13 name = "xdgconfig.patch";
14 url = "https://github.com/ledger/ledger/commit/c79674649dee7577d6061e3d0776922257520fd0.patch";
15 sha256 = "0n82mjz9i17800r7vs45sxpss14rivsf1j8hrv7jal24iyfm01dz";
16 excludes = [ "doc/NEWS.md" ];
17 })
18 ];
19 });
20}
diff --git a/overlays/lesspipe/default.nix b/overlays/lesspipe/default.nix
deleted file mode 100644
index e53feae..0000000
--- a/overlays/lesspipe/default.nix
+++ /dev/null
@@ -1,5 +0,0 @@
1self: super: {
2 lesspipe = super.lesspipe.overrideAttrs(old: {
3 configureFlags = (old.configureFlags or []) ++ [ "--yes" ];
4 });
5}
diff --git a/overlays/morph/default.nix b/overlays/morph/default.nix
deleted file mode 100644
index 448f051..0000000
--- a/overlays/morph/default.nix
+++ /dev/null
@@ -1,5 +0,0 @@
1self: super: {
2 morph = super.morph.overrideAttrs(old: {
3 patches = (old.patches or []) ++ [ ./verbose_nix.patch ./dry-run.patch ];
4 });
5}
diff --git a/overlays/neomutt/default.nix b/overlays/neomutt/default.nix
deleted file mode 100644
index f03290a..0000000
--- a/overlays/neomutt/default.nix
+++ /dev/null
@@ -1,7 +0,0 @@
1self: super: {
2 neomutt = super.neomutt.overrideAttrs(old: {
3 patches = old.patches or [] ++ [
4 ./tx.patch
5 ];
6 });
7}
diff --git a/overlays/neomutt/tx.patch b/overlays/neomutt/tx.patch
deleted file mode 100644
index c8736df..0000000
--- a/overlays/neomutt/tx.patch
+++ /dev/null
@@ -1,44 +0,0 @@
1commit 61ae454e1579d02736c48e3468a3237429214cdf
2Author: Ismaël Bouya <ismael.bouya@normalesup.org>
3Date: Tue Jun 2 13:03:04 2020 +0200
4
5 Add %tx to index_format
6
7diff --git a/hdrline.c b/hdrline.c
8index 9224c6641..1594ed729 100644
9--- a/hdrline.c
10+++ b/hdrline.c
11@@ -575,6 +575,7 @@ static const char *index_format_str(char *buf, size_t buflen, size_t col, int co
12 const struct Address *from = TAILQ_FIRST(&e->env->from);
13 const struct Address *to = TAILQ_FIRST(&e->env->to);
14 const struct Address *cc = TAILQ_FIRST(&e->env->cc);
15+ const struct Address *x_orig_to = TAILQ_FIRST(&e->env->x_original_to);
16
17 buf[0] = '\0';
18 switch (op)
19@@ -1192,13 +1193,18 @@ static const char *index_format_str(char *buf, size_t buflen, size_t col, int co
20
21 case 't':
22 tmp[0] = '\0';
23- if (!check_for_mailing_list(&e->env->to, "To ", tmp, sizeof(tmp)) &&
24- !check_for_mailing_list(&e->env->cc, "Cc ", tmp, sizeof(tmp)))
25- {
26- if (to)
27- snprintf(tmp, sizeof(tmp), "To %s", mutt_get_name(to));
28- else if (cc)
29- snprintf(tmp, sizeof(tmp), "Cc %s", mutt_get_name(cc));
30+ if (src[0] == 'x') {
31+ snprintf(tmp, sizeof(tmp), "%s", mutt_get_name(x_orig_to));
32+ src++;
33+ } else {
34+ if (!check_for_mailing_list(&e->env->to, "To ", tmp, sizeof(tmp)) &&
35+ !check_for_mailing_list(&e->env->cc, "Cc ", tmp, sizeof(tmp)))
36+ {
37+ if (to)
38+ snprintf(tmp, sizeof(tmp), "To %s", mutt_get_name(to));
39+ else if (cc)
40+ snprintf(tmp, sizeof(tmp), "Cc %s", mutt_get_name(cc));
41+ }
42 }
43 mutt_format_s(buf, buflen, prec, tmp);
44 break;
diff --git a/overlays/nix-direnv/default.nix b/overlays/nix-direnv/default.nix
deleted file mode 100644
index c4c96e2..0000000
--- a/overlays/nix-direnv/default.nix
+++ /dev/null
@@ -1,7 +0,0 @@
1self: super: {
2 nix-direnv = super.nix-direnv.overrideAttrs (old: {
3 postPatch = old.postPatch + ''
4 sed -i -e 's/TEMPDIR "$old_tmp"/TEMPDIR "$old_tmpdir"/' direnvrc
5 '';
6 });
7}
diff --git a/overlays/nixops/default.nix b/overlays/nixops/default.nix
deleted file mode 100644
index 14aec3b..0000000
--- a/overlays/nixops/default.nix
+++ /dev/null
@@ -1,20 +0,0 @@
1self: super: {
2 nixops = super.nixops.overrideAttrs (old: {
3 patches = [
4 ./fix_glibc.patch
5 (self.fetchpatch {
6 name = "hetzner_cloud.patch";
7 url = "https://github.com/goodraven/nixops/commit/272e50d0b0262e49cdcaad42cdab57aad183d1c2.patch";
8 sha256 = "12wcrb0155ald52m7fbr2m5rrxdnwdwripq91ckscgsk42mdc517";
9 })
10 ];
11 preConfigure = (old.preConfigure or "") + ''
12 # https://github.com/NixOS/nixops/issues/1216
13 sed -i -e "/Register the paths in the Nix database./s/#.*$/export USER=root/" nix/libvirtd-image.nix
14
15 sed -i -e '/^import sys$/s/$/; sys.tracebacklimit = 0/' scripts/nixops
16 sed -i -e "/'keyFile'/s/'path'/'string'/" nixops/backends/__init__.py
17 sed -i -e "/security.initialRootPassword/d" nix/hetzner.nix
18 '';
19 });
20}
diff --git a/overlays/nixops/fix_glibc.patch b/overlays/nixops/fix_glibc.patch
deleted file mode 100644
index 1aeb093..0000000
--- a/overlays/nixops/fix_glibc.patch
+++ /dev/null
@@ -1,15 +0,0 @@
1diff --git a/nix/hetzner-bootstrap.nix b/nix/hetzner-bootstrap.nix
2index 035e6f9..def42a1 100644
3--- a/nix/hetzner-bootstrap.nix
4+++ b/nix/hetzner-bootstrap.nix
5@@ -3,9 +3,7 @@ with import <nixpkgs> { system = "x86_64-linux"; };
6 let
7 pkgsNative = import <nixpkgs> {};
8
9- nixpart = python2Packages.nixpart0.override {
10- useNixUdev = false;
11- };
12+ nixpart = python2Packages.nixpart0;
13
14 generateConfig = (import <nixpkgs/nixos> {
15 configuration = {};
diff --git a/overlays/nixops/hetzner_cloud.patch b/overlays/nixops/hetzner_cloud.patch
deleted file mode 100644
index b75c116..0000000
--- a/overlays/nixops/hetzner_cloud.patch
+++ /dev/null
@@ -1,480 +0,0 @@
1From 272e50d0b0262e49cdcaad42cdab57aad183d1c2 Mon Sep 17 00:00:00 2001
2From: goodraven
3 <employee-pseudonym-7f597def-7eeb-47f8-b10a-0724f2ba59a9@google.com>
4Date: Thu, 3 May 2018 22:24:58 -0700
5Subject: [PATCH] Initial commit adding support for hetzner cloud
6
7This is based on the digital ocean backend. It also uses nixos-infect. I extended nixos-infect to be generic
8for both backends.
9
10Fixes #855
11---
12 examples/trivial-hetzner-cloud.nix | 12 ++
13 nix/eval-machine-info.nix | 1 +
14 nix/hetzner-cloud.nix | 56 +++++++
15 nix/options.nix | 1 +
16 nixops/backends/hetzner_cloud.py | 230 +++++++++++++++++++++++++++++
17 nixops/data/nixos-infect | 77 +++++++---
18 6 files changed, 354 insertions(+), 23 deletions(-)
19 create mode 100644 examples/trivial-hetzner-cloud.nix
20 create mode 100644 nix/hetzner-cloud.nix
21 create mode 100644 nixops/backends/hetzner_cloud.py
22
23diff --git a/examples/trivial-hetzner-cloud.nix b/examples/trivial-hetzner-cloud.nix
24new file mode 100644
25index 000000000..c61add6bb
26--- /dev/null
27+++ b/examples/trivial-hetzner-cloud.nix
28@@ -0,0 +1,12 @@
29+{
30+ resources.sshKeyPairs.ssh-key = {};
31+
32+ machine = { config, pkgs, ... }: {
33+ services.openssh.enable = true;
34+
35+ deployment.targetEnv = "hetznerCloud";
36+ deployment.hetznerCloud.serverType = "cx11";
37+
38+ networking.firewall.allowedTCPPorts = [ 22 ];
39+ };
40+}
41diff --git a/nix/eval-machine-info.nix b/nix/eval-machine-info.nix
42index 2884b4b47..6a7205786 100644
43--- a/nix/eval-machine-info.nix
44+++ b/nix/eval-machine-info.nix
45@@ -309,6 +309,7 @@ rec {
46 digitalOcean = optionalAttrs (v.config.deployment.targetEnv == "digitalOcean") v.config.deployment.digitalOcean;
47 gce = optionalAttrs (v.config.deployment.targetEnv == "gce") v.config.deployment.gce;
48 hetzner = optionalAttrs (v.config.deployment.targetEnv == "hetzner") v.config.deployment.hetzner;
49+ hetznerCloud = optionalAttrs (v.config.deployment.targetEnv == "hetznerCloud") v.config.deployment.hetznerCloud;
50 container = optionalAttrs (v.config.deployment.targetEnv == "container") v.config.deployment.container;
51 route53 = v.config.deployment.route53;
52 virtualbox =
53diff --git a/nix/hetzner-cloud.nix b/nix/hetzner-cloud.nix
54new file mode 100644
55index 000000000..21d148c1a
56--- /dev/null
57+++ b/nix/hetzner-cloud.nix
58@@ -0,0 +1,56 @@
59+{ config, pkgs, lib, utils, ... }:
60+
61+with utils;
62+with lib;
63+with import ./lib.nix lib;
64+
65+let
66+ cfg = config.deployment.hetznerCloud;
67+in
68+{
69+ ###### interface
70+ options = {
71+
72+ deployment.hetznerCloud.authToken = mkOption {
73+ default = "";
74+ example = "8b2f4e96af3997853bfd4cd8998958eab871d9614e35d63fab45a5ddf981c4da";
75+ type = types.str;
76+ description = ''
77+ The API auth token. We're checking the environment for
78+ <envar>HETZNER_CLOUD_AUTH_TOKEN</envar> first and if that is
79+ not set we try this auth token.
80+ '';
81+ };
82+
83+ deployment.hetznerCloud.datacenter = mkOption {
84+ example = "fsn1-dc8";
85+ default = null;
86+ type = types.nullOr types.str;
87+ description = ''
88+ The datacenter.
89+ '';
90+ };
91+
92+ deployment.hetznerCloud.location = mkOption {
93+ example = "fsn1";
94+ default = null;
95+ type = types.nullOr types.str;
96+ description = ''
97+ The location.
98+ '';
99+ };
100+
101+ deployment.hetznerCloud.serverType = mkOption {
102+ example = "cx11";
103+ type = types.str;
104+ description = ''
105+ Name or id of server types.
106+ '';
107+ };
108+ };
109+
110+ config = mkIf (config.deployment.targetEnv == "hetznerCloud") {
111+ nixpkgs.system = mkOverride 900 "x86_64-linux";
112+ services.openssh.enable = true;
113+ };
114+}
115diff --git a/nix/options.nix b/nix/options.nix
116index 0866c3ab8..db021f74d 100644
117--- a/nix/options.nix
118+++ b/nix/options.nix
119@@ -22,6 +22,7 @@ in
120 ./keys.nix
121 ./gce.nix
122 ./hetzner.nix
123+ ./hetzner-cloud.nix
124 ./container.nix
125 ./libvirtd.nix
126 ];
127diff --git a/nixops/backends/hetzner_cloud.py b/nixops/backends/hetzner_cloud.py
128new file mode 100644
129index 000000000..a2cb176b9
130--- /dev/null
131+++ b/nixops/backends/hetzner_cloud.py
132@@ -0,0 +1,230 @@
133+# -*- coding: utf-8 -*-
134+"""
135+A backend for hetzner cloud.
136+
137+This backend uses nixos-infect (which uses nixos LUSTRATE) to infect a
138+hetzner cloud instance. The setup requires two reboots, one for
139+the infect itself, another after we pushed the nixos image.
140+"""
141+import os
142+import os.path
143+import time
144+import socket
145+
146+import requests
147+
148+import nixops.resources
149+from nixops.backends import MachineDefinition, MachineState
150+from nixops.nix_expr import Function, RawValue
151+import nixops.util
152+import nixops.known_hosts
153+
154+infect_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'data', 'nixos-infect'))
155+
156+API_HOST = 'api.hetzner.cloud'
157+
158+class ApiError(Exception):
159+ pass
160+
161+class ApiNotFoundError(ApiError):
162+ pass
163+
164+class HetznerCloudDefinition(MachineDefinition):
165+ @classmethod
166+ def get_type(cls):
167+ return "hetznerCloud"
168+
169+ def __init__(self, xml, config):
170+ MachineDefinition.__init__(self, xml, config)
171+ self.auth_token = config["hetznerCloud"]["authToken"]
172+ self.location = config["hetznerCloud"]["location"]
173+ self.datacenter = config["hetznerCloud"]["datacenter"]
174+ self.server_type = config["hetznerCloud"]["serverType"]
175+
176+ def show_type(self):
177+ return "{0} [{1}]".format(self.get_type(), self.location or self.datacenter or 'any location')
178+
179+
180+class HetznerCloudState(MachineState):
181+ @classmethod
182+ def get_type(cls):
183+ return "hetznerCloud"
184+
185+ state = nixops.util.attr_property("state", MachineState.MISSING, int) # override
186+ public_ipv4 = nixops.util.attr_property("publicIpv4", None)
187+ public_ipv6 = nixops.util.attr_property("publicIpv6", None)
188+ location = nixops.util.attr_property("hetznerCloud.location", None)
189+ datacenter = nixops.util.attr_property("hetznerCloud.datacenter", None)
190+ server_type = nixops.util.attr_property("hetznerCloud.serverType", None)
191+ auth_token = nixops.util.attr_property("hetznerCloud.authToken", None)
192+ server_id = nixops.util.attr_property("hetznerCloud.serverId", None, int)
193+
194+ def __init__(self, depl, name, id):
195+ MachineState.__init__(self, depl, name, id)
196+ self.name = name
197+
198+ def get_ssh_name(self):
199+ return self.public_ipv4
200+
201+ def get_ssh_flags(self, *args, **kwargs):
202+ super_flags = super(HetznerCloudState, self).get_ssh_flags(*args, **kwargs)
203+ return super_flags + [
204+ '-o', 'UserKnownHostsFile=/dev/null',
205+ '-o', 'StrictHostKeyChecking=no',
206+ '-i', self.get_ssh_private_key_file(),
207+ ]
208+
209+ def get_physical_spec(self):
210+ return Function("{ ... }", {
211+ 'imports': [ RawValue('<nixpkgs/nixos/modules/profiles/qemu-guest.nix>') ],
212+ ('boot', 'loader', 'grub', 'device'): 'nodev',
213+ ('fileSystems', '/'): { 'device': '/dev/sda1', 'fsType': 'ext4'},
214+ ('users', 'extraUsers', 'root', 'openssh', 'authorizedKeys', 'keys'): [self.depl.active_resources.get('ssh-key').public_key],
215+ })
216+
217+ def get_ssh_private_key_file(self):
218+ return self.write_ssh_private_key(self.depl.active_resources.get('ssh-key').private_key)
219+
220+ def create_after(self, resources, defn):
221+ # make sure the ssh key exists before we do anything else
222+ return {
223+ r for r in resources if
224+ isinstance(r, nixops.resources.ssh_keypair.SSHKeyPairState)
225+ }
226+
227+ def get_auth_token(self):
228+ return os.environ.get('HETZNER_CLOUD_AUTH_TOKEN', self.auth_token)
229+
230+ def _api(self, path, method=None, data=None, json=True):
231+ """Basic wrapper around requests that handles auth and serialization."""
232+ assert path[0] == '/'
233+ url = 'https://%s%s' % (API_HOST, path)
234+ token = self.get_auth_token()
235+ if not token:
236+ raise Exception('No hetzner cloud auth token set')
237+ headers = {
238+ 'Authorization': 'Bearer '+self.get_auth_token(),
239+ }
240+ res = requests.request(
241+ method=method,
242+ url=url,
243+ json=data,
244+ headers=headers)
245+
246+ if res.status_code == 404:
247+ raise ApiNotFoundError('Not Found: %r' % path)
248+ elif not res.ok:
249+ raise ApiError('Response for %s %s has status code %d: %s' % (method, path, res.status_code, res.content))
250+ if not json:
251+ return
252+ try:
253+ res_data = res.json()
254+ except ValueError as e:
255+ raise ApiError('Response for %s %s has invalid JSON (%s): %r' % (method, path, e, res.content))
256+ return res_data
257+
258+
259+ def destroy(self, wipe=False):
260+ if not self.server_id:
261+ self.log('server {} was never made'.format(self.name))
262+ return
263+ self.log('destroying server {} with id {}'.format(self.name, self.server_id))
264+ try:
265+ res = self._api('/v1/servers/%s' % (self.server_id), method='DELETE')
266+ except ApiNotFoundError:
267+ self.log("server not found - assuming it's been destroyed already")
268+
269+ self.public_ipv4 = None
270+ self.server_id = None
271+
272+ return True
273+
274+ def _create_ssh_key(self, public_key):
275+ """Create or get an ssh key and return an id."""
276+ public_key = public_key.strip()
277+ res = self._api('/v1/ssh_keys', method='GET')
278+ name = 'nixops-%s-%s' % (self.depl.uuid, self.name)
279+ deletes = []
280+ for key in res['ssh_keys']:
281+ if key['public_key'].strip() == public_key:
282+ return key['id']
283+ if key['name'] == name:
284+ deletes.append(key['id'])
285+ for d in deletes:
286+ # This reply is empty, so don't decode json.
287+ self._api('/v1/ssh_keys/%d' % d, method='DELETE', json=False)
288+ res = self._api('/v1/ssh_keys', method='POST', data={
289+ 'name': name,
290+ 'public_key': public_key,
291+ })
292+ return res['ssh_key']['id']
293+
294+ def create(self, defn, check, allow_reboot, allow_recreate):
295+ ssh_key = self.depl.active_resources.get('ssh-key')
296+ if ssh_key is None:
297+ raise Exception('Please specify a ssh-key resource (resources.sshKeyPairs.ssh-key = {}).')
298+
299+ self.set_common_state(defn)
300+
301+ if self.server_id is not None:
302+ return
303+
304+ ssh_key_id = self._create_ssh_key(ssh_key.public_key)
305+
306+ req = {
307+ 'name': self.name,
308+ 'server_type': defn.server_type,
309+ 'start_after_create': True,
310+ 'image': 'debian-9',
311+ 'ssh_keys': [
312+ ssh_key_id,
313+ ],
314+ }
315+
316+ if defn.datacenter:
317+ req['datacenter'] = defn.datacenter
318+ elif defn.location:
319+ req['location'] = defn.location
320+
321+ self.log_start("creating server ...")
322+ create_res = self._api('/v1/servers', method='POST', data=req)
323+ self.server_id = create_res['server']['id']
324+ self.public_ipv4 = create_res['server']['public_net']['ipv4']['ip']
325+ self.public_ipv6 = create_res['server']['public_net']['ipv6']['ip']
326+ self.datacenter = create_res['server']['datacenter']['name']
327+ self.location = create_res['server']['datacenter']['location']['name']
328+
329+ action = create_res['action']
330+ action_path = '/v1/servers/%d/actions/%d' % (self.server_id, action['id'])
331+
332+ while action['status'] == 'running':
333+ time.sleep(1)
334+ res = self._api(action_path, method='GET')
335+ action = res['action']
336+
337+ if action['status'] != 'success':
338+ raise Exception('unexpected status: %s' % action['status'])
339+
340+ self.log_end("{}".format(self.public_ipv4))
341+
342+ self.wait_for_ssh()
343+ self.log_start("running nixos-infect")
344+ self.run_command('bash </dev/stdin 2>&1', stdin=open(infect_path))
345+ self.reboot_sync()
346+
347+ def reboot(self, hard=False):
348+ if hard:
349+ self.log("sending hard reset to server...")
350+ res = self._api('/v1/servers/%d/actions/reset' % self.server_id, method='POST')
351+ action = res['action']
352+ action_path = '/v1/servers/%d/actions/%d' % (self.server_id, action['id'])
353+ while action['status'] == 'running':
354+ time.sleep(1)
355+ res = self._api(action_path, method='GET')
356+ action = res['action']
357+ if action['status'] != 'success':
358+ raise Exception('unexpected status: %s' % action['status'])
359+ self.wait_for_ssh()
360+ self.state = self.STARTING
361+ else:
362+ MachineState.reboot(self, hard=hard)
363diff --git a/nixops/data/nixos-infect b/nixops/data/nixos-infect
364index 66634357b..437a2ec61 100644
365--- a/nixops/data/nixos-infect
366+++ b/nixops/data/nixos-infect
367@@ -68,26 +68,49 @@ makeConf() {
368 }
369 EOF
370 # (nixos-generate-config will add qemu-user and bind-mounts, so avoid)
371+ local disk
372+ if [ -e /dev/sda ]; then
373+ disk=/dev/sda
374+ else
375+ disk=/dev/vda
376+ fi
377 cat > /etc/nixos/hardware-configuration.nix << EOF
378 { ... }:
379 {
380 imports = [ <nixpkgs/nixos/modules/profiles/qemu-guest.nix> ];
381- boot.loader.grub.device = "/dev/vda";
382- fileSystems."/" = { device = "/dev/vda1"; fsType = "ext4"; };
383+ boot.loader.grub.device = "${disk}";
384+ fileSystems."/" = { device = "${disk}1"; fsType = "ext4"; };
385 }
386 EOF
387
388 local IFS=$'\n'
389- ens3_ip4s=($(ip address show dev eth0 | grep 'inet ' | sed -r 's|.*inet ([0-9.]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|'))
390- ens3_ip6s=($(ip address show dev eth0 | grep 'inet6 .*global' | sed -r 's|.*inet6 ([0-9a-f:]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|'))
391- ens4_ip4s=($(ip address show dev eth1 | grep 'inet ' | sed -r 's|.*inet ([0-9.]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|'))
392- ens4_ip6s=($(ip address show dev eth1 | grep 'inet6 .*global' | sed -r 's|.*inet6 ([0-9a-f:]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|'))
393- gateway=($(ip route show dev eth0 | grep default | sed -r 's|default via ([0-9.]+).*|\1|'))
394- gateway6=($(ip -6 route show dev eth0 | grep default | sed -r 's|default via ([0-9a-f:]+).*|\1|'))
395- ether0=($(ip address show dev eth0 | grep link/ether | sed -r 's|.*link/ether ([0-9a-f:]+) .*|\1|'))
396- ether1=($(ip address show dev eth1 | grep link/ether | sed -r 's|.*link/ether ([0-9a-f:]+) .*|\1|'))
397+ gateway=($(ip route show | grep default | sed -r 's|default via ([0-9.]+).*|\1|'))
398+ gateway6=($(ip -6 route show | grep default | sed -r 's|default via ([0-9a-f:]+).*|\1|'))
399+ interfaces=($(ip link | awk -F ': ' '/^[0-9]*: / {if ($2 != "lo") {print $2}}'))
400 nameservers=($(grep ^nameserver /etc/resolv.conf | cut -f2 -d' '))
401
402+ # Predict the predictable name for each interface since that is enabled in
403+ # the nixos system.
404+ declare -A predictable_names
405+ for interface in ${interfaces[@]}; do
406+ # udevadm prints out the candidate names which will be selected if
407+ # available in this order.
408+ local name=$(udevadm info /sys/class/net/$interface | awk -F = '
409+ /^E: ID_NET_NAME_FROM_DATABASE=/ {arr[1]=$2}
410+ /^E: ID_NET_NAME_ONBOARD=/ {arr[2]=$2}
411+ /^E: ID_NET_NAME_SLOT=/ {arr[3]=$2}
412+ /^E: ID_NET_NAME_PATH=/ {arr[4]=$2}
413+ /^E: ID_NET_NAME_MAC=/ {arr[5]=$2}
414+ END {for (i=1;i<6;i++) {if (length(arr[i]) > 0) { print arr[i]; break}}}')
415+ if [ -z "$name" ]; then
416+ echo Could not determine predictable name for interface $interface
417+ fi
418+ predictable_names[$interface]=$name
419+ done
420+
421+ # Take a gamble on the first interface being able to reach the gateway.
422+ local default_interface=${predictable_names[${interfaces[0]}]}
423+
424 cat > /etc/nixos/networking.nix << EOF
425 { ... }: {
426 # This file was populated at runtime with the networking
427@@ -96,25 +119,27 @@ EOF
428 nameservers = [$(for a in ${nameservers[@]}; do echo -n "
429 \"$a\""; done)
430 ];
431- defaultGateway = "${gateway}";
432- defaultGateway6 = "${gateway6}";
433+ defaultGateway = {address = "${gateway}"; interface = "${default_interface}";};
434+ defaultGateway6 = {address = "${gateway6}"; interface = "${default_interface}";};
435 interfaces = {
436- ens3 = {
437- ip4 = [$(for a in ${ens3_ip4s[@]}; do echo -n "
438- $a"; done)
439- ];
440- ip6 = [$(for a in ${ens3_ip6s[@]}; do echo -n "
441- $a"; done)
442- ];
443- };
444- ens4 = {
445- ip4 = [$(for a in ${ens4_ip4s[@]}; do echo -n "
446+EOF
447+
448+ for interface in ${interfaces[@]}; do
449+ ip4s=($(ip address show dev $interface | grep 'inet ' | sed -r 's|.*inet ([0-9.]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|'))
450+ ip6s=($(ip address show dev $interface | grep 'inet6 .*global' | sed -r 's|.*inet6 ([0-9a-f:]+)/([0-9]+).*|{ address="\1"; prefixLength=\2; }|'))
451+ cat >> /etc/nixos/networking.nix << EOF
452+ ${predictable_names[$interface]} = {
453+ ip4 = [$(for a in ${ip4s[@]}; do echo -n "
454 $a"; done)
455 ];
456- ip6 = [$(for a in ${ens4_ip6s[@]}; do echo -n "
457+ ip6 = [$(for a in ${ip6s[@]}; do echo -n "
458 $a"; done)
459 ];
460 };
461+EOF
462+ done
463+
464+ cat >> /etc/nixos/networking.nix << EOF
465 };
466 };
467 }
468@@ -154,6 +179,12 @@ export HOME="/root"
469 groupadd -r nixbld -g 30000
470 seq 1 10 | xargs -I{} useradd -c "Nix build user {}" -d /var/empty -g nixbld -G nixbld -M -N -r -s `which nologin` nixbld{}
471
472+if ! which curl >/dev/null 2>/dev/null; then
473+ if which apt-get >/dev/null 2>/dev/null; then
474+ apt-get update && apt-get install -y curl
475+ fi
476+fi
477+
478 curl https://nixos.org/nix/install | sh
479
480 source ~/.nix-profile/etc/profile.d/nix.sh
diff --git a/overlays/pass/default.nix b/overlays/pass/default.nix
deleted file mode 100644
index ad8facd..0000000
--- a/overlays/pass/default.nix
+++ /dev/null
@@ -1,5 +0,0 @@
1self: super: {
2 pass = super.pass.overrideAttrs (old: rec {
3 patches = old.patches ++ [ ./pass-fix-pass-init.patch ];
4 });
5}
diff --git a/overlays/pass/pass-fix-pass-init.patch b/overlays/pass/pass-fix-pass-init.patch
deleted file mode 100644
index 10a76c1..0000000
--- a/overlays/pass/pass-fix-pass-init.patch
+++ /dev/null
@@ -1,42 +0,0 @@
1From 33e8f1cd0065639a948d7b5ba3f93d43bdf7f3be Mon Sep 17 00:00:00 2001
2From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= <ismael.bouya@normalesup.org>
3Date: Sun, 11 Nov 2018 19:47:33 +0100
4Subject: [PATCH] Fix pass init for some gpg keys
5
6This fixes the pass init for gpg keys which have their main key as
7encryption key. This may happen for instance with RSA keys and specific
8configuration.
9---
10 src/password-store.sh | 2 +-
11 tests/t0300-reencryption.sh | 2 +-
12 2 files changed, 2 insertions(+), 2 deletions(-)
13
14diff --git a/src/password-store.sh b/src/password-store.sh
15index d89d455..44d122e 100755
16--- a/src/password-store.sh
17+++ b/src/password-store.sh
18@@ -124,7 +124,7 @@ reencrypt_path() {
19 IFS=";" eval 'GPG_RECIPIENTS+=( $group )' # http://unix.stackexchange.com/a/92190
20 unset "GPG_RECIPIENTS[$index]"
21 done
22- 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)"
23+ 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)"
24 fi
25 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)"
26
27diff --git a/tests/t0300-reencryption.sh b/tests/t0300-reencryption.sh
28index 3c88987..57d873f 100755
29--- a/tests/t0300-reencryption.sh
30+++ b/tests/t0300-reencryption.sh
31@@ -7,7 +7,7 @@ cd "$(dirname "$0")"
32 INITIAL_PASSWORD="will this password live? a big question indeed..."
33
34 canonicalize_gpg_keys() {
35- $GPG --list-keys --with-colons "$@" | sed -n 's/sub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u
36+ $GPG --list-keys --with-colons "$@" | sed -n 's/[ps]ub:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:[a-zA-Z]*e[a-zA-Z]*:.*/\1/p' | LC_ALL=C sort -u
37 }
38 gpg_keys_from_encrypted_file() {
39 $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
40--
412.19.1
42
diff --git a/overlays/pelican/default.nix b/overlays/pelican/default.nix
deleted file mode 100644
index 4f8aece..0000000
--- a/overlays/pelican/default.nix
+++ /dev/null
@@ -1,7 +0,0 @@
1self: super: {
2 pelican = with self.python3Packages;
3 pelican.overrideAttrs(old: {
4 propagatedBuildInputs = old.propagatedBuildInputs ++ [ pyyaml markdown ];
5 doInstallCheck = false;
6 });
7}
diff --git a/overlays/php-packages/default.nix b/overlays/php-packages/default.nix
deleted file mode 100644
index 90fb613..0000000
--- a/overlays/php-packages/default.nix
+++ /dev/null
@@ -1,6 +0,0 @@
1self: super: rec {
2 myPhpPackages.mysqli_pam = self.php74.extensions.mysqli.overrideAttrs(old: {
3 configureFlags = [ "--with-mysqli=${self.libmysqlclient_pam}/bin/mysql_config" "--with-mysql-sock=/run/mysqld/mysqld.sock" ];
4 patches = old.patches or [] ++ [ ./mysqli_patch.patch ];
5});
6}
diff --git a/overlays/procps-ng/default.nix b/overlays/procps-ng/default.nix
deleted file mode 100644
index 2d43a11..0000000
--- a/overlays/procps-ng/default.nix
+++ /dev/null
@@ -1,5 +0,0 @@
1self: super: {
2 procps-ng = super.procps-ng.overrideAttrs(old: {
3 configureFlags = old.configureFlags ++ [ "--enable-watch8bit" ];
4 });
5}
diff --git a/overlays/python-packages/buildbot.nix b/overlays/python-packages/buildbot.nix
deleted file mode 100644
index ccf2f6a..0000000
--- a/overlays/python-packages/buildbot.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1self: super: {
2 pythonOverrides = self.buildPythonOverrides (pyself: pysuper: {
3 buildbot-plugins = pysuper.buildbot-plugins // {
4 buildslist = self.python3PackagesPlus.buildbot-plugins.buildslist;
5 };
6 buildbot-full = pysuper.buildbot-full.withPlugins [ pyself.buildbot-plugins.buildslist ];
7 }) super.pythonOverrides;
8}
diff --git a/overlays/python-packages/default.nix b/overlays/python-packages/default.nix
deleted file mode 100644
index 601eed1..0000000
--- a/overlays/python-packages/default.nix
+++ /dev/null
@@ -1,29 +0,0 @@
1let
2 fromMyPythonPackages = name: self: super: {
3 pythonOverrides = self.buildPythonOverrides (pyself: pysuper: {
4 "${name}" = self."${pyself.python.pname}PackagesPlus"."${name}";
5 }) super.pythonOverrides;
6 };
7in
8{
9 # https://github.com/NixOS/nixpkgs/issues/44426
10 # needs to come before all other in alphabetical order (or make use of
11 # lib.mkBefore)
12 __pythonOverlayFix = self: super: let
13 pyNames = [ "python3" "python36" "python37" "python38" ];
14 overriddenPython = name: [
15 { inherit name; value = super.${name}.override { packageOverrides = self.pythonOverrides; }; }
16 { name = "${name}Packages"; value = self.recurseIntoAttrs self.${name}.pkgs; }
17 ];
18 overriddenPythons = builtins.concatLists (map overriddenPython pyNames);
19 in {
20 pythonOverrides = pyself: pysuper: {};
21 buildPythonOverrides = newOverrides: currentOverrides: super.lib.composeExtensions newOverrides currentOverrides;
22 } // super.lib.attrsets.listToAttrs overriddenPythons;
23
24
25 blivet3 = fromMyPythonPackages "blivet3";
26 buildbot = import ./buildbot.nix;
27 wokkel = fromMyPythonPackages "wokkel";
28 pymilter = fromMyPythonPackages "pymilter";
29}
diff --git a/overlays/sc-im/default.nix b/overlays/sc-im/default.nix
deleted file mode 100644
index f728655..0000000
--- a/overlays/sc-im/default.nix
+++ /dev/null
@@ -1,9 +0,0 @@
1self: super: {
2 sc-im = super.sc-im.overrideAttrs (old: {
3 buildPhase = ''
4 cd src
5 sed -i Makefile -e 's@\...name.info@.local/state/$(name)info@'
6 cd ..
7 '' + old.buildPhase;
8 });
9}
diff --git a/overlays/shaarli/default.nix b/overlays/shaarli/default.nix
deleted file mode 100644
index 3b37ee8..0000000
--- a/overlays/shaarli/default.nix
+++ /dev/null
@@ -1,15 +0,0 @@
1self: super: {
2 shaarli = varDir: super.shaarli.overrideAttrs (old: rec {
3 version = "0.10.2";
4 src = self.fetchurl {
5 url = "https://github.com/shaarli/Shaarli/releases/download/v${version}/shaarli-v${version}-full.tar.gz";
6 sha256 = "0h8sspj7siy3vgpi2i3gdrjcr5935fr4dfwq2zwd70sjx2sh9s78";
7 };
8 patchPhase = "";
9 patches = (old.patches or []) ++ [ ./shaarli_ldap.patch ];
10 installPhase = (old.installPhase or "") + ''
11 cp .htaccess $out/
12 ln -sf ${varDir}/{cache,pagecache,tmp,data} $out/
13 '';
14 });
15}
diff --git a/overlays/slrn/default.nix b/overlays/slrn/default.nix
deleted file mode 100644
index 1bf5fe2..0000000
--- a/overlays/slrn/default.nix
+++ /dev/null
@@ -1,5 +0,0 @@
1self: super: {
2 slrn = super.slrn.overrideAttrs (old: rec {
3 configureFlags = old.configureFlags ++ [ "--with-slrnpull" ];
4 });
5}
diff --git a/overlays/vcsh/default.nix b/overlays/vcsh/default.nix
deleted file mode 100644
index eb4d48e..0000000
--- a/overlays/vcsh/default.nix
+++ /dev/null
@@ -1,7 +0,0 @@
1self: super: {
2 vcsh = super.vcsh.overrideAttrs(old: {
3 patchPhase = old.patchPhase or "" + ''
4 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
5 '';
6 });
7}
diff --git a/overlays/weechat/default.nix b/overlays/weechat/default.nix
deleted file mode 100644
index e8cc792..0000000
--- a/overlays/weechat/default.nix
+++ /dev/null
@@ -1,12 +0,0 @@
1self: super: {
2 weechat = super.weechat.override {
3 configure = { availablePlugins, ... }: {
4 plugins = with self; with availablePlugins; [
5 (python.withPackages (ps: with ps; [websocket_client emoji]))
6 perl
7 ruby
8 ];
9 };
10 };
11
12}
diff --git a/overlays/ympd/default.nix b/overlays/ympd/default.nix
deleted file mode 100644
index dda17aa..0000000
--- a/overlays/ympd/default.nix
+++ /dev/null
@@ -1,5 +0,0 @@
1self: super: {
2 ympd = super.ympd.overrideAttrs(old: self.mylibs.fetchedGithub ./ympd.json // {
3 patches = (old.patches or []) ++ [ ./ympd-password-env.patch ];
4 });
5}
diff --git a/overlays/ympd/ympd.json b/overlays/ympd/ympd.json
deleted file mode 100644
index 51f06d5..0000000
--- a/overlays/ympd/ympd.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "612f8fc-master",
3 "meta": {
4 "name": "ympd",
5 "url": "https://github.com/notandy/ympd",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "notandy",
10 "repo": "ympd",
11 "rev": "612f8fc0b2c47fc89d403e4a044541c6b2b238c8",
12 "sha256": "01hnj10zl103mrn82vyd42fvq7w5az3jf1qz18889zv67kn73ll9",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/boinctui/default.nix b/pkgs/boinctui/default.nix
deleted file mode 100644
index d8b106a..0000000
--- a/pkgs/boinctui/default.nix
+++ /dev/null
@@ -1,20 +0,0 @@
1{ stdenv, fetchurl, expat, openssl, autoconf, ncurses }:
2stdenv.mkDerivation rec {
3 name = "boinctui-${version}";
4 version = "2.5.0";
5 src = fetchurl {
6 url = "http://sourceforge.net/projects/boinctui/files/boinctui_${version}.tar.gz";
7 sha256 = "16zxp8r4z6pllacdacg681y56cg2phnn3pm5gwszbsi93cix2g8p";
8 };
9
10 configureFlags = [ "--without-gnutls" ];
11 preConfigure = ''
12 autoconf
13 '';
14
15 preBuild = ''
16 sed -i -e 's/"HOME"/"XDG_CONFIG_HOME"/' src/cfg.cpp
17 sed -i -e 's@\.boinctui\.cfg@boinctui/boinctui.cfg@' src/mainprog.cpp
18 '';
19 buildInputs = [ expat openssl autoconf ncurses ];
20}
diff --git a/pkgs/cnagios/cnagios.json b/pkgs/cnagios/cnagios.json
deleted file mode 100644
index 4c1c385..0000000
--- a/pkgs/cnagios/cnagios.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "3bd27fb-master",
3 "meta": {
4 "name": "cnagios",
5 "url": "https://github.com/dannywarren/cnagios",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "dannywarren",
10 "repo": "cnagios",
11 "rev": "3bd27fb40e68f61ffd01bea6234b919a667b6fe4",
12 "sha256": "0iy5pmlcz6y3if72nav22xqxniiv1v8ywi0927m6s459hkw5n2rb",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/cnagios/default.nix b/pkgs/cnagios/default.nix
deleted file mode 100644
index d5b52f3..0000000
--- a/pkgs/cnagios/default.nix
+++ /dev/null
@@ -1,22 +0,0 @@
1{ stdenv, mylibs, perl, ncurses }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./cnagios.json // {
3 configureFlags = [
4 "--with-etc-dir=/etc/cnagios"
5 "--with-var-dir=/var/lib/naemon"
6 "--with-status-file=/var/lib/naemon/status.dat"
7 "--with-nagios-data=4"
8 ];
9
10 prePatch = ''
11 sed -i -e "s/-lcurses/-lncurses/" Makefile.in
12 '';
13 installPhase = ''
14 install -dm755 $out/share/doc/cnagios
15 install -Dm644 cnagiosrc $out/share/doc/cnagios/
16 install -Dm644 cnagios.help $out/share/doc/cnagios/
17 install -Dm644 cnagios.pl $out/share/doc/cnagios/
18 install -dm755 $out/bin
19 install -Dm755 cnagios $out/bin/
20 '';
21 buildInputs = [ perl ncurses ];
22})
diff --git a/pkgs/composer-env/default.nix b/pkgs/composer-env/default.nix
deleted file mode 100644
index 416a61c..0000000
--- a/pkgs/composer-env/default.nix
+++ /dev/null
@@ -1,280 +0,0 @@
1# This file originates from composer2nix
2
3{ stdenv, writeTextFile, fetchurl, php, unzip }:
4
5let
6 composer = stdenv.mkDerivation {
7 name = "composer-1.8.0";
8 src = fetchurl {
9 url = https://github.com/composer/composer/releases/download/1.8.0/composer.phar;
10 sha256 = "19pg9ip2mpyf5cyq34fld7qwl77mshqw3c4nif7sxmpnar6sh089";
11 };
12 buildInputs = [ php ];
13
14 # We must wrap the composer.phar because of the impure shebang.
15 # We cannot use patchShebangs because the executable verifies its own integrity and will detect that somebody has tampered with it.
16
17 buildCommand = ''
18 # Copy phar file
19 mkdir -p $out/share/php
20 cp $src $out/share/php/composer.phar
21 chmod 755 $out/share/php/composer.phar
22
23 # Create wrapper executable
24 mkdir -p $out/bin
25 cat > $out/bin/composer <<EOF
26 #! ${stdenv.shell} -e
27 exec ${php}/bin/php $out/share/php/composer.phar "\$@"
28 EOF
29 chmod +x $out/bin/composer
30 '';
31 meta = {
32 description = "Dependency Manager for PHP";
33 #license = stdenv.licenses.mit;
34 maintainers = [ stdenv.lib.maintainers.sander ];
35 platforms = stdenv.lib.platforms.unix;
36 };
37 };
38
39 buildZipPackage = { name, src }:
40 stdenv.mkDerivation {
41 inherit name src;
42 buildInputs = [ unzip ];
43 buildCommand = ''
44 unzip $src
45 baseDir=$(find . -type d -mindepth 1 -maxdepth 1)
46 cd $baseDir
47 mkdir -p $out
48 mv * $out
49 '';
50 };
51
52 buildPackage =
53 { name
54 , src
55 , packages ? {}
56 , devPackages ? {}
57 , buildInputs ? []
58 , symlinkDependencies ? false
59 , executable ? false
60 , removeComposerArtifacts ? false
61 , postInstall ? ""
62 , preInstall ? ""
63 , noDev ? false
64 , unpackPhase ? "true"
65 , buildPhase ? "true"
66 , doRemoveVendor ? true
67 , ...}@args:
68
69 let
70 reconstructInstalled = writeTextFile {
71 name = "reconstructinstalled.php";
72 executable = true;
73 text = ''
74 #! ${php}/bin/php
75 <?php
76 if(file_exists($argv[1]))
77 {
78 $composerLockStr = file_get_contents($argv[1]);
79
80 if($composerLockStr === false)
81 {
82 fwrite(STDERR, "Cannot open composer.lock contents\n");
83 exit(1);
84 }
85 else
86 {
87 $config = json_decode($composerLockStr, true);
88
89 if(array_key_exists("packages", $config))
90 $allPackages = $config["packages"];
91 else
92 $allPackages = array();
93
94 ${stdenv.lib.optionalString (!noDev) ''
95 if(array_key_exists("packages-dev", $config))
96 $allPackages = array_merge($allPackages, $config["packages-dev"]);
97 ''}
98
99 $packagesStr = json_encode($allPackages, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
100 print($packagesStr);
101 }
102 }
103 else
104 print("[]");
105 ?>
106 '';
107 };
108
109 constructBin = writeTextFile {
110 name = "constructbin.php";
111 executable = true;
112 text = ''
113 #! ${php}/bin/php
114 <?php
115 $composerJSONStr = file_get_contents($argv[1]);
116
117 if($composerJSONStr === false)
118 {
119 fwrite(STDERR, "Cannot open composer.json contents\n");
120 exit(1);
121 }
122 else
123 {
124 $config = json_decode($composerJSONStr, true);
125
126 if(array_key_exists("bin-dir", $config))
127 $binDir = $config["bin-dir"];
128 else
129 $binDir = "bin";
130
131 if(array_key_exists("bin", $config))
132 {
133 if(!file_exists("vendor/".$binDir))
134 mkdir("vendor/".$binDir);
135
136 foreach($config["bin"] as $bin)
137 symlink("../../".$bin, "vendor/".$binDir."/".basename($bin));
138 }
139 }
140 ?>
141 '';
142 };
143
144 bundleDependencies = dependencies:
145 stdenv.lib.concatMapStrings (dependencyName:
146 let
147 dependency = dependencies.${dependencyName};
148 in
149 ''
150 ${if dependency.targetDir == "" then ''
151 vendorDir="$(dirname ${dependencyName})"
152 mkdir -p "$vendorDir"
153 ${if symlinkDependencies then
154 ''ln -s "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"''
155 else
156 ''cp -a "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"''
157 }${if dependency.needsModifyRights or false then "\n" + ''
158 chmod -R u+rwx "$vendorDir/$(basename "${dependencyName}")"
159 '' else ""}
160 '' else ''
161 namespaceDir="${dependencyName}/$(dirname "${dependency.targetDir}")"
162 mkdir -p "$namespaceDir"
163 ${if symlinkDependencies then
164 ''ln -s "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"''
165 else
166 ''cp -a "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"''
167 }${if dependency.needsModifyRights or false then "\n" + ''
168 chmod -R u+rwx "$namespaceDir/$(basename "${dependency.targetDir}")"
169 '' else ""}
170 ''}
171 '') (builtins.attrNames dependencies);
172
173 extraArgs = removeAttrs args [ "name" "packages" "devPackages" "buildInputs" ];
174 in
175 stdenv.mkDerivation ({
176 name = "composer-${name}";
177 buildInputs = [ php composer ] ++ buildInputs;
178
179 inherit unpackPhase buildPhase;
180
181 installPhase = ''
182 ${if executable then ''
183 mkdir -p $out/share/php
184 cp -a $src $out/share/php/$name
185 chmod -R u+w $out/share/php/$name
186 cd $out/share/php/$name
187 '' else ''
188 cp -a $src $out
189 chmod -R u+w $out
190 cd $out
191 ''}
192
193 # Execute pre install hook
194 runHook preInstall
195
196 # Remove unwanted files
197 rm -f *.nix
198
199 export HOME=$TMPDIR
200
201 ${if doRemoveVendor then ''
202 # Remove the provided vendor folder if it exists
203 rm -Rf vendor
204 '' else ""}
205 # If there is no composer.lock file, compose a dummy file.
206 # Otherwise, composer attempts to download the package.json file from
207 # the registry which we do not want.
208 if [ ! -f composer.lock ]
209 then
210 cat > composer.lock <<EOF
211 {
212 "packages": []
213 }
214 EOF
215 fi
216
217 # Reconstruct the installed.json file from the lock file
218 mkdir -p vendor/composer
219 ${reconstructInstalled} composer.lock > vendor/composer/installed.json
220
221 # Copy or symlink the provided dependencies
222 cd vendor
223 ${bundleDependencies packages}
224 ${stdenv.lib.optionalString (!noDev) (bundleDependencies devPackages)}
225 cd ..
226
227 # Reconstruct autoload scripts
228 # We use the optimize feature because Nix packages cannot change after they have been built
229 # Using the dynamic loader for a Nix package is useless since there is nothing to dynamically reload.
230 composer dump-autoload --optimize ${stdenv.lib.optionalString noDev "--no-dev"}
231
232 # Run the install step as a validation to confirm that everything works out as expected
233 composer install --optimize-autoloader ${stdenv.lib.optionalString noDev "--no-dev"}
234
235 ${stdenv.lib.optionalString executable ''
236 # Reconstruct the bin/ folder if we deploy an executable project
237 ${constructBin} composer.json
238 ln -s $(pwd)/vendor/bin $out/bin
239 ''}
240
241 ${stdenv.lib.optionalString (!symlinkDependencies) ''
242 # Patch the shebangs if possible
243 if [ -d $(pwd)/vendor/bin ]
244 then
245 # Look for all executables in bin/
246 for i in $(pwd)/vendor/bin/*
247 do
248 # Look for their location
249 realFile=$(readlink -f "$i")
250
251 # Restore write permissions
252 chmod u+wx "$(dirname "$realFile")"
253 chmod u+w "$realFile"
254
255 # Patch shebang
256 sed -e "s|#!/usr/bin/php|#!${php}/bin/php|" \
257 -e "s|#!/usr/bin/env php|#!${php}/bin/php|" \
258 "$realFile" > tmp
259 mv tmp "$realFile"
260 chmod u+x "$realFile"
261 done
262 fi
263 ''}
264
265 if [ "$removeComposerArtifacts" = "1" ]
266 then
267 # Remove composer stuff
268 rm -f composer.json composer.lock
269 fi
270
271 # Execute post install hook
272 runHook postInstall
273 '';
274 } // extraArgs);
275in
276{
277 composer = stdenv.lib.makeOverridable composer;
278 buildZipPackage = stdenv.lib.makeOverridable buildZipPackage;
279 buildPackage = stdenv.lib.makeOverridable buildPackage;
280}
diff --git a/pkgs/crypto/cardano/daedalus.json b/pkgs/crypto/cardano/daedalus.json
deleted file mode 100644
index dcd14c5..0000000
--- a/pkgs/crypto/cardano/daedalus.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "0.15.1",
3 "meta": {
4 "name": "daedalus",
5 "url": "https://github.com/input-output-hk/daedalus",
6 "branch": "refs/tags/0.15.1"
7 },
8 "github": {
9 "owner": "input-output-hk",
10 "repo": "daedalus",
11 "rev": "998fd3189c9a54fac496dfef7a6224714c67bc80",
12 "sha256": "1r3gwfv6hn7lzp4h2s6849m7x12nxadsql358ss615krvdlnb6rr",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/crypto/cardano/default.nix b/pkgs/crypto/cardano/default.nix
deleted file mode 100644
index 879fddb..0000000
--- a/pkgs/crypto/cardano/default.nix
+++ /dev/null
@@ -1,29 +0,0 @@
1{ stdenv, mylibs }:
2let
3 daedalusSrc = (mylibs.fetchedGithub ./daedalus.json).src;
4 daedalusOrig = (import daedalusSrc {}).daedalus;
5 cfg = stdenv.mkDerivation rec {
6 name = "launcher-config-custom";
7 buildInputs = [ daedalusSrc daedalusOrig.cfg ];
8 src = daedalusOrig.cfg;
9 installPhase = ''
10 cp -a $src $out
11 chmod -R u+w $out
12 cd $out/etc
13 sed -e "/^walletPath/d" -e "/^walletArgs/d" launcher-config.yaml > launcher-config-server-only.yaml
14 '';
15 };
16in
17stdenv.mkDerivation rec {
18 name = "daedalus-custom";
19 src = daedalusOrig;
20 buildInputs = [ cfg daedalusOrig ];
21 installPhase = ''
22 cp -a $src $out
23 chmod -R u+w $out
24 cd $out/bin
25 sed -i -e "s@${builtins.storeDir}/[0-9a-z]*-daedalus-config@${cfg}/etc@" daedalus
26 sed -e "s@${cfg}/etc/launcher-config.yaml@${cfg}/etc/launcher-config-server-only.yaml@" daedalus > daedalus-server-only
27 chmod a+x daedalus-server-only
28 '';
29}
diff --git a/pkgs/crypto/iota-cli-app/default.nix b/pkgs/crypto/iota-cli-app/default.nix
deleted file mode 100644
index e9e9f92..0000000
--- a/pkgs/crypto/iota-cli-app/default.nix
+++ /dev/null
@@ -1,20 +0,0 @@
1{ stdenv, mylibs, fetchurl, fetchgit, callPackage, nodePackages, nodejs-10_x }:
2let
3 nodeEnv = callPackage mylibs.nodeEnv { nodejs = nodejs-10_x; };
4 # built using node2nix -8 -l package-lock.json
5 # and changing "./." to "src"
6 packageEnv = import ./node-packages.nix {
7 src = stdenv.mkDerivation (mylibs.fetchedGithub ./iota-cli-app.json // {
8 phases = "installPhase";
9 installPhase = ''
10 cp -a $src $out
11 chmod u+w -R $out
12 cd $out
13 sed -i -e "s@host: 'http://localhost',@host: 'https://nodes.thetangle.org',@" index.js
14 sed -i -e "s@port: 14265@port: 443@" index.js
15 '';
16 });
17 inherit fetchurl fetchgit nodeEnv;
18 };
19in
20packageEnv.package
diff --git a/pkgs/crypto/iota-cli-app/iota-cli-app.json b/pkgs/crypto/iota-cli-app/iota-cli-app.json
deleted file mode 100644
index 6b47dec..0000000
--- a/pkgs/crypto/iota-cli-app/iota-cli-app.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "d7e2e08-master",
3 "meta": {
4 "name": "iota-cli-app",
5 "url": "https://github.com/iotaledger/cli-app",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "iotaledger",
10 "repo": "cli-app",
11 "rev": "d7e2e0856ae6bd34890fefb4245c07cd467a5032",
12 "sha256": "1n9kczsxdgjv8282nj2grlijvxipiskx0ndn169vz6v1l1hrwc8b",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/default.nix b/pkgs/default.nix
deleted file mode 100644
index 5f5df82..0000000
--- a/pkgs/default.nix
+++ /dev/null
@@ -1,64 +0,0 @@
1{ pkgs }:
2with pkgs;
3let
4 mylibs = import ../lib { inherit pkgs; };
5in
6rec {
7 sources = import ../nix/sources.nix;
8 myEnvironments = callPackage ../environments {};
9 boinctui = callPackage ./boinctui {};
10 cnagios = callPackage ./cnagios { inherit mylibs; };
11 commento = callPackage ./commento {};
12 flrn = callPackage ./flrn { inherit mylibs; slang = callPackage ./slang_1 {}; };
13 genius = callPackage ./genius {};
14 mtop = callPackage ./mtop {};
15 muttprint = callPackage ./muttprint {};
16 mutt-ics = callPackage ./mutt-ics { inherit mylibs; };
17 nagios-cli = callPackage ./nagios-cli { inherit mylibs; };
18 nagnu = callPackage ./nagnu { inherit mylibs; };
19 nb = callPackage ./nb {};
20 note = callPackage ./note {};
21 notmuch-python2 = callPackage ./notmuch/notmuch-python { pythonPackages = python2Packages; };
22 notmuch-python3 = callPackage ./notmuch/notmuch-python { pythonPackages = python3Packages; };
23 notmuch-vim = callPackage ./notmuch/notmuch-vim {};
24 pgloader = callPackage ./pgloader {};
25 predixy = callPackage ./predixy { inherit mylibs; };
26 rrsync_sudo = callPackage ./rrsync_sudo {};
27 signaldctl = callPackage ./signaldctl {};
28 telegram-history-dump = callPackage ./telegram-history-dump { inherit mylibs; };
29 telegramircd = callPackage ./telegramircd { inherit mylibs; telethon = callPackage ./telethon_sync {}; };
30 terminal-velocity = callPackage ./terminal-velocity {};
31 tiv = callPackage ./tiv {};
32 twins = callPackage ./twins {};
33 umami = callPackage ./umami {};
34 unicodeDoc = callPackage ./unicode {};
35
36 cardano = callPackage ./crypto/cardano { inherit mylibs; };
37 cardano-cli = callPackage ./crypto/cardano-cli {};
38 iota-cli-app = callPackage ./crypto/iota-cli-app { inherit mylibs; };
39 sia = callPackage ./crypto/sia {};
40
41 proftpd = callPackage ./proftpd {};
42 pure-ftpd = callPackage ./pure-ftpd {};
43
44 composerEnv = callPackage ./composer-env {};
45 webapps = callPackage ./webapps { inherit mylibs composerEnv; };
46
47 monitoring-plugins = callPackage ./monitoring-plugins {};
48 naemon = callPackage ./naemon { inherit mylibs monitoring-plugins; };
49 naemon-livestatus = callPackage ./naemon-livestatus { inherit mylibs naemon; };
50 gearmand = callPackage ./gearmand {};
51 status_engine = {
52 module = callPackage ./status_engine/module.nix { inherit mylibs; };
53 worker = callPackage ./status_engine/worker.nix { inherit mylibs composerEnv; };
54 interface = callPackage ./status_engine/interface.nix { inherit composerEnv; };
55 };
56
57 python3PackagesPlus = callPackage ./python-packages {
58 python = python3;
59 inherit mylibs;
60 };
61 dovecot_deleted-to-trash = callPackage ./dovecot/plugins/deleted_to_trash {
62 inherit mylibs;
63 };
64}
diff --git a/pkgs/dovecot/plugins/deleted_to_trash/default.nix b/pkgs/dovecot/plugins/deleted_to_trash/default.nix
deleted file mode 100644
index db1afb5..0000000
--- a/pkgs/dovecot/plugins/deleted_to_trash/default.nix
+++ /dev/null
@@ -1,21 +0,0 @@
1{ stdenv, fetchurl, dovecot, mylibs, fetchpatch }:
2
3stdenv.mkDerivation (mylibs.fetchedGithub ./dovecot-deleted_to_trash.json // rec {
4 buildInputs = [ dovecot ];
5 patches = [
6 (fetchpatch {
7 name = "fix-dovecot-2.3.diff";
8 url = "https://github.com/lexbrugman/dovecot_deleted_to_trash/commit/c52a3799a96104a603ade33404ef6aa1db647b2f.diff";
9 sha256 = "0pld3rdcjp9df2qxbp807k6v4f48lyk0xy5q508ypa57d559y6dq";
10 })
11 ./fix_mbox.patch
12 ];
13 preConfigure = ''
14 substituteInPlace Makefile --replace \
15 "/usr/include/dovecot" \
16 "${dovecot}/include/dovecot"
17 substituteInPlace Makefile --replace \
18 "/usr/lib/dovecot/modules" \
19 "$out/lib/dovecot"
20 '';
21})
diff --git a/pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json b/pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json
deleted file mode 100644
index 2987a02..0000000
--- a/pkgs/dovecot/plugins/deleted_to_trash/dovecot-deleted_to_trash.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "81b0754-master",
3 "meta": {
4 "name": "dovecot-deleted_to_trash",
5 "url": "https://github.com/lexbrugman/dovecot_deleted_to_trash",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "lexbrugman",
10 "repo": "dovecot_deleted_to_trash",
11 "rev": "81b07549accfc36467bf8527a53c295c7a02dbb9",
12 "sha256": "1b3k31g898s4fa0a9l4kvjsdyds772waaay84sjdxv09jw6mqs0f",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/flrn/default.nix b/pkgs/flrn/default.nix
deleted file mode 100644
index f288615..0000000
--- a/pkgs/flrn/default.nix
+++ /dev/null
@@ -1,13 +0,0 @@
1{ stdenv, mylibs, libetpan, openssl, autoconf, groff, slang, yacc }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./flrn.json // {
3 buildInputs = [ libetpan openssl autoconf groff slang yacc ];
4 preConfigure = ''
5 sed -i -e "s/test -e configure/false/" configure.in
6 autoconf
7 sed -i -e '/define CHECK_MAIL/d' src/flrn_config.h
8 sed -i -e '/DEFAULT_DIR_FILE/s@".flrn"@".config/flrn"@' src/flrn_config.h
9 sed -i -e '/DEFAULT_CONFIG_FILE/s@".flrnrc"@"flrnrc"@' src/flrn_config.h
10 sed -i -e '/DEFAULT_FLNEWS_FILE/s@".flnewsrc"@"flnewsrc"@' src/flrn_config.h
11 sed -i -e '/flrn_char chaine/s@18@20@' src/flrn_command.c
12 '';
13})
diff --git a/pkgs/flrn/flrn.json b/pkgs/flrn/flrn.json
deleted file mode 100644
index 3d7a944..0000000
--- a/pkgs/flrn/flrn.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "860d642-master",
3 "meta": {
4 "name": "flrn",
5 "url": "https://github.com/Cigaes/flrn",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "Cigaes",
10 "repo": "flrn",
11 "rev": "860d642bd6389a209c8b697bd044f78d23406509",
12 "sha256": "0sqlxxpy1xg7cb2hbxcr0al46nyr6jjnns4b5i8w04z5sypa9r5c",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/gearmand/default.nix b/pkgs/gearmand/default.nix
deleted file mode 100644
index bb3be89..0000000
--- a/pkgs/gearmand/default.nix
+++ /dev/null
@@ -1,16 +0,0 @@
1{ stdenv, fetchurl, boost, gperf, libevent, libmysqlclient, libuuid, python3, sqlite, hiredis, postgresql, openssl }:
2stdenv.mkDerivation rec {
3 pname = "gearmand";
4 version = "1.1.19.1";
5 src = fetchurl {
6 url = "https://github.com/gearman/${pname}/releases/download/${version}/${pname}-${version}.tar.gz";
7 sha256 = "1yvb2r3n89p43nchsi3d4nwl0f4xsiy8msnacmm4x4hcdb8y19lf";
8 };
9 buildInputs = [ boost gperf libevent openssl libmysqlclient libuuid sqlite hiredis postgresql ];
10 configureFlags = [
11 "--with-boost=${boost.dev}"
12 "--with-boost-libdir=${boost}/lib"
13 "--with-openssl=${openssl.dev}"
14 "--enable-ssl"
15 ];
16}
diff --git a/pkgs/genius/default.nix b/pkgs/genius/default.nix
deleted file mode 100644
index b40d1d0..0000000
--- a/pkgs/genius/default.nix
+++ /dev/null
@@ -1,19 +0,0 @@
1{ stdenv, fetchurl, mpfr, glib, hicolor-icon-theme, gtk2, intltool, gnome-doc-utils, python3, gnome2, autoconf, automake, libtool, ncurses, readline, pkg-config, }:
2stdenv.mkDerivation rec {
3 name = "genius-${version}";
4 version = "1.0.24";
5 src = fetchurl {
6 url = "https://download.gnome.org/sources/genius/1.0/${name}.tar.xz";
7 sha256 = "772f95f6ae4716d39bb180cd50e8b6b9b074107bee0cd083b825e1e6e55916b6";
8 };
9 buildInputs = [
10 mpfr glib hicolor-icon-theme gtk2 intltool gnome-doc-utils python3 gnome2.gtksourceview
11 autoconf automake libtool ncurses readline pkg-config
12 ];
13 preConfigure = ''
14 autoreconf -fi
15 '';
16 preBuild = ''
17 sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool
18 '';
19}
diff --git a/pkgs/monitoring-plugins/default.nix b/pkgs/monitoring-plugins/default.nix
deleted file mode 100644
index 852d29b..0000000
--- a/pkgs/monitoring-plugins/default.nix
+++ /dev/null
@@ -1,33 +0,0 @@
1{ stdenv, iputils, fetchpatch, fetchurl, file, hostname, perl, openssl,
2 bind, openldap, procps-ng, postfix,
3 wrapperDir ? "/run/wrappers/bin"
4}:
5stdenv.mkDerivation rec {
6 pname = "monitoring-plugins";
7 version = "2.2";
8 name = "${pname}-${version}";
9
10 src = fetchurl {
11 url = "https://www.monitoring-plugins.org/download/${name}.tar.gz";
12 sha256 = "0r9nvnk64nv7k8w352n99lw4p92pycxd9wlga9zyzjx9027m6si9";
13 };
14
15 patches = [
16 (fetchpatch {
17 name = "mariadb.patch";
18 url = "https://git.archlinux.org/svntogit/community.git/plain/trunk/0001-mariadb.patch?h=packages/monitoring-plugins";
19 sha256 = "0jf6fqkyzag66rid92m7asnr2dp8rr8kn4zjvhqg0mqvf8imppky";
20 })
21 ];
22
23 # ping needs CAP_NET_RAW capability which is set only in the wrappers namespace
24 configurePhase = ''
25 ./configure --disable-static --disable-dependency-tracking \
26 --prefix=$out \
27 --with-ping-command="${wrapperDir}/ping -4 -n -U -w %d -c %d %s" \
28 --with-ping6-command="${wrapperDir}/ping -6 -n -U -w %d -c %d %s" \
29 --with-sudo-command="${wrapperDir}/sudo"
30 '';
31
32 buildInputs = [ perl file hostname iputils openssl openldap procps-ng bind.dnsutils postfix ];
33}
diff --git a/pkgs/mtop/default.nix b/pkgs/mtop/default.nix
deleted file mode 100644
index 3f6b6bc..0000000
--- a/pkgs/mtop/default.nix
+++ /dev/null
@@ -1,24 +0,0 @@
1{ buildPerlPackage, fetchurl, perlPackages, lib }:
2buildPerlPackage rec {
3 pname = "mtop";
4 version = "0.6.6";
5 src = fetchurl {
6 url = "http://downloads.sourceforge.net/project/mtop/mtop/v${version}/mtop-${version}.tar.gz";
7 sha256 = "0x0x5300b1j9i0xxk8rsrki0pspyzj2vylhzv8qg3l6j26aw0zrf";
8 };
9 outputs = ["out"];
10 buildInputs = with perlPackages; [ DBI DBDmysql Curses ];
11
12 postInstall = ''
13 cd "$out"
14 preConfigure || true
15 '';
16
17 meta = with lib; {
18 description = "MySQL top (monitor and examine slow queries)";
19 homepage = http://mtop.sourceforge.net/;
20 license = licenses.gpl3;
21 maintainers = with maintainers; [ { name = "Marc Prewitt"; email = "mprewitt@chelsea.net"; } ];
22 platforms = platforms.unix;
23 };
24}
diff --git a/pkgs/mutt-ics/default.nix b/pkgs/mutt-ics/default.nix
deleted file mode 100644
index a8a529b..0000000
--- a/pkgs/mutt-ics/default.nix
+++ /dev/null
@@ -1,5 +0,0 @@
1{ python3Packages, mylibs }:
2with python3Packages;
3buildPythonApplication (mylibs.fetchedGithub ./mutt-ics.json // {
4 propagatedBuildInputs = [ icalendar ];
5})
diff --git a/pkgs/mutt-ics/mutt-ics.json b/pkgs/mutt-ics/mutt-ics.json
deleted file mode 100644
index ae8ed37..0000000
--- a/pkgs/mutt-ics/mutt-ics.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "d291187-master",
3 "meta": {
4 "name": "mutt-ics",
5 "url": "https://github.com/dmedvinsky/mutt-ics",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "dmedvinsky",
10 "repo": "mutt-ics",
11 "rev": "d29118788f291f67d34fefa6eda9f95846a2fe34",
12 "sha256": "0kqzngsvzjq5gpf60jhfmb2xzjznvk172khf4dlcb72n3ak4rb92",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/naemon-livestatus/default.nix b/pkgs/naemon-livestatus/default.nix
deleted file mode 100644
index 46ef51a..0000000
--- a/pkgs/naemon-livestatus/default.nix
+++ /dev/null
@@ -1,23 +0,0 @@
1{ stdenv, mylibs, autoconf, automake,
2 libtool, pkg-config, naemon,
3 varDir ? "/var/lib/naemon",
4 etcDir ? "/etc/naemon"
5}:
6stdenv.mkDerivation (mylibs.fetchedGithub ./naemon-livestatus.json // {
7 preConfigure = ''
8 ./autogen.sh || true
9 '';
10
11 configureFlags = [
12 "--localstatedir=${varDir}"
13 "--sysconfdir=${etcDir}"
14 ];
15
16 preInstall = ''
17 substituteInPlace Makefile --replace \
18 '@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am' \
19 '@$(MAKE) $(AM_MAKEFLAGS) install-exec-am'
20 '';
21
22 buildInputs = [ autoconf automake libtool pkg-config naemon ];
23})
diff --git a/pkgs/naemon-livestatus/naemon-livestatus.json b/pkgs/naemon-livestatus/naemon-livestatus.json
deleted file mode 100644
index c648d2b..0000000
--- a/pkgs/naemon-livestatus/naemon-livestatus.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "33dbcfe-master",
3 "meta": {
4 "name": "naemon-livestatus",
5 "url": "https://github.com/naemon/naemon-livestatus",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "naemon",
10 "repo": "naemon-livestatus",
11 "rev": "33dbcfe18e42158f25c27cff95a1e07b73be53b0",
12 "sha256": "16jk0c6pwr7ck0g6s12hj6czbhgdr7c7f74zzsp5279af86y8fd6",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/naemon/default.nix b/pkgs/naemon/default.nix
deleted file mode 100644
index 0341296..0000000
--- a/pkgs/naemon/default.nix
+++ /dev/null
@@ -1,35 +0,0 @@
1{ stdenv, mylibs, help2man, monitoring-plugins, autoconf, automake,
2 libtool, glib, pkg-config, gperf,
3 varDir ? "/var/lib/naemon",
4 etcDir ? "/etc/naemon",
5 cacheDir ? "/var/cache/naemon",
6 logDir ? "/var/log/naemon",
7 runDir ? "/run/naemon",
8 user ? "naemon",
9 group ? "naemon"
10}:
11stdenv.mkDerivation (mylibs.fetchedGithub ./naemon.json // {
12 passthru.status_engine_version = "1-1-0";
13 preConfigure = ''
14 ./autogen.sh || true
15 '';
16
17 configureFlags = [
18 "--localstatedir=${varDir}"
19 "--sysconfdir=${etcDir}"
20 "--with-pkgconfdir=${etcDir}"
21 "--with-pluginsdir=${monitoring-plugins}/libexec"
22 "--with-tempdir=${cacheDir}"
23 "--with-checkresultdir=${cacheDir}/checkresults"
24 "--with-logdir=${logDir}"
25 "--with-naemon-user=${user}"
26 "--with-naemon-group=${group}"
27 "--with-lockfile=${runDir}/naemon.pid"
28 ];
29
30 preInstall = ''
31 substituteInPlace Makefile --replace '$(MAKE) $(AM_MAKEFLAGS) install-exec-hook' ""
32 '';
33
34 buildInputs = [ autoconf automake help2man libtool glib pkg-config gperf ];
35})
diff --git a/pkgs/naemon/naemon.json b/pkgs/naemon/naemon.json
deleted file mode 100644
index 2dc9809..0000000
--- a/pkgs/naemon/naemon.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "d7ac1c8-master",
3 "meta": {
4 "name": "naemon",
5 "url": "https://github.com/naemon/naemon-core",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "naemon",
10 "repo": "naemon-core",
11 "rev": "d7ac1c824e01dbb1c4a6bd0550b324e7cf165d54",
12 "sha256": "003grwciplnqfn9jh2km2pm6xxp8fxvmwihg3vmch8f0vfwcmv1m",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/nagios-cli/default.nix b/pkgs/nagios-cli/default.nix
deleted file mode 100644
index 7d7e7cc..0000000
--- a/pkgs/nagios-cli/default.nix
+++ /dev/null
@@ -1,2 +0,0 @@
1{ python2Packages, mylibs }:
2python2Packages.buildPythonApplication (mylibs.fetchedGithub ./nagios-cli.json)
diff --git a/pkgs/nagios-cli/nagios-cli.json b/pkgs/nagios-cli/nagios-cli.json
deleted file mode 100644
index fc91227..0000000
--- a/pkgs/nagios-cli/nagios-cli.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "edc51ea-master",
3 "meta": {
4 "name": "nagios-cli",
5 "url": "https://github.com/tehmaze/nagios-cli",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "tehmaze",
10 "repo": "nagios-cli",
11 "rev": "edc51eaccf1086bb4469ce45c5e5155f2d71a2f9",
12 "sha256": "1qw5fv4niz079zqwmfr3kzjv8cc31rbhi9whdbv9c32qdi3h7vsp",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/nagnu/default.nix b/pkgs/nagnu/default.nix
deleted file mode 100644
index 2b9c0ec..0000000
--- a/pkgs/nagnu/default.nix
+++ /dev/null
@@ -1,12 +0,0 @@
1{ stdenv, mylibs, ncurses, curl }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./nagnu.json // rec {
3 buildInputs = [ ncurses curl ];
4 installPhase = ''
5 mkdir -p $out/bin
6 cp nagnu $out/bin
7 mkdir -p $out/share/doc/nagnu
8 cp nagnu.conf.sample $out/share/doc/nagnu
9 mkdir -p $out/share/man/man8
10 cp docs/nagnu.8 $out/share/man/man8
11 '';
12})
diff --git a/pkgs/nagnu/nagnu.json b/pkgs/nagnu/nagnu.json
deleted file mode 100644
index 60a8b07..0000000
--- a/pkgs/nagnu/nagnu.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "c7e65fc-master",
3 "meta": {
4 "name": "nagnu",
5 "url": "https://github.com/frlen/nagnu",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "frlen",
10 "repo": "nagnu",
11 "rev": "c7e65fc02f46a3756a4cc47953ea2f3e57a84728",
12 "sha256": "1i2jm8ibvqcc734daamnzc3hx8q0nsry1x12q0kr5yvcsdjjgyy3",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/nb/default.nix b/pkgs/nb/default.nix
deleted file mode 100644
index 37cc89f..0000000
--- a/pkgs/nb/default.nix
+++ /dev/null
@@ -1,20 +0,0 @@
1{ pkgs ? import <nixpkgs> {} }: with pkgs;
2stdenv.mkDerivation {
3 pname = "nb";
4 version = "e0d4e24-master";
5 src = fetchFromGitHub {
6 owner = "xwmx";
7 repo = "nb";
8 rev = "e0d4e24201299916d736be6a9800793cec32927e";
9 sha256 = "0gpnlzxjlfn3bagw74lsrmfhxj2xzvk6sjj24wp9rjpk42d9mfml";
10 };
11 phases = "installPhase";
12 installPhase = ''
13 mkdir -p $out/bin $out/share/zsh/vendor-completions $out/share/bash-completion/completions
14 cp $src/nb $out/bin/nb
15 chmod +x $out/bin/nb
16 patchShebangs $out/bin/nb
17 cp $src/etc/nb-completion.zsh $out/share/zsh/vendor-completions/_nb
18 cp $src/etc/nb-completion.bash $out/share/bash-completion/completions/nb
19 '';
20}
diff --git a/pkgs/note/default.nix b/pkgs/note/default.nix
deleted file mode 100644
index d5fcccd..0000000
--- a/pkgs/note/default.nix
+++ /dev/null
@@ -1,19 +0,0 @@
1{ lib, buildPerlPackage, fetchurl, perlPackages }:
2buildPerlPackage rec {
3 pname = "note";
4 version = "1.3.26";
5 src = fetchurl {
6 url = "mirror://cpan/authors/id/T/TL/TLINDEN/${pname}-${version}.tar.gz";
7 sha256 = "1h645rnb5vpms48fcyzvp7cwwcbf9k5xq49w2bpniyzzgk2brjrq";
8 };
9 outputs = ["out" "man"];
10 propagatedBuildInputs = with perlPackages; [ YAML ];
11
12 meta = with lib; {
13 description = "A perl script for maintaining notes";
14 homepage = http://www.daemon.de/NOTE;
15 license = licenses.gpl3;
16 maintainers = with maintainers; [ { name = "T.v.Dein"; email = "tlinden@cpan.org"; } ];
17 platforms = platforms.unix;
18 };
19}
diff --git a/pkgs/pgloader/default.nix b/pkgs/pgloader/default.nix
deleted file mode 100644
index 6093ada..0000000
--- a/pkgs/pgloader/default.nix
+++ /dev/null
@@ -1,40 +0,0 @@
1# https://github.com/NixOS/nixpkgs/pull/61702
2{ stdenv, fetchurl, makeWrapper, sbcl, sqlite, freetds, libzip, curl, git, cacert, openssl }:
3stdenv.mkDerivation rec {
4 pname = "pgloader";
5 version = "3.6.1";
6 name = "${pname}-${version}";
7
8 src = fetchurl {
9 url = "https://github.com/dimitri/pgloader/releases/download/v3.6.1/pgloader-bundle-3.6.1.tgz";
10 sha256 = "1sm8xmq30d1biin5br0y3vrv4fydbrzfqglz1hnvrkdyxrg7d6f9";
11 };
12
13 nativeBuildInputs = [ git makeWrapper ];
14 buildInputs = [ sbcl cacert sqlite freetds libzip curl openssl ];
15
16 LD_LIBRARY_PATH = stdenv.lib.makeLibraryPath [ sqlite libzip curl git openssl freetds ];
17
18 buildPhase = ''
19 export PATH=$PATH:$out/bin
20 export HOME=$TMPDIR
21
22 make pgloader
23 '';
24
25 dontStrip = true;
26 enableParallelBuilding = false;
27
28 installPhase = ''
29 install -Dm755 bin/pgloader "$out/bin/pgloader"
30 wrapProgram $out/bin/pgloader --prefix LD_LIBRARY_PATH : "${LD_LIBRARY_PATH}"
31 '';
32
33 meta = with stdenv.lib; {
34 homepage = https://pgloader.io/;
35 description = "pgloader loads data into PostgreSQL and allows you to implement Continuous Migration from your current database to PostgreSQL";
36 maintainers = with maintainers; [ mguentner ];
37 license = licenses.postgresql;
38 platforms = platforms.all;
39 };
40}
diff --git a/pkgs/predixy/default.nix b/pkgs/predixy/default.nix
deleted file mode 100644
index 7e7a9ba..0000000
--- a/pkgs/predixy/default.nix
+++ /dev/null
@@ -1,10 +0,0 @@
1{ stdenv, mylibs }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./predixy.json // {
3 installPhase = ''
4 mkdir -p $out/bin
5 cp src/predixy $out/bin
6 mkdir -p $out/share
7 cp -r doc $out/share
8 cp -r conf $out/share/doc
9 '';
10})
diff --git a/pkgs/predixy/predixy.json b/pkgs/predixy/predixy.json
deleted file mode 100644
index 9f9759c..0000000
--- a/pkgs/predixy/predixy.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "dacf3fb-master",
3 "meta": {
4 "name": "predixy",
5 "url": "https://github.com/joyieldInc/predixy",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "joyieldInc",
10 "repo": "predixy",
11 "rev": "dacf3fb30c2602dc044040df04e194d44b49c1be",
12 "sha256": "0sbvy0jg551lwkfq8qh0a49cl9mhfnkhi3cnk25l8pz4jcdrr9k9",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/proftpd/default.nix b/pkgs/proftpd/default.nix
deleted file mode 100644
index af9d6c6..0000000
--- a/pkgs/proftpd/default.nix
+++ /dev/null
@@ -1,23 +0,0 @@
1{ pkgs ? import <nixpkgs> {} }:
2with pkgs;
3
4stdenv.mkDerivation rec {
5 pname = "proftpd";
6 version = "1.3.7c";
7 src = fetchurl {
8 url = "https://github.com/proftpd/proftpd/archive/refs/tags/v${version}.tar.gz";
9 sha256 = "1nh02j00ly814fk885wn9zx1lb63cqd8qv3mgz719xkckf5rcw3h";
10 };
11 postPatch = ''
12 sed -i -e "s@/usr/bin/file@${file}/bin/file@" configure
13 '';
14 dontDisableStatic = 1;
15 configureFlags = "--enable-openssl --with-modules=mod_ldap:mod_sftp:mod_tls --with-includes=${libsodium.dev}/include --with-libraries=${libsodium}/lib";
16 preInstall = ''
17 installFlagsArray=(INSTALL_USER=$(id -u) INSTALL_GROUP=$(id -g))
18 '';
19 buildInputs = [ openssl libsodium ncurses cyrus_sasl openldap pkg-config ];
20 postInstall = ''
21 rmdir $out/var $out/libexec $out/lib/proftpd $out/share/locale
22 '';
23}
diff --git a/pkgs/pure-ftpd/default.nix b/pkgs/pure-ftpd/default.nix
deleted file mode 100644
index 32a7a91..0000000
--- a/pkgs/pure-ftpd/default.nix
+++ /dev/null
@@ -1,30 +0,0 @@
1{ ldapFtpId ? null
2, stdenv, fetchurl, openssl, postgresql, openldap }:
3
4stdenv.mkDerivation rec {
5 name = "pure-ftpd-1.0.47";
6
7 src = fetchurl {
8 url = "https://download.pureftpd.org/pub/pure-ftpd/releases/${name}.tar.gz";
9 sha256 = "1b97ixva8m10vln8xrfwwwzi344bkgxqji26d0nrm1yzylbc6h27";
10 };
11
12 preConfigure = stdenv.lib.optionalString (!isNull ldapFtpId) ''
13 sed -i -e "s#FTPuid#${ldapFtpId}Uid#" src/log_ldap.h
14 sed -i -e "s#FTPgid#${ldapFtpId}Gid#" src/log_ldap.h
15 '';
16 postConfigure = ''
17 sed -i 's/define MAX_DATA_SIZE (40/define MAX_DATA_SIZE (70/' src/ftpd.h
18 '';
19 buildInputs = [ openssl postgresql openldap ];
20
21 configureFlags = [ "--with-everything" "--with-tls" "--with-pgsql" "--with-ldap" ];
22
23 meta = with stdenv.lib; {
24 description = "A free, secure, production-quality and standard-conformant FTP server";
25 homepage = https://www.pureftpd.org;
26 license = licenses.isc; # with some parts covered by BSD3(?)
27 maintainers = [ maintainers.lethalman ];
28 platforms = platforms.linux;
29 };
30}
diff --git a/pkgs/python-packages/blivet/default.nix b/pkgs/python-packages/blivet/default.nix
deleted file mode 100644
index 108d548..0000000
--- a/pkgs/python-packages/blivet/default.nix
+++ /dev/null
@@ -1,118 +0,0 @@
1{ lib, writeText, poetry2nix, python, pythonPackages,
2 gobject-introspection, libblockdev, libbytesize, fetchFromGitHub,
3 pkg-config, parted, systemd,
4 with_dmraid ? false,
5 with_fs_btrfs ? false,
6 with_fs_fat ? false,
7 with_fs_f2fs ? false,
8 with_fs_hfs_plus ? false,
9 with_fs_jfs ? false,
10 with_fs_nfs ? false,
11 with_fs_nfsv4 ? false,
12 with_fs_ntfs ? false,
13 with_fs_reiserfs ? false,
14 with_fs_xfs ? false,
15 with_luks ? false,
16 with_lvm ? false,
17 with_mdadm ? false,
18 with_multipath ? false,
19 with_optical ? false,
20 with_iscsi ? false,
21 dmraid, multipath_tools, lvm2, eject, kmod, utillinux, lsof,
22 openiscsi, coreutils, dosfstools, e2fsprogs, jfsutils, btrfs-progs,
23 xfsprogs, f2fs-tools, hfsprogs, nfs-utils, ntfs3g, ntfsprogs,
24 reiserfsprogs, devicemapper, cryptsetup, mdadm
25}@args:
26let
27 # FIXME: blivet/tasks/fsmount.py links to /sbin
28 additionalPackages =
29 lib.optionals with_dmraid [ dmraid ]
30 ++ lib.optionals with_fs_btrfs [ btrfs-progs ]
31 ++ lib.optionals with_fs_fat [ dosfstools ]
32 ++ lib.optionals with_fs_f2fs [ f2fs-tools ]
33 ++ lib.optionals with_fs_hfs_plus [ hfsprogs ]
34 ++ lib.optionals with_fs_jfs [ jfsutils ]
35 ++ lib.optionals with_fs_nfs [ nfs-utils ]
36 ++ lib.optionals with_fs_ntfs [ ntfs3g ntfsprogs ]
37 ++ lib.optionals with_fs_reiserfs [ reiserfsprogs ]
38 ++ lib.optionals with_fs_xfs [ xfsprogs.bin ]
39 ++ lib.optionals with_luks [ devicemapper cryptsetup ]
40 ++ lib.optionals with_lvm [ lvm2 ]
41 ++ lib.optionals with_mdadm [ mdadm ]
42 ++ lib.optionals with_multipath [ multipath_tools ]
43 ++ lib.optionals with_optical [ eject ]
44 ++ lib.optionals with_iscsi [ openiscsi ];
45in
46# nix-shell -E "with import <nixpkgs> {}; pkgs.mkShell { buildInputs = [ python3 python3Packages.blivet3 ]; }"
47# nix-shell -E "with import <nixpkgs> {}; pkgs.mkShell { buildInputs = [ (python3.withPackages(p: [ p.blivet3 ])) ]; }"
48poetry2nix.mkPoetryApplication {
49 inherit python;
50 propagatedBuildInputs = [
51 gobject-introspection
52 (pythonPackages.toPythonModule libblockdev)
53 (pythonPackages.toPythonModule libbytesize)
54 ];
55 src = fetchFromGitHub {
56 owner = "storaged-project";
57 repo = "blivet";
58 rev = "blivet-3.3.0";
59 sha256 = "0ynxm37cxxr2sf2hj18hrdxs1qfw6dgdagkvv5f6g4fmp51m7c3c";
60 };
61 overrides = poetry2nix.overrides.withDefaults (self: super: {
62 pyparted = super.pyparted.overridePythonAttrs (old: {
63 buildInputs = old.buildInputs ++ [ parted ];
64 nativeBuildInputs = old.nativeBuildInputs ++ [ pkg-config ];
65 });
66 selinux = super.selinux.overridePythonAttrs (old: {
67 buildInputs = old.buildInputs ++ [ self.setuptools-scm-git-archive ];
68 nativeBuildInputs = old.nativeBuildInputs ++ [ pkg-config ];
69 });
70 });
71 patches = [ ./fix_path.patch ];
72 postPatch = let
73 runtimePaths = lib.makeBinPath ([
74 systemd utillinux kmod e2fsprogs mdadm lsof coreutils
75 ] ++ additionalPackages);
76 libraryPath = builtins.concatStringsSep " " (map (v: "-rpath ${v}/lib -L ${v}/lib") [ systemd.lib ]);
77 giLibraryPath = lib.makeSearchPath "lib/girepository-1.0" [libblockdev gobject-introspection];
78 addGiPath = writeText "add-gi-path" ''
79 import os
80 newGiPath = "${giLibraryPath}"
81 if newGiPath not in os.environ.get("GI_TYPELIB_PATH", ""):
82 os.environ["GI_TYPELIB_PATH"] = os.environ.get("GI_TYPELIB_PATH", "") + ":" + newGiPath
83 '';
84 addPath = writeText "add-path" ''
85 import os
86 newPath = "${runtimePaths}"
87 newLibraryPath = "${libraryPath}"
88 if newPath not in os.environ.get("PATH", ""):
89 os.environ["PATH"] = os.environ.get("PATH", "") + ":" + newPath
90 os.environ["NIX_LDFLAGS"] = os.environ.get("NIX_LDFLAGS", "") + " " + newLibraryPath
91 '';
92 in
93 ''
94 prepend() {
95 mv "$1" "$1.bak"
96 cat ${addPath} "$1.bak" > $1
97 rm -f "$1.bak"
98 }
99 prepend "blivet/__init__.py"
100 prepend "blivet/iscsi.py"
101 prepend "blivet/tasks/availability.py"
102 prepend "blivet/util.py"
103 prepend "blivet/udev.py"
104 prependGi() {
105 mv "$1" "$1.bak"
106 cat ${addGiPath} "$1.bak" > $1
107 rm -f "$1.bak"
108 }
109 grep -rl require_version blivet/ | while read i; do prependGi "$i"; done
110 sed -i -e "s@/lib/modules@/run/booted-system/kernel-modules/lib/modules/@" blivet/tasks/fsmount.py
111 '';
112 postInstall = let
113 in ''
114 rm -rf $out/lib/python*/site-packages/{etc,usr}
115 '';
116 pyproject = ./pyproject.toml;
117 poetrylock = ./poetry.lock;
118}
diff --git a/pkgs/python-packages/blivet/fix_path.patch b/pkgs/python-packages/blivet/fix_path.patch
deleted file mode 100644
index 29c4052..0000000
--- a/pkgs/python-packages/blivet/fix_path.patch
+++ /dev/null
@@ -1,21 +0,0 @@
1diff --git a/blivet/tasks/fsmount.py b/blivet/tasks/fsmount.py
2index 15f79a3e..bb3fe873 100644
3--- a/blivet/tasks/fsmount.py
4+++ b/blivet/tasks/fsmount.py
5@@ -19,6 +19,7 @@
6 #
7 # Red Hat Author(s): Anne Mulhern <amulhern@redhat.com>
8
9+from distutils.spawn import find_executable
10 import os
11
12 from ..errors import FSError
13@@ -58,7 +59,7 @@ class FSMount(task.BasicApplication, fstask.FSTask):
14 @property
15 def _can_mount(self):
16 return (self.mount_type in fslib.kernel_filesystems) or \
17- (os.access("/sbin/mount.%s" % (self.mount_type,), os.X_OK)) or \
18+ (find_executable("mount.%s" % (self.mount_type,)) is not None) or \
19 self._has_driver
20
21 @property
diff --git a/pkgs/python-packages/blivet/poetry.lock b/pkgs/python-packages/blivet/poetry.lock
deleted file mode 100644
index c45011a..0000000
--- a/pkgs/python-packages/blivet/poetry.lock
+++ /dev/null
@@ -1,96 +0,0 @@
1[[package]]
2name = "distro"
3version = "1.5.0"
4description = "Distro - an OS platform information API"
5category = "main"
6optional = false
7python-versions = "*"
8
9[[package]]
10name = "pycairo"
11version = "1.19.1"
12description = "Python interface for cairo"
13category = "main"
14optional = false
15python-versions = ">=3.5, <4"
16
17[[package]]
18name = "pygobject"
19version = "3.36.1"
20description = "Python bindings for GObject Introspection"
21category = "main"
22optional = false
23python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
24
25[package.dependencies]
26pycairo = ">=1.11.1"
27
28[[package]]
29name = "pyparted"
30version = "3.11.6"
31description = "Python bindings for GNU parted"
32category = "main"
33optional = false
34python-versions = "*"
35
36[[package]]
37name = "pyudev"
38version = "0.22.0"
39description = "A libudev binding"
40category = "main"
41optional = false
42python-versions = "*"
43
44[package.dependencies]
45six = "*"
46
47[[package]]
48name = "selinux"
49version = "0.2.1"
50description = "shim selinux module"
51category = "main"
52optional = false
53python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
54
55[package.dependencies]
56distro = ">=1.3.0"
57setuptools = ">=39.0"
58
59[[package]]
60name = "six"
61version = "1.15.0"
62description = "Python 2 and 3 compatibility utilities"
63category = "main"
64optional = false
65python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
66
67[metadata]
68lock-version = "1.0"
69python-versions = "^3.8"
70content-hash = "636edb46b1deb0f6d5db636b0bc6639205335c9915480b156a417067137548f8"
71
72[metadata.files]
73distro = [
74 {file = "distro-1.5.0-py2.py3-none-any.whl", hash = "sha256:df74eed763e18d10d0da624258524ae80486432cd17392d9c3d96f5e83cd2799"},
75 {file = "distro-1.5.0.tar.gz", hash = "sha256:0e58756ae38fbd8fc3020d54badb8eae17c5b9dcbed388b17bb55b8a5928df92"},
76]
77pycairo = [
78 {file = "pycairo-1.19.1.tar.gz", hash = "sha256:2c143183280feb67f5beb4e543fd49990c28e7df427301ede04fc550d3562e84"},
79]
80pygobject = [
81 {file = "PyGObject-3.36.1.tar.gz", hash = "sha256:012a589aec687bfa809a1ff9f5cd775dc7f6fcec1a6bc7fe88e1002a68f8ba34"},
82]
83pyparted = [
84 {file = "pyparted-3.11.6.tar.gz", hash = "sha256:727ccdf308c194069aa9797f7a6a973bc95b2e407cdf5d58d6c8bc4c9dec92dc"},
85]
86pyudev = [
87 {file = "pyudev-0.22.0.tar.gz", hash = "sha256:69bb1beb7ac52855b6d1b9fe909eefb0017f38d917cba9939602c6880035b276"},
88]
89selinux = [
90 {file = "selinux-0.2.1-py2.py3-none-any.whl", hash = "sha256:820adcf1b4451c9cc7759848797703263ba0eb6a4cad76d73548a9e0d57b7926"},
91 {file = "selinux-0.2.1.tar.gz", hash = "sha256:d435f514e834e3fdc0941f6a29d086b80b2ea51b28112aee6254bd104ee42a74"},
92]
93six = [
94 {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
95 {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
96]
diff --git a/pkgs/python-packages/blivet/pyproject.toml b/pkgs/python-packages/blivet/pyproject.toml
deleted file mode 100644
index cf86aa1..0000000
--- a/pkgs/python-packages/blivet/pyproject.toml
+++ /dev/null
@@ -1,20 +0,0 @@
1[tool.poetry]
2name = "blivet"
3version = "3.3.0"
4description = "A python module for system storage configuration"
5authors = ["David Lehman <dlehman@redhat.com>"]
6license = "GPL-2.0-or-later"
7
8[tool.poetry.dependencies]
9python = "^3.8"
10six = "^1.15.0"
11pyudev = "^0.22.0"
12pyparted = "^3.11.6"
13selinux = "^0.2.1"
14pygobject = "^3.36.1"
15
16[tool.poetry.dev-dependencies]
17
18[build-system]
19requires = ["poetry>=0.12"]
20build-backend = "poetry.masonry.api"
diff --git a/pkgs/python-packages/buildbot/plugins/buildslist/default.nix b/pkgs/python-packages/buildbot/plugins/buildslist/default.nix
deleted file mode 100644
index 4ab4c54..0000000
--- a/pkgs/python-packages/buildbot/plugins/buildslist/default.nix
+++ /dev/null
@@ -1,65 +0,0 @@
1{ stdenv, runCommand, writeScriptBin, buildBowerComponents, pythonPackages, libsass, python, fetchurl, jq, yarn, nodejs-10_x, yarn2nix-moretea, sources }:
2let
3 yarn2nix-moretea' = yarn2nix-moretea.override({
4 yarn = yarn.override({ nodejs = nodejs-10_x; });
5 nodejs = nodejs-10_x;
6 });
7 buildslist_src = sources.buildbot-plugin-buildslist;
8 packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
9 cat ${buildslist_src}/package.json | jq -r '.version = "${pythonPackages.buildbot-pkg.version}"|.license= "MIT"' > $out
10 '';
11 nodeHeaders = fetchurl {
12 url = "https://nodejs.org/download/release/v${nodejs-10_x.version}/node-v${nodejs-10_x.version}-headers.tar.gz";
13 sha256 = "15hkcbs328d3rc1s14rmky8lh8d3rr86l8k0bia0ggxzwl23lj9c";
14 };
15 buildslist_yarn = yarn2nix-moretea'.mkYarnModules rec {
16 name = "buildslist-yarn-modules";
17 pname = name;
18 inherit (pythonPackages.buildbot-pkg) version;
19 packageJSON = packagejson;
20 yarnLock = "${buildslist_src}/yarn.lock";
21 yarnNix = ./yarn-packages.nix;
22 pkgConfig = {
23 node-sass = {
24 buildInputs = [ libsass python ];
25 postInstall =
26 ''
27 node scripts/build.js --tarball=${nodeHeaders}
28 '';
29 };
30 };
31 };
32 buildslist_bower = buildBowerComponents {
33 name = "buildslist";
34 generated = ./bower.nix;
35 src = "${buildslist_src}/guanlecoja/";
36 };
37 # the buildbot-pkg calls yarn and screws up everything...
38 fakeYarn = writeScriptBin "yarn" ''
39 #!${stdenv.shell}
40 if [ "$1" = "--version" ]; then
41 echo "1.17"
42 fi
43 '';
44in
45pythonPackages.buildPythonPackage rec {
46 pname = "buildbot-buildslist";
47 inherit (pythonPackages.buildbot-pkg) version;
48
49 preConfigure = ''
50 export HOME=$PWD
51 ln -s ${buildslist_yarn}/node_modules .
52 cp -a ${buildslist_bower}/bower_components ./libs
53 PATH=${buildslist_yarn}/node_modules/.bin:$PATH
54 chmod -R u+w libs
55 '';
56 propagatedBuildInputs = with pythonPackages; [
57 (klein.overridePythonAttrs(old: { checkPhase = ""; }))
58 buildbot-pkg
59 ];
60 nativeBuildInputs = [ fakeYarn nodejs-10_x ];
61 buildInputs = [ buildslist_yarn buildslist_bower ];
62
63 doCheck = false;
64 src = buildslist_src;
65}
diff --git a/pkgs/python-packages/buildbot/plugins/default.nix b/pkgs/python-packages/buildbot/plugins/default.nix
deleted file mode 100644
index 22a8507..0000000
--- a/pkgs/python-packages/buildbot/plugins/default.nix
+++ /dev/null
@@ -1,6 +0,0 @@
1{ callPackage, python }:
2{
3 buildslist = callPackage ./buildslist {
4 pythonPackages = python.pkgs;
5 };
6}
diff --git a/pkgs/python-packages/default.nix b/pkgs/python-packages/default.nix
deleted file mode 100644
index 441c5bc..0000000
--- a/pkgs/python-packages/default.nix
+++ /dev/null
@@ -1,7 +0,0 @@
1{ mylibs, callPackage, python }:
2{
3 blivet3 = callPackage ./blivet { inherit python; pythonPackages = python.pkgs; };
4 buildbot-plugins = callPackage ./buildbot/plugins { inherit python; };
5 wokkel = callPackage ./wokkel.nix { pythonPackages = python.pkgs; };
6 pymilter = callPackage ./pymilter.nix { pythonPackages = python.pkgs; };
7}
diff --git a/pkgs/python-packages/pymilter.nix b/pkgs/python-packages/pymilter.nix
deleted file mode 100644
index 736794e..0000000
--- a/pkgs/python-packages/pymilter.nix
+++ /dev/null
@@ -1,11 +0,0 @@
1{ pythonPackages, libmilter }: with pythonPackages;
2buildPythonPackage rec {
3 pname = "pymilter";
4 version = "1.0.4";
5 src = fetchPypi {
6 inherit pname version;
7 sha256 = "1bpcvq7d72q0zi7c8h5knhasywwz9gxc23n9fxmw874n5k8hsn7k";
8 };
9 doCheck = false;
10 buildInputs = [ libmilter ];
11}
diff --git a/pkgs/python-packages/wokkel.nix b/pkgs/python-packages/wokkel.nix
deleted file mode 100644
index 3237f2b..0000000
--- a/pkgs/python-packages/wokkel.nix
+++ /dev/null
@@ -1,11 +0,0 @@
1{ pythonPackages }: with pythonPackages;
2buildPythonPackage rec {
3 pname = "wokkel";
4 version = "18.0.0";
5 src = fetchPypi {
6 inherit pname version;
7 sha256 = "1spq44gg8gsviqx1dvlmjpgfc0wk0jpyx4ap01y2pad1ai9cw016";
8 };
9 propagatedBuildInputs = [ twisted.extras.tls twisted incremental dateutil ];
10 doCheck = false;
11}
diff --git a/pkgs/status_engine/interface.nix b/pkgs/status_engine/interface.nix
deleted file mode 100644
index 7ee4889..0000000
--- a/pkgs/status_engine/interface.nix
+++ /dev/null
@@ -1,21 +0,0 @@
1{ stdenv, composerEnv, fetchurl, callPackage, config_file ? "/var/lib/status_engine/interface.yml" }:
2composerEnv.buildPackage (
3 import ./interface_php_packages.nix { inherit composerEnv fetchurl; } // rec {
4 pname = "interface";
5 version = "3.4.0";
6 name = "${pname}-${version}";
7 src = fetchurl {
8 url = "https://github.com/statusengine/${pname}/archive/${version}.tar.gz";
9 sha256 = "1l11cskv740xvqs9a2yj9zkvgvxvymaq5qap36g2r4hkqbfbbjj2";
10 };
11 unpackPhase = null;
12 postUnpack = ''
13 src=$(pwd)/$sourceRoot
14 '';
15 postInstall = ''
16 ln -s ${config_file} $out/etc/config.yml
17 '';
18 preInstall = ''
19 cp ${./interface_composer.lock} $out/composer.lock
20 '';
21 })
diff --git a/pkgs/status_engine/module.json b/pkgs/status_engine/module.json
deleted file mode 100644
index 5ed06d2..0000000
--- a/pkgs/status_engine/module.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "d461e95-master",
3 "meta": {
4 "name": "statusengine-module",
5 "url": "https://github.com/statusengine/module",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "statusengine",
10 "repo": "module",
11 "rev": "d461e95a11fffaac604d11ac42d237b5e13071bc",
12 "sha256": "1awmq9rck9xy82pambnd2wh66ndif8x8jpk4qbbghs9f2sd48x1n",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/status_engine/module.nix b/pkgs/status_engine/module.nix
deleted file mode 100644
index 43d2b09..0000000
--- a/pkgs/status_engine/module.nix
+++ /dev/null
@@ -1,10 +0,0 @@
1{ stdenv, mylibs, gearmand, json_c, libuuid, libevent, pkgconfig, glib }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./module.json // {
3 patches = [ ./host_perfdata.patch ];
4 buildInputs = [ gearmand json_c libuuid libevent pkgconfig glib ];
5 makeFlags = "all";
6 installPhase = ''
7 mkdir -p $out/lib/status-engine
8 cp -a src/bin/* $out/lib/status-engine
9 '';
10})
diff --git a/pkgs/status_engine/worker.json b/pkgs/status_engine/worker.json
deleted file mode 100644
index 301bab5..0000000
--- a/pkgs/status_engine/worker.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "02267d4-master",
3 "meta": {
4 "name": "worker",
5 "url": "https://github.com/statusengine/worker",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "statusengine",
10 "repo": "worker",
11 "rev": "02267d495ae69137d6765dc6b0f453f80216f1cf",
12 "sha256": "06ci4mkmifdf1z15yc8rxl44ppi45vjz4s136yaccq9d8vk9iyd4",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/status_engine/worker.nix b/pkgs/status_engine/worker.nix
deleted file mode 100644
index 1232303..0000000
--- a/pkgs/status_engine/worker.nix
+++ /dev/null
@@ -1,24 +0,0 @@
1{ stdenv, mylibs, composerEnv, fetchurl, gearmand, callPackage, php73, config_file ? "/var/lib/status_engine/ui.yml" }:
2let
3 gearman = php73.buildPecl rec {
4 version = "2.0.6";
5 pname = "gearman";
6 src = fetchurl {
7 url = "https://github.com/wcgallego/pecl-gearman/archive/${pname}-${version}.tar.gz";
8 sha256 = "0bliga4j41xkvdfh6bqi6k8x6mfxbi5sl9gix97axs7w0ncyfprz";
9 };
10 configureFlags = [ "--with-gearman=${gearmand}" ];
11 nativeBuildInputs = [ gearmand ];
12 };
13in
14(composerEnv.override {
15 php = php73.withExtensions({ enabled, all }: enabled ++ (with all; [gearman redis mbstring bcmath json iconv]));
16}).buildPackage (mylibs.fetchedGithub ./worker.json //
17 import ./worker_php_packages.nix { inherit composerEnv fetchurl; } // rec {
18 postInstall = ''
19 ln -s ${config_file} $out/etc/config.yml
20 '';
21 preInstall = ''
22 cp ${./worker_composer.lock} $out/composer.lock
23 '';
24})
diff --git a/pkgs/status_engine/worker_composer.lock b/pkgs/status_engine/worker_composer.lock
deleted file mode 100644
index 63f2646..0000000
--- a/pkgs/status_engine/worker_composer.lock
+++ /dev/null
@@ -1,1457 +0,0 @@
1{
2 "_readme": [
3 "This file locks the dependencies of your project to a known state",
4 "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5 "This file is @generated automatically"
6 ],
7 "content-hash": "0b9940904a72531dd233d2c1b0ea28a0",
8 "packages": [
9 {
10 "name": "crate/crate-dbal",
11 "version": "0.3.1",
12 "source": {
13 "type": "git",
14 "url": "https://github.com/crate/crate-dbal.git",
15 "reference": "3329f19d39f648bdd7613e5c8dc7e230f45814d9"
16 },
17 "dist": {
18 "type": "zip",
19 "url": "https://api.github.com/repos/crate/crate-dbal/zipball/3329f19d39f648bdd7613e5c8dc7e230f45814d9",
20 "reference": "3329f19d39f648bdd7613e5c8dc7e230f45814d9",
21 "shasum": ""
22 },
23 "require": {
24 "crate/crate-pdo": "~0.6.0",
25 "doctrine/dbal": "~2.5.5",
26 "php": "~5.5|~7.0"
27 },
28 "require-dev": {
29 "phpunit/phpunit": "~4.0",
30 "squizlabs/php_codesniffer": "~1.5.2"
31 },
32 "type": "library",
33 "autoload": {
34 "psr-0": {
35 "Crate\\DBAL": "src"
36 }
37 },
38 "notification-url": "https://packagist.org/downloads/",
39 "license": [
40 "Apache2"
41 ],
42 "description": "A Doctrine Database Abstraction Layer for the Crate.io DBMS",
43 "homepage": "https://github.com/crate/crate-dbal",
44 "keywords": [
45 "crate",
46 "database",
47 "dbal",
48 "doctrine"
49 ],
50 "time": "2017-04-07T13:26:54+00:00"
51 },
52 {
53 "name": "crate/crate-pdo",
54 "version": "0.6.3",
55 "source": {
56 "type": "git",
57 "url": "https://github.com/crate/crate-pdo.git",
58 "reference": "31a88d1004235327a4651a10a5b98a7803b3cde3"
59 },
60 "dist": {
61 "type": "zip",
62 "url": "https://api.github.com/repos/crate/crate-pdo/zipball/31a88d1004235327a4651a10a5b98a7803b3cde3",
63 "reference": "31a88d1004235327a4651a10a5b98a7803b3cde3",
64 "shasum": ""
65 },
66 "require": {
67 "ext-pdo": "*",
68 "guzzlehttp/guzzle": "~6.0",
69 "php": "~5.5|~7.0"
70 },
71 "require-dev": {
72 "phpunit/phpunit": "~4.0",
73 "squizlabs/php_codesniffer": "~1.5.2"
74 },
75 "type": "library",
76 "autoload": {
77 "psr-0": {
78 "Crate\\": "src"
79 }
80 },
81 "notification-url": "https://packagist.org/downloads/",
82 "license": [
83 "Apache2"
84 ],
85 "description": "A PDO adapter for interacting with the Crate.io DBMS",
86 "homepage": "https://github.com/crate/crate-pdo",
87 "keywords": [
88 "crate",
89 "database",
90 "pdo"
91 ],
92 "time": "2017-07-17T12:50:03+00:00"
93 },
94 {
95 "name": "doctrine/annotations",
96 "version": "1.10.3",
97 "source": {
98 "type": "git",
99 "url": "https://github.com/doctrine/annotations.git",
100 "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d"
101 },
102 "dist": {
103 "type": "zip",
104 "url": "https://api.github.com/repos/doctrine/annotations/zipball/5db60a4969eba0e0c197a19c077780aadbc43c5d",
105 "reference": "5db60a4969eba0e0c197a19c077780aadbc43c5d",
106 "shasum": ""
107 },
108 "require": {
109 "doctrine/lexer": "1.*",
110 "ext-tokenizer": "*",
111 "php": "^7.1 || ^8.0"
112 },
113 "require-dev": {
114 "doctrine/cache": "1.*",
115 "phpunit/phpunit": "^7.5"
116 },
117 "type": "library",
118 "extra": {
119 "branch-alias": {
120 "dev-master": "1.9.x-dev"
121 }
122 },
123 "autoload": {
124 "psr-4": {
125 "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
126 }
127 },
128 "notification-url": "https://packagist.org/downloads/",
129 "license": [
130 "MIT"
131 ],
132 "authors": [
133 {
134 "name": "Guilherme Blanco",
135 "email": "guilhermeblanco@gmail.com"
136 },
137 {
138 "name": "Roman Borschel",
139 "email": "roman@code-factory.org"
140 },
141 {
142 "name": "Benjamin Eberlei",
143 "email": "kontakt@beberlei.de"
144 },
145 {
146 "name": "Jonathan Wage",
147 "email": "jonwage@gmail.com"
148 },
149 {
150 "name": "Johannes Schmitt",
151 "email": "schmittjoh@gmail.com"
152 }
153 ],
154 "description": "Docblock Annotations Parser",
155 "homepage": "http://www.doctrine-project.org",
156 "keywords": [
157 "annotations",
158 "docblock",
159 "parser"
160 ],
161 "time": "2020-05-25T17:24:27+00:00"
162 },
163 {
164 "name": "doctrine/cache",
165 "version": "1.10.1",
166 "source": {
167 "type": "git",
168 "url": "https://github.com/doctrine/cache.git",
169 "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3"
170 },
171 "dist": {
172 "type": "zip",
173 "url": "https://api.github.com/repos/doctrine/cache/zipball/35a4a70cd94e09e2259dfae7488afc6b474ecbd3",
174 "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3",
175 "shasum": ""
176 },
177 "require": {
178 "php": "~7.1 || ^8.0"
179 },
180 "conflict": {
181 "doctrine/common": ">2.2,<2.4"
182 },
183 "require-dev": {
184 "alcaeus/mongo-php-adapter": "^1.1",
185 "doctrine/coding-standard": "^6.0",
186 "mongodb/mongodb": "^1.1",
187 "phpunit/phpunit": "^7.0",
188 "predis/predis": "~1.0"
189 },
190 "suggest": {
191 "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver"
192 },
193 "type": "library",
194 "extra": {
195 "branch-alias": {
196 "dev-master": "1.9.x-dev"
197 }
198 },
199 "autoload": {
200 "psr-4": {
201 "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
202 }
203 },
204 "notification-url": "https://packagist.org/downloads/",
205 "license": [
206 "MIT"
207 ],
208 "authors": [
209 {
210 "name": "Guilherme Blanco",
211 "email": "guilhermeblanco@gmail.com"
212 },
213 {
214 "name": "Roman Borschel",
215 "email": "roman@code-factory.org"
216 },
217 {
218 "name": "Benjamin Eberlei",
219 "email": "kontakt@beberlei.de"
220 },
221 {
222 "name": "Jonathan Wage",
223 "email": "jonwage@gmail.com"
224 },
225 {
226 "name": "Johannes Schmitt",
227 "email": "schmittjoh@gmail.com"
228 }
229 ],
230 "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.",
231 "homepage": "https://www.doctrine-project.org/projects/cache.html",
232 "keywords": [
233 "abstraction",
234 "apcu",
235 "cache",
236 "caching",
237 "couchdb",
238 "memcached",
239 "php",
240 "redis",
241 "xcache"
242 ],
243 "funding": [
244 {
245 "url": "https://www.doctrine-project.org/sponsorship.html",
246 "type": "custom"
247 },
248 {
249 "url": "https://www.patreon.com/phpdoctrine",
250 "type": "patreon"
251 },
252 {
253 "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache",
254 "type": "tidelift"
255 }
256 ],
257 "time": "2020-05-27T16:24:54+00:00"
258 },
259 {
260 "name": "doctrine/collections",
261 "version": "1.6.5",
262 "source": {
263 "type": "git",
264 "url": "https://github.com/doctrine/collections.git",
265 "reference": "fc0206348e17e530d09463fef07ba8968406cd6d"
266 },
267 "dist": {
268 "type": "zip",
269 "url": "https://api.github.com/repos/doctrine/collections/zipball/fc0206348e17e530d09463fef07ba8968406cd6d",
270 "reference": "fc0206348e17e530d09463fef07ba8968406cd6d",
271 "shasum": ""
272 },
273 "require": {
274 "php": "^7.1.3 || ^8.0"
275 },
276 "require-dev": {
277 "doctrine/coding-standard": "^6.0",
278 "phpstan/phpstan-shim": "^0.9.2",
279 "phpunit/phpunit": "^7.0",
280 "vimeo/psalm": "^3.8.1"
281 },
282 "type": "library",
283 "autoload": {
284 "psr-4": {
285 "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections"
286 }
287 },
288 "notification-url": "https://packagist.org/downloads/",
289 "license": [
290 "MIT"
291 ],
292 "authors": [
293 {
294 "name": "Guilherme Blanco",
295 "email": "guilhermeblanco@gmail.com"
296 },
297 {
298 "name": "Roman Borschel",
299 "email": "roman@code-factory.org"
300 },
301 {
302 "name": "Benjamin Eberlei",
303 "email": "kontakt@beberlei.de"
304 },
305 {
306 "name": "Jonathan Wage",
307 "email": "jonwage@gmail.com"
308 },
309 {
310 "name": "Johannes Schmitt",
311 "email": "schmittjoh@gmail.com"
312 }
313 ],
314 "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.",
315 "homepage": "https://www.doctrine-project.org/projects/collections.html",
316 "keywords": [
317 "array",
318 "collections",
319 "iterators",
320 "php"
321 ],
322 "funding": [
323 {
324 "url": "https://www.doctrine-project.org/sponsorship.html",
325 "type": "custom"
326 },
327 {
328 "url": "https://www.patreon.com/phpdoctrine",
329 "type": "patreon"
330 },
331 {
332 "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections",
333 "type": "tidelift"
334 }
335 ],
336 "time": "2020-05-25T19:24:35+00:00"
337 },
338 {
339 "name": "doctrine/common",
340 "version": "v2.7.3",
341 "source": {
342 "type": "git",
343 "url": "https://github.com/doctrine/common.git",
344 "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9"
345 },
346 "dist": {
347 "type": "zip",
348 "url": "https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9",
349 "reference": "4acb8f89626baafede6ee5475bc5844096eba8a9",
350 "shasum": ""
351 },
352 "require": {
353 "doctrine/annotations": "1.*",
354 "doctrine/cache": "1.*",
355 "doctrine/collections": "1.*",
356 "doctrine/inflector": "1.*",
357 "doctrine/lexer": "1.*",
358 "php": "~5.6|~7.0"
359 },
360 "require-dev": {
361 "phpunit/phpunit": "^5.4.6"
362 },
363 "type": "library",
364 "extra": {
365 "branch-alias": {
366 "dev-master": "2.7.x-dev"
367 }
368 },
369 "autoload": {
370 "psr-4": {
371 "Doctrine\\Common\\": "lib/Doctrine/Common"
372 }
373 },
374 "notification-url": "https://packagist.org/downloads/",
375 "license": [
376 "MIT"
377 ],
378 "authors": [
379 {
380 "name": "Roman Borschel",
381 "email": "roman@code-factory.org"
382 },
383 {
384 "name": "Benjamin Eberlei",
385 "email": "kontakt@beberlei.de"
386 },
387 {
388 "name": "Guilherme Blanco",
389 "email": "guilhermeblanco@gmail.com"
390 },
391 {
392 "name": "Jonathan Wage",
393 "email": "jonwage@gmail.com"
394 },
395 {
396 "name": "Johannes Schmitt",
397 "email": "schmittjoh@gmail.com"
398 }
399 ],
400 "description": "Common Library for Doctrine projects",
401 "homepage": "http://www.doctrine-project.org",
402 "keywords": [
403 "annotations",
404 "collections",
405 "eventmanager",
406 "persistence",
407 "spl"
408 ],
409 "time": "2017-07-22T08:35:12+00:00"
410 },
411 {
412 "name": "doctrine/dbal",
413 "version": "v2.5.13",
414 "source": {
415 "type": "git",
416 "url": "https://github.com/doctrine/dbal.git",
417 "reference": "729340d8d1eec8f01bff708e12e449a3415af873"
418 },
419 "dist": {
420 "type": "zip",
421 "url": "https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873",
422 "reference": "729340d8d1eec8f01bff708e12e449a3415af873",
423 "shasum": ""
424 },
425 "require": {
426 "doctrine/common": ">=2.4,<2.8-dev",
427 "php": ">=5.3.2"
428 },
429 "require-dev": {
430 "phpunit/phpunit": "4.*",
431 "symfony/console": "2.*||^3.0"
432 },
433 "suggest": {
434 "symfony/console": "For helpful console commands such as SQL execution and import of files."
435 },
436 "bin": [
437 "bin/doctrine-dbal"
438 ],
439 "type": "library",
440 "extra": {
441 "branch-alias": {
442 "dev-master": "2.5.x-dev"
443 }
444 },
445 "autoload": {
446 "psr-0": {
447 "Doctrine\\DBAL\\": "lib/"
448 }
449 },
450 "notification-url": "https://packagist.org/downloads/",
451 "license": [
452 "MIT"
453 ],
454 "authors": [
455 {
456 "name": "Roman Borschel",
457 "email": "roman@code-factory.org"
458 },
459 {
460 "name": "Benjamin Eberlei",
461 "email": "kontakt@beberlei.de"
462 },
463 {
464 "name": "Guilherme Blanco",
465 "email": "guilhermeblanco@gmail.com"
466 },
467 {
468 "name": "Jonathan Wage",
469 "email": "jonwage@gmail.com"
470 }
471 ],
472 "description": "Database Abstraction Layer",
473 "homepage": "http://www.doctrine-project.org",
474 "keywords": [
475 "database",
476 "dbal",
477 "persistence",
478 "queryobject"
479 ],
480 "time": "2017-07-22T20:44:48+00:00"
481 },
482 {
483 "name": "doctrine/inflector",
484 "version": "1.4.3",
485 "source": {
486 "type": "git",
487 "url": "https://github.com/doctrine/inflector.git",
488 "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c"
489 },
490 "dist": {
491 "type": "zip",
492 "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c",
493 "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c",
494 "shasum": ""
495 },
496 "require": {
497 "php": "^7.2 || ^8.0"
498 },
499 "require-dev": {
500 "doctrine/coding-standard": "^7.0",
501 "phpstan/phpstan": "^0.11",
502 "phpstan/phpstan-phpunit": "^0.11",
503 "phpstan/phpstan-strict-rules": "^0.11",
504 "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
505 },
506 "type": "library",
507 "extra": {
508 "branch-alias": {
509 "dev-master": "2.0.x-dev"
510 }
511 },
512 "autoload": {
513 "psr-4": {
514 "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector",
515 "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
516 }
517 },
518 "notification-url": "https://packagist.org/downloads/",
519 "license": [
520 "MIT"
521 ],
522 "authors": [
523 {
524 "name": "Guilherme Blanco",
525 "email": "guilhermeblanco@gmail.com"
526 },
527 {
528 "name": "Roman Borschel",
529 "email": "roman@code-factory.org"
530 },
531 {
532 "name": "Benjamin Eberlei",
533 "email": "kontakt@beberlei.de"
534 },
535 {
536 "name": "Jonathan Wage",
537 "email": "jonwage@gmail.com"
538 },
539 {
540 "name": "Johannes Schmitt",
541 "email": "schmittjoh@gmail.com"
542 }
543 ],
544 "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
545 "homepage": "https://www.doctrine-project.org/projects/inflector.html",
546 "keywords": [
547 "inflection",
548 "inflector",
549 "lowercase",
550 "manipulation",
551 "php",
552 "plural",
553 "singular",
554 "strings",
555 "uppercase",
556 "words"
557 ],
558 "funding": [
559 {
560 "url": "https://www.doctrine-project.org/sponsorship.html",
561 "type": "custom"
562 },
563 {
564 "url": "https://www.patreon.com/phpdoctrine",
565 "type": "patreon"
566 },
567 {
568 "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
569 "type": "tidelift"
570 }
571 ],
572 "time": "2020-05-29T07:19:59+00:00"
573 },
574 {
575 "name": "doctrine/lexer",
576 "version": "1.2.1",
577 "source": {
578 "type": "git",
579 "url": "https://github.com/doctrine/lexer.git",
580 "reference": "e864bbf5904cb8f5bb334f99209b48018522f042"
581 },
582 "dist": {
583 "type": "zip",
584 "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042",
585 "reference": "e864bbf5904cb8f5bb334f99209b48018522f042",
586 "shasum": ""
587 },
588 "require": {
589 "php": "^7.2 || ^8.0"
590 },
591 "require-dev": {
592 "doctrine/coding-standard": "^6.0",
593 "phpstan/phpstan": "^0.11.8",
594 "phpunit/phpunit": "^8.2"
595 },
596 "type": "library",
597 "extra": {
598 "branch-alias": {
599 "dev-master": "1.2.x-dev"
600 }
601 },
602 "autoload": {
603 "psr-4": {
604 "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
605 }
606 },
607 "notification-url": "https://packagist.org/downloads/",
608 "license": [
609 "MIT"
610 ],
611 "authors": [
612 {
613 "name": "Guilherme Blanco",
614 "email": "guilhermeblanco@gmail.com"
615 },
616 {
617 "name": "Roman Borschel",
618 "email": "roman@code-factory.org"
619 },
620 {
621 "name": "Johannes Schmitt",
622 "email": "schmittjoh@gmail.com"
623 }
624 ],
625 "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
626 "homepage": "https://www.doctrine-project.org/projects/lexer.html",
627 "keywords": [
628 "annotations",
629 "docblock",
630 "lexer",
631 "parser",
632 "php"
633 ],
634 "funding": [
635 {
636 "url": "https://www.doctrine-project.org/sponsorship.html",
637 "type": "custom"
638 },
639 {
640 "url": "https://www.patreon.com/phpdoctrine",
641 "type": "patreon"
642 },
643 {
644 "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
645 "type": "tidelift"
646 }
647 ],
648 "time": "2020-05-25T17:44:05+00:00"
649 },
650 {
651 "name": "guzzlehttp/guzzle",
652 "version": "6.5.4",
653 "source": {
654 "type": "git",
655 "url": "https://github.com/guzzle/guzzle.git",
656 "reference": "a4a1b6930528a8f7ee03518e6442ec7a44155d9d"
657 },
658 "dist": {
659 "type": "zip",
660 "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a4a1b6930528a8f7ee03518e6442ec7a44155d9d",
661 "reference": "a4a1b6930528a8f7ee03518e6442ec7a44155d9d",
662 "shasum": ""
663 },
664 "require": {
665 "ext-json": "*",
666 "guzzlehttp/promises": "^1.0",
667 "guzzlehttp/psr7": "^1.6.1",
668 "php": ">=5.5",
669 "symfony/polyfill-intl-idn": "1.17.0"
670 },
671 "require-dev": {
672 "ext-curl": "*",
673 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
674 "psr/log": "^1.1"
675 },
676 "suggest": {
677 "psr/log": "Required for using the Log middleware"
678 },
679 "type": "library",
680 "extra": {
681 "branch-alias": {
682 "dev-master": "6.5-dev"
683 }
684 },
685 "autoload": {
686 "psr-4": {
687 "GuzzleHttp\\": "src/"
688 },
689 "files": [
690 "src/functions_include.php"
691 ]
692 },
693 "notification-url": "https://packagist.org/downloads/",
694 "license": [
695 "MIT"
696 ],
697 "authors": [
698 {
699 "name": "Michael Dowling",
700 "email": "mtdowling@gmail.com",
701 "homepage": "https://github.com/mtdowling"
702 }
703 ],
704 "description": "Guzzle is a PHP HTTP client library",
705 "homepage": "http://guzzlephp.org/",
706 "keywords": [
707 "client",
708 "curl",
709 "framework",
710 "http",
711 "http client",
712 "rest",
713 "web service"
714 ],
715 "time": "2020-05-25T19:35:05+00:00"
716 },
717 {
718 "name": "guzzlehttp/promises",
719 "version": "v1.3.1",
720 "source": {
721 "type": "git",
722 "url": "https://github.com/guzzle/promises.git",
723 "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
724 },
725 "dist": {
726 "type": "zip",
727 "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
728 "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
729 "shasum": ""
730 },
731 "require": {
732 "php": ">=5.5.0"
733 },
734 "require-dev": {
735 "phpunit/phpunit": "^4.0"
736 },
737 "type": "library",
738 "extra": {
739 "branch-alias": {
740 "dev-master": "1.4-dev"
741 }
742 },
743 "autoload": {
744 "psr-4": {
745 "GuzzleHttp\\Promise\\": "src/"
746 },
747 "files": [
748 "src/functions_include.php"
749 ]
750 },
751 "notification-url": "https://packagist.org/downloads/",
752 "license": [
753 "MIT"
754 ],
755 "authors": [
756 {
757 "name": "Michael Dowling",
758 "email": "mtdowling@gmail.com",
759 "homepage": "https://github.com/mtdowling"
760 }
761 ],
762 "description": "Guzzle promises library",
763 "keywords": [
764 "promise"
765 ],
766 "time": "2016-12-20T10:07:11+00:00"
767 },
768 {
769 "name": "guzzlehttp/psr7",
770 "version": "1.6.1",
771 "source": {
772 "type": "git",
773 "url": "https://github.com/guzzle/psr7.git",
774 "reference": "239400de7a173fe9901b9ac7c06497751f00727a"
775 },
776 "dist": {
777 "type": "zip",
778 "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
779 "reference": "239400de7a173fe9901b9ac7c06497751f00727a",
780 "shasum": ""
781 },
782 "require": {
783 "php": ">=5.4.0",
784 "psr/http-message": "~1.0",
785 "ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
786 },
787 "provide": {
788 "psr/http-message-implementation": "1.0"
789 },
790 "require-dev": {
791 "ext-zlib": "*",
792 "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
793 },
794 "suggest": {
795 "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
796 },
797 "type": "library",
798 "extra": {
799 "branch-alias": {
800 "dev-master": "1.6-dev"
801 }
802 },
803 "autoload": {
804 "psr-4": {
805 "GuzzleHttp\\Psr7\\": "src/"
806 },
807 "files": [
808 "src/functions_include.php"
809 ]
810 },
811 "notification-url": "https://packagist.org/downloads/",
812 "license": [
813 "MIT"
814 ],
815 "authors": [
816 {
817 "name": "Michael Dowling",
818 "email": "mtdowling@gmail.com",
819 "homepage": "https://github.com/mtdowling"
820 },
821 {
822 "name": "Tobias Schultze",
823 "homepage": "https://github.com/Tobion"
824 }
825 ],
826 "description": "PSR-7 message implementation that also provides common utility methods",
827 "keywords": [
828 "http",
829 "message",
830 "psr-7",
831 "request",
832 "response",
833 "stream",
834 "uri",
835 "url"
836 ],
837 "time": "2019-07-01T23:21:34+00:00"
838 },
839 {
840 "name": "php-amqplib/php-amqplib",
841 "version": "v2.11.3",
842 "source": {
843 "type": "git",
844 "url": "https://github.com/php-amqplib/php-amqplib.git",
845 "reference": "6353c5d2d3021a301914bc6566e695c99cfeb742"
846 },
847 "dist": {
848 "type": "zip",
849 "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/6353c5d2d3021a301914bc6566e695c99cfeb742",
850 "reference": "6353c5d2d3021a301914bc6566e695c99cfeb742",
851 "shasum": ""
852 },
853 "require": {
854 "ext-mbstring": "*",
855 "ext-sockets": "*",
856 "php": ">=5.6.3",
857 "phpseclib/phpseclib": "^2.0.0"
858 },
859 "conflict": {
860 "php": "7.4.0 - 7.4.1"
861 },
862 "replace": {
863 "videlalvaro/php-amqplib": "self.version"
864 },
865 "require-dev": {
866 "ext-curl": "*",
867 "nategood/httpful": "^0.2.20",
868 "phpunit/phpunit": "^5.7|^6.5|^7.0",
869 "squizlabs/php_codesniffer": "^2.5"
870 },
871 "type": "library",
872 "extra": {
873 "branch-alias": {
874 "dev-master": "2.11-dev"
875 }
876 },
877 "autoload": {
878 "psr-4": {
879 "PhpAmqpLib\\": "PhpAmqpLib/"
880 }
881 },
882 "notification-url": "https://packagist.org/downloads/",
883 "license": [
884 "LGPL-2.1-or-later"
885 ],
886 "authors": [
887 {
888 "name": "Alvaro Videla",
889 "role": "Original Maintainer"
890 },
891 {
892 "name": "Raúl Araya",
893 "email": "nubeiro@gmail.com",
894 "role": "Maintainer"
895 },
896 {
897 "name": "Luke Bakken",
898 "email": "luke@bakken.io",
899 "role": "Maintainer"
900 },
901 {
902 "name": "Ramūnas Dronga",
903 "email": "github@ramuno.lt",
904 "role": "Maintainer"
905 }
906 ],
907 "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.",
908 "homepage": "https://github.com/php-amqplib/php-amqplib/",
909 "keywords": [
910 "message",
911 "queue",
912 "rabbitmq"
913 ],
914 "time": "2020-05-13T13:56:11+00:00"
915 },
916 {
917 "name": "phpseclib/phpseclib",
918 "version": "2.0.27",
919 "source": {
920 "type": "git",
921 "url": "https://github.com/phpseclib/phpseclib.git",
922 "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc"
923 },
924 "dist": {
925 "type": "zip",
926 "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc",
927 "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc",
928 "shasum": ""
929 },
930 "require": {
931 "php": ">=5.3.3"
932 },
933 "require-dev": {
934 "phing/phing": "~2.7",
935 "phpunit/phpunit": "^4.8.35|^5.7|^6.0",
936 "sami/sami": "~2.0",
937 "squizlabs/php_codesniffer": "~2.0"
938 },
939 "suggest": {
940 "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
941 "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
942 "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
943 "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
944 },
945 "type": "library",
946 "autoload": {
947 "files": [
948 "phpseclib/bootstrap.php"
949 ],
950 "psr-4": {
951 "phpseclib\\": "phpseclib/"
952 }
953 },
954 "notification-url": "https://packagist.org/downloads/",
955 "license": [
956 "MIT"
957 ],
958 "authors": [
959 {
960 "name": "Jim Wigginton",
961 "email": "terrafrost@php.net",
962 "role": "Lead Developer"
963 },
964 {
965 "name": "Patrick Monnerat",
966 "email": "pm@datasphere.ch",
967 "role": "Developer"
968 },
969 {
970 "name": "Andreas Fischer",
971 "email": "bantu@phpbb.com",
972 "role": "Developer"
973 },
974 {
975 "name": "Hans-Jürgen Petrich",
976 "email": "petrich@tronic-media.com",
977 "role": "Developer"
978 },
979 {
980 "name": "Graham Campbell",
981 "email": "graham@alt-three.com",
982 "role": "Developer"
983 }
984 ],
985 "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
986 "homepage": "http://phpseclib.sourceforge.net",
987 "keywords": [
988 "BigInteger",
989 "aes",
990 "asn.1",
991 "asn1",
992 "blowfish",
993 "crypto",
994 "cryptography",
995 "encryption",
996 "rsa",
997 "security",
998 "sftp",
999 "signature",
1000 "signing",
1001 "ssh",
1002 "twofish",
1003 "x.509",
1004 "x509"
1005 ],
1006 "funding": [
1007 {
1008 "url": "https://github.com/terrafrost",
1009 "type": "github"
1010 },
1011 {
1012 "url": "https://www.patreon.com/phpseclib",
1013 "type": "patreon"
1014 },
1015 {
1016 "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
1017 "type": "tidelift"
1018 }
1019 ],
1020 "time": "2020-04-04T23:17:33+00:00"
1021 },
1022 {
1023 "name": "psr/http-message",
1024 "version": "1.0.1",
1025 "source": {
1026 "type": "git",
1027 "url": "https://github.com/php-fig/http-message.git",
1028 "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
1029 },
1030 "dist": {
1031 "type": "zip",
1032 "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
1033 "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
1034 "shasum": ""
1035 },
1036 "require": {
1037 "php": ">=5.3.0"
1038 },
1039 "type": "library",
1040 "extra": {
1041 "branch-alias": {
1042 "dev-master": "1.0.x-dev"
1043 }
1044 },
1045 "autoload": {
1046 "psr-4": {
1047 "Psr\\Http\\Message\\": "src/"
1048 }
1049 },
1050 "notification-url": "https://packagist.org/downloads/",
1051 "license": [
1052 "MIT"
1053 ],
1054 "authors": [
1055 {
1056 "name": "PHP-FIG",
1057 "homepage": "http://www.php-fig.org/"
1058 }
1059 ],
1060 "description": "Common interface for HTTP messages",
1061 "homepage": "https://github.com/php-fig/http-message",
1062 "keywords": [
1063 "http",
1064 "http-message",
1065 "psr",
1066 "psr-7",
1067 "request",
1068 "response"
1069 ],
1070 "time": "2016-08-06T14:39:51+00:00"
1071 },
1072 {
1073 "name": "ralouphie/getallheaders",
1074 "version": "3.0.3",
1075 "source": {
1076 "type": "git",
1077 "url": "https://github.com/ralouphie/getallheaders.git",
1078 "reference": "120b605dfeb996808c31b6477290a714d356e822"
1079 },
1080 "dist": {
1081 "type": "zip",
1082 "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
1083 "reference": "120b605dfeb996808c31b6477290a714d356e822",
1084 "shasum": ""
1085 },
1086 "require": {
1087 "php": ">=5.6"
1088 },
1089 "require-dev": {
1090 "php-coveralls/php-coveralls": "^2.1",
1091 "phpunit/phpunit": "^5 || ^6.5"
1092 },
1093 "type": "library",
1094 "autoload": {
1095 "files": [
1096 "src/getallheaders.php"
1097 ]
1098 },
1099 "notification-url": "https://packagist.org/downloads/",
1100 "license": [
1101 "MIT"
1102 ],
1103 "authors": [
1104 {
1105 "name": "Ralph Khattar",
1106 "email": "ralph.khattar@gmail.com"
1107 }
1108 ],
1109 "description": "A polyfill for getallheaders.",
1110 "time": "2019-03-08T08:55:37+00:00"
1111 },
1112 {
1113 "name": "symfony/console",
1114 "version": "v2.8.0",
1115 "source": {
1116 "type": "git",
1117 "url": "https://github.com/symfony/console.git",
1118 "reference": "d232bfc100dfd32b18ccbcab4bcc8f28697b7e41"
1119 },
1120 "dist": {
1121 "type": "zip",
1122 "url": "https://api.github.com/repos/symfony/console/zipball/d232bfc100dfd32b18ccbcab4bcc8f28697b7e41",
1123 "reference": "d232bfc100dfd32b18ccbcab4bcc8f28697b7e41",
1124 "shasum": ""
1125 },
1126 "require": {
1127 "php": ">=5.3.9",
1128 "symfony/polyfill-mbstring": "~1.0"
1129 },
1130 "require-dev": {
1131 "psr/log": "~1.0",
1132 "symfony/event-dispatcher": "~2.1|~3.0.0",
1133 "symfony/process": "~2.1|~3.0.0"
1134 },
1135 "suggest": {
1136 "psr/log": "For using the console logger",
1137 "symfony/event-dispatcher": "",
1138 "symfony/process": ""
1139 },
1140 "type": "library",
1141 "extra": {
1142 "branch-alias": {
1143 "dev-master": "2.8-dev"
1144 }
1145 },
1146 "autoload": {
1147 "psr-4": {
1148 "Symfony\\Component\\Console\\": ""
1149 },
1150 "exclude-from-classmap": [
1151 "/Tests/"
1152 ]
1153 },
1154 "notification-url": "https://packagist.org/downloads/",
1155 "license": [
1156 "MIT"
1157 ],
1158 "authors": [
1159 {
1160 "name": "Fabien Potencier",
1161 "email": "fabien@symfony.com"
1162 },
1163 {
1164 "name": "Symfony Community",
1165 "homepage": "https://symfony.com/contributors"
1166 }
1167 ],
1168 "description": "Symfony Console Component",
1169 "homepage": "https://symfony.com",
1170 "time": "2015-11-30T12:35:10+00:00"
1171 },
1172 {
1173 "name": "symfony/polyfill-intl-idn",
1174 "version": "v1.17.0",
1175 "source": {
1176 "type": "git",
1177 "url": "https://github.com/symfony/polyfill-intl-idn.git",
1178 "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a"
1179 },
1180 "dist": {
1181 "type": "zip",
1182 "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a",
1183 "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a",
1184 "shasum": ""
1185 },
1186 "require": {
1187 "php": ">=5.3.3",
1188 "symfony/polyfill-mbstring": "^1.3",
1189 "symfony/polyfill-php72": "^1.10"
1190 },
1191 "suggest": {
1192 "ext-intl": "For best performance"
1193 },
1194 "type": "library",
1195 "extra": {
1196 "branch-alias": {
1197 "dev-master": "1.17-dev"
1198 }
1199 },
1200 "autoload": {
1201 "psr-4": {
1202 "Symfony\\Polyfill\\Intl\\Idn\\": ""
1203 },
1204 "files": [
1205 "bootstrap.php"
1206 ]
1207 },
1208 "notification-url": "https://packagist.org/downloads/",
1209 "license": [
1210 "MIT"
1211 ],
1212 "authors": [
1213 {
1214 "name": "Laurent Bassin",
1215 "email": "laurent@bassin.info"
1216 },
1217 {
1218 "name": "Symfony Community",
1219 "homepage": "https://symfony.com/contributors"
1220 }
1221 ],
1222 "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
1223 "homepage": "https://symfony.com",
1224 "keywords": [
1225 "compatibility",
1226 "idn",
1227 "intl",
1228 "polyfill",
1229 "portable",
1230 "shim"
1231 ],
1232 "funding": [
1233 {
1234 "url": "https://symfony.com/sponsor",
1235 "type": "custom"
1236 },
1237 {
1238 "url": "https://github.com/fabpot",
1239 "type": "github"
1240 },
1241 {
1242 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1243 "type": "tidelift"
1244 }
1245 ],
1246 "time": "2020-05-12T16:47:27+00:00"
1247 },
1248 {
1249 "name": "symfony/polyfill-mbstring",
1250 "version": "v1.17.0",
1251 "source": {
1252 "type": "git",
1253 "url": "https://github.com/symfony/polyfill-mbstring.git",
1254 "reference": "fa79b11539418b02fc5e1897267673ba2c19419c"
1255 },
1256 "dist": {
1257 "type": "zip",
1258 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c",
1259 "reference": "fa79b11539418b02fc5e1897267673ba2c19419c",
1260 "shasum": ""
1261 },
1262 "require": {
1263 "php": ">=5.3.3"
1264 },
1265 "suggest": {
1266 "ext-mbstring": "For best performance"
1267 },
1268 "type": "library",
1269 "extra": {
1270 "branch-alias": {
1271 "dev-master": "1.17-dev"
1272 }
1273 },
1274 "autoload": {
1275 "psr-4": {
1276 "Symfony\\Polyfill\\Mbstring\\": ""
1277 },
1278 "files": [
1279 "bootstrap.php"
1280 ]
1281 },
1282 "notification-url": "https://packagist.org/downloads/",
1283 "license": [
1284 "MIT"
1285 ],
1286 "authors": [
1287 {
1288 "name": "Nicolas Grekas",
1289 "email": "p@tchwork.com"
1290 },
1291 {
1292 "name": "Symfony Community",
1293 "homepage": "https://symfony.com/contributors"
1294 }
1295 ],
1296 "description": "Symfony polyfill for the Mbstring extension",
1297 "homepage": "https://symfony.com",
1298 "keywords": [
1299 "compatibility",
1300 "mbstring",
1301 "polyfill",
1302 "portable",
1303 "shim"
1304 ],
1305 "funding": [
1306 {
1307 "url": "https://symfony.com/sponsor",
1308 "type": "custom"
1309 },
1310 {
1311 "url": "https://github.com/fabpot",
1312 "type": "github"
1313 },
1314 {
1315 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1316 "type": "tidelift"
1317 }
1318 ],
1319 "time": "2020-05-12T16:47:27+00:00"
1320 },
1321 {
1322 "name": "symfony/polyfill-php72",
1323 "version": "v1.17.0",
1324 "source": {
1325 "type": "git",
1326 "url": "https://github.com/symfony/polyfill-php72.git",
1327 "reference": "f048e612a3905f34931127360bdd2def19a5e582"
1328 },
1329 "dist": {
1330 "type": "zip",
1331 "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582",
1332 "reference": "f048e612a3905f34931127360bdd2def19a5e582",
1333 "shasum": ""
1334 },
1335 "require": {
1336 "php": ">=5.3.3"
1337 },
1338 "type": "library",
1339 "extra": {
1340 "branch-alias": {
1341 "dev-master": "1.17-dev"
1342 }
1343 },
1344 "autoload": {
1345 "psr-4": {
1346 "Symfony\\Polyfill\\Php72\\": ""
1347 },
1348 "files": [
1349 "bootstrap.php"
1350 ]
1351 },
1352 "notification-url": "https://packagist.org/downloads/",
1353 "license": [
1354 "MIT"
1355 ],
1356 "authors": [
1357 {
1358 "name": "Nicolas Grekas",
1359 "email": "p@tchwork.com"
1360 },
1361 {
1362 "name": "Symfony Community",
1363 "homepage": "https://symfony.com/contributors"
1364 }
1365 ],
1366 "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
1367 "homepage": "https://symfony.com",
1368 "keywords": [
1369 "compatibility",
1370 "polyfill",
1371 "portable",
1372 "shim"
1373 ],
1374 "funding": [
1375 {
1376 "url": "https://symfony.com/sponsor",
1377 "type": "custom"
1378 },
1379 {
1380 "url": "https://github.com/fabpot",
1381 "type": "github"
1382 },
1383 {
1384 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1385 "type": "tidelift"
1386 }
1387 ],
1388 "time": "2020-05-12T16:47:27+00:00"
1389 },
1390 {
1391 "name": "symfony/yaml",
1392 "version": "v2.8.0",
1393 "source": {
1394 "type": "git",
1395 "url": "https://github.com/symfony/yaml.git",
1396 "reference": "f79824187de95064a2f5038904c4d7f0227fedb5"
1397 },
1398 "dist": {
1399 "type": "zip",
1400 "url": "https://api.github.com/repos/symfony/yaml/zipball/f79824187de95064a2f5038904c4d7f0227fedb5",
1401 "reference": "f79824187de95064a2f5038904c4d7f0227fedb5",
1402 "shasum": ""
1403 },
1404 "require": {
1405 "php": ">=5.3.9"
1406 },
1407 "type": "library",
1408 "extra": {
1409 "branch-alias": {
1410 "dev-master": "2.8-dev"
1411 }
1412 },
1413 "autoload": {
1414 "psr-4": {
1415 "Symfony\\Component\\Yaml\\": ""
1416 },
1417 "exclude-from-classmap": [
1418 "/Tests/"
1419 ]
1420 },
1421 "notification-url": "https://packagist.org/downloads/",
1422 "license": [
1423 "MIT"
1424 ],
1425 "authors": [
1426 {
1427 "name": "Fabien Potencier",
1428 "email": "fabien@symfony.com"
1429 },
1430 {
1431 "name": "Symfony Community",
1432 "homepage": "https://symfony.com/contributors"
1433 }
1434 ],
1435 "description": "Symfony Yaml Component",
1436 "homepage": "https://symfony.com",
1437 "time": "2015-11-30T12:35:10+00:00"
1438 }
1439 ],
1440 "packages-dev": [],
1441 "aliases": [],
1442 "minimum-stability": "stable",
1443 "stability-flags": [],
1444 "prefer-stable": false,
1445 "prefer-lowest": false,
1446 "platform": {
1447 "php": ">=5.5.9",
1448 "ext-redis": "*",
1449 "ext-gearman": "*",
1450 "ext-mbstring": "*",
1451 "ext-bcmath": "*",
1452 "ext-json": "*",
1453 "ext-iconv": "*"
1454 },
1455 "platform-dev": [],
1456 "plugin-api-version": "1.1.0"
1457}
diff --git a/pkgs/status_engine/worker_php_packages.nix b/pkgs/status_engine/worker_php_packages.nix
deleted file mode 100644
index 1d956ad..0000000
--- a/pkgs/status_engine/worker_php_packages.nix
+++ /dev/null
@@ -1,217 +0,0 @@
1# Generated with composer2nix and adapted to return only the list of
2# packages
3{ composerEnv, fetchurl }:
4{
5 packages = {
6 "crate/crate-dbal" = {
7 targetDir = "";
8 src = composerEnv.buildZipPackage {
9 name = "crate-crate-dbal-3329f19d39f648bdd7613e5c8dc7e230f45814d9";
10 src = fetchurl {
11 url = https://api.github.com/repos/crate/crate-dbal/zipball/3329f19d39f648bdd7613e5c8dc7e230f45814d9;
12 sha256 = "013z63zcvrnmxphdm6qqy0if1397lmbb0g3yrpjbka98pg8zm99g";
13 };
14 };
15 };
16 "crate/crate-pdo" = {
17 targetDir = "";
18 src = composerEnv.buildZipPackage {
19 name = "crate-crate-pdo-31a88d1004235327a4651a10a5b98a7803b3cde3";
20 src = fetchurl {
21 url = https://api.github.com/repos/crate/crate-pdo/zipball/31a88d1004235327a4651a10a5b98a7803b3cde3;
22 sha256 = "194f6daj9ghlwyplp86nazh1av6jadqznwqijqgr1g3dfmgb3y16";
23 };
24 };
25 };
26 "doctrine/annotations" = {
27 targetDir = "";
28 src = composerEnv.buildZipPackage {
29 name = "doctrine-annotations-5db60a4969eba0e0c197a19c077780aadbc43c5d";
30 src = fetchurl {
31 url = https://api.github.com/repos/doctrine/annotations/zipball/5db60a4969eba0e0c197a19c077780aadbc43c5d;
32 sha256 = "1a8psmvs90x4nflfvjvp6j9yjmq6z9jgsb3plrp5c7iy7snkq1v2";
33 };
34 };
35 };
36 "doctrine/cache" = {
37 targetDir = "";
38 src = composerEnv.buildZipPackage {
39 name = "doctrine-cache-35a4a70cd94e09e2259dfae7488afc6b474ecbd3";
40 src = fetchurl {
41 url = https://api.github.com/repos/doctrine/cache/zipball/35a4a70cd94e09e2259dfae7488afc6b474ecbd3;
42 sha256 = "1fk0c8vhjgl7j4b2vd4k7sshdrqysqwcp9mlxbapf8x7nmpa6i9b";
43 };
44 };
45 };
46 "doctrine/collections" = {
47 targetDir = "";
48 src = composerEnv.buildZipPackage {
49 name = "doctrine-collections-fc0206348e17e530d09463fef07ba8968406cd6d";
50 src = fetchurl {
51 url = https://api.github.com/repos/doctrine/collections/zipball/fc0206348e17e530d09463fef07ba8968406cd6d;
52 sha256 = "1aqnjna5cc5hyy6wypmayvl5lgz2qbym6innmr3qaq9nff6r9qlf";
53 };
54 };
55 };
56 "doctrine/common" = {
57 targetDir = "";
58 src = composerEnv.buildZipPackage {
59 name = "doctrine-common-4acb8f89626baafede6ee5475bc5844096eba8a9";
60 src = fetchurl {
61 url = https://api.github.com/repos/doctrine/common/zipball/4acb8f89626baafede6ee5475bc5844096eba8a9;
62 sha256 = "0qjqframvg81z3lwqaj5haanqj9v3dfbj170pxmwlgmrfsbr16zh";
63 };
64 };
65 };
66 "doctrine/dbal" = {
67 targetDir = "";
68 src = composerEnv.buildZipPackage {
69 name = "doctrine-dbal-729340d8d1eec8f01bff708e12e449a3415af873";
70 src = fetchurl {
71 url = https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873;
72 sha256 = "184p8h0n6mcm0y6vfyh0z6qcxmmf8h5z4vdvxd4ycmx0531lnhj3";
73 };
74 };
75 };
76 "doctrine/inflector" = {
77 targetDir = "";
78 src = composerEnv.buildZipPackage {
79 name = "doctrine-inflector-4650c8b30c753a76bf44fb2ed00117d6f367490c";
80 src = fetchurl {
81 url = https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c;
82 sha256 = "13jnzwpzz63i6zipmhb22lv35l5gq6wmji0532c94331wcq5bvv9";
83 };
84 };
85 };
86 "doctrine/lexer" = {
87 targetDir = "";
88 src = composerEnv.buildZipPackage {
89 name = "doctrine-lexer-e864bbf5904cb8f5bb334f99209b48018522f042";
90 src = fetchurl {
91 url = https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042;
92 sha256 = "11lg9fcy0crb8inklajhx3kyffdbx7xzdj8kwl21xsgq9nm9iwvv";
93 };
94 };
95 };
96 "guzzlehttp/guzzle" = {
97 targetDir = "";
98 src = composerEnv.buildZipPackage {
99 name = "guzzlehttp-guzzle-a4a1b6930528a8f7ee03518e6442ec7a44155d9d";
100 src = fetchurl {
101 url = https://api.github.com/repos/guzzle/guzzle/zipball/a4a1b6930528a8f7ee03518e6442ec7a44155d9d;
102 sha256 = "0midln6ji6b990vkc0syn631nf6r94lv5600dcc26lcivz8c4gk3";
103 };
104 };
105 };
106 "guzzlehttp/promises" = {
107 targetDir = "";
108 src = composerEnv.buildZipPackage {
109 name = "guzzlehttp-promises-a59da6cf61d80060647ff4d3eb2c03a2bc694646";
110 src = fetchurl {
111 url = https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646;
112 sha256 = "1kpl91fzalcgkcs16lpakvzcnbkry3id4ynx6xhq477p4fipdciz";
113 };
114 };
115 };
116 "guzzlehttp/psr7" = {
117 targetDir = "";
118 src = composerEnv.buildZipPackage {
119 name = "guzzlehttp-psr7-239400de7a173fe9901b9ac7c06497751f00727a";
120 src = fetchurl {
121 url = https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a;
122 sha256 = "0mfq93x7ayix6l3v5jkk40a9hnmrxaqr9vk1r26q39d1s6292ma7";
123 };
124 };
125 };
126 "php-amqplib/php-amqplib" = {
127 targetDir = "";
128 src = composerEnv.buildZipPackage {
129 name = "php-amqplib-php-amqplib-6353c5d2d3021a301914bc6566e695c99cfeb742";
130 src = fetchurl {
131 url = https://api.github.com/repos/php-amqplib/php-amqplib/zipball/6353c5d2d3021a301914bc6566e695c99cfeb742;
132 sha256 = "1nadc5afkn1fiws2w1wh0n032pr5b4dzfg1dcqyf2jnh0nsgq0xp";
133 };
134 };
135 };
136 "phpseclib/phpseclib" = {
137 targetDir = "";
138 src = composerEnv.buildZipPackage {
139 name = "phpseclib-phpseclib-34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc";
140 src = fetchurl {
141 url = https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc;
142 sha256 = "1jlc8plx0v0rq3zqhc19a01r7xx7a2p6gl7mkzf2hn0kss50plz5";
143 };
144 };
145 };
146 "psr/http-message" = {
147 targetDir = "";
148 src = composerEnv.buildZipPackage {
149 name = "psr-http-message-f6561bf28d520154e4b0ec72be95418abe6d9363";
150 src = fetchurl {
151 url = https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363;
152 sha256 = "195dd67hva9bmr52iadr4kyp2gw2f5l51lplfiay2pv6l9y4cf45";
153 };
154 };
155 };
156 "ralouphie/getallheaders" = {
157 targetDir = "";
158 src = composerEnv.buildZipPackage {
159 name = "ralouphie-getallheaders-120b605dfeb996808c31b6477290a714d356e822";
160 src = fetchurl {
161 url = https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822;
162 sha256 = "1bv7ndkkankrqlr2b4kw7qp3fl0dxi6bp26bnim6dnlhavd6a0gg";
163 };
164 };
165 };
166 "symfony/console" = {
167 targetDir = "";
168 src = composerEnv.buildZipPackage {
169 name = "symfony-console-d232bfc100dfd32b18ccbcab4bcc8f28697b7e41";
170 src = fetchurl {
171 url = https://api.github.com/repos/symfony/console/zipball/d232bfc100dfd32b18ccbcab4bcc8f28697b7e41;
172 sha256 = "16kgs7x60y3vj0bbmljj80hq1x8fb6w1g0fd1j2hc1cbphgj8x67";
173 };
174 };
175 };
176 "symfony/polyfill-intl-idn" = {
177 targetDir = "";
178 src = composerEnv.buildZipPackage {
179 name = "symfony-polyfill-intl-idn-3bff59ea7047e925be6b7f2059d60af31bb46d6a";
180 src = fetchurl {
181 url = https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a;
182 sha256 = "0c26v3xpchyiqckp663n7i3hgswbzy56r0jdwjizrsgqq731h6fp";
183 };
184 };
185 };
186 "symfony/polyfill-mbstring" = {
187 targetDir = "";
188 src = composerEnv.buildZipPackage {
189 name = "symfony-polyfill-mbstring-fa79b11539418b02fc5e1897267673ba2c19419c";
190 src = fetchurl {
191 url = https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c;
192 sha256 = "17m46mkkcv7fsxf71si0cq8xdf6b1k272mc5bfwgl00h8s9bk0rs";
193 };
194 };
195 };
196 "symfony/polyfill-php72" = {
197 targetDir = "";
198 src = composerEnv.buildZipPackage {
199 name = "symfony-polyfill-php72-f048e612a3905f34931127360bdd2def19a5e582";
200 src = fetchurl {
201 url = https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582;
202 sha256 = "1lkjxh17nfaglh7v2m3zw2fy6b2w8nmxr7jb1gqqpvg74yqqz83f";
203 };
204 };
205 };
206 "symfony/yaml" = {
207 targetDir = "";
208 src = composerEnv.buildZipPackage {
209 name = "symfony-yaml-f79824187de95064a2f5038904c4d7f0227fedb5";
210 src = fetchurl {
211 url = https://api.github.com/repos/symfony/yaml/zipball/f79824187de95064a2f5038904c4d7f0227fedb5;
212 sha256 = "1pwx4bckfjz0afz62q02vl0i4wmg3c6f963jrhlx247b1z6isram";
213 };
214 };
215 };
216 };
217}
diff --git a/pkgs/telegram-history-dump/default.nix b/pkgs/telegram-history-dump/default.nix
deleted file mode 100644
index 050b351..0000000
--- a/pkgs/telegram-history-dump/default.nix
+++ /dev/null
@@ -1,9 +0,0 @@
1{ stdenv, ruby, mylibs }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./telegram-history-dump.json // {
3 installPhase = ''
4 mkdir -p $out/lib $out/bin
5 cp -a $src $out/lib/telegram-history-dump
6 ln -s $out/lib/telegram-history-dump/telegram-history-dump.rb $out/bin/telegram-history-dump
7 '';
8 buildInputs = [ ruby ];
9})
diff --git a/pkgs/telegram-history-dump/telegram-history-dump.json b/pkgs/telegram-history-dump/telegram-history-dump.json
deleted file mode 100644
index 487df73..0000000
--- a/pkgs/telegram-history-dump/telegram-history-dump.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "468ea91-master",
3 "meta": {
4 "name": "telegram-history-dump",
5 "url": "https://github.com/tvdstaaij/telegram-history-dump",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "tvdstaaij",
10 "repo": "telegram-history-dump",
11 "rev": "468ea91e543529b54bc2c5ea28b1ea17f362fd3e",
12 "sha256": "1wmwiqacfa56bmwx50njnb15cg0fy6rbdrmrjd4xfbh8bs6yp0gh",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/telegramircd/default.nix b/pkgs/telegramircd/default.nix
deleted file mode 100644
index 2f1d7ca..0000000
--- a/pkgs/telegramircd/default.nix
+++ /dev/null
@@ -1,16 +0,0 @@
1{ openssl, telethon, python3Packages, mylibs }:
2with python3Packages;
3buildPythonApplication rec {
4 format = "other";
5 pname = "telegramircd";
6 version = "master";
7 propagatedBuildInputs = [ telethon aiohttp ConfigArgParse openssl ];
8 src = (mylibs.fetchedGithub ./telegramircd.json).src;
9 LD_LIBRARY_PATH = "${openssl.out}/lib";
10 installPhase = ''
11 install -D $src/telegramircd.py $out/bin/telegramircd
12 wrapProgram "$out/bin/telegramircd" \
13 --prefix LD_LIBRARY_PATH : "${openssl.out}/lib"
14 install -Dm644 "$src/config" -t "$out/etc/telegramircd/"
15 '';
16}
diff --git a/pkgs/telegramircd/telegramircd.json b/pkgs/telegramircd/telegramircd.json
deleted file mode 100644
index 3d219f8..0000000
--- a/pkgs/telegramircd/telegramircd.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "40a0c7c-master",
3 "meta": {
4 "name": "telegramircd",
5 "url": "https://github.com/MaskRay/telegramircd",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "MaskRay",
10 "repo": "telegramircd",
11 "rev": "40a0c7cf60492bde3f44d43f06f62e3792480139",
12 "sha256": "123fjhgxq2fzn0ar8274jv7jjbxnlpidrj5333kbch7rpcipks0y",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/terminal-velocity/default.nix b/pkgs/terminal-velocity/default.nix
deleted file mode 100644
index 1a015c0..0000000
--- a/pkgs/terminal-velocity/default.nix
+++ /dev/null
@@ -1,37 +0,0 @@
1{ python36Packages }:
2with python36Packages;
3buildPythonApplication rec {
4 pname = "terminal-velocity-git";
5 version = "0.2.0";
6 src = fetchPypi {
7 inherit pname version;
8 sha256 = "13yrkcmvh5h5fwnai61sbmqkrjyisz08n62pq0ada2lyyqf7g6b9";
9 };
10
11 patches = [
12 ./sort_found_notes.patch
13 ./python3_support.patch
14 # FIXME: update this patch when version changes
15 ./fix_build.patch
16 ];
17
18 preCheck = ''
19 # Needed for urwid test
20 export LC_ALL=en_US.UTF-8
21 '';
22 propagatedBuildInputs = [
23 chardet
24 urwid
25 (sh.overridePythonAttrs { doCheck = false; })
26 pyyaml
27 ];
28 buildInputs = [
29 m2r
30 (restructuredtext_lint.overridePythonAttrs { doCheck = false; })
31 pygments
32 ];
33
34 postInstall = ''
35 rm $out/bin/terminal_velocity
36 '';
37}
diff --git a/pkgs/tiv/default.nix b/pkgs/tiv/default.nix
deleted file mode 100644
index 3e7a56c..0000000
--- a/pkgs/tiv/default.nix
+++ /dev/null
@@ -1,19 +0,0 @@
1{ buildPerlPackage, fetchurl, perlPackages }:
2buildPerlPackage rec {
3 pname = "tiv";
4 version = "2015";
5 src = fetchurl {
6 url = "http://xyne.archlinux.ca/projects/tiv/src/tiv-${version}.tar.xz";
7 sha256 = "1vq073v7z7vmcd57lhs4rf4jasji69cpjgkz4dykp94a77p1qq90";
8 };
9
10 outputs = ["out"];
11 buildInputs = with perlPackages; [ PerlMagick ];
12 perlPreHookScript = ./tiv_builder.sh;
13 perlPreHook = ''
14 source $perlPreHookScript
15 '';
16 installPhase = ''
17 install -Dm755 tiv "$out/bin/tiv"
18 '';
19}
diff --git a/pkgs/webapps/adminer/default.nix b/pkgs/webapps/adminer/default.nix
deleted file mode 100644
index 203b565..0000000
--- a/pkgs/webapps/adminer/default.nix
+++ /dev/null
@@ -1,14 +0,0 @@
1{ stdenv, fetchurl }:
2stdenv.mkDerivation rec {
3 version = "4.7.1";
4 name = "adminer-${version}";
5 src = fetchurl {
6 url = "https://github.com/vrana/adminer/releases/download/v${version}/${name}.php";
7 sha256 = "00gnck9vd44wc6ihf7hh4ma6jvdsw69xgjlkbrdf6irnni6rnvhn";
8 };
9 phases = "installPhase";
10 installPhase = ''
11 mkdir -p $out
12 cp $src $out/index.php
13 '';
14}
diff --git a/pkgs/webapps/apache-theme/theme/style.css b/pkgs/webapps/apache-theme/theme/style.css
deleted file mode 100644
index 4d25c9f..0000000
--- a/pkgs/webapps/apache-theme/theme/style.css
+++ /dev/null
@@ -1,160 +0,0 @@
1/*------------------------------------*\
2 Apaxy
3 by @adamwhitcroft
4
5 Theme name: Apaxy
6 Theme author: @adamwhitcroft
7\*------------------------------------*/
8@import url('//fonts.googleapis.com/css?family=Open+Sans');
9/* Have to use @import for the font, as you can only specify a single stylesheet */
10* {
11 margin:0;
12 padding:0;
13 -webkit-box-sizing:border-box;
14 -moz-box-sizing:border-box;
15 box-sizing: border-box;
16}
17
18html {
19 min-height:100%;
20 border-top:10px solid #ECEEF1;
21 border-bottom:10px solid #ECEEF1;
22 color:#61666c;
23 font-weight:400;
24 font-size:1em;
25 font-family:'Open Sans', sans-serif;
26 line-height:2em;
27}
28body {
29 padding:20px;
30 -webkit-backface-visibility:hidden;
31}
32code {
33 font-family:consolas,monospace;
34}
35a {
36 color:#61666c;
37 text-decoration:none;
38}
39a, img {
40 border:none;
41 outline:none
42}
43a:hover {
44 color:#2a2a2a;
45}
46/*------------------------------------*\
47 Wrapper
48\*------------------------------------*/
49.wrapper {
50 margin:0 auto;
51 padding-top:20px;
52 max-width:80%;
53}
54/*------------------------------------*\
55 Demo block
56\*------------------------------------*/
57.block {
58 font-size:.875em;
59 margin:20px 0;
60 padding:20px;
61 color:#9099A3;
62}
63/*------------------------------------*\
64 Table (directory listing)
65\*------------------------------------*/
66table {
67 width:100%;
68 border-collapse:collapse;
69 font-size:.875em;
70}
71tr {
72 outline:0;
73 border:0;
74}
75tr:hover td {
76 background:#f6f6f6;
77}
78th {
79 text-align:left;
80 font-size:.75em;
81 padding-right:20px;
82}
83/* 2nd Column: Filename */
84th + th {
85 width:65%;
86}
87/* 3rd Column: Last Modified */
88th + th + th {
89}
90/* 4th Column: Size */
91th + th + th + th {
92 width:5%;
93}
94tr td:first-of-type {
95 padding-left:10px;
96 padding-right:10px;
97}
98td {
99 padding:5px 0;
100 outline:0;
101 border:0;
102 border-bottom:1px solid #edf1f5;
103 vertical-align:middle;
104 text-align:left;
105 -webkit-transition:background 300ms ease;
106 -moz-transition:background 300ms ease;
107 -ms-transition:background 300ms ease;
108 -o-transition:background 300ms ease;
109 transition:background 300ms ease;
110}
111td a{
112 display: block;
113}
114tr.parent a[href^="/"] {
115 color:#9099A3;
116}
117 .parent a[href^="/"]:hover {
118 color:#2281d0;
119 }
120/*------------------------------------*\
121 Footer
122\*------------------------------------*/
123.footer {
124 text-align:center;
125 font-size:.75em;
126}
127
128h1#pagetitle {
129 text-align: center;
130}
131tr.parent a[href="/"]{
132 display: none;
133}
134
135tr.indexhead {
136 visibility: hidden;
137}
138
139th.indexcollastmod, td.indexcollastmod, th.indexcolsize, td.indexcolsize {
140 visibility: hidden;
141}
142
143.instructions a {
144 text-decoration: underline;
145}
146
147.instructions h2 {
148 margin-top: 10px;
149}
150.instructions em.important:before {
151 content: "⚠ Important ⚠ ";
152 color: red;
153}
154.instructions pre {
155 width: 50em;
156 padding: 10px 15px;
157 display: table;
158 border: 1px inset black;
159 line-height: 1em;
160}
diff --git a/pkgs/webapps/default.nix b/pkgs/webapps/default.nix
deleted file mode 100644
index cbee0b3..0000000
--- a/pkgs/webapps/default.nix
+++ /dev/null
@@ -1,27 +0,0 @@
1{ callPackage, mylibs, composerEnv }:
2rec {
3 adminer = callPackage ./adminer {};
4 apache-theme = callPackage ./apache-theme {};
5 awl = callPackage ./awl {};
6 davical = callPackage ./davical {};
7 diaspora = callPackage ./diaspora { inherit mylibs; };
8 dokuwiki = callPackage ./dokuwiki { inherit mylibs; };
9 etherpad-lite = callPackage ./etherpad-lite {};
10 grocy = callPackage ./grocy { inherit mylibs composerEnv; };
11 infcloud = callPackage ./infcloud {};
12 mantisbt_2 = callPackage ./mantisbt_2 {};
13 mastodon = callPackage ./mastodon { inherit mylibs; };
14 mediagoblin = callPackage ./mediagoblin { inherit mylibs; };
15 nextcloud = callPackage ./nextcloud {};
16 peertube = (mylibs.flakeCompat ../../flakes/peertube).default;
17 phpbb = callPackage ./phpbb {};
18 phpldapadmin = callPackage ./phpldapadmin {};
19 rompr = callPackage ./rompr { inherit mylibs; };
20 roundcubemail = callPackage ./roundcubemail {};
21 spip = callPackage ./spip {};
22 surfer = callPackage ./surfer { inherit mylibs; };
23 taskwarrior-web = callPackage ./taskwarrior-web { inherit mylibs; };
24 ttrss = callPackage ./ttrss {};
25 wallabag = callPackage ./wallabag { inherit composerEnv; };
26 yourls = callPackage ./yourls { inherit mylibs; };
27}
diff --git a/pkgs/webapps/diaspora/default.nix b/pkgs/webapps/diaspora/default.nix
deleted file mode 100644
index b435347..0000000
--- a/pkgs/webapps/diaspora/default.nix
+++ /dev/null
@@ -1,69 +0,0 @@
1{ ldap ? false, varDir ? "/var/lib/diaspora", podmin_email ? null, config_dir ? "/etc/diaspora",
2 mylibs, stdenv, bundlerEnv, writeText,
3 cacert, defaultGemConfig, perl, ruby_2_4, nodejs, which, git }:
4let
5 diaspora_src = stdenv.mkDerivation (mylibs.fetchedGithub ./diaspora.json // rec {
6 buildPhase = ''
7 ${if ldap then "patch -p1 < ${./ldap.patch}" else ""}
8 # FIXME: bundlerEnv below doesn't take postgresql group for some
9 # reason
10 echo 'gem "pg", "1.1.3"' >> Gemfile
11 '';
12 installPhase = ''
13 cp -a . $out
14 '';
15 });
16 gems = bundlerEnv {
17 name = "diaspora-env";
18 gemfile = "${diaspora_src}/Gemfile";
19 lockfile = "${diaspora_src}/Gemfile.lock";
20 gemset = if ldap then ./gemset_ldap.nix else ./gemset.nix;
21 groups = [ "postgresql" "default" "production" ];
22 gemConfig = defaultGemConfig // {
23 kostya-sigar = attrs: {
24 buildInputs = [ perl ];
25 };
26 };
27 };
28 build_config = writeText "diaspora.yml" ''
29 configuration:
30 environment:
31 certificate_authorities: '${cacert}/etc/ssl/certs/ca-bundle.crt'
32 ${if podmin_email != null then ''
33 # dummy comment for indentation
34 admins:
35 podmin_email: '${podmin_email}'
36 '' else ""}
37 production:
38 environment:
39 '';
40 dummy_token = writeText "secret_token.rb" ''
41 Diaspora::Application.config.secret_key_base = 'dummy'
42 '';
43in
44stdenv.mkDerivation {
45 name = "diaspora";
46 inherit diaspora_src;
47 builder = writeText "build_diaspora" ''
48 source $stdenv/setup
49 cp -a $diaspora_src $out
50 cd $out
51 chmod -R u+rwX .
52 tar -czf public/source.tar.gz ./{app,db,lib,script,Gemfile,Gemfile.lock,Rakefile,config.ru}
53 ln -s database.yml.example config/database.yml
54 ln -s ${build_config} config/diaspora.yml
55 ln -s ${dummy_token} config/initializers/secret_token.rb
56 ln -sf ${varDir}/schedule.yml config/schedule.yml
57 ln -sf ${varDir}/oidc_key.pem config/oidc_key.pem
58 ln -sf ${varDir}/uploads public/uploads
59 RAILS_ENV=production ${gems}/bin/rake assets:precompile
60 ln -sf ${config_dir}/database.yml config/database.yml
61 ln -sf ${config_dir}/diaspora.yml config/diaspora.yml
62 ln -sf ${config_dir}/secret_token.rb config/initializers/secret_token.rb
63 rm -rf tmp log
64 ln -sf ${varDir}/tmp tmp
65 ln -sf ${varDir}/log log
66 '';
67 propagatedBuildInputs = [ gems nodejs which git ];
68 passthru = { inherit gems varDir; };
69}
diff --git a/pkgs/webapps/diaspora/diaspora.json b/pkgs/webapps/diaspora/diaspora.json
deleted file mode 100644
index e6795aa..0000000
--- a/pkgs/webapps/diaspora/diaspora.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "v0.7.10.0",
3 "meta": {
4 "name": "diaspora",
5 "url": "https://github.com/diaspora/diaspora",
6 "branch": "refs/tags/v0.7.10.0"
7 },
8 "github": {
9 "owner": "diaspora",
10 "repo": "diaspora",
11 "rev": "f0085cf5bb1c45bdfba866f628153d299e56eca8",
12 "sha256": "02mnb40rdkk6jlnvpy61fad59gbpgnlwz1k35w4wfqdwzq0znaqp",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/dokuwiki/default.nix b/pkgs/webapps/dokuwiki/default.nix
deleted file mode 100644
index 874f0d8..0000000
--- a/pkgs/webapps/dokuwiki/default.nix
+++ /dev/null
@@ -1,45 +0,0 @@
1{ varDir ? "/var/lib/dokuwiki", preload ? "", lib, callPackage, stdenv, mylibs, writeText }:
2let
3 preloadFile = plugins: let preloads = [preload]
4 ++ builtins.concatMap (p: lib.optional (lib.hasAttr "preload" p) (p.preload p)) plugins;
5 in writeText "preload.php" (''
6 <?php
7 '' + builtins.concatStringsSep "\n" preloads
8 );
9 pluginNames = [ "farmer" "todo" ];
10 allPlugins = lib.attrsets.genAttrs pluginNames
11 (name: callPackage (./plugins + "/${name}.nix") {});
12 toPassthru = pkg: plugins: {
13 inherit plugins varDir allPlugins;
14 withPlugins = withPlugins pkg;
15 };
16 withPlugins = pkg: toPlugins:
17 let
18 plugins = toPlugins allPlugins;
19 toInstallPlugin = n:
20 "ln -sf ${n} $out/lib/plugins/${n.pluginName}";
21 newDokuwiki = pkg.overrideAttrs(old: {
22 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallPlugin plugins);
23 installPreloadPhase = ''
24 cp ${preloadFile (pkg.plugins ++ plugins)} $out/inc/preload.php
25 '';
26 passthru = toPassthru newDokuwiki (pkg.plugins ++ plugins);
27 });
28 in newDokuwiki;
29 package = stdenv.mkDerivation (mylibs.fetchedGithub ./dokuwiki.json // rec {
30 phases = "unpackPhase buildPhase installPhase installPreloadPhase fixupPhase";
31 buildPhase = ''
32 mv conf conf.dist
33 mv data data.dist
34 '';
35 installPhase = ''
36 cp -a . $out
37 ln -sf ${varDir}/{conf,data} $out/
38 ln -sf ${varDir}/conf/.htaccess $out/
39 '';
40 installPreloadPhase = ''
41 cp ${preloadFile []} $out/inc/preload.php
42 '';
43 passthru = toPassthru package [];
44 });
45in package
diff --git a/pkgs/webapps/dokuwiki/dokuwiki.json b/pkgs/webapps/dokuwiki/dokuwiki.json
deleted file mode 100644
index fc03252..0000000
--- a/pkgs/webapps/dokuwiki/dokuwiki.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "release_stable_2018-04-22b",
3 "meta": {
4 "name": "dokuwiki",
5 "url": "https://github.com/splitbrain/dokuwiki",
6 "branch": "refs/tags/release_stable_2018-04-22b"
7 },
8 "github": {
9 "owner": "splitbrain",
10 "repo": "dokuwiki",
11 "rev": "871dae1320b40211626c7ec665f5e6d5290aca95",
12 "sha256": "1syvd5dvv3v75swf8ig7dxqs0g5xikb0f6vlcy7g4c4ghldkw7nz",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/etherpad-lite/default.nix b/pkgs/webapps/etherpad-lite/default.nix
deleted file mode 100644
index 4327384..0000000
--- a/pkgs/webapps/etherpad-lite/default.nix
+++ /dev/null
@@ -1,63 +0,0 @@
1{ varDir ? "/var/lib/etherpad-lite" # if you override this change the StateDirectory in service file too!
2, stdenv, callPackage, mylibs, lib }:
3let
4 nodeEnv = callPackage mylibs.nodeEnv {};
5 moduleNames = [
6 "ep_aa_file_menu_toolbar" "ep_adminpads" "ep_align" "ep_bookmark"
7 "ep_clear_formatting" "ep_colors" "ep_comments_page"
8 "ep_copy_paste_select_all" "ep_cursortrace" "ep_delete_empty_pads"
9 "ep_embedmedia" "ep_font_family" "ep_font_size" "ep_headings2"
10 "ep_immae_buttons" "ep_ldapauth" "ep_line_height" "ep_markdown"
11 "ep_mypads" "ep_page_view" "ep_previewimages" "ep_ruler"
12 "ep_scrollto" "ep_set_title_on_pad" "ep_subscript_and_superscript"
13 "ep_timesliderdiff"
14 ];
15 # nix files are built using node2nix -i node-packages.json
16 allModules = lib.attrsets.genAttrs moduleNames
17 (name: (callPackage (./modules + "/${name}/node-packages.nix") { inherit nodeEnv; }).${name});
18 toPassthru = pkg: {
19 inherit varDir allModules;
20 withModules = withModules pkg;
21 };
22 withModules = pkg: toModules:
23 let
24 modules = toModules allModules;
25 toInstallModule = n: ''
26 cp -a ${n}/lib/node_modules/${n.packageName} $out/node_modules
27 if [ ! -f $out/node_modules/${n.packageName}/.ep_initialized ]; then
28 chmod u+w $out/node_modules/${n.packageName}/
29 ln -s ${varDir}/ep_initialized/${n.packageName} $out/node_modules/${n.packageName}/.ep_initialized
30 fi
31 '';
32 newEtherpad = pkg.overrideAttrs(old: {
33 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallModule modules);
34 passthru = toPassthru newEtherpad;
35 });
36 in newEtherpad;
37 # built using node2nix -l package-lock.json
38 # and changing "./." to "src"
39 node-environment = (callPackage ./node-packages.nix {
40 inherit nodeEnv;
41 src = stdenv.mkDerivation (mylibs.fetchedGithub ./etherpad-lite.json // rec {
42 patches = [ ./libreoffice_patch.diff ];
43 buildPhase = ''
44 touch src/.ep_initialized
45 '';
46 installPhase = ''
47 cp -a src/ $out
48 '';
49 });
50 }).package;
51 package = stdenv.mkDerivation rec {
52 name = (mylibs.fetchedGithub ./etherpad-lite.json).name;
53 src = node-environment;
54 installPhase = ''
55 mkdir -p $out
56 mkdir $out/node_modules
57 cp -a lib/node_modules/ep_etherpad-lite $out/src
58 chmod u+w $out/src/static/js/
59 ln -s ../src $out/node_modules/ep_etherpad-lite
60 '';
61 passthru = toPassthru package;
62 };
63in package
diff --git a/pkgs/webapps/etherpad-lite/etherpad-lite.json b/pkgs/webapps/etherpad-lite/etherpad-lite.json
deleted file mode 100644
index 0d68df1..0000000
--- a/pkgs/webapps/etherpad-lite/etherpad-lite.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "1.8.3",
3 "meta": {
4 "name": "etherpad-lite",
5 "url": "https://github.com/ether/etherpad-lite",
6 "branch": "refs/tags/1.8.3"
7 },
8 "github": {
9 "owner": "ether",
10 "repo": "etherpad-lite",
11 "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
12 "sha256": "1d726qldw3bil4x7j39aqk7m71kyjvxklai5238rrd5v82z28c1y",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/grocy/default.nix b/pkgs/webapps/grocy/default.nix
deleted file mode 100644
index f87f6ec..0000000
--- a/pkgs/webapps/grocy/default.nix
+++ /dev/null
@@ -1,45 +0,0 @@
1{ varDir ? "/var/lib/grocy", stdenv, callPackage, composerEnv, fetchurl, mylibs, runCommand, git, which, jq, yarn2nix-moretea }:
2let
3 version = "2.6.1-1";
4 packagesource = mylibs.fetchedGithub ./grocy.json;
5 patchedPackages = stdenv.mkDerivation (packagesource // rec {
6 buildInputs = [ jq ];
7 patches = [ ./yarn.patch ];
8 installPhase = ''
9 mkdir $out
10 cat package.json | jq -r '.version = "${version}"' > $out/package.json
11 cp yarn.lock $out/
12 '';
13 });
14 yarnModules = yarn2nix-moretea.mkYarnModules rec {
15 name = "grocy-yarn";
16 pname = name;
17 version = version;
18 packageJSON = "${patchedPackages}/package.json";
19 yarnLock = "${patchedPackages}/yarn.lock";
20 yarnNix = ./yarn-packages.nix;
21 pkgConfig = {
22 all = {
23 buildInputs = [ git which ];
24 };
25 };
26 };
27 app = composerEnv.buildPackage (
28 import ./php-packages.nix { inherit composerEnv fetchurl; } //
29 packagesource //
30 {
31 noDev = true;
32 buildInputs = [ yarnModules ];
33 postInstall = ''
34 rm -rf data
35 ln -sf ${varDir}/data data
36 ln -sf ${yarnModules}/node_modules public
37 '';
38 passthru = {
39 inherit varDir yarnModules;
40 webRoot = "${app}/public";
41 };
42 }
43 );
44in
45 app
diff --git a/pkgs/webapps/grocy/grocy.json b/pkgs/webapps/grocy/grocy.json
deleted file mode 100644
index cd75c18..0000000
--- a/pkgs/webapps/grocy/grocy.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "d7738aa-master",
3 "meta": {
4 "name": "grocy",
5 "url": "https://github.com/grocy/grocy/",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "grocy",
10 "repo": "grocy",
11 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
12 "sha256": "13zxzq71hvs3dzywrdwqflnkx6dpdc40l9klm4slv0fmmyclbbdf",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/mantisbt_2/default.nix b/pkgs/webapps/mantisbt_2/default.nix
deleted file mode 100644
index 5aa04d1..0000000
--- a/pkgs/webapps/mantisbt_2/default.nix
+++ /dev/null
@@ -1,43 +0,0 @@
1{ mantis_config ? "/etc/mantisbt/config_inc.php", stdenv, fetchurl, lib, callPackage}:
2let
3 pluginNames = [ "slack" "source-integration" ];
4 allPlugins = lib.attrsets.genAttrs pluginNames
5 (name: callPackage (./plugins + "/${name}") {});
6 toPassthru = pkg: plugins: {
7 inherit plugins allPlugins;
8 withPlugins = withPlugins pkg;
9 };
10 withPlugins = pkg: toPlugins:
11 let
12 plugins = toPlugins allPlugins;
13 toInstallPlugin = n:
14 if builtins.hasAttr "selector" n then
15 "ln -sf ${n}/${n.selector} $out/plugins/"
16 else
17 "ln -sf ${n} $out/plugins/${n.pluginName}";
18 newMantisbt = pkg.overrideAttrs(old: {
19 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallPlugin plugins);
20 passthru = toPassthru newMantisbt (pkg.plugins ++ plugins);
21 });
22 in newMantisbt;
23 package = stdenv.mkDerivation rec {
24 name = "mantisbt-${version}";
25 version = "2.21.0";
26 src = fetchurl {
27 url = "https://downloads.sourceforge.net/project/mantisbt/mantis-stable/${version}/${name}.tar.gz";
28 sha256 = "13lx569dp1gibq5daqp7dj6gsqic85rrix1s7xkp60gwpzk8wiw5";
29 };
30 patches = [
31 ./bug_report.php.diff
32 ./bug_report_page.php.diff
33 ./bugnote_add.php.diff
34 ./bugnote_add_inc.php.diff
35 ];
36 installPhase = ''
37 cp -a . $out
38 ln -s ${mantis_config} $out/config/config_inc.php
39 '';
40
41 passthru = toPassthru package [];
42 };
43in package
diff --git a/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix b/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix
deleted file mode 100644
index dc6c7de..0000000
--- a/pkgs/webapps/mantisbt_2/plugins/source-integration/default.nix
+++ /dev/null
@@ -1,21 +0,0 @@
1{ stdenv, fetchFromGitHub }:
2stdenv.mkDerivation rec {
3 version = "v2.2.0";
4 name = "mantisbt-plugin-source-integration-${version}";
5 src = fetchFromGitHub {
6 owner = "mantisbt-plugins";
7 repo = "source-integration";
8 rev = "44fc9e2e770aff4f40f56833f26a86ce0e2deb76";
9 sha256 = "0gcm6kqqijnv303sk59zn27adwx5vkr545mwzyaq2nrpxnkwdy5b";
10 };
11 patches = [
12 ./Source.API.php.diff
13 ];
14 installPhase = ''
15 mkdir $out
16 cp -a Source* $out/
17 '';
18 passthru = {
19 selector = "Source*";
20 };
21}
diff --git a/pkgs/webapps/mastodon/default.nix b/pkgs/webapps/mastodon/default.nix
deleted file mode 100644
index ce015c5..0000000
--- a/pkgs/webapps/mastodon/default.nix
+++ /dev/null
@@ -1,92 +0,0 @@
1{ varDir ? "/var/lib/mastodon", mylibs,
2 stdenv, writeText, runCommand,
3 ruby_2_6, bundlerEnv, defaultGemConfig,
4 jq, protobuf, protobufc, pkgconfig, libidn, pam, nodejs, yarn, yarn2nix-moretea }:
5let
6 info = mylibs.fetchedGithub ./mastodon.json // {
7 src = runCommand "mastodon-patched" {
8 source = (mylibs.fetchedGithub ./mastodon.json).src;
9 } ''
10 cp -a $source $out
11 chmod -R u+w $out
12 sed -i -e "/fuubar/s/2.4.0/2.4.1/" $out/Gemfile.lock
13 sed -i -e "s/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9#4255dc41fa7df9c3a02c1595f058e248bc37b784/" $out/yarn.lock
14 '';
15 };
16 gems = bundlerEnv {
17 name = "mastodon-env";
18 ruby = ruby_2_6;
19 gemset = ./gemset.nix;
20 gemdir = info.src;
21 groups = [ "default" "production" "test" "development" ];
22 gemConfig = defaultGemConfig // {
23 redis-rack = attrs: {
24 preBuild = ''
25 sed -i 's!s\.files.*!!' redis-rack.gemspec
26 '';
27 };
28 tzinfo = attrs: {
29 preBuild = ''
30 sed -i 's!s\.files.*!!' tzinfo.gemspec
31 '';
32 };
33 cld3 = attrs: {
34 buildInputs = [ protobuf protobufc pkgconfig ];
35 };
36 idn-ruby = attrs: {
37 buildInputs = [ libidn ];
38 };
39 rpam2 = attrs: {
40 buildInputs = [ pam ];
41 };
42 };
43 };
44 yarnModules = let
45 packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
46 cat ${info.src}/package.json | jq -r '.version = "${info.version}"' > $out
47 '';
48 in
49 yarn2nix-moretea.mkYarnModules rec {
50 name = "mastodon-yarn";
51 pname = name;
52 version = info.version;
53 packageJSON = packagejson;
54 yarnLock = "${info.src}/yarn.lock";
55 yarnNix = ./yarn-packages.nix;
56 pkgConfig = {
57 uws = {
58 postInstall = ''
59 npx node-gyp rebuild > build_log.txt 2>&1 || true
60 '';
61 };
62 };
63 };
64 mastodon_with_yarn = stdenv.mkDerivation (info // rec {
65 installPhase = ''
66 cp -a . $out
67 cp -a ${yarnModules}/node_modules $out
68 '';
69 buildInputs = [ yarnModules ];
70 });
71in
72stdenv.mkDerivation {
73 name = "mastodon";
74 inherit mastodon_with_yarn;
75 builder = writeText "build_mastodon" ''
76 source $stdenv/setup
77 set -a
78 SECRET_KEY_BASE=Dummy
79 OTP_SECRET=Dummy
80 set +a
81 cp -a $mastodon_with_yarn $out
82 cd $out
83 chmod u+rwX . public
84 chmod -R u+rwX config/ node_modules/
85 sed -i -e 's@^end$@ config.action_mailer.sendmail_settings = { location: ENV.fetch("SENDMAIL_LOCATION", "/usr/sbin/sendmail") }\nend@' config/environments/production.rb
86 RAILS_ENV=production ${gems}/bin/rails assets:precompile
87 rm -rf tmp/cache
88 ln -sf ${varDir}/tmp/cache tmp
89 '';
90 buildInputs = [ gems gems.ruby nodejs yarn ];
91 passthru = { inherit gems varDir; };
92}
diff --git a/pkgs/webapps/mastodon/mastodon.json b/pkgs/webapps/mastodon/mastodon.json
deleted file mode 100644
index a0a6cfd..0000000
--- a/pkgs/webapps/mastodon/mastodon.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "v2.9.4",
3 "meta": {
4 "name": "mastodon",
5 "url": "https://github.com/tootsuite/mastodon",
6 "branch": "refs/tags/v2.9.4"
7 },
8 "github": {
9 "owner": "tootsuite",
10 "repo": "mastodon",
11 "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
12 "sha256": "1x9pai1q73lsq1i685w7z4v3w478iyij65mar13k4hq9zdz9d2b0",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/mediagoblin/default.nix b/pkgs/webapps/mediagoblin/default.nix
deleted file mode 100644
index 22cb292..0000000
--- a/pkgs/webapps/mediagoblin/default.nix
+++ /dev/null
@@ -1,210 +0,0 @@
1{ makeWrapper, stdenv, writeScript, fetchurl, buildBowerComponents, mylibs, which, python36, gst_all_1, automake, autoconf, nodejs, nodePackages, lib, callPackage, fetchgit }:
2let
3 overridePython = let
4 packageOverrides = self: super: {
5 pybcrypt = super.buildPythonPackage rec {
6 pname = "pybcrypt";
7 version = "0.4";
8
9 src = self.fetchPypi {
10 inherit pname version;
11 sha256 = "5fa13bce551468350d66c4883694850570f3da28d6866bb638ba44fe5eabda78";
12 };
13 };
14 celery = super.celery.overridePythonAttrs(old: rec {
15 version = "3.1.26.post2";
16 src = self.fetchPypi {
17 inherit version;
18 inherit (old) pname;
19 sha256 = "5493e172ae817b81ba7d09443ada114886765a8ce02f16a56e6fac68d953a9b2";
20 };
21 patches = [];
22 doCheck = false;
23 });
24 billiard = super.billiard.overridePythonAttrs(old: rec {
25 version = "3.3.0.23";
26 src = self.fetchPypi {
27 inherit version;
28 inherit (old) pname;
29 sha256 = "02wxsc6bhqvzh8j6w758kvgqbnj14l796mvmrcms8fgfamd2lak9";
30 };
31 doCheck = false;
32 doInstallCheck = false;
33 });
34 amqp = super.amqp.overridePythonAttrs(old: rec {
35 version = "1.4.9";
36 src = self.fetchPypi {
37 inherit version;
38 inherit (old) pname;
39 sha256 = "2dea4d16d073c902c3b89d9b96620fb6729ac0f7a923bbc777cb4ad827c0c61a";
40 };
41 doCheck = false;
42 });
43 kombu = super.kombu.overridePythonAttrs(old: rec {
44 version = "3.0.37";
45 src = self.fetchPypi {
46 inherit version;
47 inherit (old) pname;
48 sha256 = "e064a00c66b4d1058cd2b0523fb8d98c82c18450244177b6c0f7913016642650";
49 };
50 propagatedBuildInputs = old.propagatedBuildInputs ++ [ self.anyjson ];
51 doCheck = false;
52 });
53 markdown = super.markdown.overridePythonAttrs(old: rec {
54 version = "3.1.1";
55 src = self.fetchPypi {
56 inherit version;
57 inherit (old) pname;
58 sha256 = "2e50876bcdd74517e7b71f3e7a76102050edec255b3983403f1a63e7c8a41e7a";
59 };
60 });
61 sqlalchemy = super.sqlalchemy.overridePythonAttrs(old: rec {
62 version = "1.1.18";
63 src = self.fetchPypi {
64 inherit version;
65 inherit (old) pname;
66 sha256 = "8b0ec71af9291191ba83a91c03d157b19ab3e7119e27da97932a4773a3f664a9";
67 };
68 doCheck = false;
69 });
70 tempita_5_3_dev = super.buildPythonPackage (mylibs.fetchedGithub ./tempita.json // rec {
71 buildInputs = with self; [ nose ];
72 disabled = false;
73 });
74 sqlalchemy_migrate = super.sqlalchemy_migrate.overridePythonAttrs(old: rec {
75 propagatedBuildInputs = with self; [ pbr tempita_5_3_dev decorator sqlalchemy six sqlparse ];
76 });
77 pasteScript = super.pasteScript.overridePythonAttrs(old: rec {
78 version = "2.0.2";
79 name = "PasteScript-${version}";
80 src = fetchurl {
81 url = "mirror://pypi/P/PasteScript/${name}.tar.gz";
82 sha256 = "1h3nnhn45kf4pbcv669ik4faw04j58k8vbj1hwrc532k0nc28gy0";
83 };
84 propagatedBuildInputs = with self; [ six paste PasteDeploy ];
85 });
86 werkzeug = super.werkzeug.overridePythonAttrs(old: rec {
87 version = "0.16.1";
88 src = self.fetchPypi {
89 inherit version;
90 inherit (old) pname;
91 sha256 = "b353856d37dec59d6511359f97f6a4b2468442e454bd1c98298ddce53cac1f04";
92 };
93 });
94 };
95 in
96 python36.override { inherit packageOverrides; };
97 pythonEnv = python-pkgs: with python-pkgs; [
98 waitress alembic dateutil wtforms pybcrypt
99 pytest pytest_xdist werkzeug celery
100 kombu jinja2 Babel webtest configobj markdown
101 sqlalchemy itsdangerous pytz sphinx six
102 oauthlib unidecode jsonschema PasteDeploy
103 requests PyLD exifread
104 typing pasteScript lxml
105 # For images plugin
106 pillow
107 # For video plugin
108 gst-python
109 # migrations
110 sqlalchemy_migrate
111 # authentication
112 ldap3
113 redis
114 psycopg2
115 ];
116 python = overridePython.withPackages pythonEnv;
117 gmg = writeScript "gmg" ''
118 #!${python}/bin/python
119 __requires__ = 'mediagoblin'
120 import sys
121 from pkg_resources import load_entry_point
122
123 if __name__ == '__main__':
124 sys.exit(
125 load_entry_point('mediagoblin', 'console_scripts', 'gmg')()
126 )
127 '';
128 mediagoblinSrc = fetchgit {
129 name = "mediagoblin";
130 url = "git://git.savannah.gnu.org/mediagoblin.git";
131 rev = "cd465ebfec837a75a44c4ebd727dffe2fff6d850";
132 sha256 = "1yz4i4i97z3rxl534a6psaybyjbyp5nnc52v3nvbpzc4pd2s69mx";
133 fetchSubmodules = true; # important!
134 };
135 bowerComponents = buildBowerComponents {
136 name = "mediagoblin-bower-components";
137 generated = ./bower-packages.nix;
138 src = mediagoblinSrc;
139 };
140 pluginNames = [ "basicsearch" ];
141 allPlugins = lib.attrsets.genAttrs pluginNames
142 (name: callPackage (./plugins + "/${name}") {});
143 toPassthru = pkg: {
144 inherit allPlugins;
145 withPlugins = withPlugins pkg;
146 };
147 withPlugins = pkg: toPlugins:
148 let
149 plugins = toPlugins allPlugins;
150 toBuildPlugin = n: "ln -s ${n} mediagoblin/plugins/${n.pluginName}";
151 newMediagoblin = pkg.overrideAttrs(old: {
152 postBuild = old.postBuild + "\n" + builtins.concatStringsSep "\n" (map toBuildPlugin plugins);
153 passthru = toPassthru newMediagoblin;
154 });
155 in newMediagoblin;
156 package = stdenv.mkDerivation rec {
157 pname = "mediagoblin";
158 name = "${pname}-${version}";
159 version = "cd465eb-stable";
160 src = mediagoblinSrc;
161 preConfigure = ''
162 # ./bootstrap.sh
163 aclocal -I m4 --install
164 autoreconf -fvi
165 # end
166 export HOME=$PWD
167 '';
168 configureFlags = [ "--with-python3" "--without-virtualenv" ];
169 postBuild = ''
170 cp -a ${bowerComponents}/bower_components/* extlib
171 chmod -R u+w extlib
172 make extlib
173 '';
174 installPhase = let
175 libpaths = with gst_all_1; [
176 python
177 gstreamer
178 gst-plugins-base
179 gst-libav
180 gst-plugins-good
181 gst-plugins-bad
182 gst-plugins-ugly
183 ];
184 plugin_paths = builtins.concatStringsSep ":" (map (x: "${x}/lib") libpaths);
185 typelib_paths = with gst_all_1; "${gstreamer}/lib/girepository-1.0:${gst-plugins-base}/lib/girepository-1.0";
186 in ''
187 sed -i "s/registry.has_key(current_theme_name)/current_theme_name in registry/" mediagoblin/tools/theme.py
188 sed -i -e "s@\[DEFAULT\]@[DEFAULT]\nhere = $out@" mediagoblin/config_spec.ini
189 sed -i -e "/from gi.repository import GstPbutils/s/^/gi.require_version('GstPbutils', '1.0')\n/" mediagoblin/media_types/video/transcoders.py
190 cp ${./ldap_fix.py} mediagoblin/plugins/ldap/tools.py
191 find . -name '*.pyc' -delete
192 find . -type f -exec sed -i "s|$PWD|$out|g" {} \;
193 python setup.py build
194 cp -a . $out
195 mkdir $out/bin
196 makeWrapper ${gmg} $out/bin/gmg --prefix PYTHONPATH : "$out:$PYTHONPATH" \
197 --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
198 --prefix GI_TYPELIB_PATH : ${typelib_paths}
199 makeWrapper ${python}/bin/paster $out/bin/paster --prefix PYTHONPATH : "$out:$PYTHONPATH" \
200 --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
201 --prefix GI_TYPELIB_PATH : ${typelib_paths}
202 makeWrapper ${python}/bin/celery $out/bin/celery --prefix PYTHONPATH : "$out:$PYTHONPATH" \
203 --prefix GST_PLUGIN_SYSTEM_PATH : ${plugin_paths} \
204 --prefix GI_TYPELIB_PATH : ${typelib_paths}
205 '';
206 buildInputs = [ makeWrapper automake autoconf which nodePackages.bower nodejs python ];
207 propagatedBuildInputs = with gst_all_1; [ python gst-libav gst-plugins-good gst-plugins-bad gst-plugins-ugly gstreamer ];
208 passthru = toPassthru package;
209 };
210in package
diff --git a/pkgs/webapps/mediagoblin/tempita.json b/pkgs/webapps/mediagoblin/tempita.json
deleted file mode 100644
index 5371e17..0000000
--- a/pkgs/webapps/mediagoblin/tempita.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "47414a7-master",
3 "meta": {
4 "name": "tempita",
5 "url": "https://github.com/gjhiggins/tempita",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "gjhiggins",
10 "repo": "tempita",
11 "rev": "47414a7c6e46a9a9afe78f0bce2ea299fa84d10d",
12 "sha256": "0f33jjjs5rvp7ar2j6ggyfykcrsrn04jaqcq71qfvycf6b7nw3rn",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/nextcloud/apps/apporder.nix b/pkgs/webapps/nextcloud/apps/apporder.nix
deleted file mode 100644
index 29fd6e2..0000000
--- a/pkgs/webapps/nextcloud/apps/apporder.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 16 && nextcloudVersion <= 18;
3buildApp rec {
4 appName = "apporder";
5 version = "0.9.0";
6 url = "https://github.com/juliushaertl/apporder/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "1add4i892n4bpmpxwrsr7x99fjyj5rk6maw04iwhviqqqr28fsw6";
8}
diff --git a/pkgs/webapps/nextcloud/apps/audioplayer.nix b/pkgs/webapps/nextcloud/apps/audioplayer.nix
deleted file mode 100644
index a49776f..0000000
--- a/pkgs/webapps/nextcloud/apps/audioplayer.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 17 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "audioplayer";
5 version = "2.10.0";
6 url = "https://github.com/Rello/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
7 sha256 = "122wc05b0m8s5ksdhsiws98aqph894i7cffjkhfhq66c40a728s3";
8}
diff --git a/pkgs/webapps/nextcloud/apps/bookmarks.nix b/pkgs/webapps/nextcloud/apps/bookmarks.nix
deleted file mode 100644
index 1065c34..0000000
--- a/pkgs/webapps/nextcloud/apps/bookmarks.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 17 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "bookmarks";
5 version = "3.0.10";
6 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
7 sha256 = "0y12iqcc6yp25cisg7mg40ddx72531zdvsp2gcl37qi8vqf162ji";
8}
diff --git a/pkgs/webapps/nextcloud/apps/calendar.nix b/pkgs/webapps/nextcloud/apps/calendar.nix
deleted file mode 100644
index bc3ccea..0000000
--- a/pkgs/webapps/nextcloud/apps/calendar.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 17 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "calendar";
5 version = "2.0.3";
6 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "17pjsa657p9n1kslqkfcxd6n4ssh2yd4f5l5ww79mixfs34idbl9";
8}
diff --git a/pkgs/webapps/nextcloud/apps/carnet.nix b/pkgs/webapps/nextcloud/apps/carnet.nix
deleted file mode 100644
index 879ab17..0000000
--- a/pkgs/webapps/nextcloud/apps/carnet.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 13 && nextcloudVersion <= 18;
3buildApp rec {
4 appName = "carnet";
5 version = "0.20.0";
6 url = "https://github.com/PhieF/CarnetNextcloud/releases/download/v${version}/${appName}-nc-v${version}.tar.gz";
7 sha256 = "1hbvs88vj830xalyq8fv8xlnf7livsj1xmnjl4xgla803ch4aym8";
8}
diff --git a/pkgs/webapps/nextcloud/apps/circles.nix b/pkgs/webapps/nextcloud/apps/circles.nix
deleted file mode 100644
index 64a4f2f..0000000
--- a/pkgs/webapps/nextcloud/apps/circles.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 18 && nextcloudVersion <= 18;
3buildApp rec {
4 appName = "circles";
5 version = "0.18.9";
6 url = "https://github.com/nextcloud/circles/releases/download/v${version}/${appName}-${version}.tar.gz";
7 sha256 = "1a58zrjg4cc0igq14s5zfc5zva83mahmfr0mxvhvnasw7rwkpyzr";
8}
diff --git a/pkgs/webapps/nextcloud/apps/contacts.nix b/pkgs/webapps/nextcloud/apps/contacts.nix
deleted file mode 100644
index d80f0b5..0000000
--- a/pkgs/webapps/nextcloud/apps/contacts.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 17 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "contacts";
5 version = "3.3.0";
6 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "187avlksg4k7ci3jz4djfq8zfyq5jpvhbw2dzlp76wlppm1al4m0";
8}
diff --git a/pkgs/webapps/nextcloud/apps/cookbook.nix b/pkgs/webapps/nextcloud/apps/cookbook.nix
deleted file mode 100644
index 63cac0d..0000000
--- a/pkgs/webapps/nextcloud/apps/cookbook.nix
+++ /dev/null
@@ -1,14 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 14 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "cookbook";
5 version = "0.6.5";
6 url = "https://github.com/mrzapp/nextcloud-cookbook/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "068dxdxy9ix37970mn348blkdrrnkzad26zgyx4f5s19wm439p5j";
8 installPhase = ''
9 sed -i -e "s/application..ld..json/application[^\"|\\\\']*ld[^\"|\\\\']*json/" lib/Service/RecipeService.php
10 mkdir -p $out
11 cp -R . $out/
12 '';
13}
14
diff --git a/pkgs/webapps/nextcloud/apps/deck.nix b/pkgs/webapps/nextcloud/apps/deck.nix
deleted file mode 100644
index ec693c6..0000000
--- a/pkgs/webapps/nextcloud/apps/deck.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion == 18;
3buildApp rec {
4 appName = "deck";
5 version = "1.0.0";
6 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "13r9vd5bf75slrzhvi6bybazhh1vcx0n4a8a7hf97bxr7pq2f91j";
8}
diff --git a/pkgs/webapps/nextcloud/apps/extract.nix b/pkgs/webapps/nextcloud/apps/extract.nix
deleted file mode 100644
index daa9d2d..0000000
--- a/pkgs/webapps/nextcloud/apps/extract.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 13 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "extract";
5 version = "1.2.4";
6 url = "https://github.com/PaulLereverend/NextcloudExtract/releases/download/${version}/${appName}.tar.gz";
7 sha256 = "0f1csv0warga12a1hkgdcnhnfiwfv5z2ab3mri4frn2qlh12wyby";
8}
diff --git a/pkgs/webapps/nextcloud/apps/files_markdown.nix b/pkgs/webapps/nextcloud/apps/files_markdown.nix
deleted file mode 100644
index 5810ec9..0000000
--- a/pkgs/webapps/nextcloud/apps/files_markdown.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 16 && nextcloudVersion <= 18;
3buildApp rec {
4 appName = "files_markdown";
5 version = "2.2.0";
6 url = "https://github.com/icewind1991/${appName}/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "05f793pznkkdgmr3wfqfbhwcg8s8kcvpfxnhzyj0pbw19srls2aw";
8}
diff --git a/pkgs/webapps/nextcloud/apps/files_readmemd.nix b/pkgs/webapps/nextcloud/apps/files_readmemd.nix
deleted file mode 100644
index c9728c0..0000000
--- a/pkgs/webapps/nextcloud/apps/files_readmemd.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 16 && nextcloudVersion <= 18;
3buildApp rec {
4 appName = "files_readmemd";
5 version = "1.1.4";
6 url = "https://gitlab.univ-nantes.fr/uncloud/files_readmemd/-/wikis/uploads/e1d280e855f37e5f0a421c757868113c/${appName}.tar.gz";
7 sha256 = "1sfaghbyzfv3hg5vhj1nprb85zsl6lcr2x88ks6l9ndv49nfbvm9";
8}
diff --git a/pkgs/webapps/nextcloud/apps/flowupload.nix b/pkgs/webapps/nextcloud/apps/flowupload.nix
deleted file mode 100644
index 516ee32..0000000
--- a/pkgs/webapps/nextcloud/apps/flowupload.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 15 && nextcloudVersion <= 18;
3buildApp rec {
4 appName = "flowupload";
5 version = "0.1.8";
6 url = "https://github.com/e-alfred/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
7 sha256 = "0llg5cr4fgqg512znp9bga77y7vdsi2pgsyl4m3a54c557zyjah3";
8}
diff --git a/pkgs/webapps/nextcloud/apps/gpxedit.nix b/pkgs/webapps/nextcloud/apps/gpxedit.nix
deleted file mode 100644
index cd3e878..0000000
--- a/pkgs/webapps/nextcloud/apps/gpxedit.nix
+++ /dev/null
@@ -1,16 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 14 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "gpxedit";
5 version = "0.0.13";
6 url = "https://gitlab.com/eneiluj/gpxedit-oc/wikis/uploads/a7c638d1b038514d07bb5c787b6e7961/${appName}-${version}.tar.gz";
7 sha256 = "1b15iqaq8fj3khpx3lh0fyqkhmj6x44fc59pg3cp3jrh3bpg0534";
8 otherConfig = {
9 mimetypealiases = {
10 "application/gpx+xml" = "gpx";
11 };
12 mimetypemapping = {
13 "gpx" = ["application/gpx+xml"];
14 };
15 };
16}
diff --git a/pkgs/webapps/nextcloud/apps/gpxpod.nix b/pkgs/webapps/nextcloud/apps/gpxpod.nix
deleted file mode 100644
index 0750144..0000000
--- a/pkgs/webapps/nextcloud/apps/gpxpod.nix
+++ /dev/null
@@ -1,16 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 14 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "gpxpod";
5 version = "4.2.1";
6 url = "https://gitlab.com/eneiluj/gpxpod-oc/wikis/uploads/0361f9dc50633f0f39d929442935435c/${appName}-${version}.tar.gz";
7 sha256 = "0ycpychq6g8axdprvd0ahgdy2pwfdbfyf1pxk4cprr4ab986aq1x";
8 otherConfig = {
9 mimetypealiases = {
10 "application/gpx+xml" = "gpx";
11 };
12 mimetypemapping = {
13 "gpx" = ["application/gpx+xml"];
14 };
15 };
16}
diff --git a/pkgs/webapps/nextcloud/apps/impersonate.nix b/pkgs/webapps/nextcloud/apps/impersonate.nix
deleted file mode 100644
index 66cc893..0000000
--- a/pkgs/webapps/nextcloud/apps/impersonate.nix
+++ /dev/null
@@ -1,9 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 18 && nextcloudVersion < 19;
3buildApp rec {
4 appName = "impersonate";
5 version = "1.5.2";
6 url = "https://github.com/nextcloud/impersonate/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "03fm9d2p6ap9gyiw5anmlwsdmiyklrkpdgchfx2zfgxn38pjrz6d";
8}
9
diff --git a/pkgs/webapps/nextcloud/apps/keeweb.nix b/pkgs/webapps/nextcloud/apps/keeweb.nix
deleted file mode 100644
index 4ea1399..0000000
--- a/pkgs/webapps/nextcloud/apps/keeweb.nix
+++ /dev/null
@@ -1,17 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 11 && nextcloudVersion <= 18;
3buildApp rec {
4 appName = "keeweb";
5 version = "0.6.2";
6 url = "https://github.com/jhass/nextcloud-keeweb/releases/download/v${version}/${appName}-${version}.tar.gz";
7 sha256 = "067801qz0fcfvmb14ja1ringzk53j1wp7ys2fl7lnlhf45r81vxx";
8 installPhase = ''
9 mkdir -p $out
10 cp -R . $out/
11 '';
12 otherConfig = {
13 mimetypemapping = {
14 "kdbx" = ["application/x-kdbx"];
15 };
16 };
17}
diff --git a/pkgs/webapps/nextcloud/apps/maps.nix b/pkgs/webapps/nextcloud/apps/maps.nix
deleted file mode 100644
index 898df6c..0000000
--- a/pkgs/webapps/nextcloud/apps/maps.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 16 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "maps";
5 version = "0.1.6";
6 url = "https://github.com/nextcloud/maps/releases/download/v${version}/${appName}-${version}.tar.gz";
7 sha256 = "1yh5h96c91lgz58zcm7zdpblvsc6c6nflx8pldfds102x292mprk";
8}
diff --git a/pkgs/webapps/nextcloud/apps/metadata.nix b/pkgs/webapps/nextcloud/apps/metadata.nix
deleted file mode 100644
index 2d62f53..0000000
--- a/pkgs/webapps/nextcloud/apps/metadata.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 13 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "metadata";
5 version = "0.11.1";
6 url = "https://github.com/gino0631/nextcloud-metadata/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "11napkv5s29xk1gmbfvy610ab1kc06qxqzw606ix5x0d1x4m3h0c";
8}
diff --git a/pkgs/webapps/nextcloud/apps/music.nix b/pkgs/webapps/nextcloud/apps/music.nix
deleted file mode 100644
index e430dd9..0000000
--- a/pkgs/webapps/nextcloud/apps/music.nix
+++ /dev/null
@@ -1,9 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 9 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "music";
5 version = "0.14.1";
6 url = "https://github.com/owncloud/music/releases/download/v${version}/${appName}.zip";
7 zip = true;
8 sha256 = "06svn24qix0nbikwi0kxnli402vq99851bn5ljcsm10r74bnlw83";
9}
diff --git a/pkgs/webapps/nextcloud/apps/notes.nix b/pkgs/webapps/nextcloud/apps/notes.nix
deleted file mode 100644
index 7a06bbc..0000000
--- a/pkgs/webapps/nextcloud/apps/notes.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 16 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "notes";
5 version = "3.3.0";
6 url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}.tar.gz";
7 sha256 = "03k0ijma7sccwqq9ch3bvgbg9kxr2wk0bmkxzxrc9in1d40d3k7f";
8}
diff --git a/pkgs/webapps/nextcloud/apps/ocsms.nix b/pkgs/webapps/nextcloud/apps/ocsms.nix
deleted file mode 100644
index aee1ff2..0000000
--- a/pkgs/webapps/nextcloud/apps/ocsms.nix
+++ /dev/null
@@ -1,12 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 16 && nextcloudVersion <= 18;
3buildApp rec {
4 appName = "ocsms";
5 version = "2.1.7";
6 url = "https://github.com/nextcloud/${appName}/releases/download/${version}/${appName}-${version}.tar.gz";
7 sha256 = "1pfdzq16nbh4wfmkmif0dxacxg0fy4n4cp2d1hbq9k2z9awcx1vh";
8 installPhase = ''
9 mkdir -p $out
10 cp -R . $out/
11 '';
12}
diff --git a/pkgs/webapps/nextcloud/apps/passman.nix b/pkgs/webapps/nextcloud/apps/passman.nix
deleted file mode 100644
index 2de4882..0000000
--- a/pkgs/webapps/nextcloud/apps/passman.nix
+++ /dev/null
@@ -1,10 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 17 && nextcloudVersion <= 18;
3buildApp rec {
4 # FIXME: it creates a /settings/user/additional setting url which
5 # doesn’t work
6 appName = "passman";
7 version = "2.3.5";
8 url = "https://releases.passman.cc/${appName}_${version}.tar.gz";
9 sha256 = "05gc288n43c7dhmq1jqfn8cfw7sycwdfhn36j8rh8nbx1irldbjn";
10}
diff --git a/pkgs/webapps/nextcloud/apps/polls.nix b/pkgs/webapps/nextcloud/apps/polls.nix
deleted file mode 100644
index 69e1102..0000000
--- a/pkgs/webapps/nextcloud/apps/polls.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 16 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "polls";
5 version = "1.4.3";
6 url = "https://github.com/nextcloud/polls/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "07l5x5xblk6w8f6mqz3a5hjpry8qc3zgqi49z6bp5ipnzj0s6wm4";
8}
diff --git a/pkgs/webapps/nextcloud/apps/social.nix b/pkgs/webapps/nextcloud/apps/social.nix
deleted file mode 100644
index 75b790a..0000000
--- a/pkgs/webapps/nextcloud/apps/social.nix
+++ /dev/null
@@ -1,9 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 17 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "social";
5 version = "0.3.1";
6 url = "https://github.com/nextcloud/social/releases/download/v${version}/${appName}-${version}.tar.gz";
7 sha256 = "03hh6vr34p33dphrjqmc7s8mvsk5n7dl817j8qkf75203y8szhdy";
8}
9
diff --git a/pkgs/webapps/nextcloud/apps/spreed.nix b/pkgs/webapps/nextcloud/apps/spreed.nix
deleted file mode 100644
index b52c8c5..0000000
--- a/pkgs/webapps/nextcloud/apps/spreed.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion == 18;
3buildApp rec {
4 appName = "spreed";
5 version = "8.0.8";
6 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}-${version}.tar.gz";
7 sha256 = "19szk61ixzzrabs63l2fihx7k4f6a8k4kdzpa0xxzv5w9ssqjhbj";
8}
diff --git a/pkgs/webapps/nextcloud/apps/tasks.nix b/pkgs/webapps/nextcloud/apps/tasks.nix
deleted file mode 100644
index a2de465..0000000
--- a/pkgs/webapps/nextcloud/apps/tasks.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ buildApp, nextcloudVersion }:
2assert nextcloudVersion >= 16 && nextcloudVersion <= 19;
3buildApp rec {
4 appName = "tasks";
5 version = "0.12.2";
6 url = "https://github.com/nextcloud/${appName}/releases/download/v${version}/${appName}.tar.gz";
7 sha256 = "092fg7dpx69jp5z0ka14ay6bnfdcnjq8zk2gc3rwpzc3llpdnqph";
8}
diff --git a/pkgs/webapps/nextcloud/default.nix b/pkgs/webapps/nextcloud/default.nix
deleted file mode 100644
index 5017fd2..0000000
--- a/pkgs/webapps/nextcloud/default.nix
+++ /dev/null
@@ -1,69 +0,0 @@
1{ varDir ? "/var/lib/nextcloud", nextcloudVersion ? 18, otherConfig ? {}, lib, stdenv, callPackage, fetchzip, fetchurl }:
2let
3 appNames = [
4 "apporder" "audioplayer" "bookmarks" "calendar" "carnet" "circles"
5 "contacts" "cookbook" "deck" "extract" "files_markdown"
6 "files_readmemd" "flowupload" "gpxedit" "gpxpod" "impersonate"
7 "keeweb" "maps" "metadata" "music" "notes" "ocsms" "passman" "polls"
8 "spreed" "social" "tasks"
9 ];
10 allApps = lib.attrsets.genAttrs appNames
11 (name: callPackage (./apps + "/${name}.nix") { inherit buildApp nextcloudVersion; });
12 buildApp = { appName, version, url, sha256, zip ? false, otherConfig ? {}, installPhase ? "mkdir -p $out && cp -R . $out/" }:
13 stdenv.mkDerivation rec {
14 name = "nextcloud-app-${appName}-${version}";
15 inherit version;
16 phases = "unpackPhase installPhase";
17 inherit installPhase;
18 src = (if zip then fetchzip else fetchurl) { inherit url sha256; };
19 passthru = {
20 inherit appName otherConfig;
21 };
22 };
23 toPassthru = pkg: apps: otherConfig: {
24 inherit apps otherConfig allApps buildApp varDir;
25 withApps = withApps pkg;
26 };
27 withApps = pkg: toApps:
28 let
29 apps = toApps allApps;
30 toInstallApp = n: ''
31 ln -sf ${n} $out/apps/${n.appName}
32 '';
33 zipped = lib.attrsets.zipAttrs ([pkg.otherConfig or {}] ++ map (v: v.otherConfig) apps);
34 appConfigs = with lib.attrsets; with lib.lists; {
35 mimetypealiases = foldr (h: prev: prev // h) {} (zipped.mimetypealiases or []);
36 mimetypemapping = mapAttrs (_: v: unique (flatten v)) (zipAttrs (zipped.mimetypemapping or []));
37 };
38 newNextcloud = pkg.overrideAttrs(old: {
39 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallApp apps);
40 passthru = toPassthru newNextcloud (pkg.apps ++ apps) appConfigs;
41 });
42 in newNextcloud;
43 package = stdenv.mkDerivation rec {
44 name = "nextcloud-${version}";
45 version = "${builtins.toString nextcloudVersion}.0.4";
46
47 src = fetchurl {
48 url = "https://download.nextcloud.com/server/releases/${name}.tar.bz2";
49 sha256 = "0aa3f4xbkzacfw0h9aic0ywk5mqlwka83qaszizj8lmk68kf3n7s";
50 };
51
52 installPhase = ''
53 mkdir -p $out/
54 cp -R . $out/
55 rm -r $out/config
56 '' + lib.optionalString (varDir != null) ''
57 ln -sf ${varDir}/config $out/config
58 '';
59
60 passthru = toPassthru package [] otherConfig;
61 meta = {
62 description = "Sharing solution for files, calendars, contacts and more";
63 homepage = https://nextcloud.com;
64 maintainers = with lib.maintainers; [ schneefux bachp globin fpletz ];
65 license = lib.licenses.agpl3Plus;
66 platforms = with lib.platforms; unix;
67 };
68 };
69in package
diff --git a/pkgs/webapps/rompr/default.nix b/pkgs/webapps/rompr/default.nix
deleted file mode 100644
index 2accf00..0000000
--- a/pkgs/webapps/rompr/default.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ varDir ? "/var/lib/rompr", stdenv, mylibs }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./rompr.json // {
3 installPhase = ''
4 cp -a . $out
5 ln -sf ${varDir}/prefs $out/prefs
6 ln -sf ${varDir}/albumart $out/albumart
7 '';
8})
diff --git a/pkgs/webapps/rompr/rompr.json b/pkgs/webapps/rompr/rompr.json
deleted file mode 100644
index 778d915..0000000
--- a/pkgs/webapps/rompr/rompr.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "1.24",
3 "meta": {
4 "name": "rompr",
5 "url": "https://github.com/fatg3erman/RompR",
6 "branch": "refs/tags/1.24"
7 },
8 "github": {
9 "owner": "fatg3erman",
10 "repo": "RompR",
11 "rev": "0d8f597027ac71b320963fe3f33f461a136312ad",
12 "sha256": "13p3c4whhmvz1vvh9fva5gdx4xji288k108hjdi8b1yn506lzix2",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/surfer/default.nix b/pkgs/webapps/surfer/default.nix
deleted file mode 100644
index 9a04da5..0000000
--- a/pkgs/webapps/surfer/default.nix
+++ /dev/null
@@ -1,12 +0,0 @@
1{ callPackage, mylibs, sources }:
2# built using node2nix -l package-lock.json
3# and changing "./." to "src"
4(callPackage ./node-packages.nix {
5 src = sources.webapps-surfer;
6 nodeEnv = callPackage mylibs.nodeEnv {};
7}).package.overrideAttrs(old: {
8 postInstall = ''
9 mkdir -p $out/bin
10 ln -s ../cloudron-surfer/server.js $out/lib/node_modules/.bin/surfer-server
11 '';
12})
diff --git a/pkgs/webapps/taskwarrior-web/default.nix b/pkgs/webapps/taskwarrior-web/default.nix
deleted file mode 100644
index d5368c5..0000000
--- a/pkgs/webapps/taskwarrior-web/default.nix
+++ /dev/null
@@ -1,22 +0,0 @@
1{ ruby_2_6, bundlerEnv, mylibs, stdenv }:
2let
3 gems = bundlerEnv {
4 name = "taskwarrior-web-env";
5 ruby = ruby_2_6;
6 pname = "taskwarrior-web";
7 gemset = ./gemset.nix;
8 gemdir = package.out;
9 groups = [ "default" "local" "development" ];
10 };
11 package = stdenv.mkDerivation (mylibs.fetchedGithub ./taskwarrior-web.json // rec {
12 phases = [ "unpackPhase" "patchPhase" "installPhase" ];
13 patches = [ ./fixes.patch ./thin.patch ];
14 installPhase = ''
15 cp -a . $out
16 cp ${./Gemfile.lock} $out/Gemfile.lock
17 '';
18 passthru = {
19 inherit gems;
20 };
21 });
22in package
diff --git a/pkgs/webapps/taskwarrior-web/fixes.patch b/pkgs/webapps/taskwarrior-web/fixes.patch
deleted file mode 100644
index 851f9f0..0000000
--- a/pkgs/webapps/taskwarrior-web/fixes.patch
+++ /dev/null
@@ -1,56 +0,0 @@
1diff --git a/lib/taskwarrior-web/helpers.rb b/lib/taskwarrior-web/helpers.rb
2index 212aed7..94c57df 100644
3--- a/lib/taskwarrior-web/helpers.rb
4+++ b/lib/taskwarrior-web/helpers.rb
5@@ -1,6 +1,8 @@
6 require 'active_support/core_ext/date/calculations'
7
8 module TaskwarriorWeb::App::Helpers
9+ include ERB::Util
10+
11 def format_date(timestamp)
12 format = TaskwarriorWeb::Config.dateformat || '%-m/%-d/%Y'
13 Time.parse(timestamp).localtime.strftime(format)
14diff --git a/lib/taskwarrior-web/services/builder/base.rb b/lib/taskwarrior-web/services/builder/base.rb
15index 58d246e..8f716ac 100644
16--- a/lib/taskwarrior-web/services/builder/base.rb
17+++ b/lib/taskwarrior-web/services/builder/base.rb
18@@ -10,7 +10,7 @@ module TaskwarriorWeb::CommandBuilder::Base
19 :complete => ':id done',
20 :annotate => ':id annotate',
21 :denotate => ':id denotate',
22- :projects => '_projects',
23+ :projects => '_unique project',
24 :tags => '_tags',
25 :sync => 'sync'
26 }
27diff --git a/lib/taskwarrior-web/views/tasks/_form.erb b/lib/taskwarrior-web/views/tasks/_form.erb
28index 789e7a1..fa08698 100644
29--- a/lib/taskwarrior-web/views/tasks/_form.erb
30+++ b/lib/taskwarrior-web/views/tasks/_form.erb
31@@ -1,14 +1,14 @@
32 <div class="control-group">
33 <label for="task-description" class="control-label">Description</label>
34 <div class="controls">
35- <input type="text" required="required" id="task-description" name="task[description]" value="<%= @task.description unless @task.nil? %>" />
36+ <input type="text" required="required" id="task-description" name="task[description]" value="<%=h @task.description unless @task.nil? %>" />
37 </div>
38 </div>
39
40 <div class="control-group">
41 <label for="task-project" class="control-label">Project</label>
42 <div class="controls">
43- <input type="text" id="task-project" name="task[project]" value="<%= @task.project unless @task.nil? %>" autocomplete="off" />
44+ <input type="text" id="task-project" name="task[project]" value="<%=h @task.project unless @task.nil? %>" autocomplete="off" />
45 </div>
46 </div>
47
48@@ -45,7 +45,7 @@
49 <div class="control-group">
50 <label for="task-tags" class="control-label">Tags</label>
51 <div class="controls">
52- <input type="text" id="task-tags" name="task[tags]" value="<%= @task.tags.join(', ') unless @task.nil? %>" autocomplete="off" />
53+ <input type="text" id="task-tags" name="task[tags]" value="<%=h @task.tags.join(', ') unless @task.nil? %>" autocomplete="off" />
54 <span class="help-block">Enter tags separated by commas or spaces (e.g. <em>each, word will,be a tag</em>)</span>
55 </div>
56 </div>
diff --git a/pkgs/webapps/taskwarrior-web/taskwarrior-web.json b/pkgs/webapps/taskwarrior-web/taskwarrior-web.json
deleted file mode 100644
index 70f396d..0000000
--- a/pkgs/webapps/taskwarrior-web/taskwarrior-web.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "a79cfe2-master",
3 "meta": {
4 "name": "taskwarrior-web",
5 "url": "https://github.com/theunraveler/taskwarrior-web",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "theunraveler",
10 "repo": "taskwarrior-web",
11 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
12 "sha256": "028rb4wry2an19707bvy4n305f3s0hipg214224p1m0mb61c3cq4",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/ttrss/default.nix b/pkgs/webapps/ttrss/default.nix
deleted file mode 100644
index aeb573c..0000000
--- a/pkgs/webapps/ttrss/default.nix
+++ /dev/null
@@ -1,37 +0,0 @@
1{ ttrss_config ? "/etc/ttrss/config.php"
2, varDir ? "/var/lib/ttrss"
3, stdenv, lib, callPackage, sources }:
4let
5 pluginNames = [ "auth_ldap" "af_feedmod" "feediron" "ff_instagram" "tumblr_gdpr_ua" ];
6 allPlugins = lib.attrsets.genAttrs pluginNames
7 (name: callPackage (./plugins + "/${name}") {});
8 toPassthru = pkg: plugins: {
9 inherit plugins allPlugins;
10 withPlugins = withPlugins pkg;
11 };
12 withPlugins = pkg: toPlugins:
13 let
14 plugins = toPlugins allPlugins;
15 toInstallPlugin = n:
16 "ln -sf ${n} $out/plugins/${n.pluginName}";
17 newTtrss = pkg.overrideAttrs(old: {
18 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallPlugin plugins);
19 passthru = toPassthru newTtrss (pkg.plugins ++ plugins);
20 });
21 in newTtrss;
22 package = stdenv.mkDerivation rec {
23 pname = "tt-rss";
24 version = sources.webapps-ttrss.version;
25 name = "${pname}-${version}";
26 src = sources.webapps-ttrss;
27 buildPhase = ''
28 rm -rf lock feed-icons cache
29 ln -sf ${varDir}/{lock,feed-icons,cache} .
30 '';
31 installPhase = ''
32 cp -a . $out
33 ln -s ${ttrss_config} $out/config.php
34 '';
35 passthru = toPassthru package [];
36 };
37in package
diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json b/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json
deleted file mode 100644
index e57fcce..0000000
--- a/pkgs/webapps/ttrss/plugins/af_feedmod/af_feedmod.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "0ea2092-master",
3 "meta": {
4 "name": "ttrss-af_feedmod",
5 "url": "https://github.com/mbirth/ttrss_plugin-af_feedmod",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "mbirth",
10 "repo": "ttrss_plugin-af_feedmod",
11 "rev": "0ea2092dd34067ecd898802cfca3570023d1ecfe",
12 "sha256": "02ibf47zcrsc2rr45wsix8gxyyf371davj8n8i0gj1zdq95klvnv",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix b/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix
deleted file mode 100644
index 8512be3..0000000
--- a/pkgs/webapps/ttrss/plugins/af_feedmod/default.nix
+++ /dev/null
@@ -1,9 +0,0 @@
1{ patched ? false, stdenv, mylibs, lib }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./af_feedmod.json // {
3 patches = lib.optionals patched [ ./type_replace.patch ];
4 installPhase = ''
5 mkdir $out
6 cp init.php $out
7 '';
8 passthru.pluginName = "af_feedmod";
9})
diff --git a/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json b/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json
deleted file mode 100644
index c8aaab5..0000000
--- a/pkgs/webapps/ttrss/plugins/auth_ldap/auth-ldap.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "4d751b0-master",
3 "meta": {
4 "name": "ttrss-auth-ldap",
5 "url": "https://github.com/hydrian/TTRSS-Auth-LDAP",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "hydrian",
10 "repo": "TTRSS-Auth-LDAP",
11 "rev": "4d751b095c29a8dbe2dc7bb07777742956136e94",
12 "sha256": "0b9fl86acrzpcv41r7pj3bl8b3n72hpkdywzx9zjyfqv5pskxyim",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix b/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix
deleted file mode 100644
index 424a9f7..0000000
--- a/pkgs/webapps/ttrss/plugins/auth_ldap/default.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ stdenv, mylibs }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./auth-ldap.json // {
3 installPhase = ''
4 mkdir $out
5 cp plugins/auth_ldap/init.php $out
6 '';
7 passthru.pluginName = "auth_ldap";
8})
diff --git a/pkgs/webapps/ttrss/plugins/feediron/default.nix b/pkgs/webapps/ttrss/plugins/feediron/default.nix
deleted file mode 100644
index 80bfda4..0000000
--- a/pkgs/webapps/ttrss/plugins/feediron/default.nix
+++ /dev/null
@@ -1,9 +0,0 @@
1{ patched ? false, stdenv, mylibs, lib }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./feediron.json // {
3 patches = lib.optionals patched [ ./json_reformat.patch ];
4 installPhase = ''
5 mkdir $out
6 cp -a . $out
7 '';
8 passthru.pluginName = "feediron";
9})
diff --git a/pkgs/webapps/ttrss/plugins/feediron/feediron.json b/pkgs/webapps/ttrss/plugins/feediron/feediron.json
deleted file mode 100644
index 5dbec92..0000000
--- a/pkgs/webapps/ttrss/plugins/feediron/feediron.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "407168c-master",
3 "meta": {
4 "name": "ttrss-feediron",
5 "url": "https://github.com/m42e/ttrss_plugin-feediron",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "m42e",
10 "repo": "ttrss_plugin-feediron",
11 "rev": "407168c628880b5ced572cc549db6d50e866d3c8",
12 "sha256": "17b95ifpcph6m03hjd1mhi8gi1hw9yd3fnffmw66fqr5c9l3zd9r",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix b/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix
deleted file mode 100644
index 3540f73..0000000
--- a/pkgs/webapps/ttrss/plugins/ff_instagram/default.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ stdenv, mylibs }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./ff_instagram.json // {
3 installPhase = ''
4 mkdir $out
5 cp -a . $out
6 '';
7 passthru.pluginName = "ff_instagram";
8})
diff --git a/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json b/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json
deleted file mode 100644
index 1f241b9..0000000
--- a/pkgs/webapps/ttrss/plugins/ff_instagram/ff_instagram.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "0366ffb-master",
3 "meta": {
4 "name": "ttrss-ff_instagram",
5 "url": "https://github.com/wltb/ff_instagram",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "wltb",
10 "repo": "ff_instagram",
11 "rev": "0366ffb18c4d490c8fbfba2f5f3367a5af23cfe8",
12 "sha256": "0vvzl6wi6jmrqknsfddvckjgsgfizz1d923d1nyrpzjfn6bda1vk",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix b/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix
deleted file mode 100644
index 2cf3e05..0000000
--- a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/default.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ stdenv, mylibs }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./tumblr_gdpr_ua.json // {
3 installPhase = ''
4 mkdir $out
5 cp -a . $out
6 '';
7 passthru.pluginName = "tumblr_gdpr_ua";
8})
diff --git a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json b/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json
deleted file mode 100644
index eafbcfe..0000000
--- a/pkgs/webapps/ttrss/plugins/tumblr_gdpr_ua/tumblr_gdpr_ua.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "287c584-master",
3 "meta": {
4 "name": "ttrss-tumblr_gdpr_ua",
5 "url": "https://github.com/hkockerbeck/ttrss-tumblr-gdpr-ua",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "hkockerbeck",
10 "repo": "ttrss-tumblr-gdpr-ua",
11 "rev": "287c584e68845d524f920156bff0b2eaa6f65117",
12 "sha256": "1fviawgcclqky4k4xv1sqzvpb8i74w9f0pclm09m78s8l85wh9py",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/yourls/default.nix b/pkgs/webapps/yourls/default.nix
deleted file mode 100644
index d940c54..0000000
--- a/pkgs/webapps/yourls/default.nix
+++ /dev/null
@@ -1,28 +0,0 @@
1{ yourls_config ? "/etc/yourls/config.php", mylibs, callPackage, lib, stdenv }:
2let
3 pluginNames = [ "ldap" ];
4 allPlugins = lib.attrsets.genAttrs pluginNames
5 (name: callPackage (./plugins + "/${name}") { inherit mylibs; });
6 toPassthru = pkg: plugins: {
7 inherit plugins allPlugins;
8 withPlugins = withPlugins pkg;
9 };
10 withPlugins = pkg: toPlugins:
11 let
12 plugins = toPlugins allPlugins;
13 toInstallPlugin = n: "ln -s ${n} $out/user/plugins/${n.pluginName}";
14 newYourls = pkg.overrideAttrs(old: {
15 installPhase = old.installPhase + "\n" + builtins.concatStringsSep "\n" (map toInstallPlugin plugins);
16 passthru = toPassthru newYourls (pkg.plugins ++ plugins);
17 });
18 in newYourls;
19 package = stdenv.mkDerivation (mylibs.fetchedGithub ./yourls.json // rec {
20 installPhase = ''
21 mkdir -p $out
22 cp -a */ *.php $out/
23 cp sample-robots.txt $out/robots.txt
24 ln -sf ${yourls_config} $out/includes/config.php
25 '';
26 passthru = toPassthru package [];
27 });
28in package
diff --git a/pkgs/webapps/yourls/plugins/ldap/default.nix b/pkgs/webapps/yourls/plugins/ldap/default.nix
deleted file mode 100644
index 01dc6fb..0000000
--- a/pkgs/webapps/yourls/plugins/ldap/default.nix
+++ /dev/null
@@ -1,8 +0,0 @@
1{ stdenv, mylibs }:
2stdenv.mkDerivation (mylibs.fetchedGithub ./ldap.json // rec {
3 installPhase = ''
4 mkdir -p $out
5 cp plugin.php $out
6 '';
7 passthru.pluginName = "ldap";
8})
diff --git a/pkgs/webapps/yourls/plugins/ldap/ldap.json b/pkgs/webapps/yourls/plugins/ldap/ldap.json
deleted file mode 100644
index 9411e4a..0000000
--- a/pkgs/webapps/yourls/plugins/ldap/ldap.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "2a3cb03-master",
3 "meta": {
4 "name": "yourls-ldap-plugin",
5 "url": "https://github.com/k3a/yourls-ldap-plugin",
6 "branch": "master"
7 },
8 "github": {
9 "owner": "k3a",
10 "repo": "yourls-ldap-plugin",
11 "rev": "2a3cb0334b8a6b81b284a7196e614bbd2b2b1615",
12 "sha256": "0cchbnli77d295lzf7kjmn4dcxj2bmdqa9qc3f8l8qgmp4n5n0gh",
13 "fetchSubmodules": true
14 }
15}
diff --git a/pkgs/webapps/yourls/yourls.json b/pkgs/webapps/yourls/yourls.json
deleted file mode 100644
index 0a79b18..0000000
--- a/pkgs/webapps/yourls/yourls.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "tag": "1.7.3",
3 "meta": {
4 "name": "yourls",
5 "url": "https://github.com/YOURLS/YOURLS",
6 "branch": "refs/tags/1.7.3"
7 },
8 "github": {
9 "owner": "YOURLS",
10 "repo": "YOURLS",
11 "rev": "077018822d3594229daa8343310d0b40804b9ddc",
12 "sha256": "1av6h619rwqn0yn0kjn2s2h3gmrhmxaaa9hd5ns4ralxgg731imd",
13 "fetchSubmodules": true
14 }
15}
diff --git a/scripts/fetch_version b/scripts/fetch_version
deleted file mode 100755
index 5c4715a..0000000
--- a/scripts/fetch_version
+++ /dev/null
@@ -1,173 +0,0 @@
1#!/usr/bin/env bash
2
3usage() {
4 echo "$0 file.json"
5 echo "$0 [-n|--name name] [-b|--branch branch_or_rev] [-f|--file out_file] [-h|--help] (-u|--url) url"
6 exit
7}
8
9branch="master"
10while [[ $# -gt 0 ]]; do
11 a="$1"
12 shift
13 case "$a" in
14 *.json)
15 file=$a
16 content=$(cat $a)
17 name="$(echo "$content" | jq -r ".meta.name")"
18 url="$(echo "$content" | jq -r ".meta.url")"
19 branch="$(echo "$content" | jq -r ".meta.branch")"
20 ;;
21 -n|--name)
22 name=$1
23 shift
24 ;;
25 -u|--url)
26 url=$1
27 shift
28 ;;
29 -b|--branch)
30 branch=$1
31 shift
32 ;;
33 -f|--file)
34 file=$1
35 shift
36 ;;
37 -h|--help)
38 usage
39 ;;
40 esac
41done
42if [ -z "$url" ]; then
43 usage
44fi
45if [ -z "$name" ]; then
46 name=$(echo "$url" | cut -d"/" -f5)
47fi
48if [ -z "$file" ]; then
49 file=$name.json
50fi
51
52# function fetch_ledger () {
53# pushd $HOME/projets/ledger >/dev/null 2>/dev/null
54# git fetch origin
55# tag="$(git describe origin/next | sed -e "s/^v//")"
56# rev="$(git show-ref -s refs/remotes/origin/next)"
57# sha="$(nix-prefetch-url --unpack file://<(git archive --format=tar.gz HEAD) 2>/dev/null)"
58# popd >/dev/null 2>/dev/null
59# }
60
61# awk_describe='BEGIN {
62# FS = "[ /^]+"
63# while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) {
64# if (!sha)
65# sha = substr($0, 1, 7)
66# tag = $3
67# }
68# while ("curl -s " ARGV[1] "/releases/tag/" tag | getline)
69# if ($3 ~ "commits")
70# com = $2
71# printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha
72# }'
73
74function get_ref () {
75 case "$1" in
76 refs/*)
77 echo "$1"
78 ;;
79 *)
80 echo "refs/heads/$1"
81 ;;
82 esac
83}
84
85function get_name () {
86 branch="$1"
87 rev="$2"
88 minirev=${rev:0:7}
89
90 case "$branch" in
91 refs/tags/*)
92 b="${branch#refs/tags/}"
93 echo "${b//\//-}"
94 ;;
95 refs/heads/*)
96 b=${branch#refs/heads/}
97 echo "$minirev-${b//\//-}"
98 ;;
99 refs/*)
100 b=${branch#refs/}
101 echo "$minirev-${b//\//-}"
102 ;;
103 *)
104 echo "$minirev-${branch//\//-}"
105 ;;
106 esac
107}
108
109function fetch_github () {
110 rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)"
111 sha="$(nix-prefetch-url --unpack $url/archive/$rev.tar.gz)"
112 # Différent du git-describe et github-spécifique
113 #tag=$(echo "$awk_describe" | awk -f - $url | sed -e "s/^v//")
114 tag=$(get_name $branch $rev)
115}
116
117function fetch_other () {
118 rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)"
119 sha="$(nix-prefetch-git --url $url --rev $(get_ref $branch) | jq -r '.sha256')"
120 tag=$(get_name $branch $rev)
121}
122
123case "$url" in
124 https://*github.com/*)
125 fetch_github 2>/dev/null
126 owner=$(echo "$url" | cut -d"/" -f4)
127 repo=$(echo "$url" | cut -d"/" -f5)
128
129 F='{
130 "tag": $tag,
131 "meta": {
132 "name": $name,
133 "url": $url,
134 "branch": $branch
135 },
136 "github": {
137 "owner": $owner,
138 "repo": $repo,
139 "rev": $rev,
140 "sha256": $sha,
141 "fetchSubmodules": true
142 }
143 }'
144 ;;
145 *)
146 fetch_other 2>/dev/null
147 F='{
148 "tag": $tag,
149 "meta": {
150 "name": $name,
151 "url": $url,
152 "branch": $branch
153 },
154 "git": {
155 "url": $url,
156 "rev": $rev,
157 "sha256": $sha,
158 "fetchSubmodules": true
159 }
160 }'
161 ;;
162esac
163
164jq -n \
165 --arg name "$name" \
166 --arg owner "$owner" \
167 --arg repo "$repo" \
168 --arg tag "$tag" \
169 --arg rev "$rev" \
170 --arg url "$url" \
171 --arg branch "$branch" \
172 --arg sha "$sha" \
173 "$F" > $file
diff --git a/scripts/make-nur b/scripts/make-nur
index 127f8bd..2b7278f 100755
--- a/scripts/make-nur
+++ b/scripts/make-nur
@@ -19,7 +19,7 @@ git rebase --onto=$nur_root $first_commit master
19# The list below musn't get shrinked, it is used by filter-branch on 19# The list below musn't get shrinked, it is used by filter-branch on
20# every commit 20# every commit
21clean_folder=' 21clean_folder='
22 rm -rf config lib/private modules/private pkgs/private nixops 22 rm -rf config lib/private modules/private pkgs/private deploy
23 for broken in pkgs/crypto/cardano/default.nix; do 23 for broken in pkgs/crypto/cardano/default.nix; do
24 if [ -f $broken ]; then 24 if [ -f $broken ]; then
25 rm -f $broken 25 rm -f $broken
diff --git a/scripts/refresh_flakes b/scripts/refresh_flakes
new file mode 100755
index 0000000..2bbcad6
--- /dev/null
+++ b/scripts/refresh_flakes
@@ -0,0 +1,71 @@
1#!/usr/bin/env bash
2
3set -e
4
5declare -A refreshed
6
7while [ -n "$1" ]; do
8 case "$1" in
9 --no-new-inputs)
10 no_new_inputs="y"
11 shift;;
12 *)
13 flake_or_dir="$1"
14 shift;;
15 esac
16done
17
18refresh_deps() {
19 local flake
20 local inputs=()
21 local depname
22 local deppath
23 flake="$(realpath $1)"
24 if [ "${refreshed[$flake]}" = 1 ]; then
25 return
26 fi
27 pushd "$flake" 2>/dev/null >/dev/null
28 if [ -z "$no_new_inputs" ]; then
29 nix --no-warn-dirty flake lock
30 fi
31 if [ ! -e "$flake/flake.lock" ]; then
32 popd 2>/dev/null >/dev/null
33 refreshed[$flake]=1
34 return
35 fi
36
37 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)
38 if [ -n "$deps" ]; then
39 while read depname deppath; do
40 refresh_deps "$deppath"
41 inputs+=(--update-input "$depname")
42 done <<<"$deps"
43 fi
44 nix --no-warn-dirty flake lock "${inputs[@]}"
45 popd 2>/dev/null >/dev/null
46 refreshed[$flake]=1
47}
48
49git_dir=$(git rev-parse --show-toplevel)
50
51# If argument is given (flake.nix or directory containing), refresh that argument
52# Otherwise, if we are in a subdirectory containing a flake.nix, refresh that
53# Otherwise, refresh all
54if [ -n "$flake_or_dir" ]; then
55 if [ -d "$flake_or_dir" -a -e "$1/flake.nix" ]; then
56 refresh_deps "$flake_or_dir"
57 elif [ -f "$flake_or_dir" -a -e "$(dirname $flake_or_dir)/flake.nix" ]; then
58 refresh_deps "$(dirname $flake_or_dir)"
59 else
60 echo "No flake.nix file in specified location"
61 exit 1
62 fi
63else
64 if [ "$(pwd)" != "$git_dir" -a -e "$(pwd)/flake.nix" ]; then
65 refresh_deps "$(pwd)"
66 else
67 find $git_dir -name "flake.lock" | while read flake; do
68 refresh_deps "$(dirname $flake)"
69 done
70 fi
71fi
diff --git a/nixops/scripts/setup b/scripts/setup
index db0f353..db0f353 100755
--- a/nixops/scripts/setup
+++ b/scripts/setup
diff --git a/scripts/update_flake b/scripts/update_flake
new file mode 100755
index 0000000..3a9cd17
--- /dev/null
+++ b/scripts/update_flake
@@ -0,0 +1,18 @@
1#!/usr/bin/env bash
2
3searched_file="$1"
4
5get_inputs() {
6 flake=$1
7 name=$2
8 cat "$flake" | jq -r --arg name "$name" '.nodes|to_entries[]|select(.value.original.path != null and (.value.original.path|test("(../)+" + $name)))|.key'
9}
10
11find flakes -name "flake.lock" | while read flake; do
12 for input in $(get_inputs "$flake" "$searched_file"); do
13 echo "updating $input in $(dirname "$flake")"
14 pushd "$(dirname "$flake")" >/dev/null 2>/dev/null
15 nix flake update --update-input "$input"
16 popd >/dev/null 2>/dev/null
17 done
18done
diff --git a/scripts/with_env b/scripts/with_env
new file mode 100755
index 0000000..783d86c
--- /dev/null
+++ b/scripts/with_env
@@ -0,0 +1,27 @@
1#!/usr/bin/env bash
2
3if [ -z "$SOPS_VARS_FILE" ]; then
4 echo "Variable SOPS_VARS_FILE is needed with a path to the sops variables"
5 exit 1;
6fi
7
8umask 0077
9TEMP=$(mktemp -d /tmp/XXXXXX-nixops-files)
10chmod go-rwx $TEMP
11
12finish() {
13 rm -rf "$TEMP"
14}
15
16trap finish EXIT
17
18sops -d $SOPS_VARS_FILE | yq -r .ssl_keys.nix_repository > $TEMP/id_ed25519
19
20cat > $TEMP/ssh_config <<EOF
21Host *
22IdentityFile $TEMP/id_ed25519
23EOF
24export SSH_CONFIG_FILE="$TEMP/ssh_config"
25export SSH_IDENTITY_FILE="$TEMP/id_ed25519"
26
27"$@"
diff --git a/shell.nix b/shell.nix
deleted file mode 100644
index 2295f8c..0000000
--- a/shell.nix
+++ /dev/null
@@ -1,18 +0,0 @@
1{ pkgs ? import <nixpkgs> { overlays = builtins.attrValues (import ./overlays); },
2 pkgs-nix ? import <nixpkgs-nix> { overlays = builtins.attrValues (import ./overlays); }
3}:
4let
5 patchedNix = pkgs-nix.nixUnstable.overrideAttrs(old: {
6 patches = old.patches ++ [
7 # Fix the ETag bug. PR merged. Remove when updating to >= 20210125
8 # https://github.com/NixOS/nixpkgs/pull/109309#issuecomment-768331750
9 (pkgs-nix.fetchpatch {
10 url = "https://patch-diff.githubusercontent.com/raw/NixOS/nix/pull/4470.diff";
11 sha256 = "sha256-d4RNOKMxa4NMbFgYcqWRv2ByHt8F/XUWV+6P9qHz7S4=";
12 })
13 ];
14 });
15in
16pkgs.mkShell {
17 buildInputs = [ patchedNix pkgs.sops pkgs.morph pkgs.niv pkgs.curl pkgs.shellcheck pkgs.jq pkgs.gnumake pkgs.yq ];
18}
diff --git a/systems/backup-2/base.nix b/systems/backup-2/base.nix
new file mode 100644
index 0000000..97a364c
--- /dev/null
+++ b/systems/backup-2/base.nix
@@ -0,0 +1,164 @@
1{ config, pkgs, resources, name, lib, nixpkgs, secrets, ... }:
2{
3 # ssh-keyscan backup-2 | nix-shell -p ssh-to-age --run ssh-to-age
4 secrets.ageKeys = [ "age1kk3nr27qu42j28mcfdag5lhq0zu2pky7gfanvne8l4z2ctevjpgskmw0sr" ];
5 secrets.keys = {
6 "rsync_backup/identity" = {
7 user = "backup";
8 group = "backup";
9 permissions = "0400";
10 text = config.myEnv.rsync_backup.ssh_key.private;
11 };
12 "rsync_backup/identity.pub" = {
13 user = "backup";
14 group = "backup";
15 permissions = "0444";
16 text = config.myEnv.rsync_backup.ssh_key.public;
17 };
18 };
19 boot.kernelPackages = pkgs.linuxPackages_latest;
20
21 nixpkgs.config.permittedInsecurePackages = [
22 "python-2.7.18.6" # for nagios-cli
23 ];
24
25 imports =
26 [
27 secrets.nixosModules.users-config-backup-2
28 (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix")
29 ./databases/mariadb_replication.nix
30 ./databases/openldap_replication.nix
31 ./databases/postgresql_replication.nix
32 ./databases/redis_replication.nix
33 ./mail/relay.nix
34 ./monitoring.nix
35 ];
36
37 fileSystems = {
38 "/backup2" = {
39 fsType = "ext4";
40 device = "UUID=b9425333-f567-435d-94d8-b26c22d93426";
41 };
42 "/" = { device = "/dev/sda1"; fsType = "ext4"; };
43 };
44
45 networking = {
46 firewall.enable = true;
47 interfaces."ens3".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
48 (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or []))
49 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips));
50 interfaces."ens3".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
51 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
52 config.hostEnv.ips);
53 defaultGateway6 = { address = "fe80::1"; interface = "ens3"; };
54 };
55
56 boot.loader.grub.device = "nodev";
57
58 security.acme.certs."${name}" = {
59 group = config.services.nginx.group;
60 };
61 services.nginx = {
62 enable = true;
63 recommendedOptimisation = true;
64 recommendedGzipSettings = true;
65 recommendedProxySettings = true;
66 };
67 networking.firewall.allowedTCPPorts = [ 80 443 ];
68
69 services.cron = {
70 mailto = "cron@immae.eu";
71 enable = true;
72 };
73
74 myServices.chatonsProperties.hostings.rsync-backup = {
75 file.datetime = "2022-08-27T16:00:00";
76 hosting = {
77 name = "Rsync backups";
78 description = "Remote initiated rsync backups";
79 website = "backup-2.v.immae.eu";
80 status.level = "OK";
81 status.description = "OK";
82 registration.load = "OPEN";
83 install.type = "PACKAGE";
84 };
85 software = {
86 name = "rsync";
87 website = "https://rsync.samba.org/";
88 license.url = "https://rsync.samba.org/GPL.html";
89 license.name = "GNU General Public License version 3";
90 version = pkgs.rsync.version;
91 source.url = "https://github.com/WayneD/rsync";
92 };
93 };
94
95 services.rsyncBackup = {
96 mountpoint = "/backup2";
97 profiles = config.myEnv.rsync_backup.profiles;
98 ssh_key_public = config.secrets.fullPaths."rsync_backup/identity.pub";
99 ssh_key_private = config.secrets.fullPaths."rsync_backup/identity";
100 };
101
102 myServices.mailRelay.enable = true;
103 myServices.mailBackup.enable = true;
104 myServices.monitoring.enable = true;
105 myServices.databasesReplication = {
106 postgresql = {
107 enable = true;
108 base = "/backup2";
109 mainPackage = pkgs.postgresql;
110 hosts = {
111 eldiron = {
112 slot = "backup_2";
113 connection = "postgresql://backup-2:${config.hostEnv.ldap.password}@eldiron.immae.eu";
114 package = pkgs.postgresql;
115 };
116 };
117 };
118 mariadb = {
119 enable = true;
120 base = "/backup2";
121 hosts = {
122 eldiron = {
123 serverId = 2;
124 # mysql resolves "backup-2" host and checks the ip, but uses /etc/hosts which only contains ip4
125 host = lib.head config.myEnv.servers.eldiron.ips.main.ip4;
126 port = config.myEnv.databases.mysql.port;
127 user = "backup-2";
128 password = config.hostEnv.ldap.password;
129 dumpUser = "root";
130 dumpPassword = config.myEnv.databases.mysql.systemUsers.root;
131 };
132 };
133 };
134 redis = {
135 enable = true;
136 base = "/backup2";
137 hosts = {
138 eldiron = {
139 host = "127.0.0.1";
140 port = "16379";
141 };
142 };
143 };
144 openldap = {
145 enable = true;
146 base = "/backup2";
147 hosts = {
148 eldiron = {
149 url = "ldaps://${config.myEnv.ldap.host}:636";
150 dn = config.myEnv.ldap.replication_dn;
151 password = config.myEnv.ldap.replication_pw;
152 base = config.myEnv.ldap.base;
153 };
154 };
155 };
156 };
157
158 # This value determines the NixOS release with which your system is
159 # to be compatible, in order to avoid breaking some software such as
160 # database servers. You should change this only after NixOS release
161 # notes say you should.
162 # https://nixos.org/nixos/manual/release-notes.html
163 system.stateVersion = "23.05"; # Did you read the comment?
164}
diff --git a/systems/backup-2/databases/mariadb_replication.nix b/systems/backup-2/databases/mariadb_replication.nix
new file mode 100644
index 0000000..8d2b457
--- /dev/null
+++ b/systems/backup-2/databases/mariadb_replication.nix
@@ -0,0 +1,271 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.databasesReplication.mariadb;
4in
5{
6 options.myServices.databasesReplication.mariadb = {
7 enable = lib.mkEnableOption "Enable mariadb replication";
8 base = lib.mkOption {
9 type = lib.types.path;
10 description = ''
11 Base path to put the replications
12 '';
13 };
14 hosts = lib.mkOption {
15 default = {};
16 description = ''
17 Hosts to backup
18 '';
19 type = lib.types.attrsOf (lib.types.submodule {
20 options = {
21 package = lib.mkOption {
22 type = lib.types.package;
23 default = pkgs.mariadb;
24 description = ''
25 Mariadb package for this host
26 '';
27 };
28 serverId = lib.mkOption {
29 type = lib.types.int;
30 description = ''
31 Server id to use for replication cluster (must be unique among the cluster!)
32 '';
33 };
34 host = lib.mkOption {
35 type = lib.types.str;
36 description = ''
37 Host to connect to
38 '';
39 };
40 port = lib.mkOption {
41 type = lib.types.int;
42 description = ''
43 Port to connect to
44 '';
45 };
46 user = lib.mkOption {
47 type = lib.types.str;
48 description = ''
49 User to connect as
50 '';
51 };
52 password = lib.mkOption {
53 type = lib.types.str;
54 description = ''
55 Password to use
56 '';
57 };
58 dumpUser = lib.mkOption {
59 type = lib.types.str;
60 description = ''
61 User who can do a dump
62 '';
63 };
64 dumpPassword = lib.mkOption {
65 type = lib.types.str;
66 description = ''
67 Password for the dump user
68 '';
69 };
70 };
71 });
72 };
73 };
74
75 config = lib.mkIf cfg.enable {
76 myServices.chatonsProperties.hostings.mysql-replication = {
77 file.datetime = "2022-08-27T15:00:00";
78 hosting = {
79 name = "Mysql replication";
80 description = "Replication of mysql database";
81 website = "db-1.immae.eu";
82 status.level = "OK";
83 status.description = "OK";
84 registration.load = "OPEN";
85 install.type = "PACKAGE";
86 };
87 software = {
88 name = "MariaDB";
89 website = "https://mariadb.org/";
90 license.url = "https://github.com/MariaDB/server/blob/10.11/COPYING";
91 license.name = "GNU General Public License v2.0";
92 version = pkgs.mariadb.version;
93 source.url = "https://github.com/MariaDB/server";
94 };
95 };
96 users.users.mysql = {
97 description = "MySQL server user";
98 group = "mysql";
99 uid = config.ids.uids.mysql;
100 extraGroups = [ "keys" ];
101 };
102 users.groups.mysql.gid = config.ids.gids.mysql;
103
104 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (name: hcfg: [
105 (lib.nameValuePair "mysql_replication/${name}/slave_init_commands" {
106 user = "mysql";
107 group = "mysql";
108 permissions = "0400";
109 text = ''
110 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;
111 START SLAVE;
112 '';
113 })
114 (lib.nameValuePair "mysql_replication/${name}/mysqldump_remote" {
115 permissions = "0400";
116 user = "root";
117 group = "root";
118 text = ''
119 [mysqldump]
120 user = ${hcfg.user}
121 password = ${hcfg.password}
122 '';
123 })
124 (lib.nameValuePair "mysql_replication/${name}/mysqldump" {
125 permissions = "0400";
126 user = "root";
127 group = "root";
128 text = ''
129 [mysqldump]
130 user = ${hcfg.dumpUser}
131 password = ${hcfg.dumpPassword}
132 '';
133 })
134 (lib.nameValuePair "mysql_replication/${name}/client" {
135 permissions = "0400";
136 user = "mysql";
137 group = "mysql";
138 text = ''
139 [client]
140 user = ${hcfg.dumpUser}
141 password = ${hcfg.dumpPassword}
142 '';
143 })
144 ]) cfg.hosts));
145
146 services.cron = {
147 enable = true;
148 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
149 let
150 dataDir = "${cfg.base}/${name}/mysql";
151 backupDir = "${cfg.base}/${name}/mysql_backup";
152 backup_script = pkgs.writeScript "backup_mysql_${name}" ''
153 #!${pkgs.stdenv.shell}
154
155 set -euo pipefail
156
157 filename=${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).sql
158 ${hcfg.package}/bin/mysqldump \
159 --defaults-file=${config.secrets.fullPaths."mysql_replication/${name}/mysqldump"} \
160 -S /run/mysqld_${name}/mysqld.sock \
161 --gtid \
162 --master-data \
163 --flush-privileges \
164 --ignore-database=netdata \
165 --all-databases > $filename
166 ${pkgs.gzip}/bin/gzip $filename
167 '';
168 u = pkgs.callPackage ./utils.nix {};
169 cleanup_script = pkgs.writeScript "cleanup_mysql_${name}" (u.exponentialDumps "sql.gz" backupDir);
170 in [
171 "0 22,4,10,16 * * * root ${backup_script}"
172 "0 3 * * * root ${cleanup_script}"
173 ]) cfg.hosts);
174 };
175
176 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
177 lib.attrsets.nameValuePair "mysql_replication_${name}" {
178 deps = [ "users" "groups" ];
179 text = ''
180 install -m 0700 -o mysql -g mysql -d ${cfg.base}/${name}/mysql
181 install -m 0700 -o mysql -g mysql -d ${cfg.base}/${name}/mysql_backup
182 '';
183 }) cfg.hosts;
184
185 environment.etc = lib.attrsets.mapAttrs' (name: hcfg:
186 lib.attrsets.nameValuePair "mysql/${name}_my.cnf" {
187 text = ''
188 [mysqld]
189 skip-networking
190 socket = /run/mysqld_${name}/mysqld.sock
191 datadir = ${cfg.base}/${name}/mysql/
192 log-bin = mariadb-bin
193 server-id = ${builtins.toString hcfg.serverId}
194 '';
195 }
196 ) cfg.hosts;
197
198 systemd.services = lib.attrsets.mapAttrs' (name: hcfg:
199 let
200 dataDir = "${cfg.base}/${name}/mysql";
201 in
202 lib.attrsets.nameValuePair "mysql_backup_${name}" {
203 description = "Mysql replication for ${name}";
204 wantedBy = [ "multi-user.target" ];
205 after = [ "network.target" ];
206 restartTriggers = [ config.environment.etc."mysql/${name}_my.cnf".source ];
207 unitConfig.RequiresMountsFor = dataDir;
208
209 preStart = ''
210 if ! test -e ${dataDir}/mysql; then
211 if ! test -e ${dataDir}/initial.sql; then
212 ${hcfg.package}/bin/mysqldump \
213 --defaults-file=${config.secrets.fullPaths."mysql_replication/${name}/mysqldump_remote"} \
214 -h ${hcfg.host} \
215 -P ${builtins.toString hcfg.port} \
216 --ssl \
217 --gtid \
218 --flush-privileges \
219 --master-data \
220 --all-databases > ${dataDir}/initial.sql
221 fi
222
223 ${hcfg.package}/bin/mysql_install_db \
224 --defaults-file=/etc/mysql/${name}_my.cnf \
225 --user=mysql \
226 --datadir=${dataDir} \
227 --basedir=${hcfg.package}
228 fi
229 '';
230
231 serviceConfig = {
232 User = "mysql";
233 Group = "mysql";
234 RuntimeDirectory = "mysqld_${name}";
235 RuntimeDirectoryMode = "0755";
236 SupplementaryGroups = "keys";
237 PermissionsStartOnly = true;
238 Type = "notify";
239
240 ExecStart = "${hcfg.package}/bin/mysqld --defaults-file=/etc/mysql/${name}_my.cnf --user=mysql --datadir=${dataDir} --basedir=${hcfg.package}";
241 ExecStartPost =
242 let
243 sql_before = pkgs.writeText "mysql-initial-before" ''
244 DROP DATABASE test;
245 INSTALL SONAME 'auth_pam';
246 '';
247 setupScript = pkgs.writeScript "mysql-setup" ''
248 #!${pkgs.runtimeShell} -e
249
250 if test -e ${dataDir}/initial.sql; then
251 cat \
252 ${sql_before} \
253 ${dataDir}/initial.sql \
254 ${config.secrets.fullPaths."mysql_replication/${name}/slave_init_commands"} \
255 | ${hcfg.package}/bin/mysql \
256 --defaults-file=/etc/mysql/${name}_my.cnf \
257 -S /run/mysqld_${name}/mysqld.sock \
258 --user=root
259 rm -f ${dataDir}/initial.sql
260 fi
261 '';
262 in
263 "+${setupScript}";
264 # initial dump can take a long time
265 TimeoutStartSec="infinity";
266 TimeoutStopSec = 120;
267 };
268 }) cfg.hosts;
269 };
270}
271
diff --git a/systems/backup-2/databases/openldap_replication.nix b/systems/backup-2/databases/openldap_replication.nix
new file mode 100644
index 0000000..b962224
--- /dev/null
+++ b/systems/backup-2/databases/openldap_replication.nix
@@ -0,0 +1,165 @@
1{ pkgs, config, lib, openldap, ... }:
2let
3 cfg = config.myServices.databasesReplication.openldap;
4 ldapConfig = hcfg: name: pkgs.writeText "slapd.conf" ''
5 include ${pkgs.openldap}/etc/schema/core.schema
6 include ${pkgs.openldap}/etc/schema/cosine.schema
7 include ${pkgs.openldap}/etc/schema/inetorgperson.schema
8 include ${pkgs.openldap}/etc/schema/nis.schema
9 include ${openldap.immae-schema}
10 pidfile /run/slapd_${name}/slapd.pid
11 argsfile /run/slapd_${name}/slapd.args
12
13 moduleload back_mdb
14 backend mdb
15 database mdb
16
17 suffix "${hcfg.base}"
18 rootdn "cn=root,${hcfg.base}"
19 directory ${cfg.base}/${name}/openldap
20
21 index objectClass eq
22 index uid pres,eq
23 index entryUUID eq
24
25 include ${config.secrets.fullPaths."openldap_replication/${name}/replication_config"}
26 '';
27in
28{
29 options.myServices.databasesReplication.openldap = {
30 enable = lib.mkEnableOption "Enable openldap replication";
31 base = lib.mkOption {
32 type = lib.types.path;
33 description = ''
34 Base path to put the replications
35 '';
36 };
37 hosts = lib.mkOption {
38 default = {};
39 description = ''
40 Hosts to backup
41 '';
42 type = lib.types.attrsOf (lib.types.submodule {
43 options = {
44 package = lib.mkOption {
45 type = lib.types.package;
46 default = pkgs.openldap;
47 description = ''
48 Openldap package for this host
49 '';
50 };
51 url = lib.mkOption {
52 type = lib.types.str;
53 description = ''
54 Host to connect to
55 '';
56 };
57 base = lib.mkOption {
58 type = lib.types.str;
59 description = ''
60 Base DN to replicate
61 '';
62 };
63 dn = lib.mkOption {
64 type = lib.types.str;
65 description = ''
66 DN to use
67 '';
68 };
69 password = lib.mkOption {
70 type = lib.types.str;
71 description = ''
72 Password to use
73 '';
74 };
75 };
76 });
77 };
78 };
79
80 config = lib.mkIf cfg.enable {
81 users.users.openldap = {
82 description = "Openldap database user";
83 group = "openldap";
84 uid = config.ids.uids.openldap;
85 extraGroups = [ "keys" ];
86 };
87 users.groups.openldap.gid = config.ids.gids.openldap;
88
89 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (name: hcfg: [
90 (lib.nameValuePair "openldap_replication/${name}/replication_config" {
91 user = "openldap";
92 group = "openldap";
93 permissions = "0400";
94 text = ''
95 syncrepl rid=000
96 provider=${hcfg.url}
97 type=refreshAndPersist
98 searchbase="${hcfg.base}"
99 retry="5 10 300 +"
100 attrs="*,+"
101 schemachecking=off
102 bindmethod=simple
103 binddn="${hcfg.dn}"
104 credentials="${hcfg.password}"
105 '';
106 })
107 (lib.nameValuePair "openldap_replication/${name}/replication_password" {
108 user = "openldap";
109 group = "openldap";
110 permissions = "0400";
111 text = hcfg.password;
112 })
113 ]) cfg.hosts));
114
115 services.cron = {
116 enable = true;
117 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
118 let
119 dataDir = "${cfg.base}/${name}/openldap";
120 backupDir = "${cfg.base}/${name}/openldap_backup";
121 backup_script = pkgs.writeScript "backup_openldap_${name}" ''
122 #!${pkgs.stdenv.shell}
123
124 ${hcfg.package}/bin/slapcat -b "${hcfg.base}" -f ${ldapConfig hcfg name} -l ${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).ldif
125 '';
126 u = pkgs.callPackage ./utils.nix {};
127 cleanup_script = pkgs.writeScript "cleanup_openldap_${name}" (u.exponentialDumps "ldif" backupDir);
128 in [
129 "0 22,4,10,16 * * * root ${backup_script}"
130 "0 3 * * * root ${cleanup_script}"
131 ]) cfg.hosts);
132 };
133
134 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
135 lib.attrsets.nameValuePair "openldap_replication_${name}" {
136 deps = [ "users" "groups" ];
137 text = ''
138 install -m 0700 -o openldap -g openldap -d ${cfg.base}/${name}/openldap
139 install -m 0700 -o openldap -g openldap -d ${cfg.base}/${name}/openldap_backup
140 '';
141 }) cfg.hosts;
142
143 systemd.services = lib.attrsets.mapAttrs' (name: hcfg:
144 let
145 dataDir = "${cfg.base}/${name}/openldap";
146 in
147 lib.attrsets.nameValuePair "openldap_backup_${name}" {
148 description = "Openldap replication for ${name}";
149 wantedBy = [ "multi-user.target" ];
150 after = [ "network.target" ];
151 unitConfig.RequiresMountsFor = dataDir;
152
153 preStart = ''
154 mkdir -p /run/slapd_${name}
155 chown -R "openldap:openldap" /run/slapd_${name}
156 '';
157
158 serviceConfig = {
159 ExecStart = "${hcfg.package}/libexec/slapd -d 0 -u openldap -g openldap -f ${ldapConfig hcfg name}";
160 };
161 }) cfg.hosts;
162 };
163}
164
165
diff --git a/systems/backup-2/databases/postgresql_replication.nix b/systems/backup-2/databases/postgresql_replication.nix
new file mode 100644
index 0000000..5351a4f
--- /dev/null
+++ b/systems/backup-2/databases/postgresql_replication.nix
@@ -0,0 +1,203 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.databasesReplication.postgresql;
4in
5{
6 options.myServices.databasesReplication.postgresql = {
7 enable = lib.mkEnableOption "Enable postgresql replication";
8 base = lib.mkOption {
9 type = lib.types.path;
10 description = ''
11 Base path to put the replications
12 '';
13 };
14 mainPackage = lib.mkOption {
15 type = lib.types.package;
16 default = pkgs.postgresql;
17 description = ''
18 Postgresql package available in shell
19 '';
20 };
21 hosts = lib.mkOption {
22 default = {};
23 description = ''
24 Hosts to backup
25 '';
26 type = lib.types.attrsOf (lib.types.submodule {
27 options = {
28 package = lib.mkOption {
29 type = lib.types.package;
30 default = pkgs.postgresql;
31 description = ''
32 Postgresql package for this host
33 '';
34 };
35 slot = lib.mkOption {
36 type = lib.types.str;
37 description = ''
38 Slot to use for replication
39 '';
40 };
41 connection = lib.mkOption {
42 type = lib.types.str;
43 description = ''
44 Connection string to access the psql master
45 '';
46 };
47 };
48 });
49 };
50 };
51
52 config = lib.mkIf cfg.enable {
53 myServices.chatonsProperties.hostings.postgresql-replication = {
54 file.datetime = "2022-08-27T15:00:00";
55 hosting = {
56 name = "PostgreSQL replication";
57 description = "Replication of PostgreSQL database";
58 website = "db-1.immae.eu";
59 status.level = "OK";
60 status.description = "OK";
61 registration.load = "OPEN";
62 install.type = "PACKAGE";
63 };
64 software = {
65 name = "PostgreSQL";
66 website = "https://www.postgresql.org/";
67 license.url = "https://www.postgresql.org/about/licence/";
68 license.name = "The PostgreSQL Licence";
69 version = pkgs.postgresql.version;
70 source.url = "https://git.postgresql.org/gitweb/?p=postgresql.git;a=summary";
71 };
72 };
73 users.users.postgres = {
74 name = "postgres";
75 uid = config.ids.uids.postgres;
76 group = "postgres";
77 description = "PostgreSQL server user";
78 home = "/var/lib/postgresql";
79 useDefaultShell = true;
80 extraGroups = [ "keys" ];
81 };
82 users.groups.postgres.gid = config.ids.gids.postgres;
83 environment.systemPackages = [ cfg.mainPackage ];
84
85 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (name: hcfg: [
86 (lib.nameValuePair "postgresql_replication/${name}/recovery.conf" {
87 user = "postgres";
88 group = "postgres";
89 permissions = "0400";
90 text = ''
91 standby_mode = on
92 primary_conninfo = '${hcfg.connection}?sslmode=require'
93 primary_slot_name = '${hcfg.slot}'
94 '';
95 })
96 (lib.nameValuePair "postgresql_replication/${name}/connection_string" {
97 user = "postgres";
98 group = "postgres";
99 permissions = "0400";
100 text = hcfg.connection;
101 })
102 (lib.nameValuePair "postgresql_replication/${name}/postgresql.conf" {
103 user = "postgres";
104 group = "postgres";
105 permissions = "0400";
106 text = let
107 dataDir = "${cfg.base}/${name}/postgresql";
108 in ''
109 listen_addresses = '''
110 unix_socket_directories = '${dataDir}'
111 data_directory = '${dataDir}'
112 wal_level = logical
113 max_connections = 300
114 '';
115 })
116 ]) cfg.hosts));
117
118 services.cron = {
119 enable = true;
120 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
121 let
122 dataDir = "${cfg.base}/${name}/postgresql";
123 backupDir = "${cfg.base}/${name}/postgresql_backup";
124 backup_script = pkgs.writeScript "backup_psql_${name}" ''
125 #!${pkgs.stdenv.shell}
126
127 set -euo pipefail
128
129 resume_replication() {
130 ${hcfg.package}/bin/psql -h ${dataDir} -c "SELECT pg_wal_replay_resume();" >/dev/null || echo "impossible to resume replication"
131 }
132
133 trap resume_replication EXIT
134
135 ${hcfg.package}/bin/psql -h ${dataDir} -c "SELECT pg_wal_replay_pause();" >/dev/null || (echo "impossible to pause replication" && false)
136
137 ${hcfg.package}/bin/pg_dumpall -h ${dataDir} -f ${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).sql
138 '';
139 u = pkgs.callPackage ./utils.nix {};
140 cleanup_script = pkgs.writeScript "cleanup_postgresql_${name}" (u.keepLastNDumps "sql" backupDir 6);
141 in [
142 "0 22,4,10,16 * * * postgres ${backup_script}"
143 "0 3 * * * postgres ${cleanup_script}"
144 ]) cfg.hosts);
145 };
146
147 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
148 lib.attrsets.nameValuePair "psql_replication_${name}" {
149 deps = [ "users" ];
150 text = ''
151 install -m 0700 -o postgres -g postgres -d ${cfg.base}/${name}/postgresql
152 install -m 0700 -o postgres -g postgres -d ${cfg.base}/${name}/postgresql_backup
153 '';
154 }) cfg.hosts;
155
156 systemd.services = lib.attrsets.mapAttrs' (name: hcfg:
157 let
158 dataDir = "${cfg.base}/${name}/postgresql";
159 in
160 lib.attrsets.nameValuePair "postgresql_backup_${name}" {
161 description = "Postgresql replication for ${name}";
162 wantedBy = [ "multi-user.target" ];
163 after = [ "network.target" ];
164
165 environment.PGDATA = dataDir;
166 path = [ hcfg.package ];
167
168 preStart = ''
169 if ! test -e ${dataDir}/PG_VERSION; then
170 mkdir -m 0700 -p ${dataDir}
171 chown -R postgres:postgres ${dataDir}
172 fi
173 '';
174 script = let
175 fp = n: config.secrets.fullPaths."postgresql_replication/${name}/${n}";
176 in ''
177 if ! test -e ${dataDir}/PG_VERSION; then
178 pg_basebackup -d $(cat ${fp "connection_string"}) -D ${dataDir} -S ${hcfg.slot}
179 fi
180 ln -sfn ${fp "recovery.conf"} ${dataDir}/recovery.conf
181 ln -sfn ${fp "postgresql.conf"} ${dataDir}/postgresql.conf
182
183 exec postgres
184 '';
185
186 serviceConfig = {
187 ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
188 User = "postgres";
189 Group = "postgres";
190 PermissionsStartOnly = true;
191 RuntimeDirectory = "postgresql";
192 Type = "notify";
193
194 KillSignal = "SIGINT";
195 KillMode = "mixed";
196 # basebackup can take a long time
197 TimeoutStartSec="infinity";
198 TimeoutStopSec = 120;
199 };
200 unitConfig.RequiresMountsFor = dataDir;
201 }) cfg.hosts;
202 };
203}
diff --git a/systems/backup-2/databases/redis_replication.nix b/systems/backup-2/databases/redis_replication.nix
new file mode 100644
index 0000000..53fa904
--- /dev/null
+++ b/systems/backup-2/databases/redis_replication.nix
@@ -0,0 +1,171 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.databasesReplication.redis;
4in
5{
6 options.myServices.databasesReplication.redis = {
7 enable = lib.mkEnableOption "Enable redis replication";
8 base = lib.mkOption {
9 type = lib.types.path;
10 description = ''
11 Base path to put the replications
12 '';
13 };
14 hosts = lib.mkOption {
15 default = {};
16 description = ''
17 Hosts to backup
18 '';
19 type = lib.types.attrsOf (lib.types.submodule {
20 options = {
21 package = lib.mkOption {
22 type = lib.types.package;
23 default = pkgs.redis;
24 description = ''
25 Redis package for this host
26 '';
27 };
28 host = lib.mkOption {
29 type = lib.types.str;
30 description = ''
31 Host to connect to
32 '';
33 };
34 port = lib.mkOption {
35 type = lib.types.str;
36 description = ''
37 Port to connect to
38 '';
39 };
40 password = lib.mkOption {
41 type = lib.types.nullOr lib.types.str;
42 default = null;
43 description = ''
44 Password to use
45 '';
46 };
47 };
48 });
49 };
50 };
51
52 config = lib.mkIf cfg.enable {
53 users.users.redis = {
54 description = "Redis database user";
55 group = "redis";
56 uid = config.ids.uids.redis;
57 extraGroups = [ "keys" ];
58 };
59 users.groups.redis.gid = config.ids.gids.redis;
60
61 services.spiped = { # sync from eldiron
62 enable = true;
63 config.redis = {
64 encrypt = true;
65 source = "127.0.0.1:16379";
66 target = "${lib.head config.myEnv.servers.eldiron.ips.main.ip4}:16379";
67 keyfile = config.secrets.fullPaths."redis/spiped_eldiron_keyfile";
68 };
69 };
70
71 secrets.keys = lib.mapAttrs' (name: hcfg:
72 lib.nameValuePair "redis_replication/${name}/config" {
73 user = "redis";
74 group = "redis";
75 permissions = "0400";
76 text = ''
77 pidfile ${cfg.base}/${name}/redis/redis.pid
78 port 0
79 unixsocket /run/redis_${name}/redis.sock
80 loglevel notice
81 logfile /dev/null
82 syslog-enabled yes
83 databases 16
84 save 900 1
85 save 300 10
86 save 60 10000
87 dbfilename dump.rdb
88 dir ${cfg.base}/${name}/redis/
89 slaveof ${hcfg.host} ${hcfg.port}
90 ${if hcfg.password != null then "masterauth ${hcfg.password}" else ""}
91 appendOnly no
92 appendfsync everysec
93 slowlog-log-slower-than 10000
94 slowlog-max-len 128
95 unixsocketperm 777
96 maxclients 1024
97 '';
98 }
99 ) cfg.hosts // {
100 "redis/spiped_eldiron_keyfile" = { # For eldiron only
101 user = "spiped";
102 group = "spiped";
103 permissions = "0400";
104 text = config.myEnv.databases.redis.spiped_key;
105 };
106 };
107
108 services.cron = {
109 enable = true;
110 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
111 let
112 dataDir = "${cfg.base}/${name}/redis";
113 backupDir = "${cfg.base}/${name}/redis_backup";
114 backup_script = pkgs.writeScript "backup_redis_${name}" ''
115 #!${pkgs.stdenv.shell}
116
117 ${pkgs.coreutils}/bin/cp ${cfg.base}/${name}/redis/dump.rdb \
118 ${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).rdb
119 '';
120 u = pkgs.callPackage ./utils.nix {};
121 cleanup_script = pkgs.writeScript "cleanup_redis_${name}" (u.exponentialDumps "rdb" backupDir);
122 in [
123 "0 22,4,10,16 * * * root ${backup_script}"
124 "0 3 * * * root ${cleanup_script}"
125 ]) cfg.hosts);
126 };
127
128 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
129 lib.attrsets.nameValuePair "redis_replication_${name}" {
130 deps = [ "users" "groups" ];
131 text = ''
132 install -m 0700 -o redis -g redis -d ${cfg.base}/${name}/redis
133 install -m 0700 -o redis -g redis -d ${cfg.base}/${name}/redis_backup
134 '';
135 }) cfg.hosts;
136
137 systemd.services = {
138 spiped_redis = { # For eldiron
139 description = "Secure pipe 'redis'";
140 after = [ "network.target" ];
141 wantedBy = [ "multi-user.target" ];
142
143 serviceConfig = {
144 Restart = "always";
145 User = "spiped";
146 PermissionsStartOnly = true;
147 SupplementaryGroups = "keys";
148 };
149
150 script = "exec ${pkgs.spiped}/bin/spiped -F `cat /etc/spiped/redis.spec`";
151 };
152 } // lib.attrsets.mapAttrs' (name: hcfg:
153 let
154 dataDir = "${cfg.base}/${name}/redis";
155 in
156 lib.attrsets.nameValuePair "redis_backup_${name}" {
157 description = "Redis replication for ${name}";
158 wantedBy = [ "multi-user.target" ];
159 after = [ "network.target" ];
160 unitConfig.RequiresMountsFor = dataDir;
161
162 serviceConfig = {
163 ExecStart = "${hcfg.package}/bin/redis-server ${config.secrets.fullPaths."redis_replication/${name}/config"}";
164 User = "redis";
165 RuntimeDirectory = "redis_${name}";
166 };
167 }) cfg.hosts;
168 };
169}
170
171
diff --git a/systems/backup-2/databases/utils.nix b/systems/backup-2/databases/utils.nix
new file mode 100644
index 0000000..1b3190f
--- /dev/null
+++ b/systems/backup-2/databases/utils.nix
@@ -0,0 +1,30 @@
1{ pkgs }:
2{
3 keepLastNDumps = ext: backupDir: n: ''
4 #!${pkgs.stdenv.shell}
5
6 cd ${backupDir}
7 ${pkgs.coreutils}/bin/rm -f \
8 $(${pkgs.coreutils}/bin/ls -1 *.${ext} \
9 | ${pkgs.coreutils}/bin/sort -r \
10 | ${pkgs.gnused}/bin/sed -e '1,${builtins.toString n}d')
11 '';
12 exponentialDumps = ext: backupDir: let
13 log2rotateSrc = builtins.fetchGit {
14 url = "https://github.com/avian2/pylog2rotate";
15 ref = "master";
16 rev = "061f0564757289d3bea553b16f8fd5c4a0319c5e";
17 };
18 log2rotate = pkgs.writeScript "log2rotate" ''
19 #!${pkgs.python38}/bin/python
20
21 ${builtins.readFile "${log2rotateSrc}/log2rotate.py"}
22 '';
23 in ''
24 #!${pkgs.stdenv.shell}
25
26 cd ${backupDir}
27 ${pkgs.coreutils}/bin/rm -f $(ls -1 *.${ext} | grep -v 'T22:' | sort -r | sed -e '1,12d')
28 ${pkgs.coreutils}/bin/rm -f $(ls -1 *T22*.${ext} | ${log2rotate} --skip 7 --fuzz 7 --delete --format='%Y-%m-%dT%H:%M+00:00.${ext}')
29 '';
30}
diff --git a/systems/backup-2/flake.lock b/systems/backup-2/flake.lock
new file mode 100644
index 0000000..46003ba
--- /dev/null
+++ b/systems/backup-2/flake.lock
@@ -0,0 +1,1159 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_6",
6 "nixpkgs": "nixpkgs_10"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "chatons": {
20 "inputs": {
21 "environment": "environment"
22 },
23 "locked": {
24 "lastModified": 1,
25 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
26 "path": "../../flakes/private/chatons",
27 "type": "path"
28 },
29 "original": {
30 "path": "../../flakes/private/chatons",
31 "type": "path"
32 }
33 },
34 "colmena": {
35 "inputs": {
36 "flake-compat": "flake-compat",
37 "flake-utils": "flake-utils_3",
38 "nixpkgs": "nixpkgs_3",
39 "stable": "stable"
40 },
41 "locked": {
42 "lastModified": 1687954574,
43 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
44 "owner": "immae",
45 "repo": "colmena",
46 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
47 "type": "github"
48 },
49 "original": {
50 "owner": "immae",
51 "ref": "add-lib-get-flake",
52 "repo": "colmena",
53 "type": "github"
54 }
55 },
56 "disko": {
57 "inputs": {
58 "nixpkgs": "nixpkgs_4"
59 },
60 "locked": {
61 "lastModified": 1687968164,
62 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
63 "owner": "nix-community",
64 "repo": "disko",
65 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
66 "type": "github"
67 },
68 "original": {
69 "owner": "nix-community",
70 "repo": "disko",
71 "type": "github"
72 }
73 },
74 "environment": {
75 "locked": {
76 "lastModified": 1,
77 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
78 "path": "../environment",
79 "type": "path"
80 },
81 "original": {
82 "path": "../environment",
83 "type": "path"
84 }
85 },
86 "environment_2": {
87 "locked": {
88 "lastModified": 1,
89 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
90 "path": "../../flakes/private/environment",
91 "type": "path"
92 },
93 "original": {
94 "path": "../../flakes/private/environment",
95 "type": "path"
96 }
97 },
98 "environment_3": {
99 "locked": {
100 "lastModified": 1,
101 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
102 "path": "../environment",
103 "type": "path"
104 },
105 "original": {
106 "path": "../environment",
107 "type": "path"
108 }
109 },
110 "environment_4": {
111 "locked": {
112 "lastModified": 1,
113 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
114 "path": "../environment",
115 "type": "path"
116 },
117 "original": {
118 "path": "../environment",
119 "type": "path"
120 }
121 },
122 "environment_5": {
123 "locked": {
124 "lastModified": 1,
125 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
126 "path": "../environment",
127 "type": "path"
128 },
129 "original": {
130 "path": "../environment",
131 "type": "path"
132 }
133 },
134 "environment_6": {
135 "locked": {
136 "lastModified": 1,
137 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
138 "path": "../environment",
139 "type": "path"
140 },
141 "original": {
142 "path": "../environment",
143 "type": "path"
144 }
145 },
146 "environment_7": {
147 "locked": {
148 "lastModified": 1,
149 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
150 "path": "../environment",
151 "type": "path"
152 },
153 "original": {
154 "path": "../environment",
155 "type": "path"
156 }
157 },
158 "files-watcher": {
159 "locked": {
160 "lastModified": 1,
161 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
162 "path": "../../files-watcher",
163 "type": "path"
164 },
165 "original": {
166 "path": "../../files-watcher",
167 "type": "path"
168 }
169 },
170 "files-watcher_2": {
171 "locked": {
172 "lastModified": 1,
173 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
174 "path": "../../files-watcher",
175 "type": "path"
176 },
177 "original": {
178 "path": "../../files-watcher",
179 "type": "path"
180 }
181 },
182 "files-watcher_3": {
183 "locked": {
184 "lastModified": 1,
185 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
186 "path": "../../files-watcher",
187 "type": "path"
188 },
189 "original": {
190 "path": "../../files-watcher",
191 "type": "path"
192 }
193 },
194 "flake-compat": {
195 "flake": false,
196 "locked": {
197 "lastModified": 1650374568,
198 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
199 "owner": "edolstra",
200 "repo": "flake-compat",
201 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
202 "type": "github"
203 },
204 "original": {
205 "owner": "edolstra",
206 "repo": "flake-compat",
207 "type": "github"
208 }
209 },
210 "flake-parts": {
211 "inputs": {
212 "nixpkgs-lib": "nixpkgs-lib_2"
213 },
214 "locked": {
215 "lastModified": 1687762428,
216 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
217 "owner": "hercules-ci",
218 "repo": "flake-parts",
219 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
220 "type": "github"
221 },
222 "original": {
223 "owner": "hercules-ci",
224 "repo": "flake-parts",
225 "type": "github"
226 }
227 },
228 "flake-parts_2": {
229 "inputs": {
230 "nixpkgs-lib": "nixpkgs-lib_3"
231 },
232 "locked": {
233 "lastModified": 1675295133,
234 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
235 "owner": "hercules-ci",
236 "repo": "flake-parts",
237 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
238 "type": "github"
239 },
240 "original": {
241 "owner": "hercules-ci",
242 "repo": "flake-parts",
243 "type": "github"
244 }
245 },
246 "flake-utils": {
247 "locked": {
248 "lastModified": 1609246779,
249 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
250 "owner": "numtide",
251 "repo": "flake-utils",
252 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
253 "type": "github"
254 },
255 "original": {
256 "owner": "numtide",
257 "repo": "flake-utils",
258 "type": "github"
259 }
260 },
261 "flake-utils_2": {
262 "locked": {
263 "lastModified": 1609246779,
264 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
265 "owner": "numtide",
266 "repo": "flake-utils",
267 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
268 "type": "github"
269 },
270 "original": {
271 "owner": "numtide",
272 "repo": "flake-utils",
273 "type": "github"
274 }
275 },
276 "flake-utils_3": {
277 "locked": {
278 "lastModified": 1659877975,
279 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
280 "owner": "numtide",
281 "repo": "flake-utils",
282 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
283 "type": "github"
284 },
285 "original": {
286 "owner": "numtide",
287 "repo": "flake-utils",
288 "type": "github"
289 }
290 },
291 "flake-utils_4": {
292 "locked": {
293 "lastModified": 1609246779,
294 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
295 "owner": "numtide",
296 "repo": "flake-utils",
297 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
298 "type": "github"
299 },
300 "original": {
301 "owner": "numtide",
302 "repo": "flake-utils",
303 "type": "github"
304 }
305 },
306 "flake-utils_5": {
307 "locked": {
308 "lastModified": 1609246779,
309 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
310 "owner": "numtide",
311 "repo": "flake-utils",
312 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
313 "type": "github"
314 },
315 "original": {
316 "owner": "numtide",
317 "repo": "flake-utils",
318 "type": "github"
319 }
320 },
321 "flake-utils_6": {
322 "locked": {
323 "lastModified": 1667395993,
324 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
325 "owner": "numtide",
326 "repo": "flake-utils",
327 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
328 "type": "github"
329 },
330 "original": {
331 "owner": "numtide",
332 "repo": "flake-utils",
333 "type": "github"
334 }
335 },
336 "loginctl-linger": {
337 "locked": {
338 "lastModified": 1,
339 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
340 "path": "../../flakes/loginctl-linger",
341 "type": "path"
342 },
343 "original": {
344 "path": "../../flakes/loginctl-linger",
345 "type": "path"
346 }
347 },
348 "mail-relay": {
349 "inputs": {
350 "environment": "environment_3",
351 "secrets": "secrets"
352 },
353 "locked": {
354 "lastModified": 1,
355 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
356 "path": "../../flakes/private/mail-relay",
357 "type": "path"
358 },
359 "original": {
360 "path": "../../flakes/private/mail-relay",
361 "type": "path"
362 }
363 },
364 "milters": {
365 "inputs": {
366 "environment": "environment_4",
367 "files-watcher": "files-watcher",
368 "openarc": "openarc",
369 "opendmarc": "opendmarc",
370 "secrets": "secrets_2"
371 },
372 "locked": {
373 "lastModified": 1,
374 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
375 "path": "../../flakes/private/milters",
376 "type": "path"
377 },
378 "original": {
379 "path": "../../flakes/private/milters",
380 "type": "path"
381 }
382 },
383 "monitoring": {
384 "inputs": {
385 "environment": "environment_5",
386 "naemon": "naemon",
387 "nixpkgs-lib": "nixpkgs-lib",
388 "secrets": "secrets_3"
389 },
390 "locked": {
391 "lastModified": 1,
392 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
393 "path": "../../flakes/private/monitoring",
394 "type": "path"
395 },
396 "original": {
397 "path": "../../flakes/private/monitoring",
398 "type": "path"
399 }
400 },
401 "my-lib": {
402 "inputs": {
403 "colmena": "colmena",
404 "disko": "disko",
405 "flake-parts": "flake-parts",
406 "nixos-anywhere": "nixos-anywhere",
407 "nixpkgs": "nixpkgs_6"
408 },
409 "locked": {
410 "lastModified": 1,
411 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
412 "path": "../../flakes/lib",
413 "type": "path"
414 },
415 "original": {
416 "path": "../../flakes/lib",
417 "type": "path"
418 }
419 },
420 "mypackages": {
421 "inputs": {
422 "flake-parts": "flake-parts_2",
423 "nixpkgs": "nixpkgs_11",
424 "webapps-ttrss": "webapps-ttrss"
425 },
426 "locked": {
427 "lastModified": 1,
428 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
429 "path": "../../mypackages",
430 "type": "path"
431 },
432 "original": {
433 "path": "../../mypackages",
434 "type": "path"
435 }
436 },
437 "myuids": {
438 "locked": {
439 "lastModified": 1,
440 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
441 "path": "../myuids",
442 "type": "path"
443 },
444 "original": {
445 "path": "../myuids",
446 "type": "path"
447 }
448 },
449 "myuids_2": {
450 "locked": {
451 "lastModified": 1,
452 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
453 "path": "../myuids",
454 "type": "path"
455 },
456 "original": {
457 "path": "../myuids",
458 "type": "path"
459 }
460 },
461 "myuids_3": {
462 "locked": {
463 "lastModified": 1,
464 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
465 "path": "../../flakes/myuids",
466 "type": "path"
467 },
468 "original": {
469 "path": "../../flakes/myuids",
470 "type": "path"
471 }
472 },
473 "myuids_4": {
474 "locked": {
475 "lastModified": 1,
476 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
477 "path": "../myuids",
478 "type": "path"
479 },
480 "original": {
481 "path": "../myuids",
482 "type": "path"
483 }
484 },
485 "myuids_5": {
486 "locked": {
487 "lastModified": 1,
488 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
489 "path": "../myuids",
490 "type": "path"
491 },
492 "original": {
493 "path": "../myuids",
494 "type": "path"
495 }
496 },
497 "myuids_6": {
498 "locked": {
499 "lastModified": 1,
500 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
501 "path": "../../myuids",
502 "type": "path"
503 },
504 "original": {
505 "path": "../../myuids",
506 "type": "path"
507 }
508 },
509 "naemon": {
510 "locked": {
511 "lastModified": 1,
512 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
513 "path": "../../naemon",
514 "type": "path"
515 },
516 "original": {
517 "path": "../../naemon",
518 "type": "path"
519 }
520 },
521 "nixos-2305": {
522 "locked": {
523 "lastModified": 1687938137,
524 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
525 "owner": "NixOS",
526 "repo": "nixpkgs",
527 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
528 "type": "github"
529 },
530 "original": {
531 "owner": "NixOS",
532 "ref": "release-23.05",
533 "repo": "nixpkgs",
534 "type": "github"
535 }
536 },
537 "nixos-anywhere": {
538 "inputs": {
539 "disko": [
540 "my-lib",
541 "disko"
542 ],
543 "flake-parts": [
544 "my-lib",
545 "flake-parts"
546 ],
547 "nixos-2305": "nixos-2305",
548 "nixos-images": "nixos-images",
549 "nixpkgs": "nixpkgs_5",
550 "treefmt-nix": "treefmt-nix"
551 },
552 "locked": {
553 "lastModified": 1689945193,
554 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
555 "owner": "numtide",
556 "repo": "nixos-anywhere",
557 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
558 "type": "github"
559 },
560 "original": {
561 "owner": "numtide",
562 "repo": "nixos-anywhere",
563 "type": "github"
564 }
565 },
566 "nixos-images": {
567 "inputs": {
568 "nixos-2305": [
569 "my-lib",
570 "nixos-anywhere",
571 "nixos-2305"
572 ],
573 "nixos-unstable": [
574 "my-lib",
575 "nixos-anywhere",
576 "nixpkgs"
577 ]
578 },
579 "locked": {
580 "lastModified": 1686819168,
581 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
582 "owner": "nix-community",
583 "repo": "nixos-images",
584 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
585 "type": "github"
586 },
587 "original": {
588 "owner": "nix-community",
589 "repo": "nixos-images",
590 "type": "github"
591 }
592 },
593 "nixpkgs": {
594 "locked": {
595 "lastModified": 1597943282,
596 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
597 "owner": "NixOS",
598 "repo": "nixpkgs",
599 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
600 "type": "github"
601 },
602 "original": {
603 "owner": "NixOS",
604 "repo": "nixpkgs",
605 "type": "github"
606 }
607 },
608 "nixpkgs-lib": {
609 "locked": {
610 "dir": "lib",
611 "lastModified": 1691269286,
612 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
613 "owner": "NixOS",
614 "repo": "nixpkgs",
615 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
616 "type": "github"
617 },
618 "original": {
619 "dir": "lib",
620 "owner": "NixOS",
621 "repo": "nixpkgs",
622 "type": "github"
623 }
624 },
625 "nixpkgs-lib_2": {
626 "locked": {
627 "dir": "lib",
628 "lastModified": 1685564631,
629 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
630 "owner": "NixOS",
631 "repo": "nixpkgs",
632 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
633 "type": "github"
634 },
635 "original": {
636 "dir": "lib",
637 "owner": "NixOS",
638 "ref": "nixos-unstable",
639 "repo": "nixpkgs",
640 "type": "github"
641 }
642 },
643 "nixpkgs-lib_3": {
644 "locked": {
645 "dir": "lib",
646 "lastModified": 1675183161,
647 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
648 "owner": "NixOS",
649 "repo": "nixpkgs",
650 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
651 "type": "github"
652 },
653 "original": {
654 "dir": "lib",
655 "owner": "NixOS",
656 "ref": "nixos-unstable",
657 "repo": "nixpkgs",
658 "type": "github"
659 }
660 },
661 "nixpkgs_10": {
662 "locked": {
663 "lastModified": 1687502512,
664 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
665 "owner": "NixOS",
666 "repo": "nixpkgs",
667 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
668 "type": "github"
669 },
670 "original": {
671 "owner": "NixOS",
672 "ref": "nixos-unstable",
673 "repo": "nixpkgs",
674 "type": "github"
675 }
676 },
677 "nixpkgs_11": {
678 "locked": {
679 "lastModified": 1646497237,
680 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
681 "owner": "nixos",
682 "repo": "nixpkgs",
683 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
684 "type": "github"
685 },
686 "original": {
687 "owner": "nixos",
688 "repo": "nixpkgs",
689 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
690 "type": "github"
691 }
692 },
693 "nixpkgs_2": {
694 "locked": {
695 "lastModified": 1597943282,
696 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
697 "owner": "NixOS",
698 "repo": "nixpkgs",
699 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
700 "type": "github"
701 },
702 "original": {
703 "owner": "NixOS",
704 "repo": "nixpkgs",
705 "type": "github"
706 }
707 },
708 "nixpkgs_3": {
709 "locked": {
710 "lastModified": 1683408522,
711 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
712 "owner": "NixOS",
713 "repo": "nixpkgs",
714 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
715 "type": "github"
716 },
717 "original": {
718 "owner": "NixOS",
719 "ref": "nixos-unstable",
720 "repo": "nixpkgs",
721 "type": "github"
722 }
723 },
724 "nixpkgs_4": {
725 "locked": {
726 "lastModified": 1687701825,
727 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
728 "owner": "NixOS",
729 "repo": "nixpkgs",
730 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
731 "type": "github"
732 },
733 "original": {
734 "owner": "NixOS",
735 "ref": "nixpkgs-unstable",
736 "repo": "nixpkgs",
737 "type": "github"
738 }
739 },
740 "nixpkgs_5": {
741 "locked": {
742 "lastModified": 1687893427,
743 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
744 "owner": "nixos",
745 "repo": "nixpkgs",
746 "rev": "4b14ab2a916508442e685089672681dff46805be",
747 "type": "github"
748 },
749 "original": {
750 "owner": "nixos",
751 "ref": "nixos-unstable-small",
752 "repo": "nixpkgs",
753 "type": "github"
754 }
755 },
756 "nixpkgs_6": {
757 "locked": {
758 "lastModified": 1648725829,
759 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
760 "owner": "NixOS",
761 "repo": "nixpkgs",
762 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
763 "type": "github"
764 },
765 "original": {
766 "owner": "NixOS",
767 "repo": "nixpkgs",
768 "type": "github"
769 }
770 },
771 "nixpkgs_7": {
772 "locked": {
773 "lastModified": 1693158576,
774 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
775 "owner": "nixos",
776 "repo": "nixpkgs",
777 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
778 "type": "github"
779 },
780 "original": {
781 "owner": "nixos",
782 "ref": "nixos-unstable",
783 "repo": "nixpkgs",
784 "type": "github"
785 }
786 },
787 "nixpkgs_8": {
788 "locked": {
789 "lastModified": 1597943282,
790 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
791 "owner": "NixOS",
792 "repo": "nixpkgs",
793 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
794 "type": "github"
795 },
796 "original": {
797 "owner": "NixOS",
798 "repo": "nixpkgs",
799 "type": "github"
800 }
801 },
802 "nixpkgs_9": {
803 "locked": {
804 "lastModified": 1597943282,
805 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
806 "owner": "NixOS",
807 "repo": "nixpkgs",
808 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
809 "type": "github"
810 },
811 "original": {
812 "owner": "NixOS",
813 "repo": "nixpkgs",
814 "type": "github"
815 }
816 },
817 "openarc": {
818 "inputs": {
819 "flake-utils": "flake-utils",
820 "myuids": "myuids",
821 "nixpkgs": "nixpkgs",
822 "openarc": "openarc_2"
823 },
824 "locked": {
825 "lastModified": 1,
826 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
827 "path": "../../openarc",
828 "type": "path"
829 },
830 "original": {
831 "path": "../../openarc",
832 "type": "path"
833 }
834 },
835 "openarc_2": {
836 "flake": false,
837 "locked": {
838 "lastModified": 1537545083,
839 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
840 "owner": "trusteddomainproject",
841 "repo": "OpenARC",
842 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
843 "type": "github"
844 },
845 "original": {
846 "owner": "trusteddomainproject",
847 "repo": "OpenARC",
848 "type": "github"
849 }
850 },
851 "openarc_3": {
852 "inputs": {
853 "files-watcher": "files-watcher_2",
854 "openarc": "openarc_4",
855 "secrets": "secrets_4"
856 },
857 "locked": {
858 "lastModified": 1,
859 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
860 "path": "../../flakes/private/openarc",
861 "type": "path"
862 },
863 "original": {
864 "path": "../../flakes/private/openarc",
865 "type": "path"
866 }
867 },
868 "openarc_4": {
869 "inputs": {
870 "flake-utils": "flake-utils_4",
871 "myuids": "myuids_4",
872 "nixpkgs": "nixpkgs_8",
873 "openarc": "openarc_5"
874 },
875 "locked": {
876 "lastModified": 1,
877 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
878 "path": "../../openarc",
879 "type": "path"
880 },
881 "original": {
882 "path": "../../openarc",
883 "type": "path"
884 }
885 },
886 "openarc_5": {
887 "flake": false,
888 "locked": {
889 "lastModified": 1537545083,
890 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
891 "owner": "trusteddomainproject",
892 "repo": "OpenARC",
893 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
894 "type": "github"
895 },
896 "original": {
897 "owner": "trusteddomainproject",
898 "repo": "OpenARC",
899 "type": "github"
900 }
901 },
902 "opendmarc": {
903 "inputs": {
904 "flake-utils": "flake-utils_2",
905 "myuids": "myuids_2",
906 "nixpkgs": "nixpkgs_2"
907 },
908 "locked": {
909 "lastModified": 1,
910 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
911 "path": "../../opendmarc",
912 "type": "path"
913 },
914 "original": {
915 "path": "../../opendmarc",
916 "type": "path"
917 }
918 },
919 "opendmarc_2": {
920 "inputs": {
921 "environment": "environment_6",
922 "files-watcher": "files-watcher_3",
923 "opendmarc": "opendmarc_3",
924 "secrets": "secrets_5"
925 },
926 "locked": {
927 "lastModified": 1,
928 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
929 "path": "../../flakes/private/opendmarc",
930 "type": "path"
931 },
932 "original": {
933 "path": "../../flakes/private/opendmarc",
934 "type": "path"
935 }
936 },
937 "opendmarc_3": {
938 "inputs": {
939 "flake-utils": "flake-utils_5",
940 "myuids": "myuids_5",
941 "nixpkgs": "nixpkgs_9"
942 },
943 "locked": {
944 "lastModified": 1,
945 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
946 "path": "../../opendmarc",
947 "type": "path"
948 },
949 "original": {
950 "path": "../../opendmarc",
951 "type": "path"
952 }
953 },
954 "openldap": {
955 "locked": {
956 "lastModified": 1,
957 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
958 "path": "../../flakes/private/openldap",
959 "type": "path"
960 },
961 "original": {
962 "path": "../../flakes/private/openldap",
963 "type": "path"
964 }
965 },
966 "root": {
967 "inputs": {
968 "chatons": "chatons",
969 "environment": "environment_2",
970 "loginctl-linger": "loginctl-linger",
971 "mail-relay": "mail-relay",
972 "milters": "milters",
973 "monitoring": "monitoring",
974 "my-lib": "my-lib",
975 "myuids": "myuids_3",
976 "nixpkgs": "nixpkgs_7",
977 "openarc": "openarc_3",
978 "opendmarc": "opendmarc_2",
979 "openldap": "openldap",
980 "rsync_backup": "rsync_backup",
981 "secrets": "secrets_6",
982 "system": "system"
983 }
984 },
985 "rsync_backup": {
986 "locked": {
987 "lastModified": 1,
988 "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
989 "path": "../../flakes/rsync_backup",
990 "type": "path"
991 },
992 "original": {
993 "path": "../../flakes/rsync_backup",
994 "type": "path"
995 }
996 },
997 "secrets": {
998 "locked": {
999 "lastModified": 1,
1000 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1001 "path": "../../secrets",
1002 "type": "path"
1003 },
1004 "original": {
1005 "path": "../../secrets",
1006 "type": "path"
1007 }
1008 },
1009 "secrets-public": {
1010 "locked": {
1011 "lastModified": 1,
1012 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1013 "path": "../../secrets",
1014 "type": "path"
1015 },
1016 "original": {
1017 "path": "../../secrets",
1018 "type": "path"
1019 }
1020 },
1021 "secrets_2": {
1022 "locked": {
1023 "lastModified": 1,
1024 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1025 "path": "../../secrets",
1026 "type": "path"
1027 },
1028 "original": {
1029 "path": "../../secrets",
1030 "type": "path"
1031 }
1032 },
1033 "secrets_3": {
1034 "locked": {
1035 "lastModified": 1,
1036 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1037 "path": "../../secrets",
1038 "type": "path"
1039 },
1040 "original": {
1041 "path": "../../secrets",
1042 "type": "path"
1043 }
1044 },
1045 "secrets_4": {
1046 "locked": {
1047 "lastModified": 1,
1048 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1049 "path": "../../secrets",
1050 "type": "path"
1051 },
1052 "original": {
1053 "path": "../../secrets",
1054 "type": "path"
1055 }
1056 },
1057 "secrets_5": {
1058 "locked": {
1059 "lastModified": 1,
1060 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1061 "path": "../../secrets",
1062 "type": "path"
1063 },
1064 "original": {
1065 "path": "../../secrets",
1066 "type": "path"
1067 }
1068 },
1069 "secrets_6": {
1070 "locked": {
1071 "lastModified": 1,
1072 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1073 "path": "../../flakes/secrets",
1074 "type": "path"
1075 },
1076 "original": {
1077 "path": "../../flakes/secrets",
1078 "type": "path"
1079 }
1080 },
1081 "stable": {
1082 "locked": {
1083 "lastModified": 1669735802,
1084 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
1085 "owner": "NixOS",
1086 "repo": "nixpkgs",
1087 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
1088 "type": "github"
1089 },
1090 "original": {
1091 "owner": "NixOS",
1092 "ref": "nixos-22.11",
1093 "repo": "nixpkgs",
1094 "type": "github"
1095 }
1096 },
1097 "system": {
1098 "inputs": {
1099 "backports": "backports",
1100 "environment": "environment_7",
1101 "mypackages": "mypackages",
1102 "myuids": "myuids_6",
1103 "secrets-public": "secrets-public"
1104 },
1105 "locked": {
1106 "lastModified": 1,
1107 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
1108 "path": "../../flakes/private/system",
1109 "type": "path"
1110 },
1111 "original": {
1112 "path": "../../flakes/private/system",
1113 "type": "path"
1114 }
1115 },
1116 "treefmt-nix": {
1117 "inputs": {
1118 "nixpkgs": [
1119 "my-lib",
1120 "nixos-anywhere",
1121 "nixpkgs"
1122 ]
1123 },
1124 "locked": {
1125 "lastModified": 1687940979,
1126 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
1127 "owner": "numtide",
1128 "repo": "treefmt-nix",
1129 "rev": "0a4f06c27610a99080b69433873885df82003aae",
1130 "type": "github"
1131 },
1132 "original": {
1133 "owner": "numtide",
1134 "repo": "treefmt-nix",
1135 "type": "github"
1136 }
1137 },
1138 "webapps-ttrss": {
1139 "flake": false,
1140 "locked": {
1141 "lastModified": 1546759381,
1142 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
1143 "ref": "master",
1144 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
1145 "revCount": 9256,
1146 "type": "git",
1147 "url": "https://git.tt-rss.org/fox/tt-rss.git"
1148 },
1149 "original": {
1150 "ref": "master",
1151 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
1152 "type": "git",
1153 "url": "https://git.tt-rss.org/fox/tt-rss.git"
1154 }
1155 }
1156 },
1157 "root": "root",
1158 "version": 7
1159}
diff --git a/systems/backup-2/flake.nix b/systems/backup-2/flake.nix
new file mode 100644
index 0000000..e6807d6
--- /dev/null
+++ b/systems/backup-2/flake.nix
@@ -0,0 +1,51 @@
1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
4
5 my-lib.url = "path:../../flakes/lib";
6
7 openldap.url = "path:../../flakes/private/openldap";
8 monitoring.url = "path:../../flakes/private/monitoring";
9 mail-relay.url = "path:../../flakes/private/mail-relay";
10 milters.url = "path:../../flakes/private/milters";
11 openarc.url = "path:../../flakes/private/openarc";
12 opendmarc.url = "path:../../flakes/private/opendmarc";
13 chatons.url = "path:../../flakes/private/chatons";
14 environment.url = "path:../../flakes/private/environment";
15 system.url = "path:../../flakes/private/system";
16
17 myuids.url = "path:../../flakes/myuids";
18 secrets.url = "path:../../flakes/secrets";
19 rsync_backup.url = "path:../../flakes/rsync_backup";
20 loginctl-linger.url = "path:../../flakes/loginctl-linger";
21 };
22 outputs = inputs@{ self, my-lib, nixpkgs, ...}:
23 my-lib.lib.mkColmenaFlake {
24 name = "backup-2";
25 inherit self nixpkgs;
26 system = "x86_64-linux";
27 targetHost = "95.217.19.143";
28 targetUser = "root";
29 nixosModules = {
30 base = ./base.nix;
31 system = inputs.system.nixosModule;
32 mail-relay = inputs.mail-relay.nixosModule;
33 milters = inputs.milters.nixosModule;
34 openarc = inputs.openarc.nixosModule;
35 opendmarc = inputs.opendmarc.nixosModule;
36 chatons = inputs.chatons.nixosModule;
37 monitoring = inputs.monitoring.nixosModule;
38 environment = inputs.environment.nixosModule;
39
40 myuids = inputs.myuids.nixosModule;
41 secrets = inputs.secrets.nixosModule;
42 rsync_backup = inputs.rsync_backup.nixosModule;
43 loginctl-linger = inputs.loginctl-linger.nixosModule;
44 };
45 moduleArgs = {
46 nixpkgs = inputs.nixpkgs;
47 openldap = inputs.openldap;
48 monitoring = inputs.monitoring;
49 };
50 };
51}
diff --git a/systems/backup-2/mail/relay.nix b/systems/backup-2/mail/relay.nix
new file mode 100644
index 0000000..1b7e25e
--- /dev/null
+++ b/systems/backup-2/mail/relay.nix
@@ -0,0 +1,196 @@
1{ lib, pkgs, config, name, nodes, ... }:
2let
3 getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) (lib.filterAttrs (n: v: v.receive) p.emailPolicies);
4 bydomain = builtins.mapAttrs (n: getDomains) nodes.eldiron.config.myServices.dns.zones;
5 receiving_domains = lib.flatten (builtins.attrValues bydomain);
6in
7{
8 options.myServices.mailBackup.enable = lib.mkEnableOption "enable MX backup services";
9 config = lib.mkIf config.myServices.mailBackup.enable {
10 myServices.mail.milters.enable = true;
11 security.acme.certs."mail" = {
12 postRun = ''
13 systemctl restart postfix.service
14 '';
15 domain = config.hostEnv.fqdn;
16 extraDomainNames = let
17 zonesWithMx = builtins.attrNames (lib.filterAttrs (n: v: v.hasEmail) nodes.eldiron.config.myServices.dns.zones);
18 mxs = map (n: "${config.myEnv.servers."${name}".mx.subdomain}.${n}") zonesWithMx;
19 in mxs;
20 };
21 secrets.keys = {
22 "postfix/mysql_alias_maps" = {
23 user = config.services.postfix.user;
24 group = config.services.postfix.group;
25 permissions = "0440";
26 text = ''
27 # We need to specify that option to trigger ssl connection
28 tls_ciphers = TLSv1.2
29 user = ${config.myEnv.mail.postfix.mysql.user}
30 password = ${config.myEnv.mail.postfix.mysql.password}
31 hosts = ${config.myEnv.mail.postfix.mysql.remoteHost}
32 dbname = ${config.myEnv.mail.postfix.mysql.database}
33 query = SELECT DISTINCT 1
34 FROM forwardings
35 WHERE
36 ((regex = 1 AND '%s' REGEXP CONCAT('^',source,'$') ) OR (regex = 0 AND source = '%s'))
37 AND active = 1
38 AND '%s' NOT IN
39 (
40 SELECT source
41 FROM forwardings_blacklisted
42 WHERE source = '%s'
43 ) UNION
44 SELECT 'devnull@immae.eu'
45 FROM forwardings_blacklisted
46 WHERE source = '%s'
47 '';
48 };
49 "postfix/ldap_mailboxes" = {
50 user = config.services.postfix.user;
51 group = config.services.postfix.group;
52 permissions = "0440";
53 text = ''
54 server_host = ldaps://${config.myEnv.mail.dovecot.ldap.host}:636
55 search_base = ${config.myEnv.mail.dovecot.ldap.base}
56 query_filter = ${config.myEnv.mail.dovecot.ldap.postfix_mailbox_filter}
57 bind_dn = ${config.myEnv.mail.dovecot.ldap.dn}
58 bind_pw = ${config.myEnv.mail.dovecot.ldap.password}
59 result_attribute = immaePostfixAddress
60 result_format = dummy
61 version = 3
62 '';
63 };
64 "postfix/sympa_mailbox_maps" = {
65 user = config.services.postfix.user;
66 group = config.services.postfix.group;
67 permissions = "0440";
68 text = ''
69 hosts = ${config.myEnv.mail.sympa.postgresql.host}
70 user = ${config.myEnv.mail.sympa.postgresql.user}
71 password = ${config.myEnv.mail.sympa.postgresql.password}
72 dbname = ${config.myEnv.mail.sympa.postgresql.database}
73 query = SELECT DISTINCT 1 FROM list_table WHERE '%s' IN (
74 CONCAT(name_list, '@', robot_list),
75 CONCAT(name_list, '-request@', robot_list),
76 CONCAT(name_list, '-editor@', robot_list),
77 CONCAT(name_list, '-unsubscribe@', robot_list),
78 CONCAT(name_list, '-owner@', robot_list),
79 CONCAT('sympa-request@', robot_list),
80 CONCAT('sympa-owner@', robot_list),
81 CONCAT('sympa@', robot_list),
82 CONCAT('listmaster@', robot_list),
83 CONCAT('bounce@', robot_list),
84 CONCAT('abuse-feedback-report@', robot_list)
85 )
86 '';
87 };
88 "postfix/ldap_ejabberd_users_immae_fr" = {
89 user = config.services.postfix.user;
90 group = config.services.postfix.group;
91 permissions = "0440";
92 text = ''
93 server_host = ldaps://${config.myEnv.jabber.ldap.host}:636
94 search_base = ${config.myEnv.jabber.ldap.base}
95 query_filter = ${config.myEnv.jabber.postfix_user_filter}
96 domain = immae.fr
97 bind_dn = ${config.myEnv.jabber.ldap.dn}
98 bind_pw = ${config.myEnv.jabber.ldap.password}
99 result_attribute = immaeXmppUid
100 result_format = ejabberd@localhost
101 version = 3
102 '';
103 };
104 };
105
106 networking.firewall.allowedTCPPorts = [ 25 ];
107
108 users.users."${config.services.postfix.user}".extraGroups = [ "keys" ];
109 services.filesWatcher.postfix = {
110 restart = true;
111 paths = [
112 config.secrets.fullPaths."postfix/mysql_alias_maps"
113 config.secrets.fullPaths."postfix/sympa_mailbox_maps"
114 config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"
115 config.secrets.fullPaths."postfix/ldap_mailboxes"
116 ];
117 };
118 services.postfix = {
119 mapFiles = let
120 virtual_map = {
121 virtual = let
122 cfg = config.myEnv.monitoring.email_check.eldiron;
123 address = "${cfg.mail_address}@${cfg.mail_domain}";
124 aliases = config.myEnv.mail.postfix.common_aliases;
125 in pkgs.writeText "postfix-virtual" (
126 builtins.concatStringsSep "\n" (
127 [ "${address} 1"
128 ] ++
129 map (a: "${a} 1") config.myEnv.mail.postfix.other_aliases ++
130 lib.lists.flatten (map (domain: map (alias: "${alias}@${domain} 1") aliases) receiving_domains)
131 )
132 );
133 };
134 in
135 virtual_map;
136 config = {
137 ### postfix module overrides
138 readme_directory = "${pkgs.postfix}/share/postfix/doc";
139 smtp_tls_CAfile = lib.mkForce "";
140 smtp_tls_cert_file = lib.mkForce "";
141 smtp_tls_key_file = lib.mkForce "";
142
143 message_size_limit = "1073741824"; # Don't put 0 here, it's not equivalent to "unlimited"
144 mailbox_size_limit = "1073741825"; # Workaround, local delivered mails should all go through scripts
145 alias_database = "\$alias_maps";
146
147 ### Relay domains
148 relay_domains = receiving_domains;
149 relay_recipient_maps = let
150 virtual_alias_maps = [
151 "hash:/etc/postfix/virtual"
152 "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}"
153 "ldap:${config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"}"
154 ];
155 virtual_mailbox_maps = [
156 "ldap:${config.secrets.fullPaths."postfix/ldap_mailboxes"}"
157 "pgsql:${config.secrets.fullPaths."postfix/sympa_mailbox_maps"}"
158 ];
159 in
160 virtual_alias_maps ++ virtual_mailbox_maps;
161 smtpd_relay_restrictions = [
162 "defer_unauth_destination"
163 ];
164
165 ### Additional smtpd configuration
166 smtpd_tls_received_header = "yes";
167 smtpd_tls_loglevel = "1";
168
169 ### Email sending configuration
170 smtp_tls_security_level = "may";
171 smtp_tls_loglevel = "1";
172
173 ### Force ip bind for smtp
174 smtp_bind_address = builtins.head config.myEnv.servers."${name}".ips.main.ip4;
175 smtp_bind_address6 = builtins.head config.myEnv.servers."${name}".ips.main.ip6;
176
177 smtpd_milters = [
178 "unix:${config.myServices.mail.milters.sockets.opendkim}"
179 "unix:${config.myServices.mail.milters.sockets.openarc}"
180 "unix:${config.myServices.mail.milters.sockets.opendmarc}"
181 ];
182 };
183 enable = true;
184 enableSmtp = true;
185 enableSubmission = false;
186 destination = ["localhost"];
187 # This needs to reverse DNS
188 hostname = config.hostEnv.fqdn;
189 setSendmail = false;
190 sslCert = "/var/lib/acme/mail/fullchain.pem";
191 sslKey = "/var/lib/acme/mail/key.pem";
192 recipientDelimiter = "+";
193 };
194 };
195}
196
diff --git a/systems/backup-2/monitoring.nix b/systems/backup-2/monitoring.nix
new file mode 100644
index 0000000..6d769e3
--- /dev/null
+++ b/systems/backup-2/monitoring.nix
@@ -0,0 +1,117 @@
1{ config, pkgs, lib, name, openldap, monitoring, ... }:
2let
3 hostFQDN = config.hostEnv.fqdn;
4 emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
5in
6{
7 config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "file_date" "mysql" "openldap" "redis" "emails" "notify-secondary"];
8 config.myServices.monitoring.objects = lib.mkMerge [
9 (monitoring.lib.objectsCommon {
10 inherit hostFQDN;
11 hostName = name;
12 master = false;
13 processWarn = "60"; processAlert = "70";
14 loadWarn = "4.0"; loadAlert = "6.0";
15 load15Warn = "1.0"; load15Alert = "1.0";
16 interface = builtins.head (builtins.attrNames config.networking.interfaces);
17 })
18
19 {
20 service = [
21 (emailCheck "backup-2" hostFQDN // {
22 __passive_servicegroups = "webstatus-email";
23 })
24 {
25 service_description = "Size on /backup2 partition";
26 use = "local-service";
27 check_command = ["check_local_disk" "10%" "5%" "/backup2"];
28 __passive_servicegroups = "webstatus-resources";
29 }
30 {
31 service_description = "Last backup in /backup2/phare is not too old";
32 use = "local-service";
33 check_command = ["check_last_file_date" "/backup2/phare" "14" "backup"];
34 __passive_servicegroups = "webstatus-backup";
35 }
36 {
37 service_description = "Last backup in /backup2/dilion is not too old";
38 use = "local-service";
39 check_command = ["check_last_file_date" "/backup2/dilion" "14" "backup"];
40 __passive_servicegroups = "webstatus-backup";
41 }
42 {
43 service_description = "Last backup in /backup2/ulminfo is not too old";
44 use = "local-service";
45 check_command = ["check_last_file_date" "/backup2/ulminfo" "14" "backup"];
46 __passive_servicegroups = "webstatus-backup";
47 }
48 {
49 service_description = "Last postgresql dump in /backup2/eldiron/postgresql_backup is not too old";
50 use = "local-service";
51 check_command = ["check_last_file_date" "/backup2/eldiron/postgresql_backup" "7" "postgres"];
52 __passive_servicegroups = "webstatus-databases,webstatus-backup";
53 }
54 {
55 service_description = "Redis replication for eldiron is up to date";
56 use = "local-service";
57 check_command = ["check_redis_replication" "/run/redis_eldiron/redis.sock"];
58 __passive_servicegroups = "webstatus-databases";
59 }
60 {
61 service_description = "Last redis dump in /backup2/eldiron/redis_backup is not too old";
62 use = "local-service";
63 check_command = ["check_last_file_date" "/backup2/eldiron/redis_backup" "7" "redis"];
64 __passive_servicegroups = "webstatus-databases,webstatus-backup";
65 }
66 {
67 service_description = "Mysql replication for eldiron is up to date";
68 use = "local-service";
69 check_command = ["check_mysql_replication" "/run/mysqld_eldiron/mysqld.sock" config.secrets.fullPaths."mysql_replication/eldiron/client"];
70 __passive_servicegroups = "webstatus-databases";
71 }
72 {
73 service_description = "Last mysql dump in /backup2/eldiron/mysql_backup is not too old";
74 use = "local-service";
75 check_command = ["check_last_file_date" "/backup2/eldiron/mysql_backup" "7" "mysql"];
76 __passive_servicegroups = "webstatus-databases,webstatus-backup";
77 }
78 {
79 service_description = "Openldap replication for eldiron is up to date";
80 use = "local-service";
81 check_command = let
82 name = "eldiron";
83 hcfg = config.myServices.databasesReplication.openldap.hosts.eldiron;
84 base = config.myServices.databasesReplication.openldap.base;
85 ldapConfig = pkgs.writeText "slapd.conf" ''
86 include ${pkgs.openldap}/etc/schema/core.schema
87 include ${pkgs.openldap}/etc/schema/cosine.schema
88 include ${pkgs.openldap}/etc/schema/inetorgperson.schema
89 include ${pkgs.openldap}/etc/schema/nis.schema
90 include ${openldap.immae-schema}
91 moduleload back_mdb
92 backend mdb
93 database mdb
94
95 suffix "${hcfg.base}"
96 directory ${base}/${name}/openldap
97 '';
98 in [
99 "check_openldap_replication"
100 hcfg.url
101 hcfg.dn
102 config.secrets.fullPaths."openldap_replication/eldiron/replication_password"
103 hcfg.base
104 "${ldapConfig}"
105 ];
106 __passive_servicegroups = "webstatus-databases";
107 }
108 {
109 service_description = "Last openldap dump in /backup2/eldiron/openldap_backup is not too old";
110 use = "local-service";
111 check_command = ["check_last_file_date" "/backup2/eldiron/openldap_backup" "7" "openldap"];
112 __passive_servicegroups = "webstatus-databases,webstatus-backup";
113 }
114 ];
115 }
116 ];
117}
diff --git a/systems/dilion/base.nix b/systems/dilion/base.nix
new file mode 100644
index 0000000..ac4bdaf
--- /dev/null
+++ b/systems/dilion/base.nix
@@ -0,0 +1,309 @@
1{ config, pkgs, name, lib, pkgs-no-overlay, secrets, ... }:
2{
3 # ssh-keyscan dilion | nix-shell -p ssh-to-age --run ssh-to-age
4 secrets.ageKeys = [ "age1x49n6qa0arkdpq8530s7umgm0gqkq90exv4jep97q30rfnzknpaqate06a" ];
5 boot = {
6 loader = {
7 grub = {
8 devices = [ "/dev/sda" "/dev/sdb" "/dev/sdc" "/dev/sdd" ];
9 };
10 timeout = 1;
11 };
12 blacklistedKernelModules = [ "nvidiafb" ];
13 supportedFilesystems = [ "zfs" ];
14 kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
15 kernelModules = [ "kvm-intel" ];
16 initrd.availableKernelModules = [ "ahci" "sd_mod" ];
17 initrd.secrets = {
18 "/boot/pass.key" = "/boot/pass.key";
19 };
20 kernel.sysctl."vm.nr_hugepages" = 256; # for xmr-stak
21 # available in nixos-20.09
22 #zfs.requestEncryptionCredentials = [ "zpool/root" ];
23 };
24 powerManagement.cpuFreqGovernor = "powersave";
25 hardware.enableRedistributableFirmware = true;
26
27 swapDevices = [ { label = "swap"; } ];
28 fileSystems = {
29 "/" = { fsType = "zfs"; device = "zpool/root"; };
30 "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/fd1c511e-2bc0-49d5-b8bb-95e7e8c8c816"; };
31 "/etc" = { fsType = "zfs"; device = "zpool/root/etc"; };
32 "/home" = { fsType = "zfs"; device = "zpool/root/home"; };
33 "/home/immae" = { fsType = "zfs"; device = "zpool/root/home/immae"; };
34 "/tmp" = { fsType = "zfs"; device = "zpool/root/tmp"; };
35 "/var" = { fsType = "zfs"; device = "zpool/root/var"; };
36 "/data" = { fsType = "ext4"; label = "data"; };
37 "/nix" = { fsType = "ext4"; label = "nix"; };
38 };
39
40 services.udev.extraRules = ''
41 ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="10:bf:48:7f:e6:3b", NAME="eth0"
42 '';
43
44 nixpkgs.config.permittedInsecurePackages = [
45 "python-2.7.18.6" # for nagios-cli
46 ];
47
48 networking = {
49 hostId = "27c3048d"; # generated with head -c4 /dev/urandom | od -A none -t x4
50 firewall.enable = false;
51 interfaces."eth0".ipv4.addresses =
52 [ { address = lib.head config.hostEnv.ips.main.ip4; prefixLength = 27; } ]
53 ++ pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
54 (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or []))
55 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips));
56 interfaces."eth0".ipv6.addresses =
57 [ { address = "2a01:4f8:141:53e7::"; prefixLength = 64; } ]
58 ++ pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
59 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
60 config.hostEnv.ips);
61 defaultGateway = { address = "176.9.10.225"; interface = "eth0"; };
62 defaultGateway6 = { address = "fe80::1"; interface = "eth0"; };
63 nameservers = [
64 "213.133.98.98"
65 "213.133.99.99"
66 "213.133.100.100"
67 "2a01:4f8:0:a0a1::add:1010"
68 "2a01:4f8:0:a102::add:9999"
69 "2a01:4f8:0:a111::add:9898"
70 ];
71 };
72
73 myServices.ssh.modules.regular.snippet = builtins.readFile ./ssh_ldap_regular.sh;
74
75 imports = [
76 secrets.nixosModules.users-config-dilion
77 ./monitoring.nix
78 ./vms.nix
79 ];
80
81 myServices.vms.libvirt-guests = {
82 buildbot = {
83 pool = "zfspool";
84 network = "immae";
85 cpus = 1;
86 memory = 3;
87 diskSize = 10;
88 destroyVolumeOnExit = true;
89 };
90 };
91 myServices.vms.libvirt-images = {
92 nixos = ./vms/base_configuration.nix;
93 buildbot = ./vms/buildbot_configuration.nix;
94 };
95 myServices.vms.libvirt-networks.immae = {
96 bridgeNumber = 1;
97 ipRange = "192.168.100";
98 };
99 myServices.vms.libvirt-pools = {
100 niximages = {
101 type = "dir";
102 target = "/etc/libvirtd/base-images";
103 };
104 buildbot-disks = rec {
105 type = "dir";
106 target = "/var/lib/libvirt/images/buildbot-disks";
107 preStart = ''
108 mkdir -p ${target}
109 '';
110 };
111 zfspool = {
112 # pool-define-as --name zfspool --source-name zpool/libvirt --type zfs
113 type = "zfs";
114 xml = ''
115 <source>
116 <name>zpool/libvirt</name>
117 </source>
118 '';
119 };
120 };
121
122 system.nssModules = [ pkgs.libvirt ];
123 system.nssDatabases.hosts = lib.mkForce [ "files" "libvirt_guest" "mymachines" "dns" "myhostname" ];
124 programs.zsh.enable = true;
125
126 users.users.libvirt = {
127 hashedPassword = "!";
128 shell = pkgs.bashInteractive;
129 isSystemUser = true;
130 group = "libvirtd";
131 packages = [ pkgs.libressl.nc ];
132 openssh.authorizedKeys.keys = [
133 config.myEnv.buildbot.ssh_key.public
134 config.myEnv.sshd.rootKeys.ismael_flony
135 ];
136 };
137
138 users.groups.backup = {};
139 users.users.backup = {
140 hashedPassword = "!";
141 isSystemUser = true;
142 extraGroups = [ "keys" ];
143 group = "backup";
144 shell = pkgs.bashInteractive;
145 openssh.authorizedKeys.keys = let
146 zreplConfig = "/etc/zrepl/zrepl.yml";
147 in
148 ["command=\"${pkgs.zrepl}/bin/zrepl stdinserver --config ${zreplConfig} eldiron\",restrict ${config.myEnv.zrepl_backup.ssh_key.public}"];
149 };
150 security.sudo.extraRules = pkgs.lib.mkAfter [
151 {
152 commands = [
153 { command = "/home/immae/.nix-profile/root_scripts/*"; options = [ "NOPASSWD" ]; }
154 ];
155 users = [ "immae" ];
156 runAs = "root";
157 }
158 ];
159
160 virtualisation.docker.enable = true;
161 virtualisation.docker.storageDriver = "zfs";
162 virtualisation.libvirtd.enable = true;
163 virtualisation.libvirtd.qemu.package = pkgs-no-overlay.qemu;
164 systemd.services.libvirtd.path = lib.mkAfter [ config.boot.zfs.package ];
165 users.groups.immae = {};
166 users.extraUsers.immae.extraGroups = [ "immae" "libvirtd" "docker" ];
167 systemd.services.libvirtd.postStart = ''
168 install -m 0770 -g libvirtd -d /var/lib/libvirt/images
169 '';
170
171 time.timeZone = "Europe/Paris";
172 nix = {
173 settings = {
174 sandbox = "relaxed";
175 max-jobs = 8;
176 substituters = [ "https://hydra.iohk.io" "https://cache.nixos.org" ];
177 trusted-public-keys = [ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" ];
178 trusted-users = [ "root" "@wheel"] ;
179 };
180 extraOptions = ''
181 keep-outputs = true
182 keep-derivations = true
183 allow-unsafe-native-code-during-evaluation = true
184 experimental-features = nix-command flakes
185 #Assumed in NUR
186 allow-import-from-derivation = true
187 '';
188 };
189
190 security.pki.certificateFiles = [
191 (pkgs.fetchurl {
192 url = "http://downloads.e.eriomem.net/eriomemca.pem";
193 sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh";
194 })
195 ];
196
197 myServices.monitoring.enable = true;
198 security.acme.certs."${name}-immae" = {
199 group = "immae";
200 domain = "dilion.immae.eu";
201 };
202 security.acme.certs."${name}" = {
203 group = config.services.nginx.group;
204 extraDomainNames = [
205 "dilion.immae.dev"
206 ];
207 };
208 systemd.services.nginx.serviceConfig.ProtectHome = "read-only";
209 services.nginx = {
210 enable = true;
211 recommendedOptimisation = true;
212 recommendedGzipSettings = true;
213 recommendedProxySettings = true;
214 virtualHosts = {
215 "dilion.immae.dev" = {
216 acmeRoot = config.security.acme.defaults.webroot;
217 useACMEHost = name;
218 forceSSL = true;
219 locations."/".root = "/home/immae/www";
220 };
221 };
222 };
223
224 secrets.keys = {
225 "zrepl/${name}.key" = {
226 permissions = "0400";
227 text = config.myEnv.zrepl_backup.certs."${name}".key;
228 user = "backup";
229 group = "root";
230 };
231 } // builtins.listToAttrs (map (x: lib.attrsets.nameValuePair "zrepl/certificates/${x}.crt" {
232 permissions = "0400";
233 text = config.myEnv.zrepl_backup.certs."${x}".certificate;
234 user = "backup";
235 group = "root";
236 }) (builtins.attrNames config.myEnv.zrepl_backup.certs));
237
238 environment.etc."mdadm.conf" = {
239 enable = true;
240 mode = "0644";
241 user = "root";
242 text = "MAILADDR ${config.myEnv.monitoring.email}";
243 };
244
245
246 systemd.services.zrepl.serviceConfig.User = "backup";
247 systemd.services.zrepl.path = [ pkgs.openssh ];
248 # pour eldiron:
249 # zfs allow backup create,mount,receive,destroy,rename,snapshot,hold,bookmark,release zpool/backup
250 # pour flony:
251 # zfs allow backup hold,release,bookmark,snapshot,send zpool
252 services.zrepl = {
253 enable = true;
254 settings = {
255 global.control.sockpath = "/run/zrepl/control";
256 global.serve.stdinserver.sockdir = "/run/zrepl/stdinserver";
257 jobs = [
258 {
259 type = "sink";
260 # must not change
261 name = "backup-from-eldiron";
262 root_fs = "zpool/backup";
263 serve.type = "tls";
264 serve.listen = ":19000";
265 serve.ca = config.secrets.fullPaths."zrepl/certificates/eldiron.crt";
266 serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt";
267 serve.key = config.secrets.fullPaths."zrepl/dilion.key";
268 serve.client_cns = [ "eldiron" ];
269 }
270 {
271 type = "source";
272 # must not change
273 name = "backup-to-wd-zpool";
274 # not encrypted!
275 serve.type = "tls";
276 serve.listen = ":19001";
277 serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt";
278 serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt";
279 serve.key = config.secrets.fullPaths."zrepl/dilion.key";
280 serve.client_cns = [ "flony" ];
281 filesystems."zpool/libvirt<" = true;
282 filesystems."zpool/root<" = true;
283 snapshotting.type = "manual";
284 }
285 {
286 type = "source";
287 # must not change
288 name = "backup-to-wd-zpool-docker";
289 # not encrypted!
290 serve.type = "tls";
291 serve.listen = ":19002";
292 serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt";
293 serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt";
294 serve.key = config.secrets.fullPaths."zrepl/dilion.key";
295 serve.client_cns = [ "flony" ];
296 filesystems."zpool/docker<" = true;
297 snapshotting.type = "manual";
298 }
299 ];
300 };
301 };
302 # This value determines the NixOS release with which your system is
303 # to be compatible, in order to avoid breaking some software such as
304 # database servers. You should change this only after NixOS release
305 # notes say you should.
306 # https://nixos.org/nixos/manual/release-notes.html
307 system.stateVersion = "23.05"; # Did you read the comment?
308}
309
diff --git a/systems/dilion/flake.lock b/systems/dilion/flake.lock
new file mode 100644
index 0000000..6da2d47
--- /dev/null
+++ b/systems/dilion/flake.lock
@@ -0,0 +1,695 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_2",
6 "nixpkgs": "nixpkgs_6"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "colmena": {
20 "inputs": {
21 "flake-compat": "flake-compat",
22 "flake-utils": "flake-utils",
23 "nixpkgs": "nixpkgs",
24 "stable": "stable"
25 },
26 "locked": {
27 "lastModified": 1687954574,
28 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
29 "owner": "immae",
30 "repo": "colmena",
31 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
32 "type": "github"
33 },
34 "original": {
35 "owner": "immae",
36 "ref": "add-lib-get-flake",
37 "repo": "colmena",
38 "type": "github"
39 }
40 },
41 "disko": {
42 "inputs": {
43 "nixpkgs": "nixpkgs_2"
44 },
45 "locked": {
46 "lastModified": 1687968164,
47 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
48 "owner": "nix-community",
49 "repo": "disko",
50 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
51 "type": "github"
52 },
53 "original": {
54 "owner": "nix-community",
55 "repo": "disko",
56 "type": "github"
57 }
58 },
59 "environment": {
60 "locked": {
61 "lastModified": 1,
62 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
63 "path": "../../flakes/private/environment",
64 "type": "path"
65 },
66 "original": {
67 "path": "../../flakes/private/environment",
68 "type": "path"
69 }
70 },
71 "environment_2": {
72 "locked": {
73 "lastModified": 1,
74 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
75 "path": "../environment",
76 "type": "path"
77 },
78 "original": {
79 "path": "../environment",
80 "type": "path"
81 }
82 },
83 "environment_3": {
84 "locked": {
85 "lastModified": 1,
86 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
87 "path": "../environment",
88 "type": "path"
89 },
90 "original": {
91 "path": "../environment",
92 "type": "path"
93 }
94 },
95 "environment_4": {
96 "locked": {
97 "lastModified": 1,
98 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
99 "path": "../environment",
100 "type": "path"
101 },
102 "original": {
103 "path": "../environment",
104 "type": "path"
105 }
106 },
107 "files-watcher": {
108 "locked": {
109 "lastModified": 1,
110 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
111 "path": "../../flakes/files-watcher",
112 "type": "path"
113 },
114 "original": {
115 "path": "../../flakes/files-watcher",
116 "type": "path"
117 }
118 },
119 "flake-compat": {
120 "flake": false,
121 "locked": {
122 "lastModified": 1650374568,
123 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
124 "owner": "edolstra",
125 "repo": "flake-compat",
126 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
127 "type": "github"
128 },
129 "original": {
130 "owner": "edolstra",
131 "repo": "flake-compat",
132 "type": "github"
133 }
134 },
135 "flake-parts": {
136 "inputs": {
137 "nixpkgs-lib": "nixpkgs-lib_2"
138 },
139 "locked": {
140 "lastModified": 1687762428,
141 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
142 "owner": "hercules-ci",
143 "repo": "flake-parts",
144 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
145 "type": "github"
146 },
147 "original": {
148 "owner": "hercules-ci",
149 "repo": "flake-parts",
150 "type": "github"
151 }
152 },
153 "flake-parts_2": {
154 "inputs": {
155 "nixpkgs-lib": "nixpkgs-lib_3"
156 },
157 "locked": {
158 "lastModified": 1675295133,
159 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
160 "owner": "hercules-ci",
161 "repo": "flake-parts",
162 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
163 "type": "github"
164 },
165 "original": {
166 "owner": "hercules-ci",
167 "repo": "flake-parts",
168 "type": "github"
169 }
170 },
171 "flake-utils": {
172 "locked": {
173 "lastModified": 1659877975,
174 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
175 "owner": "numtide",
176 "repo": "flake-utils",
177 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
178 "type": "github"
179 },
180 "original": {
181 "owner": "numtide",
182 "repo": "flake-utils",
183 "type": "github"
184 }
185 },
186 "flake-utils_2": {
187 "locked": {
188 "lastModified": 1667395993,
189 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
190 "owner": "numtide",
191 "repo": "flake-utils",
192 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
193 "type": "github"
194 },
195 "original": {
196 "owner": "numtide",
197 "repo": "flake-utils",
198 "type": "github"
199 }
200 },
201 "loginctl-linger": {
202 "locked": {
203 "lastModified": 1,
204 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
205 "path": "../../flakes/loginctl-linger",
206 "type": "path"
207 },
208 "original": {
209 "path": "../../flakes/loginctl-linger",
210 "type": "path"
211 }
212 },
213 "monitoring": {
214 "inputs": {
215 "environment": "environment_2",
216 "naemon": "naemon",
217 "nixpkgs-lib": "nixpkgs-lib",
218 "secrets": "secrets"
219 },
220 "locked": {
221 "lastModified": 1,
222 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
223 "path": "../../flakes/private/monitoring",
224 "type": "path"
225 },
226 "original": {
227 "path": "../../flakes/private/monitoring",
228 "type": "path"
229 }
230 },
231 "my-lib": {
232 "inputs": {
233 "colmena": "colmena",
234 "disko": "disko",
235 "flake-parts": "flake-parts",
236 "nixos-anywhere": "nixos-anywhere",
237 "nixpkgs": "nixpkgs_4"
238 },
239 "locked": {
240 "lastModified": 1,
241 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
242 "path": "../../flakes/lib",
243 "type": "path"
244 },
245 "original": {
246 "path": "../../flakes/lib",
247 "type": "path"
248 }
249 },
250 "mypackages": {
251 "inputs": {
252 "flake-parts": "flake-parts_2",
253 "nixpkgs": "nixpkgs_7",
254 "webapps-ttrss": "webapps-ttrss"
255 },
256 "locked": {
257 "lastModified": 1,
258 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
259 "path": "../../mypackages",
260 "type": "path"
261 },
262 "original": {
263 "path": "../../mypackages",
264 "type": "path"
265 }
266 },
267 "myuids": {
268 "locked": {
269 "lastModified": 1,
270 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
271 "path": "../../flakes/myuids",
272 "type": "path"
273 },
274 "original": {
275 "path": "../../flakes/myuids",
276 "type": "path"
277 }
278 },
279 "myuids_2": {
280 "locked": {
281 "lastModified": 1,
282 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
283 "path": "../../myuids",
284 "type": "path"
285 },
286 "original": {
287 "path": "../../myuids",
288 "type": "path"
289 }
290 },
291 "naemon": {
292 "locked": {
293 "lastModified": 1,
294 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
295 "path": "../../naemon",
296 "type": "path"
297 },
298 "original": {
299 "path": "../../naemon",
300 "type": "path"
301 }
302 },
303 "nixos-2305": {
304 "locked": {
305 "lastModified": 1687938137,
306 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
307 "owner": "NixOS",
308 "repo": "nixpkgs",
309 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
310 "type": "github"
311 },
312 "original": {
313 "owner": "NixOS",
314 "ref": "release-23.05",
315 "repo": "nixpkgs",
316 "type": "github"
317 }
318 },
319 "nixos-anywhere": {
320 "inputs": {
321 "disko": [
322 "my-lib",
323 "disko"
324 ],
325 "flake-parts": [
326 "my-lib",
327 "flake-parts"
328 ],
329 "nixos-2305": "nixos-2305",
330 "nixos-images": "nixos-images",
331 "nixpkgs": "nixpkgs_3",
332 "treefmt-nix": "treefmt-nix"
333 },
334 "locked": {
335 "lastModified": 1689945193,
336 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
337 "owner": "numtide",
338 "repo": "nixos-anywhere",
339 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
340 "type": "github"
341 },
342 "original": {
343 "owner": "numtide",
344 "repo": "nixos-anywhere",
345 "type": "github"
346 }
347 },
348 "nixos-images": {
349 "inputs": {
350 "nixos-2305": [
351 "my-lib",
352 "nixos-anywhere",
353 "nixos-2305"
354 ],
355 "nixos-unstable": [
356 "my-lib",
357 "nixos-anywhere",
358 "nixpkgs"
359 ]
360 },
361 "locked": {
362 "lastModified": 1686819168,
363 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
364 "owner": "nix-community",
365 "repo": "nixos-images",
366 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
367 "type": "github"
368 },
369 "original": {
370 "owner": "nix-community",
371 "repo": "nixos-images",
372 "type": "github"
373 }
374 },
375 "nixpkgs": {
376 "locked": {
377 "lastModified": 1683408522,
378 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
379 "owner": "NixOS",
380 "repo": "nixpkgs",
381 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
382 "type": "github"
383 },
384 "original": {
385 "owner": "NixOS",
386 "ref": "nixos-unstable",
387 "repo": "nixpkgs",
388 "type": "github"
389 }
390 },
391 "nixpkgs-lib": {
392 "locked": {
393 "dir": "lib",
394 "lastModified": 1691269286,
395 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
396 "owner": "NixOS",
397 "repo": "nixpkgs",
398 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
399 "type": "github"
400 },
401 "original": {
402 "dir": "lib",
403 "owner": "NixOS",
404 "repo": "nixpkgs",
405 "type": "github"
406 }
407 },
408 "nixpkgs-lib_2": {
409 "locked": {
410 "dir": "lib",
411 "lastModified": 1685564631,
412 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
413 "owner": "NixOS",
414 "repo": "nixpkgs",
415 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
416 "type": "github"
417 },
418 "original": {
419 "dir": "lib",
420 "owner": "NixOS",
421 "ref": "nixos-unstable",
422 "repo": "nixpkgs",
423 "type": "github"
424 }
425 },
426 "nixpkgs-lib_3": {
427 "locked": {
428 "dir": "lib",
429 "lastModified": 1675183161,
430 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
431 "owner": "NixOS",
432 "repo": "nixpkgs",
433 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
434 "type": "github"
435 },
436 "original": {
437 "dir": "lib",
438 "owner": "NixOS",
439 "ref": "nixos-unstable",
440 "repo": "nixpkgs",
441 "type": "github"
442 }
443 },
444 "nixpkgs_2": {
445 "locked": {
446 "lastModified": 1687701825,
447 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
448 "owner": "NixOS",
449 "repo": "nixpkgs",
450 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
451 "type": "github"
452 },
453 "original": {
454 "owner": "NixOS",
455 "ref": "nixpkgs-unstable",
456 "repo": "nixpkgs",
457 "type": "github"
458 }
459 },
460 "nixpkgs_3": {
461 "locked": {
462 "lastModified": 1687893427,
463 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
464 "owner": "nixos",
465 "repo": "nixpkgs",
466 "rev": "4b14ab2a916508442e685089672681dff46805be",
467 "type": "github"
468 },
469 "original": {
470 "owner": "nixos",
471 "ref": "nixos-unstable-small",
472 "repo": "nixpkgs",
473 "type": "github"
474 }
475 },
476 "nixpkgs_4": {
477 "locked": {
478 "lastModified": 1648725829,
479 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
480 "owner": "NixOS",
481 "repo": "nixpkgs",
482 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
483 "type": "github"
484 },
485 "original": {
486 "owner": "NixOS",
487 "repo": "nixpkgs",
488 "type": "github"
489 }
490 },
491 "nixpkgs_5": {
492 "locked": {
493 "lastModified": 1693158576,
494 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
495 "owner": "nixos",
496 "repo": "nixpkgs",
497 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
498 "type": "github"
499 },
500 "original": {
501 "owner": "nixos",
502 "ref": "nixos-unstable",
503 "repo": "nixpkgs",
504 "type": "github"
505 }
506 },
507 "nixpkgs_6": {
508 "locked": {
509 "lastModified": 1687502512,
510 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
511 "owner": "NixOS",
512 "repo": "nixpkgs",
513 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
514 "type": "github"
515 },
516 "original": {
517 "owner": "NixOS",
518 "ref": "nixos-unstable",
519 "repo": "nixpkgs",
520 "type": "github"
521 }
522 },
523 "nixpkgs_7": {
524 "locked": {
525 "lastModified": 1646497237,
526 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
527 "owner": "nixos",
528 "repo": "nixpkgs",
529 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
530 "type": "github"
531 },
532 "original": {
533 "owner": "nixos",
534 "repo": "nixpkgs",
535 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
536 "type": "github"
537 }
538 },
539 "root": {
540 "inputs": {
541 "environment": "environment",
542 "files-watcher": "files-watcher",
543 "loginctl-linger": "loginctl-linger",
544 "monitoring": "monitoring",
545 "my-lib": "my-lib",
546 "myuids": "myuids",
547 "nixpkgs": "nixpkgs_5",
548 "secrets": "secrets_2",
549 "ssh": "ssh",
550 "system": "system"
551 }
552 },
553 "secrets": {
554 "locked": {
555 "lastModified": 1,
556 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
557 "path": "../../secrets",
558 "type": "path"
559 },
560 "original": {
561 "path": "../../secrets",
562 "type": "path"
563 }
564 },
565 "secrets-public": {
566 "locked": {
567 "lastModified": 1,
568 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
569 "path": "../../secrets",
570 "type": "path"
571 },
572 "original": {
573 "path": "../../secrets",
574 "type": "path"
575 }
576 },
577 "secrets_2": {
578 "locked": {
579 "lastModified": 1,
580 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
581 "path": "../../flakes/secrets",
582 "type": "path"
583 },
584 "original": {
585 "path": "../../flakes/secrets",
586 "type": "path"
587 }
588 },
589 "secrets_3": {
590 "locked": {
591 "lastModified": 1,
592 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
593 "path": "../../secrets",
594 "type": "path"
595 },
596 "original": {
597 "path": "../../secrets",
598 "type": "path"
599 }
600 },
601 "ssh": {
602 "inputs": {
603 "environment": "environment_3",
604 "secrets": "secrets_3"
605 },
606 "locked": {
607 "lastModified": 1,
608 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
609 "path": "../../flakes/private/ssh",
610 "type": "path"
611 },
612 "original": {
613 "path": "../../flakes/private/ssh",
614 "type": "path"
615 }
616 },
617 "stable": {
618 "locked": {
619 "lastModified": 1669735802,
620 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
621 "owner": "NixOS",
622 "repo": "nixpkgs",
623 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
624 "type": "github"
625 },
626 "original": {
627 "owner": "NixOS",
628 "ref": "nixos-22.11",
629 "repo": "nixpkgs",
630 "type": "github"
631 }
632 },
633 "system": {
634 "inputs": {
635 "backports": "backports",
636 "environment": "environment_4",
637 "mypackages": "mypackages",
638 "myuids": "myuids_2",
639 "secrets-public": "secrets-public"
640 },
641 "locked": {
642 "lastModified": 1,
643 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
644 "path": "../../flakes/private/system",
645 "type": "path"
646 },
647 "original": {
648 "path": "../../flakes/private/system",
649 "type": "path"
650 }
651 },
652 "treefmt-nix": {
653 "inputs": {
654 "nixpkgs": [
655 "my-lib",
656 "nixos-anywhere",
657 "nixpkgs"
658 ]
659 },
660 "locked": {
661 "lastModified": 1687940979,
662 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
663 "owner": "numtide",
664 "repo": "treefmt-nix",
665 "rev": "0a4f06c27610a99080b69433873885df82003aae",
666 "type": "github"
667 },
668 "original": {
669 "owner": "numtide",
670 "repo": "treefmt-nix",
671 "type": "github"
672 }
673 },
674 "webapps-ttrss": {
675 "flake": false,
676 "locked": {
677 "lastModified": 1546759381,
678 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
679 "ref": "master",
680 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
681 "revCount": 9256,
682 "type": "git",
683 "url": "https://git.tt-rss.org/fox/tt-rss.git"
684 },
685 "original": {
686 "ref": "master",
687 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
688 "type": "git",
689 "url": "https://git.tt-rss.org/fox/tt-rss.git"
690 }
691 }
692 },
693 "root": "root",
694 "version": 7
695}
diff --git a/systems/dilion/flake.nix b/systems/dilion/flake.nix
new file mode 100644
index 0000000..9747086
--- /dev/null
+++ b/systems/dilion/flake.nix
@@ -0,0 +1,43 @@
1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
4
5 my-lib.url = "path:../../flakes/lib";
6
7 monitoring.url = "path:../../flakes/private/monitoring";
8 ssh.url = "path:../../flakes/private/ssh";
9 environment.url = "path:../../flakes/private/environment";
10 system.url = "path:../../flakes/private/system";
11
12 myuids.url = "path:../../flakes/myuids";
13 secrets.url = "path:../../flakes/secrets";
14 files-watcher.url = "path:../../flakes/files-watcher";
15 loginctl-linger.url = "path:../../flakes/loginctl-linger";
16 };
17 outputs = inputs@{ self, my-lib, nixpkgs, ...}:
18 my-lib.lib.mkColmenaFlake {
19 name = "dilion";
20 inherit self nixpkgs;
21 system = "x86_64-linux";
22 targetHost = "176.9.10.233";
23 targetUser = "root";
24 nixosModules = {
25 base = ./base.nix;
26 system = inputs.system.nixosModule;
27 monitoring = inputs.monitoring.nixosModule;
28 environment = inputs.environment.nixosModule;
29 ssh = inputs.ssh.nixosModule;
30
31 myuids = inputs.myuids.nixosModule;
32 secrets = inputs.secrets.nixosModule;
33 files-watcher = inputs.files-watcher.nixosModule;
34 loginctl-linger = inputs.loginctl-linger.nixosModule;
35 };
36 moduleArgs = {
37 nixpkgs = inputs.nixpkgs;
38 monitoring = inputs.monitoring;
39 environment = inputs.environment;
40 pkgs-no-overlay = inputs.nixpkgs.legacyPackages.x86_64-linux;
41 };
42 };
43}
diff --git a/systems/dilion/monitoring.nix b/systems/dilion/monitoring.nix
new file mode 100644
index 0000000..af7f224
--- /dev/null
+++ b/systems/dilion/monitoring.nix
@@ -0,0 +1,43 @@
1{ lib, pkgs, config, name, monitoring, ... }:
2let
3 hostFQDN = config.hostEnv.fqdn;
4 zfs_snapshot = name: {
5 service_description = "ZFS snapshot ${name} happened not too long ago";
6 use = "local-service";
7 check_command = ["check_zfs_snapshot" name];
8 __passive_servicegroups = "webstatus-resources";
9 };
10in
11{
12 config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "mdadm" "zfs" "notify-secondary"];
13 config.myServices.monitoring.objects = lib.mkMerge [
14 (monitoring.lib.objectsCommon {
15 inherit hostFQDN;
16 hostName = name;
17 master = false;
18 processWarn = "250"; processAlert = "400";
19 loadWarn = "1.0"; loadAlert = "1.2";
20 interface = builtins.head (builtins.attrNames config.networking.interfaces);
21 })
22
23 {
24 service = [
25 {
26 service_description = "No mdadm array is degraded";
27 use = "local-service";
28 check_command = ["check_mdadm"];
29 __passive_servicegroups = "webstatus-resources";
30 }
31 {
32 service_description = "No ZFS pool is degraded";
33 use = "local-service";
34 check_command = ["check_zfs"];
35 __passive_servicegroups = "webstatus-resources";
36 }
37 (zfs_snapshot "zpool/backup/eldiron/zpool/root")
38 (zfs_snapshot "zpool/backup/eldiron/zpool/root/etc")
39 (zfs_snapshot "zpool/backup/eldiron/zpool/root/var")
40 ];
41 }
42 ];
43}
diff --git a/modules/private/ssh/ldap_regular.sh b/systems/dilion/ssh_ldap_regular.sh
index 4c2f47e..4c2f47e 100644
--- a/modules/private/ssh/ldap_regular.sh
+++ b/systems/dilion/ssh_ldap_regular.sh
diff --git a/systems/dilion/vms.nix b/systems/dilion/vms.nix
new file mode 100644
index 0000000..189e5ff
--- /dev/null
+++ b/systems/dilion/vms.nix
@@ -0,0 +1,200 @@
1# inspired from https://nixos.wiki/wiki/Virtualization_in_NixOS
2{ config, pkgs, lib, pkgs-no-overlay, ... }@args:
3let
4 toImage = f: "${import ./vms/base_image.nix f (args // { myEnv = config.myEnv; })}/nixos.qcow2";
5in
6{
7 options = {
8 myServices.vms.libvirt-guests = lib.mkOption {
9 type = lib.types.attrsOf (lib.types.submodule {
10 options = {
11 network = lib.mkOption { type = lib.types.str; description = "network to attach the guest to"; };
12 pool = lib.mkOption { type = lib.types.str; description = "pool to attach the guest to"; };
13 cpus = lib.mkOption { type = lib.types.int; default = 1; description = "number of cpus to assign"; };
14 memory = lib.mkOption { type = lib.types.int; description = "memory in GiB to assign"; };
15 diskSize = lib.mkOption { type = lib.types.int; description = "disk size in GiB"; };
16 destroyVolumeOnExit = lib.mkOption { type = lib.types.bool; description = "Whether to destroy the volume on exit"; default = false; };
17 extraDevicesXML = lib.mkOption { type = lib.types.lines; description = "Extra device configuration"; default = ""; };
18 preStart = lib.mkOption { type = lib.types.lines; default = ""; description = "Script to run as prestart"; };
19 };
20 });
21 default = {};
22 description = "Libvirt guests to start";
23 };
24 myServices.vms.libvirt-networks = lib.mkOption {
25 type = lib.types.attrsOf (lib.types.submodule {
26 options = {
27 bridgeNumber = lib.mkOption { type = lib.types.int; description = "bridge interface to create virbr<nbr>"; };
28 ipRange = lib.mkOption { type = lib.types.str; example = "192.168.100"; description = "ip4 prefix to use"; };
29 };
30 });
31 description = "Libvirt networks to configure";
32 default = {};
33 };
34 myServices.vms.libvirt-pools = lib.mkOption {
35 type = lib.types.attrsOf (lib.types.submodule {
36 options = {
37 type = lib.mkOption { type = lib.types.enum [ "dir" "zfs" ]; description = "Pool type"; };
38 target = lib.mkOption { type = lib.types.nullOr lib.types.path; default = null; description = "where to find images"; };
39 preStart = lib.mkOption { type = lib.types.lines; default = ""; description = "Script to run as prestart"; };
40 xml = lib.mkOption { type = lib.types.lines; default = ""; description = "Additional configuration"; };
41 };
42 });
43 };
44 myServices.vms.libvirt-images = lib.mkOption {
45 type = lib.types.attrsOf lib.types.path;
46 default = {};
47 description = "Attrs of images to create in /etc/libvirtd/base-images";
48 };
49 };
50 config = lib.mkMerge [
51 # Define images
52 {
53 environment.etc = lib.mapAttrs'
54 (n: v: lib.nameValuePair "libvirtd/base-images/${n}.qcow2" { source = toImage v; })
55 config.myServices.vms.libvirt-images;
56 }
57
58 # Define networks
59 {
60 systemd.services = lib.mapAttrs' (name: network: lib.nameValuePair "libvirtd-network-${name}" {
61 after = [ "libvirtd.service" ];
62 requires = [ "libvirtd.service" ];
63 wantedBy = [ "multi-user.target" ];
64 serviceConfig = {
65 Type = "oneshot";
66 RemainAfterExit = "yes";
67 };
68 path = [ config.boot.zfs.package ];
69 script = let
70 xml = pkgs.writeText "libvirt-network-${name}.xml" ''
71 <network>
72 <name>${name}</name>
73 <uuid>UUID</uuid>
74 <forward mode='nat' />
75 <bridge name='virbr${builtins.toString network.bridgeNumber}' />
76 <domain name='${name}' localOnly='yes'/>
77 <ip address='${network.ipRange}.1' netmask='255.255.255.0'>
78 <dhcp>
79 <range start='${network.ipRange}.2' end='${network.ipRange}.254'/>
80 </dhcp>
81 </ip>
82 </network>
83 '';
84 in ''
85 uuid="$(${pkgs.libvirt}/bin/virsh net-uuid '${name}' || true)"
86 ${pkgs.libvirt}/bin/virsh net-define <(sed "s/UUID/$uuid/" '${xml}')
87 ${pkgs.libvirt}/bin/virsh net-start '${name}'
88 '';
89 preStop = ''
90 ${pkgs.libvirt}/bin/virsh net-destroy '${name}'
91 '';
92 }) config.myServices.vms.libvirt-networks;
93 }
94
95 # Define pools
96 {
97 systemd.services = lib.mapAttrs' (name: pool: lib.nameValuePair "libvirtd-pool-${name}" {
98 after = [ "libvirtd.service" ];
99 requires = [ "libvirtd.service" ];
100 wantedBy = [ "multi-user.target" ];
101 serviceConfig = {
102 Type = "oneshot";
103 RemainAfterExit = "yes";
104 };
105 path = [ config.boot.zfs.package ];
106 script = let
107 xml = pkgs.writeText "libvirt-pool-${name}.xml" ''
108 <pool type="${pool.type}">
109 <name>${name}</name>
110 <uuid>UUID</uuid>
111 ${pool.xml}
112 ${if pool.target != null then ''
113 <target>
114 <path>${pool.target}</path>
115 </target>
116 '' else ""}
117 </pool>
118 '';
119 in pool.preStart + ''
120 uuid="$(${pkgs.libvirt}/bin/virsh pool-uuid '${name}' || true)"
121 ${pkgs.libvirt}/bin/virsh pool-define <(sed "s/UUID/$uuid/" '${xml}')
122 ${pkgs.libvirt}/bin/virsh pool-start '${name}' || true
123 '';
124 }) config.myServices.vms.libvirt-pools;
125 }
126
127 # Define guests
128 {
129 systemd.services = lib.mapAttrs' (name: guest: lib.nameValuePair "libvirtd-guest-${name}" {
130 after = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ];
131 requires = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ];
132 wantedBy = [ "multi-user.target" ];
133 serviceConfig = {
134 Type = "oneshot";
135 RemainAfterExit = "yes";
136 };
137 path = [ config.boot.zfs.package ];
138 script =
139 let
140 xml = pkgs.writeText "libvirt-guest-${name}.xml"
141 ''
142 <domain type="kvm">
143 <name>${name}</name>
144 <uuid>UUID</uuid>
145 <memory unit="GiB">${builtins.toString guest.memory}</memory>
146 <vcpu>${builtins.toString guest.cpus}</vcpu>
147 <os>
148 <type arch="x86_64">hvm</type>
149 </os>
150 <devices>
151 <emulator>/run/current-system/sw/bin/qemu-system-x86_64</emulator>
152 <disk type="volume">
153 <source pool="${guest.pool}" volume="guest-${name}" />
154 <target dev="vda" bus="virtio"/>
155 </disk>
156 ${guest.extraDevicesXML}
157 <input type="keyboard" bus="usb"/>
158 <graphics type="vnc" port="-1" autoport="yes"/>
159 <interface type="network">
160 <source network="${guest.network}" />
161 </interface>
162 </devices>
163 <features>
164 <acpi/>
165 </features>
166 </domain>
167 '';
168 in
169 guest.preStart + ''
170 if ! ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then
171 ${pkgs.libvirt}/bin/virsh vol-create-as --pool ${guest.pool} --name 'guest-${name}' --capacity '${builtins.toString guest.diskSize}GiB'
172 volume_path=$(${pkgs.libvirt}/bin/virsh vol-path --pool ${guest.pool} --vol 'guest-${name}')
173 ${pkgs-no-overlay.qemu}/bin/qemu-img convert /etc/libvirtd/base-images/nixos.qcow2 $volume_path
174 fi
175 uuid="$(${pkgs.libvirt}/bin/virsh domuuid '${name}' || true)"
176 ${pkgs.libvirt}/bin/virsh define <(sed "s/UUID/$uuid/" '${xml}')
177 ${pkgs.libvirt}/bin/virsh start '${name}'
178 '';
179 preStop = ''
180 ${pkgs.libvirt}/bin/virsh shutdown '${name}'
181 let "timeout = $(date +%s) + 10"
182 while [ "$(${pkgs.libvirt}/bin/virsh list --name | grep --count '^${name}$')" -gt 0 ]; do
183 if [ "$(date +%s)" -ge "$timeout" ]; then
184 # Meh, we warned it...
185 ${pkgs.libvirt}/bin/virsh destroy '${name}'
186 else
187 # The machine is still running, let's give it some time to shut down
188 sleep 0.5
189 fi
190 done
191 '' + lib.optionalString guest.destroyVolumeOnExit ''
192 if ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then
193 ${pkgs.libvirt}/bin/virsh vol-wipe --pool ${guest.pool} --vol 'guest-${name}' || true
194 ${pkgs.libvirt}/bin/virsh vol-delete --pool ${guest.pool} --vol 'guest-${name}'
195 fi
196 '';
197 }) config.myServices.vms.libvirt-guests;
198 }
199 ];
200}
diff --git a/systems/dilion/vms/base_configuration.nix b/systems/dilion/vms/base_configuration.nix
new file mode 100644
index 0000000..7b67886
--- /dev/null
+++ b/systems/dilion/vms/base_configuration.nix
@@ -0,0 +1,27 @@
1{ lib, config, environment, ... }@args:
2{
3 options.myEnv = (environment.nixosModule (args // { name = "dummy"; })).options.myEnv;
4 config = {
5 # This value determines the NixOS release with which your system is
6 # to be compatible, in order to avoid breaking some software such as
7 # database servers. You should change this only after NixOS release
8 # notes say you should.
9 # https://nixos.org/nixos/manual/release-notes.html
10 system.stateVersion = lib.mkDefault "23.05"; # Did you read the comment?
11
12 fileSystems."/".device = "/dev/disk/by-label/nixos";
13 boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" "virtio_balloon" "virtio_blk" "virtio_pci" "virtio_ring" ];
14 boot.loader = {
15 grub = {
16 device = "/dev/vda";
17 };
18 timeout = 0;
19 };
20 services.openssh.enable = true;
21 networking.firewall.allowedTCPPorts = [ 22 ];
22 users = {
23 mutableUsers = false;
24 users.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.immae_dilion ];
25 };
26 };
27}
diff --git a/systems/dilion/vms/base_image.nix b/systems/dilion/vms/base_image.nix
new file mode 100644
index 0000000..46b90eb
--- /dev/null
+++ b/systems/dilion/vms/base_image.nix
@@ -0,0 +1,98 @@
1configuration_file: { pkgs, myEnv, nixpkgs, environment, pkgs-no-overlay, ... }:
2let
3 config = (import (nixpkgs + "/nixos/lib/eval-config.nix") {
4 inherit (pkgs) system;
5 modules = [ {
6 _module.args.environment = environment;
7 myEnv = myEnv;
8 imports = [
9 (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix")
10 configuration_file
11 ];
12
13 # We want our template image to be as small as possible, but the deployed image should be able to be
14 # of any size. Hence we resize on the first boot.
15 systemd.services.resize-main-fs = {
16 wantedBy = [ "multi-user.target" ];
17 serviceConfig.Type = "oneshot";
18 script =
19 ''
20 # Resize main partition to fill whole disk
21 echo ", +" | ${pkgs.utillinux}/bin/sfdisk /dev/vda --no-reread -N 1
22 ${pkgs.parted}/bin/partprobe
23 # Resize filesystem
24 ${pkgs.e2fsprogs}/bin/resize2fs /dev/vda1
25 '';
26 };
27 } ];
28 }).config;
29in pkgs-no-overlay.vmTools.runInLinuxVM (
30 pkgs.runCommand "nixos-base-image"
31 {
32 memSize = 768;
33 preVM =
34 ''
35 mkdir $out
36 diskImage=image.qcow2
37 ${pkgs-no-overlay.vmTools.qemu}/bin/qemu-img create -f qcow2 $diskImage 2G
38 mv closure xchg/
39 '';
40 postVM =
41 ''
42 echo compressing VM image...
43 ${pkgs-no-overlay.vmTools.qemu}/bin/qemu-img convert -c $diskImage -O qcow2 $out/nixos.qcow2
44 '';
45 buildInputs = [ pkgs.utillinux pkgs.perl pkgs.parted pkgs.e2fsprogs ];
46 exportReferencesGraph =
47 [ "closure" config.system.build.toplevel ];
48 }
49 ''
50 # Create the partition
51 parted /dev/vda mklabel msdos
52 parted /dev/vda -- mkpart primary ext4 1M -1s
53
54 # Format the partition
55 mkfs.ext4 -L nixos /dev/vda1
56 mkdir /mnt
57 mount /dev/vda1 /mnt
58
59 for dir in dev proc sys; do
60 mkdir /mnt/$dir
61 mount --bind /$dir /mnt/$dir
62 done
63
64 storePaths=$(perl ${pkgs.pathsFromGraph} /tmp/xchg/closure)
65 echo filling Nix store...
66 mkdir -p /mnt/nix/store
67 set -f
68 cp -prd $storePaths /mnt/nix/store
69 # The permissions will be set up incorrectly if the host machine is not running NixOS
70 chown -R 0:30000 /mnt/nix/store
71
72 mkdir -p /mnt/etc/nix
73 echo 'build-users-group = ' > /mnt/etc/nix/nix.conf
74
75 # Register the paths in the Nix database.
76 export USER=root
77 printRegistration=1 perl ${pkgs.pathsFromGraph} /tmp/xchg/closure | \
78 chroot /mnt ${config.nix.package.out}/bin/nix-store --load-db
79
80 # Create the system profile to allow nixos-rebuild to work.
81 chroot /mnt ${config.nix.package.out}/bin/nix-env \
82 -p /nix/var/nix/profiles/system --set ${config.system.build.toplevel}
83
84 # `nixos-rebuild' requires an /etc/NIXOS.
85 mkdir -p /mnt/etc/nixos
86 touch /mnt/etc/NIXOS
87
88 # `switch-to-configuration' requires a /bin/sh
89 mkdir -p /mnt/bin
90 ln -s ${config.system.build.binsh}/bin/sh /mnt/bin/sh
91
92 # Generate the GRUB menu.
93 chroot /mnt ${config.system.build.toplevel}/bin/switch-to-configuration boot
94
95 umount /mnt/{proc,dev,sys}
96 umount /mnt
97 ''
98)
diff --git a/systems/dilion/vms/buildbot_configuration.nix b/systems/dilion/vms/buildbot_configuration.nix
new file mode 100644
index 0000000..622f8ba
--- /dev/null
+++ b/systems/dilion/vms/buildbot_configuration.nix
@@ -0,0 +1,73 @@
1{ pkgs, config, lib, ... }:
2{
3 imports = [
4 ./base_configuration.nix
5 ];
6 # This value determines the NixOS release with which your system is
7 # to be compatible, in order to avoid breaking some software such as
8 # database servers. You should change this only after NixOS release
9 # notes say you should.
10 # https://nixos.org/nixos/manual/release-notes.html
11 system.stateVersion = "23.05"; # Did you read the comment?
12
13 systemd.services.buildbot-worker.serviceConfig.ExecStartPre = let
14 cfg = config.services.buildbot-worker;
15 script = pkgs.writeScript "decode-dmi" ''
16 #!${pkgs.stdenv.shell}
17
18 mkdir -vp "${cfg.buildbotDir}"
19 varfile=${cfg.buildbotDir}/variables
20 rm $varfile || true
21 echo "[DEFAULT]" > $varfile
22 strings=$(${pkgs.dmidecode}/bin/dmidecode --oem-string count)
23 for i in $(seq 1 $strings); do
24 ${pkgs.dmidecode}/bin/dmidecode --oem-string $i >> $varfile
25 done
26 chown -R ${cfg.user}:${cfg.group} ${cfg.buildbotDir}
27 '';
28 in
29 lib.mkForce ["+${script}"];
30 systemd.services.buildbot-worker.serviceConfig.ExecStart = let
31 cfg = config.services.buildbot-worker;
32 tacFile = pkgs.writeText "buildbot-worker.tac" ''
33 import os
34 from io import open
35
36 from buildbot_worker.bot import Worker
37 from twisted.application import service
38
39 basedir = '${cfg.buildbotDir}'
40
41 # note: this line is matched against to check that this is a worker
42 # directory; do not edit it.
43 application = service.Application('buildbot-worker')
44
45 import configparser
46 config = config = configparser.ConfigParser()
47 config.read("${cfg.buildbotDir}/variables")
48 master_url_split = config["DEFAULT"]["buildbot_master_url"].split(':')
49 buildmaster_host = master_url_split[0]
50 port = int(master_url_split[1])
51 workername = config["DEFAULT"]["buildbot_worker_name"]
52
53 with open('${cfg.workerPassFile}', 'r', encoding='utf-8') as passwd_file:
54 passwd = passwd_file.read().strip('\r\n')
55 keepalive = ${toString cfg.keepalive}
56 umask = None
57 maxdelay = 300
58 numcpus = None
59 allow_shutdown = None
60
61 s = Worker(buildmaster_host, port, workername, passwd, basedir,
62 keepalive, umask=umask, maxdelay=maxdelay,
63 numcpus=numcpus, allow_shutdown=allow_shutdown)
64 s.setServiceParent(application)
65 '';
66 in
67 lib.mkForce "${cfg.package.pythonModule.pkgs.twisted}/bin/twistd --nodaemon --pidfile= --logfile - --python ${tacFile}";
68 services.buildbot-worker = {
69 enable = true;
70 workerPass = config.myEnv.buildbot.workerPassword;
71 packages = [ pkgs.git pkgs.gzip pkgs.openssh ];
72 };
73}
diff --git a/systems/eldiron/base.nix b/systems/eldiron/base.nix
new file mode 100644
index 0000000..cda518e
--- /dev/null
+++ b/systems/eldiron/base.nix
@@ -0,0 +1,371 @@
1{ config, pkgs, lib, php, name, secrets, ... }:
2{
3 # ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age
4 secrets.ageKeys = [ "age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj" ];
5 boot = {
6 kernelModules = [ "kvm-intel" ];
7 blacklistedKernelModules = [ "nvidiafb" ];
8 loader.timeout = 1;
9 loader.grub.devices = [ "/dev/sda" "/dev/sdc" ];
10 kernel.sysctl = {
11 # https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md
12 "net.ipv4.tcp_sack" = 0;
13 };
14 supportedFilesystems = [ "zfs" ];
15 kernelParams = ["zfs.zfs_arc_max=6442450944"];
16 kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
17 initrd.availableKernelModules = [ "ahci" "sd_mod" ];
18 initrd.secrets = {
19 "/boot/pass.key" = "/boot/pass.key";
20 };
21 };
22 services.udev.extraRules = ''
23 ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:56:a0:88", NAME="eth0"
24 '';
25 nix.settings.max-jobs = 8;
26 nixpkgs.config.permittedInsecurePackages = [
27 "python-2.7.18.6" # for nagios-cli
28 "nodejs-16.20.2" # for landing page building
29 ];
30
31 nixpkgs.overlays = [
32 php.overlays.php
33 ];
34 powerManagement.cpuFreqGovernor = "powersave";
35
36 security.acme.certs."${name}".postRun = builtins.concatStringsSep "\n" [
37 (lib.optionalString config.services.websites.env.production.enable "/run/current-system/sw/bin/machinectl shell httpd-production /usr/bin/env systemctl reload httpd.service")
38 (lib.optionalString config.services.websites.env.integration.enable "/run/current-system/sw/bin/machinectl shell httpd-integration /usr/bin/env systemctl reload httpd.service")
39 ];
40
41 fileSystems = {
42 # pools:
43 # zpool: ashift=12
44 # zfast: ashift=12
45 # zfs:
46 # zpool/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy
47 # zpool/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key
48 # zpool/root/var: atime=on
49 # zfast/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy
50 # zfast/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key
51 # zfast/root/etc: ø
52 # zfast/root/nix: ø
53 # zfast/root/tmp: async=disabled
54 # zfast/root/var: atime=on
55 # zfast/root/var/lib: ø
56 # zfast/root/var/lib/mysql: logbias=throughput ; atime=off ; primarycache=metadata
57 # zfast/root/var/lib/postgresql: recordsize=8K ; atime=off ; logbias=throughput
58 # zfast/root/var/lib/postgresql/11.0: ø
59 # zfast/root/var/lib/postgresql/11.0/pg_wal: ø
60 "/" = { fsType = "zfs"; device = "zpool/root"; };
61 "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/e6bb18fb-ff56-4b5f-ae9f-e60d40dc0622"; };
62 "/etc" = { fsType = "zfs"; device = "zpool/root/etc"; };
63 "/nix" = { fsType = "zfs"; device = "zfast/root/nix"; };
64 "/tmp" = { fsType = "zfs"; device = "zfast/root/tmp"; };
65 "/var" = { fsType = "zfs"; device = "zpool/root/var"; };
66 "/var/lib/mysql" = { fsType = "zfs"; device = "zfast/root/var/lib/mysql"; };
67 "/var/lib/postgresql" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql"; };
68 "/var/lib/postgresql/11.0" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0"; };
69 "/var/lib/postgresql/11.0/pg_wal" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0/pg_wal"; };
70 };
71 swapDevices = [ { label = "swap1"; } { label = "swap2"; } ];
72 hardware.enableRedistributableFirmware = true;
73
74 services.zfs = {
75 autoScrub = {
76 enable = false;
77 };
78 };
79 networking = {
80 hostId = "8262ca33"; # generated with head -c4 /dev/urandom | od -A none -t x4
81 firewall.enable = true;
82 firewall.allowedTCPPorts = [ config.myEnv.ports.zrepl_flony ];
83 # FIXME: on next reboot, remove the /27 and the localCommands
84 interfaces."eth0".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
85 (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or []))
86 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips))
87 ++ [ { address = lib.head config.hostEnv.ips.main.ip4; prefixLength = 27; } ];
88 interfaces."eth0".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
89 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
90 config.hostEnv.ips);
91 defaultGateway = "176.9.151.65";
92 localCommands = ''
93 # FIXME: Those commands were added by nixops and may not be
94 # actually needed
95 ip -6 addr add '2a01:4f8:160:3445::/64' dev 'eth0' || true
96 ip -4 route change '176.9.151.64/27' via '176.9.151.65' dev 'eth0' || true
97 ip -6 route add default via 'fe80::1' dev eth0 || true
98 '';
99 nameservers = [
100 "213.133.98.98"
101 "213.133.99.99"
102 "213.133.100.100"
103 "2a01:4f8:0:a0a1::add:1010"
104 "2a01:4f8:0:a102::add:9999"
105 "2a01:4f8:0:a111::add:9898"
106 ];
107 };
108
109 imports = [
110 secrets.nixosModules.users-config-eldiron
111 ./databases
112 ./databases/mariadb.nix
113 ./databases/openldap
114 ./databases/postgresql.nix
115 ./databases/redis.nix
116
117
118 ./monitoring.nix
119 ./ejabberd
120 ./buildbot
121 ./coturn.nix
122 ./dns.nix
123 ./duply_backup.nix
124 ./gemini
125 ./gitolite
126 ./mail
127 ./websites
128 ./webstats
129 ./irc.nix
130 ./pub
131 ./tasks
132 ./ftp.nix
133 ./mpd.nix
134 ./vpn
135 ];
136
137 myServices.buildbot.enable = true;
138 myServices.databases.enable = true;
139 myServices.gitolite.enable = true;
140 myServices.monitoring.enable = true;
141 myServices.irc.enable = true;
142 myServices.pub.enable = true;
143 myServices.tasks.enable = true;
144 myServices.mpd.enable = true;
145 myServices.dns.enable = true;
146 myServices.websites.enable = true;
147 myServices.gemini.enable = true;
148 myServices.mail.enable = true;
149 myServices.ejabberd.enable = true;
150 myServices.vpn.enable = true;
151 myServices.ftp.enable = true;
152
153 myServices.chatonsProperties.hostings.infogerance = {
154 file.datetime = "2022-08-27T18:50:00";
155 hosting = {
156 name = "Infogérance";
157 description = "Administration de serveurs";
158 website = "https://www.immae.eu/";
159 logo = "https://assets.immae.eu/logo.jpg";
160 type = "HOSTEDSERVER";
161 status.level = "OK";
162 status.description = "OK";
163 registration.load = "OPEN";
164 install.type = "PACKAGE";
165 };
166 };
167
168 services.netdata.enable = true;
169 services.netdata.config.global."memory mode" = "none";
170 services.netdata.config.health."enabled" = "no";
171 services.netdata.config.web.mode = "none";
172 users.users."${config.services.netdata.user}".extraGroups = [ "keys" ];
173 services.netdata.configDir."stream.conf" = config.secrets.fullPaths."netdata-stream.conf";
174 secrets.keys = {
175 "ldap/pam_pgsql" = {
176 user = "root";
177 group = "root";
178 permissions = "0400";
179 text = ''
180 database = immae
181 user = immae_auth_read
182 password = {{ .postgresql.immae_auth_read }}
183 table = ldap_users
184 user_column = login
185 pw_type = function
186 auth_query = SELECT (mechanism = 'SSHA' AND password = encode(digest( %p || salt, 'sha1'), 'hex')) FROM ldap_users WHERE login = %u OR login || '@' || realm = %u
187 #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
188 '';
189 };
190
191 "netdata-stream.conf" = {
192 user = config.services.netdata.user;
193 group = config.services.netdata.group;
194 permissions = "0400";
195 text = ''
196 [stream]
197 enabled = yes
198 destination = ${config.myEnv.monitoring.netdata_aggregator}
199 api key = ${config.myEnv.monitoring.netdata_keys.eldiron}
200 '';
201 };
202 "zrepl_backup/identity" = {
203 user = "root";
204 group = "root";
205 permissions = "0400";
206 text = config.myEnv.zrepl_backup.ssh_key.private;
207 };
208 "zrepl/${name}.key" = {
209 permissions = "0400";
210 text = config.myEnv.zrepl_backup.certs."${name}".key;
211 user = "root";
212 group = "root";
213 };
214 } // builtins.listToAttrs (map (x: lib.attrsets.nameValuePair "zrepl/certificates/${x}.crt" {
215 permissions = "0400";
216 text = config.myEnv.zrepl_backup.certs."${x}".certificate;
217 user = "root";
218 group = "root";
219 }) (builtins.attrNames config.myEnv.zrepl_backup.certs));
220
221 programs.ssh.knownHosts.dilion = {
222 extraHostNames = ["dilion.immae.eu"];
223 publicKey = config.myEnv.servers.dilion.hostKey;
224 };
225
226 services.cron = {
227 enable = true;
228 mailto = "cron@immae.eu";
229 systemCronJobs = [
230 ''
231 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "immae.eu.*Recipient address rejected"
232 # Need a way to blacklist properly
233 # 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "NOQUEUE:"
234 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtp -g "status=bounced"
235 ''
236 ];
237 };
238
239 environment.systemPackages = [ pkgs.bindfs ];
240
241 environment.etc."mdadm.conf" = {
242 enable = true;
243 mode = "0644";
244 user = "root";
245 text = "MAILADDR ${config.myEnv.monitoring.email}";
246 };
247
248 systemd.services.zrepl.path = [ pkgs.openssh ];
249 services.zrepl = {
250 enable = true;
251 settings = {
252 jobs = [
253 {
254 type = "push";
255 # must not change
256 name = "backup-to-dilion";
257 filesystems."zpool/root" = true;
258 filesystems."zpool/root/etc" = true;
259 filesystems."zpool/root/var<" = true;
260 connect = {
261 address = "dilion.immae.eu:19000";
262 type = "tls";
263 server_cn = "dilion";
264 ca = config.secrets.fullPaths."zrepl/certificates/dilion.crt";
265 cert = config.secrets.fullPaths."zrepl/certificates/eldiron.crt";
266 key = config.secrets.fullPaths."zrepl/eldiron.key";
267 };
268 snapshotting = {
269 type = "periodic";
270 prefix = "zrepl_";
271 interval = "1h";
272 # hooks = [
273 # {
274 # type = "mysql-lock-tables";
275 # dsn = "${config.myEnv.zrepl_backup.mysql.user}:${config.myEnv.zrepl_backup.mysql.password}@tcp(localhost)/";
276 # filesystems."zpool/root/var" = true;
277 # }
278 # {
279 # type = "command";
280 # path = pkgs.writeScript "redis-dump" ''
281 # #!${pkgs.stdenv.shell}
282 # ${pkgs.redis}/bin/redis-cli bgsave
283 # '';
284 # err_is_fatal = false;
285 # filesystems."zpool/root/var" = true;
286 # }
287 # ];
288 };
289 send.encrypted = true;
290 pruning.keep_sender = [
291 { type = "regex"; regex = "^manual_.*"; }
292 { type = "grid"; grid = "24x1h | 7x1d | 4x7d | 6x30d"; regex = "^zrepl_.*"; }
293 ];
294 pruning.keep_receiver = [
295 { type = "regex"; regex = "^manual_.*"; }
296 { type = "grid"; grid = "6x4h | 7x1d | 4x7d | 6x30d"; regex = "^zrepl_.*"; }
297 ];
298 }
299 {
300 type = "source";
301 # must not change
302 name = "backup-to-wd-zpool";
303 serve.type = "tls";
304 serve.listen = ":${builtins.toString config.myEnv.ports.zrepl_flony}";
305 serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt";
306 serve.cert = config.secrets.fullPaths."zrepl/certificates/eldiron.crt";
307 serve.key = config.secrets.fullPaths."zrepl/eldiron.key";
308 serve.client_cns = [ "flony" ];
309 filesystems."zpool/root" = true;
310 filesystems."zpool/root/etc" = true;
311 filesystems."zpool/root/var<" = true;
312 filesystems."zfast/root/var<" = true;
313 send.encrypted = true;
314 snapshotting.type = "manual";
315 }
316 ];
317 };
318 };
319
320 environment.etc."fail2ban/filter.d/postgresql.conf".text = ''
321 [Definition]
322 failregex = <HOST> \S+ FATAL: password authentication failed for user .+$
323 <HOST> \S+ FATAL: PAM authentication failed for user.+$
324 <HOST> \S+ FATAL: no pg_hba.conf entry for host.+$
325 '';
326 environment.etc."fail2ban/filter.d/mysqld-auth.local".text = ''
327 [Definition]
328 _daemon = mysql[-\w]*
329 '';
330 services.fail2ban.jails.dovecot = ''
331 enabled = true
332 '';
333 services.fail2ban.jails.postfix-sasl = ''
334 enabled = true
335 '';
336 services.fail2ban.jails.proftpd = ''
337 enabled = true
338 '';
339 services.fail2ban.jails.postgresql = ''
340 enabled = true
341 port = 5432
342 logpath = %(syslog_daemon)s
343 backend = %(default_backend)s
344 journalmatch = _SYSTEMD_UNIT=postgresql.service + _COMM=postgres
345 '';
346 services.fail2ban.jails.mysqld-auth = ''
347 enabled = true
348 journalmatch = _SYSTEMD_UNIT=mysql.service + _COMM=mysqld
349 '';
350 # This value determines the NixOS release with which your system is
351 # to be compatible, in order to avoid breaking some software such as
352 # database servers. You should change this only after NixOS release
353 # notes say you should.
354 # https://nixos.org/nixos/manual/release-notes.html
355 system.stateVersion = "23.05"; # Did you read the comment?
356
357 security.pam.services.ldap.text = ''
358 # Authentication from ldap for pgsql
359 auth required ${pkgs.pam_pgsql}/lib/security/pam_pgsql.so config_file=/var/secrets/ldap/pam_pgsql
360 account required ${pkgs.pam_pgsql}/lib/security/pam_pgsql.so config_file=/var/secrets/ldap/pam_pgsql
361 '';
362 services.saslauthd = {
363 enable = true;
364 mechanism = "pam";
365 };
366 environment.etc."sasl2/slapd.conf".text = ''
367 mech_list: plain
368 pwcheck_method: saslauthd
369 saslauthd_path: /run/saslauthd/mux
370 '';
371}
diff --git a/systems/eldiron/buildbot/default.nix b/systems/eldiron/buildbot/default.nix
new file mode 100644
index 0000000..e86b081
--- /dev/null
+++ b/systems/eldiron/buildbot/default.nix
@@ -0,0 +1,310 @@
1{ lib, pkgs, config, buildbot, ... }:
2let
3 varDir = "/var/lib/buildbot";
4 bb-python = buildbot.pythonModule;
5in
6{
7 options = {
8 myServices.buildbot.enable = lib.mkOption {
9 type = lib.types.bool;
10 default = false;
11 description = ''
12 Whether to enable buildbot.
13 '';
14 };
15 };
16
17 config = lib.mkIf config.myServices.buildbot.enable {
18 myEnv.buildbot.projects.test = {
19 name = "test";
20 workerPort = config.myEnv.ports.buildbot_test;
21 packages = [ pkgs.git pkgs.gzip pkgs.openssh ];
22 pythonPathHome = false;
23 secrets = {
24 apprise_webhooks = builtins.concatStringsSep "\n" [
25 "{{ .apprise_webhooks.matrix_immae_eu_alert }}"
26 ];
27 notify_xmpp_password = "{{ .xmpp.notify_bot }}";
28 };
29 activationScript = ''
30 install -m 0755 -o buildbot -g buildbot -d /var/lib/ftp/release.immae.eu/test
31 '';
32 webhookTokens = [
33 "{{ .buildbot.webhookTokens.Immae }}"
34 "{{ .buildbot.webhookTokens.Immae }}"
35 ];
36 };
37
38 myServices.chatonsProperties.hostings.buildbot = {
39 file.datetime = "2022-08-21T10:37:00";
40 hosting = {
41 name = "Buildbot";
42 description = "Python-based continuous integration testing framework";
43 type = "INSTANCE";
44 website = "https://git.immae.eu";
45 logo = "https://www.buildbot.net/img/icon.png";
46 status.level = "OK";
47 status.description = "OK";
48 registration.load = "OPEN";
49 install.type = "PACKAGE";
50 guide.user = "https://www.immae.eu/docs/forge-logicielle.html";
51 };
52 software = {
53 name = "Buildbot";
54 website = "https://www.buildbot.net/";
55 license.url = "https://github.com/buildbot/buildbot/blob/master/LICENSE";
56 license.name = "GNU General Public License v2.0";
57 version = pkgs.buildbot.version;
58 source.url = "https://github.com/buildbot/buildbot";
59 };
60 };
61 nixpkgs.overlays = [
62 (self: super: {
63 follow-systemd-unit = self.writeScriptBin "follow-systemd-unit" ''
64 #!${self.stdenv.shell}
65
66 set -euo pipefail
67
68 service=$1
69 before_invocation_id=$2
70
71 get_id() {
72 systemctl show -p InvocationID --value "$service"
73 }
74
75 while [ "$(get_id)" = "$before_invocation_id" ]; do sleep 1; done
76
77 invocation_id="$(get_id)"
78 cursor="$(mktemp)"
79 trap "rm -f $cursor" EXIT
80
81 get_logs() {
82 journalctl --quiet --cursor-file=$cursor INVOCATION_ID=$invocation_id + _SYSTEMD_INVOCATION_ID=$invocation_id
83 }
84
85 while [ -n "$(systemctl show -p Job --value "$service")" ]; do
86 get_logs
87 done
88 get_logs
89 '';
90 })
91 ];
92 ids.uids.buildbot = config.myEnv.buildbot.user.uid;
93 ids.gids.buildbot = config.myEnv.buildbot.user.gid;
94
95 users.groups.buildbot.gid = config.ids.gids.buildbot;
96 users.users.buildbot = {
97 name = "buildbot";
98 uid = config.ids.uids.buildbot;
99 group = "buildbot";
100 description = "Buildbot user";
101 home = varDir;
102 extraGroups = [ "keys" "systemd-journal" ];
103 useDefaultShell = true;
104 openssh.authorizedKeys.keys = [ config.myEnv.buildbot.ssh_key.public ];
105 };
106
107 services.websites.env.tools.watchPaths = lib.attrsets.mapAttrsToList
108 (k: project: config.secrets.fullPaths."buildbot/${project.name}/webhook-httpd-include")
109 config.myEnv.buildbot.projects;
110
111 services.websites.env.tools.vhostConfs.git.extraConfig = lib.attrsets.mapAttrsToList (k: project: ''
112 RedirectMatch permanent "^/buildbot/${project.name}$" "/buildbot/${project.name}/"
113 RewriteEngine On
114 RewriteRule ^/buildbot/${project.name}/ws(.*)$ unix:///run/buildbot/${project.name}.sock|ws://git.immae.eu/ws$1 [P,NE,QSA,L]
115 ProxyPass /buildbot/${project.name}/ unix:///run/buildbot/${project.name}.sock|http://${project.name}-git.immae.eu/
116 ProxyPassReverse /buildbot/${project.name}/ unix:///run/buildbot/${project.name}.sock|http://${project.name}-git.immae.eu/
117 <Location /buildbot/${project.name}/>
118 Use LDAPConnect
119 Require ldap-group cn=users,ou=${project.name},cn=buildbot,ou=services,dc=immae,dc=eu
120
121 SetEnvIf X-Url-Scheme https HTTPS=1
122 ProxyPreserveHost On
123 </Location>
124 <Location /buildbot/${project.name}/change_hook/base>
125 <RequireAny>
126 Require local
127 Require ldap-group cn=users,ou=${project.name},cn=buildbot,ou=services,dc=immae,dc=eu
128 Include ${config.secrets.fullPaths."buildbot/${project.name}/webhook-httpd-include"}
129 </RequireAny>
130 </Location>
131 '') config.myEnv.buildbot.projects;
132
133 system.activationScripts = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
134 deps = [ "users" "wrappers" ];
135 text = ''
136 install -m 755 -o buildbot -g buildbot -d ${varDir}/${project.name}
137
138 ${project.activationScript}
139 '';
140 }) config.myEnv.buildbot.projects;
141
142 secrets.keys = lib.listToAttrs (
143 lib.lists.flatten (
144 lib.attrsets.mapAttrsToList (k: project:
145 lib.attrsets.mapAttrsToList (k: v:
146 (lib.nameValuePair "buildbot/${project.name}/${k}" {
147 permissions = "0600";
148 user = "buildbot";
149 group = "buildbot";
150 text = v;
151 })
152 ) project.secrets
153 ++ [
154 (lib.nameValuePair "buildbot/${project.name}/webhook-httpd-include" {
155 permissions = "0600";
156 user = "wwwrun";
157 group = "wwwrun";
158 text = lib.optionalString (project.webhookTokens != null) ''
159 Require expr "req('Access-Key') in { ${builtins.concatStringsSep ", " (map (x: "'${x}'") project.webhookTokens)} }"
160 '';
161 })
162 (lib.nameValuePair "buildbot/${project.name}/environment_file" {
163 permissions = "0600";
164 user = "buildbot";
165 group = "buildbot";
166 keyDependencies = [ (buildbot.buildbot_config project).src ] ++ project.secretsDeps;
167 text = let
168 project_env = with lib.attrsets;
169 mapAttrs' (k: v: nameValuePair "BUILDBOT_${k}" v) project.environment //
170 {
171 BUILDBOT_PROJECT_DIR = (buildbot.buildbot_config project).src;
172 BUILDBOT_WORKER_PORT = builtins.toString project.workerPort;
173 BUILDBOT_HOST = config.hostEnv.fqdn;
174 BUILDBOT_VIRT_URL = "qemu+ssh://libvirt@dilion.immae.eu/system";
175 };
176 in builtins.concatStringsSep "\n"
177 (lib.mapAttrsToList (envK: envV: "${envK}=${envV}") project_env);
178 })
179 ]
180 ) config.myEnv.buildbot.projects
181 )
182 ) // {
183 "buildbot/ldap" = {
184 permissions = "0600";
185 user = "buildbot";
186 group = "buildbot";
187 text = config.myEnv.buildbot.ldap.password;
188 };
189 "buildbot/worker_password" = {
190 permissions = "0600";
191 user = "buildbot";
192 group = "buildbot";
193 text = config.myEnv.buildbot.workerPassword;
194 };
195 "buildbot/ssh_key" = {
196 permissions = "0600";
197 user = "buildbot";
198 group = "buildbot";
199 text = config.myEnv.buildbot.ssh_key.private;
200 };
201 "buildbot/ssh_known_hosts" = {
202 permissions = "0644";
203 user = "buildbot";
204 group = "buildbot";
205 text = ''
206 git.immae.eu ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF
207 eldiron ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF
208 phare.normalesup.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN2GomItXICXpCtCFRMT2xuerqx2nLMO/3mNUuWyzFr1
209 '';
210 };
211 };
212
213 services.filesWatcher = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
214 restart = true;
215 paths = [
216 config.secrets.fullPaths."buildbot/ldap"
217 config.secrets.fullPaths."buildbot/worker_password"
218 config.secrets.fullPaths."buildbot/ssh_key"
219 config.secrets.fullPaths."buildbot/${project.name}/environment_file"
220 ] ++ lib.attrsets.mapAttrsToList (k: v: config.secrets.fullPaths."buildbot/${project.name}/${k}") project.secrets;
221 }) config.myEnv.buildbot.projects;
222
223 systemd.slices.buildbot = {
224 description = "buildbot slice";
225 };
226
227 networking.firewall.allowedTCPPorts = lib.attrsets.mapAttrsToList (k: v: v.workerPort) config.myEnv.buildbot.projects;
228 systemd.services = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
229 description = "Buildbot Continuous Integration Server ${project.name}.";
230 after = [ "network-online.target" ];
231 wantedBy = [ "multi-user.target" ];
232 path = project.packages;
233 preStart = let
234 master-cfg = "${buildbot.buildbot_common}/${bb-python.pythonForBuild.sitePackages}/buildbot_common/master.cfg";
235 tac_file = pkgs.writeText "buildbot.tac" ''
236 import os
237
238 from twisted.application import service
239 from buildbot.master import BuildMaster
240
241 basedir = '${varDir}/${project.name}'
242 rotateLength = 10000000
243 maxRotatedFiles = 10
244 configfile = '${master-cfg}'
245
246 # Default umask for server
247 umask = None
248
249 # if this is a relocatable tac file, get the directory containing the TAC
250 if basedir == '.':
251 import os
252 basedir = os.path.abspath(os.path.dirname(__file__))
253
254 # note: this line is matched against to check that this is a buildmaster
255 # directory; do not edit it.
256 application = service.Application('buildmaster')
257 from twisted.python.logfile import LogFile
258 from twisted.python.log import ILogObserver, FileLogObserver
259 logfile = LogFile.fromFullPath(os.path.join(basedir, "twistd.log"), rotateLength=rotateLength,
260 maxRotatedFiles=maxRotatedFiles)
261 application.setComponent(ILogObserver, FileLogObserver(logfile).emit)
262
263 m = BuildMaster(basedir, configfile, umask)
264 m.setServiceParent(application)
265 m.log_rotation.rotateLength = rotateLength
266 m.log_rotation.maxRotatedFiles = maxRotatedFiles
267 '';
268 in ''
269 if [ ! -f ${varDir}/${project.name}/buildbot.tac ]; then
270 ${buildbot}/bin/buildbot create-master -c "${master-cfg}" "${varDir}/${project.name}"
271 rm -f ${varDir}/${project.name}/master.cfg.sample
272 rm -f ${varDir}/${project.name}/buildbot.tac
273 fi
274 ln -sf ${tac_file} ${varDir}/${project.name}/buildbot.tac
275 # different buildbots may be trying that simultaneously, add the || true to avoid complaining in case of race
276 install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ssh_key"} ${varDir}/buildbot_key || true
277 install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ssh_known_hosts"} ${varDir}/buildbot_hosts || true
278 buildbot_secrets=${varDir}/${project.name}/secrets
279 install -m 0700 -o buildbot -g buildbot -d $buildbot_secrets
280 install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ldap"} $buildbot_secrets/ldap
281 install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/worker_password"} $buildbot_secrets/worker_password
282 ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList
283 (k: v: "install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/${project.name}/${k}"} $buildbot_secrets/${k}") project.secrets
284 )}
285 ${buildbot}/bin/buildbot upgrade-master ${varDir}/${project.name}
286 '';
287 environment = let
288 HOME = "${varDir}/${project.name}";
289 PYTHONPATH = "${bb-python.withPackages (self:
290 buildbot.common_packages self ++
291 [ (buildbot.buildbot_config project) ]
292 )}/${bb-python.sitePackages}${if project.pythonPathHome then ":${varDir}/${project.name}/.local/${bb-python.sitePackages}" else ""}";
293 in { inherit PYTHONPATH HOME; };
294
295 serviceConfig = {
296 Slice = "buildbot.slice";
297 Type = "forking";
298 User = "buildbot";
299 Group = "buildbot";
300 RuntimeDirectory = "buildbot";
301 RuntimeDirectoryPreserve = "yes";
302 StateDirectory = "buildbot";
303 SupplementaryGroups = "keys";
304 WorkingDirectory = "${varDir}/${project.name}";
305 ExecStart = "${buildbot}/bin/buildbot start";
306 EnvironmentFile = config.secrets.fullPaths."buildbot/${project.name}/environment_file";
307 };
308 }) config.myEnv.buildbot.projects;
309 };
310}
diff --git a/systems/eldiron/coturn.nix b/systems/eldiron/coturn.nix
new file mode 100644
index 0000000..d8b02c5
--- /dev/null
+++ b/systems/eldiron/coturn.nix
@@ -0,0 +1,73 @@
1{ config, name, lib, pkgs, ... }:
2{
3 config = lib.mkIf (name == "eldiron") {
4 myServices.chatonsProperties.services.coturn = {
5 file.datetime = "2022-08-27T19:00:00";
6 service = {
7 name = "Coturn";
8 description = "coturn TURN server";
9 status.level = "OK";
10 status.description = "OK";
11 registration."" = ["MEMBER" "CLIENT"];
12 registration.load = "FULL";
13 install.type = "PACKAGE";
14 };
15 software = {
16 name = "coturn";
17 website = "https://github.com/coturn/coturn";
18 license.url = "https://github.com/coturn/coturn/blob/master/LICENSE";
19 license.name = "3-Clause BSD License";
20 version = pkgs.coturn.version;
21 source.url = "https://github.com/coturn/coturn";
22 };
23 };
24 networking.firewall.allowedTCPPorts = [
25 config.services.coturn.alt-listening-port
26 config.services.coturn.alt-tls-listening-port
27 config.services.coturn.listening-port
28 config.services.coturn.tls-listening-port
29 ];
30 networking.firewall.allowedTCPPortRanges = [
31 { from = config.services.coturn.min-port; to = config.services.coturn.max-port; }
32 ];
33 networking.firewall.allowedUDPPortRanges = [
34 { from = config.services.coturn.min-port; to = config.services.coturn.max-port; }
35 ];
36 networking.firewall.allowedUDPPorts = [
37 config.services.coturn.alt-listening-port
38 config.services.coturn.alt-tls-listening-port
39 config.services.coturn.listening-port
40 config.services.coturn.tls-listening-port
41 ];
42 #users.users.turnserver.extraGroups = [ "keys" ];
43 services.coturn = {
44 enable = true;
45 no-cli = true;
46 no-tls = true;
47 no-dtls = true;
48 use-auth-secret = true;
49 lt-cred-mech = true;
50 realm = "eldiron.immae.eu";
51 extraConfig = ''
52 fingerprint
53 total-quota=0
54 bps-capacity=0
55 stale-nonce
56 no-multicast-peers
57 '';
58 static-auth-secret = config.myEnv.coturn.auth_access_key;
59 #cert = "/var/lib/acme/eldiron/fullchain.pem";
60 #pkey = "/var/lib/acme/eldiron/key.pem";
61 listening-ips = [
62 "127.0.0.1"
63 "::1"
64 ] ++ config.myEnv.servers.eldiron.ips.main.ip4
65 ++ config.myEnv.servers.eldiron.ips.main.ip6;
66 relay-ips = [
67 "127.0.0.1"
68 "::1"
69 ] ++ config.myEnv.servers.eldiron.ips.main.ip4
70 ++ config.myEnv.servers.eldiron.ips.main.ip6;
71 };
72 };
73}
diff --git a/systems/eldiron/databases/default.nix b/systems/eldiron/databases/default.nix
new file mode 100644
index 0000000..d8d3048
--- /dev/null
+++ b/systems/eldiron/databases/default.nix
@@ -0,0 +1,56 @@
1{ lib, config, secrets, ... }:
2let
3 cfg = config.myServices.databases;
4in
5{
6 options.myServices = {
7 databases.enable = lib.mkEnableOption "my databases service";
8 };
9
10 config.myServices.dns.zones."immae.eu".subdomains.db-1 = lib.mkIf cfg.enable (with config.myServices.dns.helpers; ips servers.eldiron.ips.main);
11 config.myServices.databases = lib.mkIf cfg.enable {
12
13 mariadb = {
14 enable = true;
15 ldapConfig = {
16 inherit (config.myEnv.ldap) host base;
17 inherit (config.myEnv.databases.mysql.pam) dn filter password;
18 };
19 replicationLdapConfig = {
20 inherit (config.myEnv.ldap) host base;
21 inherit (config.myEnv.servers.eldiron.ldap) dn password;
22 };
23 credentials.root = config.myEnv.databases.mysql.systemUsers.root;
24 };
25
26 openldap = {
27 accessFile = secrets.ldap-conf;
28 baseDn = config.myEnv.ldap.base;
29 rootDn = config.myEnv.ldap.root_dn;
30 rootPw = config.myEnv.ldap.root_pw;
31 enable = true;
32 };
33
34 postgresql = {
35 ldapConfig = {
36 inherit (config.myEnv.ldap) host base;
37 inherit (config.myEnv.databases.postgresql.pam) dn filter password;
38 };
39 replicationLdapConfig = {
40 inherit (config.myEnv.ldap) host base;
41 inherit (config.myEnv.servers.eldiron.ldap) dn password;
42 };
43 authorizedHosts = {
44 };
45 replicationHosts = {
46 backup-2 = {
47 ip4 = config.myEnv.servers.backup-2.ips.main.ip4;
48 ip6 = config.myEnv.servers.backup-2.ips.main.ip6;
49 };
50 };
51 enable = true;
52 };
53
54 redis.enable = true;
55 };
56}
diff --git a/systems/eldiron/databases/mariadb.nix b/systems/eldiron/databases/mariadb.nix
new file mode 100644
index 0000000..b4a6917
--- /dev/null
+++ b/systems/eldiron/databases/mariadb.nix
@@ -0,0 +1,188 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.databases.mariadb;
4in {
5 options.myServices.databases = {
6 mariadb = {
7 enable = lib.mkOption {
8 default = false;
9 example = true;
10 description = "Whether to enable mariadb database";
11 type = lib.types.bool;
12 };
13 package = lib.mkOption {
14 type = lib.types.package;
15 default = pkgs.mariadb;
16 description = ''
17 Mariadb package to use.
18 '';
19 };
20 credentials = lib.mkOption {
21 default = {};
22 description = "Credentials";
23 type = lib.types.attrsOf lib.types.str;
24 };
25 ldapConfig = lib.mkOption {
26 description = "LDAP configuration to allow PAM identification via LDAP";
27 type = lib.types.submodule {
28 options = {
29 host = lib.mkOption { type = lib.types.str; };
30 base = lib.mkOption { type = lib.types.str; };
31 dn = lib.mkOption { type = lib.types.str; };
32 password = lib.mkOption { type = lib.types.str; };
33 filter = lib.mkOption { type = lib.types.str; };
34 };
35 };
36 };
37 replicationLdapConfig = lib.mkOption {
38 description = "LDAP configuration to allow replication";
39 type = lib.types.submodule {
40 options = {
41 host = lib.mkOption { type = lib.types.str; };
42 base = lib.mkOption { type = lib.types.str; };
43 dn = lib.mkOption { type = lib.types.str; };
44 password = lib.mkOption { type = lib.types.str; };
45 };
46 };
47 };
48 dataDir = lib.mkOption {
49 type = lib.types.path;
50 default = "/var/lib/mysql";
51 description = ''
52 The directory where Mariadb stores its data.
53 '';
54 };
55 # Output variables
56 socketsDir = lib.mkOption {
57 type = lib.types.path;
58 default = "/run/mysqld";
59 description = ''
60 The directory where Mariadb puts sockets.
61 '';
62 };
63 sockets = lib.mkOption {
64 type = lib.types.attrsOf lib.types.path;
65 default = {
66 mysqld = "${cfg.socketsDir}/mysqld.sock";
67 };
68 readOnly = true;
69 description = ''
70 Mariadb sockets
71 '';
72 };
73 };
74 };
75
76 config = lib.mkIf cfg.enable {
77 networking.firewall.allowedTCPPorts = [ config.myEnv.databases.mysql.port ];
78
79 # for adminer, ssl is implemented with mysqli only, which is
80 # currently disabled because it’s not compatible with pam.
81 # Thus we need to generate two users for each 'remote': one remote
82 # with SSL, and one localhost without SSL.
83 # User identified by LDAP:
84 # CREATE USER foo@% IDENTIFIED VIA pam USING 'mysql' REQUIRE SSL;
85 # CREATE USER foo@localhost IDENTIFIED VIA pam USING 'mysql';
86
87 # To create a user (host) for replication:
88 # CREATE USER 'host'@'%' IDENTIFIED VIA pam USING 'mysql_replication' REQUIRE SSL;
89 # GRANT REPLICATION SLAVE, REPLICATION CLIENT, RELOAD, LOCK TABLES, SELECT, SHOW VIEW ON *.* TO 'host'@'%';
90 # (the lock/select grant permits to let the replication host handle
91 # the initial fetch of the database)
92 # % should be valid for both localhost (for cron dumps) and the origin host.
93 services.mysql = {
94 enable = true;
95 package = cfg.package;
96 dataDir = cfg.dataDir;
97 settings = {
98 mysqld = {
99 port = config.myEnv.databases.mysql.port;
100 ssl_ca = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";
101 ssl_key = "${config.security.acme.certs.mysql.directory}/key.pem";
102 ssl_cert = "${config.security.acme.certs.mysql.directory}/fullchain.pem";
103
104 # for replication
105 log-bin = "mariadb-bin";
106 server-id = "1";
107
108 # this introduces a small delay before storing on disk, but
109 # makes it order of magnitudes quicker
110 innodb_flush_log_at_trx_commit = "0";
111
112 # This is necessary since the default ("dialog") is not
113 # supported by php's mysqlnd plugin (in mysqli). But with that
114 # change only regular login+password schemes can work (no
115 # "fancy" authentication methods like fprintd or keys)
116 pam_use_cleartext_plugin = true;
117 };
118 };
119 };
120
121 users.users.mysql.extraGroups = [ "keys" ];
122 security.acme.certs."mysql" = {
123 group = "mysql";
124 domain = "db-1.immae.eu";
125 postRun = ''
126 systemctl restart mysql.service
127 '';
128 };
129
130 secrets.keys = {
131 "mysql/mysqldump" = {
132 permissions = "0400";
133 user = "root";
134 group = "root";
135 text = ''
136 [mysqldump]
137 user = root
138 password = ${cfg.credentials.root}
139 '';
140 };
141 "mysql/pam" = {
142 permissions = "0400";
143 user = "mysql";
144 group = "mysql";
145 text = with cfg.ldapConfig; ''
146 host ${host}
147 base ${base}
148 binddn ${dn}
149 bindpw ${password}
150 pam_filter ${filter}
151 ssl start_tls
152 '';
153 };
154 "mysql/pam_replication" = {
155 permissions = "0400";
156 user = "mysql";
157 group = "mysql";
158 text = with cfg.replicationLdapConfig; ''
159 host ${host}
160 base ${base}
161 binddn ${dn}
162 bindpw ${password}
163 pam_login_attribute cn
164 ssl start_tls
165 '';
166 };
167 };
168
169 security.pam.services = let
170 pam_ldap = "${pkgs.pam_ldap}/lib/security/pam_ldap.so";
171 in {
172 mysql = {
173 text = ''
174 # https://mariadb.com/kb/en/mariadb/pam-authentication-plugin/
175 auth required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam"}
176 account required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam"}
177 '';
178 };
179 mysql_replication = {
180 text = ''
181 auth required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam_replication"}
182 account required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam_replication"}
183 '';
184 };
185 };
186
187 };
188}
diff --git a/systems/eldiron/databases/openldap/default.nix b/systems/eldiron/databases/openldap/default.nix
new file mode 100644
index 0000000..7cd15da
--- /dev/null
+++ b/systems/eldiron/databases/openldap/default.nix
@@ -0,0 +1,304 @@
1{ lib, pkgs, config, openldap, ... }:
2let
3 cfg = config.myServices.databases.openldap;
4in
5{
6 options.myServices.databases = {
7 openldap = {
8 enable = lib.mkOption {
9 default = false;
10 example = true;
11 description = "Whether to enable ldap";
12 type = lib.types.bool;
13 };
14 baseDn = lib.mkOption {
15 type = lib.types.str;
16 description = ''
17 Base DN for LDAP
18 '';
19 };
20 rootDn = lib.mkOption {
21 type = lib.types.str;
22 description = ''
23 Root DN
24 '';
25 };
26 rootPw = lib.mkOption {
27 type = lib.types.str;
28 description = ''
29 Root (Hashed) password
30 '';
31 };
32 accessFile = lib.mkOption {
33 type = lib.types.path;
34 description = ''
35 The file path that defines the access
36 '';
37 };
38 dataDir = lib.mkOption {
39 type = lib.types.path;
40 default = "/var/lib/openldap/mdb";
41 description = ''
42 The directory where Openldap stores its data.
43 '';
44 };
45 socketsDir = lib.mkOption {
46 type = lib.types.path;
47 default = "/run/openldap";
48 description = ''
49 The directory where Openldap puts sockets and pid files.
50 '';
51 };
52 # Output variables
53 pids = lib.mkOption {
54 type = lib.types.attrsOf lib.types.path;
55 default = {
56 pid = "${cfg.socketsDir}/slapd.pid";
57 args = "${cfg.socketsDir}/slapd.args";
58 };
59 readOnly = true;
60 description = ''
61 Slapd pid files
62 '';
63 };
64 };
65 };
66
67 config = lib.mkIf cfg.enable {
68 myServices.dns.zones."immae.eu".subdomains.ldap =
69 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
70
71 nixpkgs.overlays = [
72 (self: super: {
73 openldap_libressl_cyrus = (self.openldap.override {
74 openssl = self.libressl;
75 cyrus_sasl = self.cyrus_sasl.overrideAttrs (old: {
76 configureFlags = old.configureFlags ++ [ "--with-configdir=/etc/sasl2" ];
77 });
78 }).overrideAttrs (old: {
79 configureFlags = old.configureFlags ++ [ "--with-cyrus-sasl" "--enable-spasswd" ];
80 });
81 })
82 ];
83
84 secrets.keys = {
85 "ldap/password" = {
86 permissions = "0400";
87 user = "openldap";
88 group = "openldap";
89 text = "${cfg.rootPw}";
90 };
91 "ldap/access" = {
92 permissions = "0400";
93 user = "openldap";
94 group = "openldap";
95 text = builtins.readFile cfg.accessFile;
96 };
97 "ldap" = {
98 permissions = "0500";
99 user = "openldap";
100 group = "openldap";
101 isDir = true;
102 };
103 };
104 users.users.openldap.extraGroups = [ "keys" ];
105 networking.firewall.allowedTCPPorts = [ 636 389 ];
106
107 security.acme.certs."ldap" = {
108 group = "openldap";
109 domain = "ldap.immae.eu";
110 postRun = ''
111 systemctl restart openldap.service
112 '';
113 };
114
115 services.filesWatcher.openldap = {
116 restart = true;
117 paths = [ config.secrets.fullPaths."ldap" ];
118 };
119
120 services.openldap = {
121 enable = true;
122 urlList = [ "ldap://" "ldaps://" ];
123 package = pkgs.openldap_libressl_cyrus;
124 settings = {
125 attrs = {
126 olcPidFile = cfg.pids.pid;
127 olcArgsFile = cfg.pids.args;
128 olcLogLevel = "none";
129 olcTLSCertificateFile = "${config.security.acme.certs.ldap.directory}/cert.pem";
130 olcTLSCertificateKeyFile = "${config.security.acme.certs.ldap.directory}/key.pem";
131 olcTLSCACertificateFile = "${config.security.acme.certs.ldap.directory}/fullchain.pem";
132 olcTLSCACertificatePath = "${pkgs.cacert.unbundled}/etc/ssl/certs/";
133 # This makes openldap crash
134 # olcTLSCipherSuite = "DEFAULT";
135 #olcSaslHost = "kerberos.immae.eu";
136 # Map sasl "dn" to ldap dn
137 #olcAuthzRegexp = ''{0}"uid=([^,]*)(,cn=IMMAE.EU)?,cn=(gssapi|gss-spnego),cn=auth" "uid=$1,ou=users,dc=immae,dc=eu"'';
138 };
139 children = {
140 "cn=module{0}" = {
141 attrs = {
142 cn = "module{0}";
143 objectClass = [ "olcModuleList" ];
144 olcModuleLoad = [ "{0}back_mdb" "{1}memberof" "{2}syncprov" ];
145 };
146 };
147 "cn=schema".includes = map (schema:
148 "${config.services.openldap.package}/etc/schema/${schema}.ldif"
149 ) [ "core" "cosine" "inetorgperson" "nis" ] ++ [
150 "${openldap.immae-ldif}"
151 ];
152 "olcDatabase={0}config" = {
153 attrs = {
154 objectClass = "olcDatabaseConfig";
155 olcDatabase = "{0}config";
156 olcAccess = ["{0}to * by * none"];
157 };
158 };
159 "olcDatabase={1}mdb" = {
160 attrs = {
161 objectClass = [ "olcDatabaseConfig" "olcMdbConfig" ];
162 olcDatabase = "{1}mdb";
163 olcDbIndex = [
164 "objectClass eq"
165 "uid pres,eq"
166 "mail pres,eq,sub"
167 "cn pres,eq,sub"
168 "sn pres,eq,sub"
169 "dc eq"
170 "member eq"
171 "memberOf eq"
172 ];
173 olcAccess = let
174 join = builtins.replaceStrings ["\n"] [" "];
175 in [
176 # First matching "to" + "by" wins
177 #### Replication needs full access
178 (join ''{0}to *
179 by dn.base="uid=ldap_replication,cn=ldap,ou=services,dc=immae,dc=eu" read
180 by * break
181 '')
182 #### Prevent modification of SASL passwords
183 (join ''{1}to attrs=userPassword val.regex="^.SASL..+"
184 by self read
185 by anonymous auth
186 by * none
187 '')
188 #### Oneself needs access to users password
189 (join ''{2}to attrs=userPassword,shadowLastChange
190 by self write
191 by anonymous auth
192 by * none
193 '')
194 #### Should be write, but disabled during migration to psql
195 (join ''{3}to attrs=immaeSshKey
196 by self read
197 by * break
198 '')
199
200 #### Anyone can auth, and I can see myself
201 (join ''{4}to *
202 by self read
203 by anonymous auth
204 by * break
205 '')
206
207 #### Specific access for phpldapadmin
208 (join ''{5}to filter="(uid=*)" attrs=entry,uid
209 by dn.base="cn=phpldapadmin,ou=services,dc=immae,dc=eu" read
210 by * break
211 '')
212
213 #### Hosts
214 # The attributes are available to every host
215 (join ''{6}to dn.one="ou=hosts,dc=immae,dc=eu"
216 by dn.subtree="ou=hosts,dc=immae,dc=eu" read
217 by dn.base="dc=immae,dc=eu" search
218 by * break
219 '')
220 #### /Hosts
221
222 #### Local services
223 # this/-* & user : all your ancestors have access to you
224 # this/memberOf/-* & user : all those whom you belong to (in a group),
225 # and their ancestors, have access to you
226 # user/immaeAccessWriteDn*/member & this : you have write access to the
227 # members of your immaeAccessDn
228 # attributes
229 # user/immaeAccessDn*/member & this : you have access to the members
230 # of your immaeAccessDn attributes
231 # user/immaeAccessReadSubtree* & this/-* : you have access to the
232 # childrens of your immaeAccessReadSubtree
233 # attributes
234 # this/memberOf/-* & user/immaeAccessReadSubtree*: you have access to
235 # the members of the childrens of your
236 # immaeAccessReadSubtree attributes
237 # http://www.openldap.org/faq/data/cache/1133.html
238 (join ''{7}to dn.subtree="dc=immae,dc=eu"
239 by dn.subtree="ou=external_services,dc=immae,dc=eu" break
240 by set.exact="this/-* & user" read
241 by set.exact="this/memberOf/-* & user" read
242 by set.exact="user/immaeAccessWriteDn*/member & this" write
243 by set.exact="user/immaeAccessDn*/member & this" read
244 by set.exact="user/immaeAccessReadSubtree* & this/-*" read
245 by set.exact="this/memberOf/-* & user/immaeAccessReadSubtree*" read
246 by users search
247 by * break
248 '')
249 #### /Local services
250
251 #### External services
252 # http://www.openldap.org/faq/data/cache/429.html
253 # FIXME: Find a way to whitelist?
254 (join ''{8}to attrs=immaeSshKey
255 by dn.subtree="ou=external_services,dc=immae,dc=eu" none
256 '')
257 (join ''{9}to dn.subtree="dc=immae,dc=eu"
258 by set.exact="this/-* & user" read
259 by set.exact="this/memberOf/-* & user" read
260 by set.exact="user/immaeAccessDn*/member & this/-*" read
261 by users search
262 by * none
263 '')
264 #### /External services
265 ];
266 olcDbDirectory = cfg.dataDir;
267 olcRootDN = cfg.rootDn;
268 olcRootPW.path = config.secrets.fullPaths."ldap/password";
269 olcSuffix = cfg.baseDn;
270 };
271 children = {
272 "olcOverlay={0}memberof" = {
273 attrs = {
274 objectClass = [ "olcOverlayConfig" "olcMemberOf" ];
275 olcOverlay = "{0}memberof";
276 };
277 };
278 "olcOverlay={1}syncprov" = {
279 attrs = {
280 objectClass = [ "olcOverlayConfig" "olcSyncProvConfig" ];
281 olcOverlay = "{1}syncprov";
282 olcSpCheckpoint = "100 10";
283 };
284 };
285 };
286 };
287 };
288 };
289 };
290 myServices.monitoring.fromMasterActivatedPlugins = [ "tcp" ];
291 myServices.monitoring.fromMasterObjects.service = [
292 {
293 service_description = "ldap SSL is up to date";
294 host_name = config.hostEnv.fqdn;
295 use = "external-service";
296 check_command = ["check_tcp_ssl" "636"];
297
298 servicegroups = "webstatus-ssl";
299 _webstatus_name = "LDAP";
300 _webstatus_url = "ldap.immae.eu";
301 }
302 ];
303 };
304}
diff --git a/systems/eldiron/databases/postgresql.nix b/systems/eldiron/databases/postgresql.nix
new file mode 100644
index 0000000..721059a
--- /dev/null
+++ b/systems/eldiron/databases/postgresql.nix
@@ -0,0 +1,236 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.databases.postgresql;
4in {
5 options.myServices.databases = {
6 postgresql = {
7 enable = lib.mkOption {
8 default = false;
9 example = true;
10 description = "Whether to enable postgresql database";
11 type = lib.types.bool;
12 };
13 package = lib.mkOption {
14 type = lib.types.package;
15 default = pkgs.postgresql;
16 description = ''
17 Postgresql package to use.
18 '';
19 };
20 ldapConfig = lib.mkOption {
21 description = "LDAP configuration to allow PAM identification via LDAP";
22 type = lib.types.submodule {
23 options = {
24 host = lib.mkOption { type = lib.types.str; };
25 base = lib.mkOption { type = lib.types.str; };
26 dn = lib.mkOption { type = lib.types.str; };
27 password = lib.mkOption { type = lib.types.str; };
28 filter = lib.mkOption { type = lib.types.str; };
29 };
30 };
31 };
32 replicationLdapConfig = lib.mkOption {
33 description = "LDAP configuration to allow replication";
34 type = lib.types.submodule {
35 options = {
36 host = lib.mkOption { type = lib.types.str; };
37 base = lib.mkOption { type = lib.types.str; };
38 dn = lib.mkOption { type = lib.types.str; };
39 password = lib.mkOption { type = lib.types.str; };
40 };
41 };
42 };
43 authorizedHosts = lib.mkOption {
44 default = {};
45 description = "Hosts to allow connections from";
46 type = lib.types.attrsOf (lib.types.listOf (lib.types.submodule {
47 options = {
48 method = lib.mkOption {
49 default = "md5";
50 type = lib.types.str;
51 };
52 username = lib.mkOption {
53 default = "all";
54 type = lib.types.str;
55 };
56 database = lib.mkOption {
57 default = "all";
58 type = lib.types.str;
59 };
60 ip4 = lib.mkOption {
61 default = [];
62 type = lib.types.listOf lib.types.str;
63 };
64 ip6 = lib.mkOption {
65 default = [];
66 type = lib.types.listOf lib.types.str;
67 };
68 };
69 }));
70 };
71 replicationHosts = lib.mkOption {
72 default = {};
73 description = "Hosts to allow replication from";
74 type = lib.types.attrsOf (lib.types.submodule {
75 options = {
76 ip4 = lib.mkOption {
77 type = lib.types.listOf lib.types.str;
78 };
79 ip6 = lib.mkOption {
80 type = lib.types.listOf lib.types.str;
81 };
82 };
83 });
84 };
85 # Output variables
86 socketsDir = lib.mkOption {
87 type = lib.types.path;
88 default = "/run/postgresql";
89 description = ''
90 The directory where Postgresql puts sockets.
91 '';
92 readOnly = true;
93 };
94 };
95 };
96
97 config = lib.mkIf cfg.enable {
98 networking.firewall.allowedTCPPorts = [ 5432 ];
99
100 security.acme.certs."postgresql" = {
101 group = "postgres";
102 domain = "db-1.immae.eu";
103 postRun = ''
104 systemctl reload postgresql.service
105 '';
106 };
107
108 systemd.services.postgresql.serviceConfig = {
109 SupplementaryGroups = "keys";
110 ExecStartPre = [ ("+" + (pkgs.writeShellScript "postgresql-fix-cert" ''
111 # postgresql complains:
112 # private key file "${config.security.acme.certs.postgresql.directory}/key.pem" must be owned by the database user or root
113 cp -f "${config.security.acme.certs.postgresql.directory}/key.pem" "${config.services.postgresql.dataDir}/key.pem"
114 chown postgres:postgres "${config.services.postgresql.dataDir}/key.pem"
115 chmod go-r "${config.services.postgresql.dataDir}/key.pem"
116 '')) ];
117 };
118 systemd.services.postgresql.postStart = lib.mkAfter ''
119 # This line is already defined in 19.09
120 PSQL="psql --port=5432"
121
122 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (role: _: ''
123 $PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='${role}'" \
124 | grep -q 1 \
125 || $PSQL -tAc 'CREATE USER "${role}" WITH REPLICATION'
126 '') cfg.replicationHosts)}
127
128 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (role: _:
129 let
130 sname = builtins.replaceStrings ["-"] ["_"] role;
131 in
132 ''
133 $PSQL -tAc "SELECT 1 FROM pg_replication_slots WHERE slot_name='${sname}'" \
134 | grep -q 1 \
135 || $PSQL -tAc "SELECT * FROM pg_create_physical_replication_slot('${sname}')"
136 '') cfg.replicationHosts)}
137 '';
138
139 services.postgresql = {
140 enable = true;
141 package = cfg.package;
142 enableTCPIP = true;
143 checkConfig = false;
144 logLinePrefix = "%h %q%u@%d "; # Default: '%m [%p] ', already stored independently by journald. %h needed for fail2ban
145 settings = {
146 max_connections = 300;
147 wal_level = "logical";
148 shared_buffers = "512MB";
149 work_mem = "10MB";
150 max_wal_size = "1GB";
151 min_wal_size = "80MB";
152 log_timezone = "Europe/Paris";
153 datestyle = "iso, mdy";
154 timezone = "Europe/Paris";
155 lc_messages = "en_US.UTF-8";
156 lc_monetary = "en_US.UTF-8";
157 lc_numeric = "en_US.UTF-8";
158 lc_time = "en_US.UTF-8";
159 default_text_search_config = "pg_catalog.english";
160 # this introduces a small delay before storing on disk, but
161 # makes it order of magnitudes quicker
162 synchronous_commit = "off";
163 ssl = "on";
164 ssl_cert_file = "${config.security.acme.certs.postgresql.directory}/fullchain.pem";
165 ssl_key_file = "${config.services.postgresql.dataDir}/key.pem";
166 };
167 authentication = let
168 hosts = builtins.concatStringsSep "\n" (
169 lib.lists.flatten (lib.mapAttrsToList (k: vs: map (v:
170 map (ip6: "hostssl ${v.database} ${v.username} ${ip6} ${v.method}") v.ip6
171 ++ map (ip4: "hostssl ${v.database} ${v.username} ${ip4}/32 ${v.method}") v.ip4
172 ) vs) cfg.authorizedHosts
173 ));
174 replication = builtins.concatStringsSep "\n" (
175 lib.lists.flatten (lib.mapAttrsToList (k: v:
176 map (ip6: "hostssl replication ${k} ${ip6}/128 pam pamservice=postgresql_replication") v.ip6
177 ++ map (ip4: "hostssl replication ${k} ${ip4}/32 pam pamservice=postgresql_replication") v.ip4
178 ) cfg.replicationHosts
179 ));
180 in ''
181 local all postgres ident
182 local all all md5
183 ${hosts}
184 hostssl all all all pam
185 ${replication}
186 '';
187 };
188
189 secrets.keys = {
190 "postgresql/pam" = {
191 permissions = "0400";
192 group = "postgres";
193 user = "postgres";
194 text = with cfg.ldapConfig; ''
195 host ${host}
196 base ${base}
197 binddn ${dn}
198 bindpw ${password}
199 pam_filter ${filter}
200 ssl start_tls
201 '';
202 };
203 "postgresql/pam_replication" = {
204 permissions = "0400";
205 group = "postgres";
206 user = "postgres";
207 text = with cfg.replicationLdapConfig; ''
208 host ${host}
209 base ${base}
210 binddn ${dn}
211 bindpw ${password}
212 pam_login_attribute cn
213 ssl start_tls
214 '';
215 };
216 };
217
218 security.pam.services = let
219 pam_ldap = "${pkgs.pam_ldap}/lib/security/pam_ldap.so";
220 in {
221 postgresql = {
222 text = ''
223 auth required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam"}
224 account required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam"}
225 '';
226 };
227 postgresql_replication = {
228 text = ''
229 auth required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam_replication"}
230 account required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam_replication"}
231 '';
232 };
233 };
234 };
235}
236
diff --git a/systems/eldiron/databases/redis.nix b/systems/eldiron/databases/redis.nix
new file mode 100644
index 0000000..1f57aa9
--- /dev/null
+++ b/systems/eldiron/databases/redis.nix
@@ -0,0 +1,138 @@
1{ lib, config, pkgs, ... }:
2let
3 cfg = config.myServices.databases.redis;
4in {
5 options.myServices.databases.redis = {
6 enable = lib.mkOption {
7 default = false;
8 example = true;
9 description = "Whether to enable redis database";
10 type = lib.types.bool;
11 };
12 socketsDir = lib.mkOption {
13 type = lib.types.path;
14 default = "/run/redis";
15 description = ''
16 The directory where Redis puts sockets.
17 '';
18 };
19 # Output variables
20 sockets = lib.mkOption {
21 type = lib.types.attrsOf lib.types.path;
22 default = {
23 redis = "${cfg.socketsDir}/redis.sock";
24 };
25 readOnly = true;
26 description = ''
27 Redis sockets
28 '';
29 };
30 };
31
32 config = lib.mkIf cfg.enable {
33 users.users.redis.uid = config.ids.uids.redis;
34 users.groups.redis.gid = config.ids.gids.redis;
35 services.redis.servers."" = {
36 enable = true;
37 bind = "127.0.0.1";
38 unixSocket = cfg.sockets.redis;
39 unixSocketPerm = 777;
40 maxclients = 1024;
41 };
42 systemd.services.redis.serviceConfig.Slice = "redis.slice";
43 systemd.services.redis.serviceConfig.RuntimeDirectoryMode = lib.mkForce "0755";
44 services.redis.servers."php-sessions" = {
45 enable = true;
46 maxclients = 1024;
47 unixSocketPerm = 777;
48 user = "wwwrun";
49 };
50
51 services.spiped = {
52 enable = true;
53 config.redis = {
54 decrypt = true;
55 source = "0.0.0.0:16379";
56 target = "/run/redis/redis.sock";
57 keyfile = config.secrets.fullPaths."redis/spiped_keyfile";
58 };
59 };
60 systemd.services.spiped_redis = {
61 description = "Secure pipe 'redis'";
62 after = [ "network.target" ];
63 wantedBy = [ "multi-user.target" ];
64
65 serviceConfig = {
66 Slice = "redis.slice";
67 Restart = "always";
68 User = "spiped";
69 PermissionsStartOnly = true;
70 SupplementaryGroups = "keys";
71 };
72
73 script = "exec ${pkgs.spiped}/bin/spiped -F `cat /etc/spiped/redis.spec`";
74 };
75
76 #services.filesWatcher.predixy = {
77 # restart = true;
78 # paths = [ config.secrets.fullPaths."redis/predixy.conf" ];
79 #};
80
81 networking.firewall.allowedTCPPorts = [ 16379 ];
82 secrets.keys = {
83 #"redis/predixy.conf" = {
84 # user = "redis";
85 # group = "redis";
86 # permissions = "0400";
87 # text = ''
88 # Name Predixy
89 # Bind 127.0.0.1:7617
90 # ClientTimeout 300
91 # WorkerThreads 1
92
93 # Authority {
94 # Auth "${config.myEnv.databases.redis.predixy.read}" {
95 # Mode read
96 # }
97 # }
98
99 # StandaloneServerPool {
100 # Databases 16
101 # RefreshMethod fixed
102 # Group shard001 {
103 # + ${config.myEnv.databases.redis.socket}
104 # }
105 # }
106 # '';
107 #};
108 "redis/spiped_keyfile" = {
109 user = "spiped";
110 group = "spiped";
111 permissions = "0400";
112 text = config.myEnv.databases.redis.spiped_key;
113 };
114 };
115
116 systemd.slices.redis = {
117 description = "Redis slice";
118 };
119
120 #systemd.services.predixy = {
121 # description = "Redis proxy";
122 # wantedBy = [ "multi-user.target" ];
123 # after = [ "redis.service" ];
124
125 # serviceConfig = {
126 # Slice = "redis.slice";
127 # User = "redis";
128 # Group = "redis";
129 # SupplementaryGroups = "keys";
130 # Type = "simple";
131
132 # ExecStart = "${pkgs.predixy}/bin/predixy ${config.secrets.fullPaths."redis/predixy.conf"}";
133 # };
134
135 #};
136 };
137}
138
diff --git a/systems/eldiron/dns.nix b/systems/eldiron/dns.nix
new file mode 100644
index 0000000..486fcc1
--- /dev/null
+++ b/systems/eldiron/dns.nix
@@ -0,0 +1,290 @@
1{ lib, pkgs, config, dns-nix, ... }:
2{
3 options.myServices.dns = {
4 enable = lib.mkEnableOption "enable DNS resolver";
5 helpers = lib.mkOption {
6 readOnly = true;
7 description = ''
8 Some useful constants or functions for zones definition
9 '';
10 default = rec {
11 servers = config.myEnv.servers;
12 ips = i: { A = i.ip4; AAAA = i.ip6; };
13 letsencrypt = [ { tag = "issue"; value = "letsencrypt.org"; issuerCritical = false; } ];
14 toKV = a: builtins.concatStringsSep ";" (builtins.attrValues (builtins.mapAttrs (n: v: "${n}=${v}") a));
15 mailMX = {
16 hasEmail = true;
17 subdomains = let
18 mxes = lib.filterAttrs (n: v: v ? mx && v.mx.enable) servers;
19 in
20 lib.mapAttrs' (n: v: lib.nameValuePair v.mx.subdomain (ips v.ips.main)) mxes;
21 };
22 zoneHeader = {
23 TTL = 3*60*60;
24 SOA = {
25 # yyyymmdd?? (increment ?? at each change)
26 serial = 2022121902; # Don't change this value, it is replaced automatically!
27 refresh = 10800;
28 retry = 3600;
29 expire = 604800;
30 minimum = 10800; # negative cache ttl
31 adminEmail = "hostmaster@immae.eu"; #email-address s/@/./
32 nameServer = "ns1.immae.eu.";
33 };
34 };
35 mailSend = {
36 # DKIM
37 subdomains._domainkey.subdomains.eldiron.TXT = [
38 (toKV config.myEnv.mail.dkim.eldiron.public)
39 ];
40 # old key, may still be used by verifiers
41 subdomains._domainkey.subdomains.immae_eu.TXT = [
42 (toKV config.myEnv.mail.dkim.immae_eu.public)
43 ];
44 };
45 mailCommon = name: {
46 MX = let
47 mxes = lib.filterAttrs (n: v: v ? mx && v.mx.enable) servers;
48 in
49 lib.mapAttrsToList (n: v: { preference = v.mx.priority; exchange = "${v.mx.subdomain}.${name}."; }) mxes;
50
51 # https://tools.ietf.org/html/rfc6186
52 SRV = [
53 { service = "submission"; proto = "tcp"; priority = 0; weight = 1; port = 587; target = "smtp.immae.eu."; }
54 { service = "submissions"; proto = "tcp"; priority = 0; weight = 1; port = 465; target = "smtp.immae.eu."; }
55
56 { service = "imap"; proto = "tcp"; priority = 0; weight = 1; port = 143; target = "imap.immae.eu."; }
57 { service = "imaps"; proto = "tcp"; priority = 0; weight = 1; port = 993; target = "imap.immae.eu."; }
58 { service = "sieve"; proto = "tcp"; priority = 0; weight = 1; port = 4190; target = "imap.immae.eu."; }
59
60 { service = "pop3"; proto = "tcp"; priority = 10; weight = 1; port = 110; target = "pop3.immae.eu."; }
61 { service = "pop3s"; proto = "tcp"; priority = 10; weight = 1; port = 995; target = "pop3.immae.eu."; }
62 ];
63
64 subdomains = {
65 # MTA-STS
66 # https://blog.delouw.ch/2018/12/16/using-mta-sts-to-enhance-email-transport-security-and-privacy/
67 # https://support.google.com/a/answer/9261504
68 _mta-sts.TXT = [ (toKV { v = "STSv1"; id = "20200109150200Z"; }) ]; # Don't change this value, it is updated automatically!
69 _tls.subdomains._smtp.TXT = [ (toKV { v = "TLSRPTv1"; "rua" = "mailto:postmaster+mta-sts@immae.eu"; }) ];
70 mta-sts = ips servers.eldiron.ips.main;
71
72 # DMARC
73 _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"; }) ];
74 };
75
76 # SPF
77 TXT = [ (toKV { v = "spf1 mx ~all"; }) ];
78 };
79 };
80 };
81 zones = lib.mkOption {
82 type = lib.types.attrsOf (dns-nix.lib.types.zone.substSubModules (
83 dns-nix.lib.types.zone.getSubModules ++ [
84 ({ name, ... }: {
85 options = {
86 hasEmail = lib.mkEnableOption "This domain has e-mails configuration";
87 emailPolicies = lib.mkOption {
88 default = {};
89 type = lib.types.attrsOf (lib.types.submodule {
90 options = {
91 receive = lib.mkEnableOption "Configure this domain to receive e-mail";
92 };
93 });
94 apply = builtins.mapAttrs (n: v: v // {
95 domain = name;
96 fqdn = if n == "" then name else "${n}.${name}";
97 });
98 };
99 extraConfig = lib.mkOption {
100 type = lib.types.lines;
101 description = "Extra zone configuration for bind";
102 example = ''
103 notify yes;
104 '';
105 default = "";
106 };
107 slaves = lib.mkOption {
108 type = lib.types.listOf lib.types.str;
109 description = "NS slave groups of this zone";
110 default = [];
111 };
112 ns = lib.mkOption {
113 type = lib.types.listOf lib.types.str;
114 default = [];
115 };
116 };
117 })
118 ]));
119 apply = let
120 toNS = n: builtins.map (d: "${d}.") (builtins.concatMap (s: builtins.attrNames config.myEnv.dns.ns."${s}") n);
121 in
122 builtins.mapAttrs (n: v: v // { NS = v.NS or [] ++ toNS (v.ns); });
123 default = {};
124 description = ''
125 attrset of zones to configure
126 '';
127 };
128 };
129 config = let
130 cfg = config.services.bind;
131 in lib.mkIf config.myServices.dns.enable {
132 myServices.chatonsProperties.hostings.dns-secondaire = {
133 file.datetime = "2022-08-22T02:00:00";
134 hosting = {
135 name = "DNS secondaire";
136 description = "DNS secondaire";
137 website = "ns1.immae.eu";
138 status.level = "OK";
139 status.description = "OK";
140 registration.load = "OPEN";
141 install.type = "PACKAGE";
142 };
143 software = {
144 name = "bind9";
145 website = pkgs.bind.meta.homepage;
146 license.url = pkgs.bind.meta.license.url;
147 license.name = pkgs.bind.meta.license.fullName;
148 version = pkgs.bind.version;
149 source.url = "https://www.isc.org/download/";
150 };
151 };
152 myServices.dns.zones = with config.myServices.dns.helpers; {
153 "imsite.eu" = lib.mkMerge [
154 zoneHeader
155 (ips servers.eldiron.ips.main)
156 {
157 ns = [ "immae" ];
158 CAA = letsencrypt;
159 }
160 ];
161 "immae.dev" = lib.mkMerge [
162 {
163 extraConfig = ''
164 notify yes;
165 '';
166 slaves = [ "raito" ];
167 }
168 zoneHeader
169 (ips servers.eldiron.ips.integration)
170 {
171 ns = [ "immae" "raito" ];
172 CAA = letsencrypt;
173 }
174 ];
175 "immae.eu" = lib.mkMerge [
176 {
177 extraConfig = ''
178 notify yes;
179 '';
180 slaves = [ "raito" ];
181 }
182 zoneHeader
183 (ips servers.eldiron.ips.production)
184 {
185 ns = [ "immae" "raito" ];
186 CAA = letsencrypt;
187
188 # ns1 has glue records in gandi.net
189 subdomains.ns1 = ips servers.eldiron.ips.main;
190 # raito / kurisu.dual.lahfa.xyz ; replace with eldiron in case of problem
191 subdomains.ns2.A = builtins.map (address: { inherit address; ttl = 600; }) servers.eldiron.ips.main.ip4;
192 subdomains.ns2.AAAA = builtins.map (address: { inherit address; ttl = 600; }) servers.eldiron.ips.main.ip6;
193 }
194 {
195 # Machines local users
196 emailPolicies.localhost.receive = false;
197 subdomains.localhost = lib.mkMerge [ (mailCommon "immae.eu") mailSend ];
198 emailPolicies.eldiron.receive = true;
199 subdomains.eldiron = lib.mkMerge [ (mailCommon "immae.eu") mailSend ];
200 }
201 {
202 # For each server "server" and each server ip group "ipgroup",
203 # define ipgroup.server.immae.eu
204 # "main" is set as server.immae.eu instead
205 # if main has an "alias", it is duplicated with this alias.
206 # If the server is a vm, use the v.immae.eu namespace (only main is created)
207 subdomains = let
208 vms = lib.filterAttrs (n: v: v.isVm) servers;
209 bms = lib.filterAttrs (n: v: !v.isVm) servers;
210 toIps = type: builtins.mapAttrs (n: v: ips v.ips."${type}");
211 in
212 lib.mkMerge [
213 (toIps "main" bms)
214
215 { v.subdomains = toIps "main" vms; }
216
217 (lib.mapAttrs (_: v: {
218 subdomains = lib.mapAttrs'
219 (n': v': lib.nameValuePair "${if v'.alias == null then n' else v'.alias}" (ips v'))
220 (lib.filterAttrs (n': v': n' != "main" || v'.alias != null) v.ips);
221 }) bms)
222 ];
223 }
224 {
225 # Outils
226 subdomains = {
227 status = ips servers.monitoring-1.ips.main;
228 };
229 }
230 ];
231 };
232 networking.firewall.allowedUDPPorts = [ 53 ];
233 networking.firewall.allowedTCPPorts = [ 53 ];
234 users.users.named.extraGroups = [ "keys" ];
235 services.bind = {
236 enable = true;
237 cacheNetworks = ["any"];
238 extraOptions = ''
239 allow-recursion { 127.0.0.1; };
240 allow-transfer { none; };
241
242 notify-source ${lib.head config.myEnv.servers.eldiron.ips.main.ip4};
243 notify-source-v6 ${lib.head config.myEnv.servers.eldiron.ips.main.ip6};
244 version none;
245 hostname none;
246 server-id none;
247 '';
248 zones =
249 builtins.mapAttrs (name: v: {
250 master = true;
251 extraConfig = v.extraConfig;
252 masters = [];
253 slaves =
254 lib.flatten (map (n: builtins.attrValues config.myEnv.dns.ns.${n}) v.slaves);
255 file = pkgs.runCommand "${name}.zone" {
256 text = v;
257 passAsFile = [ "text" ];
258 # Automatically change the increment when relevant change
259 # happened (both serial and mta-sts)
260 } ''
261 mv "$textPath" $out
262 increment=$(( 100*($(date -u +%-H) * 60 + $(date -u +%-M))/1440 ))
263 sed -i -e "s/2022121902/$(date -u +%Y%m%d)$increment/g" $out
264 sed -i -e "s/20200109150200Z/$(date -u +%Y%m%d%H%M%SZ)/g" $out
265 '';
266 }) config.myServices.dns.zones;
267 };
268 myServices.monitoring.fromMasterActivatedPlugins = [ "dns" ];
269 myServices.monitoring.fromMasterObjects.service = lib.mkMerge (lib.mapAttrsToList (name: z:
270 lib.optional (builtins.elem "immae" z.ns) {
271 service_description = "eldiron dns is active and authoritative for ${name}";
272 host_name = config.hostEnv.fqdn;
273 use = "dns-service";
274 check_command = ["check_dns" name "-A"];
275
276 servicegroups = "webstatus-dns";
277 _webstatus_name = name;
278 } ++
279 lib.optional (builtins.elem "raito" z.ns) {
280 service_description = "raito dns is active and authoritative for ${name}";
281 host_name = config.hostEnv.fqdn;
282 use = "dns-service";
283 check_command = ["check_external_dns" "kurisu.dual.lahfa.xyz" name "-A"];
284
285 servicegroups = "webstatus-dns";
286 _webstatus_name = "${name} (Secondary DNS Raito)";
287 }
288 ) config.myServices.dns.zones);
289 };
290}
diff --git a/systems/eldiron/duply_backup.nix b/systems/eldiron/duply_backup.nix
new file mode 100644
index 0000000..590d125
--- /dev/null
+++ b/systems/eldiron/duply_backup.nix
@@ -0,0 +1,151 @@
1{ lib, pkgs, config, name, ... }:
2
3let
4 cfg = config.myEnv.backup;
5 varDir = "/var/lib/duply";
6 duplyProfile = profile: remote: prefix: ''
7 GPG_PW="${cfg.password}"
8 TARGET="${cfg.remotes.${remote}.remote profile.bucket}${prefix}"
9 export AWS_ACCESS_KEY_ID="${cfg.remotes.${remote}.accessKeyId}"
10 export AWS_SECRET_ACCESS_KEY="${cfg.remotes.${remote}.secretAccessKey}"
11 SOURCE="${profile.rootDir}"
12 FILENAME=".duplicity-ignore"
13 DUPL_PARAMS="$DUPL_PARAMS --exclude-if-present '$FILENAME'"
14 VERBOSITY=4
15 ARCH_DIR="${varDir}/caches"
16
17 # Do a full backup after 1 month
18 MAX_FULLBKP_AGE=1M
19 DUPL_PARAMS="$DUPL_PARAMS --allow-source-mismatch --exclude-other-filesystems --full-if-older-than $MAX_FULLBKP_AGE "
20 # Backups older than 2months are deleted
21 MAX_AGE=2M
22 # Keep 2 full backups
23 MAX_FULL_BACKUPS=2
24 MAX_FULLS_WITH_INCRS=2
25 '';
26 action = "bkp_purge_purgeFull_purgeIncr";
27 varName = k: remoteName:
28 if remoteName == "eriomem" then k else remoteName + "_" + k;
29in
30{
31 options = {
32 services.duplyBackup.enable = lib.mkOption {
33 type = lib.types.bool;
34 default = false;
35 description = ''
36 Whether to enable remote backups.
37 '';
38 };
39 services.duplyBackup.profiles = lib.mkOption {
40 type = lib.types.attrsOf (lib.types.submodule {
41 options = {
42 rootDir = lib.mkOption {
43 type = lib.types.path;
44 description = ''
45 Path to backup
46 '';
47 };
48 bucket = lib.mkOption {
49 type = lib.types.str;
50 default = "immae-${name}";
51 description = ''
52 Bucket to use
53 '';
54 };
55 remotes = lib.mkOption {
56 type = lib.types.listOf lib.types.str;
57 default = ["eriomem"];
58 description = ''
59 Remotes to use for backup
60 '';
61 };
62 excludeFile = lib.mkOption {
63 type = lib.types.lines;
64 default = "";
65 description = ''
66 Content to put in exclude file
67 '';
68 };
69 };
70 });
71 };
72 };
73
74 config = lib.mkIf config.services.duplyBackup.enable {
75 system.activationScripts.backup = ''
76 install -m 0700 -o root -g root -d ${varDir} ${varDir}/caches
77 '';
78 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (k: v:
79 map (remote: [
80 (lib.nameValuePair "backup/${varName k remote}/conf" {
81 permissions = "0400";
82 text = duplyProfile v remote "${k}/";
83 })
84 (lib.nameValuePair "backup/${varName k remote}/exclude" {
85 permissions = "0400";
86 text = v.excludeFile;
87 })
88 (lib.nameValuePair "backup/${varName k remote}" {
89 permissions = "0500";
90 isDir = true;
91 })
92 ]) v.remotes) config.services.duplyBackup.profiles));
93
94 services.cron = {
95 enable = true;
96 systemCronJobs = let
97 backups = pkgs.writeScript "backups" ''
98 #!${pkgs.stdenv.shell}
99
100 ${builtins.concatStringsSep "\n" (lib.flatten (lib.mapAttrsToList (k: v:
101 map (remote: [
102 ''
103 touch ${varDir}/${varName k remote}.log
104 ${pkgs.duply}/bin/duply ${config.secrets.fullPaths."backup/${varName k remote}"}/ ${action} --force >> ${varDir}/${varName k remote}.log
105 [[ $? = 0 ]] || echo -e "Error when doing backup for ${varName k remote}, see above\n---------------------------------------" >&2
106 ''
107 ]) v.remotes
108 ) config.services.duplyBackup.profiles))}
109 '';
110 in
111 [
112 "0 2 * * * root ${backups}"
113 ];
114
115 };
116
117 security.pki.certificateFiles = [
118 (pkgs.fetchurl {
119 url = "http://downloads.e.eriomem.net/eriomemca.pem";
120 sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh";
121 })
122 ];
123
124 myServices.monitoring.fromMasterActivatedPlugins = [ "eriomem" ];
125 myServices.monitoring.fromMasterObjects.service = [
126 {
127 service_description = "eriomem backup is up and not full";
128 host_name = config.hostEnv.fqdn;
129 use = "external-service";
130 check_command = "check_backup_eriomem";
131
132 check_interval = 120;
133 notification_interval = "1440";
134
135 servicegroups = "webstatus-backup";
136 }
137
138 {
139 service_description = "ovh backup is up and not full";
140 host_name = config.hostEnv.fqdn;
141 use = "external-service";
142 check_command = "check_ok";
143
144 check_interval = 120;
145 notification_interval = "1440";
146
147 servicegroups = "webstatus-backup";
148 }
149 ];
150 };
151}
diff --git a/systems/eldiron/ejabberd/default.nix b/systems/eldiron/ejabberd/default.nix
new file mode 100644
index 0000000..5268516
--- /dev/null
+++ b/systems/eldiron/ejabberd/default.nix
@@ -0,0 +1,141 @@
1{ lib, pkgs, config, mypackages-lib, ... }:
2let
3 cfg = config.myServices.ejabberd;
4in
5{
6 options.myServices = {
7 ejabberd.enable = lib.mkOption {
8 type = lib.types.bool;
9 default = false;
10 description = ''
11 Whether to enable ejabberd service.
12 '';
13 };
14 };
15
16 config = lib.mkIf cfg.enable {
17 myServices.dns.zones."immae.fr" = with config.myServices.dns.helpers;
18 lib.mkMerge [
19 {
20 extraConfig = ''
21 notify yes;
22 '';
23 slaves = [ "raito" ];
24 emailPolicies."".receive = true;
25 }
26 zoneHeader
27 mailMX
28 (mailCommon "immae.fr")
29 (ips servers.eldiron.ips.main)
30 {
31 ns = [ "immae" "raito" ];
32 CAA = letsencrypt;
33 subdomains.www = ips servers.eldiron.ips.production;
34 subdomains.im = ips servers.eldiron.ips.main;
35 subdomains.conference = ips servers.eldiron.ips.main;
36 subdomains.pubsub = ips servers.eldiron.ips.main;
37 subdomains.proxy = ips servers.eldiron.ips.main;
38 subdomains.upload = ips servers.eldiron.ips.main;
39 subdomains._xmppconnect.TXT = [
40 "_xmpp-client-xbosh=https://im.immae.fr/bosh"
41 "_xmpp-client-websocket=wss://im.immae.fr/ws"
42 ];
43 }
44 ];
45
46 security.acme.certs = {
47 "ejabberd" = {
48 group = "ejabberd";
49 domain = "eldiron.immae.eu";
50 keyType = "rsa4096";
51 postRun = ''
52 systemctl restart ejabberd.service
53 '';
54 extraDomainNames = [ "immae.fr" "conference.immae.fr" "proxy.immae.fr" "pubsub.immae.fr" "upload.immae.fr" ];
55 };
56 };
57 networking.firewall.allowedTCPPorts = [ 5222 5269 ];
58 myServices.websites.tools.im.enable = true;
59 systemd.services.ejabberd.postStop = ''
60 rm /var/log/ejabberd/erl_crash*.dump
61 '';
62 secrets.keys = {
63 "ejabberd/psql.yml" = {
64 permissions = "0400";
65 user = "ejabberd";
66 group = "ejabberd";
67 text = ''
68 sql_type: pgsql
69 sql_server: "localhost"
70 sql_database: "${config.myEnv.jabber.postgresql.database}"
71 sql_username: "${config.myEnv.jabber.postgresql.user}"
72 sql_password: "${config.myEnv.jabber.postgresql.password}"
73 '';
74 };
75 "ejabberd/host.yml" = {
76 permissions = "0400";
77 user = "ejabberd";
78 group = "ejabberd";
79 text = ''
80 host_config:
81 "immae.fr":
82 domain_certfile: "${config.security.acme.certs.ejabberd.directory}/full.pem"
83 auth_method: [ldap]
84 ldap_servers: ["${config.myEnv.jabber.ldap.host}"]
85 ldap_encrypt: tls
86 ldap_rootdn: "${config.myEnv.jabber.ldap.dn}"
87 ldap_password: "${config.myEnv.jabber.ldap.password}"
88 ldap_base: "${config.myEnv.jabber.ldap.base}"
89 ldap_uids:
90 uid: "%u"
91 immaeXmppUid: "%u"
92 ldap_filter: "${config.myEnv.jabber.ldap.filter}"
93 '';
94 };
95 };
96 users.users.ejabberd.extraGroups = [ "keys" ];
97 services.ejabberd = {
98 package = pkgs.ejabberd.override { withPgsql = true; };
99 imagemagick = true;
100 enable = true;
101 ctlConfig = ''
102 ERLANG_NODE=ejabberd@localhost
103 '';
104 configFile = pkgs.runCommand "ejabberd.yml" {
105 certificatePrivateKeyAndFullChain = "${config.security.acme.certs.ejabberd.directory}/full.pem";
106 certificateCA = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";
107 sql_config_file = config.secrets.fullPaths."ejabberd/psql.yml";
108 host_config_file = config.secrets.fullPaths."ejabberd/host.yml";
109 } ''
110 substituteAll ${./ejabberd.yml} $out
111 '';
112 };
113 secrets.keys."postfix/scripts/ejabberd-env" = {
114 user = "postfixscripts";
115 group = "root";
116 permissions = "0400";
117 text = builtins.toJSON {
118 jid = "notify_bot@immae.fr";
119 password = "{{ .xmpp.notify_bot }}";
120 };
121 };
122 services.postfix.extraAliases = let
123 nixpkgs = builtins.fetchTarball {
124 url = "https://github.com/NixOS/nixpkgs/archive/840c782d507d60aaa49aa9e3f6d0b0e780912742.tar.gz";
125 sha256 = "14q3kvnmgz19pgwyq52gxx0cs90ddf24pnplmq33pdddbb6c51zn";
126 };
127 pkgs' = import nixpkgs { inherit (pkgs) system; overlays = []; };
128 warn_xmpp_email = scriptEnv: pkgs'.runCommand "warn_xmpp_email" {
129 inherit scriptEnv;
130 pythonEnv = pkgs'.python3.withPackages (ps: [
131 ps.unidecode ps.slixmpp
132 ]);
133 } ''
134 substituteAll ${./warn_xmpp_email.py} $out
135 chmod a+x $out
136 '';
137 in ''
138 ejabberd: "|${mypackages-lib.postfixScript pkgs "ejabberd" (warn_xmpp_email config.secrets.fullPaths."postfix/scripts/ejabberd-env")}"
139 '';
140 };
141}
diff --git a/modules/private/ejabberd/ejabberd.yml b/systems/eldiron/ejabberd/ejabberd.yml
index 82ac35b..82ac35b 100644
--- a/modules/private/ejabberd/ejabberd.yml
+++ b/systems/eldiron/ejabberd/ejabberd.yml
diff --git a/systems/eldiron/ejabberd/warn_xmpp_email.py b/systems/eldiron/ejabberd/warn_xmpp_email.py
new file mode 100755
index 0000000..d482b43
--- /dev/null
+++ b/systems/eldiron/ejabberd/warn_xmpp_email.py
@@ -0,0 +1,112 @@
1#!@pythonEnv@/bin/python3
2
3import sys
4import json
5import slixmpp
6import asyncio
7import logging
8import io
9
10CONFIG = json.load(open("@scriptEnv@", "r"))
11
12def sanitize(string):
13 import re
14 from unidecode import unidecode
15 return re.compile(r"[^-.A-Za-z0-9_]").sub("_", unidecode(string))
16
17def parse_email():
18 import email
19 from email.header import decode_header
20
21 mail = email.message_from_file(sys.stdin)
22 try:
23 d = decode_header(mail["subject"])[0]
24 if d[1] is not None:
25 subject = d[0].decode(d[1])
26 else:
27 subject = d[0]
28 except Exception as e:
29 subject = mail["subject"]
30 sender = mail["from"]
31 recipient = mail["X-Original-To"]
32
33 body = ""
34 html = None
35 files = {}
36 for part in mail.walk():
37 if part.get_content_type() == "text/plain":
38 body += "\n-------------------\n"
39 try:
40 body += part.get_payload(decode=True).decode(encoding=part.get_content_charset() or "utf-8")
41 except Exception as e:
42 body += part.get_payload(decode=False)
43 elif part.get_content_type() == "text/html":
44 html = part.get_payload(decode=True)
45 elif part.get_content_type() != "text/html" and\
46 part.get_content_maintype() != "multipart":
47
48 filename = part.get_filename() or "{}.dat".format(part["Content-ID"])
49 files[sanitize(filename)] = (part.get_content_type(), part.get_payload(decode=True))
50
51 return [body, html, subject, sender, recipient, files]
52
53[body, html, subject, sender, recipient, files] = parse_email()
54
55class Bot(slixmpp.ClientXMPP):
56 def __init__(self, jid, password, body, html, subject, sender, recipient, files):
57 super().__init__(jid, password)
58
59 self.got_error = False
60 self.body = body
61 self.html = html
62 self.subject = subject
63 self.sender = sender
64 self.recipient = recipient
65 self.files = files
66 self.register_plugin('xep_0363')
67 self.add_event_handler("session_start", self.session_start)
68 self.add_event_handler("message", self.message)
69
70 @asyncio.coroutine
71 def session_start(self, event):
72 files = []
73 if self.html is not None:
74 url = yield from self['xep_0363'].upload_file(
75 "mail.html",
76 content_type="text/html",
77 input_file=io.BytesIO(self.html))
78 files.append(("HTML version", url))
79 for f in self.files:
80 url = yield from self['xep_0363'].upload_file(
81 f,
82 content_type=self.files[f][0],
83 input_file=io.BytesIO(self.files[f][1])
84 )
85 files.append((f, url))
86
87 text = """
88New e-mail message from {sender}
89Subject: {subject}
90{body}
91""".format(sender=self.sender, subject=self.subject, body=self.body)
92 if len(files) > 0:
93 text += "\n\nAttachments:"
94 for f in files:
95 text += "\n{}: {}".format(f[0], f[1])
96 self.send_message(mto=self.recipient, mbody=text, msubject=self.subject, mtype='message')
97 yield from asyncio.sleep(5)
98 self.disconnect()
99
100 @asyncio.coroutine
101 def message(self, msg):
102 if msg["type"] == "error":
103 self.got_error = True
104
105logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s %(message)s')
106xmpp = Bot(CONFIG["jid"], CONFIG["password"], body, html, subject, sender, recipient, files)
107xmpp.connect()
108xmpp.process(forever=False)
109if xmpp.got_error:
110 sys.exit(1)
111else:
112 sys.exit(0)
diff --git a/systems/eldiron/flake.lock b/systems/eldiron/flake.lock
new file mode 100644
index 0000000..99a5c92
--- /dev/null
+++ b/systems/eldiron/flake.lock
@@ -0,0 +1,2758 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_12",
6 "nixpkgs": "nixpkgs_15"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "buildslist": {
20 "flake": false,
21 "locked": {
22 "lastModified": 1585697026,
23 "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
24 "ref": "master",
25 "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
26 "revCount": 4,
27 "type": "git",
28 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
29 },
30 "original": {
31 "type": "git",
32 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
33 }
34 },
35 "colmena": {
36 "inputs": {
37 "flake-compat": "flake-compat",
38 "flake-utils": "flake-utils_2",
39 "nixpkgs": "nixpkgs",
40 "stable": "stable"
41 },
42 "locked": {
43 "lastModified": 1687954574,
44 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
45 "owner": "immae",
46 "repo": "colmena",
47 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
48 "type": "github"
49 },
50 "original": {
51 "owner": "immae",
52 "ref": "add-lib-get-flake",
53 "repo": "colmena",
54 "type": "github"
55 }
56 },
57 "copanier": {
58 "flake": false,
59 "locked": {
60 "lastModified": 1633895178,
61 "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
62 "owner": "spiral-project",
63 "repo": "copanier",
64 "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
65 "type": "github"
66 },
67 "original": {
68 "owner": "spiral-project",
69 "repo": "copanier",
70 "type": "github"
71 }
72 },
73 "diaspora": {
74 "flake": false,
75 "locked": {
76 "lastModified": 1551139311,
77 "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
78 "owner": "diaspora",
79 "repo": "diaspora",
80 "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
81 "type": "github"
82 },
83 "original": {
84 "owner": "diaspora",
85 "ref": "v0.7.10.0",
86 "repo": "diaspora",
87 "type": "github"
88 }
89 },
90 "disko": {
91 "inputs": {
92 "nixpkgs": "nixpkgs_2"
93 },
94 "locked": {
95 "lastModified": 1687968164,
96 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
97 "owner": "nix-community",
98 "repo": "disko",
99 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
100 "type": "github"
101 },
102 "original": {
103 "owner": "nix-community",
104 "repo": "disko",
105 "type": "github"
106 }
107 },
108 "dns-nix": {
109 "inputs": {
110 "flake-utils": "flake-utils",
111 "nixpkgs": [
112 "nixpkgs"
113 ]
114 },
115 "locked": {
116 "lastModified": 1635273082,
117 "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=",
118 "owner": "kirelagin",
119 "repo": "dns.nix",
120 "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a",
121 "type": "github"
122 },
123 "original": {
124 "owner": "kirelagin",
125 "repo": "dns.nix",
126 "type": "github"
127 }
128 },
129 "environment": {
130 "locked": {
131 "lastModified": 1,
132 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
133 "path": "../environment",
134 "type": "path"
135 },
136 "original": {
137 "path": "../environment",
138 "type": "path"
139 }
140 },
141 "environment_2": {
142 "locked": {
143 "lastModified": 1,
144 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
145 "path": "../environment",
146 "type": "path"
147 },
148 "original": {
149 "path": "../environment",
150 "type": "path"
151 }
152 },
153 "environment_3": {
154 "locked": {
155 "lastModified": 1,
156 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
157 "path": "../environment",
158 "type": "path"
159 },
160 "original": {
161 "path": "../environment",
162 "type": "path"
163 }
164 },
165 "environment_4": {
166 "locked": {
167 "lastModified": 1,
168 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
169 "path": "../environment",
170 "type": "path"
171 },
172 "original": {
173 "path": "../environment",
174 "type": "path"
175 }
176 },
177 "environment_5": {
178 "locked": {
179 "lastModified": 1,
180 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
181 "path": "../environment",
182 "type": "path"
183 },
184 "original": {
185 "path": "../environment",
186 "type": "path"
187 }
188 },
189 "environment_6": {
190 "locked": {
191 "lastModified": 1,
192 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
193 "path": "../environment",
194 "type": "path"
195 },
196 "original": {
197 "path": "../environment",
198 "type": "path"
199 }
200 },
201 "etherpad-lite": {
202 "flake": false,
203 "locked": {
204 "lastModified": 1587951095,
205 "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
206 "owner": "ether",
207 "repo": "etherpad-lite",
208 "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
209 "type": "github"
210 },
211 "original": {
212 "owner": "ether",
213 "ref": "1.8.3",
214 "repo": "etherpad-lite",
215 "type": "github"
216 }
217 },
218 "files-watcher": {
219 "locked": {
220 "lastModified": 1,
221 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
222 "path": "../../files-watcher",
223 "type": "path"
224 },
225 "original": {
226 "path": "../../files-watcher",
227 "type": "path"
228 }
229 },
230 "files-watcher_2": {
231 "locked": {
232 "lastModified": 1,
233 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
234 "path": "../../files-watcher",
235 "type": "path"
236 },
237 "original": {
238 "path": "../../files-watcher",
239 "type": "path"
240 }
241 },
242 "files-watcher_3": {
243 "locked": {
244 "lastModified": 1,
245 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
246 "path": "../../files-watcher",
247 "type": "path"
248 },
249 "original": {
250 "path": "../../files-watcher",
251 "type": "path"
252 }
253 },
254 "files-watcher_4": {
255 "locked": {
256 "lastModified": 1,
257 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
258 "path": "../files-watcher",
259 "type": "path"
260 },
261 "original": {
262 "path": "../files-watcher",
263 "type": "path"
264 }
265 },
266 "flake-compat": {
267 "flake": false,
268 "locked": {
269 "lastModified": 1650374568,
270 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
271 "owner": "edolstra",
272 "repo": "flake-compat",
273 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
274 "type": "github"
275 },
276 "original": {
277 "owner": "edolstra",
278 "repo": "flake-compat",
279 "type": "github"
280 }
281 },
282 "flake-parts": {
283 "inputs": {
284 "nixpkgs-lib": "nixpkgs-lib"
285 },
286 "locked": {
287 "lastModified": 1687762428,
288 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
289 "owner": "hercules-ci",
290 "repo": "flake-parts",
291 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
292 "type": "github"
293 },
294 "original": {
295 "owner": "hercules-ci",
296 "repo": "flake-parts",
297 "type": "github"
298 }
299 },
300 "flake-parts_2": {
301 "inputs": {
302 "nixpkgs-lib": "nixpkgs-lib_3"
303 },
304 "locked": {
305 "lastModified": 1675295133,
306 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
307 "owner": "hercules-ci",
308 "repo": "flake-parts",
309 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
310 "type": "github"
311 },
312 "original": {
313 "owner": "hercules-ci",
314 "repo": "flake-parts",
315 "type": "github"
316 }
317 },
318 "flake-parts_3": {
319 "inputs": {
320 "nixpkgs-lib": "nixpkgs-lib_4"
321 },
322 "locked": {
323 "lastModified": 1675295133,
324 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
325 "owner": "hercules-ci",
326 "repo": "flake-parts",
327 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
328 "type": "github"
329 },
330 "original": {
331 "owner": "hercules-ci",
332 "repo": "flake-parts",
333 "type": "github"
334 }
335 },
336 "flake-parts_4": {
337 "inputs": {
338 "nixpkgs-lib": "nixpkgs-lib_5"
339 },
340 "locked": {
341 "lastModified": 1675295133,
342 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
343 "owner": "hercules-ci",
344 "repo": "flake-parts",
345 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
346 "type": "github"
347 },
348 "original": {
349 "owner": "hercules-ci",
350 "repo": "flake-parts",
351 "type": "github"
352 }
353 },
354 "flake-parts_5": {
355 "inputs": {
356 "nixpkgs-lib": "nixpkgs-lib_6"
357 },
358 "locked": {
359 "lastModified": 1675295133,
360 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
361 "owner": "hercules-ci",
362 "repo": "flake-parts",
363 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
364 "type": "github"
365 },
366 "original": {
367 "owner": "hercules-ci",
368 "repo": "flake-parts",
369 "type": "github"
370 }
371 },
372 "flake-parts_6": {
373 "inputs": {
374 "nixpkgs-lib": "nixpkgs-lib_7"
375 },
376 "locked": {
377 "lastModified": 1675295133,
378 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
379 "owner": "hercules-ci",
380 "repo": "flake-parts",
381 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
382 "type": "github"
383 },
384 "original": {
385 "owner": "hercules-ci",
386 "repo": "flake-parts",
387 "type": "github"
388 }
389 },
390 "flake-utils": {
391 "locked": {
392 "lastModified": 1614513358,
393 "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=",
394 "owner": "numtide",
395 "repo": "flake-utils",
396 "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3",
397 "type": "github"
398 },
399 "original": {
400 "owner": "numtide",
401 "repo": "flake-utils",
402 "type": "github"
403 }
404 },
405 "flake-utils_10": {
406 "locked": {
407 "lastModified": 1610051610,
408 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
409 "owner": "numtide",
410 "repo": "flake-utils",
411 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
412 "type": "github"
413 },
414 "original": {
415 "owner": "numtide",
416 "repo": "flake-utils",
417 "type": "github"
418 }
419 },
420 "flake-utils_11": {
421 "locked": {
422 "lastModified": 1648297722,
423 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
424 "owner": "numtide",
425 "repo": "flake-utils",
426 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
427 "type": "github"
428 },
429 "original": {
430 "owner": "numtide",
431 "repo": "flake-utils",
432 "type": "github"
433 }
434 },
435 "flake-utils_12": {
436 "locked": {
437 "lastModified": 1667395993,
438 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
439 "owner": "numtide",
440 "repo": "flake-utils",
441 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
442 "type": "github"
443 },
444 "original": {
445 "owner": "numtide",
446 "repo": "flake-utils",
447 "type": "github"
448 }
449 },
450 "flake-utils_13": {
451 "locked": {
452 "lastModified": 1631561581,
453 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
454 "owner": "numtide",
455 "repo": "flake-utils",
456 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
457 "type": "github"
458 },
459 "original": {
460 "owner": "numtide",
461 "repo": "flake-utils",
462 "type": "github"
463 }
464 },
465 "flake-utils_14": {
466 "locked": {
467 "lastModified": 1648297722,
468 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
469 "owner": "numtide",
470 "repo": "flake-utils",
471 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
472 "type": "github"
473 },
474 "original": {
475 "owner": "numtide",
476 "repo": "flake-utils",
477 "type": "github"
478 }
479 },
480 "flake-utils_15": {
481 "locked": {
482 "lastModified": 1648297722,
483 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
484 "owner": "numtide",
485 "repo": "flake-utils",
486 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
487 "type": "github"
488 },
489 "original": {
490 "owner": "numtide",
491 "repo": "flake-utils",
492 "type": "github"
493 }
494 },
495 "flake-utils_16": {
496 "locked": {
497 "lastModified": 1648297722,
498 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
499 "owner": "numtide",
500 "repo": "flake-utils",
501 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
502 "type": "github"
503 },
504 "original": {
505 "owner": "numtide",
506 "repo": "flake-utils",
507 "type": "github"
508 }
509 },
510 "flake-utils_17": {
511 "locked": {
512 "lastModified": 1648297722,
513 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
514 "owner": "numtide",
515 "repo": "flake-utils",
516 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
517 "type": "github"
518 },
519 "original": {
520 "owner": "numtide",
521 "repo": "flake-utils",
522 "type": "github"
523 }
524 },
525 "flake-utils_18": {
526 "locked": {
527 "lastModified": 1649676176,
528 "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
529 "owner": "numtide",
530 "repo": "flake-utils",
531 "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
532 "type": "github"
533 },
534 "original": {
535 "owner": "numtide",
536 "repo": "flake-utils",
537 "type": "github"
538 }
539 },
540 "flake-utils_19": {
541 "locked": {
542 "lastModified": 1609246779,
543 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
544 "owner": "numtide",
545 "repo": "flake-utils",
546 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
547 "type": "github"
548 },
549 "original": {
550 "owner": "numtide",
551 "repo": "flake-utils",
552 "type": "github"
553 }
554 },
555 "flake-utils_2": {
556 "locked": {
557 "lastModified": 1659877975,
558 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
559 "owner": "numtide",
560 "repo": "flake-utils",
561 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
562 "type": "github"
563 },
564 "original": {
565 "owner": "numtide",
566 "repo": "flake-utils",
567 "type": "github"
568 }
569 },
570 "flake-utils_20": {
571 "locked": {
572 "lastModified": 1609246779,
573 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
574 "owner": "numtide",
575 "repo": "flake-utils",
576 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
577 "type": "github"
578 },
579 "original": {
580 "owner": "numtide",
581 "repo": "flake-utils",
582 "type": "github"
583 }
584 },
585 "flake-utils_21": {
586 "locked": {
587 "lastModified": 1610051610,
588 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
589 "owner": "numtide",
590 "repo": "flake-utils",
591 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
592 "type": "github"
593 },
594 "original": {
595 "owner": "numtide",
596 "repo": "flake-utils",
597 "type": "github"
598 }
599 },
600 "flake-utils_22": {
601 "locked": {
602 "lastModified": 1648297722,
603 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
604 "owner": "numtide",
605 "repo": "flake-utils",
606 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
607 "type": "github"
608 },
609 "original": {
610 "owner": "numtide",
611 "repo": "flake-utils",
612 "type": "github"
613 }
614 },
615 "flake-utils_23": {
616 "locked": {
617 "lastModified": 1648297722,
618 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
619 "owner": "numtide",
620 "repo": "flake-utils",
621 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
622 "type": "github"
623 },
624 "original": {
625 "owner": "numtide",
626 "repo": "flake-utils",
627 "type": "github"
628 }
629 },
630 "flake-utils_3": {
631 "locked": {
632 "lastModified": 1648297722,
633 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
634 "owner": "numtide",
635 "repo": "flake-utils",
636 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
637 "type": "github"
638 },
639 "original": {
640 "owner": "numtide",
641 "repo": "flake-utils",
642 "type": "github"
643 }
644 },
645 "flake-utils_4": {
646 "locked": {
647 "lastModified": 1609246779,
648 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
649 "owner": "numtide",
650 "repo": "flake-utils",
651 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
652 "type": "github"
653 },
654 "original": {
655 "owner": "numtide",
656 "repo": "flake-utils",
657 "type": "github"
658 }
659 },
660 "flake-utils_5": {
661 "locked": {
662 "lastModified": 1609246779,
663 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
664 "owner": "numtide",
665 "repo": "flake-utils",
666 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
667 "type": "github"
668 },
669 "original": {
670 "owner": "numtide",
671 "repo": "flake-utils",
672 "type": "github"
673 }
674 },
675 "flake-utils_6": {
676 "locked": {
677 "lastModified": 1609246779,
678 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
679 "owner": "numtide",
680 "repo": "flake-utils",
681 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
682 "type": "github"
683 },
684 "original": {
685 "owner": "numtide",
686 "repo": "flake-utils",
687 "type": "github"
688 }
689 },
690 "flake-utils_7": {
691 "locked": {
692 "lastModified": 1609246779,
693 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
694 "owner": "numtide",
695 "repo": "flake-utils",
696 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
697 "type": "github"
698 },
699 "original": {
700 "owner": "numtide",
701 "repo": "flake-utils",
702 "type": "github"
703 }
704 },
705 "flake-utils_8": {
706 "locked": {
707 "lastModified": 1631561581,
708 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
709 "owner": "numtide",
710 "repo": "flake-utils",
711 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
712 "type": "github"
713 },
714 "original": {
715 "owner": "numtide",
716 "repo": "flake-utils",
717 "type": "github"
718 }
719 },
720 "flake-utils_9": {
721 "locked": {
722 "lastModified": 1610051610,
723 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
724 "owner": "numtide",
725 "repo": "flake-utils",
726 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
727 "type": "github"
728 },
729 "original": {
730 "owner": "numtide",
731 "repo": "flake-utils",
732 "type": "github"
733 }
734 },
735 "grocy": {
736 "flake": false,
737 "locked": {
738 "lastModified": 1585166193,
739 "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
740 "owner": "grocy",
741 "repo": "grocy",
742 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
743 "type": "github"
744 },
745 "original": {
746 "owner": "grocy",
747 "repo": "grocy",
748 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
749 "type": "github"
750 }
751 },
752 "mastodon": {
753 "flake": false,
754 "locked": {
755 "lastModified": 1582790581,
756 "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
757 "owner": "tootsuite",
758 "repo": "mastodon",
759 "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
760 "type": "github"
761 },
762 "original": {
763 "owner": "tootsuite",
764 "ref": "v2.9.4",
765 "repo": "mastodon",
766 "type": "github"
767 }
768 },
769 "mediagoblin": {
770 "flake": false,
771 "locked": {
772 "lastModified": 1531090939,
773 "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
774 "ref": "stable",
775 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
776 "revCount": 4805,
777 "submodules": true,
778 "type": "git",
779 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
780 },
781 "original": {
782 "ref": "stable",
783 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
784 "submodules": true,
785 "type": "git",
786 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
787 }
788 },
789 "my-lib": {
790 "inputs": {
791 "colmena": "colmena",
792 "disko": "disko",
793 "flake-parts": "flake-parts",
794 "nixos-anywhere": "nixos-anywhere",
795 "nixpkgs": "nixpkgs_4"
796 },
797 "locked": {
798 "lastModified": 1,
799 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
800 "path": "../../flakes/lib",
801 "type": "path"
802 },
803 "original": {
804 "path": "../../flakes/lib",
805 "type": "path"
806 }
807 },
808 "mypackages": {
809 "inputs": {
810 "flake-parts": "flake-parts_2",
811 "nixpkgs": "nixpkgs_16",
812 "webapps-ttrss": "webapps-ttrss"
813 },
814 "locked": {
815 "lastModified": 1,
816 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
817 "path": "../../mypackages",
818 "type": "path"
819 },
820 "original": {
821 "path": "../../mypackages",
822 "type": "path"
823 }
824 },
825 "mypackages_2": {
826 "inputs": {
827 "flake-parts": "flake-parts_3",
828 "nixpkgs": "nixpkgs_19",
829 "webapps-ttrss": "webapps-ttrss_2"
830 },
831 "locked": {
832 "lastModified": 1,
833 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
834 "path": "../mypackages",
835 "type": "path"
836 },
837 "original": {
838 "path": "../mypackages",
839 "type": "path"
840 }
841 },
842 "mypackages_3": {
843 "inputs": {
844 "flake-parts": "flake-parts_4",
845 "nixpkgs": "nixpkgs_21",
846 "webapps-ttrss": "webapps-ttrss_3"
847 },
848 "locked": {
849 "lastModified": 1,
850 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
851 "path": "../mypackages",
852 "type": "path"
853 },
854 "original": {
855 "path": "../mypackages",
856 "type": "path"
857 }
858 },
859 "mypackages_4": {
860 "inputs": {
861 "flake-parts": "flake-parts_6",
862 "nixpkgs": "nixpkgs_29",
863 "webapps-ttrss": "webapps-ttrss_5"
864 },
865 "locked": {
866 "lastModified": 1,
867 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
868 "path": "../mypackages",
869 "type": "path"
870 },
871 "original": {
872 "path": "../mypackages",
873 "type": "path"
874 }
875 },
876 "myuids": {
877 "locked": {
878 "lastModified": 1,
879 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
880 "path": "../myuids",
881 "type": "path"
882 },
883 "original": {
884 "path": "../myuids",
885 "type": "path"
886 }
887 },
888 "myuids_10": {
889 "locked": {
890 "lastModified": 1,
891 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
892 "path": "../myuids",
893 "type": "path"
894 },
895 "original": {
896 "path": "../myuids",
897 "type": "path"
898 }
899 },
900 "myuids_11": {
901 "locked": {
902 "lastModified": 1,
903 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
904 "path": "../myuids",
905 "type": "path"
906 },
907 "original": {
908 "path": "../myuids",
909 "type": "path"
910 }
911 },
912 "myuids_12": {
913 "locked": {
914 "lastModified": 1,
915 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
916 "path": "../myuids",
917 "type": "path"
918 },
919 "original": {
920 "path": "../myuids",
921 "type": "path"
922 }
923 },
924 "myuids_13": {
925 "locked": {
926 "lastModified": 1,
927 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
928 "path": "../myuids",
929 "type": "path"
930 },
931 "original": {
932 "path": "../myuids",
933 "type": "path"
934 }
935 },
936 "myuids_14": {
937 "locked": {
938 "lastModified": 1,
939 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
940 "path": "../myuids",
941 "type": "path"
942 },
943 "original": {
944 "path": "../myuids",
945 "type": "path"
946 }
947 },
948 "myuids_2": {
949 "locked": {
950 "lastModified": 1,
951 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
952 "path": "../myuids",
953 "type": "path"
954 },
955 "original": {
956 "path": "../myuids",
957 "type": "path"
958 }
959 },
960 "myuids_3": {
961 "locked": {
962 "lastModified": 1,
963 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
964 "path": "../myuids",
965 "type": "path"
966 },
967 "original": {
968 "path": "../myuids",
969 "type": "path"
970 }
971 },
972 "myuids_4": {
973 "locked": {
974 "lastModified": 1,
975 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
976 "path": "../myuids",
977 "type": "path"
978 },
979 "original": {
980 "path": "../myuids",
981 "type": "path"
982 }
983 },
984 "myuids_5": {
985 "locked": {
986 "lastModified": 1,
987 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
988 "path": "../myuids",
989 "type": "path"
990 },
991 "original": {
992 "path": "../myuids",
993 "type": "path"
994 }
995 },
996 "myuids_6": {
997 "locked": {
998 "lastModified": 1,
999 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
1000 "path": "../myuids",
1001 "type": "path"
1002 },
1003 "original": {
1004 "path": "../myuids",
1005 "type": "path"
1006 }
1007 },
1008 "myuids_7": {
1009 "locked": {
1010 "lastModified": 1,
1011 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
1012 "path": "../../myuids",
1013 "type": "path"
1014 },
1015 "original": {
1016 "path": "../../myuids",
1017 "type": "path"
1018 }
1019 },
1020 "myuids_8": {
1021 "locked": {
1022 "lastModified": 1,
1023 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
1024 "path": "../myuids",
1025 "type": "path"
1026 },
1027 "original": {
1028 "path": "../myuids",
1029 "type": "path"
1030 }
1031 },
1032 "myuids_9": {
1033 "locked": {
1034 "lastModified": 1,
1035 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
1036 "path": "../myuids",
1037 "type": "path"
1038 },
1039 "original": {
1040 "path": "../myuids",
1041 "type": "path"
1042 }
1043 },
1044 "naemon": {
1045 "locked": {
1046 "lastModified": 1,
1047 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
1048 "path": "../../naemon",
1049 "type": "path"
1050 },
1051 "original": {
1052 "path": "../../naemon",
1053 "type": "path"
1054 }
1055 },
1056 "nixos-2305": {
1057 "locked": {
1058 "lastModified": 1687938137,
1059 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
1060 "owner": "NixOS",
1061 "repo": "nixpkgs",
1062 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
1063 "type": "github"
1064 },
1065 "original": {
1066 "owner": "NixOS",
1067 "ref": "release-23.05",
1068 "repo": "nixpkgs",
1069 "type": "github"
1070 }
1071 },
1072 "nixos-anywhere": {
1073 "inputs": {
1074 "disko": [
1075 "my-lib",
1076 "disko"
1077 ],
1078 "flake-parts": [
1079 "my-lib",
1080 "flake-parts"
1081 ],
1082 "nixos-2305": "nixos-2305",
1083 "nixos-images": "nixos-images",
1084 "nixpkgs": "nixpkgs_3",
1085 "treefmt-nix": "treefmt-nix"
1086 },
1087 "locked": {
1088 "lastModified": 1689945193,
1089 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
1090 "owner": "numtide",
1091 "repo": "nixos-anywhere",
1092 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
1093 "type": "github"
1094 },
1095 "original": {
1096 "owner": "numtide",
1097 "repo": "nixos-anywhere",
1098 "type": "github"
1099 }
1100 },
1101 "nixos-images": {
1102 "inputs": {
1103 "nixos-2305": [
1104 "my-lib",
1105 "nixos-anywhere",
1106 "nixos-2305"
1107 ],
1108 "nixos-unstable": [
1109 "my-lib",
1110 "nixos-anywhere",
1111 "nixpkgs"
1112 ]
1113 },
1114 "locked": {
1115 "lastModified": 1686819168,
1116 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
1117 "owner": "nix-community",
1118 "repo": "nixos-images",
1119 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
1120 "type": "github"
1121 },
1122 "original": {
1123 "owner": "nix-community",
1124 "repo": "nixos-images",
1125 "type": "github"
1126 }
1127 },
1128 "nixpkgs": {
1129 "locked": {
1130 "lastModified": 1683408522,
1131 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
1132 "owner": "NixOS",
1133 "repo": "nixpkgs",
1134 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
1135 "type": "github"
1136 },
1137 "original": {
1138 "owner": "NixOS",
1139 "ref": "nixos-unstable",
1140 "repo": "nixpkgs",
1141 "type": "github"
1142 }
1143 },
1144 "nixpkgs-4": {
1145 "flake": false,
1146 "locked": {
1147 "lastModified": 1646497237,
1148 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1149 "owner": "NixOS",
1150 "repo": "nixpkgs",
1151 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1152 "type": "github"
1153 },
1154 "original": {
1155 "owner": "NixOS",
1156 "repo": "nixpkgs",
1157 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1158 "type": "github"
1159 }
1160 },
1161 "nixpkgs-lib": {
1162 "locked": {
1163 "dir": "lib",
1164 "lastModified": 1685564631,
1165 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
1166 "owner": "NixOS",
1167 "repo": "nixpkgs",
1168 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
1169 "type": "github"
1170 },
1171 "original": {
1172 "dir": "lib",
1173 "owner": "NixOS",
1174 "ref": "nixos-unstable",
1175 "repo": "nixpkgs",
1176 "type": "github"
1177 }
1178 },
1179 "nixpkgs-lib_2": {
1180 "locked": {
1181 "dir": "lib",
1182 "lastModified": 1691269286,
1183 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
1184 "owner": "NixOS",
1185 "repo": "nixpkgs",
1186 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
1187 "type": "github"
1188 },
1189 "original": {
1190 "dir": "lib",
1191 "owner": "NixOS",
1192 "repo": "nixpkgs",
1193 "type": "github"
1194 }
1195 },
1196 "nixpkgs-lib_3": {
1197 "locked": {
1198 "dir": "lib",
1199 "lastModified": 1675183161,
1200 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
1201 "owner": "NixOS",
1202 "repo": "nixpkgs",
1203 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
1204 "type": "github"
1205 },
1206 "original": {
1207 "dir": "lib",
1208 "owner": "NixOS",
1209 "ref": "nixos-unstable",
1210 "repo": "nixpkgs",
1211 "type": "github"
1212 }
1213 },
1214 "nixpkgs-lib_4": {
1215 "locked": {
1216 "dir": "lib",
1217 "lastModified": 1675183161,
1218 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
1219 "owner": "NixOS",
1220 "repo": "nixpkgs",
1221 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
1222 "type": "github"
1223 },
1224 "original": {
1225 "dir": "lib",
1226 "owner": "NixOS",
1227 "ref": "nixos-unstable",
1228 "repo": "nixpkgs",
1229 "type": "github"
1230 }
1231 },
1232 "nixpkgs-lib_5": {
1233 "locked": {
1234 "dir": "lib",
1235 "lastModified": 1675183161,
1236 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
1237 "owner": "NixOS",
1238 "repo": "nixpkgs",
1239 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
1240 "type": "github"
1241 },
1242 "original": {
1243 "dir": "lib",
1244 "owner": "NixOS",
1245 "ref": "nixos-unstable",
1246 "repo": "nixpkgs",
1247 "type": "github"
1248 }
1249 },
1250 "nixpkgs-lib_6": {
1251 "locked": {
1252 "dir": "lib",
1253 "lastModified": 1675183161,
1254 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
1255 "owner": "NixOS",
1256 "repo": "nixpkgs",
1257 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
1258 "type": "github"
1259 },
1260 "original": {
1261 "dir": "lib",
1262 "owner": "NixOS",
1263 "ref": "nixos-unstable",
1264 "repo": "nixpkgs",
1265 "type": "github"
1266 }
1267 },
1268 "nixpkgs-lib_7": {
1269 "locked": {
1270 "dir": "lib",
1271 "lastModified": 1675183161,
1272 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
1273 "owner": "NixOS",
1274 "repo": "nixpkgs",
1275 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
1276 "type": "github"
1277 },
1278 "original": {
1279 "dir": "lib",
1280 "owner": "NixOS",
1281 "ref": "nixos-unstable",
1282 "repo": "nixpkgs",
1283 "type": "github"
1284 }
1285 },
1286 "nixpkgs_10": {
1287 "locked": {
1288 "lastModified": 1597943282,
1289 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1290 "owner": "NixOS",
1291 "repo": "nixpkgs",
1292 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1293 "type": "github"
1294 },
1295 "original": {
1296 "owner": "NixOS",
1297 "repo": "nixpkgs",
1298 "type": "github"
1299 }
1300 },
1301 "nixpkgs_11": {
1302 "locked": {
1303 "lastModified": 1631570365,
1304 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
1305 "owner": "NixOS",
1306 "repo": "nixpkgs",
1307 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
1308 "type": "github"
1309 },
1310 "original": {
1311 "owner": "NixOS",
1312 "repo": "nixpkgs",
1313 "type": "github"
1314 }
1315 },
1316 "nixpkgs_12": {
1317 "locked": {
1318 "lastModified": 1611097871,
1319 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
1320 "owner": "NixOS",
1321 "repo": "nixpkgs",
1322 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
1323 "type": "github"
1324 },
1325 "original": {
1326 "owner": "NixOS",
1327 "repo": "nixpkgs",
1328 "type": "github"
1329 }
1330 },
1331 "nixpkgs_13": {
1332 "locked": {
1333 "lastModified": 1611097871,
1334 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
1335 "owner": "NixOS",
1336 "repo": "nixpkgs",
1337 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
1338 "type": "github"
1339 },
1340 "original": {
1341 "owner": "NixOS",
1342 "repo": "nixpkgs",
1343 "type": "github"
1344 }
1345 },
1346 "nixpkgs_14": {
1347 "flake": false,
1348 "locked": {
1349 "lastModified": 1596265691,
1350 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1351 "owner": "NixOS",
1352 "repo": "nixpkgs",
1353 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1354 "type": "github"
1355 },
1356 "original": {
1357 "owner": "NixOS",
1358 "repo": "nixpkgs",
1359 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1360 "type": "github"
1361 }
1362 },
1363 "nixpkgs_15": {
1364 "locked": {
1365 "lastModified": 1687502512,
1366 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
1367 "owner": "NixOS",
1368 "repo": "nixpkgs",
1369 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
1370 "type": "github"
1371 },
1372 "original": {
1373 "owner": "NixOS",
1374 "ref": "nixos-unstable",
1375 "repo": "nixpkgs",
1376 "type": "github"
1377 }
1378 },
1379 "nixpkgs_16": {
1380 "locked": {
1381 "lastModified": 1646497237,
1382 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1383 "owner": "nixos",
1384 "repo": "nixpkgs",
1385 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1386 "type": "github"
1387 },
1388 "original": {
1389 "owner": "nixos",
1390 "repo": "nixpkgs",
1391 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1392 "type": "github"
1393 }
1394 },
1395 "nixpkgs_17": {
1396 "locked": {
1397 "lastModified": 1633901457,
1398 "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
1399 "owner": "NixOS",
1400 "repo": "nixpkgs",
1401 "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
1402 "type": "github"
1403 },
1404 "original": {
1405 "owner": "NixOS",
1406 "repo": "nixpkgs",
1407 "type": "github"
1408 }
1409 },
1410 "nixpkgs_18": {
1411 "flake": false,
1412 "locked": {
1413 "lastModified": 1596265691,
1414 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1415 "owner": "NixOS",
1416 "repo": "nixpkgs",
1417 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1418 "type": "github"
1419 },
1420 "original": {
1421 "owner": "NixOS",
1422 "repo": "nixpkgs",
1423 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1424 "type": "github"
1425 }
1426 },
1427 "nixpkgs_19": {
1428 "locked": {
1429 "lastModified": 1646497237,
1430 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1431 "owner": "nixos",
1432 "repo": "nixpkgs",
1433 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1434 "type": "github"
1435 },
1436 "original": {
1437 "owner": "nixos",
1438 "repo": "nixpkgs",
1439 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1440 "type": "github"
1441 }
1442 },
1443 "nixpkgs_2": {
1444 "locked": {
1445 "lastModified": 1687701825,
1446 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
1447 "owner": "NixOS",
1448 "repo": "nixpkgs",
1449 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
1450 "type": "github"
1451 },
1452 "original": {
1453 "owner": "NixOS",
1454 "ref": "nixpkgs-unstable",
1455 "repo": "nixpkgs",
1456 "type": "github"
1457 }
1458 },
1459 "nixpkgs_20": {
1460 "flake": false,
1461 "locked": {
1462 "lastModified": 1596265691,
1463 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1464 "owner": "NixOS",
1465 "repo": "nixpkgs",
1466 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1467 "type": "github"
1468 },
1469 "original": {
1470 "owner": "NixOS",
1471 "repo": "nixpkgs",
1472 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1473 "type": "github"
1474 }
1475 },
1476 "nixpkgs_21": {
1477 "locked": {
1478 "lastModified": 1646497237,
1479 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1480 "owner": "nixos",
1481 "repo": "nixpkgs",
1482 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1483 "type": "github"
1484 },
1485 "original": {
1486 "owner": "nixos",
1487 "repo": "nixpkgs",
1488 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1489 "type": "github"
1490 }
1491 },
1492 "nixpkgs_22": {
1493 "flake": false,
1494 "locked": {
1495 "lastModified": 1596265691,
1496 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1497 "owner": "NixOS",
1498 "repo": "nixpkgs",
1499 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1500 "type": "github"
1501 },
1502 "original": {
1503 "owner": "NixOS",
1504 "repo": "nixpkgs",
1505 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1506 "type": "github"
1507 }
1508 },
1509 "nixpkgs_23": {
1510 "flake": false,
1511 "locked": {
1512 "lastModified": 1596265691,
1513 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1514 "owner": "NixOS",
1515 "repo": "nixpkgs",
1516 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1517 "type": "github"
1518 },
1519 "original": {
1520 "owner": "NixOS",
1521 "repo": "nixpkgs",
1522 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1523 "type": "github"
1524 }
1525 },
1526 "nixpkgs_24": {
1527 "flake": false,
1528 "locked": {
1529 "lastModified": 1596265691,
1530 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1531 "owner": "NixOS",
1532 "repo": "nixpkgs",
1533 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1534 "type": "github"
1535 },
1536 "original": {
1537 "owner": "NixOS",
1538 "repo": "nixpkgs",
1539 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1540 "type": "github"
1541 }
1542 },
1543 "nixpkgs_25": {
1544 "locked": {
1545 "lastModified": 1646497237,
1546 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1547 "owner": "nixos",
1548 "repo": "nixpkgs",
1549 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1550 "type": "github"
1551 },
1552 "original": {
1553 "owner": "nixos",
1554 "repo": "nixpkgs",
1555 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1556 "type": "github"
1557 }
1558 },
1559 "nixpkgs_26": {
1560 "locked": {
1561 "lastModified": 1597943282,
1562 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1563 "owner": "NixOS",
1564 "repo": "nixpkgs",
1565 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1566 "type": "github"
1567 },
1568 "original": {
1569 "owner": "NixOS",
1570 "repo": "nixpkgs",
1571 "type": "github"
1572 }
1573 },
1574 "nixpkgs_27": {
1575 "locked": {
1576 "lastModified": 1597943282,
1577 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1578 "owner": "NixOS",
1579 "repo": "nixpkgs",
1580 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1581 "type": "github"
1582 },
1583 "original": {
1584 "owner": "NixOS",
1585 "repo": "nixpkgs",
1586 "type": "github"
1587 }
1588 },
1589 "nixpkgs_28": {
1590 "locked": {
1591 "lastModified": 1611097871,
1592 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
1593 "owner": "NixOS",
1594 "repo": "nixpkgs",
1595 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
1596 "type": "github"
1597 },
1598 "original": {
1599 "owner": "NixOS",
1600 "repo": "nixpkgs",
1601 "type": "github"
1602 }
1603 },
1604 "nixpkgs_29": {
1605 "locked": {
1606 "lastModified": 1646497237,
1607 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1608 "owner": "nixos",
1609 "repo": "nixpkgs",
1610 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1611 "type": "github"
1612 },
1613 "original": {
1614 "owner": "nixos",
1615 "repo": "nixpkgs",
1616 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1617 "type": "github"
1618 }
1619 },
1620 "nixpkgs_3": {
1621 "locked": {
1622 "lastModified": 1687893427,
1623 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
1624 "owner": "nixos",
1625 "repo": "nixpkgs",
1626 "rev": "4b14ab2a916508442e685089672681dff46805be",
1627 "type": "github"
1628 },
1629 "original": {
1630 "owner": "nixos",
1631 "ref": "nixos-unstable-small",
1632 "repo": "nixpkgs",
1633 "type": "github"
1634 }
1635 },
1636 "nixpkgs_30": {
1637 "flake": false,
1638 "locked": {
1639 "lastModified": 1596265691,
1640 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1641 "owner": "NixOS",
1642 "repo": "nixpkgs",
1643 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1644 "type": "github"
1645 },
1646 "original": {
1647 "owner": "NixOS",
1648 "repo": "nixpkgs",
1649 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1650 "type": "github"
1651 }
1652 },
1653 "nixpkgs_31": {
1654 "flake": false,
1655 "locked": {
1656 "lastModified": 1596265691,
1657 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1658 "owner": "NixOS",
1659 "repo": "nixpkgs",
1660 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1661 "type": "github"
1662 },
1663 "original": {
1664 "owner": "NixOS",
1665 "repo": "nixpkgs",
1666 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1667 "type": "github"
1668 }
1669 },
1670 "nixpkgs_4": {
1671 "locked": {
1672 "lastModified": 1648725829,
1673 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
1674 "owner": "NixOS",
1675 "repo": "nixpkgs",
1676 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
1677 "type": "github"
1678 },
1679 "original": {
1680 "owner": "NixOS",
1681 "repo": "nixpkgs",
1682 "type": "github"
1683 }
1684 },
1685 "nixpkgs_5": {
1686 "locked": {
1687 "lastModified": 1693158576,
1688 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
1689 "owner": "nixos",
1690 "repo": "nixpkgs",
1691 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
1692 "type": "github"
1693 },
1694 "original": {
1695 "owner": "nixos",
1696 "ref": "nixos-unstable",
1697 "repo": "nixpkgs",
1698 "type": "github"
1699 }
1700 },
1701 "nixpkgs_6": {
1702 "flake": false,
1703 "locked": {
1704 "lastModified": 1596265691,
1705 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1706 "owner": "NixOS",
1707 "repo": "nixpkgs",
1708 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1709 "type": "github"
1710 },
1711 "original": {
1712 "owner": "NixOS",
1713 "repo": "nixpkgs",
1714 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1715 "type": "github"
1716 }
1717 },
1718 "nixpkgs_7": {
1719 "locked": {
1720 "lastModified": 1597943282,
1721 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1722 "owner": "NixOS",
1723 "repo": "nixpkgs",
1724 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1725 "type": "github"
1726 },
1727 "original": {
1728 "owner": "NixOS",
1729 "repo": "nixpkgs",
1730 "type": "github"
1731 }
1732 },
1733 "nixpkgs_8": {
1734 "locked": {
1735 "lastModified": 1597943282,
1736 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1737 "owner": "NixOS",
1738 "repo": "nixpkgs",
1739 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1740 "type": "github"
1741 },
1742 "original": {
1743 "owner": "NixOS",
1744 "repo": "nixpkgs",
1745 "type": "github"
1746 }
1747 },
1748 "nixpkgs_9": {
1749 "locked": {
1750 "lastModified": 1597943282,
1751 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1752 "owner": "NixOS",
1753 "repo": "nixpkgs",
1754 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1755 "type": "github"
1756 },
1757 "original": {
1758 "owner": "NixOS",
1759 "repo": "nixpkgs",
1760 "type": "github"
1761 }
1762 },
1763 "openarc": {
1764 "inputs": {
1765 "flake-utils": "flake-utils_4",
1766 "myuids": "myuids",
1767 "nixpkgs": "nixpkgs_7",
1768 "openarc": "openarc_2"
1769 },
1770 "locked": {
1771 "lastModified": 1,
1772 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
1773 "path": "../../openarc",
1774 "type": "path"
1775 },
1776 "original": {
1777 "path": "../../openarc",
1778 "type": "path"
1779 }
1780 },
1781 "openarc_2": {
1782 "flake": false,
1783 "locked": {
1784 "lastModified": 1537545083,
1785 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
1786 "owner": "trusteddomainproject",
1787 "repo": "OpenARC",
1788 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
1789 "type": "github"
1790 },
1791 "original": {
1792 "owner": "trusteddomainproject",
1793 "repo": "OpenARC",
1794 "type": "github"
1795 }
1796 },
1797 "openarc_3": {
1798 "inputs": {
1799 "flake-utils": "flake-utils_6",
1800 "myuids": "myuids_3",
1801 "nixpkgs": "nixpkgs_9",
1802 "openarc": "openarc_4"
1803 },
1804 "locked": {
1805 "lastModified": 1,
1806 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
1807 "path": "../../openarc",
1808 "type": "path"
1809 },
1810 "original": {
1811 "path": "../../openarc",
1812 "type": "path"
1813 }
1814 },
1815 "openarc_4": {
1816 "flake": false,
1817 "locked": {
1818 "lastModified": 1537545083,
1819 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
1820 "owner": "trusteddomainproject",
1821 "repo": "OpenARC",
1822 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
1823 "type": "github"
1824 },
1825 "original": {
1826 "owner": "trusteddomainproject",
1827 "repo": "OpenARC",
1828 "type": "github"
1829 }
1830 },
1831 "openarc_5": {
1832 "flake": false,
1833 "locked": {
1834 "lastModified": 1537545083,
1835 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
1836 "owner": "trusteddomainproject",
1837 "repo": "OpenARC",
1838 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
1839 "type": "github"
1840 },
1841 "original": {
1842 "owner": "trusteddomainproject",
1843 "repo": "OpenARC",
1844 "type": "github"
1845 }
1846 },
1847 "opendmarc": {
1848 "inputs": {
1849 "flake-utils": "flake-utils_5",
1850 "myuids": "myuids_2",
1851 "nixpkgs": "nixpkgs_8"
1852 },
1853 "locked": {
1854 "lastModified": 1,
1855 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
1856 "path": "../../opendmarc",
1857 "type": "path"
1858 },
1859 "original": {
1860 "path": "../../opendmarc",
1861 "type": "path"
1862 }
1863 },
1864 "opendmarc_2": {
1865 "inputs": {
1866 "flake-utils": "flake-utils_7",
1867 "myuids": "myuids_4",
1868 "nixpkgs": "nixpkgs_10"
1869 },
1870 "locked": {
1871 "lastModified": 1,
1872 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
1873 "path": "../../opendmarc",
1874 "type": "path"
1875 },
1876 "original": {
1877 "path": "../../opendmarc",
1878 "type": "path"
1879 }
1880 },
1881 "paste": {
1882 "inputs": {
1883 "flake-utils": "flake-utils_8",
1884 "nixpkgs": "nixpkgs_11"
1885 },
1886 "locked": {
1887 "lastModified": 1,
1888 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
1889 "path": "../../paste",
1890 "type": "path"
1891 },
1892 "original": {
1893 "path": "../../paste",
1894 "type": "path"
1895 }
1896 },
1897 "peertube": {
1898 "flake": false,
1899 "locked": {
1900 "lastModified": 1611184594,
1901 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
1902 "ref": "gitolite_local/open_instance",
1903 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
1904 "revCount": 6316,
1905 "type": "git",
1906 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
1907 },
1908 "original": {
1909 "owner": "Chocobozzz",
1910 "ref": "v3.0.1",
1911 "repo": "PeerTube",
1912 "type": "github"
1913 }
1914 },
1915 "peertube_2": {
1916 "flake": false,
1917 "locked": {
1918 "lastModified": 1610436329,
1919 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
1920 "owner": "Chocobozzz",
1921 "repo": "PeerTube",
1922 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
1923 "type": "github"
1924 },
1925 "original": {
1926 "owner": "Chocobozzz",
1927 "ref": "v3.0.1",
1928 "repo": "PeerTube",
1929 "type": "github"
1930 }
1931 },
1932 "peertube_3": {
1933 "flake": false,
1934 "locked": {
1935 "lastModified": 1610436329,
1936 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
1937 "owner": "Chocobozzz",
1938 "repo": "PeerTube",
1939 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
1940 "type": "github"
1941 },
1942 "original": {
1943 "owner": "Chocobozzz",
1944 "ref": "v3.0.1",
1945 "repo": "PeerTube",
1946 "type": "github"
1947 }
1948 },
1949 "peertube_open_instance": {
1950 "inputs": {
1951 "flake-utils": "flake-utils_9",
1952 "myuids": "myuids_5",
1953 "nixpkgs": "nixpkgs_12",
1954 "peertube": "peertube"
1955 },
1956 "locked": {
1957 "lastModified": 1,
1958 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
1959 "path": "./../../peertube",
1960 "type": "path"
1961 },
1962 "original": {
1963 "path": "./../../peertube",
1964 "type": "path"
1965 }
1966 },
1967 "peertube_origin": {
1968 "inputs": {
1969 "flake-utils": "flake-utils_10",
1970 "myuids": "myuids_6",
1971 "nixpkgs": "nixpkgs_13",
1972 "peertube": "peertube_2"
1973 },
1974 "locked": {
1975 "lastModified": 1,
1976 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
1977 "path": "./../../peertube",
1978 "type": "path"
1979 },
1980 "original": {
1981 "path": "./../../peertube",
1982 "type": "path"
1983 }
1984 },
1985 "private-buildbot": {
1986 "inputs": {
1987 "buildslist": "buildslist",
1988 "flake-utils": "flake-utils_3",
1989 "nixpkgs": "nixpkgs_6"
1990 },
1991 "locked": {
1992 "lastModified": 1,
1993 "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
1994 "path": "../../flakes/private/buildbot",
1995 "type": "path"
1996 },
1997 "original": {
1998 "path": "../../flakes/private/buildbot",
1999 "type": "path"
2000 }
2001 },
2002 "private-chatons": {
2003 "inputs": {
2004 "environment": "environment"
2005 },
2006 "locked": {
2007 "lastModified": 1,
2008 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
2009 "path": "../../flakes/private/chatons",
2010 "type": "path"
2011 },
2012 "original": {
2013 "path": "../../flakes/private/chatons",
2014 "type": "path"
2015 }
2016 },
2017 "private-environment": {
2018 "locked": {
2019 "lastModified": 1,
2020 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
2021 "path": "../../flakes/private/environment",
2022 "type": "path"
2023 },
2024 "original": {
2025 "path": "../../flakes/private/environment",
2026 "type": "path"
2027 }
2028 },
2029 "private-milters": {
2030 "inputs": {
2031 "environment": "environment_2",
2032 "files-watcher": "files-watcher",
2033 "openarc": "openarc",
2034 "opendmarc": "opendmarc",
2035 "secrets": "secrets"
2036 },
2037 "locked": {
2038 "lastModified": 1,
2039 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
2040 "path": "../../flakes/private/milters",
2041 "type": "path"
2042 },
2043 "original": {
2044 "path": "../../flakes/private/milters",
2045 "type": "path"
2046 }
2047 },
2048 "private-monitoring": {
2049 "inputs": {
2050 "environment": "environment_3",
2051 "naemon": "naemon",
2052 "nixpkgs-lib": "nixpkgs-lib_2",
2053 "secrets": "secrets_2"
2054 },
2055 "locked": {
2056 "lastModified": 1,
2057 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2058 "path": "../../flakes/private/monitoring",
2059 "type": "path"
2060 },
2061 "original": {
2062 "path": "../../flakes/private/monitoring",
2063 "type": "path"
2064 }
2065 },
2066 "private-openarc": {
2067 "inputs": {
2068 "files-watcher": "files-watcher_2",
2069 "openarc": "openarc_3",
2070 "secrets": "secrets_3"
2071 },
2072 "locked": {
2073 "lastModified": 1,
2074 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
2075 "path": "../../flakes/private/openarc",
2076 "type": "path"
2077 },
2078 "original": {
2079 "path": "../../flakes/private/openarc",
2080 "type": "path"
2081 }
2082 },
2083 "private-opendmarc": {
2084 "inputs": {
2085 "environment": "environment_4",
2086 "files-watcher": "files-watcher_3",
2087 "opendmarc": "opendmarc_2",
2088 "secrets": "secrets_4"
2089 },
2090 "locked": {
2091 "lastModified": 1,
2092 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
2093 "path": "../../flakes/private/opendmarc",
2094 "type": "path"
2095 },
2096 "original": {
2097 "path": "../../flakes/private/opendmarc",
2098 "type": "path"
2099 }
2100 },
2101 "private-openldap": {
2102 "locked": {
2103 "lastModified": 1,
2104 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
2105 "path": "../../flakes/private/openldap",
2106 "type": "path"
2107 },
2108 "original": {
2109 "path": "../../flakes/private/openldap",
2110 "type": "path"
2111 }
2112 },
2113 "private-paste": {
2114 "inputs": {
2115 "paste": "paste"
2116 },
2117 "locked": {
2118 "lastModified": 1,
2119 "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
2120 "path": "../../flakes/private/paste",
2121 "type": "path"
2122 },
2123 "original": {
2124 "path": "../../flakes/private/paste",
2125 "type": "path"
2126 }
2127 },
2128 "private-peertube": {
2129 "inputs": {
2130 "peertube_open_instance": "peertube_open_instance",
2131 "peertube_origin": "peertube_origin"
2132 },
2133 "locked": {
2134 "lastModified": 1,
2135 "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
2136 "path": "../../flakes/private/peertube",
2137 "type": "path"
2138 },
2139 "original": {
2140 "path": "../../flakes/private/peertube",
2141 "type": "path"
2142 }
2143 },
2144 "private-php": {
2145 "inputs": {
2146 "flake-utils": "flake-utils_11",
2147 "nixpkgs": "nixpkgs_14",
2148 "nixpkgs-4": "nixpkgs-4"
2149 },
2150 "locked": {
2151 "lastModified": 1,
2152 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
2153 "path": "../../flakes/private/php",
2154 "type": "path"
2155 },
2156 "original": {
2157 "path": "../../flakes/private/php",
2158 "type": "path"
2159 }
2160 },
2161 "private-ssh": {
2162 "inputs": {
2163 "environment": "environment_5",
2164 "secrets": "secrets_5"
2165 },
2166 "locked": {
2167 "lastModified": 1,
2168 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
2169 "path": "../../flakes/private/ssh",
2170 "type": "path"
2171 },
2172 "original": {
2173 "path": "../../flakes/private/ssh",
2174 "type": "path"
2175 }
2176 },
2177 "private-system": {
2178 "inputs": {
2179 "backports": "backports",
2180 "environment": "environment_6",
2181 "mypackages": "mypackages",
2182 "myuids": "myuids_7",
2183 "secrets-public": "secrets-public"
2184 },
2185 "locked": {
2186 "lastModified": 1,
2187 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
2188 "path": "../../flakes/private/system",
2189 "type": "path"
2190 },
2191 "original": {
2192 "path": "../../flakes/private/system",
2193 "type": "path"
2194 }
2195 },
2196 "public-copanier": {
2197 "inputs": {
2198 "copanier": "copanier",
2199 "flake-utils": "flake-utils_13",
2200 "nixpkgs": "nixpkgs_17"
2201 },
2202 "locked": {
2203 "lastModified": 1,
2204 "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
2205 "path": "../../flakes/copanier",
2206 "type": "path"
2207 },
2208 "original": {
2209 "path": "../../flakes/copanier",
2210 "type": "path"
2211 }
2212 },
2213 "public-diaspora": {
2214 "inputs": {
2215 "diaspora": "diaspora",
2216 "flake-utils": "flake-utils_14",
2217 "myuids": "myuids_8",
2218 "nixpkgs": "nixpkgs_18"
2219 },
2220 "locked": {
2221 "lastModified": 1,
2222 "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
2223 "path": "../../flakes/diaspora",
2224 "type": "path"
2225 },
2226 "original": {
2227 "path": "../../flakes/diaspora",
2228 "type": "path"
2229 }
2230 },
2231 "public-etherpad-lite": {
2232 "inputs": {
2233 "etherpad-lite": "etherpad-lite",
2234 "flake-utils": "flake-utils_15",
2235 "mypackages": "mypackages_2",
2236 "nixpkgs": "nixpkgs_20"
2237 },
2238 "locked": {
2239 "lastModified": 1,
2240 "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
2241 "path": "../../flakes/etherpad-lite",
2242 "type": "path"
2243 },
2244 "original": {
2245 "path": "../../flakes/etherpad-lite",
2246 "type": "path"
2247 }
2248 },
2249 "public-fiche": {
2250 "locked": {
2251 "lastModified": 1,
2252 "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
2253 "path": "../../flakes/fiche",
2254 "type": "path"
2255 },
2256 "original": {
2257 "path": "../../flakes/fiche",
2258 "type": "path"
2259 }
2260 },
2261 "public-files-watcher": {
2262 "locked": {
2263 "lastModified": 1,
2264 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
2265 "path": "../../flakes/files-watcher",
2266 "type": "path"
2267 },
2268 "original": {
2269 "path": "../../flakes/files-watcher",
2270 "type": "path"
2271 }
2272 },
2273 "public-grocy": {
2274 "inputs": {
2275 "flake-utils": "flake-utils_16",
2276 "grocy": "grocy",
2277 "mypackages": "mypackages_3",
2278 "nixpkgs": "nixpkgs_22"
2279 },
2280 "locked": {
2281 "lastModified": 1,
2282 "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
2283 "path": "../../flakes/grocy",
2284 "type": "path"
2285 },
2286 "original": {
2287 "path": "../../flakes/grocy",
2288 "type": "path"
2289 }
2290 },
2291 "public-loginctl-linger": {
2292 "locked": {
2293 "lastModified": 1,
2294 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
2295 "path": "../../flakes/loginctl-linger",
2296 "type": "path"
2297 },
2298 "original": {
2299 "path": "../../flakes/loginctl-linger",
2300 "type": "path"
2301 }
2302 },
2303 "public-mastodon": {
2304 "inputs": {
2305 "flake-utils": "flake-utils_17",
2306 "mastodon": "mastodon",
2307 "myuids": "myuids_9",
2308 "nixpkgs": "nixpkgs_23"
2309 },
2310 "locked": {
2311 "lastModified": 1,
2312 "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
2313 "path": "../../flakes/mastodon",
2314 "type": "path"
2315 },
2316 "original": {
2317 "path": "../../flakes/mastodon",
2318 "type": "path"
2319 }
2320 },
2321 "public-mediagoblin": {
2322 "inputs": {
2323 "flake-utils": "flake-utils_18",
2324 "mediagoblin": "mediagoblin",
2325 "myuids": "myuids_10",
2326 "nixpkgs": "nixpkgs_24"
2327 },
2328 "locked": {
2329 "lastModified": 1,
2330 "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
2331 "path": "../../flakes/mediagoblin",
2332 "type": "path"
2333 },
2334 "original": {
2335 "path": "../../flakes/mediagoblin",
2336 "type": "path"
2337 }
2338 },
2339 "public-multi-apache-container": {
2340 "inputs": {
2341 "files-watcher": "files-watcher_4",
2342 "myuids": "myuids_11"
2343 },
2344 "locked": {
2345 "lastModified": 1,
2346 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
2347 "path": "../../flakes/multi-apache-container",
2348 "type": "path"
2349 },
2350 "original": {
2351 "path": "../../flakes/multi-apache-container",
2352 "type": "path"
2353 }
2354 },
2355 "public-mypackages": {
2356 "inputs": {
2357 "flake-parts": "flake-parts_5",
2358 "nixpkgs": "nixpkgs_25",
2359 "webapps-ttrss": "webapps-ttrss_4"
2360 },
2361 "locked": {
2362 "lastModified": 1,
2363 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
2364 "path": "../../flakes/mypackages",
2365 "type": "path"
2366 },
2367 "original": {
2368 "path": "../../flakes/mypackages",
2369 "type": "path"
2370 }
2371 },
2372 "public-myuids": {
2373 "locked": {
2374 "lastModified": 1,
2375 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
2376 "path": "../../flakes/myuids",
2377 "type": "path"
2378 },
2379 "original": {
2380 "path": "../../flakes/myuids",
2381 "type": "path"
2382 }
2383 },
2384 "public-openarc": {
2385 "inputs": {
2386 "flake-utils": "flake-utils_19",
2387 "myuids": "myuids_12",
2388 "nixpkgs": "nixpkgs_26",
2389 "openarc": "openarc_5"
2390 },
2391 "locked": {
2392 "lastModified": 1,
2393 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
2394 "path": "../../flakes/openarc",
2395 "type": "path"
2396 },
2397 "original": {
2398 "path": "../../flakes/openarc",
2399 "type": "path"
2400 }
2401 },
2402 "public-opendmarc": {
2403 "inputs": {
2404 "flake-utils": "flake-utils_20",
2405 "myuids": "myuids_13",
2406 "nixpkgs": "nixpkgs_27"
2407 },
2408 "locked": {
2409 "lastModified": 1,
2410 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
2411 "path": "../../flakes/opendmarc",
2412 "type": "path"
2413 },
2414 "original": {
2415 "path": "../../flakes/opendmarc",
2416 "type": "path"
2417 }
2418 },
2419 "public-peertube": {
2420 "inputs": {
2421 "flake-utils": "flake-utils_21",
2422 "myuids": "myuids_14",
2423 "nixpkgs": "nixpkgs_28",
2424 "peertube": "peertube_3"
2425 },
2426 "locked": {
2427 "lastModified": 1,
2428 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
2429 "path": "../../flakes/peertube",
2430 "type": "path"
2431 },
2432 "original": {
2433 "path": "../../flakes/peertube",
2434 "type": "path"
2435 }
2436 },
2437 "public-secrets": {
2438 "locked": {
2439 "lastModified": 1,
2440 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2441 "path": "../../flakes/secrets",
2442 "type": "path"
2443 },
2444 "original": {
2445 "path": "../../flakes/secrets",
2446 "type": "path"
2447 }
2448 },
2449 "public-surfer": {
2450 "inputs": {
2451 "flake-utils": "flake-utils_22",
2452 "mypackages": "mypackages_4",
2453 "nixpkgs": "nixpkgs_30",
2454 "surfer": "surfer"
2455 },
2456 "locked": {
2457 "lastModified": 1,
2458 "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
2459 "path": "../../flakes/surfer",
2460 "type": "path"
2461 },
2462 "original": {
2463 "path": "../../flakes/surfer",
2464 "type": "path"
2465 }
2466 },
2467 "public-taskwarrior-web": {
2468 "inputs": {
2469 "flake-utils": "flake-utils_23",
2470 "nixpkgs": "nixpkgs_31",
2471 "taskwarrior-web": "taskwarrior-web"
2472 },
2473 "locked": {
2474 "lastModified": 1,
2475 "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
2476 "path": "../../flakes/taskwarrior-web",
2477 "type": "path"
2478 },
2479 "original": {
2480 "path": "../../flakes/taskwarrior-web",
2481 "type": "path"
2482 }
2483 },
2484 "root": {
2485 "inputs": {
2486 "dns-nix": "dns-nix",
2487 "my-lib": "my-lib",
2488 "nixpkgs": "nixpkgs_5",
2489 "private-buildbot": "private-buildbot",
2490 "private-chatons": "private-chatons",
2491 "private-environment": "private-environment",
2492 "private-milters": "private-milters",
2493 "private-monitoring": "private-monitoring",
2494 "private-openarc": "private-openarc",
2495 "private-opendmarc": "private-opendmarc",
2496 "private-openldap": "private-openldap",
2497 "private-paste": "private-paste",
2498 "private-peertube": "private-peertube",
2499 "private-php": "private-php",
2500 "private-ssh": "private-ssh",
2501 "private-system": "private-system",
2502 "public-copanier": "public-copanier",
2503 "public-diaspora": "public-diaspora",
2504 "public-etherpad-lite": "public-etherpad-lite",
2505 "public-fiche": "public-fiche",
2506 "public-files-watcher": "public-files-watcher",
2507 "public-grocy": "public-grocy",
2508 "public-loginctl-linger": "public-loginctl-linger",
2509 "public-mastodon": "public-mastodon",
2510 "public-mediagoblin": "public-mediagoblin",
2511 "public-multi-apache-container": "public-multi-apache-container",
2512 "public-mypackages": "public-mypackages",
2513 "public-myuids": "public-myuids",
2514 "public-openarc": "public-openarc",
2515 "public-opendmarc": "public-opendmarc",
2516 "public-peertube": "public-peertube",
2517 "public-secrets": "public-secrets",
2518 "public-surfer": "public-surfer",
2519 "public-taskwarrior-web": "public-taskwarrior-web"
2520 }
2521 },
2522 "secrets": {
2523 "locked": {
2524 "lastModified": 1,
2525 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2526 "path": "../../secrets",
2527 "type": "path"
2528 },
2529 "original": {
2530 "path": "../../secrets",
2531 "type": "path"
2532 }
2533 },
2534 "secrets-public": {
2535 "locked": {
2536 "lastModified": 1,
2537 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2538 "path": "../../secrets",
2539 "type": "path"
2540 },
2541 "original": {
2542 "path": "../../secrets",
2543 "type": "path"
2544 }
2545 },
2546 "secrets_2": {
2547 "locked": {
2548 "lastModified": 1,
2549 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2550 "path": "../../secrets",
2551 "type": "path"
2552 },
2553 "original": {
2554 "path": "../../secrets",
2555 "type": "path"
2556 }
2557 },
2558 "secrets_3": {
2559 "locked": {
2560 "lastModified": 1,
2561 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2562 "path": "../../secrets",
2563 "type": "path"
2564 },
2565 "original": {
2566 "path": "../../secrets",
2567 "type": "path"
2568 }
2569 },
2570 "secrets_4": {
2571 "locked": {
2572 "lastModified": 1,
2573 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2574 "path": "../../secrets",
2575 "type": "path"
2576 },
2577 "original": {
2578 "path": "../../secrets",
2579 "type": "path"
2580 }
2581 },
2582 "secrets_5": {
2583 "locked": {
2584 "lastModified": 1,
2585 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2586 "path": "../../secrets",
2587 "type": "path"
2588 },
2589 "original": {
2590 "path": "../../secrets",
2591 "type": "path"
2592 }
2593 },
2594 "stable": {
2595 "locked": {
2596 "lastModified": 1669735802,
2597 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
2598 "owner": "NixOS",
2599 "repo": "nixpkgs",
2600 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
2601 "type": "github"
2602 },
2603 "original": {
2604 "owner": "NixOS",
2605 "ref": "nixos-22.11",
2606 "repo": "nixpkgs",
2607 "type": "github"
2608 }
2609 },
2610 "surfer": {
2611 "flake": false,
2612 "locked": {
2613 "lastModified": 1588637864,
2614 "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
2615 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
2616 "revCount": 318,
2617 "type": "git",
2618 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
2619 },
2620 "original": {
2621 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
2622 "type": "git",
2623 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
2624 }
2625 },
2626 "taskwarrior-web": {
2627 "flake": false,
2628 "locked": {
2629 "lastModified": 1546434241,
2630 "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
2631 "owner": "theunraveler",
2632 "repo": "taskwarrior-web",
2633 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
2634 "type": "github"
2635 },
2636 "original": {
2637 "owner": "theunraveler",
2638 "repo": "taskwarrior-web",
2639 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
2640 "type": "github"
2641 }
2642 },
2643 "treefmt-nix": {
2644 "inputs": {
2645 "nixpkgs": [
2646 "my-lib",
2647 "nixos-anywhere",
2648 "nixpkgs"
2649 ]
2650 },
2651 "locked": {
2652 "lastModified": 1687940979,
2653 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
2654 "owner": "numtide",
2655 "repo": "treefmt-nix",
2656 "rev": "0a4f06c27610a99080b69433873885df82003aae",
2657 "type": "github"
2658 },
2659 "original": {
2660 "owner": "numtide",
2661 "repo": "treefmt-nix",
2662 "type": "github"
2663 }
2664 },
2665 "webapps-ttrss": {
2666 "flake": false,
2667 "locked": {
2668 "lastModified": 1546759381,
2669 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
2670 "ref": "master",
2671 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2672 "revCount": 9256,
2673 "type": "git",
2674 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2675 },
2676 "original": {
2677 "ref": "master",
2678 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2679 "type": "git",
2680 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2681 }
2682 },
2683 "webapps-ttrss_2": {
2684 "flake": false,
2685 "locked": {
2686 "lastModified": 1546759381,
2687 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
2688 "ref": "master",
2689 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2690 "revCount": 9256,
2691 "type": "git",
2692 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2693 },
2694 "original": {
2695 "ref": "master",
2696 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2697 "type": "git",
2698 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2699 }
2700 },
2701 "webapps-ttrss_3": {
2702 "flake": false,
2703 "locked": {
2704 "lastModified": 1546759381,
2705 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
2706 "ref": "master",
2707 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2708 "revCount": 9256,
2709 "type": "git",
2710 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2711 },
2712 "original": {
2713 "ref": "master",
2714 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2715 "type": "git",
2716 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2717 }
2718 },
2719 "webapps-ttrss_4": {
2720 "flake": false,
2721 "locked": {
2722 "lastModified": 1546759381,
2723 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
2724 "ref": "master",
2725 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2726 "revCount": 9256,
2727 "type": "git",
2728 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2729 },
2730 "original": {
2731 "ref": "master",
2732 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2733 "type": "git",
2734 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2735 }
2736 },
2737 "webapps-ttrss_5": {
2738 "flake": false,
2739 "locked": {
2740 "lastModified": 1546759381,
2741 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
2742 "ref": "master",
2743 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2744 "revCount": 9256,
2745 "type": "git",
2746 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2747 },
2748 "original": {
2749 "ref": "master",
2750 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2751 "type": "git",
2752 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2753 }
2754 }
2755 },
2756 "root": "root",
2757 "version": 7
2758}
diff --git a/systems/eldiron/flake.nix b/systems/eldiron/flake.nix
new file mode 100644
index 0000000..790b638
--- /dev/null
+++ b/systems/eldiron/flake.nix
@@ -0,0 +1,90 @@
1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
4 dns-nix.url = "github:kirelagin/dns.nix";
5 dns-nix.inputs.nixpkgs.follows = "nixpkgs";
6
7 my-lib.url = "path:../../flakes/lib";
8
9 public-etherpad-lite.url = "path:../../flakes/etherpad-lite";
10 public-grocy.url = "path:../../flakes/grocy";
11 public-openarc.url = "path:../../flakes/openarc";
12 public-opendmarc.url = "path:../../flakes/opendmarc";
13 public-peertube.url = "path:../../flakes/peertube";
14 public-diaspora.url = "path:../../flakes/diaspora";
15 public-mastodon.url = "path:../../flakes/mastodon";
16 public-mediagoblin.url = "path:../../flakes/mediagoblin";
17 public-surfer.url = "path:../../flakes/surfer";
18 public-myuids.url = "path:../../flakes/myuids";
19 public-copanier.url = "path:../../flakes/copanier";
20 public-secrets.url = "path:../../flakes/secrets";
21 public-files-watcher.url = "path:../../flakes/files-watcher";
22 public-fiche.url = "path:../../flakes/fiche";
23 public-mypackages.url = "path:../../flakes/mypackages";
24 public-loginctl-linger.url = "path:../../flakes/loginctl-linger";
25 public-multi-apache-container.url = "path:../../flakes/multi-apache-container";
26 public-taskwarrior-web.url = "path:../../flakes/taskwarrior-web";
27
28 private-peertube.url = "path:../../flakes/private/peertube";
29 private-buildbot.url = "path:../../flakes/private/buildbot";
30 private-php.url = "path:../../flakes/private/php";
31 private-environment.url = "path:../../flakes/private/environment";
32 private-openarc.url = "path:../../flakes/private/openarc";
33 private-openldap.url = "path:../../flakes/private/openldap";
34 private-opendmarc.url = "path:../../flakes/private/opendmarc";
35 private-milters.url = "path:../../flakes/private/milters";
36 private-monitoring.url = "path:../../flakes/private/monitoring";
37 private-paste.url = "path:../../flakes/private/paste";
38 private-ssh.url = "path:../../flakes/private/ssh";
39 private-chatons.url = "path:../../flakes/private/chatons";
40 private-system.url = "path:../../flakes/private/system";
41 };
42 outputs = inputs@{ self, my-lib, nixpkgs, dns-nix, ...}:
43 my-lib.lib.mkColmenaFlake {
44 name = "eldiron";
45 inherit self nixpkgs;
46 system = "x86_64-linux";
47 targetHost = "176.9.151.89";
48 targetUser = "root";
49 nixosModules = with inputs; {
50 base = ./base.nix;
51 myuids = public-myuids.nixosModule;
52 secrets = public-secrets.nixosModule;
53 loginctl-linger = public-loginctl-linger.nixosModule;
54 files-watcher = public-files-watcher.nixosModule;
55 multi-apache-container = public-multi-apache-container.nixosModule;
56 etherpad-lite = public-etherpad-lite.nixosModule;
57 mastodon = public-mastodon.nixosModule;
58 mediagoblin = public-mediagoblin.nixosModule;
59 peertube = public-peertube.nixosModule;
60 diaspora = public-diaspora.nixosModule;
61 fiche = public-fiche.nixosModule;
62
63 environment = private-environment.nixosModule;
64 openarc = private-openarc.nixosModule;
65 opendmarc = private-opendmarc.nixosModule;
66 ssh = private-ssh.nixosModule;
67 chatons = private-chatons.nixosModule;
68 system = private-system.nixosModule;
69 monitoring = private-monitoring.nixosModule;
70 paste = private-paste.nixosModule;
71 milters = private-milters.nixosModule;
72 };
73 moduleArgs = with inputs; {
74 dns-nix = dns-nix;
75 nixpkgsRaw = nixpkgs.legacyPackages.x86_64-linux;
76 mypackages-lib = public-mypackages.lib.x86_64-linux;
77 etherpad-lite = public-etherpad-lite.defaultPackage.x86_64-linux;
78 taskwarrior-web = public-taskwarrior-web.defaultPackage.x86_64-linux;
79 copanier = public-copanier.defaultPackage.x86_64-linux;
80 grocy = public-grocy.defaultPackage.x86_64-linux;
81 surfer = public-surfer.defaultPackage.x86_64-linux;
82 mediagoblin = public-mediagoblin.defaultPackage.x86_64-linux;
83 buildbot = private-buildbot.packages.x86_64-linux.buildbot-full;
84 openldap = private-openldap;
85 monitoring = private-monitoring;
86 peertube = private-peertube.packages.x86_64-linux;
87 php = private-php;
88 };
89 };
90}
diff --git a/systems/eldiron/ftp.nix b/systems/eldiron/ftp.nix
new file mode 100644
index 0000000..6aa1afc
--- /dev/null
+++ b/systems/eldiron/ftp.nix
@@ -0,0 +1,339 @@
1{ lib, pkgs, config, ... }:
2let
3 package = pkgs.pure-ftpd.override { ldapFtpId = "immaeFtp"; };
4 pure-ftpd-enabled = config.myServices.ftp.pure-ftpd.enable;
5 proftpd-enabled = config.myServices.ftp.proftpd.enable;
6in
7{
8 options = {
9 myServices.ftp.enable = lib.mkOption {
10 type = lib.types.bool;
11 default = false;
12 description = ''
13 Whether to enable ftp.
14 '';
15 };
16 myServices.ftp.pure-ftpd.enable = lib.mkOption {
17 type = lib.types.bool;
18 default = false;
19 description = ''
20 Whether to enable pure-ftpd.
21 '';
22 };
23 myServices.ftp.proftpd.enable = lib.mkOption {
24 type = lib.types.bool;
25 default = true;
26 description = ''
27 Whether to enable proftpd.
28 '';
29 };
30 };
31
32 config = lib.mkIf config.myServices.ftp.enable {
33 myServices.dns.zones."immae.eu".subdomains.ftp =
34 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
35
36 myServices.chatonsProperties.services.espace-de-stockage = {
37 file.datetime = "2022-08-22T01:00:00";
38 service = {
39 name = "Espace de stockage";
40 description = "Compte FTP/SFTP";
41 logo = if pure-ftpd-enabled
42 then "https://www.pureftpd.org/project/pure-ftpd/images/favicon.png"
43 else if proftpd-enabled
44 then "http://proftpd.org/proftpd.png"
45 else "";
46 website = "ftp.immae.eu";
47 status.level = "OK";
48 status.description = "OK";
49 registration."" = ["MEMBER" "CLIENT"];
50 registration.load = "OPEN";
51 install.type = "PACKAGE";
52 };
53 software = if pure-ftpd-enabled then {
54 name = "Pure-ftpd";
55 website = "https://www.pureftpd.org/project/pure-ftpd/";
56 license.url = "https://github.com/jedisct1/pure-ftpd/blob/master/COPYING";
57 license.name = "MIT Licence";
58 version = package.version;
59 source.url = "https://github.com/jedisct1/pure-ftpd/";
60 modules = "openssh";
61 } else if proftpd-enabled then {
62 name = "ProFTPD";
63 website = "http://proftpd.org/";
64 license.url = "https://github.com/proftpd/proftpd/blob/master/COPYING";
65 license.name = "GNU General Public License v2.0";
66 version = pkgs.proftpd.version;
67 source.url = "https://github.com/proftpd/proftpd/";
68 modules = "openssh";
69 } else {};
70 };
71 #myServices.chatonsProperties.services.ftp = {
72 # file.datetime = "2022-08-22T01:00:00";
73 # service = {
74 # name = "Comptes FTP";
75 # description = "Compte FTP/SFTP";
76 # logo = if pure-ftpd-enabled
77 # then "https://www.pureftpd.org/project/pure-ftpd/images/favicon.png"
78 # else if proftpd-enabled
79 # then "http://proftpd.org/proftpd.png"
80 # else "";
81 # website = "ftp.immae.eu";
82 # status.level = "OK";
83 # status.description = "OK";
84 # registration."" = ["MEMBER" "CLIENT"];
85 # registration.load = "OPEN";
86 # install.type = "PACKAGE";
87 # };
88 # software = if pure-ftpd-enabled then {
89 # name = "Pure-ftpd";
90 # website = "https://www.pureftpd.org/project/pure-ftpd/";
91 # license.url = "https://github.com/jedisct1/pure-ftpd/blob/master/COPYING";
92 # license.name = "MIT Licence";
93 # version = package.version;
94 # source.url = "https://github.com/jedisct1/pure-ftpd/";
95 # } else if proftpd-enabled then {
96 # name = "ProFTPD";
97 # website = "http://proftpd.org/";
98 # license.url = "https://github.com/proftpd/proftpd/blob/master/COPYING";
99 # license.name = "GNU General Public License v2.0";
100 # version = pkgs.proftpd.version;
101 # source.url = "https://github.com/proftpd/proftpd/";
102 # } else {};
103 #};
104 security.acme.certs."ftp" = {
105 domain = "eldiron.immae.eu";
106 # FIXME: make it global
107 extraLegoRunFlags = ["--preferred-chain" "ISRG Root X1"];
108 extraLegoRenewFlags = ["--preferred-chain" "ISRG Root X1"];
109 postRun = (lib.optionalString pure-ftpd-enabled ''
110 systemctl restart pure-ftpd.service
111 '') + (lib.optionalString proftpd-enabled ''
112 systemctl restart proftpd.service
113 '');
114 extraDomainNames = [ "ftp.immae.eu" ];
115 };
116
117 networking = {
118 firewall = {
119 allowedTCPPorts = [ 21 115 ];
120 allowedTCPPortRanges = [ { from = 40000; to = 50000; } ];
121 };
122 };
123
124 users.users.ftp = {
125 uid = config.ids.uids.ftp; # 8
126 group = "ftp";
127 description = "Anonymous FTP user";
128 home = "/homeless-shelter";
129 extraGroups = [ "keys" ];
130 };
131
132 users.groups.ftp.gid = config.ids.gids.ftp;
133
134 system.activationScripts.ftp = ''
135 install -m 0755 -o ftp -g ftp -d /var/lib/ftp
136 '' + (lib.optionalString proftpd-enabled ''
137 install -m 0755 -o nobody -g nogroup -d /var/lib/proftpd/authorized_keys
138 '');
139
140 secrets.keys."pure-ftpd-ldap" = lib.mkIf pure-ftpd-enabled {
141 permissions = "0400";
142 user = "ftp";
143 group = "ftp";
144 text = ''
145 LDAPServer ${config.myEnv.ftp.ldap.host}
146 LDAPPort 389
147 LDAPUseTLS True
148 LDAPBaseDN ${config.myEnv.ftp.ldap.base}
149 LDAPBindDN ${config.myEnv.ftp.ldap.dn}
150 LDAPBindPW ${config.myEnv.ftp.ldap.password}
151 LDAPDefaultUID 500
152 LDAPForceDefaultUID False
153 LDAPDefaultGID 100
154 LDAPForceDefaultGID False
155 LDAPFilter ${config.myEnv.ftp.ldap.pure-ftpd_filter}
156
157 LDAPAuthMethod BIND
158
159 # Pas de possibilite de donner l'Uid/Gid !
160 # Compile dans pure-ftpd directement avec immaeFtpUid / immaeFtpGid
161 LDAPHomeDir immaeFtpDirectory
162 '';
163 };
164 secrets.keys."proftpd-ldap.conf" = lib.mkIf proftpd-enabled {
165 permissions = "0400";
166 user = "ftp";
167 group = "ftp";
168 text = ''
169 LDAPServer ldaps://${config.myEnv.ftp.ldap.host}:636/??sub
170 LDAPUseTLS on
171 LDAPAuthBinds on
172 LDAPBindDN "${config.myEnv.ftp.ldap.dn}" "${config.myEnv.ftp.ldap.password}"
173 LDAPSearchScope subtree
174 LDAPAuthBinds on
175 LDAPDefaultGID 100
176 LDAPDefaultUID 500
177 LDAPForceDefaultUID off
178 LDAPForceDefaultGID off
179 LDAPAttr gidNumber immaeFtpGid
180 LDAPAttr uidNumber immaeFtpUid
181 LDAPAttr homeDirectory immaeFtpDirectory
182 LDAPUsers "${config.myEnv.ftp.ldap.base}" "${config.myEnv.ftp.ldap.proftpd_filter}"
183 LDAPGroups "${config.myEnv.ftp.ldap.base}"
184 '';
185 };
186
187 services.filesWatcher.pure-ftpd = lib.mkIf pure-ftpd-enabled {
188 restart = true;
189 paths = [ config.secrets.fullPaths."pure-ftpd-ldap" ];
190 };
191 services.filesWatcher.proftpd = lib.mkIf proftpd-enabled {
192 restart = true;
193 paths = [ config.secrets.fullPaths."proftpd-ldap.conf" ];
194 };
195
196 systemd.services.pure-ftpd = let
197 configFile = pkgs.writeText "pure-ftpd.conf" ''
198 PassivePortRange 40000 50000
199 Bind 42
200 ChrootEveryone yes
201 CreateHomeDir yes
202 BrokenClientsCompatibility yes
203 MaxClientsNumber 50
204 Daemonize yes
205 MaxClientsPerIP 8
206 VerboseLog no
207 DisplayDotFiles yes
208 AnonymousOnly no
209 NoAnonymous no
210 SyslogFacility ftp
211 DontResolve yes
212 MaxIdleTime 15
213 LDAPConfigFile ${config.secrets.fullPaths."pure-ftpd-ldap"}
214 LimitRecursion 10000 8
215 AnonymousCanCreateDirs no
216 MaxLoad 4
217 AntiWarez yes
218 Umask 133:022
219 # ftp
220 MinUID 8
221 AllowUserFXP no
222 AllowAnonymousFXP no
223 ProhibitDotFilesWrite no
224 ProhibitDotFilesRead no
225 AutoRename no
226 AnonymousCantUpload no
227 MaxDiskUsage 99
228 CustomerProof yes
229 TLS 1
230 CertFile ${config.security.acme.certs.ftp.directory}/full.pem
231 '';
232 in lib.mkIf pure-ftpd-enabled {
233 description = "Pure-FTPd server";
234 wantedBy = [ "multi-user.target" ];
235 after = [ "network.target" ];
236
237 serviceConfig.ExecStart = "${package}/bin/pure-ftpd ${configFile}";
238 serviceConfig.Type = "forking";
239 serviceConfig.PIDFile = "/run/pure-ftpd.pid";
240 };
241
242 systemd.services.proftpd = let
243 configFile = pkgs.writeText "proftpd.conf" ''
244 ServerName "ProFTPD"
245 ServerType standalone
246 DefaultServer on
247
248 Port 21
249 UseIPv6 on
250 Umask 022
251 MaxInstances 30
252 MaxClients 50
253 MaxClientsPerHost 8
254
255 # Set the user and group under which the server will run.
256 User ftp
257 Group ftp
258
259 CreateHome on
260 DefaultRoot ~
261
262 AllowOverwrite on
263
264 TLSEngine on
265 TLSRequired off
266 TLSProtocol TLSv1.1 TLSv1.2 TLSv1.3
267
268 TLSCertificateChainFile ${config.security.acme.certs.ftp.directory}/fullchain.pem
269 TLSECCertificateFile ${config.security.acme.certs.ftp.directory}/cert.pem
270 TLSECCertificateKeyFile ${config.security.acme.certs.ftp.directory}/key.pem
271 TLSRenegotiate none
272 PidFile /run/proftpd/proftpd.pid
273
274 ScoreboardFile /run/proftpd/proftpd.scoreboard
275
276 PassivePorts 40000 50000
277 #DebugLevel 10
278 Include ${config.secrets.fullPaths."proftpd-ldap.conf"}
279
280 RequireValidShell off
281
282 # Bar use of SITE CHMOD by default
283 <Limit SITE_CHMOD>
284 DenyAll
285 </Limit>
286
287 <VirtualHost 0.0.0.0>
288 Umask 022
289 Port 115
290 SFTPEngine on
291 CreateHome on
292 DefaultRoot ~
293
294 AllowOverwrite on
295
296 SFTPHostKey /etc/ssh/ssh_host_ed25519_key
297 SFTPHostKey /etc/ssh/ssh_host_rsa_key
298 Include ${config.secrets.fullPaths."proftpd-ldap.conf"}
299 RequireValidShell off
300 SFTPAuthorizedUserKeys file:/var/lib/proftpd/authorized_keys/%u
301 SFTPAuthMethods password publickey
302
303 SFTPOptions IgnoreSFTPSetOwners
304 AllowChrootSymlinks off
305 </VirtualHost>
306 '';
307 in lib.mkIf proftpd-enabled {
308 description = "ProFTPD server";
309 wantedBy = [ "multi-user.target" ];
310 after = [ "network.target" ];
311
312 serviceConfig.ExecStart = "${pkgs.proftpd}/bin/proftpd -c ${configFile}";
313 serviceConfig.Type = "forking";
314 serviceConfig.PIDFile = "/run/proftpd/proftpd.pid";
315 serviceConfig.RuntimeDirectory = "proftpd";
316 };
317
318 services.cron.systemCronJobs = lib.mkIf proftpd-enabled [
319 "*/2 * * * * nobody ${./ftp_sync.sh}"
320 ];
321
322 myServices.monitoring.fromMasterActivatedPlugins = [ "ftp" ];
323 myServices.monitoring.fromMasterObjects.service = [
324 {
325 service_description = "ftp has access to database for authentication";
326 host_name = config.hostEnv.fqdn;
327 use = "external-service";
328 check_command = "check_ftp_database";
329
330 servicegroups = "webstatus-remote-services";
331 _webstatus_name = "FTP";
332 _webstatus_url = "ftp.immae.eu";
333 }
334
335 ];
336
337 };
338
339}
diff --git a/systems/eldiron/ftp_sync.sh b/systems/eldiron/ftp_sync.sh
new file mode 100755
index 0000000..aff7178
--- /dev/null
+++ b/systems/eldiron/ftp_sync.sh
@@ -0,0 +1,47 @@
1#!/usr/bin/env bash
2
3LDAPSEARCH=ldapsearch
4
5LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu"
6LDAP_PASS=$(cat /etc/ssh/ldap_password)
7LDAP_HOST="ldap://ldap.immae.eu"
8LDAP_BASE="dc=immae,dc=eu"
9LDAP_FILTER="(memberOf=cn=users,cn=ftp,ou=services,dc=immae,dc=eu)"
10
11handle_keys() {
12 uids="$1"
13 keys="$2"
14 if [ -n "$uids" ]; then
15 for uid in $uids; do
16 echo "$keys" | while read key; do
17 if [ -n "$key" ]; then
18 ssh-keygen -e -f <(echo "$key")
19 fi
20 done > /var/lib/proftpd/authorized_keys/$uid
21 done
22 fi
23}
24
25mkdir -p /var/lib/proftpd/authorized_keys
26
27while read i; do
28 if [[ "$i" =~ ^dn: ]]; then
29 handle_keys "$uids" "$keys"
30 uids=""
31 keys=""
32 fi;
33 if [[ "$i" =~ ^uid: ]]; then
34 uids="$uids ${i#uid: }"
35 fi
36 if [[ "$i" =~ ^immaeSshKey: ]]; then
37 key="${i#immaeSshKey: }"
38 if [[ "$key" =~ ^ssh- ]]; then
39 keys="$keys
40$key"
41 elif echo "$key" | cut -d" " -f1 | grep -q "\bftp\b"; then
42 keys="$keys
43$(echo "$key" | cut -d" " -f2-)"
44 fi
45 fi
46done < <(ldapsearch -H "$LDAP_HOST" -ZZ -LLL -D "$LDAP_BIND" -w "$LDAP_PASS" -b "$LDAP_BASE" -x -o ldif-wrap=no "$LDAP_FILTER" uid immaeSshKey)
47handle_keys "$uids" "$keys"
diff --git a/systems/eldiron/gemini/default.nix b/systems/eldiron/gemini/default.nix
new file mode 100644
index 0000000..600afbc
--- /dev/null
+++ b/systems/eldiron/gemini/default.nix
@@ -0,0 +1,50 @@
1{ lib, config, pkgs, ... }:
2let
3 configFile = pkgs.writeText "config.yaml" ''
4 listen: ":1965"
5 hosts:
6 immae.eu:
7 cert: /var/lib/acme/immae/full.pem
8 key: /var/lib/acme/immae/key.pem
9 paths:
10 - path: /
11 root: ${./public}
12 '';
13in
14{
15 options.myServices.gemini.enable = lib.mkEnableOption "enable Gemini capsule";
16 config = lib.mkIf config.myServices.gemini.enable {
17 security.acme.certs.immae.postRun = ''
18 systemctl restart gemini.service
19 '';
20 myServices.chatonsProperties.hostings.gemini = {
21 file.datetime = "2022-08-27T18:00:00";
22 hosting = {
23 name = "Hébergement Gemini";
24 description = "Hébergement de capsules Gemini";
25 type = "INSTANCE";
26 website = "gemini://immae.eu";
27 status.level = "OK";
28 status.description = "OK";
29 registration.load = "OPEN";
30 install.type = "PACKAGE";
31 };
32 software = {
33 name = "twins";
34 website = "https://code.rocketnine.space/tslocum/twins";
35 license.url = "https://code.rocketnine.space/tslocum/twins/src/branch/master/LICENSE";
36 license.name = "MIT License";
37 version = pkgs.twins.version;
38 source.url = "https://code.rocketnine.space/tslocum/twins";
39 };
40 };
41 networking.firewall.allowedTCPPorts = [ 1965 ];
42 systemd.services.gemini = {
43 description = "Gemini capsule server";
44 wantedBy = [ "multi-user.target" ];
45 after = [ "network.target" ];
46 serviceConfig.ExecStart = "${pkgs.twins}/bin/twins -config ${configFile}";
47 serviceConfig.Type = "simple";
48 };
49 };
50}
diff --git a/modules/private/gemini/public/index.gmi b/systems/eldiron/gemini/public/index.gmi
index 034a0d9..034a0d9 100644
--- a/modules/private/gemini/public/index.gmi
+++ b/systems/eldiron/gemini/public/index.gmi
diff --git a/systems/eldiron/gitolite/default.nix b/systems/eldiron/gitolite/default.nix
new file mode 100644
index 0000000..1885234
--- /dev/null
+++ b/systems/eldiron/gitolite/default.nix
@@ -0,0 +1,127 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.gitolite;
4in {
5 options.myServices.gitolite = {
6 enable = lib.mkEnableOption "my gitolite service";
7 gitoliteDir = lib.mkOption {
8 type = lib.types.str;
9 default = "/var/lib/gitolite";
10 };
11 };
12
13 config = lib.mkIf cfg.enable {
14 myServices.dns.zones."immae.eu".subdomains.git =
15 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
16
17 myServices.chatonsProperties.services.gitolite = {
18 file.datetime = "2022-08-21T10:01:00";
19 service = {
20 name = "Gitolite";
21 description = "Gitolite allows you to setup git hosting on a central server, with fine-grained access control and many more powerful features.";
22 website = "https://git.immae.eu";
23 logo = "https://git.immae.eu/cgit-css/favicon.ico";
24 status.level = "OK";
25 status.description = "OK";
26 registration."" = ["MEMBER" "CLIENT"];
27 registration.load = "OPEN";
28 install.type = "PACKAGE";
29 guide.user = "https://www.immae.eu/docs/forge-logicielle.html";
30 };
31 software = {
32 name = "Gitolite";
33 website = "https://gitolite.com/gitolite/";
34 license.url = "https://github.com/sitaramc/gitolite/blob/master/COPYING";
35 license.name = "GNU General Public License v2.0";
36 version = pkgs.gitolite.version;
37 source.url = "https://github.com/sitaramc/gitolite";
38 };
39 };
40 myServices.ssh.modules.gitolite = {
41 snippet = builtins.readFile ./ldap_gitolite.sh;
42 dependencies = [ pkgs.gitolite ];
43 vars.ldap_group = "cn=users,cn=gitolite,ou=services,dc=immae,dc=eu";
44 vars.shell_path = "${pkgs.gitolite}/bin/gitolite-shell";
45 vars.services = let
46 toLine = login: key: ''command="${pkgs.gitolite}/bin/gitolite-shell ${login}",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ${key}'';
47 in builtins.concatStringsSep "\n" [
48 (toLine "naemon" config.myEnv.monitoring.ssh_public_key)
49 (toLine "buildbot" config.myEnv.buildbot.ssh_key.public)
50 ];
51 };
52 networking.firewall.allowedTCPPorts = [ 9418 ];
53
54 secrets.keys."gitolite/ldap_password" = {
55 user = "gitolite";
56 group = "gitolite";
57 permissions = "0400";
58 text = config.myEnv.tools.gitolite.ldap.password;
59 };
60
61 services.gitDaemon = {
62 enable = true;
63 user = "gitolite";
64 group = "gitolite";
65 basePath = "${cfg.gitoliteDir}/repositories";
66 };
67
68 system.activationScripts.gitolite = let
69 deps = [ pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.coreutils ];
70 gitolite_ldap_groups = pkgs.runCommand "gitolite_ldap_groups.sh" {
71 buildInputs = [ pkgs.makeWrapper ];
72 } ''
73 makeWrapper "${./gitolite_ldap_groups.sh}" "$out" \
74 --prefix PATH : ${lib.makeBinPath deps} \
75 --set LDAP_PASS_PATH ${config.secrets.fullPaths."gitolite/ldap_password"}
76 '';
77 in {
78 deps = [ "users" ];
79 text = ''
80 if [ -d ${cfg.gitoliteDir} ]; then
81 ln -sf ${gitolite_ldap_groups} ${cfg.gitoliteDir}/gitolite_ldap_groups.sh
82 chmod g+rx ${cfg.gitoliteDir}
83 fi
84 if [ -f ${cfg.gitoliteDir}/projects.list ]; then
85 chmod g+r ${cfg.gitoliteDir}/projects.list
86 fi
87 '';
88 };
89
90 users.users.wwwrun.extraGroups = [ "gitolite" ];
91 users.users.gitolite.extraGroups = [ "keys" ];
92
93 users.users.gitolite.packages = let
94 python-packages = python-packages: with python-packages; [
95 simplejson
96 apprise
97 sleekxmpp
98 urllib3
99 pyyaml
100 ];
101 in
102 [
103 # For some reason it absolutely wants to include "doc" output
104 ((pkgs.python39.withPackages python-packages) // { doc = ""; })
105 pkgs.nettools
106 pkgs.findutils
107 ];
108 # Installation: https://git.immae.eu/mantisbt/view.php?id=93
109 services.gitolite = {
110 enable = true;
111 adminPubkey = config.myEnv.sshd.rootKeys.immae_dilion;
112 };
113 myServices.monitoring.fromMasterActivatedPlugins = [ "git" ];
114 myServices.monitoring.fromMasterObjects.service = [
115 {
116 service_description = "gitolite is working";
117 host_name = config.hostEnv.fqdn;
118 use = "external-web-service";
119 check_command = "check_git";
120
121 servicegroups = "webstatus-remote-services";
122 _webstatus_name = "Git";
123 _webstatus_url = "git.immae.eu";
124 }
125 ];
126 };
127}
diff --git a/systems/eldiron/gitolite/gitolite_ldap_groups.sh b/systems/eldiron/gitolite/gitolite_ldap_groups.sh
new file mode 100755
index 0000000..ffa2dab
--- /dev/null
+++ b/systems/eldiron/gitolite/gitolite_ldap_groups.sh
@@ -0,0 +1,15 @@
1#!/usr/bin/env bash
2
3uid_param="$1"
4ldap_host="ldap://ldap.immae.eu"
5ldap_binddn="cn=gitolite,ou=services,dc=immae,dc=eu"
6ldap_bindpw="$(cat $LDAP_PASS_PATH)"
7ldap_searchbase="dc=immae,dc=eu"
8ldap_scope="subtree"
9
10ldap_options="-H ${ldap_host} -ZZ -x -D ${ldap_binddn} -w ${ldap_bindpw} -b ${ldap_searchbase} -s ${ldap_scope}"
11
12ldap_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)))"
13ldap_result=$(ldapsearch ${ldap_options} -LLL "${ldap_filter}" cn | grep 'cn:' | cut -d' ' -f2)
14
15echo "$ldap_result"
diff --git a/systems/eldiron/gitolite/ldap_gitolite.sh b/systems/eldiron/gitolite/ldap_gitolite.sh
new file mode 100644
index 0000000..75a39bf
--- /dev/null
+++ b/systems/eldiron/gitolite/ldap_gitolite.sh
@@ -0,0 +1,28 @@
1### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh
2LDAP_GITOLITE_MEMBER="@gitolite_ldap_group@"
3GITOLITE_SHELL="@gitolite_shell_path@"
4
5if [[ $user == gitolite ]]; then
6 allowed_logins=$(LDAP_BASE=$USER_LDAP_BASE \
7 ldap_search '(memberOf='$LDAP_GITOLITE_MEMBER')' '' \
8 | grep ^dn \
9 | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \
10 | paste -sd,)
11
12 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
13 if [[ $user == "immae" ]] || [[ $user == "denise" ]]; then
14 # Capitalize first letter (backward compatibility)
15 user=$(sed -r 's/^([a-z])/\U\1/' <<< "$user")
16 fi
17 if [ ! -z "$key" ]; then
18 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
19 echo -n 'command="'$GITOLITE_SHELL' '$user'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty '
20 echo $key
21 fi
22 fi
23 done
24cat <<EOF
25@gitolite_services@
26EOF
27 exit 0
28fi
diff --git a/systems/eldiron/irc.nix b/systems/eldiron/irc.nix
new file mode 100644
index 0000000..c48a4b3
--- /dev/null
+++ b/systems/eldiron/irc.nix
@@ -0,0 +1,80 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.irc;
4in
5{
6 options.myServices = {
7 irc.enable = lib.mkOption {
8 type = lib.types.bool;
9 default = false;
10 description = ''
11 Whether to enable irc stuff.
12 '';
13 };
14 };
15
16 config = lib.mkIf cfg.enable {
17 myServices.dns.zones."immae.eu".subdomains.irc =
18 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
19
20 myServices.chatonsProperties.services.bitlbee = {
21 file.datetime = "2022-08-27T19:00:00";
22 service = {
23 name = "Bitlbee";
24 description = "An IRC to other chat networks gateway";
25 logo = "https://www.bitlbee.org/style/logo.png";
26 website = "irc.immae.eu";
27 status.level = "OK";
28 status.description = "OK";
29 registration."" = ["MEMBER" "CLIENT"];
30 registration.load = "FULL";
31 install.type = "PACKAGE";
32 };
33 software = {
34 name = "BitlBee";
35 website = "https://www.bitlbee.org/";
36 license.url = "https://github.com/bitlbee/bitlbee/blob/master/COPYING";
37 license.name = "GNU General Public License v2.0";
38 version = pkgs.bitlbee.version;
39 source.url = "https://github.com/bitlbee/bitlbee";
40 modules = map (a: a.pname) config.services.bitlbee.plugins
41 ++ map (a: a.pname) config.services.bitlbee.libpurple_plugins;
42 };
43 };
44 security.acme.certs."irc" = {
45 domain = "irc.immae.eu";
46 postRun = ''
47 systemctl restart stunnel.service
48 '';
49 };
50
51 networking.firewall.allowedTCPPorts = [ 6697 ];
52 services.bitlbee = with pkgs; {
53 enable = true;
54 authMode = "Registered";
55 libpurple_plugins = [
56 purple-hangouts
57 purple-matrix
58 purple-facebook
59 purple-googlechat
60 ];
61 plugins = [
62 bitlbee-mastodon
63 bitlbee-facebook
64 bitlbee-discord
65 bitlbee-steam
66 ];
67 };
68
69 services.stunnel = {
70 enable = true;
71 servers = {
72 bitlbee = {
73 accept = 6697;
74 connect = 6667;
75 cert = "${config.security.acme.certs.irc.directory}/full.pem";
76 };
77 };
78 };
79 };
80}
diff --git a/systems/eldiron/mail/default.nix b/systems/eldiron/mail/default.nix
new file mode 100644
index 0000000..4e13f6a
--- /dev/null
+++ b/systems/eldiron/mail/default.nix
@@ -0,0 +1,44 @@
1{ lib, pkgs, config, ... }:
2{
3 imports = [
4 ./postfix.nix
5 ./dovecot.nix
6 ./rspamd.nix
7 ./sympa.nix
8 ];
9
10 options.myServices.mail.enable = lib.mkEnableOption "enable Mail services";
11 config = lib.mkIf config.myServices.mail.enable {
12 myServices.mail.milters.enable = true;
13 security.acme.certs."mail" = {
14 postRun = lib.mkBefore ''
15 cp -f fullchain.pem /etc/dovecot/fullchain.pem
16 chown :dovecot2 /etc/dovecot/fullchain.pem
17 chmod a+r /etc/dovecot/fullchain.pem
18 '';
19 domain = config.hostEnv.fqdn;
20 extraDomainNames = let
21 zonesWithMx = builtins.attrNames (lib.filterAttrs (n: v: v.hasEmail) config.myServices.dns.zones);
22 mxs = map (n: "${config.hostEnv.mx.subdomain}.${n}") zonesWithMx;
23 in mxs;
24 };
25 # This is for clients that don’t support elliptic curves (e.g.
26 # printer)
27 security.acme.certs."mail-rsa" = {
28 postRun = lib.mkBefore ''
29 cp -f fullchain.pem /etc/dovecot/fullchain-rsa.pem
30 chown :dovecot2 /etc/dovecot/fullchain-rsa.pem
31 chmod a+r /etc/dovecot/fullchain-rsa.pem
32 '';
33 domain = config.hostEnv.fqdn;
34 keyType = "rsa4096";
35 extraDomainNames = let
36 zonesWithMx = builtins.attrNames (lib.filterAttrs (n: v: v.hasEmail) config.myServices.dns.zones);
37 mxs = map (n: "${config.hostEnv.mx.subdomain}.${n}") zonesWithMx;
38 in mxs;
39 };
40 systemd.slices.mail = {
41 description = "Mail slice";
42 };
43 };
44}
diff --git a/systems/eldiron/mail/dovecot.nix b/systems/eldiron/mail/dovecot.nix
new file mode 100644
index 0000000..a1282e3
--- /dev/null
+++ b/systems/eldiron/mail/dovecot.nix
@@ -0,0 +1,348 @@
1{ lib, pkgs, config, ... }:
2let
3 sieve_bin = pkgs.runCommand "sieve_bin" {
4 buildInputs = [ pkgs.makeWrapper ];
5 } ''
6 cp -a ${./sieve_bin} $out
7 chmod -R u+w $out
8 patchShebangs $out
9 for i in $out/*; do
10 wrapProgram "$i" --prefix PATH : ${lib.makeBinPath [ pkgs.coreutils ]}
11 done
12 '';
13in
14{
15 config = lib.mkIf config.myServices.mail.enable {
16 myServices.dns.zones."immae.eu".subdomains =
17 with config.myServices.dns.helpers;
18 {
19 imap = ips servers.eldiron.ips.main;
20 pop3 = ips servers.eldiron.ips.main;
21 };
22
23 myServices.chatonsProperties.services.email = {
24 file.datetime = "2022-08-22T01:00:00";
25 service = {
26 name = "E-mail account";
27 description = "Compte e-mail avec configuration imap et smtp/pop3";
28 logo = "https://www.dovecot.org/wp-content/uploads/2021/09/favicon.ico";
29 website = "https://mail.immae.eu/";
30 status.level = "OK";
31 status.description = "OK";
32 registration."" = ["MEMBER" "CLIENT"];
33 registration.load = "OPEN";
34 install.type = "PACKAGE";
35 };
36 software = {
37 name = "Dovecot";
38 website = "https://www.dovecot.org/";
39 license.url = "https://github.com/dovecot/core/blob/main/COPYING";
40 license.name = "MIT and LGPLv2.1 Licenses";
41 version = pkgs.dovecot.version;
42 source.url = "https://github.com/dovecot/core";
43 modules = ["roundcube" "rainloop"] ++ map (a: a.pname) config.services.dovecot2.modules;
44 };
45 };
46 systemd.services.dovecot2.serviceConfig.Slice = "mail.slice";
47 secrets.keys."dovecot/ldap" = {
48 user = config.services.dovecot2.user;
49 group = config.services.dovecot2.group;
50 permissions = "0400";
51 text = ''
52 hosts = ${config.myEnv.mail.dovecot.ldap.host}
53 tls = yes
54
55 dn = ${config.myEnv.mail.dovecot.ldap.dn}
56 dnpass = ${config.myEnv.mail.dovecot.ldap.password}
57
58 auth_bind = yes
59
60 ldap_version = 3
61
62 base = ${config.myEnv.mail.dovecot.ldap.base}
63 scope = subtree
64
65 pass_filter = ${config.myEnv.mail.dovecot.ldap.filter}
66 pass_attrs = ${config.myEnv.mail.dovecot.ldap.pass_attrs}
67
68 user_attrs = ${config.myEnv.mail.dovecot.ldap.user_attrs}
69 user_filter = ${config.myEnv.mail.dovecot.ldap.filter}
70 iterate_attrs = ${config.myEnv.mail.dovecot.ldap.iterate_attrs}
71 iterate_filter = ${config.myEnv.mail.dovecot.ldap.iterate_filter}
72 '';
73 };
74
75 users.users.vhost = {
76 group = "vhost";
77 uid = config.ids.uids.vhost;
78 };
79 users.groups.vhost.gid = config.ids.gids.vhost;
80 users.users."${config.services.dovecot2.user}".extraGroups = [ "acme" ];
81
82 nixpkgs.overlays = [
83 (self: super: {
84 dovecot = super.dovecot.override { openldap = self.openldap_libressl_cyrus; };
85 })
86 ];
87
88 # https://blog.zeninc.net/index.php?post/2018/04/01/Un-annuaire-pour-les-gouverner-tous.......
89 services.dovecot2 = {
90 enable = true;
91 enablePAM = false;
92 enablePop3 = true;
93 enableImap = true;
94 enableLmtp = true;
95 protocols = [ "sieve" ];
96 modules = [
97 pkgs.dovecot_pigeonhole
98 pkgs.dovecot_fts_xapian
99 ];
100 mailUser = "vhost";
101 mailGroup = "vhost";
102 createMailUser = false;
103 mailboxes = {
104 Trash = { auto = "subscribe"; specialUse = "Trash"; };
105 Junk = { auto = "subscribe"; specialUse = "Junk"; };
106 Sent = { auto = "subscribe"; specialUse = "Sent"; };
107 Drafts = { auto = "subscribe"; specialUse = "Drafts"; };
108 };
109 mailLocation = "mbox:~/Mail:INBOX=~/Mail/Inbox:INDEX=~/.imap";
110 sslServerCert = "/etc/dovecot/fullchain.pem";
111 sslServerKey = "/var/lib/acme/mail/key.pem";
112 sslCACert = "/etc/dovecot/fullchain.pem";
113 extraConfig = builtins.concatStringsSep "\n" [
114 # For printer which doesn’t support elliptic curve
115 ''
116 ssl_alt_cert = </etc/dovecot/fullchain-rsa.pem
117 ssl_alt_key = </var/lib/acme/mail-rsa/key.pem
118 ''
119
120 ''
121 postmaster_address = postmaster@immae.eu
122 mail_attribute_dict = file:%h/dovecot-attributes
123 imap_idle_notify_interval = 20 mins
124 namespace inbox {
125 type = private
126 separator = /
127 inbox = yes
128 list = yes
129 }
130 ''
131
132 # ACL
133 ''
134 mail_plugins = $mail_plugins acl
135 plugin {
136 acl = vfile:${pkgs.writeText "dovecot-acl" ''
137 Backup/* owner lrp
138 ''}
139 acl_globals_only = yes
140 }
141 ''
142
143 # Full text search
144 ''
145 # needs to be bigger than any mailbox size
146 default_vsz_limit = 2GB
147 mail_plugins = $mail_plugins fts fts_xapian
148 plugin {
149 plugin = fts fts_xapian
150 fts = xapian
151 fts_xapian = partial=2 full=20
152 fts_autoindex = yes
153 fts_autoindex_exclude = \Junk
154 fts_autoindex_exclude2 = \Trash
155 fts_autoindex_exclude3 = Virtual/*
156 }
157 ''
158
159 # Antispam
160 # https://docs.iredmail.org/dovecot.imapsieve.html
161 ''
162 # imap_sieve plugin added below
163
164 plugin {
165 sieve_plugins = sieve_imapsieve sieve_extprograms
166 imapsieve_url = sieve://127.0.0.1:4190
167
168 sieve_before = file:${./sieve_scripts}/backup.sieve;bindir=/var/lib/vhost/.sieve_bin
169
170 # From elsewhere to Junk folder
171 imapsieve_mailbox1_name = Junk
172 imapsieve_mailbox1_causes = COPY APPEND
173 imapsieve_mailbox1_before = file:${./sieve_scripts}/report_spam.sieve;bindir=/var/lib/vhost/.imapsieve_bin
174
175 # From Junk folder to elsewhere
176 imapsieve_mailbox2_name = *
177 imapsieve_mailbox2_from = Junk
178 imapsieve_mailbox2_causes = COPY
179 imapsieve_mailbox2_before = file:${./sieve_scripts}/report_ham.sieve;bindir=/var/lib/vhost/.imapsieve_bin
180
181 # From anywhere to NoJunk folder
182 imapsieve_mailbox3_name = NoJunk
183 imapsieve_mailbox3_causes = COPY APPEND
184 imapsieve_mailbox3_before = file:${./sieve_scripts}/report_ham.sieve;bindir=/var/lib/vhost/.imapsieve_bin
185
186 sieve_pipe_bin_dir = ${sieve_bin}
187
188 sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
189 }
190 ''
191 # Services to listen
192 ''
193 service imap-login {
194 inet_listener imap {
195 }
196 inet_listener imaps {
197 }
198 }
199 service pop3-login {
200 inet_listener pop3 {
201 }
202 inet_listener pop3s {
203 }
204 }
205 service imap {
206 }
207 service pop3 {
208 }
209 service auth {
210 unix_listener auth-userdb {
211 }
212 unix_listener ${config.services.postfix.config.queue_directory}/private/auth {
213 mode = 0666
214 }
215 }
216 service auth-worker {
217 }
218 service dict {
219 unix_listener dict {
220 }
221 }
222 service stats {
223 unix_listener stats-reader {
224 user = vhost
225 group = vhost
226 mode = 0660
227 }
228 unix_listener stats-writer {
229 user = vhost
230 group = vhost
231 mode = 0660
232 }
233 }
234 ''
235
236 # Authentification
237 ''
238 first_valid_uid = ${toString config.ids.uids.vhost}
239 disable_plaintext_auth = yes
240 passdb {
241 driver = ldap
242 args = ${config.secrets.fullPaths."dovecot/ldap"}
243 }
244 userdb {
245 driver = ldap
246 args = ${config.secrets.fullPaths."dovecot/ldap"}
247 }
248 ''
249
250 # Zlib
251 ''
252 mail_plugins = $mail_plugins zlib
253 plugin {
254 zlib_save_level = 6
255 zlib_save = gz
256 }
257 ''
258
259 # Sieve
260 ''
261 plugin {
262 sieve = file:~/sieve;bindir=~/.sieve-bin;active=~/.dovecot.sieve
263 }
264 service managesieve-login {
265 }
266 service managesieve {
267 }
268 ''
269
270 # Virtual mailboxes
271 ''
272 mail_plugins = $mail_plugins virtual
273 namespace Virtual {
274 prefix = Virtual/
275 location = virtual:~/Virtual
276 }
277 ''
278
279 # Protocol specific configuration
280 # Needs to come last if there are mail_plugins entries
281 ''
282 protocol imap {
283 mail_plugins = $mail_plugins imap_sieve imap_acl
284 }
285 protocol lda {
286 mail_plugins = $mail_plugins sieve
287 }
288 ''
289 ];
290 };
291 networking.firewall.allowedTCPPorts = [ 110 143 993 995 4190 ];
292 system.activationScripts.dovecot = {
293 deps = [ "users" ];
294 text =''
295 install -m 0755 -o vhost -g vhost -d /var/lib/vhost
296 '';
297 };
298
299 services.cron.systemCronJobs = let
300 cron_script = pkgs.writeScriptBin "cleanup-imap-folders" ''
301 ${pkgs.dovecot}/bin/doveadm expunge -A MAILBOX "Backup/*" NOT FLAGGED BEFORE 8w 2>&1 > /dev/null | grep -v "Mailbox doesn't exist:" | grep -v "Info: Opening DB"
302 ${pkgs.dovecot}/bin/doveadm expunge -A MAILBOX Junk SEEN NOT FLAGGED BEFORE 4w 2>&1 > /dev/null | grep -v "Mailbox doesn't exist:" | grep -v "Info: Opening DB"
303 ${pkgs.dovecot}/bin/doveadm expunge -A MAILBOX Trash NOT FLAGGED BEFORE 4w 2>&1 > /dev/null | grep -v "Mailbox doesn't exist:" | grep -v "Info: Opening DB"
304 '';
305 in
306 [
307 "0 2 * * * root ${cron_script}/bin/cleanup-imap-folders"
308 ];
309 security.acme.certs."mail-rsa" = {
310 postRun = ''
311 systemctl restart dovecot2.service
312 '';
313 extraDomainNames = [ "imap.immae.eu" "pop3.immae.eu" ];
314 };
315 security.acme.certs."mail" = {
316 postRun = ''
317 systemctl restart dovecot2.service
318 '';
319 extraDomainNames = [ "imap.immae.eu" "pop3.immae.eu" ];
320 };
321 myServices.monitoring.fromMasterActivatedPlugins = [ "imap" "tcp" ];
322 myServices.monitoring.fromMasterObjects.service = [
323 {
324 service_description = "imap connection works";
325 host_name = config.hostEnv.fqdn;
326 use = "external-service";
327 check_command = "check_imap_connection";
328
329 servicegroups = "webstatus-remote-services,webstatus-email";
330 _webstatus_name = "IMAP";
331 _webstatus_url = "imap.immae.eu";
332 }
333
334 {
335 service_description = "imap SSL is up to date";
336 host_name = config.hostEnv.fqdn;
337 use = "external-service";
338 check_command = ["check_tcp_ssl" "993"];
339
340 servicegroups = "webstatus-ssl";
341 _webstatus_name = "IMAP";
342 _webstatus_url = "imap.immae.eu";
343 }
344
345 ];
346 };
347}
348
diff --git a/systems/eldiron/mail/postfix.nix b/systems/eldiron/mail/postfix.nix
new file mode 100644
index 0000000..f95ee1b
--- /dev/null
+++ b/systems/eldiron/mail/postfix.nix
@@ -0,0 +1,497 @@
1{ lib, pkgs, config, options, ... }:
2let
3 getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) (lib.filterAttrs (n: v: v.receive) p.emailPolicies);
4 bydomain = builtins.mapAttrs (n: getDomains) config.myServices.dns.zones;
5 receiving_domains = lib.flatten (builtins.attrValues bydomain);
6in
7{
8 options.services.postfix.submissionOptions' = options.services.postfix.submissionOptions // {
9 type = with lib.types; attrsOf (either str (listOf str));
10 apply = builtins.mapAttrs (n: v: if builtins.isList v then builtins.concatStringsSep "," v else v);
11 };
12 config = lib.mkIf config.myServices.mail.enable {
13 myServices.dns.zones."immae.eu" = with config.myServices.dns.helpers; lib.mkMerge [
14 mailMX
15 (mailCommon "immae.eu")
16 mailSend
17 {
18 # Virtual forwards and mailboxes for real users
19 emailPolicies."mail".receive = true;
20 # multi-domain generic mails:
21 # hostmaster, cron, httpd, naemon, postmaster
22 # system virtual mailboxes:
23 # devnull, printer, testconnect
24 emailPolicies."".receive = true;
25 subdomains.mail = lib.mkMerge [ (mailCommon "immae.eu") mailSend ];
26 subdomains.smtp = ips servers.eldiron.ips.main;
27
28 # DMARC reports
29 subdomains._dmarc.subdomains._report.subdomains = let
30 getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) p.emailPolicies;
31 bydomain = builtins.mapAttrs (n: getDomains) config.myServices.dns.zones;
32 hostsWithMail = lib.flatten (builtins.attrValues bydomain);
33 nvpairs = builtins.map (e: { name = e; value = { TXT = [ "v=DMARC1;" ]; }; }) hostsWithMail;
34 in
35 builtins.listToAttrs nvpairs;
36 }
37 ];
38
39 myServices.chatonsProperties.hostings.mx-backup = {
40 file.datetime = "2022-08-22T01:00:00";
41 hosting = {
42 name = "MX Backup";
43 description = "Serveur e-mail secondaire";
44 logo = "https://www.postfix.org/favicon.ico";
45 website = "https://mail.immae.eu/";
46 status.level = "OK";
47 status.description = "OK";
48 registration.load = "OPEN";
49 install.type = "PACKAGE";
50 };
51 software = {
52 name = "Postfix";
53 website = "http://www.postfix.org/";
54 license.url = "http://postfix.mirrors.ovh.net/postfix-release/LICENSE";
55 license.name = "Eclipse Public license (EPL 2.0) and IBM Public License (IPL 1.0)";
56 version = pkgs.postfix.version;
57 source.url = "http://www.postfix.org/download.html";
58 };
59 };
60 secrets.keys = {
61 "postfix/mysql_alias_maps" = {
62 user = config.services.postfix.user;
63 group = config.services.postfix.group;
64 permissions = "0440";
65 text = ''
66 # We need to specify that option to trigger ssl connection
67 tls_ciphers = TLSv1.2
68 user = ${config.myEnv.mail.postfix.mysql.user}
69 password = ${config.myEnv.mail.postfix.mysql.password}
70 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
71 dbname = ${config.myEnv.mail.postfix.mysql.database}
72 query = SELECT DISTINCT destination
73 FROM forwardings
74 WHERE
75 ((regex = 1 AND '%s' REGEXP CONCAT('^',source,'$') ) OR (regex = 0 AND source = '%s'))
76 AND active = 1
77 AND '%s' NOT IN
78 (
79 SELECT source
80 FROM forwardings_blacklisted
81 WHERE source = '%s'
82 ) UNION
83 SELECT 'devnull@immae.eu'
84 FROM forwardings_blacklisted
85 WHERE source = '%s'
86 '';
87 };
88 "postfix/ldap_mailboxes" = {
89 user = config.services.postfix.user;
90 group = config.services.postfix.group;
91 permissions = "0440";
92 text = ''
93 server_host = ldaps://${config.myEnv.mail.dovecot.ldap.host}:636
94 search_base = ${config.myEnv.mail.dovecot.ldap.base}
95 query_filter = ${config.myEnv.mail.dovecot.ldap.postfix_mailbox_filter}
96 bind_dn = ${config.myEnv.mail.dovecot.ldap.dn}
97 bind_pw = ${config.myEnv.mail.dovecot.ldap.password}
98 result_attribute = immaePostfixAddress
99 result_format = dummy
100 version = 3
101 '';
102 };
103 "postfix/mysql_sender_login_maps" = {
104 user = config.services.postfix.user;
105 group = config.services.postfix.group;
106 permissions = "0440";
107 text = ''
108 # We need to specify that option to trigger ssl connection
109 tls_ciphers = TLSv1.2
110 user = ${config.myEnv.mail.postfix.mysql.user}
111 password = ${config.myEnv.mail.postfix.mysql.password}
112 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
113 dbname = ${config.myEnv.mail.postfix.mysql.database}
114 query = SELECT DISTINCT destination
115 FROM forwardings
116 WHERE
117 (
118 (regex = 1 AND CONCAT(SUBSTRING_INDEX('%u', '+', 1), '@%d') REGEXP CONCAT('^',source,'$') )
119 OR
120 (regex = 0 AND source = CONCAT(SUBSTRING_INDEX('%u', '+', 1), '@%d'))
121 )
122 AND active = 1
123 UNION SELECT CONCAT(SUBSTRING_INDEX('%u', '+', 1), '@%d') AS destination
124 '';
125 };
126 "postfix/mysql_sender_relays_maps" = {
127 user = config.services.postfix.user;
128 group = config.services.postfix.group;
129 permissions = "0440";
130 text = ''
131 # We need to specify that option to trigger ssl connection
132 tls_ciphers = TLSv1.2
133 user = ${config.myEnv.mail.postfix.mysql.user}
134 password = ${config.myEnv.mail.postfix.mysql.password}
135 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
136 dbname = ${config.myEnv.mail.postfix.mysql.database}
137 # INSERT INTO sender_relays
138 # (`from`, owner, relay, login, password, regex, active)
139 # VALUES
140 # ( 'sender@otherhost.org'
141 # , 'me@mail.immae.eu'
142 # , '[otherhost.org]:587'
143 # , 'otherhostlogin'
144 # , AES_ENCRYPT('otherhostpassword', '${config.myEnv.mail.postfix.mysql.password_encrypt}')
145 # , '0'
146 # , '1');
147
148 query = SELECT DISTINCT `owner`
149 FROM sender_relays
150 WHERE
151 ((regex = 1 AND '%s' REGEXP CONCAT('^',`from`,'$') ) OR (regex = 0 AND `from` = '%s'))
152 AND active = 1
153 '';
154 };
155 "postfix/mysql_sender_relays_hosts" = {
156 user = config.services.postfix.user;
157 group = config.services.postfix.group;
158 permissions = "0440";
159 text = ''
160 # We need to specify that option to trigger ssl connection
161 tls_ciphers = TLSv1.2
162 user = ${config.myEnv.mail.postfix.mysql.user}
163 password = ${config.myEnv.mail.postfix.mysql.password}
164 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
165 dbname = ${config.myEnv.mail.postfix.mysql.database}
166
167 query = SELECT DISTINCT relay
168 FROM sender_relays
169 WHERE
170 ((regex = 1 AND '%s' REGEXP CONCAT('^',`from`,'$') ) OR (regex = 0 AND `from` = '%s'))
171 AND active = 1
172 '';
173 };
174 "postfix/mysql_sender_relays_creds" = {
175 user = config.services.postfix.user;
176 group = config.services.postfix.group;
177 permissions = "0440";
178 text = ''
179 # We need to specify that option to trigger ssl connection
180 tls_ciphers = TLSv1.2
181 user = ${config.myEnv.mail.postfix.mysql.user}
182 password = ${config.myEnv.mail.postfix.mysql.password}
183 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
184 dbname = ${config.myEnv.mail.postfix.mysql.database}
185
186 query = SELECT DISTINCT CONCAT(`login`, ':', AES_DECRYPT(`password`, '${config.myEnv.mail.postfix.mysql.password_encrypt}'))
187 FROM sender_relays
188 WHERE
189 ((regex = 1 AND '%s' REGEXP CONCAT('^',`from`,'$') ) OR (regex = 0 AND `from` = '%s'))
190 AND active = 1
191 '';
192 };
193 "postfix/ldap_ejabberd_users_immae_fr" = {
194 user = config.services.postfix.user;
195 group = config.services.postfix.group;
196 permissions = "0440";
197 text = ''
198 server_host = ldaps://${config.myEnv.jabber.ldap.host}:636
199 search_base = ${config.myEnv.jabber.ldap.base}
200 query_filter = ${config.myEnv.jabber.postfix_user_filter}
201 domain = immae.fr
202 bind_dn = ${config.myEnv.jabber.ldap.dn}
203 bind_pw = ${config.myEnv.jabber.ldap.password}
204 result_attribute = immaeXmppUid
205 result_format = ejabberd@localhost
206 version = 3
207 '';
208 };
209 };
210
211 networking.firewall.allowedTCPPorts = [ 25 465 587 ];
212
213 users.users.postfixscripts = {
214 group = "keys";
215 uid = config.ids.uids.postfixscripts;
216 description = "Postfix scripts user";
217 };
218 users.users."${config.services.postfix.user}".extraGroups = [ "keys" ];
219 services.filesWatcher.postfix = {
220 restart = true;
221 paths = [
222 config.secrets.fullPaths."postfix/mysql_alias_maps"
223 config.secrets.fullPaths."postfix/ldap_mailboxes"
224 config.secrets.fullPaths."postfix/mysql_sender_login_maps"
225 config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"
226 ];
227 };
228 services.postfix = {
229 extraAliases = let
230 testmail = pkgs.writeScript "testmail" ''
231 #! ${pkgs.stdenv.shell}
232 ${pkgs.coreutils}/bin/touch \
233 "/var/lib/naemon/checks/email/$(${pkgs.procmail}/bin/formail -x To: | ${pkgs.coreutils}/bin/tr -d ' <>')"
234 '';
235 in
236 ''testmail: "|${testmail}"'';
237 mapFiles = let
238 virtual_map = {
239 virtual = let
240 cfg = config.myEnv.monitoring.email_check.eldiron;
241 address = "${cfg.mail_address}@${cfg.mail_domain}";
242 aliases = config.myEnv.mail.postfix.common_aliases;
243 admins = builtins.concatStringsSep "," config.myEnv.mail.postfix.admins;
244 in pkgs.writeText "postfix-virtual" (
245 builtins.concatStringsSep "\n" (
246 [ "${address} testmail@localhost"
247 ] ++
248 map (a: "${a} ${admins}") config.myEnv.mail.postfix.other_aliases
249 ++ lib.lists.flatten (
250 map (domain:
251 map (alias: "${alias}@${domain} ${admins}") aliases
252 ) receiving_domains
253 )
254 ));
255 };
256 sasl_access = {
257 host_sender_login = with lib.attrsets; let
258 addresses = zipAttrs (lib.flatten (mapAttrsToList
259 (n: v: (map (e: { "${e}" = "${n}@immae.eu"; }) v.emails)) config.myEnv.servers));
260 aliases = config.myEnv.mail.postfix.common_aliases;
261 joined = builtins.concatStringsSep ",";
262 admins = joined config.myEnv.mail.postfix.admins;
263 in pkgs.writeText "host-sender-login"
264 (builtins.concatStringsSep "\n" (
265 mapAttrsToList (n: v: "${n} ${joined v}") addresses
266 ++ lib.lists.flatten (
267 map (domain:
268 map (alias: "${alias}@${domain} ${admins}") aliases
269 ) receiving_domains
270 )
271 ++ map (a: "${a} ${admins}") config.myEnv.mail.postfix.other_aliases
272 ));
273 };
274 in
275 virtual_map // sasl_access;
276 config = {
277 ### postfix module overrides
278 readme_directory = "${pkgs.postfix}/share/postfix/doc";
279 smtp_tls_CAfile = lib.mkForce "";
280 smtp_tls_cert_file = lib.mkForce "";
281 smtp_tls_key_file = lib.mkForce "";
282
283 message_size_limit = "1073741824"; # Don't put 0 here, it's not equivalent to "unlimited"
284 mailbox_size_limit = "1073741825"; # Workaround, local delivered mails should all go through scripts
285 alias_database = "\$alias_maps";
286
287 ### Aliases scripts user
288 default_privs = "postfixscripts";
289
290 ### Virtual mailboxes config
291 virtual_alias_maps = [
292 "hash:/etc/postfix/virtual"
293 "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}"
294 "ldap:${config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"}"
295 ];
296 virtual_mailbox_domains = receiving_domains;
297 virtual_mailbox_maps = [
298 "ldap:${config.secrets.fullPaths."postfix/ldap_mailboxes"}"
299 ];
300 dovecot_destination_recipient_limit = "1";
301 virtual_transport = "dovecot";
302
303 ### Relay domains
304 smtpd_relay_restrictions = [
305 "defer_unauth_destination"
306 ];
307
308 ### Additional smtpd configuration
309 smtpd_tls_received_header = "yes";
310 smtpd_tls_loglevel = "1";
311
312 ### Email sending configuration
313 smtp_tls_security_level = "may";
314 smtp_tls_loglevel = "1";
315
316 ### Force ip bind for smtp
317 smtp_bind_address = builtins.head config.hostEnv.ips.main.ip4;
318 smtp_bind_address6 = builtins.head config.hostEnv.ips.main.ip6;
319
320 # Use some relays when authorized senders are not myself
321 smtp_sasl_mechanism_filter = [
322 "plain"
323 "login"
324 ]; # GSSAPI Not correctly supported by postfix
325 smtp_sasl_auth_enable = "yes";
326 smtp_sasl_password_maps = [
327 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_creds"}"
328 ];
329 smtp_sasl_security_options = "noanonymous";
330 smtp_sender_dependent_authentication = "yes";
331 sender_dependent_relayhost_maps = [
332 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_hosts"}"
333 ];
334
335 ### opendkim, opendmarc, openarc milters
336 non_smtpd_milters = [
337 "unix:${config.myServices.mail.milters.sockets.opendkim}"
338 ];
339 smtpd_milters = [
340 "unix:${config.myServices.mail.milters.sockets.opendkim}"
341 "unix:${config.myServices.mail.milters.sockets.openarc}"
342 "unix:${config.myServices.mail.milters.sockets.opendmarc}"
343 ];
344
345 smtp_use_tls = true;
346 smtpd_use_tls = true;
347 smtpd_tls_chain_files = [
348 "/var/lib/acme/mail/full.pem"
349 "/var/lib/acme/mail-rsa/full.pem"
350 ];
351
352 maximal_queue_lifetime = "6w";
353 bounce_queue_lifetime = "6w";
354 };
355 enable = true;
356 enableSmtp = true;
357 enableSubmission = true;
358 submissionOptions = config.services.postfix.submissionOptions';
359 submissionOptions' = {
360 # Don’t use "long form", only commas (cf
361 # http://www.postfix.org/master.5.html long form is not handled
362 # well by the submission function)
363 smtpd_tls_security_level = "encrypt";
364 smtpd_sasl_auth_enable = "yes";
365 smtpd_tls_auth_only = "yes";
366 smtpd_sasl_tls_security_options = "noanonymous";
367 smtpd_sasl_type = "dovecot";
368 smtpd_sasl_path = "private/auth";
369 smtpd_reject_unlisted_recipient = "no";
370 smtpd_client_restrictions = [
371 "permit_sasl_authenticated"
372 "reject"
373 ];
374 smtpd_relay_restrictions = [
375 "permit_sasl_authenticated"
376 "reject"
377 ];
378 # Refuse to send e-mails with a From that is not handled
379 smtpd_sender_restrictions = [
380 "reject_sender_login_mismatch"
381 "reject_unlisted_sender"
382 "permit_sasl_authenticated,reject"
383 ];
384 smtpd_sender_login_maps = [
385 "hash:/etc/postfix/host_sender_login"
386 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_maps"}"
387 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_login_maps"}"
388 ];
389 smtpd_recipient_restrictions = [
390 "permit_sasl_authenticated"
391 "reject"
392 ];
393 milter_macro_daemon_name = "ORIGINATING";
394 smtpd_milters = [
395 # FIXME: put it back when opensmtpd is upgraded and able to
396 # rewrite the from header
397 #"unix:/run/milter_verify_from/verify_from.sock"
398 "unix:${config.myServices.mail.milters.sockets.opendkim}"
399 ];
400 };
401 destination = ["localhost"];
402 # This needs to reverse DNS
403 hostname = config.hostEnv.fqdn;
404 setSendmail = true;
405 recipientDelimiter = "+";
406 masterConfig = {
407 submissions = {
408 type = "inet";
409 private = false;
410 command = "smtpd";
411 args = ["-o" "smtpd_tls_wrappermode=yes" ] ++ (let
412 mkKeyVal = opt: val: [ "-o" (opt + "=" + val) ];
413 in lib.concatLists (lib.mapAttrsToList mkKeyVal config.services.postfix.submissionOptions)
414 );
415 };
416 dovecot = {
417 type = "unix";
418 privileged = true;
419 chroot = false;
420 command = "pipe";
421 args = let
422 # rspamd could be used as a milter, but then it cannot apply
423 # its checks "per user" (milter is not yet dispatched to
424 # users), so we wrap dovecot-lda inside rspamc per recipient
425 # here.
426 rspamc_dovecot = pkgs.writeScriptBin "rspamc_dovecot" ''
427 #! ${pkgs.stdenv.shell}
428 set -o pipefail
429 sender="$1"
430 original_recipient="$2"
431 user="$3"
432
433 ${pkgs.coreutils}/bin/cat - | \
434 ${pkgs.rspamd}/bin/rspamc -h ${config.myServices.mail.rspamd.sockets.worker-controller} -c bayes -d "$user" --mime | \
435 ${pkgs.dovecot}/libexec/dovecot/dovecot-lda -f "$sender" -a "$original_recipient" -d "$user"
436 if echo ''${PIPESTATUS[@]} | ${pkgs.gnugrep}/bin/grep -qE '^[0 ]+$'; then
437 exit 0
438 else
439 # src/global/sys_exits.h to retry
440 exit 75
441 fi
442 '';
443 in [
444 "flags=ODRhu" "user=vhost:vhost"
445 "argv=${rspamc_dovecot}/bin/rspamc_dovecot \${sender} \${original_recipient} \${user}@\${nexthop}"
446 ];
447 };
448 };
449 };
450 security.acme.certs."mail" = {
451 postRun = ''
452 systemctl restart postfix.service
453 '';
454 extraDomainNames = [ "smtp.immae.eu" ];
455 };
456 security.acme.certs."mail-rsa" = {
457 postRun = ''
458 systemctl restart postfix.service
459 '';
460 extraDomainNames = [ "smtp.immae.eu" ];
461 };
462 system.activationScripts.testmail = {
463 deps = [ "users" ];
464 text = let
465 allCfg = config.myEnv.monitoring.email_check;
466 cfg = allCfg.eldiron;
467 reverseTargets = builtins.attrNames (lib.attrsets.filterAttrs (k: v: builtins.elem "eldiron" v.targets) allCfg);
468 to_email = cfg': host':
469 let sep = if lib.strings.hasInfix "+" cfg'.mail_address then "_" else "+";
470 in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}";
471 mails_to_receive = builtins.concatStringsSep " " (map (to_email cfg) reverseTargets);
472 in ''
473 install -m 0555 -o postfixscripts -g keys -d /var/lib/naemon/checks/email
474 for f in ${mails_to_receive}; do
475 if [ ! -f /var/lib/naemon/checks/email/$f ]; then
476 install -m 0644 -o postfixscripts -g keys /dev/null -T /var/lib/naemon/checks/email/$f
477 touch -m -d @0 /var/lib/naemon/checks/email/$f
478 fi
479 done
480 '';
481 };
482 systemd.services.postfix.serviceConfig.Slice = "mail.slice";
483
484 myServices.monitoring.fromMasterObjects.service = [
485 {
486 service_description = "postfix SSL is up to date";
487 host_name = config.hostEnv.fqdn;
488 use = "external-service";
489 check_command = "check_smtp";
490
491 servicegroups = "webstatus-ssl";
492 _webstatus_name = "SMTP";
493 _webstatus_url = "smtp.immae.eu";
494 }
495 ];
496 };
497}
diff --git a/systems/eldiron/mail/rspamd.nix b/systems/eldiron/mail/rspamd.nix
new file mode 100644
index 0000000..a300cc5
--- /dev/null
+++ b/systems/eldiron/mail/rspamd.nix
@@ -0,0 +1,88 @@
1{ lib, pkgs, config, ... }:
2{
3 options.myServices.mail.rspamd.sockets = lib.mkOption {
4 type = lib.types.attrsOf lib.types.path;
5 default = {
6 worker-controller = "/run/rspamd/worker-controller.sock";
7 };
8 readOnly = true;
9 description = ''
10 rspamd sockets
11 '';
12 };
13 config = lib.mkIf config.myServices.mail.enable {
14 services.cron.systemCronJobs = let
15 cron_script = pkgs.runCommand "cron_script" {
16 buildInputs = [ pkgs.makeWrapper ];
17 } ''
18 mkdir -p $out
19 cp ${./scan_reported_mails} $out/scan_reported_mails
20 patchShebangs $out
21 for i in $out/*; do
22 wrapProgram "$i" --prefix PATH : ${lib.makeBinPath [ pkgs.coreutils pkgs.rspamd pkgs.flock ]}
23 done
24 '';
25 in
26 [ "*/20 * * * * vhost ${cron_script}/scan_reported_mails" ];
27
28 systemd.services.rspamd.serviceConfig.Slice = "mail.slice";
29 systemd.services.rspamd.serviceConfig.SupplementaryGroups = [ "vhost" ];
30 services.rspamd = {
31 enable = true;
32 debug = false;
33 overrides = {
34 "actions.conf".text = ''
35 reject = null;
36 add_header = 6;
37 greylist = null;
38 '';
39 "milter_headers.conf".text = ''
40 extended_spam_headers = true;
41 '';
42 };
43 locals = {
44 "redis.conf".text = ''
45 servers = "${config.myEnv.mail.rspamd.redis.socket}";
46 db = "${config.myEnv.mail.rspamd.redis.db}";
47 '';
48 "classifier-bayes.conf".text = ''
49 users_enabled = true;
50 backend = "redis";
51 servers = "${config.myEnv.mail.rspamd.redis.socket}";
52 database = "${config.myEnv.mail.rspamd.redis.db}";
53 autolearn = true;
54 cache {
55 backend = "redis";
56 }
57 new_schema = true;
58 statfile {
59 BAYES_HAM {
60 spam = false;
61 }
62 BAYES_SPAM {
63 spam = true;
64 }
65 }
66 '';
67 };
68 workers = {
69 controller = {
70 extraConfig = ''
71 enable_password = "${config.myEnv.mail.rspamd.write_password_hashed}";
72 password = "${config.myEnv.mail.rspamd.read_password_hashed}";
73 '';
74 bindSockets = [ {
75 socket = config.myServices.mail.rspamd.sockets.worker-controller;
76 mode = "0660";
77 owner = config.services.rspamd.user;
78 group = "vhost";
79 } ];
80 };
81 };
82 postfix = {
83 enable = true;
84 config = {};
85 };
86 };
87 };
88}
diff --git a/modules/private/mail/scan_reported_mails b/systems/eldiron/mail/scan_reported_mails
index fe9f4d6..fe9f4d6 100755
--- a/modules/private/mail/scan_reported_mails
+++ b/systems/eldiron/mail/scan_reported_mails
diff --git a/modules/private/mail/sieve_bin/imapsieve_copy b/systems/eldiron/mail/sieve_bin/imapsieve_copy
index 2ca1f23..2ca1f23 100755
--- a/modules/private/mail/sieve_bin/imapsieve_copy
+++ b/systems/eldiron/mail/sieve_bin/imapsieve_copy
diff --git a/modules/private/mail/sieve_scripts/backup.sieve b/systems/eldiron/mail/sieve_scripts/backup.sieve
index 3014c0a..3014c0a 100644
--- a/modules/private/mail/sieve_scripts/backup.sieve
+++ b/systems/eldiron/mail/sieve_scripts/backup.sieve
diff --git a/modules/private/mail/sieve_scripts/report_ham.sieve b/systems/eldiron/mail/sieve_scripts/report_ham.sieve
index f9b8481..f9b8481 100644
--- a/modules/private/mail/sieve_scripts/report_ham.sieve
+++ b/systems/eldiron/mail/sieve_scripts/report_ham.sieve
diff --git a/modules/private/mail/sieve_scripts/report_spam.sieve b/systems/eldiron/mail/sieve_scripts/report_spam.sieve
index 9a1f794..9a1f794 100644
--- a/modules/private/mail/sieve_scripts/report_spam.sieve
+++ b/systems/eldiron/mail/sieve_scripts/report_spam.sieve
diff --git a/systems/eldiron/mail/sympa.nix b/systems/eldiron/mail/sympa.nix
new file mode 100644
index 0000000..8e801dd
--- /dev/null
+++ b/systems/eldiron/mail/sympa.nix
@@ -0,0 +1,232 @@
1{ lib, pkgs, config, ... }:
2let
3 domain = "lists.immae.eu";
4 sympaConfig = config.myEnv.mail.sympa;
5in
6{
7 config = lib.mkIf config.myServices.mail.enable {
8 myServices.dns.zones."immae.eu".emailPolicies."lists".receive = true;
9 myServices.dns.zones."immae.eu".subdomains.lists =
10 with config.myServices.dns.helpers; lib.mkMerge [
11 (ips servers.eldiron.ips.main)
12 (mailCommon "immae.eu")
13 mailSend
14 ];
15
16 myServices.chatonsProperties.services.sympa = {
17 file.datetime = "2022-08-22T00:50:00";
18 service = {
19 name = "Sympa";
20 description = "Mailing lists service";
21 website = "https://mail.immae.eu/sympa";
22 logo = "https://mail.immae.eu/static-sympa/icons/favicon_sympa.png";
23 status.level = "OK";
24 status.description = "OK";
25 registration."" = ["MEMBER" "CLIENT"];
26 registration.load = "OPEN";
27 install.type = "PACKAGE";
28 };
29 software = {
30 name = "Sympa";
31 website = "https://www.sympa.org/";
32 license.url = "https://github.com/sympa-community/sympa/blob/sympa-6.2/COPYING";
33 license.name = "GNU General Public License v2.0";
34 version = pkgs.sympa.version;
35 source.url = "https://github.com/sympa-community/sympa/";
36 };
37 };
38 myServices.databases.postgresql.authorizedHosts = {
39 backup-2 = [
40 {
41 username = "sympa";
42 database = "sympa";
43 ip4 = config.myEnv.servers.backup-2.ips.main.ip4;
44 ip6 = map (v: "${v}/128") config.myEnv.servers.backup-2.ips.main.ip6;
45 }
46 ];
47 };
48 services.websites.env.tools.vhostConfs.mail = {
49 extraConfig = lib.mkAfter [
50 ''
51 Alias /static-sympa/ /var/lib/sympa/static_content/
52 <Directory /var/lib/sympa/static_content/>
53 Require all granted
54 AllowOverride none
55 </Directory>
56 <Location /sympa>
57 SetHandler "proxy:unix:/run/sympa/wwsympa.socket|fcgi://"
58 Require all granted
59 </Location>
60 ''
61 ];
62 };
63
64 secrets.keys = {
65 "sympa/db_password" = {
66 permissions = "0400";
67 group = "sympa";
68 user = "sympa";
69 text = sympaConfig.postgresql.password;
70 };
71 }
72 // lib.mapAttrs' (n: v: lib.nameValuePair "sympa/data_sources/${n}.incl" {
73 permissions = "0400"; group = "sympa"; user = "sympa"; text = v;
74 }) sympaConfig.data_sources
75 // lib.mapAttrs' (n: v: lib.nameValuePair "sympa/scenari/${n}" {
76 permissions = "0400"; group = "sympa"; user = "sympa"; text = v;
77 }) sympaConfig.scenari;
78 users.users.sympa.extraGroups = [ "keys" ];
79 systemd.slices.mail-sympa = {
80 description = "Sympa slice";
81 };
82
83 systemd.services.sympa.serviceConfig.SupplementaryGroups = [ "keys" ];
84 systemd.services.sympa-archive.serviceConfig.SupplementaryGroups = [ "keys" ];
85 systemd.services.sympa-bounce.serviceConfig.SupplementaryGroups = [ "keys" ];
86 systemd.services.sympa-bulk.serviceConfig.SupplementaryGroups = [ "keys" ];
87 systemd.services.sympa-task.serviceConfig.SupplementaryGroups = [ "keys" ];
88
89 systemd.services.sympa.serviceConfig.Slice = "mail-sympa.slice";
90 systemd.services.sympa-archive.serviceConfig.Slice = "mail-sympa.slice";
91 systemd.services.sympa-bounce.serviceConfig.Slice = "mail-sympa.slice";
92 systemd.services.sympa-bulk.serviceConfig.Slice = "mail-sympa.slice";
93 systemd.services.sympa-task.serviceConfig.Slice = "mail-sympa.slice";
94
95 # https://github.com/NixOS/nixpkgs/pull/84202
96 systemd.services.sympa.serviceConfig.ProtectKernelModules = lib.mkForce false;
97 systemd.services.sympa-archive.serviceConfig.ProtectKernelModules = lib.mkForce false;
98 systemd.services.sympa-bounce.serviceConfig.ProtectKernelModules = lib.mkForce false;
99 systemd.services.sympa-bulk.serviceConfig.ProtectKernelModules = lib.mkForce false;
100 systemd.services.sympa-task.serviceConfig.ProtectKernelModules = lib.mkForce false;
101 systemd.services.sympa.serviceConfig.ProtectKernelTunables = lib.mkForce false;
102 systemd.services.sympa-archive.serviceConfig.ProtectKernelTunables = lib.mkForce false;
103 systemd.services.sympa-bounce.serviceConfig.ProtectKernelTunables = lib.mkForce false;
104 systemd.services.sympa-bulk.serviceConfig.ProtectKernelTunables = lib.mkForce false;
105 systemd.services.sympa-task.serviceConfig.ProtectKernelTunables = lib.mkForce false;
106
107 systemd.services.wwsympa = {
108 wantedBy = [ "multi-user.target" ];
109 after = [ "sympa.service" ];
110 serviceConfig = {
111 Slice = "mail-sympa.slice";
112 Type = "forking";
113 PIDFile = "/run/sympa/wwsympa.pid";
114 Restart = "always";
115 ExecStart = ''${pkgs.spawn_fcgi}/bin/spawn-fcgi \
116 -u sympa \
117 -g sympa \
118 -U wwwrun \
119 -M 0600 \
120 -F 2 \
121 -P /run/sympa/wwsympa.pid \
122 -s /run/sympa/wwsympa.socket \
123 -- ${pkgs.sympa}/lib/sympa/cgi/wwsympa.fcgi
124 '';
125 StateDirectory = "sympa";
126 ProtectHome = true;
127 ProtectSystem = "full";
128 ProtectControlGroups = true;
129 };
130 };
131
132 services.postfix = {
133 mapFiles = {
134 # Update relay list when changing one of those
135 sympa_virtual = pkgs.writeText "virtual.sympa" ''
136 sympa-request@${domain} postmaster@immae.eu
137 sympa-owner@${domain} postmaster@immae.eu
138 '';
139 sympa_transport = pkgs.writeText "transport.sympa" ''
140 ${domain} error:User unknown in recipient table
141 sympa@${domain} sympa:sympa@${domain}
142 listmaster@${domain} sympa:listmaster@${domain}
143 bounce@${domain} sympabounce:sympa@${domain}
144 abuse-feedback-report@${domain} sympabounce:sympa@${domain}
145 '';
146 };
147 config = {
148 transport_maps = lib.mkAfter [
149 "hash:/etc/postfix/sympa_transport"
150 "hash:/var/lib/sympa/sympa_transport"
151 ];
152 virtual_alias_maps = lib.mkAfter [
153 "hash:/etc/postfix/sympa_virtual"
154 ];
155 virtual_mailbox_maps = lib.mkAfter [
156 "hash:/etc/postfix/sympa_transport"
157 "hash:/var/lib/sympa/sympa_transport"
158 "hash:/etc/postfix/sympa_virtual"
159 ];
160 };
161 masterConfig = {
162 sympa = {
163 type = "unix";
164 privileged = true;
165 chroot = false;
166 command = "pipe";
167 args = [
168 "flags=hqRu"
169 "user=sympa"
170 "argv=${pkgs.sympa}/libexec/queue"
171 "\${nexthop}"
172 ];
173 };
174 sympabounce = {
175 type = "unix";
176 privileged = true;
177 chroot = false;
178 command = "pipe";
179 args = [
180 "flags=hqRu"
181 "user=sympa"
182 "argv=${pkgs.sympa}/libexec/bouncequeue"
183 "\${nexthop}"
184 ];
185 };
186 };
187 };
188 services.sympa = {
189 enable = true;
190 listMasters = sympaConfig.listmasters;
191 mainDomain = domain;
192 domains = {
193 "${domain}" = {
194 webHost = "mail.immae.eu";
195 webLocation = "/sympa";
196 };
197 };
198
199 database = {
200 type = "PostgreSQL";
201 user = sympaConfig.postgresql.user;
202 host = sympaConfig.postgresql.socket;
203 name = sympaConfig.postgresql.database;
204 passwordFile = config.secrets.fullPaths."sympa/db_password";
205 createLocally = false;
206 };
207 settings = {
208 sendmail = "/run/wrappers/bin/sendmail";
209 log_smtp = "on";
210 sendmail_aliases = "/var/lib/sympa/sympa_transport";
211 aliases_program = "${pkgs.postfix}/bin/postmap";
212 create_list = "listmaster";
213 };
214 settingsFile = {
215 "virtual.sympa".enable = false;
216 "transport.sympa".enable = false;
217 } // lib.mapAttrs' (n: v: lib.nameValuePair
218 "etc/${domain}/data_sources/${n}.incl"
219 { source = config.secrets.fullPaths."sympa/data_sources/${n}.incl"; }) sympaConfig.data_sources
220 // lib.mapAttrs' (n: v: lib.nameValuePair
221 "etc/${domain}/scenari/${n}"
222 { source = config.secrets.fullPaths."sympa/scenari/${n}"; }) sympaConfig.scenari;
223 web = {
224 server = "none";
225 };
226
227 mta = {
228 type = "none";
229 };
230 };
231 };
232}
diff --git a/systems/eldiron/monitoring.nix b/systems/eldiron/monitoring.nix
new file mode 100644
index 0000000..2aa7f8f
--- /dev/null
+++ b/systems/eldiron/monitoring.nix
@@ -0,0 +1,51 @@
1{ config, pkgs, lib, name, monitoring, ... }:
2let
3 hostFQDN = config.hostEnv.fqdn;
4 emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
5in
6{
7 config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "emails" "mdadm" "postfix" "postgresql" "zfs" "notify-secondary"];
8 config.myServices.monitoring.pluginsArgs.postgresql.package = config.myServices.databases.postgresql.package;
9 config.myServices.monitoring.objects = lib.mkMerge [
10 (monitoring.lib.objectsCommon {
11 inherit hostFQDN;
12 hostName = name;
13 master = false;
14 processWarn = "550"; processAlert = "650";
15 loadWarn = "1.0"; loadAlert = "1.2";
16 interface = builtins.head (builtins.attrNames config.networking.interfaces);
17 })
18
19 {
20 service = [
21 {
22 service_description = "No mdadm array is degraded";
23 use = "local-service";
24 check_command = ["check_mdadm"];
25 __passive_servicegroups = "webstatus-resources";
26 }
27 {
28 service_description = "Postgresql replication for backup-2 is up to date";
29 use = "local-service";
30 check_command = ["check_postgresql_replication" "backup-2" "/run/postgresql" "5432"];
31 __passive_servicegroups = "webstatus-databases";
32 }
33 {
34 service_description = "No ZFS pool is degraded";
35 use = "local-service";
36 check_command = ["check_zfs"];
37 __passive_servicegroups = "webstatus-resources";
38 }
39 {
40 service_description = "mailq is empty";
41 use = "local-service";
42 check_command = ["check_mailq"];
43 __passive_servicegroups = "webstatus-email";
44 }
45 (emailCheck "eldiron" hostFQDN // {
46 __passive_servicegroups = "webstatus-email";
47 })
48 ];
49 }
50 ];
51}
diff --git a/modules/private/mpd.nix b/systems/eldiron/mpd.nix
index 640b001..640b001 100644
--- a/modules/private/mpd.nix
+++ b/systems/eldiron/mpd.nix
diff --git a/systems/eldiron/pub/default.nix b/systems/eldiron/pub/default.nix
new file mode 100644
index 0000000..ca8122a
--- /dev/null
+++ b/systems/eldiron/pub/default.nix
@@ -0,0 +1,100 @@
1{ lib, pkgs, config, ... }:
2let
3 restrict = pkgs.runCommand "restrict" {
4 file = ./restrict;
5 buildInputs = [ pkgs.makeWrapper ];
6 } ''
7 mkdir -p $out/bin
8 cp $file $out/bin/restrict
9 chmod a+x $out/bin/restrict
10 patchShebangs $out/bin/restrict
11 wrapProgram $out/bin/restrict \
12 --prefix PATH : ${lib.makeBinPath [ pkgs.bubblewrap pkgs.rrsync ]} \
13 --set TMUX_RESTRICT ${./tmux.restrict.conf}
14 '';
15in
16{
17 options = {
18 myServices.pub.enable = lib.mkOption {
19 type = lib.types.bool;
20 default = false;
21 description = ''
22 Whether to enable pub user.
23 '';
24 };
25 myServices.pub.usersProfiles = lib.mkOption {
26 type = lib.types.attrsOf (lib.types.listOf lib.types.package);
27 default = {};
28 description = ''
29 specific user profile
30 '';
31 };
32 myServices.pub.restrictCommand = lib.mkOption {
33 type = lib.types.path;
34 readOnly = true;
35 default = "${restrict}/bin/restrict";
36 description = ''
37 path to the restrict shell
38 '';
39 };
40 };
41
42 config = lib.mkIf config.myServices.pub.enable {
43 myServices.dns.zones."immae.eu".subdomains.pub =
44 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
45
46 myServices.chatonsProperties.services.vm-like = {
47 file.datetime = "2022-08-22T01:00:00";
48 service = {
49 name = "Comptes shell";
50 description = "Compte shell cloisonné";
51 logo = "https://www.openssh.com/favicon.ico";
52 website = "pub.immae.eu";
53 status.level = "OK";
54 status.description = "OK";
55 registration."" = ["MEMBER" "CLIENT"];
56 registration.load = "OPEN";
57 install.type = "PACKAGE";
58 };
59 software = {
60 name = "Openssh";
61 website = "https://www.openssh.com/";
62 license.url = "https://github.com/openssh/openssh-portable/blob/master/LICENCE";
63 license.name = "BSD Licence";
64 version = pkgs.openssh.version;
65 source.url = "https://github.com/openssh/openssh-portable";
66 };
67 };
68 myServices.ssh.modules.pub = {
69 snippet = builtins.readFile ./ldap_pub.sh;
70 dependencies = [ pkgs.coreutils ];
71 vars.ldap_forward_group = "cn=forward,cn=pub,ou=services,dc=immae,dc=eu";
72 vars.ldap_pub_group = "cn=restrict,cn=pub,ou=services,dc=immae,dc=eu";
73 vars.echo_command = "${pkgs.coreutils}/bin/echo";
74 vars.restrict_command = "${restrict}/bin/restrict";
75 };
76
77 system.extraSystemBuilderCmds = let
78 toPath = u: paths: pkgs.buildEnv {
79 name = "${u}-profile";
80 inherit paths;
81 };
82 in ''
83 mkdir -p $out/pub
84 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (u: m: "ln -s ${toPath u m} $out/pub/${u}") config.myServices.pub.usersProfiles)}
85 '';
86 users.users.pub = let
87 in {
88 createHome = true;
89 description = "Restricted shell user";
90 home = "/var/lib/pub";
91 uid = config.myEnv.users.pub.uid;
92 isNormalUser = true;
93 group = "nogroup";
94 useDefaultShell = true;
95 packages = [
96 pkgs.tmux
97 ];
98 };
99 };
100}
diff --git a/systems/eldiron/pub/ldap_pub.sh b/systems/eldiron/pub/ldap_pub.sh
new file mode 100644
index 0000000..9f03ffe
--- /dev/null
+++ b/systems/eldiron/pub/ldap_pub.sh
@@ -0,0 +1,38 @@
1### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh
2LDAP_PUB_RESTRICT_MEMBER="@pub_ldap_pub_group@"
3LDAP_PUB_FORWARD_MEMBER="@pub_ldap_forward_group@"
4ECHO="@pub_echo_command@"
5
6if [[ $user == pub ]]; then
7 allowed_logins=$(LDAP_BASE=$USER_LDAP_BASE \
8 ldap_search '(memberOf='$LDAP_PUB_RESTRICT_MEMBER')' '' \
9 | grep ^dn \
10 | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \
11 | paste -sd,)
12
13 allowed_forwards=$(LDAP_BASE=$USER_LDAP_BASE \
14 ldap_search '(memberOf='$LDAP_PUB_FORWARD_MEMBER')' '' \
15 | grep ^dn \
16 | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \
17 | paste -sd,)
18
19 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
20 if [ ! -z "$key" ]; then
21 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
22 echo -n 'command="@pub_restrict_command@ '$user'" '
23 echo $key
24 fi
25 fi
26 done
27
28 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
29 if [ ! -z "$key" ]; then
30 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
31 echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" '
32 echo $key
33 fi
34 fi
35 done
36 exit 0
37fi
38
diff --git a/systems/eldiron/pub/restrict b/systems/eldiron/pub/restrict
new file mode 100644
index 0000000..698e394
--- /dev/null
+++ b/systems/eldiron/pub/restrict
@@ -0,0 +1,71 @@
1#!/usr/bin/env bash
2user="$1"
3rootuser="$HOME/$user/"
4mkdir -p $rootuser
5
6orig="$SSH_ORIGINAL_COMMAND"
7if [ -z "$orig" ]; then
8 orig="/bin/bash -l"
9fi
10if [ "${orig:0:7}" = "command" ]; then
11 orig="${orig:8}"
12fi
13
14case "$orig" in
15rsync*)
16 rrsync $HOME/$user/
17 ;;
18*)
19 nix_store_paths() {
20 nix-store -q -R \
21 /run/current-system/sw \
22 /etc/profiles/per-user/pub \
23 /etc/ssl/certs/ca-bundle.crt \
24 | while read i; do
25 printf '%s--ro-bind\0'$i'\0'$i'\0' ''
26 done
27 if [ -e "/run/current-system/pub/$user" ]; then
28 nix-store -q -R "/run/current-system/pub/$user" \
29 | while read i; do
30 printf '%s--ro-bind\0'$i'\0'$i'\0' ''
31 done
32 printf '%s--ro-bind\0/run/current-system/pub/'$user'/bin\0/bin-pub-'$user'\0' ''
33 fi
34 }
35
36 set -euo pipefail
37 (exec -c bwrap --ro-bind /usr /usr \
38 --args 10 \
39 --dir /tmp \
40 --dir /var \
41 --symlink ../tmp var/tmp \
42 --proc /proc \
43 --dev /dev \
44 --ro-bind /etc/resolv.conf /etc/resolv.conf \
45 --ro-bind /etc/zoneinfo /etc/zoneinfo \
46 --ro-bind /etc/ssl /etc/ssl \
47 --ro-bind /etc/static/ssl/certs /etc/static/ssl/certs \
48 --ro-bind /run/current-system/sw/lib/locale/locale-archive /etc/locale-archive \
49 --ro-bind /run/current-system/sw/bin /bin \
50 --ro-bind /etc/profiles/per-user/pub/bin /bin-pub \
51 --bind /var/lib/pub/$user /var/lib/pub \
52 --dir /var/lib/commons \
53 --ro-bind $TMUX_RESTRICT /var/lib/commons/tmux.restrict.conf \
54 --chdir /var/lib/pub \
55 --unshare-all \
56 --share-net \
57 --dir /run/user/$(id -u) \
58 --setenv TERM "$TERM" \
59 --setenv LOCALE_ARCHIVE "/etc/locale-archive" \
60 --setenv XDG_RUNTIME_DIR "/run/user/`id -u`" \
61 --setenv PS1 "$user@pub $ " \
62 --setenv PATH "/bin-pub-$user:/bin:/bin-pub" \
63 --setenv HOME "/var/lib/pub" \
64 --file 11 /etc/passwd \
65 --file 12 /etc/group \
66 -- $orig) \
67 10< <(nix_store_paths | sort | uniq) \
68 11< <(getent passwd $UID 65534) \
69 12< <(getent group $(id -g) 65534)
70 ;;
71esac
diff --git a/modules/private/pub/tmux.restrict.conf b/systems/eldiron/pub/tmux.restrict.conf
index 5aefd1c..5aefd1c 100644
--- a/modules/private/pub/tmux.restrict.conf
+++ b/systems/eldiron/pub/tmux.restrict.conf
diff --git a/systems/eldiron/tasks/default.nix b/systems/eldiron/tasks/default.nix
new file mode 100644
index 0000000..0772a5f
--- /dev/null
+++ b/systems/eldiron/tasks/default.nix
@@ -0,0 +1,384 @@
1{ lib, pkgs, config, taskwarrior-web, ... }:
2let
3 cfg = config.myServices.tasks;
4 server_vardir = config.services.taskserver.dataDir;
5 fqdn = "task.immae.eu";
6 user = config.services.taskserver.user;
7 env = config.myEnv.tools.task;
8 group = config.services.taskserver.group;
9 taskserver-user-certs = pkgs.runCommand "taskserver-user-certs" {} ''
10 mkdir -p $out/bin
11 cat > $out/bin/taskserver-user-certs <<"EOF"
12 #!/usr/bin/env bash
13
14 user=$1
15
16 silent_certtool() {
17 if ! output="$("${pkgs.gnutls.bin}/bin/certtool" "$@" 2>&1)"; then
18 echo "GNUTLS certtool invocation failed with output:" >&2
19 echo "$output" >&2
20 fi
21 }
22
23 silent_certtool -p \
24 --bits 4096 \
25 --outfile "${server_vardir}/userkeys/$user.key.pem"
26 ${pkgs.gnused}/bin/sed -i -n -e '/^-----BEGIN RSA PRIVATE KEY-----$/,$p' "${server_vardir}/userkeys/$user.key.pem"
27
28 silent_certtool -c \
29 --template "${pkgs.writeText "taskserver-ca.template" ''
30 tls_www_client
31 encryption_key
32 signing_key
33 expiration_days = 3650
34 ''}" \
35 --load-ca-certificate "${server_vardir}/keys/ca.cert" \
36 --load-ca-privkey "${server_vardir}/keys/ca.key" \
37 --load-privkey "${server_vardir}/userkeys/$user.key.pem" \
38 --outfile "${server_vardir}/userkeys/$user.cert.pem"
39 EOF
40 chmod a+x $out/bin/taskserver-user-certs
41 patchShebangs $out/bin/taskserver-user-certs
42 '';
43 socketsDir = "/run/taskwarrior-web";
44 varDir = "/var/lib/taskwarrior-web";
45 taskwebPages = let
46 uidPages = lib.attrsets.zipAttrs (
47 lib.lists.flatten
48 (lib.attrsets.mapAttrsToList (k: c: map (v: { "${v}" = k; }) c.uid) env.taskwarrior-web)
49 );
50 pages = lib.attrsets.mapAttrs (uid: items:
51 if lib.lists.length items == 1 then
52 ''
53 <html>
54 <head>
55 <meta http-equiv="refresh" content="0; url=/taskweb/${lib.lists.head items}/" />
56 </head>
57 <body></body>
58 </html>
59 ''
60 else
61 ''
62 <html>
63 <head>
64 <title>To-do list disponibles</title>
65 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
66 <meta name="viewport" content="width=device-width, initial-scale=1" />
67 </head>
68 <body>
69 <ul>
70 ${builtins.concatStringsSep "\n" (map (item: "<li><a href='/taskweb/${item}'>${item}</a></li>") items)}
71 </ul>
72 </body>
73 </html>
74 ''
75 ) uidPages;
76 in
77 pkgs.runCommand "taskwerver-pages" {} ''
78 mkdir -p $out/
79 ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (k: v: "cp ${pkgs.writeText k v} $out/${k}.html") pages)}
80 echo "Please login" > $out/index.html
81 '';
82in {
83 options.myServices.tasks = {
84 enable = lib.mkEnableOption "my tasks service";
85 };
86
87 config = lib.mkIf cfg.enable {
88 myServices.dns.zones."immae.eu".subdomains.task =
89 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
90
91 myServices.chatonsProperties.services.taskwarrior = {
92 file.datetime = "2022-08-22T00:00:00";
93 service = {
94 name = "Taskwarrior";
95 description = "Taskwarrior is Free and Open Source Software that manages your TODO list from the command line. Web interface and synchronization server";
96 website = "https://task.immae.eu/";
97 logo = "https://taskwarrior.org/favicon.ico";
98 status.level = "OK";
99 status.description = "OK";
100 registration."" = ["MEMBER" "CLIENT"];
101 registration.load = "OPEN";
102 install.type = "PACKAGE";
103 };
104 software = {
105 name = "Taskwarrior";
106 website = "https://taskwarrior.org/";
107 license.url = "https://github.com/GothenburgBitFactory/taskwarrior/blob/develop/LICENSE";
108 license.name = "MIT License";
109 version = taskwarrior-web.version;
110 source.url = "https://taskwarrior.org/download/";
111 };
112 };
113 secrets.keys = {
114 "webapps/tools-taskwarrior-web" = {
115 user = "wwwrun";
116 group = "wwwrun";
117 permissions = "0400";
118 text = ''
119 SetEnv TASKD_HOST "${fqdn}:${toString config.services.taskserver.listenPort}"
120 SetEnv TASKD_VARDIR "${server_vardir}"
121 SetEnv TASKD_LDAP_HOST "ldaps://${env.ldap.host}"
122 SetEnv TASKD_LDAP_DN "${env.ldap.dn}"
123 SetEnv TASKD_LDAP_PASSWORD "${env.ldap.password}"
124 SetEnv TASKD_LDAP_BASE "${env.ldap.base}"
125 SetEnv TASKD_LDAP_FILTER "${env.ldap.filter}"
126 '';
127 };
128 } // (lib.mapAttrs' (name: userConfig: lib.nameValuePair "webapps/tools-taskwarrior/${name}-taskrc" (
129 let
130 credentials = "${userConfig.org}/${name}/${userConfig.key}";
131 dateFormat = userConfig.date;
132 cacert = pkgs.writeText "ca.cert" ''
133 -----BEGIN CERTIFICATE-----
134 MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
135 TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
136 cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
137 WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
138 ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
139 MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
140 h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
141 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
142 A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
143 T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
144 B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
145 B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
146 KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
147 OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
148 jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
149 qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
150 rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
151 HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
152 hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
153 ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
154 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
155 NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
156 ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
157 TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
158 jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
159 oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
160 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
161 mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
162 emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
163 -----END CERTIFICATE-----'';
164 in {
165 inherit user group;
166 permissions = "0400";
167 text = ''
168 data.location=${varDir}/${name}
169 taskd.certificate=${server_vardir}/userkeys/taskwarrior-web.cert.pem
170 taskd.key=${server_vardir}/userkeys/taskwarrior-web.key.pem
171 # IdenTrust DST Root CA X3
172 # obtained here: https://letsencrypt.org/fr/certificates/
173 taskd.ca=${cacert}
174 taskd.server=${fqdn}:${toString config.services.taskserver.listenPort}
175 taskd.credentials=${credentials}
176 dateformat=${dateFormat}
177 '';
178 keyDependencies = [ cacert ];
179 })) env.taskwarrior-web);
180 security.acme.certs.eldiron.extraDomainNames = [ "task.immae.eu" ];
181 services.websites.env.tools.watchPaths = [ config.secrets.fullPaths."webapps/tools-taskwarrior-web" ];
182 services.websites.env.tools.modules = [ "proxy_fcgi" "sed" ];
183 services.websites.env.tools.vhostConfs.task = {
184 certName = "eldiron";
185 hosts = [ "task.immae.eu" ];
186 root = ./www;
187 extraConfig = [ ''
188 <Directory ${./www}>
189 DirectoryIndex index.php
190 Use LDAPConnect
191 Require ldap-group cn=users,cn=taskwarrior,ou=services,dc=immae,dc=eu
192 <FilesMatch "\.php$">
193 SetHandler "proxy:unix:${config.services.phpfpm.pools.tasks.socket}|fcgi://localhost"
194 </FilesMatch>
195 Include ${config.secrets.fullPaths."webapps/tools-taskwarrior-web"}
196 </Directory>
197 ''
198 ''
199 <Macro Taskwarrior %{folderName}>
200 ProxyPass "unix://${socketsDir}/%{folderName}.sock|http://localhost-%{folderName}/"
201 ProxyPassReverse "unix://${socketsDir}/%{folderName}.sock|http://localhost-%{folderName}/"
202 ProxyPassReverse http://${fqdn}/
203
204 SetOutputFilter Sed
205 OutputSed "s|/ajax|/taskweb/%{folderName}/ajax|g"
206 OutputSed "s|\([^x]\)/tasks|\1/taskweb/%{folderName}/tasks|g"
207 OutputSed "s|\([^x]\)/projects|\1/taskweb/%{folderName}/projects|g"
208 OutputSed "s|http://${fqdn}/|/taskweb/%{folderName}/|g"
209 OutputSed "s|/img/relax.jpg|/taskweb/%{folderName}/img/relax.jpg|g"
210 </Macro>
211 ''
212 ''
213 Alias /taskweb ${taskwebPages}
214 <Directory "${taskwebPages}">
215 DirectoryIndex index.html
216 Require all granted
217 </Directory>
218
219 RewriteEngine on
220 RewriteRule ^/taskweb$ /taskweb/ [R=301,L]
221 RedirectMatch permanent ^/taskweb/([^/]+)$ /taskweb/$1/
222
223 RewriteCond %{LA-U:REMOTE_USER} !=""
224 RewriteCond ${taskwebPages}/%{LA-U:REMOTE_USER}.html -f
225 RewriteRule ^/taskweb/?$ ${taskwebPages}/%{LA-U:REMOTE_USER}.html [L]
226
227 <Location /taskweb/>
228 Use LDAPConnect
229 Require ldap-group cn=users,cn=taskwarrior,ou=services,dc=immae,dc=eu
230 </Location>
231 ''
232 ] ++ (lib.attrsets.mapAttrsToList (k: v: ''
233 <Location /taskweb/${k}/>
234 ${builtins.concatStringsSep "\n" (map (uid: "Require ldap-attribute uid=${uid}") v.uid)}
235
236 Use Taskwarrior ${k}
237 </Location>
238 '') env.taskwarrior-web);
239 };
240 services.phpfpm.pools = {
241 tasks = {
242 user = user;
243 group = group;
244 settings = {
245 "listen.owner" = "wwwrun";
246 "listen.group" = "wwwrun";
247 "pm" = "dynamic";
248 "pm.max_children" = "60";
249 "pm.start_servers" = "2";
250 "pm.min_spare_servers" = "1";
251 "pm.max_spare_servers" = "10";
252
253 # Needed to avoid clashes in browser cookies (same domain)
254 "php_value[session.name]" = "TaskPHPSESSID";
255 "php_admin_value[session.save_handler]" = "redis";
256 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Task:'";
257 "php_admin_value[open_basedir]" = "${./www}:/tmp:${server_vardir}:/etc/profiles/per-user/${user}/bin/";
258 };
259 phpEnv = {
260 PATH = "/etc/profiles/per-user/${user}/bin";
261 };
262 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]);
263 };
264 };
265
266 security.acme.certs."task" = {
267 inherit group;
268 domain = fqdn;
269 postRun = ''
270 systemctl restart taskserver.service
271 '';
272 };
273
274 users.users.${user} = {
275 extraGroups = [ "keys" ];
276 packages = [ taskserver-user-certs ];
277 };
278
279 system.activationScripts.taskserver = {
280 deps = [ "users" ];
281 text = ''
282 install -m 0750 -o ${user} -g ${group} -d ${server_vardir}
283 install -m 0750 -o ${user} -g ${group} -d ${server_vardir}/userkeys
284 install -m 0750 -o ${user} -g ${group} -d ${server_vardir}/keys
285
286 if [ ! -e "${server_vardir}/keys/ca.key" ]; then
287 silent_certtool() {
288 if ! output="$("${pkgs.gnutls.bin}/bin/certtool" "$@" 2>&1)"; then
289 echo "GNUTLS certtool invocation failed with output:" >&2
290 echo "$output" >&2
291 fi
292 }
293
294 silent_certtool -p \
295 --bits 4096 \
296 --outfile "${server_vardir}/keys/ca.key"
297
298 silent_certtool -s \
299 --template "${pkgs.writeText "taskserver-ca.template" ''
300 cn = ${fqdn}
301 expiration_days = -1
302 cert_signing_key
303 ca
304 ''}" \
305 --load-privkey "${server_vardir}/keys/ca.key" \
306 --outfile "${server_vardir}/keys/ca.cert"
307
308 chown :${group} "${server_vardir}/keys/ca.key"
309 chmod g+r "${server_vardir}/keys/ca.key"
310 fi
311 '';
312 };
313
314 services.taskserver = {
315 enable = true;
316 allowedClientIDs = [ "^task [2-9]" "^Mirakel [1-9]" ];
317 inherit fqdn;
318 listenHost = "::";
319 pki.manual.ca.cert = "${server_vardir}/keys/ca.cert";
320 pki.manual.server.cert = "${config.security.acme.certs.task.directory}/fullchain.pem";
321 pki.manual.server.crl = "${config.security.acme.certs.task.directory}/invalid.crl";
322 pki.manual.server.key = "${config.security.acme.certs.task.directory}/key.pem";
323 requestLimit = 104857600;
324 };
325
326 system.activationScripts.taskwarrior-web = {
327 deps = [ "users" ];
328 text = ''
329 if [ ! -f ${server_vardir}/userkeys/taskwarrior-web.cert.pem ]; then
330 ${taskserver-user-certs}/bin/taskserver-user-certs taskwarrior-web
331 chown taskd:taskd ${server_vardir}/userkeys/taskwarrior-web.cert.pem ${server_vardir}/userkeys/taskwarrior-web.key.pem
332 fi
333 '';
334 };
335
336 systemd.slices.taskwarrior = {
337 description = "Taskwarrior slice";
338 };
339
340 systemd.services = (lib.attrsets.mapAttrs' (name: userConfig:
341 lib.attrsets.nameValuePair "taskwarrior-web-${name}" {
342 description = "Taskwarrior webapp for ${name}";
343 wantedBy = [ "multi-user.target" ];
344 after = [ "network.target" ];
345 path = [ pkgs.taskwarrior ];
346
347 environment.TASKRC = config.secrets.fullPaths."webapps/tools-taskwarrior/${name}-taskrc";
348 environment.BUNDLE_PATH = "${taskwarrior-web.gems}/${taskwarrior-web.gems.ruby.gemPath}";
349 environment.BUNDLE_GEMFILE = "${taskwarrior-web.gems.confFiles}/Gemfile";
350 environment.LC_ALL = "fr_FR.UTF-8";
351
352 script = ''
353 exec ${taskwarrior-web.gems}/${taskwarrior-web.gems.ruby.gemPath}/bin/bundle exec thin start -R config.ru -S ${socketsDir}/${name}.sock
354 '';
355
356 serviceConfig = {
357 Slice = "taskwarrior.slice";
358 User = user;
359 PrivateTmp = true;
360 Restart = "always";
361 TimeoutSec = 60;
362 Type = "simple";
363 WorkingDirectory = taskwarrior-web;
364 StateDirectoryMode = 0750;
365 StateDirectory = assert lib.strings.hasPrefix "/var/lib/" varDir;
366 (lib.strings.removePrefix "/var/lib/" varDir + "/${name}");
367 RuntimeDirectoryPreserve = "yes";
368 RuntimeDirectory = assert lib.strings.hasPrefix "/run/" socketsDir;
369 lib.strings.removePrefix "/run/" socketsDir;
370 };
371
372 unitConfig.RequiresMountsFor = varDir;
373 }) env.taskwarrior-web) // {
374 taskserver-ca.postStart = ''
375 chown :${group} "${server_vardir}/keys/ca.key"
376 chmod g+r "${server_vardir}/keys/ca.key"
377 '';
378 taskserver-ca.serviceConfig.Slice = "taskwarrior.slice";
379 taskserver-init.serviceConfig.Slice = "taskwarrior.slice";
380 taskserver.serviceConfig.Slice = "taskwarrior.slice";
381 };
382
383 };
384}
diff --git a/systems/eldiron/tasks/www/index.php b/systems/eldiron/tasks/www/index.php
new file mode 100644
index 0000000..bde773d
--- /dev/null
+++ b/systems/eldiron/tasks/www/index.php
@@ -0,0 +1,168 @@
1<?php
2if (!isset($_SERVER["REMOTE_USER"])) {
3 die("please login");
4}
5$ldap_user = $_SERVER["REMOTE_USER"];
6$ldap_host = getenv("TASKD_LDAP_HOST");
7$ldap_dn = getenv('TASKD_LDAP_DN');
8$ldap_password = getenv('TASKD_LDAP_PASSWORD');
9$ldap_base = getenv('TASKD_LDAP_BASE');
10$ldap_filter = getenv('TASKD_LDAP_FILTER');
11$host = getenv('TASKD_HOST');
12$vardir = getenv('TASKD_VARDIR');
13
14$connect = ldap_connect($ldap_host);
15ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
16if (!$connect || !ldap_bind($connect, $ldap_dn, $ldap_password)) {
17 die("impossible to connect to LDAP");
18}
19
20$search_query = str_replace('%login%', ldap_escape($ldap_user), $ldap_filter);
21
22$search = ldap_search($connect, $ldap_base, $search_query);
23$info = ldap_get_entries($connect, $search);
24
25if (ldap_count_entries($connect, $search) != 1) {
26 die("Impossible to find user in LDAP");
27}
28
29$entries = [];
30foreach($info[0]["immaetaskid"] as $key => $value) {
31 if ($key !== "count") {
32 $entries[] = explode(":", $value);
33 }
34}
35
36if (isset($_GET["file"])) {
37 $basecert = $vardir . "/userkeys/" . $ldap_user;
38 if (!file_exists($basecert . ".cert.pem")) {
39 exec("taskserver-user-certs $ldap_user");
40 }
41 $certificate = file_get_contents($basecert . ".cert.pem");
42 $cert_key = file_get_contents($basecert . ".key.pem");
43
44 // IdenTrust DST Root CA X3
45 // obtained here: https://letsencrypt.org/fr/certificates/
46 $server_cert = "-----BEGIN CERTIFICATE-----
47MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
48TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
49cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
50WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
51ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
52MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
53h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
540TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
55A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
56T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
57B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
58B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
59KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
60OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
61jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
62qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
63rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
64HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
65hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
66ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
673BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
68NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
69ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
70TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
71jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
72oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
734RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
74mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
75emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
76-----END CERTIFICATE-----";
77
78 $file = $_GET["file"];
79 switch($file) {
80 case "ca.cert.pem":
81 $content = $server_cert;
82 $name = "ca.cert.pem";
83 $type = "application/x-x509-ca-cert";
84 break;
85 case "cert.pem":
86 $content = $certificate;
87 $name = $ldap_user . ".cert.pem";
88 $type = "application/x-x509-ca-cert";
89 break;
90 case "key.pem":
91 $content = $cert_key;
92 $name = $ldap_user . ".key.pem";
93 $type = "application/x-x509-ca-cert";
94 break;
95 case "mirakel";
96 foreach ($entries as $entry) {
97 list($org, $user, $key) = $entry;
98 if ($key == $_GET["key"]) { break; }
99 }
100 $name = $user . ".mirakel";
101 $type = "text/plain";
102 $content = "username: $user
103org: $org
104user key: $key
105server: $host
106client.cert:
107$certificate
108Client.key:
109$cert_key
110ca.cert:
111$server_cert
112";
113 break;
114 default:
115 die("invalid file name");
116 break;
117 }
118
119 header("Content-Type: $type");
120 header('Content-Disposition: attachment; filename="' . $name . '"');
121 header('Content-Transfer-Encoding: binary');
122 header('Accept-Ranges: bytes');
123 header('Cache-Control: private');
124 header('Pragma: private');
125 echo $content;
126 exit;
127}
128?>
129<html>
130<header>
131 <title>Taskwarrior configuration</title>
132</header>
133<body>
134<ul>
135 <li><a href="?file=ca.cert.pem">ca.cert.pem</a></li>
136 <li><a href="?file=cert.pem"><?php echo $ldap_user; ?>.cert.pem</a></li>
137 <li><a href="?file=key.pem"><?php echo $ldap_user; ?>.key.pem</a></li>
138</ul>
139For command line interface, download the files, put them near your Taskwarrior
140configuration files, and add that to your Taskwarrior configuration:
141<pre>
142taskd.certificate=/path/to/<?php echo $ldap_user; ?>.cert.pem
143taskd.key=/path/to/<?php echo $ldap_user; ?>.key.pem
144taskd.server=<?php echo $host ."\n"; ?>
145taskd.ca=/path/to/ca.cert.pem
146<?php if (count($entries) > 1) {
147 echo "# Chose one of them\n";
148 foreach($entries as $entry) {
149 list($org, $user, $key) = $entry;
150 echo "# taskd.credentials=$org/$user/$key\n";
151 }
152} else { ?>
153taskd.credentials=<?php echo $entries[0][0]; ?>/<?php echo $entries[0][1]; ?>/<?php echo $entries[0][2]; ?>
154<?php } ?>
155</pre>
156For Mirakel, download and import the file:
157<ul>
158<?php
159foreach ($entries as $entry) {
160 list($org, $user, $key) = $entry;
161 echo '<li><a href="?file=mirakel&key='.$key.'">' . $user . '.mirakel</a></li>';
162}
163?>
164</ul>
165For Android Taskwarrior app, see instructions <a href="https://bitbucket.org/kvorobyev/taskwarriorandroid/wiki/Configuration">here</a>.
166</body>
167</html>
168
diff --git a/systems/eldiron/vpn/default.nix b/systems/eldiron/vpn/default.nix
new file mode 100644
index 0000000..df56249
--- /dev/null
+++ b/systems/eldiron/vpn/default.nix
@@ -0,0 +1,92 @@
1{ config, pkgs, lib, ... }:
2let
3 cfg = config.myServices.vpn;
4in
5{
6 options.myServices = {
7 vpn.enable = lib.mkEnableOption "Enable vpn service";
8 };
9
10 config = lib.mkIf cfg.enable {
11 myServices.dns.zones."immae.eu".subdomains.vpn = with config.myServices.dns.helpers;
12 ips servers.eldiron.ips.main // {
13 subdomains.gw.AAAA = [ "${config.myEnv.vpn.eldiron.prefix}:0:ffff:1" ];
14 # Fake address to designate the subnet
15 subdomains.sn.AAAA = [ "${config.myEnv.vpn.eldiron.prefix}::" ];
16 };
17 myServices.chatonsProperties.hostings.vpn = {
18 file.datetime = "2022-08-27T18:00:00";
19 hosting = {
20 name = "VPN";
21 description = "VPN";
22 website = "https://vpn.immae.eu";
23 logo = "https://tinc-vpn.org/favicon.ico";
24 status.level = "OK";
25 status.description = "OK";
26 registration.load = "FULL";
27 install.type = "PACKAGE";
28 };
29 software = {
30 name = "tinc";
31 website = "https://tinc-vpn.org/";
32 license.url = "https://www.gnu.org/licenses/old-licenses/gpl-2.0.html";
33 license.name = "GNU General Public License v2.0";
34 version = pkgs.tinc.version;
35 source.url = "https://tinc-vpn.org/git/browse?p=tinc";
36 };
37 };
38 secrets.keys = {
39 "tinc/key.priv" = {
40 user = "root";
41 group = "root";
42 permissions = "0400";
43 text = config.myEnv.vpn.eldiron.privateKey;
44 };
45 "tinc/key.pub" = {
46 user = "root";
47 group = "root";
48 permissions = "0400";
49 text = config.myEnv.vpn.eldiron.publicKey;
50 };
51 };
52 networking.firewall.allowedTCPPorts = [ 655 1194 ];
53 system.activationScripts.tinc = let
54 configFiles = pkgs.runCommand "tinc-files" {
55 mainInterface = "eth0";
56 hostName = "ImmaeEu";
57 network = "Immae";
58 keyFile = config.secrets.fullPaths."tinc/key.priv";
59 } ''
60 mkdir -p $out
61 for i in ${./tinc}/*; do
62 substituteAll $i $out/$(basename $i)
63 done
64 '';
65 in ''
66 install -m750 -o root -g root -d /var/lib/tinc/ /var/lib/tinc/Immae
67 install -m700 -o root -g root -t /var/lib/tinc/Immae ${configFiles}/{host-*,tinc-*}
68 install -m400 -o root -g root -t /var/lib/tinc/Immae ${configFiles}/tinc.conf
69 if [ ! -d /var/lib/tinc/Immae/hosts ]; then
70 ${pkgs.git}/bin/git clone -b master https://git.immae.eu/perso/Immae/Config/tinc/hosts /var/lib/tinc/Immae/hosts
71 fi
72 '';
73
74 systemd.slices.tinc = {
75 description = "Tinc slice";
76 };
77
78 systemd.services.tinc-Immae = {
79 description = "Tinc Daemon - Immae";
80 wantedBy = [ "multi-user.target" ];
81 after = [ "network.target" ];
82 path = [ pkgs.getent pkgs.tinc pkgs.bashInteractive pkgs.iproute pkgs.gnused pkgs.gawk pkgs.git pkgs.glibc ];
83 serviceConfig = {
84 Slice = "tinc.slice";
85 Type = "simple";
86 Restart = "always";
87 RestartSec = "3";
88 ExecStart = "${pkgs.tinc}/bin/tincd -d1 -D -c /var/lib/tinc/Immae --pidfile /run/tinc.Immae.pid";
89 };
90 };
91 };
92}
diff --git a/modules/private/vpn/tinc/host-down b/systems/eldiron/vpn/tinc/host-down
index 1e79bd3..1e79bd3 100755
--- a/modules/private/vpn/tinc/host-down
+++ b/systems/eldiron/vpn/tinc/host-down
diff --git a/modules/private/vpn/tinc/host-up b/systems/eldiron/vpn/tinc/host-up
index 2f7cee2..2f7cee2 100755
--- a/modules/private/vpn/tinc/host-up
+++ b/systems/eldiron/vpn/tinc/host-up
diff --git a/modules/private/vpn/tinc/tinc-down b/systems/eldiron/vpn/tinc/tinc-down
index 1cc45c0..1cc45c0 100755
--- a/modules/private/vpn/tinc/tinc-down
+++ b/systems/eldiron/vpn/tinc/tinc-down
diff --git a/modules/private/vpn/tinc/tinc-up b/systems/eldiron/vpn/tinc/tinc-up
index 26c1ec3..26c1ec3 100755
--- a/modules/private/vpn/tinc/tinc-up
+++ b/systems/eldiron/vpn/tinc/tinc-up
diff --git a/modules/private/vpn/tinc/tinc.conf b/systems/eldiron/vpn/tinc/tinc.conf
index 7a4f103..7a4f103 100644
--- a/modules/private/vpn/tinc/tinc.conf
+++ b/systems/eldiron/vpn/tinc/tinc.conf
diff --git a/modules/private/websites/_www/googleb6d69446ff4ca3e5.html b/systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html
index ff6dbf3..ff6dbf3 100644
--- a/modules/private/websites/_www/googleb6d69446ff4ca3e5.html
+++ b/systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html
diff --git a/modules/private/websites/_www/index.htm b/systems/eldiron/websites/_www/index.htm
index 0274251..0274251 100644
--- a/modules/private/websites/_www/index.htm
+++ b/systems/eldiron/websites/_www/index.htm
diff --git a/modules/private/websites/_www/maintenance_immae.html b/systems/eldiron/websites/_www/maintenance_immae.html
index 90f265f..90f265f 100644
--- a/modules/private/websites/_www/maintenance_immae.html
+++ b/systems/eldiron/websites/_www/maintenance_immae.html
diff --git a/modules/private/websites/_www/nossl.html b/systems/eldiron/websites/_www/nossl.html
index 4401a80..4401a80 100644
--- a/modules/private/websites/_www/nossl.html
+++ b/systems/eldiron/websites/_www/nossl.html
diff --git a/systems/eldiron/websites/assets/default.nix b/systems/eldiron/websites/assets/default.nix
new file mode 100644
index 0000000..02a4952
--- /dev/null
+++ b/systems/eldiron/websites/assets/default.nix
@@ -0,0 +1,98 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.tools.assets;
4 fetchFont = v: pkgs.runCommand "fetch-font" {
5 outputHashAlgo = "sha256";
6 outputHashMode = "recursive";
7 outputHash = v.sha256;
8 } ''
9 mkdir -p $out
10 ${pkgs.curl}/bin/curl -k --output $out/font.css -H "User-Agent: Firefox/100.0" "${v.url}"
11 cat $out/font.css | grep -o "https://[^ )]*" | while read url; do
12 filename=$(echo "$url" | sed -e "s@.*/@@g")
13 ${pkgs.curl}/bin/curl -k --output "$out/$filename" "$url"
14 sed -i -e "s@$url@./$filename@" "$out/font.css"
15 done
16 '';
17 fetchTgz = v: pkgs.runCommand "fetch-tgz" {
18 outputHashAlgo = "sha256";
19 outputHashMode = "recursive";
20 outputHash = v.sha256;
21 } ''
22 mkdir -p $out
23 cd $out
24 ${pkgs.curl}/bin/curl -L -k "${v.url}" | tar -xz --strip-components=${builtins.toString v.tgzRemoveComponents}
25 '';
26 fetchAsset = v:
27 if v.assetType == "googleFont"
28 then fetchFont v
29 else if v.assetType == "tgz"
30 then fetchTgz v
31 else pkgs.fetchurl { url = v.url; sha256 = v.sha256; };
32 assets_urls = lib.mapAttrs (k: fetchAsset) config.myEnv.tools.assets;
33 assets = pkgs.runCommand "assets" {} (''
34 mkdir -p $out
35 cp -a ${./static}/* $out/
36 '' + builtins.concatStringsSep "\n"
37 (lib.mapAttrsToList (k: v: ''
38 if [ -d "${v}" ]; then
39 mkdir -p "$out/$(dirname "${k}")"
40 cp -a "${v}" "$out/${k}"
41 chmod -R u+rwX "$out/${k}"
42 else
43 install -D -m644 -T "${v}" "$out/${k}"
44 fi
45 '') assets_urls));
46in
47{
48 options.myServices.websites.tools.assets = {
49 enable = lib.mkEnableOption "Enable assets website";
50 };
51 config = lib.mkIf cfg.enable {
52 myServices.dns.zones."immae.eu".subdomains.assets =
53 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
54
55 services.websites.env.production.bindMounts."/run/imgproxy" = {};
56 security.acme.certs.eldiron.extraDomainNames = [ "assets.immae.eu" ];
57 services.websites.env.tools.vhostConfs.assets = {
58 certName = "eldiron";
59 hosts = [ "assets.immae.eu" ];
60 root = assets;
61 extraConfig = [
62 ''
63 Use Apaxy "${assets}" "title"
64 <Directory "${assets}">
65 Options Indexes FollowSymlinks
66 AllowOverride None
67 Require all granted
68 Header always set Last-Modified "Tue, 01 Jan 2020 00:00:00 GMT"
69 Header always set Cache-Control "public, max-age=31536000, immutable"
70 Header always set Access-Control-Allow-Origin "*"
71 Header always set Access-Control-Expose-Headers "*"
72 </Directory>
73
74 MergeSlashes OFF
75 <Location /p>
76 ProxyPass unix:///run/imgproxy/imgproxy.sock|http://assets.immae.eu
77 ProxyPassReverse unix:///run/imgproxy/imgproxy.sock|http://assets.immae.eu
78 </Location>
79 ''
80 ];
81 };
82 systemd.services.imgproxy = {
83 description = "IMG proxy";
84 wantedBy = [ "multi-user.target" ];
85
86 environment = {
87 IMGPROXY_NETWORK = "unix";
88 IMGPROXY_BIND = "%t/imgproxy/imgproxy.sock";
89 };
90 serviceConfig = {
91 User = "wwwrun";
92 Group = "wwwrun";
93 RuntimeDirectory = "imgproxy";
94 ExecStart = "${pkgs.imgproxy}/bin/imgproxy";
95 };
96 };
97 };
98}
diff --git a/modules/private/websites/tools/assets/static/favicon.png b/systems/eldiron/websites/assets/static/favicon.png
index 1caf5a4..1caf5a4 100644
--- a/modules/private/websites/tools/assets/static/favicon.png
+++ b/systems/eldiron/websites/assets/static/favicon.png
Binary files differ
diff --git a/modules/private/websites/tools/assets/static/logger.png b/systems/eldiron/websites/assets/static/logger.png
index d9579fb..d9579fb 100644
--- a/modules/private/websites/tools/assets/static/logger.png
+++ b/systems/eldiron/websites/assets/static/logger.png
Binary files differ
diff --git a/modules/private/websites/tools/assets/static/logger.txt b/systems/eldiron/websites/assets/static/logger.txt
index 50dccc6..50dccc6 100644
--- a/modules/private/websites/tools/assets/static/logger.txt
+++ b/systems/eldiron/websites/assets/static/logger.txt
diff --git a/modules/private/websites/tools/assets/static/logo.jpg b/systems/eldiron/websites/assets/static/logo.jpg
index a89172d..a89172d 100644
--- a/modules/private/websites/tools/assets/static/logo.jpg
+++ b/systems/eldiron/websites/assets/static/logo.jpg
Binary files differ
diff --git a/modules/private/websites/tools/assets/static/logo.txt b/systems/eldiron/websites/assets/static/logo.txt
index 327e62a..327e62a 100644
--- a/modules/private/websites/tools/assets/static/logo.txt
+++ b/systems/eldiron/websites/assets/static/logo.txt
diff --git a/modules/private/websites/tools/assets/static/logo_big.jpg b/systems/eldiron/websites/assets/static/logo_big.jpg
index 45448f2..45448f2 100644
--- a/modules/private/websites/tools/assets/static/logo_big.jpg
+++ b/systems/eldiron/websites/assets/static/logo_big.jpg
Binary files differ
diff --git a/modules/private/websites/tools/assets/static/logo_big.txt b/systems/eldiron/websites/assets/static/logo_big.txt
index ce92c09..ce92c09 100644
--- a/modules/private/websites/tools/assets/static/logo_big.txt
+++ b/systems/eldiron/websites/assets/static/logo_big.txt
diff --git a/modules/private/websites/tools/assets/static/logo_center.jpg b/systems/eldiron/websites/assets/static/logo_center.jpg
index 6b177e0..6b177e0 100644
--- a/modules/private/websites/tools/assets/static/logo_center.jpg
+++ b/systems/eldiron/websites/assets/static/logo_center.jpg
Binary files differ
diff --git a/modules/private/websites/tools/assets/static/logo_center.txt b/systems/eldiron/websites/assets/static/logo_center.txt
index 60a8f1c..60a8f1c 100644
--- a/modules/private/websites/tools/assets/static/logo_center.txt
+++ b/systems/eldiron/websites/assets/static/logo_center.txt
diff --git a/modules/private/websites/tools/assets/static/monitoring.png b/systems/eldiron/websites/assets/static/monitoring.png
index 0024fee..0024fee 100644
--- a/modules/private/websites/tools/assets/static/monitoring.png
+++ b/systems/eldiron/websites/assets/static/monitoring.png
Binary files differ
diff --git a/modules/private/websites/tools/assets/static/monitoring.txt b/systems/eldiron/websites/assets/static/monitoring.txt
index 9f3e13a..9f3e13a 100644
--- a/modules/private/websites/tools/assets/static/monitoring.txt
+++ b/systems/eldiron/websites/assets/static/monitoring.txt
diff --git a/modules/private/websites/tools/assets/static/photos/ct.jpg b/systems/eldiron/websites/assets/static/photos/ct.jpg
index ab7876b..ab7876b 100644
--- a/modules/private/websites/tools/assets/static/photos/ct.jpg
+++ b/systems/eldiron/websites/assets/static/photos/ct.jpg
Binary files differ
diff --git a/modules/private/websites/tools/assets/static/photos/fretlink.jpg b/systems/eldiron/websites/assets/static/photos/fretlink.jpg
index c941e1d..c941e1d 100644
--- a/modules/private/websites/tools/assets/static/photos/fretlink.jpg
+++ b/systems/eldiron/websites/assets/static/photos/fretlink.jpg
Binary files differ
diff --git a/modules/private/websites/tools/assets/static/photos/raton.jpg b/systems/eldiron/websites/assets/static/photos/raton.jpg
index a859e1c..a859e1c 100644
--- a/modules/private/websites/tools/assets/static/photos/raton.jpg
+++ b/systems/eldiron/websites/assets/static/photos/raton.jpg
Binary files differ
diff --git a/systems/eldiron/websites/cloud/add-htaccess.php b/systems/eldiron/websites/cloud/add-htaccess.php
new file mode 100644
index 0000000..e11d943
--- /dev/null
+++ b/systems/eldiron/websites/cloud/add-htaccess.php
@@ -0,0 +1,70 @@
1<?php
2
3namespace bantu\IniGetWrapper { class IniGetWrapper { } }
4namespace Psr\Log { class LoggerInterface { } }
5namespace OCP {
6 class IL10N { }
7 class Defaults { }
8}
9namespace OCP\Security {
10 class ISecureRandom { }
11}
12namespace OC {
13 class Installer { }
14 class SystemConfig {
15 private $a;
16 public function __construct($a) {
17 $this->a = $a;
18 }
19 public function getValue($val, $default) {
20 if(isset($this->a[$val])) {
21 return $this->a[$val];
22 } else {
23 return $default;
24 }
25 }
26 }
27}
28
29namespace {
30 class NServer {
31 private $argv;
32 public function __construct($argv) {
33 $this->argv = $argv;
34 }
35 public function getSystemConfig() {
36 return new OC\SystemConfig(Array(
37 'htaccess.RewriteBase' => $this->argv[1],
38 ));
39 }
40
41 public function get($c) {
42 return new $c();
43 }
44 public function getL10N() {
45 return new \OCP\IL10N();
46 }
47 public function query($c) {
48 return new $c();
49 }
50 public function getSecureRandom() {
51 return new \OCP\Security\ISecureRandom();
52 }
53 }
54
55 class OC {
56 public static Bool $CLI = false;
57 public static $SERVERROOT = '.';
58 public static $WEBROOT;
59 public static \NServer $server;
60 }
61
62 \OC::$server = new NServer($argv);
63 \OC::$WEBROOT = $argv[1];
64
65 require "./lib/private/Setup.php";
66 $result = \OC\Setup::updateHtaccess();
67 if ($result) {
68 echo "done";
69 };
70}
diff --git a/systems/eldiron/websites/cloud/default.nix b/systems/eldiron/websites/cloud/default.nix
new file mode 100644
index 0000000..e1df883
--- /dev/null
+++ b/systems/eldiron/websites/cloud/default.nix
@@ -0,0 +1,151 @@
1{ lib, pkgs, config, ... }:
2let
3 ncfg = config.myServices.tools.cloud.farm.instances.immae;
4 env = config.myEnv.tools.nextcloud;
5 cfg = config.myServices.websites.tools.cloud;
6in {
7 options.myServices.websites.tools.cloud = {
8 enable = lib.mkEnableOption "enable cloud website";
9 };
10
11 config = lib.mkIf cfg.enable {
12 myServices.dns.zones."immae.eu".subdomains.cloud =
13 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
14
15 myServices.chatonsProperties.hostings.nextcloud = {
16 file.datetime = "2022-08-21T19:50:00";
17 hosting = {
18 name = "Nextcloud";
19 description = "The self-hosted productivity platform that keeps you in control";
20 website = "https://cloud.immae.eu/";
21 logo = "https://cloud.immae.eu/core/img/favicon.ico";
22 type = "INSTANCE";
23 status.level = "OK";
24 status.description = "OK";
25 registration.load = "OPEN";
26 install.type = "PACKAGE";
27 };
28 };
29 myServices.chatonsProperties.services.nextcloud = {
30 file.datetime = "2022-08-21T19:50:00";
31 service = {
32 name = "Nextcloud";
33 description = "The self-hosted productivity platform that keeps you in control";
34 website = "https://cloud.immae.eu/";
35 logo = "https://cloud.immae.eu/core/img/favicon.ico";
36 status.level = "OK";
37 status.description = "OK";
38 registration."" = ["MEMBER" "CLIENT"];
39 registration.load = "OPEN";
40 install.type = "PACKAGE";
41 guide.user = "https://www.immae.eu/docs/nextcloud.html";
42 };
43 software = {
44 name = "Nextcloud";
45 website = "https://nextcloud.com/";
46 license.url = "https://github.com/nextcloud/server/blob/master/COPYING";
47 license.name = "GNU Affero General Public License v3.0";
48 version = ncfg.rootDir.version;
49 source.url = "https://github.com/nextcloud/server";
50 modules = map (a: a.appName) ncfg.rootDir.apps;
51 };
52 };
53
54 myServices.tools.cloud.farm.instances.immae = {
55 nextcloud = pkgs.webapps-nextcloud_27.override ({
56 # Allow /index.php redirects
57 postInstall = ''
58 cd $out
59 ${pkgs.php81}/bin/php ${./add-htaccess.php} /
60 '';
61 });
62 apps = a: [
63 a.side_menu a.audioplayer a.bookmarks a.calendar a.carnet a.contacts
64 a.cookbook a.deck a.extract a.files_markdown a.files_mindmap
65 a.gpxpod a.keeweb a.maps a.metadata a.music
66 a.notes a.passman a.polls a.spreed a.tasks
67 ];
68 varDir = "/var/lib/nextcloud";
69 secretsPath = "webapps/tools-nextcloud";
70 phpPackage = pkgs.php81;
71 # Be careful when editing that: config from here takes
72 # precedence over the regular one, but if a key got removed, it my
73 # still exist in the default config file
74 config = let
75 env = config.myEnv.tools.nextcloud;
76 in {
77 "dbtype" = "pgsql";
78 "dbname" = env.postgresql.database;
79 "dbhost" = env.postgresql.socket;
80 "dbport" = "";
81 "dbtableprefix" = "oc_";
82 "dbuser" = env.postgresql.user;
83 "dbpassword" = env.postgresql.password;
84
85 "instanceid" = env.instance_id;
86 "passwordsalt" = env.password_salt;
87 "secret" = env.secret;
88
89 "trusted_domains" = [ "cloud.immae.eu" ];
90 "overwrite.cli.url" = "https://cloud.immae.eu";
91
92 "lost_password_link" = "disabled";
93
94 "remember_login_cookie_lifetime" = 60*60*24*30;
95 "session_keepalive" = true;
96 "session_lifefime" = 60*60*24*30;
97
98 "maxZipInputSize" = 0;
99 "allowZipDownload" = true;
100
101 # set by Carnet
102 "has_rebuilt_cache" = true;
103
104 "memcache.distributed" = "\\OC\\Memcache\\Redis";
105 "memcache.locking" = "\\OC\\Memcache\\Redis";
106 "filelocking.enabled" = true;
107 "redis" = {
108 "host" = env.redis.socket;
109 "port" = 0;
110 "dbindex" = env.redis.db;
111 };
112
113 "ldapIgnoreNamingRules" = false;
114 "ldapProviderFactory" = "\\OCA\\User_LDAP\\LDAPProviderFactory";
115
116 "mail_smtpmode" = "sendmail";
117 "mail_smtphost" = "127.0.0.1";
118 "mail_smtpname" = "";
119 "mail_smtppassword" = "";
120 "mail_from_address" = "nextcloud";
121 "mail_smtpauth" = false;
122 "mail_domain" = "tools.immae.eu";
123 };
124 };
125 services.websites.env.tools.modules = [ "proxy_fcgi" ];
126
127 security.acme.certs.eldiron.extraDomainNames = [ "cloud.immae.eu" ];
128 services.websites.env.tools.vhostConfs.cloud = {
129 certName = "eldiron";
130 hosts = ["cloud.immae.eu" ];
131 root = ncfg.rootDir;
132 extraConfig = [
133 ncfg.vhost
134 ];
135 };
136
137 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
138 myServices.monitoring.fromMasterObjects.service = [
139 {
140 service_description = "owncloud website is running on cloud.immae.eu";
141 host_name = config.hostEnv.fqdn;
142 use = "external-web-service";
143 check_command = ["check_https" "cloud.immae.eu" "/" "a safe home for all your data"];
144
145 servicegroups = "webstatus-webapps";
146 _webstatus_name = "Nextcloud";
147 _webstatus_url = "https://cloud.immae.eu";
148 }
149 ];
150 };
151}
diff --git a/systems/eldiron/websites/cloud/farm.nix b/systems/eldiron/websites/cloud/farm.nix
new file mode 100644
index 0000000..df24cba
--- /dev/null
+++ b/systems/eldiron/websites/cloud/farm.nix
@@ -0,0 +1,221 @@
1{ lib, pkgs, config, ... }:
2let
3 scfg = config.secrets.fullPaths;
4 cfg = config.myServices.tools.cloud.farm;
5 apacheUser = config.services.websites.env.production.user;
6 apacheGroup = config.services.websites.env.production.group;
7 additionalConfs = icfg: lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) icfg.rootDir.otherConfig;
8 overrideConfig = icfg: pkgs.writeText "override.config.php" ''
9 <?php
10 $CONFIG = json_decode(file_get_contents("${icfg.configOverride}"), TRUE);
11 '';
12 toVhost = icfg: ''
13 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
14 SetEnv NEXTCLOUD_CONFIG_DIR "${icfg.varDir}/config"
15 <Directory ${icfg.rootDir}>
16 AcceptPathInfo On
17 DirectoryIndex index.php
18 Options FollowSymlinks
19 Require all granted
20 AllowOverride all
21
22 <IfModule mod_headers.c>
23 Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
24 </IfModule>
25 <FilesMatch "\.php$">
26 CGIPassAuth on
27 SetHandler "proxy:unix:${config.services.phpfpm.pools.${icfg.phpPoolName}.socket}|fcgi://localhost"
28 </FilesMatch>
29
30 </Directory>
31 '';
32in
33{
34 options.myServices.tools.cloud.farm = {
35 instances = lib.mkOption {
36 description = "Instances names for the nextcloud Farm";
37 default = {};
38 type = lib.types.attrsOf (lib.types.submodule ({ name, config, ... }: {
39 options = {
40 nextcloud = lib.mkOption {
41 description = "Nextcloud version to use";
42 default = pkgs.webapps-nextcloud_27;
43 type = lib.types.package;
44 };
45 apps = lib.mkOption {
46 description = "Applications to use";
47 default = a: [];
48 #type = functionTo (listOf packages)
49 type = lib.types.unspecified;
50 };
51 config = lib.mkOption {
52 description = "Config keys";
53 default = {};
54 type = lib.types.attrsOf lib.types.unspecified;
55 };
56 secretsPath = lib.mkOption {
57 description = "Path in secrets to nextcloud config file";
58 default = "websites/${name}/nextcloud";
59 type = lib.types.str;
60 };
61 configOverride = lib.mkOption {
62 description = "Path to config override";
63 readOnly = true;
64 default = scfg."${config.secretsPath}";
65 type = lib.types.path;
66 };
67 phpPackage = lib.mkOption {
68 description = "PHP package to use";
69 default = pkgs.php81;
70 type = lib.types.package;
71 apply = v: (v.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache all.imagick all.sysvsem ])).override { extraConfig = ''
72 apc.enable_cli = 1
73 apc.enabled = 1
74 '';
75 };
76 };
77 rootDir = lib.mkOption {
78 description = "Instance root dirs";
79 readOnly = true;
80 type = lib.types.package;
81 default = config.nextcloud.withApps config.apps;
82 };
83 phpPoolName = lib.mkOption {
84 description = "Php pool name for the instance";
85 readOnly = true;
86 type = lib.types.str;
87 default = "nextcloud_farm_" + name;
88 };
89 phpBaseDir = lib.mkOption {
90 description = "Php basedir for the instance";
91 readOnly = true;
92 type = lib.types.str;
93 default = builtins.concatStringsSep ":" (
94 [ config.rootDir config.varDir ]
95 ++ config.rootDir.apps
96 ++ [ config.configOverride (overrideConfig config) ]
97 ++ (builtins.attrValues (additionalConfs config))
98 );
99 };
100 varDir = lib.mkOption {
101 description = "Instance var dir";
102 type = lib.types.path;
103 default = "/var/lib/nextcloud_farm/${name}";
104 };
105 vhost = lib.mkOption {
106 description = "Instance vhost config";
107 readOnly = true;
108 type = lib.types.str;
109 default = toVhost config;
110 };
111 };
112 }));
113 };
114 };
115
116 config = lib.mkIf (builtins.length (builtins.attrNames cfg.instances) > 0) {
117 systemd.services = lib.mapAttrs' (k: v: lib.nameValuePair ("phpfpm-" + v.phpPoolName) {
118 after = lib.mkAfter [ "postgresql.service" ];
119 wants = [ "postgresql.service" ];
120 serviceConfig.ExecStartPre =
121 "+${pkgs.writeScript "phpfpm-nextcloud-${k}-pre-start" ''
122 #!${pkgs.stdenv.shell}
123
124 install -m 0755 -o wwwrun -g wwwrun -d ${v.varDir} -d ${v.varDir}/config
125 ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: f:
126 "ln -sf ${f} ${v.varDir}/config/${n}.json"
127 ) (additionalConfs v))}
128 ln -sf ${overrideConfig v} ${v.varDir}/config/override.config.php
129 ''}";
130 }) cfg.instances;
131 services.phpfpm.pools = lib.mapAttrs' (k: v: lib.nameValuePair v.phpPoolName {
132 user = apacheUser;
133 group = apacheGroup;
134 settings = {
135 "listen.owner" = apacheUser;
136 "listen.group" = apacheGroup;
137 "pm" = "dynamic";
138 "pm.max_children" = "60";
139 "pm.start_servers" = "3";
140 "pm.min_spare_servers" = "3";
141 "pm.max_spare_servers" = "3";
142 "pm.process_idle_timeout" = "60";
143
144 "php_admin_value[output_buffering]" = "0";
145 "php_admin_value[max_execution_time]" = "1800";
146 "php_admin_value[zend_extension]" = "opcache";
147 "php_value[apc.enable_cli]" = "1";
148 "php_value[apc.enabled]" = "1";
149 #already enabled by default?
150 #"php_value[opcache.enable]" = "1";
151 "php_value[opcache.enable_cli]" = "1";
152 "php_value[opcache.interned_strings_buffer]" = "32";
153 "php_value[opcache.max_accelerated_files]" = "10000";
154 "php_value[opcache.memory_consumption]" = "128";
155 "php_value[opcache.save_comments]" = "1";
156 "php_value[opcache.revalidate_freq]" = "1";
157 "php_admin_value[memory_limit]" = "512M";
158
159 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${v.phpBaseDir}:/proc/cpuinfo:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp";
160 "php_admin_value[session.save_handler]" = "redis";
161 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:NextcloudFarm:${k}:'";
162 };
163 phpPackage = v.phpPackage;
164 }) cfg.instances;
165 environment.systemPackages = let
166 toOcc = name: icfg: pkgs.writeScriptBin "nextcloud-occ-${name}" ''
167 #! ${pkgs.stdenv.shell}
168 cd ${icfg.rootDir}
169 NEXTCLOUD_CONFIG_DIR="${icfg.varDir}/config" \
170 exec \
171 sudo -E -u wwwrun ${icfg.phpPackage}/bin/php \
172 -d memory_limit=512M \
173 -c ${icfg.phpPackage}/etc/php.ini \
174 occ $*
175 '';
176 in lib.mapAttrsToList toOcc cfg.instances;
177 services.cron = {
178 enable = true;
179 systemCronJobs = let
180 toScript = name: icfg: pkgs.writeScriptBin "nextcloud-cron" ''
181 #! ${pkgs.stdenv.shell}
182 export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive
183 export PATH=/run/wrappers/bin:$PATH
184 export NEXTCLOUD_CONFIG_DIR="${icfg.varDir}/config"
185 ${icfg.phpPackage}/bin/php -c ${icfg.phpPackage}/etc/php.ini -d memory_limit=512M -f ${icfg.rootDir}/cron.php
186 '';
187 toLine = name: icfg: ''
188 */5 * * * * wwwrun ${toScript name icfg}/bin/nextcloud-cron
189 '';
190 in lib.mapAttrsToList toLine cfg.instances;
191 };
192
193 secrets.keys = lib.mapAttrs' (name: v: lib.nameValuePair "${v.secretsPath}" {
194 user = "wwwrun";
195 group = "wwwrun";
196 permissions = "0600";
197 # Be careful when editing that: config from this file takes
198 # precedence over the regular one, but if a key got removed, it my
199 # still exist in the default config file
200 text = builtins.toJSON ( {
201 "datadirectory" = if name == "immae" then v.varDir else "${v.varDir}/data";
202
203 "appstoreenabled" = false;
204 "integrity.check.disabled" = true;
205 "updater.release.channel" = "stable";
206 "upgrade.disable-web" = true;
207
208 "memcache.local" = "\\OC\\Memcache\\APCu";
209
210 "htaccess.RewriteBase" = "/";
211
212 "loglevel" = 2;
213 "logtimezone" = "Europe/Paris";
214
215 "default_phone_region" = "FR";
216 "skeletondirectory" = "";
217 "theme" = "";
218 } // v.config);
219 }) cfg.instances;
220 };
221}
diff --git a/systems/eldiron/websites/commento/default.nix b/systems/eldiron/websites/commento/default.nix
new file mode 100644
index 0000000..c5131b8
--- /dev/null
+++ b/systems/eldiron/websites/commento/default.nix
@@ -0,0 +1,84 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.tools.commento;
4 env = config.myEnv.tools.commento;
5 webPort = "${host}:${port}";
6 port = toString env.listenPort;
7 host = "localhost";
8 postgresql_url = "postgres://${env.postgresql.user}:${env.postgresql.password}@localhost:${env.postgresql.port}/${env.postgresql.database}?sslmode=disable";
9in
10{
11 options.myServices.websites.tools.commento = {
12 enable = lib.mkEnableOption "Enable commento website";
13 };
14 config = lib.mkIf cfg.enable {
15 myServices.dns.zones."immae.eu".subdomains.commento =
16 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
17
18 myServices.chatonsProperties.services.commento = {
19 file.datetime = "2022-08-21T01:11:00";
20 service = {
21 name = "Commento";
22 description = "Commento is a fast, privacy-focused commenting platform";
23 website = "https://commento.immae.eu";
24 logo = "https://commento.immae.eu/images/logo.svg";
25 status.level = "OK";
26 status.description = "OK";
27 registration."" = ["MEMBER" "CLIENT"];
28 registration.load = "OPEN";
29 install.type = "PACKAGE";
30 };
31 software = {
32 name = "Commento";
33 website = "https://www.commento.io/";
34 license.url = "https://gitlab.com/commento/commento/-/blob/master/LICENSE";
35 license.name = "MIT License";
36 version = pkgs.commento.version;
37 source.url = "https://gitlab.com/commento/commento";
38 };
39 };
40 secrets.keys = {
41 "commento/env" = {
42 permissions = "0400";
43 text = ''
44 COMMENTO_ORIGIN=https://commento.immae.eu/
45 COMMENTO_PORT=${port}
46 COMMENTO_POSTGRES=${postgresql_url}
47 COMMENTO_FORBID_NEW_OWNERS=true
48 COMMENTO_BIND_ADDRESS=${host}
49 COMMENTO_GZIP_STATIC=true
50 COMMENTO_SMTP_HOST=${env.smtp.host}
51 COMMENTO_SMTP_PORT=${env.smtp.port}
52 COMMENTO_SMTP_USERNAME=${env.smtp.email}
53 COMMENTO_SMTP_PASSWORD=${env.smtp.password}
54 COMMENTO_SMTP_FROM_ADDRESS=${env.smtp.email}
55 '';
56 };
57 };
58
59 security.acme.certs.eldiron.extraDomainNames = [ "commento.immae.eu" ];
60 services.websites.env.tools.vhostConfs.commento = {
61 certName = "eldiron";
62 hosts = [ "commento.immae.eu" ];
63 root = null;
64 extraConfig = [
65 ''
66 ProxyPass / http://${webPort}/
67 ProxyPassReverse / http://${webPort}/
68 ProxyPreserveHost On
69 ''
70 ];
71 };
72 systemd.services.commento = {
73 description = "Commento";
74 wantedBy = [ "multi-user.target" ];
75 requires = ["postgresql.service"];
76 after = ["network.target" "postgresql.service"];
77 serviceConfig = {
78 User = "wwwrun";
79 ExecStart = "${pkgs.commento}/commento";
80 EnvironmentFile = config.secrets.fullPaths."commento/env";
81 };
82 };
83 };
84}
diff --git a/systems/eldiron/websites/cryptpad/default.nix b/systems/eldiron/websites/cryptpad/default.nix
new file mode 100644
index 0000000..4635548
--- /dev/null
+++ b/systems/eldiron/websites/cryptpad/default.nix
@@ -0,0 +1,89 @@
1{ config, pkgs, lib, ... }:
2let
3 cfg = config.myServices.websites.tools.cryptpad;
4 envCfg = config.myEnv.tools.cryptpad;
5 domain = "cryptpad.immae.eu";
6 port = envCfg.port;
7 configFile = pkgs.writeText "config.js" ''
8 // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js
9 module.exports = {
10 httpUnsafeOrigin: 'https://${domain}',
11 httpPort: ${toString port},
12 adminEmail: '${envCfg.email}',
13 filePath: './datastore/',
14 archivePath: './data/archive',
15 pinPath: './data/pins',
16 taskPath: './data/tasks',
17 blockPath: './block',
18 blobPath: './blob',
19 blobStagingPath: './data/blobstage',
20 decreePath: './data/decrees',
21 logPath: './data/logs',
22 logToStdout: false,
23 logLevel: 'info',
24 logFeedback: false,
25 verbose: false,
26 inactiveTime: false,
27 maxUploadSize: 100 * 1024 * 1024,
28 adminKeys: ${builtins.toJSON envCfg.admins},
29 };
30 '';
31in
32{
33 options.myServices.websites.tools.cryptpad.enable = lib.mkEnableOption "Enable Cryptpad";
34 config = lib.mkIf cfg.enable {
35 myServices.dns.zones."immae.eu".subdomains.cryptpad =
36 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
37
38 myServices.chatonsProperties.hostings.cryptpad = {
39 file.datetime = "2022-08-21T01:20:00";
40 hosting = {
41 name = "Cryptpad";
42 description = "Collaboration suite, encrypted and open-source";
43 website = "https://cryptpad.immae.eu/";
44 logo = "https://cryptpad.immae.eu/customize/favicon/main-favicon.png";
45 type = "INSTANCE";
46 status.level = "OK";
47 status.description = "OK";
48 registration.load = "OPEN";
49 install.type = "PACKAGE";
50 };
51 };
52 myServices.chatonsProperties.services.cryptpad = {
53 file.datetime = "2022-08-21T01:20:00";
54 service = {
55 name = "Cryptpad";
56 description = "Collaboration suite, encrypted and open-source";
57 website = "https://cryptpad.immae.eu/";
58 logo = "https://cryptpad.immae.eu/customize/favicon/main-favicon.png";
59 status.level = "OK";
60 status.description = "OK";
61 registration."" = ["NONE" "FREE" "MEMBER" "CLIENT"];
62 registration.load = "OPEN";
63 install.type = "PACKAGE";
64 };
65 software = {
66 name = "Cryptpad";
67 website = "https://cryptpad.org/";
68 license.url = "https://github.com/xwiki-labs/cryptpad/blob/main/LICENSE";
69 license.name = "GNU Affero General Public License v3.0";
70 version = pkgs.cryptpad.version;
71 source.url = "https://github.com/xwiki-labs/cryptpad";
72 };
73 };
74 myServices.tools.cryptpad.farm.hosts.immaeEu = {
75 inherit domain port;
76 config = configFile;
77 };
78 services.websites.env.tools.modules = [ "proxy_wstunnel" ];
79 security.acme.certs.eldiron.extraDomainNames = [ domain ];
80 services.websites.env.tools.vhostConfs.cryptpad = {
81 certName = "eldiron";
82 hosts = [domain];
83 root = config.myServices.tools.cryptpad.farm.vhostRoots.immaeEu;
84 extraConfig = [
85 config.myServices.tools.cryptpad.farm.vhosts.immaeEu
86 ];
87 };
88 };
89}
diff --git a/systems/eldiron/websites/cryptpad/farm.nix b/systems/eldiron/websites/cryptpad/farm.nix
new file mode 100644
index 0000000..58393ab
--- /dev/null
+++ b/systems/eldiron/websites/cryptpad/farm.nix
@@ -0,0 +1,186 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.tools.cryptpad.farm;
4 toService = name:
5 let
6 inherit (cfg.hosts.${name}) package config;
7 in {
8 description = "Cryptpad ${name} Service";
9 wantedBy = [ "multi-user.target" ];
10 after = [ "networking.target" ];
11 serviceConfig = {
12 User = "cryptpad";
13 Group = "cryptpad";
14 Environment = [
15 "CRYPTPAD_CONFIG=${config}"
16 "HOME=%S/cryptpad/${name}"
17 ];
18 ExecStart = "${package}/bin/cryptpad";
19 PrivateTmp = true;
20 Restart = "always";
21 StateDirectory = "cryptpad/${name}";
22 WorkingDirectory = "%S/cryptpad/${name}";
23 };
24 };
25 toVhostRoot = name: "${cfg.hosts.${name}.package}/lib/node_modules/cryptpad";
26 toVhost = name:
27 let
28 inherit (cfg.hosts.${name}) package domain port;
29 api_domain = domain;
30 files_domain = domain;
31 in ''
32 RewriteEngine On
33
34 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
35 Header set X-XSS-Protection "1; mode=block"
36 Header set X-Content-Type-Options "nosniff"
37 Header set Access-Control-Allow-Origin "*"
38 Header set Permissions-Policy "interest-cohort=()"
39
40 Header set Cross-Origin-Resource-Policy "cross-origin"
41 <If "%{REQUEST_URI} =~ m#^/(sheet|presentation|doc)/.*$#">
42 Header set Cross-Origin-Opener-Policy "same-origin"
43 </If>
44 Header set Cross-Origin-Embedder-Policy "require-corp"
45
46 ErrorDocument 404 /customize.dist/404.html
47
48 <If "%{QUERY_STRING} =~ m#ver=.*?#">
49 Header set Cache-Control "max-age=31536000"
50 </If>
51 <If "%{REQUEST_URI} =~ m#^/.*(\/|\.html)$#">
52 Header set Cache-Control "no-cache"
53 </If>
54
55 SetEnv styleSrc "'unsafe-inline' 'self' ${domain}"
56 SetEnv connectSrc "'self' https://${domain} ${domain} https://${api_domain} blob: wss://${api_domain} ${api_domain} ${files_domain}"
57 SetEnv fontSrc "'self' data: ${domain}"
58 SetEnv imgSrc "'self' data: * blob: ${domain}"
59 SetEnv frameSrc "'self' blob:"
60 SetEnv mediaSrc "'self' data: * blob: ${domain}"
61 SetEnv childSrc "https://${domain}"
62 SetEnv workerSrc "https://${domain}"
63 SetEnv scriptSrc "'self' 'unsafe-eval' 'unsafe-inline' resource: ${domain}"
64
65 Header set Content-Security-Policy "default-src 'none'; child-src %{childSrc}e; worker-src %{workerSrc}e; media-src %{mediaSrc}e; style-src %{styleSrc}e; script-src %{scriptSrc}e; connect-src %{connectSrc}e; font-src %{fontSrc}e; img-src %{imgSrc}e; frame-src %{frameSrc}e;"
66
67 RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
68 RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
69 RewriteRule .* ws://localhost:${toString port}%{REQUEST_URI} [P,NE,QSA,L]
70
71 RewriteRule ^/customize/(.*)$ /customize.dist/$1 [L]
72
73 ProxyPassMatch "^/(api/(config|broadcast).*)$" "http://localhost:${toString port}/$1"
74 ProxyPassReverse /api http://localhost:${toString port}/api
75 ProxyPreserveHost On
76 RequestHeader set X-Real-IP %{REMOTE_ADDR}s
77
78 Alias /blob /var/lib/cryptpad/${name}/blob
79 <Directory /var/lib/cryptpad/${name}/blob>
80 Require all granted
81 AllowOverride None
82 </Directory>
83 Alias /block /var/lib/cryptpad/${name}/block
84 <Directory /var/lib/cryptpad/${name}/block>
85 Require all granted
86 AllowOverride None
87 </Directory>
88 <LocationMatch /blob/>
89 Header set Cache-Control "max-age=31536000"
90 Header set Access-Control-Allow-Origin "*"
91 Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
92 Header set Access-Control-Allow-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Content-Length"
93 Header set Access-Control-Expose-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Content-Length"
94
95 RewriteCond %{REQUEST_METHOD} OPTIONS
96 RewriteRule ^(.*)$ $1 [R=204,L]
97 </LocationMatch>
98
99 <LocationMatch /block/>
100 Header set Cache-Control "max-age=0"
101 </locationMatch>
102
103 RewriteRule ^/(register|login|settings|user|pad|drive|poll|slide|code|whiteboard|file|media|profile|contacts|todo|filepicker|debug|kanban|sheet|support|admin|notifications|teams|calendar|presentation|doc)$ $1/ [R=302,L]
104
105 RewriteCond %{DOCUMENT_ROOT}/www/%{REQUEST_URI} -f
106 RewriteRule (.*) /www/$1 [L]
107
108 RewriteCond %{DOCUMENT_ROOT}/www/%{REQUEST_URI}/index.html -f
109 RewriteRule (.*) /www/$1/index.html [L]
110
111 RewriteCond %{DOCUMENT_ROOT}/customize.dist/%{REQUEST_URI} -f
112 RewriteRule (.*) /customize.dist/$1 [L]
113
114 <Directory ${package}/lib/node_modules/cryptpad/www>
115 AllowOverride None
116 Require all granted
117 DirectoryIndex index.html
118 </Directory>
119 <Directory ${package}/lib/node_modules/cryptpad/customize.dist>
120 AllowOverride None
121 Require all granted
122 DirectoryIndex index.html
123 </Directory>
124 '';
125in
126{
127 options.myServices.tools.cryptpad.farm = {
128 hosts = lib.mkOption {
129 default = {};
130 description = "Hosts to install";
131 type = lib.types.attrsOf (lib.types.submodule {
132 options = {
133 port = lib.mkOption {
134 type = lib.types.port;
135 };
136 package = lib.mkOption {
137 type = lib.types.package;
138 description = "Cryptpad package to use";
139 default = pkgs.cryptpad;
140 };
141 domain = lib.mkOption {
142 type = lib.types.str;
143 description = "Domain for main host";
144 };
145 config = lib.mkOption {
146 type = lib.types.path;
147 description = "Path to configuration";
148 };
149 };
150 });
151 };
152 vhosts = lib.mkOption {
153 description = "Instance vhosts configs";
154 readOnly = true;
155 type = lib.types.attrsOf lib.types.str;
156 default = lib.genAttrs (builtins.attrNames cfg.hosts) toVhost;
157 };
158 vhostRoots = lib.mkOption {
159 description = "Instance vhosts document roots";
160 readOnly = true;
161 type = lib.types.attrsOf lib.types.path;
162 default = lib.genAttrs (builtins.attrNames cfg.hosts) toVhostRoot;
163 };
164 vhostVarDirs = lib.mkOption {
165 description = "Instance vhosts var dirs";
166 readOnly = true;
167 type = lib.types.attrsOf lib.types.path;
168 default = lib.genAttrs (builtins.attrNames cfg.hosts) (n: "/var/lib/cryptpad/${n}");
169 };
170 };
171 config = {
172 users.users = lib.optionalAttrs (cfg.hosts != {}) {
173 cryptpad = {
174 uid = config.ids.uids.cryptpad;
175 group = "cryptpad";
176 description = "Cryptpad user";
177 };
178 };
179 users.groups = lib.optionalAttrs (cfg.hosts != {}) {
180 cryptpad = {
181 gid = config.ids.gids.cryptpad;
182 };
183 };
184 systemd.services = lib.listToAttrs (map (n: lib.nameValuePair "cryptpad-${n}" (toService n)) (builtins.attrNames cfg.hosts));
185 };
186}
diff --git a/systems/eldiron/websites/dav/davical.nix b/systems/eldiron/websites/dav/davical.nix
new file mode 100644
index 0000000..b418cb8
--- /dev/null
+++ b/systems/eldiron/websites/dav/davical.nix
@@ -0,0 +1,128 @@
1{ stdenv, fetchurl, gettext, writeText, env, awl, davical, config }:
2rec {
3 keys."webapps/dav-davical" = {
4 user = apache.user;
5 group = apache.group;
6 permissions = "0400";
7 text = ''
8 <?php
9 $c->pg_connect[] = "dbname=${env.postgresql.database} user=${env.postgresql.user} host=${env.postgresql.socket} password=${env.postgresql.password}";
10
11 $c->readonly_webdav_collections = false;
12
13 $c->admin_email ='davical@tools.immae.eu';
14
15 $c->restrict_setup_to_admin = true;
16
17 $c->collections_always_exist = false;
18
19 $c->external_refresh = 60;
20
21 $c->enable_scheduling = true;
22
23 $c->iMIP = (object) array("send_email" => true);
24
25 $c->authenticate_hook['optional'] = false;
26 $c->authenticate_hook['call'] = 'LDAP_check';
27 $c->authenticate_hook['config'] = array(
28 'host' => '${env.ldap.host}',
29 'port' => '389',
30 'startTLS' => 'yes',
31 'bindDN'=> '${env.ldap.dn}',
32 'passDN'=> '${env.ldap.password}',
33 'protocolVersion' => '3',
34 'baseDNUsers'=> array('ou=users,${env.ldap.base}', 'ou=group_users,${env.ldap.base}'),
35 'filterUsers' => '${env.ldap.filter}',
36 'baseDNGroups' => 'ou=groups,${env.ldap.base}',
37 'filterGroups' => 'memberOf=cn=groups,${env.ldap.dn}',
38 'mapping_field' => array(
39 "username" => "uid",
40 "fullname" => "cn",
41 "email" => "mail",
42 "modified" => "modifyTimestamp",
43 ),
44 'format_updated'=> array('Y' => array(0,4),'m' => array(4,2),'d'=> array(6,2),'H' => array(8,2),'M'=>array(10,2),'S' => array(12,2)),
45 /** used to set default value for all users, will be overcharged by ldap if defined also in mapping_field **/
46 // 'default_value' => array("date_format_type" => "E","locale" => "fr_FR"),
47 'group_mapping_field' => array(
48 "username" => "cn",
49 "updated" => "modifyTimestamp",
50 "fullname" => "givenName",
51 "displayname" => "givenName",
52 "members" => "memberUid",
53 "email" => "mail",
54 ),
55 );
56
57 $c->do_not_sync_from_ldap = array('admin' => true);
58 include('drivers_ldap.php');
59 '';
60 };
61 webapp = davical.override { davical_config = config.secrets.fullPaths."webapps/dav-davical"; };
62 webRoot = "${webapp}/htdocs";
63 apache = rec {
64 user = "wwwrun";
65 group = "wwwrun";
66 modules = [ "proxy_fcgi" ];
67 root = webRoot;
68 vhostConf = socket: ''
69 Alias /davical "${root}"
70 Alias /caldav.php "${root}/caldav.php"
71 <Directory "${root}">
72 DirectoryIndex index.php index.html
73 AcceptPathInfo On
74 AllowOverride None
75 Require all granted
76
77 <FilesMatch "\.php$">
78 CGIPassAuth on
79 SetHandler "proxy:unix:${socket}|fcgi://localhost"
80 </FilesMatch>
81
82 RewriteEngine On
83 <IfModule mod_headers.c>
84 Header unset Access-Control-Allow-Origin
85 Header unset Access-Control-Allow-Methods
86 Header unset Access-Control-Allow-Headers
87 Header unset Access-Control-Allow-Credentials
88 Header unset Access-Control-Expose-Headers
89
90 Header always set Access-Control-Allow-Origin "*"
91 Header always set Access-Control-Allow-Methods "GET,POST,OPTIONS,PROPFIND,PROPPATCH,REPORT,PUT,MOVE,DELETE,LOCK,UNLOCK"
92 Header always set Access-Control-Allow-Headers "User-Agent,Authorization,Content-type,Depth,If-match,If-None-Match,Lock-Token,Timeout,Destination,Overwrite,Prefer,X-client,X-Requested-With"
93 Header always set Access-Control-Allow-Credentials false
94 Header always set Access-Control-Expose-Headers "Etag,Preference-Applied"
95
96 RewriteCond %{HTTP:Access-Control-Request-Method} !^$
97 RewriteCond %{REQUEST_METHOD} OPTIONS
98 RewriteRule ^(.*)$ $1 [R=200,L]
99 </IfModule>
100 </Directory>
101 '';
102 };
103 phpFpm = rec {
104 serviceDeps = [ "postgresql.service" "openldap.service" ];
105 basedir = builtins.concatStringsSep ":" [ webapp config.secrets.fullPaths."webapps/dav-davical" awl ];
106 pool = {
107 "listen.owner" = apache.user;
108 "listen.group" = apache.group;
109 "pm" = "dynamic";
110 "pm.max_children" = "60";
111 "pm.start_servers" = "2";
112 "pm.min_spare_servers" = "1";
113 "pm.max_spare_servers" = "10";
114
115 # Needed to avoid clashes in browser cookies (same domain)
116 "php_value[session.name]" = "DavicalPHPSESSID";
117 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
118 "php_admin_value[include_path]" = "${awl}/inc:${webapp}/inc";
119 "php_admin_value[session.save_handler]" = "redis";
120 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Davical:'";
121 "php_flag[magic_quotes_gpc]" = "Off";
122 "php_flag[register_globals]" = "Off";
123 "php_admin_value[error_reporting]" = "E_ALL & ~E_NOTICE";
124 "php_admin_value[default_charset]" = "utf-8";
125 "php_flag[magic_quotes_runtime]" = "Off";
126 };
127 };
128}
diff --git a/systems/eldiron/websites/dav/default.nix b/systems/eldiron/websites/dav/default.nix
new file mode 100644
index 0000000..109715d
--- /dev/null
+++ b/systems/eldiron/websites/dav/default.nix
@@ -0,0 +1,140 @@
1{ lib, pkgs, config, ... }:
2let
3 infcloud = rec {
4 root = pkgs.webapps-infcloud;
5 vhostConf = ''
6 Alias /carddavmate ${root}
7 Alias /caldavzap ${root}
8 Alias /infcloud ${root}
9 <Directory ${root}>
10 AllowOverride All
11 Options FollowSymlinks
12 Require all granted
13 DirectoryIndex index.html
14 </Directory>
15 '';
16 };
17 davical = pkgs.callPackage ./davical.nix {
18 env = config.myEnv.tools.davical;
19 davical = pkgs.webapps-davical;
20 awl = pkgs.webapps-awl;
21 inherit config;
22 };
23
24 cfg = config.myServices.websites.tools.dav;
25in {
26 options.myServices.websites.tools.dav = {
27 enable = lib.mkEnableOption "enable dav website";
28 };
29
30 config = lib.mkIf cfg.enable {
31 myServices.dns.zones."immae.eu".subdomains.dav =
32 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
33
34 myServices.chatonsProperties.services = {
35 davical = {
36 file.datetime = "2022-08-21T01:33:00";
37 service = {
38 name = "Davical";
39 description = "DAViCal is a server for calendar sharing";
40 website = "https://dav.immae.eu";
41 logo = "https://www.davical.org/images/logo.gif";
42 status.level = "OK";
43 status.description = "OK";
44 registration."" = ["MEMBER" "CLIENT"];
45 registration.load = "OPEN";
46 install.type = "PACKAGE";
47 };
48 software = {
49 name = "Davical";
50 website = "https://www.davical.org/";
51 license.url = "https://gitlab.com/davical-project/davical/-/blob/master/COPYING";
52 license.name = "GNU General Public License Version 2";
53 version = pkgs.webapps-davical.version;
54 source.url = "https://gitlab.com/davical-project/davical/";
55 modules = "infcloud";
56 };
57 };
58 #calendar = {
59 # file.datetime = "2022-08-22T00:00:00";
60 # service = {
61 # name = "Calendar";
62 # description = "Opensource CalDAV web client";
63 # website = "https://dav.immae.eu/caldavzap/";
64 # logo = "https://dav.immae.eu/caldavzap/images/infcloud_logo.svg";
65 # status.level = "OK";
66 # status.description = "OK";
67 # registration."" = ["MEMBER" "CLIENT"];
68 # registration.load = "OPEN";
69 # install.type = "PACKAGE";
70 # };
71 # software = {
72 # name = "InfCloud";
73 # website = "https://inf-it.com/open-source/clients/infcloud/";
74 # license.url = "https://www.gnu.org/licenses/agpl-3.0.en.html";
75 # license.name = "GNU Affero General Public License (version 3.0)";
76 # version = pkgs.webapps-infcloud.version;
77 # source.url = "https://inf-it.com/open-source/clients/infcloud/";
78 # };
79 #};
80 #contacts = {
81 # file.datetime = "2022-08-22T00:00:00";
82 # service = {
83 # name = "Contacts";
84 # description = "Opensource Carddav web client";
85 # website = "https://dav.immae.eu/carddavmate/";
86 # logo = "https://dav.immae.eu/caldavzap/images/infcloud_logo.svg";
87 # status.level = "OK";
88 # status.description = "OK";
89 # registration."" = ["MEMBER" "CLIENT"];
90 # registration.load = "OPEN";
91 # install.type = "PACKAGE";
92 # };
93 # software = {
94 # name = "InfCloud";
95 # website = "https://inf-it.com/open-source/clients/infcloud/";
96 # license.url = "https://www.gnu.org/licenses/agpl-3.0.en.html";
97 # license.name = "GNU Affero General Public License (version 3.0)";
98 # version = pkgs.webapps-infcloud.version;
99 # source.url = "https://inf-it.com/open-source/clients/infcloud/";
100 # };
101 #};
102 };
103 secrets.keys = davical.keys;
104 services.websites.env.tools.modules = davical.apache.modules;
105
106 security.acme.certs.eldiron.extraDomainNames = [ "dav.immae.eu" ];
107 services.websites.env.tools.vhostConfs.dav = {
108 certName = "eldiron";
109 hosts = ["dav.immae.eu" ];
110 root = ./www;
111 extraConfig = [
112 infcloud.vhostConf
113 (davical.apache.vhostConf config.services.phpfpm.pools.davical.socket)
114 ];
115 };
116
117 services.phpfpm.pools = {
118 davical = {
119 user = config.services.websites.env.tools.user;
120 group = config.services.websites.env.tools.group;
121 settings = davical.phpFpm.pool;
122 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
123 };
124 };
125 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
126 myServices.monitoring.fromMasterObjects.service = [
127 {
128 service_description = "davical website is running on dav.immae.eu";
129 host_name = config.hostEnv.fqdn;
130 use = "external-web-service";
131 check_command = ["check_https" "dav.immae.eu" "/davical/" "Log On Please"];
132
133 servicegroups = "webstatus-webapps";
134 _webstatus_name = "Davical";
135 _webstatus_url = "https://dav.immae.eu/davical";
136 }
137 ];
138 };
139}
140
diff --git a/modules/private/websites/tools/dav/www/index.html b/systems/eldiron/websites/dav/www/index.html
index 91c25ba..91c25ba 100644
--- a/modules/private/websites/tools/dav/www/index.html
+++ b/systems/eldiron/websites/dav/www/index.html
diff --git a/systems/eldiron/websites/db/default.nix b/systems/eldiron/websites/db/default.nix
new file mode 100644
index 0000000..339948f
--- /dev/null
+++ b/systems/eldiron/websites/db/default.nix
@@ -0,0 +1,32 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.tools.db;
4in {
5 options.myServices.websites.tools.db = {
6 enable = lib.mkEnableOption "enable database's website";
7 };
8
9 config = lib.mkIf cfg.enable {
10 services.websites.env.tools.modules = [ "proxy_fcgi" ];
11 security.acme.certs.eldiron.extraDomainNames = [ "db-1.immae.eu" ];
12 services.websites.env.tools.vhostConfs.db-1 = {
13 certName = "eldiron";
14 hosts = ["db-1.immae.eu" ];
15 root = null;
16 extraConfig = [ ''
17 Alias /adminer ${pkgs.webapps-adminer}
18 <Directory ${pkgs.webapps-adminer}>
19 DirectoryIndex index.php
20 <FilesMatch "\.php$">
21 SetHandler "proxy:unix:${config.services.phpfpm.pools.adminer.socket}|fcgi://localhost"
22 </FilesMatch>
23
24 Use LDAPConnect
25 Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu
26 Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu
27 </Directory>
28 ''
29 ];
30 };
31 };
32}
diff --git a/systems/eldiron/websites/default.nix b/systems/eldiron/websites/default.nix
new file mode 100644
index 0000000..68205de
--- /dev/null
+++ b/systems/eldiron/websites/default.nix
@@ -0,0 +1,319 @@
1{ lib, pkgs, config, mypackages-lib, ... }:
2let
3 www_root = ./_www;
4 theme_root = (mypackages-lib.apache-theme {}).theme;
5 apacheConfig = {
6 shutdownconfig = {
7 # Only give 5 seconds to workers to finish their work
8 extraConfig = ''
9 GracefulShutdownTimeout 5
10 '';
11 };
12 cache = {
13 # This setting permits to ignore time-based cache for files in the
14 # nix store:
15 # If a client requires an If-Modified-Since from timestamp 1, then
16 # this header is removed, and if the response contains a
17 # too old Last-Modified tag, then it is removed too
18 extraConfig = ''
19 <If "%{HTTP:If-Modified-Since} =~ /01 Jan 1970 00:00:01/" >
20 RequestHeader unset If-Modified-Since
21 </If>
22 Header unset Last-Modified "expr=%{LAST_MODIFIED} < 19991231235959"
23 '';
24 };
25 gzip = {
26 modules = [ "deflate" "filter" ];
27 extraConfig = ''
28 AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
29 '';
30 };
31 macros = {
32 modules = [ "macro" ];
33 };
34 stats = {
35 extraConfig = ''
36 <Macro Stats %{domain}>
37 Alias /webstats ${config.services.webstats.dataDir}/%{domain}
38 <Directory ${config.services.webstats.dataDir}/%{domain}>
39 DirectoryIndex index.html
40 AllowOverride None
41 Require all granted
42 </Directory>
43 <Location /webstats>
44 Use LDAPConnect
45 Require ldap-group cn=%{domain},ou=stats,cn=httpd,ou=services,dc=immae,dc=eu
46 </Location>
47 </Macro>
48 '';
49 };
50 ldap = {
51 modules = [ "ldap" "authnz_ldap" ];
52 extraConfig = ''
53 <IfModule ldap_module>
54 LDAPSharedCacheSize 500000
55 LDAPCacheEntries 1024
56 LDAPCacheTTL 600
57 LDAPOpCacheEntries 1024
58 LDAPOpCacheTTL 600
59 </IfModule>
60
61 Include ${config.secrets.fullPaths."apache-ldap"}
62 '';
63 };
64 global = {
65 extraConfig = ''
66 ErrorDocument 500 /maintenance_immae.html
67 ErrorDocument 501 /maintenance_immae.html
68 ErrorDocument 502 /maintenance_immae.html
69 ErrorDocument 503 /maintenance_immae.html
70 ErrorDocument 504 /maintenance_immae.html
71 Alias /maintenance_immae.html ${www_root}/maintenance_immae.html
72 ProxyPass /maintenance_immae.html !
73
74 AliasMatch "(.*)/googleb6d69446ff4ca3e5.html" ${www_root}/googleb6d69446ff4ca3e5.html
75 <Directory ${www_root}>
76 AllowOverride None
77 Require all granted
78 </Directory>
79 '';
80 };
81 apaxy = {
82 extraConfig = (mypackages-lib.apache-theme { inherit theme_root; }).apacheConfig;
83 };
84 http2 = {
85 modules = [ "http2" ];
86 extraConfig = ''
87 Protocols h2 http/1.1
88 '';
89 };
90 customLog = {
91 extraConfig = ''
92 LogFormat "%{Host}i:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedVhost
93 '';
94 };
95 };
96 makeModules = lib.lists.flatten (lib.attrsets.mapAttrsToList (n: v: v.modules or []) apacheConfig);
97 makeExtraConfig = (builtins.filter (x: x != null) (lib.attrsets.mapAttrsToList (n: v: v.extraConfig or null) apacheConfig));
98 moomin = let
99 lines = lib.splitString "\n" (lib.fileContents ./moomin.txt);
100 pad = width: str: let
101 padWidth = width - lib.stringLength str;
102 padding = lib.concatStrings (lib.genList (lib.const "0") padWidth);
103 in lib.optionalString (padWidth > 0) padding + str;
104 in
105 lib.imap0 (i: e: ''Header always set "X-Moomin-${pad 2 (builtins.toString i)}" "${e}"'') lines;
106in
107{
108 imports = [
109 ./immae/production.nix
110 ./immae/release.nix
111
112 # Tools
113 ./assets
114 ./cloud
115 ./cloud/farm.nix
116 ./cryptpad
117 ./cryptpad/farm.nix
118 ./commento
119 ./dav
120 ./vpn
121 ./db
122 ./diaspora
123 ./ether
124 ./git
125 ./im
126 ./mastodon
127 ./mgoblin
128 ./peertube
129 ./performance
130 ./tools
131 ./mail
132 ./stats
133 ./visio
134 ./kanboard/farm.nix
135
136 # Games
137 ./games/codenames
138 ./games/terraforming-mars
139 ];
140
141 options.myServices.websites.enable = lib.mkEnableOption "enable websites";
142
143 config = lib.mkIf config.myServices.websites.enable {
144 myServices.dns.zones."immae.eu".subdomains = with config.myServices.dns.helpers;
145 {
146 games = ips servers.eldiron.ips.main;
147 nossl = ips servers.eldiron.ips.main;
148 };
149
150 myServices.chatonsProperties.hostings.web = {
151 file.datetime = "2022-08-22T01:30:00";
152 hosting = {
153 name = "Hébergement Web";
154 description = "Service d'hébergement web avec php/mysql/postgresql";
155 website = "https://www.immae.eu";
156 status.level = "OK";
157 status.description = "OK";
158 registration.load = "OPEN";
159 install.type = "PACKAGE";
160 };
161 software = {
162 name = "Apache Httpd";
163 website = "https://httpd.apache.org/";
164 license.url = "https://www.apache.org/licenses/";
165 license.name = "Apache License Version 2";
166 version = pkgs.apacheHttpd.version;
167 source.url = "https://httpd.apache.org/download.cgi";
168 modules = "openssh,pure-ftpd";
169 };
170 };
171 users.users.wwwrun.extraGroups = [ "keys" ];
172 networking.firewall.allowedTCPPorts = [ 80 443 ];
173
174 secrets.keys."apache-ldap" = {
175 user = "wwwrun";
176 group = "wwwrun";
177 permissions = "0400";
178 text = ''
179 <Macro LDAPConnect>
180 <IfModule authnz_ldap_module>
181 AuthLDAPURL ldap://ldap.immae.eu:389/dc=immae,dc=eu STARTTLS
182 AuthLDAPBindDN cn=httpd,ou=services,dc=immae,dc=eu
183 AuthLDAPBindPassword "${config.myEnv.httpd.ldap.password}"
184 AuthType Basic
185 AuthName "Authentification requise (Acces LDAP)"
186 AuthBasicProvider ldap
187 </IfModule>
188 </Macro>
189 '';
190 };
191
192 system.activationScripts = {
193 httpd = ''
194 install -d -m 0755 /var/lib/acme/acme-challenges
195 install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php/sessions
196 '';
197 };
198
199 services.phpfpm = {
200 phpOptions = ''
201 session.save_path = "/var/lib/php/sessions"
202 post_max_size = 20M
203 ; 15 days (seconds)
204 session.gc_maxlifetime = 1296000
205 ; 30 days (minutes)
206 session.cache_expire = 43200
207 '';
208 settings = {
209 log_level = "notice";
210 };
211 };
212
213 services.websites.env.production = {
214 enable = true;
215 moduleType = "container";
216 adminAddr = "httpd@immae.eu";
217 bindMounts."/var/lib/ftp" = {};
218 # FIXME: Bind directly the needed files
219 bindMounts."/var/secrets" = {};
220 bindMounts."/var/lib/goaccess" = {};
221 bindMounts."/var/lib/acme" = {};
222 bindMounts."/run/phpfpm" = {};
223 ips =
224 let ips = config.myEnv.servers.eldiron.ips.production;
225 in (ips.ip4 or []) ++ (ips.ip6 or []);
226 modules = makeModules;
227 extraConfig = makeExtraConfig;
228 fallbackVhost = {
229 certName = "eldiron";
230 hosts = ["eldiron.immae.eu" ];
231 root = www_root;
232 extraConfig = [ "DirectoryIndex index.htm" ];
233 };
234 };
235
236 services.websites.env.integration = {
237 enable = true;
238 moduleType = "container";
239 adminAddr = "httpd@immae.eu";
240 bindMounts."/var/lib/ftp" = {};
241 bindMounts."/var/secrets" = {};
242 bindMounts."/var/lib/goaccess" = {};
243 bindMounts."/var/lib/acme" = {};
244 bindMounts."/run/phpfpm" = {};
245 ips =
246 let ips = config.myEnv.servers.eldiron.ips.integration;
247 in (ips.ip4 or []) ++ (ips.ip6 or []);
248 modules = makeModules;
249 extraConfig = makeExtraConfig ++ moomin;
250 fallbackVhost = {
251 certName = "integration";
252 hosts = ["eldiron.immae.eu" ];
253 root = www_root;
254 extraConfig = [ "DirectoryIndex index.htm" ];
255 };
256 watchPaths = [ config.secrets.fullPaths."apache-ldap" ];
257 };
258
259 services.websites.env.tools = {
260 enable = true;
261 moduleType = "main";
262 adminAddr = "httpd@immae.eu";
263 ips =
264 let ips = config.myEnv.servers.eldiron.ips.main;
265 in (ips.ip4 or []) ++ (ips.ip6 or []);
266 modules = makeModules;
267 extraConfig = makeExtraConfig ++
268 [ ''
269 RedirectMatch ^/licen[cs]es?_et_tip(ping)?$ https://www.immae.eu/licences_et_tip.html
270 RedirectMatch ^/licen[cs]es?_and_tip(ping)?$ https://www.immae.eu/licenses_and_tipping.html
271 RedirectMatch ^/licen[cs]es?$ https://www.immae.eu/licenses_and_tipping.html
272 RedirectMatch ^/tip(ping)?$ https://www.immae.eu/licenses_and_tipping.html
273 RedirectMatch ^/(mentions|mentions_legales|legal)$ https://www.immae.eu/mentions.html
274 RedirectMatch ^/CGU$ https://www.immae.eu/CGU
275 ''
276 ];
277 nosslVhost = {
278 enable = true;
279 host = "nossl.immae.eu";
280 root = ./nossl;
281 };
282 fallbackVhost = {
283 certName = "eldiron";
284 hosts = ["eldiron.immae.eu" ];
285 root = www_root;
286 extraConfig = [ "DirectoryIndex index.htm" ];
287 };
288 watchPaths = [ config.secrets.fullPaths."apache-ldap" ];
289 };
290
291 myServices.websites = {
292 immae = {
293 production.enable = true;
294 release.enable = true;
295 };
296
297 tools.assets.enable = true;
298 tools.cloud.enable = true;
299 tools.commento.enable = true;
300 tools.cryptpad.enable = true;
301 tools.dav.enable = true;
302 tools.db.enable = true;
303 tools.diaspora.enable = true;
304 tools.etherpad-lite.enable = true;
305 tools.git.enable = true;
306 tools.mastodon.enable = true;
307 tools.mediagoblin.enable = true;
308 tools.peertube.enable = true;
309 tools.performance.enable = true;
310 tools.tools.enable = true;
311 tools.email.enable = true;
312 tools.stats.enable = false;
313 tools.visio.enable = true;
314
315 games.codenames.enable = true;
316 games.terraforming-mars.enable = true;
317 };
318 };
319}
diff --git a/systems/eldiron/websites/diaspora/default.nix b/systems/eldiron/websites/diaspora/default.nix
new file mode 100644
index 0000000..c536446
--- /dev/null
+++ b/systems/eldiron/websites/diaspora/default.nix
@@ -0,0 +1,224 @@
1{ lib, pkgs, config, ... }:
2let
3 env = config.myEnv.tools.diaspora;
4 root = "${dcfg.workdir}/public/";
5 cfg = config.myServices.websites.tools.diaspora;
6 dcfg = config.services.diaspora;
7in {
8 options.myServices.websites.tools.diaspora = {
9 enable = lib.mkEnableOption "enable diaspora's website";
10 };
11
12 config = lib.mkIf cfg.enable {
13 myServices.dns.zones."immae.eu".subdomains.diaspora =
14 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
15
16 myServices.chatonsProperties.services.diaspora = {
17 file.datetime = "2022-08-21T01:39:00";
18 service = {
19 name = "Diaspora";
20 description = "The online social world where you are in control";
21 website = "https://diaspora.immae.eu";
22 logo = "https://diaspora.immae.eu/assets/apple-touch-icon-9f7c9cc3923b4817fbb25bfeb0dd5fd34638827fd9c82b5a03f7b68e6e90806f.png";
23 status.level = "OK";
24 status.description = "OK";
25 registration."" = ["MEMBER" "CLIENT"];
26 registration.load = "OPEN";
27 install.type = "PACKAGE";
28 };
29 software = {
30 name = "Diaspora*";
31 website = "https://diasporafoundation.org/";
32 license.url = "https://github.com/diaspora/diaspora/blob/develop/LICENSE";
33 license.name = "GNU Affero General Public License v3.0";
34 version = dcfg.package.version;
35 source.url = "https://github.com/diaspora/diaspora";
36 };
37 };
38 users.users.diaspora.extraGroups = [ "keys" ];
39
40 secrets.keys = {
41 "webapps/diaspora" = {
42 isDir = true;
43 user = "diaspora";
44 group = "diaspora";
45 permissions = "0500";
46 };
47 "webapps/diaspora/diaspora.yml" = {
48 user = "diaspora";
49 group = "diaspora";
50 permissions = "0400";
51 keyDependencies = [ pkgs.cacert ];
52 text = ''
53 configuration:
54 environment:
55 url: "https://diaspora.immae.eu/"
56 certificate_authorities: '${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt'
57 redis: 'redis://${env.redis.host}:${env.redis.port}/${env.redis.db}'
58 sidekiq:
59 s3:
60 assets:
61 logging:
62 logrotate:
63 debug:
64 server:
65 listen: '${dcfg.sockets.rails}'
66 rails_environment: 'production'
67 chat:
68 server:
69 bosh:
70 log:
71 map:
72 mapbox:
73 privacy:
74 piwik:
75 statistics:
76 camo:
77 settings:
78 enable_registrations: false
79 welcome_message:
80 invitations:
81 open: false
82 paypal_donations:
83 community_spotlight:
84 captcha:
85 enable: false
86 terms:
87 maintenance:
88 remove_old_users:
89 default_metas:
90 csp:
91 services:
92 twitter:
93 tumblr:
94 wordpress:
95 mail:
96 enable: true
97 sender_address: 'diaspora@tools.immae.eu'
98 method: 'sendmail'
99 smtp:
100 sendmail:
101 location: '/run/wrappers/bin/sendmail'
102 admins:
103 account: "ismael"
104 podmin_email: 'diaspora@tools.immae.eu'
105 relay:
106 outbound:
107 inbound:
108 ldap:
109 enable: true
110 host: ${env.ldap.host}
111 port: 636
112 only_ldap: true
113 mail_attribute: mail
114 skip_email_confirmation: true
115 use_bind_dn: true
116 bind_dn: "${env.ldap.dn}"
117 bind_pw: "${env.ldap.password}"
118 search_base: "${env.ldap.base}"
119 search_filter: "${env.ldap.filter}"
120 production:
121 environment:
122 development:
123 environment:
124 '';
125 };
126 "webapps/diaspora/database.yml" = {
127 user = "diaspora";
128 group = "diaspora";
129 permissions = "0400";
130 text = ''
131 postgresql: &postgresql
132 adapter: postgresql
133 host: "${env.postgresql.socket}"
134 port: "${env.postgresql.port}"
135 username: "${env.postgresql.user}"
136 password: "${env.postgresql.password}"
137 encoding: unicode
138 common: &common
139 <<: *postgresql
140 combined: &combined
141 <<: *common
142 development:
143 <<: *combined
144 database: diaspora_development
145 production:
146 <<: *combined
147 database: ${env.postgresql.database}
148 test:
149 <<: *combined
150 database: "diaspora_test"
151 integration1:
152 <<: *combined
153 database: diaspora_integration1
154 integration2:
155 <<: *combined
156 database: diaspora_integration2
157 '';
158 };
159 "webapps/diaspora/secret_token.rb" = {
160 user = "diaspora";
161 group = "diaspora";
162 permissions = "0400";
163 text = ''
164 Diaspora::Application.config.secret_key_base = '${env.secret_token}'
165 '';
166 };
167 };
168
169 services.diaspora = {
170 enable = true;
171 withLdap = true;
172 dataDir = "/var/lib/diaspora_immae";
173 adminEmail = "diaspora@tools.immae.eu";
174 configDir = config.secrets.fullPaths."webapps/diaspora";
175 };
176
177 services.filesWatcher.diaspora = {
178 restart = true;
179 paths = [ dcfg.configDir ];
180 };
181
182 services.websites.env.tools.modules = [
183 "headers" "proxy" "proxy_http"
184 ];
185 security.acme.certs.eldiron.extraDomainNames = [ "diaspora.immae.eu" ];
186 services.websites.env.tools.vhostConfs.diaspora = {
187 certName = "eldiron";
188 hosts = [ "diaspora.immae.eu" ];
189 root = root;
190 extraConfig = [ ''
191 RewriteEngine On
192 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
193 RewriteRule ^/(.*)$ unix://${dcfg.sockets.rails}|http://diaspora.immae.eu/%{REQUEST_URI} [P,NE,QSA,L]
194
195 ProxyRequests Off
196 ProxyVia On
197 ProxyPreserveHost On
198 RequestHeader set X_FORWARDED_PROTO https
199
200 <Proxy *>
201 Require all granted
202 </Proxy>
203
204 <Directory ${root}>
205 Require all granted
206 Options -MultiViews
207 </Directory>
208 '' ];
209 };
210 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
211 myServices.monitoring.fromMasterObjects.service = [
212 {
213 service_description = "diaspora website is running on diaspora.immae.eu";
214 host_name = config.hostEnv.fqdn;
215 use = "external-web-service";
216 check_command = ["check_https" "diaspora.immae.eu" "/" "is the online social world where you are in control"];
217
218 servicegroups = "webstatus-webapps";
219 _webstatus_name = "Diaspora";
220 _webstatus_url = "https://diaspora.immae.eu/";
221 }
222 ];
223 };
224}
diff --git a/systems/eldiron/websites/ether/default.nix b/systems/eldiron/websites/ether/default.nix
new file mode 100644
index 0000000..3993553
--- /dev/null
+++ b/systems/eldiron/websites/ether/default.nix
@@ -0,0 +1,251 @@
1{ lib, pkgs, config, nixpkgsRaw, etherpad-lite, ... }:
2let
3 env = config.myEnv.tools.etherpad-lite;
4 cfg = config.myServices.websites.tools.etherpad-lite;
5 # Make sure we’re not rebuilding whole libreoffice just because of a
6 # dependency
7 libreoffice = nixpkgsRaw.libreoffice-fresh;
8 ecfg = config.services.etherpad-lite;
9in {
10 options.myServices.websites.tools.etherpad-lite = {
11 enable = lib.mkEnableOption "enable etherpad's website";
12 };
13
14 config = lib.mkIf cfg.enable {
15 myServices.dns.zones."immae.eu".subdomains.ether =
16 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
17
18 myServices.chatonsProperties.services.etherpad = {
19 file.datetime = "2021-01-04T00:01:00";
20 service = {
21 name = "Etherpad";
22 description = "Éditeur de texte collaboratif en temps réel. on peut y écrire simultanément.";
23 website = "https://ether.immae.eu";
24 logo = "https://ether.immae.eu/favicon.ico";
25 status.level = "OK";
26 status.description = "OK";
27 registration."" = ["NONE" "MEMBER" "CLIENT"];
28 registration.load = "OPEN";
29 install.type = "PACKAGE";
30 };
31 software = {
32 name = "Etherpad";
33 website = "https://etherpad.org/";
34 license.url = "https://github.com/ether/etherpad-lite/blob/develop/LICENSE";
35 license.name = "Apache License Version 2.0";
36 version = ecfg.package.version;
37 source.url = "https://github.com/ether/etherpad-lite";
38 modules = ecfg.package.moduleNames;
39 };
40 };
41 secrets.keys = {
42 "webapps/tools-etherpad-apikey" = {
43 permissions = "0400";
44 text = env.api_key;
45 };
46 "webapps/tools-etherpad-sessionkey" = {
47 permissions = "0400";
48 text = env.session_key;
49 };
50 "webapps/tools-etherpad" = {
51 permissions = "0400";
52 keyDependencies = [ libreoffice ];
53 text = ''
54 {
55 "title": "Etherpad",
56 "favicon": "favicon.ico",
57 "skinName": "colibris",
58 "skinVariants": "dark-toolbar light-background super-light-editor full-width-editor",
59
60 "ip": "",
61 "port" : "${ecfg.sockets.node}",
62 "showSettingsInAdminPage" : false,
63 "dbType" : "postgres",
64 "dbSettings" : {
65 "user" : "${env.postgresql.user}",
66 "host" : "${env.postgresql.socket}",
67 "password": "${env.postgresql.password}",
68 "database": "${env.postgresql.database}",
69 "charset" : "utf8mb4"
70 },
71
72 "defaultPadText" : "Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nGet involved with Etherpad at http:\/\/etherpad.org\n",
73 "padOptions": {
74 "noColors": false,
75 "showControls": true,
76 "showChat": true,
77 "showLineNumbers": true,
78 "useMonospaceFont": false,
79 "userName": false,
80 "userColor": false,
81 "rtl": false,
82 "alwaysShowChat": false,
83 "chatAndUsers": false,
84 "lang": "fr"
85 },
86
87 "suppressErrorsInPadText" : false,
88 "requireSession" : false,
89 "editOnly" : false,
90 "sessionNoPassword" : false,
91 "minify" : false,
92 "maxAge" : 21600,
93 "abiword" : null,
94 "soffice" : "${libreoffice}/bin/soffice",
95 "tidyHtml" : "",
96 "allowUnknownFileEnds" : true,
97 "requireAuthentication" : false,
98 "requireAuthorization" : false,
99 "trustProxy" : true,
100 "disableIPlogging" : false,
101 "automaticReconnectionTimeout" : 0,
102 "scrollWhenFocusLineIsOutOfViewport": {
103 "percentage": {
104 "editionAboveViewport": 0,
105 "editionBelowViewport": 0
106 },
107 "duration": 0,
108 "scrollWhenCaretIsInTheLastLineOfViewport": false,
109 "percentageToScrollWhenUserPressesArrowUp": 0
110 },
111 "users": {
112 "admin": {
113 "password": "${env.adminPassword}",
114 "is_admin": true
115 },
116 "ldapauth": {
117 "hash": "invalid",
118 "url": "ldaps://${env.ldap.host}",
119 "accountBase": "${env.ldap.base}",
120 "accountPattern": "${env.ldap.filter}",
121 "displayNameAttribute": "cn",
122 "searchDN": "${env.ldap.dn}",
123 "searchPWD": "${env.ldap.password}",
124 "groupSearchBase": "${env.ldap.base}",
125 "groupAttribute": "member",
126 "groupAttributeIsDN": true,
127 "searchScope": "sub",
128 "groupSearch": "${env.ldap.group_filter}",
129 "anonymousReadonly": false
130 }
131 },
132 "ep_mypads": {
133 "warning": "This hash is stored in database, changing anything here will not have any consequence",
134 "ldap": {
135 "url": "ldaps://${env.ldap.host}",
136 "bindDN": "${env.ldap.dn}",
137 "bindCredentials": "${env.ldap.password}",
138 "searchBase": "${env.ldap.base}",
139 "searchFilter": "${env.ldap.filter}",
140 "properties": {
141 "login": "uid",
142 "email": "mail",
143 "firstname": "givenName",
144 "lastname": "sn"
145 },
146 "defaultLang": "fr"
147 }
148 },
149 "ep_comments_page": {
150 "displayCommentAsIcon": true,
151 "highlightSelectedText": true
152 },
153 "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"],
154 "loadTest": false,
155 "indentationOnNewLine": false,
156 "toolbar": {
157 "left": [
158 ["bold", "italic", "underline", "strikethrough"],
159 ["orderedlist", "unorderedlist", "indent", "outdent"],
160 ["undo", "redo"],
161 ["clearauthorship"]
162 ],
163 "right": [
164 ["importexport", "timeslider", "savedrevision"],
165 ["settings", "embed"],
166 ["showusers"]
167 ],
168 "timeslider": [
169 ["timeslider_export", "timeslider_returnToPad"]
170 ]
171 },
172 "loglevel": "INFO",
173 "logconfig" : { "appenders": [ { "type": "console" } ] }
174 }
175 '';
176 };
177 };
178 services.etherpad-lite = {
179 enable = true;
180 package = etherpad-lite.withModules (p: [
181 p.ep_align p.ep_bookmark p.ep_colors p.ep_comments_page
182 p.ep_cursortrace p.ep_delete_empty_pads p.ep_embedmedia
183 p.ep_font_size p.ep_headings2 p.ep_immae_buttons p.ep_ldapauth
184 p.ep_line_height p.ep_markdown p.ep_mypads p.ep_page_view
185 p.ep_previewimages p.ep_ruler p.ep_scrollto
186 p.ep_set_title_on_pad p.ep_subscript_and_superscript
187 p.ep_timesliderdiff
188 ]);
189 modules = [];
190 sessionKeyFile = config.secrets.fullPaths."webapps/tools-etherpad-sessionkey";
191 apiKeyFile = config.secrets.fullPaths."webapps/tools-etherpad-apikey";
192 configFile = config.secrets.fullPaths."webapps/tools-etherpad";
193 };
194
195 systemd.services.etherpad-lite.serviceConfig.SupplementaryGroups = "keys";
196 systemd.services.etherpad-lite-cleanup.serviceConfig.SupplementaryGroups = "keys";
197 # Needed so that they get in the closure
198 systemd.services.etherpad-lite.path = [ libreoffice pkgs.html-tidy ];
199
200 services.filesWatcher.etherpad-lite = {
201 restart = true;
202 paths = [ ecfg.sessionKeyFile ecfg.apiKeyFile ecfg.configFile ];
203 };
204
205 services.websites.env.tools.modules = [
206 "headers" "proxy" "proxy_http" "proxy_wstunnel"
207 ];
208 security.acme.certs.eldiron.extraDomainNames = [ "ether.immae.eu" ];
209 services.websites.env.tools.vhostConfs.etherpad-lite = {
210 certName = "eldiron";
211 hosts = [ "ether.immae.eu" ];
212 root = null;
213 extraConfig = [ ''
214 Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
215 RequestHeader set X-Forwarded-Proto "https"
216
217 RewriteEngine On
218
219 RewriteCond %{REQUEST_URI} ^/socket.io [NC]
220 RewriteCond %{QUERY_STRING} transport=websocket [NC]
221 RewriteRule /(.*) unix://${ecfg.sockets.node}|ws://ether.immae.eu/$1 [P,NE,QSA,L]
222
223 <IfModule mod_proxy.c>
224 ProxyVia On
225 ProxyRequests Off
226 ProxyPreserveHost On
227 ProxyPass / unix://${ecfg.sockets.node}|http://ether.immae.eu/
228 ProxyPassReverse / unix://${ecfg.sockets.node}|http://ether.immae.eu/
229 <Proxy *>
230 Options FollowSymLinks MultiViews
231 AllowOverride None
232 Require all granted
233 </Proxy>
234 </IfModule>
235 '' ];
236 };
237 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
238 myServices.monitoring.fromMasterObjects.service = [
239 {
240 service_description = "etherpad website is running on ether.immae.eu";
241 host_name = config.hostEnv.fqdn;
242 use = "external-web-service";
243 check_command = ["check_https" "ether.immae.eu" "/" "<title>Etherpad"];
244
245 servicegroups = "webstatus-webapps";
246 _webstatus_name = "Etherpad";
247 _webstatus_url = "https://ether.immae.eu/";
248 }
249 ];
250 };
251}
diff --git a/modules/private/websites/tools/games/codenames/codenames.patch b/systems/eldiron/websites/games/codenames/codenames.patch
index 9faf069..9faf069 100644
--- a/modules/private/websites/tools/games/codenames/codenames.patch
+++ b/systems/eldiron/websites/games/codenames/codenames.patch
diff --git a/systems/eldiron/websites/games/codenames/default.nix b/systems/eldiron/websites/games/codenames/default.nix
new file mode 100644
index 0000000..7f09cc3
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/default.nix
@@ -0,0 +1,76 @@
1{ config, lib, pkgs, ... }:
2let
3 greenapid = pkgs.callPackage ./greenapid.nix {};
4 frontend = pkgs.callPackage ./frontend.nix { nodeEnv = pkgs.callPackage pkgs.mylibs.nodeEnv {}; };
5 wordlists = pkgs.runCommand "wordlists" {} ''
6 mkdir -p $out
7 cp -r ${./wordlists} $out/wordlists
8 '';
9 cfg = config.myServices.websites.games.codenames;
10in
11{
12 options.myServices.websites.games.codenames.enable = lib.mkEnableOption "Enable Codenames game";
13 config = lib.mkIf cfg.enable {
14 myServices.dns.zones."immae.eu".subdomains.games.subdomains.codenames = with config.myServices.dns.helpers;
15 ips servers.eldiron.ips.main;
16
17 myServices.chatonsProperties.services.codenames = {
18 file.datetime = "2022-08-27T14:08:00";
19 service = {
20 name = "Codenames Green";
21 description = "Co-op codenames app";
22 website = "https://codenames.games.immae.eu/";
23 logo = "https://codenames.games.immae.eu/images/apple-touch-icon.png";
24 status.level = "OK";
25 status.description = "OK";
26 registration."" = ["NONE"];
27 registration.load = "OPEN";
28 install.type = "PACKAGE";
29 };
30 software = {
31 name = "Codenames Green";
32 website = "https://www.codenamesgreen.com/";
33 license.url = "https://github.com/jbowens/codenamesgreen/blob/master/package.json";
34 license.name = "MIT";
35 version = greenapid.version;
36 source.url = "https://github.com/jbowens/codenamesgreen";
37 };
38 };
39 systemd.services.codenames_api = {
40 description = "Api for codenames game";
41 wantedBy = [ "multi-user.target" ];
42 script = "${greenapid}/bin/greenapid";
43 postStart = ''
44 sleep 5;
45 chown :wwwrun /run/codenamesgreen/socket.sock
46 chmod g+w /run/codenamesgreen/socket.sock
47 '';
48 serviceConfig = {
49 User = "codenames";
50 DynamicUser = true;
51 SupplementaryGroups = [ "wwwrun" ];
52 Type = "simple";
53 RuntimeDirectory = "codenamesgreen";
54 WorkingDirectory = builtins.toString wordlists;
55 };
56 };
57
58 security.acme.certs.games.domain = "games.immae.eu";
59 security.acme.certs.games.extraDomainNames = [ "codenames.games.immae.eu" ];
60 services.websites.env.tools.vhostConfs.games_codenames = {
61 certName = "games";
62 hosts = [ "codenames.games.immae.eu" ];
63 root = frontend;
64 extraConfig = [
65 ''
66 ProxyPass /api/ unix:///run/codenamesgreen/socket.sock|http://codenames.games.immae.eu/
67 ProxyPassReverse /api/ unix:///run/codenamesgreen/socket.sock|http://codenames.games.immae.eu/
68
69 <Directory ${frontend}>
70 FallbackResource index.html
71 </Directory>
72 ''
73 ];
74 };
75 };
76}
diff --git a/modules/private/websites/tools/games/codenames/deps.nix b/systems/eldiron/websites/games/codenames/deps.nix
index fddec2e..fddec2e 100644
--- a/modules/private/websites/tools/games/codenames/deps.nix
+++ b/systems/eldiron/websites/games/codenames/deps.nix
diff --git a/modules/private/websites/tools/games/codenames/elm-srcs.nix b/systems/eldiron/websites/games/codenames/elm-srcs.nix
index 031e7ff..031e7ff 100644
--- a/modules/private/websites/tools/games/codenames/elm-srcs.nix
+++ b/systems/eldiron/websites/games/codenames/elm-srcs.nix
diff --git a/modules/private/websites/tools/games/codenames/frontend.nix b/systems/eldiron/websites/games/codenames/frontend.nix
index 0f29070..0f29070 100644
--- a/modules/private/websites/tools/games/codenames/frontend.nix
+++ b/systems/eldiron/websites/games/codenames/frontend.nix
diff --git a/modules/private/websites/tools/games/codenames/greenapid.nix b/systems/eldiron/websites/games/codenames/greenapid.nix
index 52bda3b..52bda3b 100644
--- a/modules/private/websites/tools/games/codenames/greenapid.nix
+++ b/systems/eldiron/websites/games/codenames/greenapid.nix
diff --git a/modules/private/websites/tools/games/codenames/greenapid.patch b/systems/eldiron/websites/games/codenames/greenapid.patch
index 21a9fad..21a9fad 100644
--- a/modules/private/websites/tools/games/codenames/greenapid.patch
+++ b/systems/eldiron/websites/games/codenames/greenapid.patch
diff --git a/systems/eldiron/websites/games/codenames/immae-assets.patch b/systems/eldiron/websites/games/codenames/immae-assets.patch
new file mode 100644
index 0000000..c53ab97
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/immae-assets.patch
@@ -0,0 +1,15 @@
1diff --git a/src/index.html b/src/index.html
2index 2559a37..84a0d64 100644
3--- a/src/index.html
4+++ b/src/index.html
5@@ -6,8 +6,8 @@
6 <meta name="description" content="Online cooperative codenames game. Play with two or more players.">
7 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
8 <meta name="theme-color" content="#ffffff">
9- <link href="https://fonts.googleapis.com/css?family=Exo+2&display=swap" rel="stylesheet">
10- <link href="https://unpkg.com/ionicons@4.5.10-0/dist/css/ionicons.min.css" rel="stylesheet">
11+ <link href="https://assets.immae.eu/fonts/Exo2_swap/font.css" rel="stylesheet">
12+ <link href="https://assets.immae.eu/ionicons/4.5.10-0/dist/css/ionicons.min.css" rel="stylesheet">
13 <link rel="manifest" href="/codenames.manifest">
14 <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png">
15 <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png">
diff --git a/systems/eldiron/websites/games/codenames/node-packages.nix b/systems/eldiron/websites/games/codenames/node-packages.nix
new file mode 100644
index 0000000..1fb2db3
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/node-packages.nix
@@ -0,0 +1,7622 @@
1# This file has been generated by node2nix 1.8.0. Do not edit!
2
3{nodeEnv, fetchurl, fetchgit, fetchFromGitHub, runCommand, globalBuildInputs ? []}:
4
5let
6 sources = {
7 "@babel/code-frame-7.0.0" = {
8 name = "_at_babel_slash_code-frame";
9 packageName = "@babel/code-frame";
10 version = "7.0.0";
11 src = fetchurl {
12 url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz";
13 sha512 = "OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==";
14 };
15 };
16 "@babel/code-frame-7.8.3" = {
17 name = "_at_babel_slash_code-frame";
18 packageName = "@babel/code-frame";
19 version = "7.8.3";
20 src = fetchurl {
21 url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz";
22 sha512 = "a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==";
23 };
24 };
25 "@babel/core-7.3.4" = {
26 name = "_at_babel_slash_core";
27 packageName = "@babel/core";
28 version = "7.3.4";
29 src = fetchurl {
30 url = "https://registry.npmjs.org/@babel/core/-/core-7.3.4.tgz";
31 sha512 = "jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA==";
32 };
33 };
34 "@babel/generator-7.3.4" = {
35 name = "_at_babel_slash_generator";
36 packageName = "@babel/generator";
37 version = "7.3.4";
38 src = fetchurl {
39 url = "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz";
40 sha512 = "8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==";
41 };
42 };
43 "@babel/generator-7.9.5" = {
44 name = "_at_babel_slash_generator";
45 packageName = "@babel/generator";
46 version = "7.9.5";
47 src = fetchurl {
48 url = "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz";
49 sha512 = "GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==";
50 };
51 };
52 "@babel/helper-annotate-as-pure-7.8.3" = {
53 name = "_at_babel_slash_helper-annotate-as-pure";
54 packageName = "@babel/helper-annotate-as-pure";
55 version = "7.8.3";
56 src = fetchurl {
57 url = "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz";
58 sha512 = "6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==";
59 };
60 };
61 "@babel/helper-builder-binary-assignment-operator-visitor-7.8.3" = {
62 name = "_at_babel_slash_helper-builder-binary-assignment-operator-visitor";
63 packageName = "@babel/helper-builder-binary-assignment-operator-visitor";
64 version = "7.8.3";
65 src = fetchurl {
66 url = "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz";
67 sha512 = "5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==";
68 };
69 };
70 "@babel/helper-builder-react-jsx-7.9.0" = {
71 name = "_at_babel_slash_helper-builder-react-jsx";
72 packageName = "@babel/helper-builder-react-jsx";
73 version = "7.9.0";
74 src = fetchurl {
75 url = "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz";
76 sha512 = "weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==";
77 };
78 };
79 "@babel/helper-create-regexp-features-plugin-7.8.8" = {
80 name = "_at_babel_slash_helper-create-regexp-features-plugin";
81 packageName = "@babel/helper-create-regexp-features-plugin";
82 version = "7.8.8";
83 src = fetchurl {
84 url = "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz";
85 sha512 = "LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==";
86 };
87 };
88 "@babel/helper-define-map-7.8.3" = {
89 name = "_at_babel_slash_helper-define-map";
90 packageName = "@babel/helper-define-map";
91 version = "7.8.3";
92 src = fetchurl {
93 url = "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz";
94 sha512 = "PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==";
95 };
96 };
97 "@babel/helper-explode-assignable-expression-7.8.3" = {
98 name = "_at_babel_slash_helper-explode-assignable-expression";
99 packageName = "@babel/helper-explode-assignable-expression";
100 version = "7.8.3";
101 src = fetchurl {
102 url = "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz";
103 sha512 = "N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==";
104 };
105 };
106 "@babel/helper-function-name-7.9.5" = {
107 name = "_at_babel_slash_helper-function-name";
108 packageName = "@babel/helper-function-name";
109 version = "7.9.5";
110 src = fetchurl {
111 url = "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz";
112 sha512 = "JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==";
113 };
114 };
115 "@babel/helper-get-function-arity-7.8.3" = {
116 name = "_at_babel_slash_helper-get-function-arity";
117 packageName = "@babel/helper-get-function-arity";
118 version = "7.8.3";
119 src = fetchurl {
120 url = "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz";
121 sha512 = "FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==";
122 };
123 };
124 "@babel/helper-hoist-variables-7.8.3" = {
125 name = "_at_babel_slash_helper-hoist-variables";
126 packageName = "@babel/helper-hoist-variables";
127 version = "7.8.3";
128 src = fetchurl {
129 url = "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz";
130 sha512 = "ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==";
131 };
132 };
133 "@babel/helper-member-expression-to-functions-7.8.3" = {
134 name = "_at_babel_slash_helper-member-expression-to-functions";
135 packageName = "@babel/helper-member-expression-to-functions";
136 version = "7.8.3";
137 src = fetchurl {
138 url = "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz";
139 sha512 = "fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==";
140 };
141 };
142 "@babel/helper-module-imports-7.8.3" = {
143 name = "_at_babel_slash_helper-module-imports";
144 packageName = "@babel/helper-module-imports";
145 version = "7.8.3";
146 src = fetchurl {
147 url = "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz";
148 sha512 = "R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==";
149 };
150 };
151 "@babel/helper-module-transforms-7.9.0" = {
152 name = "_at_babel_slash_helper-module-transforms";
153 packageName = "@babel/helper-module-transforms";
154 version = "7.9.0";
155 src = fetchurl {
156 url = "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz";
157 sha512 = "0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==";
158 };
159 };
160 "@babel/helper-optimise-call-expression-7.8.3" = {
161 name = "_at_babel_slash_helper-optimise-call-expression";
162 packageName = "@babel/helper-optimise-call-expression";
163 version = "7.8.3";
164 src = fetchurl {
165 url = "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz";
166 sha512 = "Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==";
167 };
168 };
169 "@babel/helper-plugin-utils-7.8.3" = {
170 name = "_at_babel_slash_helper-plugin-utils";
171 packageName = "@babel/helper-plugin-utils";
172 version = "7.8.3";
173 src = fetchurl {
174 url = "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz";
175 sha512 = "j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==";
176 };
177 };
178 "@babel/helper-regex-7.8.3" = {
179 name = "_at_babel_slash_helper-regex";
180 packageName = "@babel/helper-regex";
181 version = "7.8.3";
182 src = fetchurl {
183 url = "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz";
184 sha512 = "BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==";
185 };
186 };
187 "@babel/helper-remap-async-to-generator-7.8.3" = {
188 name = "_at_babel_slash_helper-remap-async-to-generator";
189 packageName = "@babel/helper-remap-async-to-generator";
190 version = "7.8.3";
191 src = fetchurl {
192 url = "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz";
193 sha512 = "kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==";
194 };
195 };
196 "@babel/helper-replace-supers-7.8.6" = {
197 name = "_at_babel_slash_helper-replace-supers";
198 packageName = "@babel/helper-replace-supers";
199 version = "7.8.6";
200 src = fetchurl {
201 url = "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz";
202 sha512 = "PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==";
203 };
204 };
205 "@babel/helper-simple-access-7.8.3" = {
206 name = "_at_babel_slash_helper-simple-access";
207 packageName = "@babel/helper-simple-access";
208 version = "7.8.3";
209 src = fetchurl {
210 url = "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz";
211 sha512 = "VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==";
212 };
213 };
214 "@babel/helper-split-export-declaration-7.8.3" = {
215 name = "_at_babel_slash_helper-split-export-declaration";
216 packageName = "@babel/helper-split-export-declaration";
217 version = "7.8.3";
218 src = fetchurl {
219 url = "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz";
220 sha512 = "3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==";
221 };
222 };
223 "@babel/helper-validator-identifier-7.9.5" = {
224 name = "_at_babel_slash_helper-validator-identifier";
225 packageName = "@babel/helper-validator-identifier";
226 version = "7.9.5";
227 src = fetchurl {
228 url = "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz";
229 sha512 = "/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==";
230 };
231 };
232 "@babel/helper-wrap-function-7.8.3" = {
233 name = "_at_babel_slash_helper-wrap-function";
234 packageName = "@babel/helper-wrap-function";
235 version = "7.8.3";
236 src = fetchurl {
237 url = "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz";
238 sha512 = "LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==";
239 };
240 };
241 "@babel/helpers-7.9.2" = {
242 name = "_at_babel_slash_helpers";
243 packageName = "@babel/helpers";
244 version = "7.9.2";
245 src = fetchurl {
246 url = "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz";
247 sha512 = "JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==";
248 };
249 };
250 "@babel/highlight-7.9.0" = {
251 name = "_at_babel_slash_highlight";
252 packageName = "@babel/highlight";
253 version = "7.9.0";
254 src = fetchurl {
255 url = "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz";
256 sha512 = "lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==";
257 };
258 };
259 "@babel/parser-7.3.4" = {
260 name = "_at_babel_slash_parser";
261 packageName = "@babel/parser";
262 version = "7.3.4";
263 src = fetchurl {
264 url = "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz";
265 sha512 = "tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==";
266 };
267 };
268 "@babel/parser-7.9.4" = {
269 name = "_at_babel_slash_parser";
270 packageName = "@babel/parser";
271 version = "7.9.4";
272 src = fetchurl {
273 url = "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz";
274 sha512 = "bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==";
275 };
276 };
277 "@babel/plugin-proposal-async-generator-functions-7.8.3" = {
278 name = "_at_babel_slash_plugin-proposal-async-generator-functions";
279 packageName = "@babel/plugin-proposal-async-generator-functions";
280 version = "7.8.3";
281 src = fetchurl {
282 url = "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz";
283 sha512 = "NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==";
284 };
285 };
286 "@babel/plugin-proposal-json-strings-7.8.3" = {
287 name = "_at_babel_slash_plugin-proposal-json-strings";
288 packageName = "@babel/plugin-proposal-json-strings";
289 version = "7.8.3";
290 src = fetchurl {
291 url = "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz";
292 sha512 = "KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==";
293 };
294 };
295 "@babel/plugin-proposal-object-rest-spread-7.9.5" = {
296 name = "_at_babel_slash_plugin-proposal-object-rest-spread";
297 packageName = "@babel/plugin-proposal-object-rest-spread";
298 version = "7.9.5";
299 src = fetchurl {
300 url = "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz";
301 sha512 = "VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==";
302 };
303 };
304 "@babel/plugin-proposal-optional-catch-binding-7.8.3" = {
305 name = "_at_babel_slash_plugin-proposal-optional-catch-binding";
306 packageName = "@babel/plugin-proposal-optional-catch-binding";
307 version = "7.8.3";
308 src = fetchurl {
309 url = "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz";
310 sha512 = "0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==";
311 };
312 };
313 "@babel/plugin-proposal-unicode-property-regex-7.8.8" = {
314 name = "_at_babel_slash_plugin-proposal-unicode-property-regex";
315 packageName = "@babel/plugin-proposal-unicode-property-regex";
316 version = "7.8.8";
317 src = fetchurl {
318 url = "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz";
319 sha512 = "EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==";
320 };
321 };
322 "@babel/plugin-syntax-async-generators-7.8.4" = {
323 name = "_at_babel_slash_plugin-syntax-async-generators";
324 packageName = "@babel/plugin-syntax-async-generators";
325 version = "7.8.4";
326 src = fetchurl {
327 url = "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz";
328 sha512 = "tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==";
329 };
330 };
331 "@babel/plugin-syntax-flow-7.8.3" = {
332 name = "_at_babel_slash_plugin-syntax-flow";
333 packageName = "@babel/plugin-syntax-flow";
334 version = "7.8.3";
335 src = fetchurl {
336 url = "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz";
337 sha512 = "innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==";
338 };
339 };
340 "@babel/plugin-syntax-json-strings-7.8.3" = {
341 name = "_at_babel_slash_plugin-syntax-json-strings";
342 packageName = "@babel/plugin-syntax-json-strings";
343 version = "7.8.3";
344 src = fetchurl {
345 url = "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz";
346 sha512 = "lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==";
347 };
348 };
349 "@babel/plugin-syntax-jsx-7.8.3" = {
350 name = "_at_babel_slash_plugin-syntax-jsx";
351 packageName = "@babel/plugin-syntax-jsx";
352 version = "7.8.3";
353 src = fetchurl {
354 url = "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz";
355 sha512 = "WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==";
356 };
357 };
358 "@babel/plugin-syntax-object-rest-spread-7.8.3" = {
359 name = "_at_babel_slash_plugin-syntax-object-rest-spread";
360 packageName = "@babel/plugin-syntax-object-rest-spread";
361 version = "7.8.3";
362 src = fetchurl {
363 url = "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz";
364 sha512 = "XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==";
365 };
366 };
367 "@babel/plugin-syntax-optional-catch-binding-7.8.3" = {
368 name = "_at_babel_slash_plugin-syntax-optional-catch-binding";
369 packageName = "@babel/plugin-syntax-optional-catch-binding";
370 version = "7.8.3";
371 src = fetchurl {
372 url = "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz";
373 sha512 = "6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==";
374 };
375 };
376 "@babel/plugin-transform-arrow-functions-7.8.3" = {
377 name = "_at_babel_slash_plugin-transform-arrow-functions";
378 packageName = "@babel/plugin-transform-arrow-functions";
379 version = "7.8.3";
380 src = fetchurl {
381 url = "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz";
382 sha512 = "0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==";
383 };
384 };
385 "@babel/plugin-transform-async-to-generator-7.8.3" = {
386 name = "_at_babel_slash_plugin-transform-async-to-generator";
387 packageName = "@babel/plugin-transform-async-to-generator";
388 version = "7.8.3";
389 src = fetchurl {
390 url = "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz";
391 sha512 = "imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==";
392 };
393 };
394 "@babel/plugin-transform-block-scoped-functions-7.8.3" = {
395 name = "_at_babel_slash_plugin-transform-block-scoped-functions";
396 packageName = "@babel/plugin-transform-block-scoped-functions";
397 version = "7.8.3";
398 src = fetchurl {
399 url = "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz";
400 sha512 = "vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==";
401 };
402 };
403 "@babel/plugin-transform-block-scoping-7.8.3" = {
404 name = "_at_babel_slash_plugin-transform-block-scoping";
405 packageName = "@babel/plugin-transform-block-scoping";
406 version = "7.8.3";
407 src = fetchurl {
408 url = "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz";
409 sha512 = "pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==";
410 };
411 };
412 "@babel/plugin-transform-classes-7.9.5" = {
413 name = "_at_babel_slash_plugin-transform-classes";
414 packageName = "@babel/plugin-transform-classes";
415 version = "7.9.5";
416 src = fetchurl {
417 url = "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz";
418 sha512 = "x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==";
419 };
420 };
421 "@babel/plugin-transform-computed-properties-7.8.3" = {
422 name = "_at_babel_slash_plugin-transform-computed-properties";
423 packageName = "@babel/plugin-transform-computed-properties";
424 version = "7.8.3";
425 src = fetchurl {
426 url = "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz";
427 sha512 = "O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==";
428 };
429 };
430 "@babel/plugin-transform-destructuring-7.9.5" = {
431 name = "_at_babel_slash_plugin-transform-destructuring";
432 packageName = "@babel/plugin-transform-destructuring";
433 version = "7.9.5";
434 src = fetchurl {
435 url = "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz";
436 sha512 = "j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==";
437 };
438 };
439 "@babel/plugin-transform-dotall-regex-7.8.3" = {
440 name = "_at_babel_slash_plugin-transform-dotall-regex";
441 packageName = "@babel/plugin-transform-dotall-regex";
442 version = "7.8.3";
443 src = fetchurl {
444 url = "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz";
445 sha512 = "kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==";
446 };
447 };
448 "@babel/plugin-transform-duplicate-keys-7.8.3" = {
449 name = "_at_babel_slash_plugin-transform-duplicate-keys";
450 packageName = "@babel/plugin-transform-duplicate-keys";
451 version = "7.8.3";
452 src = fetchurl {
453 url = "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz";
454 sha512 = "s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==";
455 };
456 };
457 "@babel/plugin-transform-exponentiation-operator-7.8.3" = {
458 name = "_at_babel_slash_plugin-transform-exponentiation-operator";
459 packageName = "@babel/plugin-transform-exponentiation-operator";
460 version = "7.8.3";
461 src = fetchurl {
462 url = "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz";
463 sha512 = "zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==";
464 };
465 };
466 "@babel/plugin-transform-flow-strip-types-7.3.4" = {
467 name = "_at_babel_slash_plugin-transform-flow-strip-types";
468 packageName = "@babel/plugin-transform-flow-strip-types";
469 version = "7.3.4";
470 src = fetchurl {
471 url = "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.3.4.tgz";
472 sha512 = "PmQC9R7DwpBFA+7ATKMyzViz3zCaMNouzZMPZN2K5PnbBbtL3AXFYTkDk+Hey5crQq2A90UG5Uthz0mel+XZrA==";
473 };
474 };
475 "@babel/plugin-transform-for-of-7.9.0" = {
476 name = "_at_babel_slash_plugin-transform-for-of";
477 packageName = "@babel/plugin-transform-for-of";
478 version = "7.9.0";
479 src = fetchurl {
480 url = "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz";
481 sha512 = "lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==";
482 };
483 };
484 "@babel/plugin-transform-function-name-7.8.3" = {
485 name = "_at_babel_slash_plugin-transform-function-name";
486 packageName = "@babel/plugin-transform-function-name";
487 version = "7.8.3";
488 src = fetchurl {
489 url = "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz";
490 sha512 = "rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==";
491 };
492 };
493 "@babel/plugin-transform-literals-7.8.3" = {
494 name = "_at_babel_slash_plugin-transform-literals";
495 packageName = "@babel/plugin-transform-literals";
496 version = "7.8.3";
497 src = fetchurl {
498 url = "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz";
499 sha512 = "3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==";
500 };
501 };
502 "@babel/plugin-transform-modules-amd-7.9.0" = {
503 name = "_at_babel_slash_plugin-transform-modules-amd";
504 packageName = "@babel/plugin-transform-modules-amd";
505 version = "7.9.0";
506 src = fetchurl {
507 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz";
508 sha512 = "vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==";
509 };
510 };
511 "@babel/plugin-transform-modules-commonjs-7.2.0" = {
512 name = "_at_babel_slash_plugin-transform-modules-commonjs";
513 packageName = "@babel/plugin-transform-modules-commonjs";
514 version = "7.2.0";
515 src = fetchurl {
516 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz";
517 sha512 = "V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==";
518 };
519 };
520 "@babel/plugin-transform-modules-systemjs-7.9.0" = {
521 name = "_at_babel_slash_plugin-transform-modules-systemjs";
522 packageName = "@babel/plugin-transform-modules-systemjs";
523 version = "7.9.0";
524 src = fetchurl {
525 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz";
526 sha512 = "FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==";
527 };
528 };
529 "@babel/plugin-transform-modules-umd-7.9.0" = {
530 name = "_at_babel_slash_plugin-transform-modules-umd";
531 packageName = "@babel/plugin-transform-modules-umd";
532 version = "7.9.0";
533 src = fetchurl {
534 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz";
535 sha512 = "uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==";
536 };
537 };
538 "@babel/plugin-transform-named-capturing-groups-regex-7.8.3" = {
539 name = "_at_babel_slash_plugin-transform-named-capturing-groups-regex";
540 packageName = "@babel/plugin-transform-named-capturing-groups-regex";
541 version = "7.8.3";
542 src = fetchurl {
543 url = "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz";
544 sha512 = "f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==";
545 };
546 };
547 "@babel/plugin-transform-new-target-7.8.3" = {
548 name = "_at_babel_slash_plugin-transform-new-target";
549 packageName = "@babel/plugin-transform-new-target";
550 version = "7.8.3";
551 src = fetchurl {
552 url = "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz";
553 sha512 = "QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==";
554 };
555 };
556 "@babel/plugin-transform-object-super-7.8.3" = {
557 name = "_at_babel_slash_plugin-transform-object-super";
558 packageName = "@babel/plugin-transform-object-super";
559 version = "7.8.3";
560 src = fetchurl {
561 url = "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz";
562 sha512 = "57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==";
563 };
564 };
565 "@babel/plugin-transform-parameters-7.9.5" = {
566 name = "_at_babel_slash_plugin-transform-parameters";
567 packageName = "@babel/plugin-transform-parameters";
568 version = "7.9.5";
569 src = fetchurl {
570 url = "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz";
571 sha512 = "0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==";
572 };
573 };
574 "@babel/plugin-transform-react-jsx-7.3.0" = {
575 name = "_at_babel_slash_plugin-transform-react-jsx";
576 packageName = "@babel/plugin-transform-react-jsx";
577 version = "7.3.0";
578 src = fetchurl {
579 url = "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz";
580 sha512 = "a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==";
581 };
582 };
583 "@babel/plugin-transform-regenerator-7.8.7" = {
584 name = "_at_babel_slash_plugin-transform-regenerator";
585 packageName = "@babel/plugin-transform-regenerator";
586 version = "7.8.7";
587 src = fetchurl {
588 url = "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz";
589 sha512 = "TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==";
590 };
591 };
592 "@babel/plugin-transform-shorthand-properties-7.8.3" = {
593 name = "_at_babel_slash_plugin-transform-shorthand-properties";
594 packageName = "@babel/plugin-transform-shorthand-properties";
595 version = "7.8.3";
596 src = fetchurl {
597 url = "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz";
598 sha512 = "I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==";
599 };
600 };
601 "@babel/plugin-transform-spread-7.8.3" = {
602 name = "_at_babel_slash_plugin-transform-spread";
603 packageName = "@babel/plugin-transform-spread";
604 version = "7.8.3";
605 src = fetchurl {
606 url = "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz";
607 sha512 = "CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==";
608 };
609 };
610 "@babel/plugin-transform-sticky-regex-7.8.3" = {
611 name = "_at_babel_slash_plugin-transform-sticky-regex";
612 packageName = "@babel/plugin-transform-sticky-regex";
613 version = "7.8.3";
614 src = fetchurl {
615 url = "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz";
616 sha512 = "9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==";
617 };
618 };
619 "@babel/plugin-transform-template-literals-7.8.3" = {
620 name = "_at_babel_slash_plugin-transform-template-literals";
621 packageName = "@babel/plugin-transform-template-literals";
622 version = "7.8.3";
623 src = fetchurl {
624 url = "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz";
625 sha512 = "820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==";
626 };
627 };
628 "@babel/plugin-transform-typeof-symbol-7.8.4" = {
629 name = "_at_babel_slash_plugin-transform-typeof-symbol";
630 packageName = "@babel/plugin-transform-typeof-symbol";
631 version = "7.8.4";
632 src = fetchurl {
633 url = "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz";
634 sha512 = "2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==";
635 };
636 };
637 "@babel/plugin-transform-unicode-regex-7.8.3" = {
638 name = "_at_babel_slash_plugin-transform-unicode-regex";
639 packageName = "@babel/plugin-transform-unicode-regex";
640 version = "7.8.3";
641 src = fetchurl {
642 url = "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz";
643 sha512 = "+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==";
644 };
645 };
646 "@babel/preset-env-7.3.4" = {
647 name = "_at_babel_slash_preset-env";
648 packageName = "@babel/preset-env";
649 version = "7.3.4";
650 src = fetchurl {
651 url = "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.4.tgz";
652 sha512 = "2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==";
653 };
654 };
655 "@babel/runtime-7.3.4" = {
656 name = "_at_babel_slash_runtime";
657 packageName = "@babel/runtime";
658 version = "7.3.4";
659 src = fetchurl {
660 url = "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz";
661 sha512 = "IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==";
662 };
663 };
664 "@babel/runtime-7.9.2" = {
665 name = "_at_babel_slash_runtime";
666 packageName = "@babel/runtime";
667 version = "7.9.2";
668 src = fetchurl {
669 url = "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz";
670 sha512 = "NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==";
671 };
672 };
673 "@babel/template-7.2.2" = {
674 name = "_at_babel_slash_template";
675 packageName = "@babel/template";
676 version = "7.2.2";
677 src = fetchurl {
678 url = "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz";
679 sha512 = "zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==";
680 };
681 };
682 "@babel/template-7.8.6" = {
683 name = "_at_babel_slash_template";
684 packageName = "@babel/template";
685 version = "7.8.6";
686 src = fetchurl {
687 url = "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz";
688 sha512 = "zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==";
689 };
690 };
691 "@babel/traverse-7.3.4" = {
692 name = "_at_babel_slash_traverse";
693 packageName = "@babel/traverse";
694 version = "7.3.4";
695 src = fetchurl {
696 url = "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz";
697 sha512 = "TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==";
698 };
699 };
700 "@babel/traverse-7.9.5" = {
701 name = "_at_babel_slash_traverse";
702 packageName = "@babel/traverse";
703 version = "7.9.5";
704 src = fetchurl {
705 url = "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz";
706 sha512 = "c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==";
707 };
708 };
709 "@babel/types-7.3.4" = {
710 name = "_at_babel_slash_types";
711 packageName = "@babel/types";
712 version = "7.3.4";
713 src = fetchurl {
714 url = "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz";
715 sha512 = "WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==";
716 };
717 };
718 "@babel/types-7.9.5" = {
719 name = "_at_babel_slash_types";
720 packageName = "@babel/types";
721 version = "7.9.5";
722 src = fetchurl {
723 url = "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz";
724 sha512 = "XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==";
725 };
726 };
727 "@iarna/toml-2.2.5" = {
728 name = "_at_iarna_slash_toml";
729 packageName = "@iarna/toml";
730 version = "2.2.5";
731 src = fetchurl {
732 url = "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz";
733 sha512 = "trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==";
734 };
735 };
736 "@mrmlnc/readdir-enhanced-2.2.1" = {
737 name = "_at_mrmlnc_slash_readdir-enhanced";
738 packageName = "@mrmlnc/readdir-enhanced";
739 version = "2.2.1";
740 src = fetchurl {
741 url = "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz";
742 sha512 = "bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==";
743 };
744 };
745 "@nodelib/fs.stat-1.1.3" = {
746 name = "_at_nodelib_slash_fs.stat";
747 packageName = "@nodelib/fs.stat";
748 version = "1.1.3";
749 src = fetchurl {
750 url = "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz";
751 sha512 = "shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==";
752 };
753 };
754 "@parcel/fs-1.11.0" = {
755 name = "_at_parcel_slash_fs";
756 packageName = "@parcel/fs";
757 version = "1.11.0";
758 src = fetchurl {
759 url = "https://registry.npmjs.org/@parcel/fs/-/fs-1.11.0.tgz";
760 sha512 = "86RyEqULbbVoeo8OLcv+LQ1Vq2PKBAvWTU9fCgALxuCTbbs5Ppcvll4Vr+Ko1AnmMzja/k++SzNAwJfeQXVlpA==";
761 };
762 };
763 "@parcel/logger-1.11.1" = {
764 name = "_at_parcel_slash_logger";
765 packageName = "@parcel/logger";
766 version = "1.11.1";
767 src = fetchurl {
768 url = "https://registry.npmjs.org/@parcel/logger/-/logger-1.11.1.tgz";
769 sha512 = "9NF3M6UVeP2udOBDILuoEHd8VrF4vQqoWHEafymO1pfSoOMfxrSJZw1MfyAAIUN/IFp9qjcpDCUbDZB+ioVevA==";
770 };
771 };
772 "@parcel/utils-1.11.0" = {
773 name = "_at_parcel_slash_utils";
774 packageName = "@parcel/utils";
775 version = "1.11.0";
776 src = fetchurl {
777 url = "https://registry.npmjs.org/@parcel/utils/-/utils-1.11.0.tgz";
778 sha512 = "cA3p4jTlaMeOtAKR/6AadanOPvKeg8VwgnHhOyfi0yClD0TZS/hi9xu12w4EzA/8NtHu0g6o4RDfcNjqN8l1AQ==";
779 };
780 };
781 "@parcel/watcher-1.12.1" = {
782 name = "_at_parcel_slash_watcher";
783 packageName = "@parcel/watcher";
784 version = "1.12.1";
785 src = fetchurl {
786 url = "https://registry.npmjs.org/@parcel/watcher/-/watcher-1.12.1.tgz";
787 sha512 = "od+uCtCxC/KoNQAIE1vWx1YTyKYY+7CTrxBJPRh3cDWw/C0tCtlBMVlrbplscGoEpt6B27KhJDCv82PBxOERNA==";
788 };
789 };
790 "@parcel/workers-1.11.0" = {
791 name = "_at_parcel_slash_workers";
792 packageName = "@parcel/workers";
793 version = "1.11.0";
794 src = fetchurl {
795 url = "https://registry.npmjs.org/@parcel/workers/-/workers-1.11.0.tgz";
796 sha512 = "USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ==";
797 };
798 };
799 "@types/q-1.5.2" = {
800 name = "_at_types_slash_q";
801 packageName = "@types/q";
802 version = "1.5.2";
803 src = fetchurl {
804 url = "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz";
805 sha512 = "ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==";
806 };
807 };
808 "abab-2.0.3" = {
809 name = "abab";
810 packageName = "abab";
811 version = "2.0.3";
812 src = fetchurl {
813 url = "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz";
814 sha512 = "tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==";
815 };
816 };
817 "abbrev-1.1.1" = {
818 name = "abbrev";
819 packageName = "abbrev";
820 version = "1.1.1";
821 src = fetchurl {
822 url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";
823 sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==";
824 };
825 };
826 "acorn-6.4.1" = {
827 name = "acorn";
828 packageName = "acorn";
829 version = "6.4.1";
830 src = fetchurl {
831 url = "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz";
832 sha512 = "ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==";
833 };
834 };
835 "acorn-7.1.1" = {
836 name = "acorn";
837 packageName = "acorn";
838 version = "7.1.1";
839 src = fetchurl {
840 url = "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz";
841 sha512 = "add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==";
842 };
843 };
844 "acorn-globals-4.3.4" = {
845 name = "acorn-globals";
846 packageName = "acorn-globals";
847 version = "4.3.4";
848 src = fetchurl {
849 url = "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz";
850 sha512 = "clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==";
851 };
852 };
853 "acorn-walk-6.2.0" = {
854 name = "acorn-walk";
855 packageName = "acorn-walk";
856 version = "6.2.0";
857 src = fetchurl {
858 url = "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz";
859 sha512 = "7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==";
860 };
861 };
862 "ajv-6.12.2" = {
863 name = "ajv";
864 packageName = "ajv";
865 version = "6.12.2";
866 src = fetchurl {
867 url = "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz";
868 sha512 = "k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==";
869 };
870 };
871 "alphanum-sort-1.0.2" = {
872 name = "alphanum-sort";
873 packageName = "alphanum-sort";
874 version = "1.0.2";
875 src = fetchurl {
876 url = "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz";
877 sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3";
878 };
879 };
880 "ansi-regex-2.1.1" = {
881 name = "ansi-regex";
882 packageName = "ansi-regex";
883 version = "2.1.1";
884 src = fetchurl {
885 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
886 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
887 };
888 };
889 "ansi-regex-3.0.0" = {
890 name = "ansi-regex";
891 packageName = "ansi-regex";
892 version = "3.0.0";
893 src = fetchurl {
894 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz";
895 sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
896 };
897 };
898 "ansi-regex-4.1.0" = {
899 name = "ansi-regex";
900 packageName = "ansi-regex";
901 version = "4.1.0";
902 src = fetchurl {
903 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz";
904 sha512 = "1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==";
905 };
906 };
907 "ansi-styles-2.2.1" = {
908 name = "ansi-styles";
909 packageName = "ansi-styles";
910 version = "2.2.1";
911 src = fetchurl {
912 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
913 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
914 };
915 };
916 "ansi-styles-3.2.1" = {
917 name = "ansi-styles";
918 packageName = "ansi-styles";
919 version = "3.2.1";
920 src = fetchurl {
921 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";
922 sha512 = "VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==";
923 };
924 };
925 "ansi-to-html-0.6.14" = {
926 name = "ansi-to-html";
927 packageName = "ansi-to-html";
928 version = "0.6.14";
929 src = fetchurl {
930 url = "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.14.tgz";
931 sha512 = "7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA==";
932 };
933 };
934 "anymatch-2.0.0" = {
935 name = "anymatch";
936 packageName = "anymatch";
937 version = "2.0.0";
938 src = fetchurl {
939 url = "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz";
940 sha512 = "5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==";
941 };
942 };
943 "argparse-1.0.10" = {
944 name = "argparse";
945 packageName = "argparse";
946 version = "1.0.10";
947 src = fetchurl {
948 url = "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz";
949 sha512 = "o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==";
950 };
951 };
952 "arr-diff-4.0.0" = {
953 name = "arr-diff";
954 packageName = "arr-diff";
955 version = "4.0.0";
956 src = fetchurl {
957 url = "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz";
958 sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
959 };
960 };
961 "arr-flatten-1.1.0" = {
962 name = "arr-flatten";
963 packageName = "arr-flatten";
964 version = "1.1.0";
965 src = fetchurl {
966 url = "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz";
967 sha512 = "L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==";
968 };
969 };
970 "arr-union-3.1.0" = {
971 name = "arr-union";
972 packageName = "arr-union";
973 version = "3.1.0";
974 src = fetchurl {
975 url = "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz";
976 sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
977 };
978 };
979 "array-equal-1.0.0" = {
980 name = "array-equal";
981 packageName = "array-equal";
982 version = "1.0.0";
983 src = fetchurl {
984 url = "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz";
985 sha1 = "8c2a5ef2472fd9ea742b04c77a75093ba2757c93";
986 };
987 };
988 "array-unique-0.3.2" = {
989 name = "array-unique";
990 packageName = "array-unique";
991 version = "0.3.2";
992 src = fetchurl {
993 url = "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz";
994 sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
995 };
996 };
997 "asn1-0.2.4" = {
998 name = "asn1";
999 packageName = "asn1";
1000 version = "0.2.4";
1001 src = fetchurl {
1002 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
1003 sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
1004 };
1005 };
1006 "asn1.js-4.10.1" = {
1007 name = "asn1.js";
1008 packageName = "asn1.js";
1009 version = "4.10.1";
1010 src = fetchurl {
1011 url = "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz";
1012 sha512 = "p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==";
1013 };
1014 };
1015 "assert-1.5.0" = {
1016 name = "assert";
1017 packageName = "assert";
1018 version = "1.5.0";
1019 src = fetchurl {
1020 url = "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz";
1021 sha512 = "EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==";
1022 };
1023 };
1024 "assert-plus-1.0.0" = {
1025 name = "assert-plus";
1026 packageName = "assert-plus";
1027 version = "1.0.0";
1028 src = fetchurl {
1029 url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
1030 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
1031 };
1032 };
1033 "assign-symbols-1.0.0" = {
1034 name = "assign-symbols";
1035 packageName = "assign-symbols";
1036 version = "1.0.0";
1037 src = fetchurl {
1038 url = "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz";
1039 sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
1040 };
1041 };
1042 "async-each-1.0.3" = {
1043 name = "async-each";
1044 packageName = "async-each";
1045 version = "1.0.3";
1046 src = fetchurl {
1047 url = "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz";
1048 sha512 = "z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==";
1049 };
1050 };
1051 "async-limiter-1.0.1" = {
1052 name = "async-limiter";
1053 packageName = "async-limiter";
1054 version = "1.0.1";
1055 src = fetchurl {
1056 url = "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz";
1057 sha512 = "csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==";
1058 };
1059 };
1060 "asynckit-0.4.0" = {
1061 name = "asynckit";
1062 packageName = "asynckit";
1063 version = "0.4.0";
1064 src = fetchurl {
1065 url = "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";
1066 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
1067 };
1068 };
1069 "atob-2.1.2" = {
1070 name = "atob";
1071 packageName = "atob";
1072 version = "2.1.2";
1073 src = fetchurl {
1074 url = "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz";
1075 sha512 = "Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==";
1076 };
1077 };
1078 "aws-sign2-0.7.0" = {
1079 name = "aws-sign2";
1080 packageName = "aws-sign2";
1081 version = "0.7.0";
1082 src = fetchurl {
1083 url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";
1084 sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
1085 };
1086 };
1087 "aws4-1.9.1" = {
1088 name = "aws4";
1089 packageName = "aws4";
1090 version = "1.9.1";
1091 src = fetchurl {
1092 url = "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz";
1093 sha512 = "wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==";
1094 };
1095 };
1096 "babel-plugin-dynamic-import-node-2.3.3" = {
1097 name = "babel-plugin-dynamic-import-node";
1098 packageName = "babel-plugin-dynamic-import-node";
1099 version = "2.3.3";
1100 src = fetchurl {
1101 url = "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz";
1102 sha512 = "jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==";
1103 };
1104 };
1105 "babel-runtime-6.26.0" = {
1106 name = "babel-runtime";
1107 packageName = "babel-runtime";
1108 version = "6.26.0";
1109 src = fetchurl {
1110 url = "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz";
1111 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
1112 };
1113 };
1114 "babel-types-6.26.0" = {
1115 name = "babel-types";
1116 packageName = "babel-types";
1117 version = "6.26.0";
1118 src = fetchurl {
1119 url = "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz";
1120 sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497";
1121 };
1122 };
1123 "babylon-walk-1.0.2" = {
1124 name = "babylon-walk";
1125 packageName = "babylon-walk";
1126 version = "1.0.2";
1127 src = fetchurl {
1128 url = "https://registry.npmjs.org/babylon-walk/-/babylon-walk-1.0.2.tgz";
1129 sha1 = "3b15a5ddbb482a78b4ce9c01c8ba181702d9d6ce";
1130 };
1131 };
1132 "balanced-match-1.0.0" = {
1133 name = "balanced-match";
1134 packageName = "balanced-match";
1135 version = "1.0.0";
1136 src = fetchurl {
1137 url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
1138 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
1139 };
1140 };
1141 "base-0.11.2" = {
1142 name = "base";
1143 packageName = "base";
1144 version = "0.11.2";
1145 src = fetchurl {
1146 url = "https://registry.npmjs.org/base/-/base-0.11.2.tgz";
1147 sha512 = "5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==";
1148 };
1149 };
1150 "base64-js-1.3.1" = {
1151 name = "base64-js";
1152 packageName = "base64-js";
1153 version = "1.3.1";
1154 src = fetchurl {
1155 url = "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz";
1156 sha512 = "mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==";
1157 };
1158 };
1159 "bcrypt-pbkdf-1.0.2" = {
1160 name = "bcrypt-pbkdf";
1161 packageName = "bcrypt-pbkdf";
1162 version = "1.0.2";
1163 src = fetchurl {
1164 url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
1165 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
1166 };
1167 };
1168 "binary-extensions-1.13.1" = {
1169 name = "binary-extensions";
1170 packageName = "binary-extensions";
1171 version = "1.13.1";
1172 src = fetchurl {
1173 url = "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz";
1174 sha512 = "Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==";
1175 };
1176 };
1177 "bindings-1.5.0" = {
1178 name = "bindings";
1179 packageName = "bindings";
1180 version = "1.5.0";
1181 src = fetchurl {
1182 url = "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz";
1183 sha512 = "p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==";
1184 };
1185 };
1186 "bn.js-4.11.8" = {
1187 name = "bn.js";
1188 packageName = "bn.js";
1189 version = "4.11.8";
1190 src = fetchurl {
1191 url = "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz";
1192 sha512 = "ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==";
1193 };
1194 };
1195 "boolbase-1.0.0" = {
1196 name = "boolbase";
1197 packageName = "boolbase";
1198 version = "1.0.0";
1199 src = fetchurl {
1200 url = "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz";
1201 sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
1202 };
1203 };
1204 "brace-expansion-1.1.11" = {
1205 name = "brace-expansion";
1206 packageName = "brace-expansion";
1207 version = "1.1.11";
1208 src = fetchurl {
1209 url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
1210 sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
1211 };
1212 };
1213 "braces-2.3.2" = {
1214 name = "braces";
1215 packageName = "braces";
1216 version = "2.3.2";
1217 src = fetchurl {
1218 url = "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz";
1219 sha512 = "aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==";
1220 };
1221 };
1222 "brfs-1.6.1" = {
1223 name = "brfs";
1224 packageName = "brfs";
1225 version = "1.6.1";
1226 src = fetchurl {
1227 url = "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz";
1228 sha512 = "OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==";
1229 };
1230 };
1231 "brorand-1.1.0" = {
1232 name = "brorand";
1233 packageName = "brorand";
1234 version = "1.1.0";
1235 src = fetchurl {
1236 url = "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz";
1237 sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
1238 };
1239 };
1240 "browser-process-hrtime-1.0.0" = {
1241 name = "browser-process-hrtime";
1242 packageName = "browser-process-hrtime";
1243 version = "1.0.0";
1244 src = fetchurl {
1245 url = "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz";
1246 sha512 = "9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==";
1247 };
1248 };
1249 "browserify-aes-1.2.0" = {
1250 name = "browserify-aes";
1251 packageName = "browserify-aes";
1252 version = "1.2.0";
1253 src = fetchurl {
1254 url = "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz";
1255 sha512 = "+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==";
1256 };
1257 };
1258 "browserify-cipher-1.0.1" = {
1259 name = "browserify-cipher";
1260 packageName = "browserify-cipher";
1261 version = "1.0.1";
1262 src = fetchurl {
1263 url = "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz";
1264 sha512 = "sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==";
1265 };
1266 };
1267 "browserify-des-1.0.2" = {
1268 name = "browserify-des";
1269 packageName = "browserify-des";
1270 version = "1.0.2";
1271 src = fetchurl {
1272 url = "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz";
1273 sha512 = "BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==";
1274 };
1275 };
1276 "browserify-rsa-4.0.1" = {
1277 name = "browserify-rsa";
1278 packageName = "browserify-rsa";
1279 version = "4.0.1";
1280 src = fetchurl {
1281 url = "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz";
1282 sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524";
1283 };
1284 };
1285 "browserify-sign-4.0.4" = {
1286 name = "browserify-sign";
1287 packageName = "browserify-sign";
1288 version = "4.0.4";
1289 src = fetchurl {
1290 url = "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz";
1291 sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298";
1292 };
1293 };
1294 "browserify-zlib-0.2.0" = {
1295 name = "browserify-zlib";
1296 packageName = "browserify-zlib";
1297 version = "0.2.0";
1298 src = fetchurl {
1299 url = "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz";
1300 sha512 = "Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==";
1301 };
1302 };
1303 "browserslist-4.12.0" = {
1304 name = "browserslist";
1305 packageName = "browserslist";
1306 version = "4.12.0";
1307 src = fetchurl {
1308 url = "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz";
1309 sha512 = "UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==";
1310 };
1311 };
1312 "buffer-4.9.2" = {
1313 name = "buffer";
1314 packageName = "buffer";
1315 version = "4.9.2";
1316 src = fetchurl {
1317 url = "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz";
1318 sha512 = "xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==";
1319 };
1320 };
1321 "buffer-equal-0.0.1" = {
1322 name = "buffer-equal";
1323 packageName = "buffer-equal";
1324 version = "0.0.1";
1325 src = fetchurl {
1326 url = "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz";
1327 sha1 = "91bc74b11ea405bc916bc6aa908faafa5b4aac4b";
1328 };
1329 };
1330 "buffer-from-1.1.1" = {
1331 name = "buffer-from";
1332 packageName = "buffer-from";
1333 version = "1.1.1";
1334 src = fetchurl {
1335 url = "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz";
1336 sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==";
1337 };
1338 };
1339 "buffer-xor-1.0.3" = {
1340 name = "buffer-xor";
1341 packageName = "buffer-xor";
1342 version = "1.0.3";
1343 src = fetchurl {
1344 url = "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz";
1345 sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
1346 };
1347 };
1348 "builtin-status-codes-3.0.0" = {
1349 name = "builtin-status-codes";
1350 packageName = "builtin-status-codes";
1351 version = "3.0.0";
1352 src = fetchurl {
1353 url = "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz";
1354 sha1 = "85982878e21b98e1c66425e03d0174788f569ee8";
1355 };
1356 };
1357 "cache-base-1.0.1" = {
1358 name = "cache-base";
1359 packageName = "cache-base";
1360 version = "1.0.1";
1361 src = fetchurl {
1362 url = "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz";
1363 sha512 = "AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==";
1364 };
1365 };
1366 "call-me-maybe-1.0.1" = {
1367 name = "call-me-maybe";
1368 packageName = "call-me-maybe";
1369 version = "1.0.1";
1370 src = fetchurl {
1371 url = "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz";
1372 sha1 = "26d208ea89e37b5cbde60250a15f031c16a4d66b";
1373 };
1374 };
1375 "caller-callsite-2.0.0" = {
1376 name = "caller-callsite";
1377 packageName = "caller-callsite";
1378 version = "2.0.0";
1379 src = fetchurl {
1380 url = "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz";
1381 sha1 = "847e0fce0a223750a9a027c54b33731ad3154134";
1382 };
1383 };
1384 "caller-path-2.0.0" = {
1385 name = "caller-path";
1386 packageName = "caller-path";
1387 version = "2.0.0";
1388 src = fetchurl {
1389 url = "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz";
1390 sha1 = "468f83044e369ab2010fac5f06ceee15bb2cb1f4";
1391 };
1392 };
1393 "callsites-2.0.0" = {
1394 name = "callsites";
1395 packageName = "callsites";
1396 version = "2.0.0";
1397 src = fetchurl {
1398 url = "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz";
1399 sha1 = "06eb84f00eea413da86affefacbffb36093b3c50";
1400 };
1401 };
1402 "camelcase-5.3.1" = {
1403 name = "camelcase";
1404 packageName = "camelcase";
1405 version = "5.3.1";
1406 src = fetchurl {
1407 url = "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz";
1408 sha512 = "L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==";
1409 };
1410 };
1411 "caniuse-api-3.0.0" = {
1412 name = "caniuse-api";
1413 packageName = "caniuse-api";
1414 version = "3.0.0";
1415 src = fetchurl {
1416 url = "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz";
1417 sha512 = "bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==";
1418 };
1419 };
1420 "caniuse-lite-1.0.30001048" = {
1421 name = "caniuse-lite";
1422 packageName = "caniuse-lite";
1423 version = "1.0.30001048";
1424 src = fetchurl {
1425 url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz";
1426 sha512 = "g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==";
1427 };
1428 };
1429 "caseless-0.12.0" = {
1430 name = "caseless";
1431 packageName = "caseless";
1432 version = "0.12.0";
1433 src = fetchurl {
1434 url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
1435 sha1 = "1b681c21ff84033c826543090689420d187151dc";
1436 };
1437 };
1438 "chalk-1.1.3" = {
1439 name = "chalk";
1440 packageName = "chalk";
1441 version = "1.1.3";
1442 src = fetchurl {
1443 url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
1444 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
1445 };
1446 };
1447 "chalk-2.4.2" = {
1448 name = "chalk";
1449 packageName = "chalk";
1450 version = "2.4.2";
1451 src = fetchurl {
1452 url = "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz";
1453 sha512 = "Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==";
1454 };
1455 };
1456 "chokidar-2.1.8" = {
1457 name = "chokidar";
1458 packageName = "chokidar";
1459 version = "2.1.8";
1460 src = fetchurl {
1461 url = "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz";
1462 sha512 = "ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==";
1463 };
1464 };
1465 "cipher-base-1.0.4" = {
1466 name = "cipher-base";
1467 packageName = "cipher-base";
1468 version = "1.0.4";
1469 src = fetchurl {
1470 url = "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz";
1471 sha512 = "Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==";
1472 };
1473 };
1474 "class-utils-0.3.6" = {
1475 name = "class-utils";
1476 packageName = "class-utils";
1477 version = "0.3.6";
1478 src = fetchurl {
1479 url = "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz";
1480 sha512 = "qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==";
1481 };
1482 };
1483 "cli-cursor-2.1.0" = {
1484 name = "cli-cursor";
1485 packageName = "cli-cursor";
1486 version = "2.1.0";
1487 src = fetchurl {
1488 url = "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz";
1489 sha1 = "b35dac376479facc3e94747d41d0d0f5238ffcb5";
1490 };
1491 };
1492 "cli-spinners-1.3.1" = {
1493 name = "cli-spinners";
1494 packageName = "cli-spinners";
1495 version = "1.3.1";
1496 src = fetchurl {
1497 url = "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz";
1498 sha512 = "1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==";
1499 };
1500 };
1501 "cliui-5.0.0" = {
1502 name = "cliui";
1503 packageName = "cliui";
1504 version = "5.0.0";
1505 src = fetchurl {
1506 url = "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz";
1507 sha512 = "PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==";
1508 };
1509 };
1510 "clone-1.0.4" = {
1511 name = "clone";
1512 packageName = "clone";
1513 version = "1.0.4";
1514 src = fetchurl {
1515 url = "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz";
1516 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
1517 };
1518 };
1519 "clone-2.1.2" = {
1520 name = "clone";
1521 packageName = "clone";
1522 version = "2.1.2";
1523 src = fetchurl {
1524 url = "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz";
1525 sha1 = "1b7f4b9f591f1e8f83670401600345a02887435f";
1526 };
1527 };
1528 "clones-1.2.0" = {
1529 name = "clones";
1530 packageName = "clones";
1531 version = "1.2.0";
1532 src = fetchurl {
1533 url = "https://registry.npmjs.org/clones/-/clones-1.2.0.tgz";
1534 sha512 = "FXDYw4TjR8wgPZYui2LeTqWh1BLpfQ8lB6upMtlpDF6WlOOxghmTTxWyngdKTgozqBgKnHbTVwTE+hOHqAykuQ==";
1535 };
1536 };
1537 "coa-2.0.2" = {
1538 name = "coa";
1539 packageName = "coa";
1540 version = "2.0.2";
1541 src = fetchurl {
1542 url = "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz";
1543 sha512 = "q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==";
1544 };
1545 };
1546 "collection-visit-1.0.0" = {
1547 name = "collection-visit";
1548 packageName = "collection-visit";
1549 version = "1.0.0";
1550 src = fetchurl {
1551 url = "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz";
1552 sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
1553 };
1554 };
1555 "color-3.1.2" = {
1556 name = "color";
1557 packageName = "color";
1558 version = "3.1.2";
1559 src = fetchurl {
1560 url = "https://registry.npmjs.org/color/-/color-3.1.2.tgz";
1561 sha512 = "vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==";
1562 };
1563 };
1564 "color-convert-1.9.3" = {
1565 name = "color-convert";
1566 packageName = "color-convert";
1567 version = "1.9.3";
1568 src = fetchurl {
1569 url = "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz";
1570 sha512 = "QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==";
1571 };
1572 };
1573 "color-name-1.1.3" = {
1574 name = "color-name";
1575 packageName = "color-name";
1576 version = "1.1.3";
1577 src = fetchurl {
1578 url = "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz";
1579 sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
1580 };
1581 };
1582 "color-string-1.5.3" = {
1583 name = "color-string";
1584 packageName = "color-string";
1585 version = "1.5.3";
1586 src = fetchurl {
1587 url = "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz";
1588 sha512 = "dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==";
1589 };
1590 };
1591 "combined-stream-1.0.8" = {
1592 name = "combined-stream";
1593 packageName = "combined-stream";
1594 version = "1.0.8";
1595 src = fetchurl {
1596 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz";
1597 sha512 = "FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==";
1598 };
1599 };
1600 "command-exists-1.2.9" = {
1601 name = "command-exists";
1602 packageName = "command-exists";
1603 version = "1.2.9";
1604 src = fetchurl {
1605 url = "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz";
1606 sha512 = "LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==";
1607 };
1608 };
1609 "commander-2.20.3" = {
1610 name = "commander";
1611 packageName = "commander";
1612 version = "2.20.3";
1613 src = fetchurl {
1614 url = "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz";
1615 sha512 = "GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==";
1616 };
1617 };
1618 "component-emitter-1.3.0" = {
1619 name = "component-emitter";
1620 packageName = "component-emitter";
1621 version = "1.3.0";
1622 src = fetchurl {
1623 url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz";
1624 sha512 = "Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==";
1625 };
1626 };
1627 "concat-map-0.0.1" = {
1628 name = "concat-map";
1629 packageName = "concat-map";
1630 version = "0.0.1";
1631 src = fetchurl {
1632 url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
1633 sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
1634 };
1635 };
1636 "concat-stream-1.6.2" = {
1637 name = "concat-stream";
1638 packageName = "concat-stream";
1639 version = "1.6.2";
1640 src = fetchurl {
1641 url = "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz";
1642 sha512 = "27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==";
1643 };
1644 };
1645 "config-chain-1.1.12" = {
1646 name = "config-chain";
1647 packageName = "config-chain";
1648 version = "1.1.12";
1649 src = fetchurl {
1650 url = "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz";
1651 sha512 = "a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==";
1652 };
1653 };
1654 "console-browserify-1.2.0" = {
1655 name = "console-browserify";
1656 packageName = "console-browserify";
1657 version = "1.2.0";
1658 src = fetchurl {
1659 url = "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz";
1660 sha512 = "ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==";
1661 };
1662 };
1663 "constants-browserify-1.0.0" = {
1664 name = "constants-browserify";
1665 packageName = "constants-browserify";
1666 version = "1.0.0";
1667 src = fetchurl {
1668 url = "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz";
1669 sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
1670 };
1671 };
1672 "convert-source-map-1.7.0" = {
1673 name = "convert-source-map";
1674 packageName = "convert-source-map";
1675 version = "1.7.0";
1676 src = fetchurl {
1677 url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz";
1678 sha512 = "4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==";
1679 };
1680 };
1681 "copy-descriptor-0.1.1" = {
1682 name = "copy-descriptor";
1683 packageName = "copy-descriptor";
1684 version = "0.1.1";
1685 src = fetchurl {
1686 url = "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
1687 sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
1688 };
1689 };
1690 "core-js-2.6.11" = {
1691 name = "core-js";
1692 packageName = "core-js";
1693 version = "2.6.11";
1694 src = fetchurl {
1695 url = "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz";
1696 sha512 = "5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==";
1697 };
1698 };
1699 "core-util-is-1.0.2" = {
1700 name = "core-util-is";
1701 packageName = "core-util-is";
1702 version = "1.0.2";
1703 src = fetchurl {
1704 url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
1705 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
1706 };
1707 };
1708 "cosmiconfig-5.2.1" = {
1709 name = "cosmiconfig";
1710 packageName = "cosmiconfig";
1711 version = "5.2.1";
1712 src = fetchurl {
1713 url = "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz";
1714 sha512 = "H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==";
1715 };
1716 };
1717 "create-ecdh-4.0.3" = {
1718 name = "create-ecdh";
1719 packageName = "create-ecdh";
1720 version = "4.0.3";
1721 src = fetchurl {
1722 url = "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz";
1723 sha512 = "GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==";
1724 };
1725 };
1726 "create-hash-1.2.0" = {
1727 name = "create-hash";
1728 packageName = "create-hash";
1729 version = "1.2.0";
1730 src = fetchurl {
1731 url = "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz";
1732 sha512 = "z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==";
1733 };
1734 };
1735 "create-hmac-1.1.7" = {
1736 name = "create-hmac";
1737 packageName = "create-hmac";
1738 version = "1.1.7";
1739 src = fetchurl {
1740 url = "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz";
1741 sha512 = "MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==";
1742 };
1743 };
1744 "cross-spawn-6.0.5" = {
1745 name = "cross-spawn";
1746 packageName = "cross-spawn";
1747 version = "6.0.5";
1748 src = fetchurl {
1749 url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz";
1750 sha512 = "eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==";
1751 };
1752 };
1753 "crypto-browserify-3.12.0" = {
1754 name = "crypto-browserify";
1755 packageName = "crypto-browserify";
1756 version = "3.12.0";
1757 src = fetchurl {
1758 url = "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz";
1759 sha512 = "fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==";
1760 };
1761 };
1762 "css-color-names-0.0.4" = {
1763 name = "css-color-names";
1764 packageName = "css-color-names";
1765 version = "0.0.4";
1766 src = fetchurl {
1767 url = "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz";
1768 sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0";
1769 };
1770 };
1771 "css-declaration-sorter-4.0.1" = {
1772 name = "css-declaration-sorter";
1773 packageName = "css-declaration-sorter";
1774 version = "4.0.1";
1775 src = fetchurl {
1776 url = "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz";
1777 sha512 = "BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==";
1778 };
1779 };
1780 "css-modules-loader-core-1.1.0" = {
1781 name = "css-modules-loader-core";
1782 packageName = "css-modules-loader-core";
1783 version = "1.1.0";
1784 src = fetchurl {
1785 url = "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz";
1786 sha1 = "5908668294a1becd261ae0a4ce21b0b551f21d16";
1787 };
1788 };
1789 "css-select-2.1.0" = {
1790 name = "css-select";
1791 packageName = "css-select";
1792 version = "2.1.0";
1793 src = fetchurl {
1794 url = "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz";
1795 sha512 = "Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==";
1796 };
1797 };
1798 "css-select-base-adapter-0.1.1" = {
1799 name = "css-select-base-adapter";
1800 packageName = "css-select-base-adapter";
1801 version = "0.1.1";
1802 src = fetchurl {
1803 url = "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz";
1804 sha512 = "jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==";
1805 };
1806 };
1807 "css-selector-tokenizer-0.7.2" = {
1808 name = "css-selector-tokenizer";
1809 packageName = "css-selector-tokenizer";
1810 version = "0.7.2";
1811 src = fetchurl {
1812 url = "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz";
1813 sha512 = "yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==";
1814 };
1815 };
1816 "css-tree-1.0.0-alpha.37" = {
1817 name = "css-tree";
1818 packageName = "css-tree";
1819 version = "1.0.0-alpha.37";
1820 src = fetchurl {
1821 url = "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz";
1822 sha512 = "DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==";
1823 };
1824 };
1825 "css-tree-1.0.0-alpha.39" = {
1826 name = "css-tree";
1827 packageName = "css-tree";
1828 version = "1.0.0-alpha.39";
1829 src = fetchurl {
1830 url = "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz";
1831 sha512 = "7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==";
1832 };
1833 };
1834 "css-what-3.2.1" = {
1835 name = "css-what";
1836 packageName = "css-what";
1837 version = "3.2.1";
1838 src = fetchurl {
1839 url = "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz";
1840 sha512 = "WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==";
1841 };
1842 };
1843 "cssesc-3.0.0" = {
1844 name = "cssesc";
1845 packageName = "cssesc";
1846 version = "3.0.0";
1847 src = fetchurl {
1848 url = "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz";
1849 sha512 = "/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==";
1850 };
1851 };
1852 "cssnano-4.1.10" = {
1853 name = "cssnano";
1854 packageName = "cssnano";
1855 version = "4.1.10";
1856 src = fetchurl {
1857 url = "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz";
1858 sha512 = "5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==";
1859 };
1860 };
1861 "cssnano-preset-default-4.0.7" = {
1862 name = "cssnano-preset-default";
1863 packageName = "cssnano-preset-default";
1864 version = "4.0.7";
1865 src = fetchurl {
1866 url = "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz";
1867 sha512 = "x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==";
1868 };
1869 };
1870 "cssnano-util-get-arguments-4.0.0" = {
1871 name = "cssnano-util-get-arguments";
1872 packageName = "cssnano-util-get-arguments";
1873 version = "4.0.0";
1874 src = fetchurl {
1875 url = "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz";
1876 sha1 = "ed3a08299f21d75741b20f3b81f194ed49cc150f";
1877 };
1878 };
1879 "cssnano-util-get-match-4.0.0" = {
1880 name = "cssnano-util-get-match";
1881 packageName = "cssnano-util-get-match";
1882 version = "4.0.0";
1883 src = fetchurl {
1884 url = "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz";
1885 sha1 = "c0e4ca07f5386bb17ec5e52250b4f5961365156d";
1886 };
1887 };
1888 "cssnano-util-raw-cache-4.0.1" = {
1889 name = "cssnano-util-raw-cache";
1890 packageName = "cssnano-util-raw-cache";
1891 version = "4.0.1";
1892 src = fetchurl {
1893 url = "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz";
1894 sha512 = "qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==";
1895 };
1896 };
1897 "cssnano-util-same-parent-4.0.1" = {
1898 name = "cssnano-util-same-parent";
1899 packageName = "cssnano-util-same-parent";
1900 version = "4.0.1";
1901 src = fetchurl {
1902 url = "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz";
1903 sha512 = "WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==";
1904 };
1905 };
1906 "csso-4.0.3" = {
1907 name = "csso";
1908 packageName = "csso";
1909 version = "4.0.3";
1910 src = fetchurl {
1911 url = "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz";
1912 sha512 = "NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==";
1913 };
1914 };
1915 "cssom-0.3.8" = {
1916 name = "cssom";
1917 packageName = "cssom";
1918 version = "0.3.8";
1919 src = fetchurl {
1920 url = "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz";
1921 sha512 = "b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==";
1922 };
1923 };
1924 "cssstyle-1.4.0" = {
1925 name = "cssstyle";
1926 packageName = "cssstyle";
1927 version = "1.4.0";
1928 src = fetchurl {
1929 url = "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz";
1930 sha512 = "GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==";
1931 };
1932 };
1933 "dashdash-1.14.1" = {
1934 name = "dashdash";
1935 packageName = "dashdash";
1936 version = "1.14.1";
1937 src = fetchurl {
1938 url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
1939 sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
1940 };
1941 };
1942 "data-urls-1.1.0" = {
1943 name = "data-urls";
1944 packageName = "data-urls";
1945 version = "1.1.0";
1946 src = fetchurl {
1947 url = "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz";
1948 sha512 = "YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==";
1949 };
1950 };
1951 "deasync-0.1.19" = {
1952 name = "deasync";
1953 packageName = "deasync";
1954 version = "0.1.19";
1955 src = fetchurl {
1956 url = "https://registry.npmjs.org/deasync/-/deasync-0.1.19.tgz";
1957 sha512 = "oh3MRktfnPlLysCPpBpKZZzb4cUC/p0aA3SyRGp15lN30juJBTo/CiD0d4fR+f1kBtUQoJj1NE9RPNWQ7BQ9Mg==";
1958 };
1959 };
1960 "debug-2.6.9" = {
1961 name = "debug";
1962 packageName = "debug";
1963 version = "2.6.9";
1964 src = fetchurl {
1965 url = "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz";
1966 sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
1967 };
1968 };
1969 "debug-4.1.1" = {
1970 name = "debug";
1971 packageName = "debug";
1972 version = "4.1.1";
1973 src = fetchurl {
1974 url = "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz";
1975 sha512 = "pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==";
1976 };
1977 };
1978 "decamelize-1.2.0" = {
1979 name = "decamelize";
1980 packageName = "decamelize";
1981 version = "1.2.0";
1982 src = fetchurl {
1983 url = "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz";
1984 sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
1985 };
1986 };
1987 "decode-uri-component-0.2.0" = {
1988 name = "decode-uri-component";
1989 packageName = "decode-uri-component";
1990 version = "0.2.0";
1991 src = fetchurl {
1992 url = "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
1993 sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
1994 };
1995 };
1996 "deep-is-0.1.3" = {
1997 name = "deep-is";
1998 packageName = "deep-is";
1999 version = "0.1.3";
2000 src = fetchurl {
2001 url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz";
2002 sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
2003 };
2004 };
2005 "defaults-1.0.3" = {
2006 name = "defaults";
2007 packageName = "defaults";
2008 version = "1.0.3";
2009 src = fetchurl {
2010 url = "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz";
2011 sha1 = "c656051e9817d9ff08ed881477f3fe4019f3ef7d";
2012 };
2013 };
2014 "define-properties-1.1.3" = {
2015 name = "define-properties";
2016 packageName = "define-properties";
2017 version = "1.1.3";
2018 src = fetchurl {
2019 url = "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz";
2020 sha512 = "3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==";
2021 };
2022 };
2023 "define-property-0.2.5" = {
2024 name = "define-property";
2025 packageName = "define-property";
2026 version = "0.2.5";
2027 src = fetchurl {
2028 url = "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz";
2029 sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
2030 };
2031 };
2032 "define-property-1.0.0" = {
2033 name = "define-property";
2034 packageName = "define-property";
2035 version = "1.0.0";
2036 src = fetchurl {
2037 url = "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz";
2038 sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
2039 };
2040 };
2041 "define-property-2.0.2" = {
2042 name = "define-property";
2043 packageName = "define-property";
2044 version = "2.0.2";
2045 src = fetchurl {
2046 url = "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz";
2047 sha512 = "jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==";
2048 };
2049 };
2050 "delayed-stream-1.0.0" = {
2051 name = "delayed-stream";
2052 packageName = "delayed-stream";
2053 version = "1.0.0";
2054 src = fetchurl {
2055 url = "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";
2056 sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
2057 };
2058 };
2059 "depd-1.1.2" = {
2060 name = "depd";
2061 packageName = "depd";
2062 version = "1.1.2";
2063 src = fetchurl {
2064 url = "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz";
2065 sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
2066 };
2067 };
2068 "des.js-1.0.1" = {
2069 name = "des.js";
2070 packageName = "des.js";
2071 version = "1.0.1";
2072 src = fetchurl {
2073 url = "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz";
2074 sha512 = "Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==";
2075 };
2076 };
2077 "destroy-1.0.4" = {
2078 name = "destroy";
2079 packageName = "destroy";
2080 version = "1.0.4";
2081 src = fetchurl {
2082 url = "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz";
2083 sha1 = "978857442c44749e4206613e37946205826abd80";
2084 };
2085 };
2086 "diffie-hellman-5.0.3" = {
2087 name = "diffie-hellman";
2088 packageName = "diffie-hellman";
2089 version = "5.0.3";
2090 src = fetchurl {
2091 url = "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz";
2092 sha512 = "kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==";
2093 };
2094 };
2095 "dom-serializer-0.2.2" = {
2096 name = "dom-serializer";
2097 packageName = "dom-serializer";
2098 version = "0.2.2";
2099 src = fetchurl {
2100 url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz";
2101 sha512 = "2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==";
2102 };
2103 };
2104 "domain-browser-1.2.0" = {
2105 name = "domain-browser";
2106 packageName = "domain-browser";
2107 version = "1.2.0";
2108 src = fetchurl {
2109 url = "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz";
2110 sha512 = "jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==";
2111 };
2112 };
2113 "domelementtype-1.3.1" = {
2114 name = "domelementtype";
2115 packageName = "domelementtype";
2116 version = "1.3.1";
2117 src = fetchurl {
2118 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz";
2119 sha512 = "BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==";
2120 };
2121 };
2122 "domelementtype-2.0.1" = {
2123 name = "domelementtype";
2124 packageName = "domelementtype";
2125 version = "2.0.1";
2126 src = fetchurl {
2127 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz";
2128 sha512 = "5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==";
2129 };
2130 };
2131 "domexception-1.0.1" = {
2132 name = "domexception";
2133 packageName = "domexception";
2134 version = "1.0.1";
2135 src = fetchurl {
2136 url = "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz";
2137 sha512 = "raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==";
2138 };
2139 };
2140 "domhandler-2.4.2" = {
2141 name = "domhandler";
2142 packageName = "domhandler";
2143 version = "2.4.2";
2144 src = fetchurl {
2145 url = "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz";
2146 sha512 = "JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==";
2147 };
2148 };
2149 "domutils-1.7.0" = {
2150 name = "domutils";
2151 packageName = "domutils";
2152 version = "1.7.0";
2153 src = fetchurl {
2154 url = "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz";
2155 sha512 = "Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==";
2156 };
2157 };
2158 "dot-prop-5.2.0" = {
2159 name = "dot-prop";
2160 packageName = "dot-prop";
2161 version = "5.2.0";
2162 src = fetchurl {
2163 url = "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz";
2164 sha512 = "uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==";
2165 };
2166 };
2167 "dotenv-5.0.1" = {
2168 name = "dotenv";
2169 packageName = "dotenv";
2170 version = "5.0.1";
2171 src = fetchurl {
2172 url = "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz";
2173 sha512 = "4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==";
2174 };
2175 };
2176 "dotenv-expand-4.2.0" = {
2177 name = "dotenv-expand";
2178 packageName = "dotenv-expand";
2179 version = "4.2.0";
2180 src = fetchurl {
2181 url = "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz";
2182 sha1 = "def1f1ca5d6059d24a766e587942c21106ce1275";
2183 };
2184 };
2185 "duplexer2-0.1.4" = {
2186 name = "duplexer2";
2187 packageName = "duplexer2";
2188 version = "0.1.4";
2189 src = fetchurl {
2190 url = "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz";
2191 sha1 = "8b12dab878c0d69e3e7891051662a32fc6bddcc1";
2192 };
2193 };
2194 "ecc-jsbn-0.1.2" = {
2195 name = "ecc-jsbn";
2196 packageName = "ecc-jsbn";
2197 version = "0.1.2";
2198 src = fetchurl {
2199 url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
2200 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
2201 };
2202 };
2203 "editorconfig-0.15.3" = {
2204 name = "editorconfig";
2205 packageName = "editorconfig";
2206 version = "0.15.3";
2207 src = fetchurl {
2208 url = "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz";
2209 sha512 = "M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==";
2210 };
2211 };
2212 "ee-first-1.1.1" = {
2213 name = "ee-first";
2214 packageName = "ee-first";
2215 version = "1.1.1";
2216 src = fetchurl {
2217 url = "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz";
2218 sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
2219 };
2220 };
2221 "electron-to-chromium-1.3.418" = {
2222 name = "electron-to-chromium";
2223 packageName = "electron-to-chromium";
2224 version = "1.3.418";
2225 src = fetchurl {
2226 url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.418.tgz";
2227 sha512 = "i2QrQtHes5fK/F9QGG5XacM5WKEuR322fxTYF9e8O9Gu0mc0WmjjwGpV8c7Htso6Zf2Di18lc3SIPxmMeRFBug==";
2228 };
2229 };
2230 "elliptic-6.5.2" = {
2231 name = "elliptic";
2232 packageName = "elliptic";
2233 version = "6.5.2";
2234 src = fetchurl {
2235 url = "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz";
2236 sha512 = "f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==";
2237 };
2238 };
2239 "elm-hot-1.1.1" = {
2240 name = "elm-hot";
2241 packageName = "elm-hot";
2242 version = "1.1.1";
2243 src = fetchurl {
2244 url = "https://registry.npmjs.org/elm-hot/-/elm-hot-1.1.1.tgz";
2245 sha512 = "ZHjoHd2Ev6riNXNQirj3J+GKKXXwedAUikfFBYzlVL/+3CdGs96cpZ7nhAk4c5l//Qa9ymltrqX36mOlr0pPFA==";
2246 };
2247 };
2248 "emoji-regex-7.0.3" = {
2249 name = "emoji-regex";
2250 packageName = "emoji-regex";
2251 version = "7.0.3";
2252 src = fetchurl {
2253 url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz";
2254 sha512 = "CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==";
2255 };
2256 };
2257 "encodeurl-1.0.2" = {
2258 name = "encodeurl";
2259 packageName = "encodeurl";
2260 version = "1.0.2";
2261 src = fetchurl {
2262 url = "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz";
2263 sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
2264 };
2265 };
2266 "entities-1.1.2" = {
2267 name = "entities";
2268 packageName = "entities";
2269 version = "1.1.2";
2270 src = fetchurl {
2271 url = "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz";
2272 sha512 = "f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==";
2273 };
2274 };
2275 "entities-2.0.0" = {
2276 name = "entities";
2277 packageName = "entities";
2278 version = "2.0.0";
2279 src = fetchurl {
2280 url = "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz";
2281 sha512 = "D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==";
2282 };
2283 };
2284 "error-ex-1.3.2" = {
2285 name = "error-ex";
2286 packageName = "error-ex";
2287 version = "1.3.2";
2288 src = fetchurl {
2289 url = "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz";
2290 sha512 = "7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==";
2291 };
2292 };
2293 "es-abstract-1.17.5" = {
2294 name = "es-abstract";
2295 packageName = "es-abstract";
2296 version = "1.17.5";
2297 src = fetchurl {
2298 url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz";
2299 sha512 = "BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==";
2300 };
2301 };
2302 "es-to-primitive-1.2.1" = {
2303 name = "es-to-primitive";
2304 packageName = "es-to-primitive";
2305 version = "1.2.1";
2306 src = fetchurl {
2307 url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz";
2308 sha512 = "QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==";
2309 };
2310 };
2311 "escape-html-1.0.3" = {
2312 name = "escape-html";
2313 packageName = "escape-html";
2314 version = "1.0.3";
2315 src = fetchurl {
2316 url = "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz";
2317 sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
2318 };
2319 };
2320 "escape-string-regexp-1.0.5" = {
2321 name = "escape-string-regexp";
2322 packageName = "escape-string-regexp";
2323 version = "1.0.5";
2324 src = fetchurl {
2325 url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
2326 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
2327 };
2328 };
2329 "escodegen-1.14.1" = {
2330 name = "escodegen";
2331 packageName = "escodegen";
2332 version = "1.14.1";
2333 src = fetchurl {
2334 url = "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz";
2335 sha512 = "Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==";
2336 };
2337 };
2338 "escodegen-1.9.1" = {
2339 name = "escodegen";
2340 packageName = "escodegen";
2341 version = "1.9.1";
2342 src = fetchurl {
2343 url = "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz";
2344 sha512 = "6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==";
2345 };
2346 };
2347 "esprima-3.1.3" = {
2348 name = "esprima";
2349 packageName = "esprima";
2350 version = "3.1.3";
2351 src = fetchurl {
2352 url = "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz";
2353 sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633";
2354 };
2355 };
2356 "esprima-4.0.1" = {
2357 name = "esprima";
2358 packageName = "esprima";
2359 version = "4.0.1";
2360 src = fetchurl {
2361 url = "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz";
2362 sha512 = "eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==";
2363 };
2364 };
2365 "estraverse-4.3.0" = {
2366 name = "estraverse";
2367 packageName = "estraverse";
2368 version = "4.3.0";
2369 src = fetchurl {
2370 url = "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz";
2371 sha512 = "39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==";
2372 };
2373 };
2374 "esutils-2.0.3" = {
2375 name = "esutils";
2376 packageName = "esutils";
2377 version = "2.0.3";
2378 src = fetchurl {
2379 url = "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz";
2380 sha512 = "kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==";
2381 };
2382 };
2383 "etag-1.8.1" = {
2384 name = "etag";
2385 packageName = "etag";
2386 version = "1.8.1";
2387 src = fetchurl {
2388 url = "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz";
2389 sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
2390 };
2391 };
2392 "events-3.1.0" = {
2393 name = "events";
2394 packageName = "events";
2395 version = "3.1.0";
2396 src = fetchurl {
2397 url = "https://registry.npmjs.org/events/-/events-3.1.0.tgz";
2398 sha512 = "Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==";
2399 };
2400 };
2401 "evp_bytestokey-1.0.3" = {
2402 name = "evp_bytestokey";
2403 packageName = "evp_bytestokey";
2404 version = "1.0.3";
2405 src = fetchurl {
2406 url = "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz";
2407 sha512 = "/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==";
2408 };
2409 };
2410 "expand-brackets-2.1.4" = {
2411 name = "expand-brackets";
2412 packageName = "expand-brackets";
2413 version = "2.1.4";
2414 src = fetchurl {
2415 url = "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz";
2416 sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
2417 };
2418 };
2419 "extend-3.0.2" = {
2420 name = "extend";
2421 packageName = "extend";
2422 version = "3.0.2";
2423 src = fetchurl {
2424 url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
2425 sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
2426 };
2427 };
2428 "extend-shallow-2.0.1" = {
2429 name = "extend-shallow";
2430 packageName = "extend-shallow";
2431 version = "2.0.1";
2432 src = fetchurl {
2433 url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz";
2434 sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
2435 };
2436 };
2437 "extend-shallow-3.0.2" = {
2438 name = "extend-shallow";
2439 packageName = "extend-shallow";
2440 version = "3.0.2";
2441 src = fetchurl {
2442 url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz";
2443 sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
2444 };
2445 };
2446 "extglob-2.0.4" = {
2447 name = "extglob";
2448 packageName = "extglob";
2449 version = "2.0.4";
2450 src = fetchurl {
2451 url = "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz";
2452 sha512 = "Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==";
2453 };
2454 };
2455 "extsprintf-1.3.0" = {
2456 name = "extsprintf";
2457 packageName = "extsprintf";
2458 version = "1.3.0";
2459 src = fetchurl {
2460 url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
2461 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
2462 };
2463 };
2464 "falafel-2.2.4" = {
2465 name = "falafel";
2466 packageName = "falafel";
2467 version = "2.2.4";
2468 src = fetchurl {
2469 url = "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz";
2470 sha512 = "0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==";
2471 };
2472 };
2473 "fast-deep-equal-3.1.1" = {
2474 name = "fast-deep-equal";
2475 packageName = "fast-deep-equal";
2476 version = "3.1.1";
2477 src = fetchurl {
2478 url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz";
2479 sha512 = "8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==";
2480 };
2481 };
2482 "fast-glob-2.2.7" = {
2483 name = "fast-glob";
2484 packageName = "fast-glob";
2485 version = "2.2.7";
2486 src = fetchurl {
2487 url = "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz";
2488 sha512 = "g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==";
2489 };
2490 };
2491 "fast-json-stable-stringify-2.1.0" = {
2492 name = "fast-json-stable-stringify";
2493 packageName = "fast-json-stable-stringify";
2494 version = "2.1.0";
2495 src = fetchurl {
2496 url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
2497 sha512 = "lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==";
2498 };
2499 };
2500 "fast-levenshtein-2.0.6" = {
2501 name = "fast-levenshtein";
2502 packageName = "fast-levenshtein";
2503 version = "2.0.6";
2504 src = fetchurl {
2505 url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
2506 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
2507 };
2508 };
2509 "fastparse-1.1.2" = {
2510 name = "fastparse";
2511 packageName = "fastparse";
2512 version = "1.1.2";
2513 src = fetchurl {
2514 url = "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz";
2515 sha512 = "483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==";
2516 };
2517 };
2518 "file-uri-to-path-1.0.0" = {
2519 name = "file-uri-to-path";
2520 packageName = "file-uri-to-path";
2521 version = "1.0.0";
2522 src = fetchurl {
2523 url = "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz";
2524 sha512 = "0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==";
2525 };
2526 };
2527 "filesize-3.6.1" = {
2528 name = "filesize";
2529 packageName = "filesize";
2530 version = "3.6.1";
2531 src = fetchurl {
2532 url = "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz";
2533 sha512 = "7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==";
2534 };
2535 };
2536 "fill-range-4.0.0" = {
2537 name = "fill-range";
2538 packageName = "fill-range";
2539 version = "4.0.0";
2540 src = fetchurl {
2541 url = "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz";
2542 sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
2543 };
2544 };
2545 "find-elm-dependencies-2.0.2" = {
2546 name = "find-elm-dependencies";
2547 packageName = "find-elm-dependencies";
2548 version = "2.0.2";
2549 src = fetchurl {
2550 url = "https://registry.npmjs.org/find-elm-dependencies/-/find-elm-dependencies-2.0.2.tgz";
2551 sha512 = "nM5UCbccD1G8CGK2GsM7ykG3ksOAl9E+34jiDfl07CAl2OPnLpBVWY2hlxEmIkSBfdJjSopEowWHrO0cI8RhxQ==";
2552 };
2553 };
2554 "find-up-2.1.0" = {
2555 name = "find-up";
2556 packageName = "find-up";
2557 version = "2.1.0";
2558 src = fetchurl {
2559 url = "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz";
2560 sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
2561 };
2562 };
2563 "find-up-3.0.0" = {
2564 name = "find-up";
2565 packageName = "find-up";
2566 version = "3.0.0";
2567 src = fetchurl {
2568 url = "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz";
2569 sha512 = "1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==";
2570 };
2571 };
2572 "firstline-1.2.0" = {
2573 name = "firstline";
2574 packageName = "firstline";
2575 version = "1.2.0";
2576 src = fetchurl {
2577 url = "https://registry.npmjs.org/firstline/-/firstline-1.2.0.tgz";
2578 sha1 = "c9f4886e7f7fbf0afc12d71941dce06b192aea05";
2579 };
2580 };
2581 "for-in-1.0.2" = {
2582 name = "for-in";
2583 packageName = "for-in";
2584 version = "1.0.2";
2585 src = fetchurl {
2586 url = "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz";
2587 sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
2588 };
2589 };
2590 "foreach-2.0.5" = {
2591 name = "foreach";
2592 packageName = "foreach";
2593 version = "2.0.5";
2594 src = fetchurl {
2595 url = "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz";
2596 sha1 = "0bee005018aeb260d0a3af3ae658dd0136ec1b99";
2597 };
2598 };
2599 "forever-agent-0.6.1" = {
2600 name = "forever-agent";
2601 packageName = "forever-agent";
2602 version = "0.6.1";
2603 src = fetchurl {
2604 url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
2605 sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
2606 };
2607 };
2608 "form-data-2.3.3" = {
2609 name = "form-data";
2610 packageName = "form-data";
2611 version = "2.3.3";
2612 src = fetchurl {
2613 url = "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";
2614 sha512 = "1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==";
2615 };
2616 };
2617 "fragment-cache-0.2.1" = {
2618 name = "fragment-cache";
2619 packageName = "fragment-cache";
2620 version = "0.2.1";
2621 src = fetchurl {
2622 url = "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz";
2623 sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
2624 };
2625 };
2626 "fresh-0.5.2" = {
2627 name = "fresh";
2628 packageName = "fresh";
2629 version = "0.5.2";
2630 src = fetchurl {
2631 url = "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz";
2632 sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
2633 };
2634 };
2635 "fs.realpath-1.0.0" = {
2636 name = "fs.realpath";
2637 packageName = "fs.realpath";
2638 version = "1.0.0";
2639 src = fetchurl {
2640 url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
2641 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
2642 };
2643 };
2644 "fsevents-1.2.12" = {
2645 name = "fsevents";
2646 packageName = "fsevents";
2647 version = "1.2.12";
2648 src = fetchurl {
2649 url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz";
2650 sha512 = "Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==";
2651 };
2652 };
2653 "function-bind-1.1.1" = {
2654 name = "function-bind";
2655 packageName = "function-bind";
2656 version = "1.1.1";
2657 src = fetchurl {
2658 url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz";
2659 sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==";
2660 };
2661 };
2662 "get-caller-file-2.0.5" = {
2663 name = "get-caller-file";
2664 packageName = "get-caller-file";
2665 version = "2.0.5";
2666 src = fetchurl {
2667 url = "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz";
2668 sha512 = "DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==";
2669 };
2670 };
2671 "get-port-3.2.0" = {
2672 name = "get-port";
2673 packageName = "get-port";
2674 version = "3.2.0";
2675 src = fetchurl {
2676 url = "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz";
2677 sha1 = "dd7ce7de187c06c8bf353796ac71e099f0980ebc";
2678 };
2679 };
2680 "get-value-2.0.6" = {
2681 name = "get-value";
2682 packageName = "get-value";
2683 version = "2.0.6";
2684 src = fetchurl {
2685 url = "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz";
2686 sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
2687 };
2688 };
2689 "getpass-0.1.7" = {
2690 name = "getpass";
2691 packageName = "getpass";
2692 version = "0.1.7";
2693 src = fetchurl {
2694 url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
2695 sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
2696 };
2697 };
2698 "glob-7.1.4" = {
2699 name = "glob";
2700 packageName = "glob";
2701 version = "7.1.4";
2702 src = fetchurl {
2703 url = "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz";
2704 sha512 = "hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==";
2705 };
2706 };
2707 "glob-parent-3.1.0" = {
2708 name = "glob-parent";
2709 packageName = "glob-parent";
2710 version = "3.1.0";
2711 src = fetchurl {
2712 url = "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz";
2713 sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
2714 };
2715 };
2716 "glob-to-regexp-0.3.0" = {
2717 name = "glob-to-regexp";
2718 packageName = "glob-to-regexp";
2719 version = "0.3.0";
2720 src = fetchurl {
2721 url = "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz";
2722 sha1 = "8c5a1494d2066c570cc3bfe4496175acc4d502ab";
2723 };
2724 };
2725 "globals-11.12.0" = {
2726 name = "globals";
2727 packageName = "globals";
2728 version = "11.12.0";
2729 src = fetchurl {
2730 url = "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz";
2731 sha512 = "WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==";
2732 };
2733 };
2734 "graceful-fs-4.2.3" = {
2735 name = "graceful-fs";
2736 packageName = "graceful-fs";
2737 version = "4.2.3";
2738 src = fetchurl {
2739 url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz";
2740 sha512 = "a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==";
2741 };
2742 };
2743 "grapheme-breaker-0.3.2" = {
2744 name = "grapheme-breaker";
2745 packageName = "grapheme-breaker";
2746 version = "0.3.2";
2747 src = fetchurl {
2748 url = "https://registry.npmjs.org/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz";
2749 sha1 = "5b9e6b78c3832452d2ba2bb1cb830f96276410ac";
2750 };
2751 };
2752 "har-schema-2.0.0" = {
2753 name = "har-schema";
2754 packageName = "har-schema";
2755 version = "2.0.0";
2756 src = fetchurl {
2757 url = "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";
2758 sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
2759 };
2760 };
2761 "har-validator-5.1.3" = {
2762 name = "har-validator";
2763 packageName = "har-validator";
2764 version = "5.1.3";
2765 src = fetchurl {
2766 url = "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz";
2767 sha512 = "sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==";
2768 };
2769 };
2770 "has-1.0.3" = {
2771 name = "has";
2772 packageName = "has";
2773 version = "1.0.3";
2774 src = fetchurl {
2775 url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz";
2776 sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==";
2777 };
2778 };
2779 "has-ansi-2.0.0" = {
2780 name = "has-ansi";
2781 packageName = "has-ansi";
2782 version = "2.0.0";
2783 src = fetchurl {
2784 url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
2785 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
2786 };
2787 };
2788 "has-flag-1.0.0" = {
2789 name = "has-flag";
2790 packageName = "has-flag";
2791 version = "1.0.0";
2792 src = fetchurl {
2793 url = "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz";
2794 sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa";
2795 };
2796 };
2797 "has-flag-3.0.0" = {
2798 name = "has-flag";
2799 packageName = "has-flag";
2800 version = "3.0.0";
2801 src = fetchurl {
2802 url = "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz";
2803 sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
2804 };
2805 };
2806 "has-symbols-1.0.1" = {
2807 name = "has-symbols";
2808 packageName = "has-symbols";
2809 version = "1.0.1";
2810 src = fetchurl {
2811 url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz";
2812 sha512 = "PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==";
2813 };
2814 };
2815 "has-value-0.3.1" = {
2816 name = "has-value";
2817 packageName = "has-value";
2818 version = "0.3.1";
2819 src = fetchurl {
2820 url = "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz";
2821 sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
2822 };
2823 };
2824 "has-value-1.0.0" = {
2825 name = "has-value";
2826 packageName = "has-value";
2827 version = "1.0.0";
2828 src = fetchurl {
2829 url = "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz";
2830 sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
2831 };
2832 };
2833 "has-values-0.1.4" = {
2834 name = "has-values";
2835 packageName = "has-values";
2836 version = "0.1.4";
2837 src = fetchurl {
2838 url = "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz";
2839 sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
2840 };
2841 };
2842 "has-values-1.0.0" = {
2843 name = "has-values";
2844 packageName = "has-values";
2845 version = "1.0.0";
2846 src = fetchurl {
2847 url = "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz";
2848 sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
2849 };
2850 };
2851 "hash-base-3.0.4" = {
2852 name = "hash-base";
2853 packageName = "hash-base";
2854 version = "3.0.4";
2855 src = fetchurl {
2856 url = "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz";
2857 sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918";
2858 };
2859 };
2860 "hash.js-1.1.7" = {
2861 name = "hash.js";
2862 packageName = "hash.js";
2863 version = "1.1.7";
2864 src = fetchurl {
2865 url = "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz";
2866 sha512 = "taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==";
2867 };
2868 };
2869 "hex-color-regex-1.1.0" = {
2870 name = "hex-color-regex";
2871 packageName = "hex-color-regex";
2872 version = "1.1.0";
2873 src = fetchurl {
2874 url = "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz";
2875 sha512 = "l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==";
2876 };
2877 };
2878 "hmac-drbg-1.0.1" = {
2879 name = "hmac-drbg";
2880 packageName = "hmac-drbg";
2881 version = "1.0.1";
2882 src = fetchurl {
2883 url = "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz";
2884 sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1";
2885 };
2886 };
2887 "hsl-regex-1.0.0" = {
2888 name = "hsl-regex";
2889 packageName = "hsl-regex";
2890 version = "1.0.0";
2891 src = fetchurl {
2892 url = "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz";
2893 sha1 = "d49330c789ed819e276a4c0d272dffa30b18fe6e";
2894 };
2895 };
2896 "hsla-regex-1.0.0" = {
2897 name = "hsla-regex";
2898 packageName = "hsla-regex";
2899 version = "1.0.0";
2900 src = fetchurl {
2901 url = "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz";
2902 sha1 = "c1ce7a3168c8c6614033a4b5f7877f3b225f9c38";
2903 };
2904 };
2905 "html-comment-regex-1.1.2" = {
2906 name = "html-comment-regex";
2907 packageName = "html-comment-regex";
2908 version = "1.1.2";
2909 src = fetchurl {
2910 url = "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz";
2911 sha512 = "P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==";
2912 };
2913 };
2914 "html-encoding-sniffer-1.0.2" = {
2915 name = "html-encoding-sniffer";
2916 packageName = "html-encoding-sniffer";
2917 version = "1.0.2";
2918 src = fetchurl {
2919 url = "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz";
2920 sha512 = "71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==";
2921 };
2922 };
2923 "html-tags-1.2.0" = {
2924 name = "html-tags";
2925 packageName = "html-tags";
2926 version = "1.2.0";
2927 src = fetchurl {
2928 url = "https://registry.npmjs.org/html-tags/-/html-tags-1.2.0.tgz";
2929 sha1 = "c78de65b5663aa597989dd2b7ab49200d7e4db98";
2930 };
2931 };
2932 "htmlnano-0.2.5" = {
2933 name = "htmlnano";
2934 packageName = "htmlnano";
2935 version = "0.2.5";
2936 src = fetchurl {
2937 url = "https://registry.npmjs.org/htmlnano/-/htmlnano-0.2.5.tgz";
2938 sha512 = "X1iPSwXG/iF9bVs+/obt2n6F64uH0ETkA8zp7qFDmLW9/+A6ueHGeb/+qD67T21qUY22owZPMdawljN50ajkqA==";
2939 };
2940 };
2941 "htmlparser2-3.10.1" = {
2942 name = "htmlparser2";
2943 packageName = "htmlparser2";
2944 version = "3.10.1";
2945 src = fetchurl {
2946 url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz";
2947 sha512 = "IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==";
2948 };
2949 };
2950 "http-errors-1.7.3" = {
2951 name = "http-errors";
2952 packageName = "http-errors";
2953 version = "1.7.3";
2954 src = fetchurl {
2955 url = "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz";
2956 sha512 = "ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==";
2957 };
2958 };
2959 "http-signature-1.2.0" = {
2960 name = "http-signature";
2961 packageName = "http-signature";
2962 version = "1.2.0";
2963 src = fetchurl {
2964 url = "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";
2965 sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
2966 };
2967 };
2968 "https-browserify-1.0.0" = {
2969 name = "https-browserify";
2970 packageName = "https-browserify";
2971 version = "1.0.0";
2972 src = fetchurl {
2973 url = "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz";
2974 sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
2975 };
2976 };
2977 "iconv-lite-0.4.24" = {
2978 name = "iconv-lite";
2979 packageName = "iconv-lite";
2980 version = "0.4.24";
2981 src = fetchurl {
2982 url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz";
2983 sha512 = "v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==";
2984 };
2985 };
2986 "icss-replace-symbols-1.1.0" = {
2987 name = "icss-replace-symbols";
2988 packageName = "icss-replace-symbols";
2989 version = "1.1.0";
2990 src = fetchurl {
2991 url = "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz";
2992 sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded";
2993 };
2994 };
2995 "ieee754-1.1.13" = {
2996 name = "ieee754";
2997 packageName = "ieee754";
2998 version = "1.1.13";
2999 src = fetchurl {
3000 url = "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz";
3001 sha512 = "4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==";
3002 };
3003 };
3004 "import-fresh-2.0.0" = {
3005 name = "import-fresh";
3006 packageName = "import-fresh";
3007 version = "2.0.0";
3008 src = fetchurl {
3009 url = "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz";
3010 sha1 = "d81355c15612d386c61f9ddd3922d4304822a546";
3011 };
3012 };
3013 "indexes-of-1.0.1" = {
3014 name = "indexes-of";
3015 packageName = "indexes-of";
3016 version = "1.0.1";
3017 src = fetchurl {
3018 url = "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz";
3019 sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607";
3020 };
3021 };
3022 "inflight-1.0.6" = {
3023 name = "inflight";
3024 packageName = "inflight";
3025 version = "1.0.6";
3026 src = fetchurl {
3027 url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
3028 sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
3029 };
3030 };
3031 "inherits-2.0.1" = {
3032 name = "inherits";
3033 packageName = "inherits";
3034 version = "2.0.1";
3035 src = fetchurl {
3036 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz";
3037 sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
3038 };
3039 };
3040 "inherits-2.0.3" = {
3041 name = "inherits";
3042 packageName = "inherits";
3043 version = "2.0.3";
3044 src = fetchurl {
3045 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
3046 sha1 = "633c2c83e3da42a502f52466022480f4208261de";
3047 };
3048 };
3049 "inherits-2.0.4" = {
3050 name = "inherits";
3051 packageName = "inherits";
3052 version = "2.0.4";
3053 src = fetchurl {
3054 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz";
3055 sha512 = "k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==";
3056 };
3057 };
3058 "ini-1.3.5" = {
3059 name = "ini";
3060 packageName = "ini";
3061 version = "1.3.5";
3062 src = fetchurl {
3063 url = "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz";
3064 sha512 = "RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==";
3065 };
3066 };
3067 "invariant-2.2.4" = {
3068 name = "invariant";
3069 packageName = "invariant";
3070 version = "2.2.4";
3071 src = fetchurl {
3072 url = "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz";
3073 sha512 = "phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==";
3074 };
3075 };
3076 "is-absolute-url-2.1.0" = {
3077 name = "is-absolute-url";
3078 packageName = "is-absolute-url";
3079 version = "2.1.0";
3080 src = fetchurl {
3081 url = "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz";
3082 sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6";
3083 };
3084 };
3085 "is-absolute-url-3.0.3" = {
3086 name = "is-absolute-url";
3087 packageName = "is-absolute-url";
3088 version = "3.0.3";
3089 src = fetchurl {
3090 url = "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz";
3091 sha512 = "opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==";
3092 };
3093 };
3094 "is-accessor-descriptor-0.1.6" = {
3095 name = "is-accessor-descriptor";
3096 packageName = "is-accessor-descriptor";
3097 version = "0.1.6";
3098 src = fetchurl {
3099 url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
3100 sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
3101 };
3102 };
3103 "is-accessor-descriptor-1.0.0" = {
3104 name = "is-accessor-descriptor";
3105 packageName = "is-accessor-descriptor";
3106 version = "1.0.0";
3107 src = fetchurl {
3108 url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
3109 sha512 = "m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==";
3110 };
3111 };
3112 "is-arrayish-0.2.1" = {
3113 name = "is-arrayish";
3114 packageName = "is-arrayish";
3115 version = "0.2.1";
3116 src = fetchurl {
3117 url = "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz";
3118 sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
3119 };
3120 };
3121 "is-arrayish-0.3.2" = {
3122 name = "is-arrayish";
3123 packageName = "is-arrayish";
3124 version = "0.3.2";
3125 src = fetchurl {
3126 url = "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz";
3127 sha512 = "eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==";
3128 };
3129 };
3130 "is-binary-path-1.0.1" = {
3131 name = "is-binary-path";
3132 packageName = "is-binary-path";
3133 version = "1.0.1";
3134 src = fetchurl {
3135 url = "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz";
3136 sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
3137 };
3138 };
3139 "is-buffer-1.1.6" = {
3140 name = "is-buffer";
3141 packageName = "is-buffer";
3142 version = "1.1.6";
3143 src = fetchurl {
3144 url = "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz";
3145 sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==";
3146 };
3147 };
3148 "is-callable-1.1.5" = {
3149 name = "is-callable";
3150 packageName = "is-callable";
3151 version = "1.1.5";
3152 src = fetchurl {
3153 url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz";
3154 sha512 = "ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==";
3155 };
3156 };
3157 "is-color-stop-1.1.0" = {
3158 name = "is-color-stop";
3159 packageName = "is-color-stop";
3160 version = "1.1.0";
3161 src = fetchurl {
3162 url = "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz";
3163 sha1 = "cfff471aee4dd5c9e158598fbe12967b5cdad345";
3164 };
3165 };
3166 "is-data-descriptor-0.1.4" = {
3167 name = "is-data-descriptor";
3168 packageName = "is-data-descriptor";
3169 version = "0.1.4";
3170 src = fetchurl {
3171 url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
3172 sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
3173 };
3174 };
3175 "is-data-descriptor-1.0.0" = {
3176 name = "is-data-descriptor";
3177 packageName = "is-data-descriptor";
3178 version = "1.0.0";
3179 src = fetchurl {
3180 url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
3181 sha512 = "jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==";
3182 };
3183 };
3184 "is-date-object-1.0.2" = {
3185 name = "is-date-object";
3186 packageName = "is-date-object";
3187 version = "1.0.2";
3188 src = fetchurl {
3189 url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz";
3190 sha512 = "USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==";
3191 };
3192 };
3193 "is-descriptor-0.1.6" = {
3194 name = "is-descriptor";
3195 packageName = "is-descriptor";
3196 version = "0.1.6";
3197 src = fetchurl {
3198 url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz";
3199 sha512 = "avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==";
3200 };
3201 };
3202 "is-descriptor-1.0.2" = {
3203 name = "is-descriptor";
3204 packageName = "is-descriptor";
3205 version = "1.0.2";
3206 src = fetchurl {
3207 url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz";
3208 sha512 = "2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==";
3209 };
3210 };
3211 "is-directory-0.3.1" = {
3212 name = "is-directory";
3213 packageName = "is-directory";
3214 version = "0.3.1";
3215 src = fetchurl {
3216 url = "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz";
3217 sha1 = "61339b6f2475fc772fd9c9d83f5c8575dc154ae1";
3218 };
3219 };
3220 "is-extendable-0.1.1" = {
3221 name = "is-extendable";
3222 packageName = "is-extendable";
3223 version = "0.1.1";
3224 src = fetchurl {
3225 url = "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz";
3226 sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
3227 };
3228 };
3229 "is-extendable-1.0.1" = {
3230 name = "is-extendable";
3231 packageName = "is-extendable";
3232 version = "1.0.1";
3233 src = fetchurl {
3234 url = "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz";
3235 sha512 = "arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==";
3236 };
3237 };
3238 "is-extglob-2.1.1" = {
3239 name = "is-extglob";
3240 packageName = "is-extglob";
3241 version = "2.1.1";
3242 src = fetchurl {
3243 url = "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz";
3244 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
3245 };
3246 };
3247 "is-fullwidth-code-point-2.0.0" = {
3248 name = "is-fullwidth-code-point";
3249 packageName = "is-fullwidth-code-point";
3250 version = "2.0.0";
3251 src = fetchurl {
3252 url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
3253 sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
3254 };
3255 };
3256 "is-glob-3.1.0" = {
3257 name = "is-glob";
3258 packageName = "is-glob";
3259 version = "3.1.0";
3260 src = fetchurl {
3261 url = "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz";
3262 sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
3263 };
3264 };
3265 "is-glob-4.0.1" = {
3266 name = "is-glob";
3267 packageName = "is-glob";
3268 version = "4.0.1";
3269 src = fetchurl {
3270 url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz";
3271 sha512 = "5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==";
3272 };
3273 };
3274 "is-html-1.1.0" = {
3275 name = "is-html";
3276 packageName = "is-html";
3277 version = "1.1.0";
3278 src = fetchurl {
3279 url = "https://registry.npmjs.org/is-html/-/is-html-1.1.0.tgz";
3280 sha1 = "e04f1c18d39485111396f9a0273eab51af218464";
3281 };
3282 };
3283 "is-number-3.0.0" = {
3284 name = "is-number";
3285 packageName = "is-number";
3286 version = "3.0.0";
3287 src = fetchurl {
3288 url = "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz";
3289 sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
3290 };
3291 };
3292 "is-obj-2.0.0" = {
3293 name = "is-obj";
3294 packageName = "is-obj";
3295 version = "2.0.0";
3296 src = fetchurl {
3297 url = "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz";
3298 sha512 = "drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==";
3299 };
3300 };
3301 "is-plain-object-2.0.4" = {
3302 name = "is-plain-object";
3303 packageName = "is-plain-object";
3304 version = "2.0.4";
3305 src = fetchurl {
3306 url = "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz";
3307 sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==";
3308 };
3309 };
3310 "is-regex-1.0.5" = {
3311 name = "is-regex";
3312 packageName = "is-regex";
3313 version = "1.0.5";
3314 src = fetchurl {
3315 url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz";
3316 sha512 = "vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==";
3317 };
3318 };
3319 "is-resolvable-1.1.0" = {
3320 name = "is-resolvable";
3321 packageName = "is-resolvable";
3322 version = "1.1.0";
3323 src = fetchurl {
3324 url = "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz";
3325 sha512 = "qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==";
3326 };
3327 };
3328 "is-svg-3.0.0" = {
3329 name = "is-svg";
3330 packageName = "is-svg";
3331 version = "3.0.0";
3332 src = fetchurl {
3333 url = "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz";
3334 sha512 = "gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==";
3335 };
3336 };
3337 "is-symbol-1.0.3" = {
3338 name = "is-symbol";
3339 packageName = "is-symbol";
3340 version = "1.0.3";
3341 src = fetchurl {
3342 url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz";
3343 sha512 = "OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==";
3344 };
3345 };
3346 "is-typedarray-1.0.0" = {
3347 name = "is-typedarray";
3348 packageName = "is-typedarray";
3349 version = "1.0.0";
3350 src = fetchurl {
3351 url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
3352 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
3353 };
3354 };
3355 "is-url-1.2.4" = {
3356 name = "is-url";
3357 packageName = "is-url";
3358 version = "1.2.4";
3359 src = fetchurl {
3360 url = "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz";
3361 sha512 = "ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==";
3362 };
3363 };
3364 "is-windows-1.0.2" = {
3365 name = "is-windows";
3366 packageName = "is-windows";
3367 version = "1.0.2";
3368 src = fetchurl {
3369 url = "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz";
3370 sha512 = "eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==";
3371 };
3372 };
3373 "is-wsl-1.1.0" = {
3374 name = "is-wsl";
3375 packageName = "is-wsl";
3376 version = "1.1.0";
3377 src = fetchurl {
3378 url = "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz";
3379 sha1 = "1f16e4aa22b04d1336b66188a66af3c600c3a66d";
3380 };
3381 };
3382 "isarray-1.0.0" = {
3383 name = "isarray";
3384 packageName = "isarray";
3385 version = "1.0.0";
3386 src = fetchurl {
3387 url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
3388 sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
3389 };
3390 };
3391 "isarray-2.0.5" = {
3392 name = "isarray";
3393 packageName = "isarray";
3394 version = "2.0.5";
3395 src = fetchurl {
3396 url = "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz";
3397 sha512 = "xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==";
3398 };
3399 };
3400 "isexe-2.0.0" = {
3401 name = "isexe";
3402 packageName = "isexe";
3403 version = "2.0.0";
3404 src = fetchurl {
3405 url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";
3406 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
3407 };
3408 };
3409 "isobject-2.1.0" = {
3410 name = "isobject";
3411 packageName = "isobject";
3412 version = "2.1.0";
3413 src = fetchurl {
3414 url = "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz";
3415 sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
3416 };
3417 };
3418 "isobject-3.0.1" = {
3419 name = "isobject";
3420 packageName = "isobject";
3421 version = "3.0.1";
3422 src = fetchurl {
3423 url = "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz";
3424 sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
3425 };
3426 };
3427 "isstream-0.1.2" = {
3428 name = "isstream";
3429 packageName = "isstream";
3430 version = "0.1.2";
3431 src = fetchurl {
3432 url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
3433 sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
3434 };
3435 };
3436 "js-beautify-1.11.0" = {
3437 name = "js-beautify";
3438 packageName = "js-beautify";
3439 version = "1.11.0";
3440 src = fetchurl {
3441 url = "https://registry.npmjs.org/js-beautify/-/js-beautify-1.11.0.tgz";
3442 sha512 = "a26B+Cx7USQGSWnz9YxgJNMmML/QG2nqIaL7VVYPCXbqiKz8PN0waSNvroMtvAK6tY7g/wPdNWGEP+JTNIBr6A==";
3443 };
3444 };
3445 "js-levenshtein-1.1.6" = {
3446 name = "js-levenshtein";
3447 packageName = "js-levenshtein";
3448 version = "1.1.6";
3449 src = fetchurl {
3450 url = "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz";
3451 sha512 = "X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==";
3452 };
3453 };
3454 "js-tokens-4.0.0" = {
3455 name = "js-tokens";
3456 packageName = "js-tokens";
3457 version = "4.0.0";
3458 src = fetchurl {
3459 url = "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz";
3460 sha512 = "RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==";
3461 };
3462 };
3463 "js-yaml-3.13.1" = {
3464 name = "js-yaml";
3465 packageName = "js-yaml";
3466 version = "3.13.1";
3467 src = fetchurl {
3468 url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz";
3469 sha512 = "YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==";
3470 };
3471 };
3472 "jsbn-0.1.1" = {
3473 name = "jsbn";
3474 packageName = "jsbn";
3475 version = "0.1.1";
3476 src = fetchurl {
3477 url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
3478 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
3479 };
3480 };
3481 "jsdom-14.1.0" = {
3482 name = "jsdom";
3483 packageName = "jsdom";
3484 version = "14.1.0";
3485 src = fetchurl {
3486 url = "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz";
3487 sha512 = "O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==";
3488 };
3489 };
3490 "jsesc-0.5.0" = {
3491 name = "jsesc";
3492 packageName = "jsesc";
3493 version = "0.5.0";
3494 src = fetchurl {
3495 url = "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz";
3496 sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
3497 };
3498 };
3499 "jsesc-2.5.2" = {
3500 name = "jsesc";
3501 packageName = "jsesc";
3502 version = "2.5.2";
3503 src = fetchurl {
3504 url = "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz";
3505 sha512 = "OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==";
3506 };
3507 };
3508 "json-parse-better-errors-1.0.2" = {
3509 name = "json-parse-better-errors";
3510 packageName = "json-parse-better-errors";
3511 version = "1.0.2";
3512 src = fetchurl {
3513 url = "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz";
3514 sha512 = "mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==";
3515 };
3516 };
3517 "json-schema-0.2.3" = {
3518 name = "json-schema";
3519 packageName = "json-schema";
3520 version = "0.2.3";
3521 src = fetchurl {
3522 url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
3523 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
3524 };
3525 };
3526 "json-schema-traverse-0.4.1" = {
3527 name = "json-schema-traverse";
3528 packageName = "json-schema-traverse";
3529 version = "0.4.1";
3530 src = fetchurl {
3531 url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
3532 sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
3533 };
3534 };
3535 "json-stringify-safe-5.0.1" = {
3536 name = "json-stringify-safe";
3537 packageName = "json-stringify-safe";
3538 version = "5.0.1";
3539 src = fetchurl {
3540 url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
3541 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
3542 };
3543 };
3544 "json5-1.0.1" = {
3545 name = "json5";
3546 packageName = "json5";
3547 version = "1.0.1";
3548 src = fetchurl {
3549 url = "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz";
3550 sha512 = "aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==";
3551 };
3552 };
3553 "json5-2.1.3" = {
3554 name = "json5";
3555 packageName = "json5";
3556 version = "2.1.3";
3557 src = fetchurl {
3558 url = "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz";
3559 sha512 = "KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==";
3560 };
3561 };
3562 "jsprim-1.4.1" = {
3563 name = "jsprim";
3564 packageName = "jsprim";
3565 version = "1.4.1";
3566 src = fetchurl {
3567 url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
3568 sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
3569 };
3570 };
3571 "kind-of-3.2.2" = {
3572 name = "kind-of";
3573 packageName = "kind-of";
3574 version = "3.2.2";
3575 src = fetchurl {
3576 url = "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz";
3577 sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
3578 };
3579 };
3580 "kind-of-4.0.0" = {
3581 name = "kind-of";
3582 packageName = "kind-of";
3583 version = "4.0.0";
3584 src = fetchurl {
3585 url = "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz";
3586 sha1 = "20813df3d712928b207378691a45066fae72dd57";
3587 };
3588 };
3589 "kind-of-5.1.0" = {
3590 name = "kind-of";
3591 packageName = "kind-of";
3592 version = "5.1.0";
3593 src = fetchurl {
3594 url = "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz";
3595 sha512 = "NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==";
3596 };
3597 };
3598 "kind-of-6.0.3" = {
3599 name = "kind-of";
3600 packageName = "kind-of";
3601 version = "6.0.3";
3602 src = fetchurl {
3603 url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz";
3604 sha512 = "dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==";
3605 };
3606 };
3607 "levn-0.3.0" = {
3608 name = "levn";
3609 packageName = "levn";
3610 version = "0.3.0";
3611 src = fetchurl {
3612 url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
3613 sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
3614 };
3615 };
3616 "locate-path-2.0.0" = {
3617 name = "locate-path";
3618 packageName = "locate-path";
3619 version = "2.0.0";
3620 src = fetchurl {
3621 url = "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz";
3622 sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
3623 };
3624 };
3625 "locate-path-3.0.0" = {
3626 name = "locate-path";
3627 packageName = "locate-path";
3628 version = "3.0.0";
3629 src = fetchurl {
3630 url = "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz";
3631 sha512 = "7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==";
3632 };
3633 };
3634 "lodash-4.17.15" = {
3635 name = "lodash";
3636 packageName = "lodash";
3637 version = "4.17.15";
3638 src = fetchurl {
3639 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";
3640 sha512 = "8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==";
3641 };
3642 };
3643 "lodash.clone-4.5.0" = {
3644 name = "lodash.clone";
3645 packageName = "lodash.clone";
3646 version = "4.5.0";
3647 src = fetchurl {
3648 url = "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz";
3649 sha1 = "195870450f5a13192478df4bc3d23d2dea1907b6";
3650 };
3651 };
3652 "lodash.memoize-4.1.2" = {
3653 name = "lodash.memoize";
3654 packageName = "lodash.memoize";
3655 version = "4.1.2";
3656 src = fetchurl {
3657 url = "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz";
3658 sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe";
3659 };
3660 };
3661 "lodash.sortby-4.7.0" = {
3662 name = "lodash.sortby";
3663 packageName = "lodash.sortby";
3664 version = "4.7.0";
3665 src = fetchurl {
3666 url = "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz";
3667 sha1 = "edd14c824e2cc9c1e0b0a1b42bb5210516a42438";
3668 };
3669 };
3670 "lodash.uniq-4.5.0" = {
3671 name = "lodash.uniq";
3672 packageName = "lodash.uniq";
3673 version = "4.5.0";
3674 src = fetchurl {
3675 url = "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
3676 sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
3677 };
3678 };
3679 "log-symbols-2.2.0" = {
3680 name = "log-symbols";
3681 packageName = "log-symbols";
3682 version = "2.2.0";
3683 src = fetchurl {
3684 url = "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz";
3685 sha512 = "VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==";
3686 };
3687 };
3688 "loose-envify-1.4.0" = {
3689 name = "loose-envify";
3690 packageName = "loose-envify";
3691 version = "1.4.0";
3692 src = fetchurl {
3693 url = "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz";
3694 sha512 = "lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==";
3695 };
3696 };
3697 "lru-cache-4.1.5" = {
3698 name = "lru-cache";
3699 packageName = "lru-cache";
3700 version = "4.1.5";
3701 src = fetchurl {
3702 url = "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz";
3703 sha512 = "sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==";
3704 };
3705 };
3706 "magic-string-0.22.5" = {
3707 name = "magic-string";
3708 packageName = "magic-string";
3709 version = "0.22.5";
3710 src = fetchurl {
3711 url = "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz";
3712 sha512 = "oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==";
3713 };
3714 };
3715 "map-cache-0.2.2" = {
3716 name = "map-cache";
3717 packageName = "map-cache";
3718 version = "0.2.2";
3719 src = fetchurl {
3720 url = "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz";
3721 sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
3722 };
3723 };
3724 "map-visit-1.0.0" = {
3725 name = "map-visit";
3726 packageName = "map-visit";
3727 version = "1.0.0";
3728 src = fetchurl {
3729 url = "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz";
3730 sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
3731 };
3732 };
3733 "md5.js-1.3.5" = {
3734 name = "md5.js";
3735 packageName = "md5.js";
3736 version = "1.3.5";
3737 src = fetchurl {
3738 url = "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz";
3739 sha512 = "xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==";
3740 };
3741 };
3742 "mdn-data-2.0.4" = {
3743 name = "mdn-data";
3744 packageName = "mdn-data";
3745 version = "2.0.4";
3746 src = fetchurl {
3747 url = "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz";
3748 sha512 = "iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==";
3749 };
3750 };
3751 "mdn-data-2.0.6" = {
3752 name = "mdn-data";
3753 packageName = "mdn-data";
3754 version = "2.0.6";
3755 src = fetchurl {
3756 url = "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz";
3757 sha512 = "rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==";
3758 };
3759 };
3760 "merge-source-map-1.0.4" = {
3761 name = "merge-source-map";
3762 packageName = "merge-source-map";
3763 version = "1.0.4";
3764 src = fetchurl {
3765 url = "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz";
3766 sha1 = "a5de46538dae84d4114cc5ea02b4772a6346701f";
3767 };
3768 };
3769 "merge2-1.3.0" = {
3770 name = "merge2";
3771 packageName = "merge2";
3772 version = "1.3.0";
3773 src = fetchurl {
3774 url = "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz";
3775 sha512 = "2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==";
3776 };
3777 };
3778 "micromatch-3.1.10" = {
3779 name = "micromatch";
3780 packageName = "micromatch";
3781 version = "3.1.10";
3782 src = fetchurl {
3783 url = "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz";
3784 sha512 = "MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==";
3785 };
3786 };
3787 "miller-rabin-4.0.1" = {
3788 name = "miller-rabin";
3789 packageName = "miller-rabin";
3790 version = "4.0.1";
3791 src = fetchurl {
3792 url = "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz";
3793 sha512 = "115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==";
3794 };
3795 };
3796 "mime-1.6.0" = {
3797 name = "mime";
3798 packageName = "mime";
3799 version = "1.6.0";
3800 src = fetchurl {
3801 url = "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz";
3802 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
3803 };
3804 };
3805 "mime-db-1.44.0" = {
3806 name = "mime-db";
3807 packageName = "mime-db";
3808 version = "1.44.0";
3809 src = fetchurl {
3810 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz";
3811 sha512 = "/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==";
3812 };
3813 };
3814 "mime-types-2.1.27" = {
3815 name = "mime-types";
3816 packageName = "mime-types";
3817 version = "2.1.27";
3818 src = fetchurl {
3819 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz";
3820 sha512 = "JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==";
3821 };
3822 };
3823 "mimic-fn-1.2.0" = {
3824 name = "mimic-fn";
3825 packageName = "mimic-fn";
3826 version = "1.2.0";
3827 src = fetchurl {
3828 url = "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz";
3829 sha512 = "jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==";
3830 };
3831 };
3832 "minimalistic-assert-1.0.1" = {
3833 name = "minimalistic-assert";
3834 packageName = "minimalistic-assert";
3835 version = "1.0.1";
3836 src = fetchurl {
3837 url = "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
3838 sha512 = "UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==";
3839 };
3840 };
3841 "minimalistic-crypto-utils-1.0.1" = {
3842 name = "minimalistic-crypto-utils";
3843 packageName = "minimalistic-crypto-utils";
3844 version = "1.0.1";
3845 src = fetchurl {
3846 url = "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz";
3847 sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
3848 };
3849 };
3850 "minimatch-3.0.4" = {
3851 name = "minimatch";
3852 packageName = "minimatch";
3853 version = "3.0.4";
3854 src = fetchurl {
3855 url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
3856 sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
3857 };
3858 };
3859 "minimist-1.2.5" = {
3860 name = "minimist";
3861 packageName = "minimist";
3862 version = "1.2.5";
3863 src = fetchurl {
3864 url = "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";
3865 sha512 = "FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==";
3866 };
3867 };
3868 "mixin-deep-1.3.2" = {
3869 name = "mixin-deep";
3870 packageName = "mixin-deep";
3871 version = "1.3.2";
3872 src = fetchurl {
3873 url = "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz";
3874 sha512 = "WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==";
3875 };
3876 };
3877 "mkdirp-0.5.5" = {
3878 name = "mkdirp";
3879 packageName = "mkdirp";
3880 version = "0.5.5";
3881 src = fetchurl {
3882 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz";
3883 sha512 = "NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==";
3884 };
3885 };
3886 "mkdirp-1.0.4" = {
3887 name = "mkdirp";
3888 packageName = "mkdirp";
3889 version = "1.0.4";
3890 src = fetchurl {
3891 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz";
3892 sha512 = "vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==";
3893 };
3894 };
3895 "ms-2.0.0" = {
3896 name = "ms";
3897 packageName = "ms";
3898 version = "2.0.0";
3899 src = fetchurl {
3900 url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz";
3901 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
3902 };
3903 };
3904 "ms-2.1.1" = {
3905 name = "ms";
3906 packageName = "ms";
3907 version = "2.1.1";
3908 src = fetchurl {
3909 url = "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz";
3910 sha512 = "tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==";
3911 };
3912 };
3913 "ms-2.1.2" = {
3914 name = "ms";
3915 packageName = "ms";
3916 version = "2.1.2";
3917 src = fetchurl {
3918 url = "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz";
3919 sha512 = "sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==";
3920 };
3921 };
3922 "nan-2.14.1" = {
3923 name = "nan";
3924 packageName = "nan";
3925 version = "2.14.1";
3926 src = fetchurl {
3927 url = "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz";
3928 sha512 = "isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==";
3929 };
3930 };
3931 "nanomatch-1.2.13" = {
3932 name = "nanomatch";
3933 packageName = "nanomatch";
3934 version = "1.2.13";
3935 src = fetchurl {
3936 url = "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz";
3937 sha512 = "fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==";
3938 };
3939 };
3940 "nice-try-1.0.5" = {
3941 name = "nice-try";
3942 packageName = "nice-try";
3943 version = "1.0.5";
3944 src = fetchurl {
3945 url = "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz";
3946 sha512 = "1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==";
3947 };
3948 };
3949 "node-addon-api-1.7.1" = {
3950 name = "node-addon-api";
3951 packageName = "node-addon-api";
3952 version = "1.7.1";
3953 src = fetchurl {
3954 url = "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.1.tgz";
3955 sha512 = "2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ==";
3956 };
3957 };
3958 "node-elm-compiler-5.0.4" = {
3959 name = "node-elm-compiler";
3960 packageName = "node-elm-compiler";
3961 version = "5.0.4";
3962 src = fetchurl {
3963 url = "https://registry.npmjs.org/node-elm-compiler/-/node-elm-compiler-5.0.4.tgz";
3964 sha512 = "VQsT8QSierYGkHzRed+b4MnccQVF1+qPHunE8jBoU7jD6YpuRqCDPzEoC2zfyEJS80qVnlMZrqobLnyjzX9lJg==";
3965 };
3966 };
3967 "node-forge-0.7.6" = {
3968 name = "node-forge";
3969 packageName = "node-forge";
3970 version = "0.7.6";
3971 src = fetchurl {
3972 url = "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz";
3973 sha512 = "sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==";
3974 };
3975 };
3976 "node-libs-browser-2.2.1" = {
3977 name = "node-libs-browser";
3978 packageName = "node-libs-browser";
3979 version = "2.2.1";
3980 src = fetchurl {
3981 url = "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz";
3982 sha512 = "h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==";
3983 };
3984 };
3985 "node-releases-1.1.53" = {
3986 name = "node-releases";
3987 packageName = "node-releases";
3988 version = "1.1.53";
3989 src = fetchurl {
3990 url = "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz";
3991 sha512 = "wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==";
3992 };
3993 };
3994 "nopt-4.0.3" = {
3995 name = "nopt";
3996 packageName = "nopt";
3997 version = "4.0.3";
3998 src = fetchurl {
3999 url = "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz";
4000 sha512 = "CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==";
4001 };
4002 };
4003 "normalize-html-whitespace-1.0.0" = {
4004 name = "normalize-html-whitespace";
4005 packageName = "normalize-html-whitespace";
4006 version = "1.0.0";
4007 src = fetchurl {
4008 url = "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz";
4009 sha512 = "9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==";
4010 };
4011 };
4012 "normalize-path-2.1.1" = {
4013 name = "normalize-path";
4014 packageName = "normalize-path";
4015 version = "2.1.1";
4016 src = fetchurl {
4017 url = "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz";
4018 sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
4019 };
4020 };
4021 "normalize-path-3.0.0" = {
4022 name = "normalize-path";
4023 packageName = "normalize-path";
4024 version = "3.0.0";
4025 src = fetchurl {
4026 url = "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz";
4027 sha512 = "6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==";
4028 };
4029 };
4030 "normalize-url-3.3.0" = {
4031 name = "normalize-url";
4032 packageName = "normalize-url";
4033 version = "3.3.0";
4034 src = fetchurl {
4035 url = "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz";
4036 sha512 = "U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==";
4037 };
4038 };
4039 "nth-check-1.0.2" = {
4040 name = "nth-check";
4041 packageName = "nth-check";
4042 version = "1.0.2";
4043 src = fetchurl {
4044 url = "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz";
4045 sha512 = "WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==";
4046 };
4047 };
4048 "nwsapi-2.2.0" = {
4049 name = "nwsapi";
4050 packageName = "nwsapi";
4051 version = "2.2.0";
4052 src = fetchurl {
4053 url = "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz";
4054 sha512 = "h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==";
4055 };
4056 };
4057 "oauth-sign-0.9.0" = {
4058 name = "oauth-sign";
4059 packageName = "oauth-sign";
4060 version = "0.9.0";
4061 src = fetchurl {
4062 url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";
4063 sha512 = "fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==";
4064 };
4065 };
4066 "object-assign-4.1.1" = {
4067 name = "object-assign";
4068 packageName = "object-assign";
4069 version = "4.1.1";
4070 src = fetchurl {
4071 url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";
4072 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
4073 };
4074 };
4075 "object-copy-0.1.0" = {
4076 name = "object-copy";
4077 packageName = "object-copy";
4078 version = "0.1.0";
4079 src = fetchurl {
4080 url = "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz";
4081 sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
4082 };
4083 };
4084 "object-inspect-1.4.1" = {
4085 name = "object-inspect";
4086 packageName = "object-inspect";
4087 version = "1.4.1";
4088 src = fetchurl {
4089 url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz";
4090 sha512 = "wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==";
4091 };
4092 };
4093 "object-inspect-1.7.0" = {
4094 name = "object-inspect";
4095 packageName = "object-inspect";
4096 version = "1.7.0";
4097 src = fetchurl {
4098 url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz";
4099 sha512 = "a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==";
4100 };
4101 };
4102 "object-keys-1.1.1" = {
4103 name = "object-keys";
4104 packageName = "object-keys";
4105 version = "1.1.1";
4106 src = fetchurl {
4107 url = "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz";
4108 sha512 = "NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==";
4109 };
4110 };
4111 "object-visit-1.0.1" = {
4112 name = "object-visit";
4113 packageName = "object-visit";
4114 version = "1.0.1";
4115 src = fetchurl {
4116 url = "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz";
4117 sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
4118 };
4119 };
4120 "object.assign-4.1.0" = {
4121 name = "object.assign";
4122 packageName = "object.assign";
4123 version = "4.1.0";
4124 src = fetchurl {
4125 url = "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz";
4126 sha512 = "exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==";
4127 };
4128 };
4129 "object.getownpropertydescriptors-2.1.0" = {
4130 name = "object.getownpropertydescriptors";
4131 packageName = "object.getownpropertydescriptors";
4132 version = "2.1.0";
4133 src = fetchurl {
4134 url = "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz";
4135 sha512 = "Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==";
4136 };
4137 };
4138 "object.pick-1.3.0" = {
4139 name = "object.pick";
4140 packageName = "object.pick";
4141 version = "1.3.0";
4142 src = fetchurl {
4143 url = "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz";
4144 sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
4145 };
4146 };
4147 "object.values-1.1.1" = {
4148 name = "object.values";
4149 packageName = "object.values";
4150 version = "1.1.1";
4151 src = fetchurl {
4152 url = "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz";
4153 sha512 = "WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==";
4154 };
4155 };
4156 "on-finished-2.3.0" = {
4157 name = "on-finished";
4158 packageName = "on-finished";
4159 version = "2.3.0";
4160 src = fetchurl {
4161 url = "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz";
4162 sha1 = "20f1336481b083cd75337992a16971aa2d906947";
4163 };
4164 };
4165 "once-1.4.0" = {
4166 name = "once";
4167 packageName = "once";
4168 version = "1.4.0";
4169 src = fetchurl {
4170 url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
4171 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
4172 };
4173 };
4174 "onetime-2.0.1" = {
4175 name = "onetime";
4176 packageName = "onetime";
4177 version = "2.0.1";
4178 src = fetchurl {
4179 url = "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz";
4180 sha1 = "067428230fd67443b2794b22bba528b6867962d4";
4181 };
4182 };
4183 "opn-5.5.0" = {
4184 name = "opn";
4185 packageName = "opn";
4186 version = "5.5.0";
4187 src = fetchurl {
4188 url = "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz";
4189 sha512 = "PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==";
4190 };
4191 };
4192 "optionator-0.8.3" = {
4193 name = "optionator";
4194 packageName = "optionator";
4195 version = "0.8.3";
4196 src = fetchurl {
4197 url = "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz";
4198 sha512 = "+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==";
4199 };
4200 };
4201 "ora-2.1.0" = {
4202 name = "ora";
4203 packageName = "ora";
4204 version = "2.1.0";
4205 src = fetchurl {
4206 url = "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz";
4207 sha512 = "hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==";
4208 };
4209 };
4210 "os-browserify-0.3.0" = {
4211 name = "os-browserify";
4212 packageName = "os-browserify";
4213 version = "0.3.0";
4214 src = fetchurl {
4215 url = "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz";
4216 sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
4217 };
4218 };
4219 "os-homedir-1.0.2" = {
4220 name = "os-homedir";
4221 packageName = "os-homedir";
4222 version = "1.0.2";
4223 src = fetchurl {
4224 url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
4225 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
4226 };
4227 };
4228 "os-tmpdir-1.0.2" = {
4229 name = "os-tmpdir";
4230 packageName = "os-tmpdir";
4231 version = "1.0.2";
4232 src = fetchurl {
4233 url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
4234 sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
4235 };
4236 };
4237 "osenv-0.1.5" = {
4238 name = "osenv";
4239 packageName = "osenv";
4240 version = "0.1.5";
4241 src = fetchurl {
4242 url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";
4243 sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
4244 };
4245 };
4246 "p-limit-1.3.0" = {
4247 name = "p-limit";
4248 packageName = "p-limit";
4249 version = "1.3.0";
4250 src = fetchurl {
4251 url = "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz";
4252 sha512 = "vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==";
4253 };
4254 };
4255 "p-limit-2.3.0" = {
4256 name = "p-limit";
4257 packageName = "p-limit";
4258 version = "2.3.0";
4259 src = fetchurl {
4260 url = "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz";
4261 sha512 = "//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==";
4262 };
4263 };
4264 "p-locate-2.0.0" = {
4265 name = "p-locate";
4266 packageName = "p-locate";
4267 version = "2.0.0";
4268 src = fetchurl {
4269 url = "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz";
4270 sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
4271 };
4272 };
4273 "p-locate-3.0.0" = {
4274 name = "p-locate";
4275 packageName = "p-locate";
4276 version = "3.0.0";
4277 src = fetchurl {
4278 url = "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz";
4279 sha512 = "x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==";
4280 };
4281 };
4282 "p-try-1.0.0" = {
4283 name = "p-try";
4284 packageName = "p-try";
4285 version = "1.0.0";
4286 src = fetchurl {
4287 url = "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz";
4288 sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
4289 };
4290 };
4291 "p-try-2.2.0" = {
4292 name = "p-try";
4293 packageName = "p-try";
4294 version = "2.2.0";
4295 src = fetchurl {
4296 url = "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz";
4297 sha512 = "R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==";
4298 };
4299 };
4300 "pako-0.2.9" = {
4301 name = "pako";
4302 packageName = "pako";
4303 version = "0.2.9";
4304 src = fetchurl {
4305 url = "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz";
4306 sha1 = "f3f7522f4ef782348da8161bad9ecfd51bf83a75";
4307 };
4308 };
4309 "pako-1.0.11" = {
4310 name = "pako";
4311 packageName = "pako";
4312 version = "1.0.11";
4313 src = fetchurl {
4314 url = "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz";
4315 sha512 = "4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==";
4316 };
4317 };
4318 "parcel-bundler-1.12.3" = {
4319 name = "parcel-bundler";
4320 packageName = "parcel-bundler";
4321 version = "1.12.3";
4322 src = fetchurl {
4323 url = "https://registry.npmjs.org/parcel-bundler/-/parcel-bundler-1.12.3.tgz";
4324 sha512 = "8bq6lj0hhQeGxD9f9xEkFMXQ3d8TIlf2+isKxoi9bciB0KVEILRGllaPkUgp++5t0anToBh9+tG6ZyInXOC1/A==";
4325 };
4326 };
4327 "parse-asn1-5.1.5" = {
4328 name = "parse-asn1";
4329 packageName = "parse-asn1";
4330 version = "5.1.5";
4331 src = fetchurl {
4332 url = "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz";
4333 sha512 = "jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==";
4334 };
4335 };
4336 "parse-json-4.0.0" = {
4337 name = "parse-json";
4338 packageName = "parse-json";
4339 version = "4.0.0";
4340 src = fetchurl {
4341 url = "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz";
4342 sha1 = "be35f5425be1f7f6c747184f98a788cb99477ee0";
4343 };
4344 };
4345 "parse5-5.1.0" = {
4346 name = "parse5";
4347 packageName = "parse5";
4348 version = "5.1.0";
4349 src = fetchurl {
4350 url = "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz";
4351 sha512 = "fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==";
4352 };
4353 };
4354 "parseurl-1.3.3" = {
4355 name = "parseurl";
4356 packageName = "parseurl";
4357 version = "1.3.3";
4358 src = fetchurl {
4359 url = "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz";
4360 sha512 = "CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==";
4361 };
4362 };
4363 "pascalcase-0.1.1" = {
4364 name = "pascalcase";
4365 packageName = "pascalcase";
4366 version = "0.1.1";
4367 src = fetchurl {
4368 url = "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz";
4369 sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
4370 };
4371 };
4372 "path-browserify-0.0.1" = {
4373 name = "path-browserify";
4374 packageName = "path-browserify";
4375 version = "0.0.1";
4376 src = fetchurl {
4377 url = "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz";
4378 sha512 = "BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==";
4379 };
4380 };
4381 "path-dirname-1.0.2" = {
4382 name = "path-dirname";
4383 packageName = "path-dirname";
4384 version = "1.0.2";
4385 src = fetchurl {
4386 url = "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz";
4387 sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
4388 };
4389 };
4390 "path-exists-3.0.0" = {
4391 name = "path-exists";
4392 packageName = "path-exists";
4393 version = "3.0.0";
4394 src = fetchurl {
4395 url = "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz";
4396 sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
4397 };
4398 };
4399 "path-is-absolute-1.0.1" = {
4400 name = "path-is-absolute";
4401 packageName = "path-is-absolute";
4402 version = "1.0.1";
4403 src = fetchurl {
4404 url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
4405 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
4406 };
4407 };
4408 "path-key-2.0.1" = {
4409 name = "path-key";
4410 packageName = "path-key";
4411 version = "2.0.1";
4412 src = fetchurl {
4413 url = "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz";
4414 sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
4415 };
4416 };
4417 "path-parse-1.0.6" = {
4418 name = "path-parse";
4419 packageName = "path-parse";
4420 version = "1.0.6";
4421 src = fetchurl {
4422 url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz";
4423 sha512 = "GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==";
4424 };
4425 };
4426 "pbkdf2-3.0.17" = {
4427 name = "pbkdf2";
4428 packageName = "pbkdf2";
4429 version = "3.0.17";
4430 src = fetchurl {
4431 url = "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz";
4432 sha512 = "U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==";
4433 };
4434 };
4435 "performance-now-2.1.0" = {
4436 name = "performance-now";
4437 packageName = "performance-now";
4438 version = "2.1.0";
4439 src = fetchurl {
4440 url = "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";
4441 sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
4442 };
4443 };
4444 "physical-cpu-count-2.0.0" = {
4445 name = "physical-cpu-count";
4446 packageName = "physical-cpu-count";
4447 version = "2.0.0";
4448 src = fetchurl {
4449 url = "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz";
4450 sha1 = "18de2f97e4bf7a9551ad7511942b5496f7aba660";
4451 };
4452 };
4453 "pkg-up-2.0.0" = {
4454 name = "pkg-up";
4455 packageName = "pkg-up";
4456 version = "2.0.0";
4457 src = fetchurl {
4458 url = "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz";
4459 sha1 = "c819ac728059a461cab1c3889a2be3c49a004d7f";
4460 };
4461 };
4462 "pn-1.1.0" = {
4463 name = "pn";
4464 packageName = "pn";
4465 version = "1.1.0";
4466 src = fetchurl {
4467 url = "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz";
4468 sha512 = "2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==";
4469 };
4470 };
4471 "posix-character-classes-0.1.1" = {
4472 name = "posix-character-classes";
4473 packageName = "posix-character-classes";
4474 version = "0.1.1";
4475 src = fetchurl {
4476 url = "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
4477 sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
4478 };
4479 };
4480 "postcss-6.0.1" = {
4481 name = "postcss";
4482 packageName = "postcss";
4483 version = "6.0.1";
4484 src = fetchurl {
4485 url = "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz";
4486 sha1 = "000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2";
4487 };
4488 };
4489 "postcss-6.0.23" = {
4490 name = "postcss";
4491 packageName = "postcss";
4492 version = "6.0.23";
4493 src = fetchurl {
4494 url = "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz";
4495 sha512 = "soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==";
4496 };
4497 };
4498 "postcss-7.0.27" = {
4499 name = "postcss";
4500 packageName = "postcss";
4501 version = "7.0.27";
4502 src = fetchurl {
4503 url = "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz";
4504 sha512 = "WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==";
4505 };
4506 };
4507 "postcss-calc-7.0.2" = {
4508 name = "postcss-calc";
4509 packageName = "postcss-calc";
4510 version = "7.0.2";
4511 src = fetchurl {
4512 url = "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz";
4513 sha512 = "rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==";
4514 };
4515 };
4516 "postcss-colormin-4.0.3" = {
4517 name = "postcss-colormin";
4518 packageName = "postcss-colormin";
4519 version = "4.0.3";
4520 src = fetchurl {
4521 url = "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz";
4522 sha512 = "WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==";
4523 };
4524 };
4525 "postcss-convert-values-4.0.1" = {
4526 name = "postcss-convert-values";
4527 packageName = "postcss-convert-values";
4528 version = "4.0.1";
4529 src = fetchurl {
4530 url = "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz";
4531 sha512 = "Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==";
4532 };
4533 };
4534 "postcss-discard-comments-4.0.2" = {
4535 name = "postcss-discard-comments";
4536 packageName = "postcss-discard-comments";
4537 version = "4.0.2";
4538 src = fetchurl {
4539 url = "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz";
4540 sha512 = "RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==";
4541 };
4542 };
4543 "postcss-discard-duplicates-4.0.2" = {
4544 name = "postcss-discard-duplicates";
4545 packageName = "postcss-discard-duplicates";
4546 version = "4.0.2";
4547 src = fetchurl {
4548 url = "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz";
4549 sha512 = "ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==";
4550 };
4551 };
4552 "postcss-discard-empty-4.0.1" = {
4553 name = "postcss-discard-empty";
4554 packageName = "postcss-discard-empty";
4555 version = "4.0.1";
4556 src = fetchurl {
4557 url = "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz";
4558 sha512 = "B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==";
4559 };
4560 };
4561 "postcss-discard-overridden-4.0.1" = {
4562 name = "postcss-discard-overridden";
4563 packageName = "postcss-discard-overridden";
4564 version = "4.0.1";
4565 src = fetchurl {
4566 url = "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz";
4567 sha512 = "IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==";
4568 };
4569 };
4570 "postcss-merge-longhand-4.0.11" = {
4571 name = "postcss-merge-longhand";
4572 packageName = "postcss-merge-longhand";
4573 version = "4.0.11";
4574 src = fetchurl {
4575 url = "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz";
4576 sha512 = "alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==";
4577 };
4578 };
4579 "postcss-merge-rules-4.0.3" = {
4580 name = "postcss-merge-rules";
4581 packageName = "postcss-merge-rules";
4582 version = "4.0.3";
4583 src = fetchurl {
4584 url = "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz";
4585 sha512 = "U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==";
4586 };
4587 };
4588 "postcss-minify-font-values-4.0.2" = {
4589 name = "postcss-minify-font-values";
4590 packageName = "postcss-minify-font-values";
4591 version = "4.0.2";
4592 src = fetchurl {
4593 url = "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz";
4594 sha512 = "j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==";
4595 };
4596 };
4597 "postcss-minify-gradients-4.0.2" = {
4598 name = "postcss-minify-gradients";
4599 packageName = "postcss-minify-gradients";
4600 version = "4.0.2";
4601 src = fetchurl {
4602 url = "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz";
4603 sha512 = "qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==";
4604 };
4605 };
4606 "postcss-minify-params-4.0.2" = {
4607 name = "postcss-minify-params";
4608 packageName = "postcss-minify-params";
4609 version = "4.0.2";
4610 src = fetchurl {
4611 url = "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz";
4612 sha512 = "G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==";
4613 };
4614 };
4615 "postcss-minify-selectors-4.0.2" = {
4616 name = "postcss-minify-selectors";
4617 packageName = "postcss-minify-selectors";
4618 version = "4.0.2";
4619 src = fetchurl {
4620 url = "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz";
4621 sha512 = "D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==";
4622 };
4623 };
4624 "postcss-modules-extract-imports-1.1.0" = {
4625 name = "postcss-modules-extract-imports";
4626 packageName = "postcss-modules-extract-imports";
4627 version = "1.1.0";
4628 src = fetchurl {
4629 url = "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz";
4630 sha1 = "b614c9720be6816eaee35fb3a5faa1dba6a05ddb";
4631 };
4632 };
4633 "postcss-modules-local-by-default-1.2.0" = {
4634 name = "postcss-modules-local-by-default";
4635 packageName = "postcss-modules-local-by-default";
4636 version = "1.2.0";
4637 src = fetchurl {
4638 url = "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz";
4639 sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069";
4640 };
4641 };
4642 "postcss-modules-scope-1.1.0" = {
4643 name = "postcss-modules-scope";
4644 packageName = "postcss-modules-scope";
4645 version = "1.1.0";
4646 src = fetchurl {
4647 url = "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz";
4648 sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90";
4649 };
4650 };
4651 "postcss-modules-values-1.3.0" = {
4652 name = "postcss-modules-values";
4653 packageName = "postcss-modules-values";
4654 version = "1.3.0";
4655 src = fetchurl {
4656 url = "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz";
4657 sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20";
4658 };
4659 };
4660 "postcss-normalize-charset-4.0.1" = {
4661 name = "postcss-normalize-charset";
4662 packageName = "postcss-normalize-charset";
4663 version = "4.0.1";
4664 src = fetchurl {
4665 url = "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz";
4666 sha512 = "gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==";
4667 };
4668 };
4669 "postcss-normalize-display-values-4.0.2" = {
4670 name = "postcss-normalize-display-values";
4671 packageName = "postcss-normalize-display-values";
4672 version = "4.0.2";
4673 src = fetchurl {
4674 url = "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz";
4675 sha512 = "3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==";
4676 };
4677 };
4678 "postcss-normalize-positions-4.0.2" = {
4679 name = "postcss-normalize-positions";
4680 packageName = "postcss-normalize-positions";
4681 version = "4.0.2";
4682 src = fetchurl {
4683 url = "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz";
4684 sha512 = "Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==";
4685 };
4686 };
4687 "postcss-normalize-repeat-style-4.0.2" = {
4688 name = "postcss-normalize-repeat-style";
4689 packageName = "postcss-normalize-repeat-style";
4690 version = "4.0.2";
4691 src = fetchurl {
4692 url = "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz";
4693 sha512 = "qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==";
4694 };
4695 };
4696 "postcss-normalize-string-4.0.2" = {
4697 name = "postcss-normalize-string";
4698 packageName = "postcss-normalize-string";
4699 version = "4.0.2";
4700 src = fetchurl {
4701 url = "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz";
4702 sha512 = "RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==";
4703 };
4704 };
4705 "postcss-normalize-timing-functions-4.0.2" = {
4706 name = "postcss-normalize-timing-functions";
4707 packageName = "postcss-normalize-timing-functions";
4708 version = "4.0.2";
4709 src = fetchurl {
4710 url = "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz";
4711 sha512 = "acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==";
4712 };
4713 };
4714 "postcss-normalize-unicode-4.0.1" = {
4715 name = "postcss-normalize-unicode";
4716 packageName = "postcss-normalize-unicode";
4717 version = "4.0.1";
4718 src = fetchurl {
4719 url = "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz";
4720 sha512 = "od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==";
4721 };
4722 };
4723 "postcss-normalize-url-4.0.1" = {
4724 name = "postcss-normalize-url";
4725 packageName = "postcss-normalize-url";
4726 version = "4.0.1";
4727 src = fetchurl {
4728 url = "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz";
4729 sha512 = "p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==";
4730 };
4731 };
4732 "postcss-normalize-whitespace-4.0.2" = {
4733 name = "postcss-normalize-whitespace";
4734 packageName = "postcss-normalize-whitespace";
4735 version = "4.0.2";
4736 src = fetchurl {
4737 url = "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz";
4738 sha512 = "tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==";
4739 };
4740 };
4741 "postcss-ordered-values-4.1.2" = {
4742 name = "postcss-ordered-values";
4743 packageName = "postcss-ordered-values";
4744 version = "4.1.2";
4745 src = fetchurl {
4746 url = "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz";
4747 sha512 = "2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==";
4748 };
4749 };
4750 "postcss-reduce-initial-4.0.3" = {
4751 name = "postcss-reduce-initial";
4752 packageName = "postcss-reduce-initial";
4753 version = "4.0.3";
4754 src = fetchurl {
4755 url = "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz";
4756 sha512 = "gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==";
4757 };
4758 };
4759 "postcss-reduce-transforms-4.0.2" = {
4760 name = "postcss-reduce-transforms";
4761 packageName = "postcss-reduce-transforms";
4762 version = "4.0.2";
4763 src = fetchurl {
4764 url = "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz";
4765 sha512 = "EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==";
4766 };
4767 };
4768 "postcss-selector-parser-3.1.2" = {
4769 name = "postcss-selector-parser";
4770 packageName = "postcss-selector-parser";
4771 version = "3.1.2";
4772 src = fetchurl {
4773 url = "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz";
4774 sha512 = "h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==";
4775 };
4776 };
4777 "postcss-selector-parser-6.0.2" = {
4778 name = "postcss-selector-parser";
4779 packageName = "postcss-selector-parser";
4780 version = "6.0.2";
4781 src = fetchurl {
4782 url = "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz";
4783 sha512 = "36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==";
4784 };
4785 };
4786 "postcss-svgo-4.0.2" = {
4787 name = "postcss-svgo";
4788 packageName = "postcss-svgo";
4789 version = "4.0.2";
4790 src = fetchurl {
4791 url = "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz";
4792 sha512 = "C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==";
4793 };
4794 };
4795 "postcss-unique-selectors-4.0.1" = {
4796 name = "postcss-unique-selectors";
4797 packageName = "postcss-unique-selectors";
4798 version = "4.0.1";
4799 src = fetchurl {
4800 url = "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz";
4801 sha512 = "+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==";
4802 };
4803 };
4804 "postcss-value-parser-3.3.1" = {
4805 name = "postcss-value-parser";
4806 packageName = "postcss-value-parser";
4807 version = "3.3.1";
4808 src = fetchurl {
4809 url = "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz";
4810 sha512 = "pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==";
4811 };
4812 };
4813 "postcss-value-parser-4.0.3" = {
4814 name = "postcss-value-parser";
4815 packageName = "postcss-value-parser";
4816 version = "4.0.3";
4817 src = fetchurl {
4818 url = "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz";
4819 sha512 = "N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==";
4820 };
4821 };
4822 "posthtml-0.11.6" = {
4823 name = "posthtml";
4824 packageName = "posthtml";
4825 version = "0.11.6";
4826 src = fetchurl {
4827 url = "https://registry.npmjs.org/posthtml/-/posthtml-0.11.6.tgz";
4828 sha512 = "C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw==";
4829 };
4830 };
4831 "posthtml-0.12.3" = {
4832 name = "posthtml";
4833 packageName = "posthtml";
4834 version = "0.12.3";
4835 src = fetchurl {
4836 url = "https://registry.npmjs.org/posthtml/-/posthtml-0.12.3.tgz";
4837 sha512 = "Fbpi95+JJyR0tqU7pUy1zTSQFjAsluuwB9pJ1h0jtnGk7n/O2TBtP5nDl9rV0JVACjQ1Lm5wSp4ppChr8u3MhA==";
4838 };
4839 };
4840 "posthtml-parser-0.4.2" = {
4841 name = "posthtml-parser";
4842 packageName = "posthtml-parser";
4843 version = "0.4.2";
4844 src = fetchurl {
4845 url = "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.4.2.tgz";
4846 sha512 = "BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg==";
4847 };
4848 };
4849 "posthtml-render-1.2.2" = {
4850 name = "posthtml-render";
4851 packageName = "posthtml-render";
4852 version = "1.2.2";
4853 src = fetchurl {
4854 url = "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.2.2.tgz";
4855 sha512 = "MbIXTWwAfJ9qET6Zl29UNwJcDJEEz9Zkr5oDhiujitJa7YBJwEpbkX2cmuklCDxubTMoRWpid3q8DrSyGnUUzQ==";
4856 };
4857 };
4858 "prelude-ls-1.1.2" = {
4859 name = "prelude-ls";
4860 packageName = "prelude-ls";
4861 version = "1.1.2";
4862 src = fetchurl {
4863 url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
4864 sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
4865 };
4866 };
4867 "private-0.1.8" = {
4868 name = "private";
4869 packageName = "private";
4870 version = "0.1.8";
4871 src = fetchurl {
4872 url = "https://registry.npmjs.org/private/-/private-0.1.8.tgz";
4873 sha512 = "VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==";
4874 };
4875 };
4876 "process-0.11.10" = {
4877 name = "process";
4878 packageName = "process";
4879 version = "0.11.10";
4880 src = fetchurl {
4881 url = "https://registry.npmjs.org/process/-/process-0.11.10.tgz";
4882 sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182";
4883 };
4884 };
4885 "process-nextick-args-2.0.1" = {
4886 name = "process-nextick-args";
4887 packageName = "process-nextick-args";
4888 version = "2.0.1";
4889 src = fetchurl {
4890 url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
4891 sha512 = "3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==";
4892 };
4893 };
4894 "proto-list-1.2.4" = {
4895 name = "proto-list";
4896 packageName = "proto-list";
4897 version = "1.2.4";
4898 src = fetchurl {
4899 url = "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz";
4900 sha1 = "212d5bfe1318306a420f6402b8e26ff39647a849";
4901 };
4902 };
4903 "pseudomap-1.0.2" = {
4904 name = "pseudomap";
4905 packageName = "pseudomap";
4906 version = "1.0.2";
4907 src = fetchurl {
4908 url = "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz";
4909 sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
4910 };
4911 };
4912 "psl-1.8.0" = {
4913 name = "psl";
4914 packageName = "psl";
4915 version = "1.8.0";
4916 src = fetchurl {
4917 url = "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz";
4918 sha512 = "RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==";
4919 };
4920 };
4921 "public-encrypt-4.0.3" = {
4922 name = "public-encrypt";
4923 packageName = "public-encrypt";
4924 version = "4.0.3";
4925 src = fetchurl {
4926 url = "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz";
4927 sha512 = "zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==";
4928 };
4929 };
4930 "punycode-1.3.2" = {
4931 name = "punycode";
4932 packageName = "punycode";
4933 version = "1.3.2";
4934 src = fetchurl {
4935 url = "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz";
4936 sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
4937 };
4938 };
4939 "punycode-1.4.1" = {
4940 name = "punycode";
4941 packageName = "punycode";
4942 version = "1.4.1";
4943 src = fetchurl {
4944 url = "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz";
4945 sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
4946 };
4947 };
4948 "punycode-2.1.1" = {
4949 name = "punycode";
4950 packageName = "punycode";
4951 version = "2.1.1";
4952 src = fetchurl {
4953 url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz";
4954 sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==";
4955 };
4956 };
4957 "purgecss-1.4.2" = {
4958 name = "purgecss";
4959 packageName = "purgecss";
4960 version = "1.4.2";
4961 src = fetchurl {
4962 url = "https://registry.npmjs.org/purgecss/-/purgecss-1.4.2.tgz";
4963 sha512 = "hkOreFTgiyMHMmC2BxzdIw5DuC6kxAbP/gGOGd3MEsF3+5m69rIvUEPaxrnoUtfODTFKe9hcXjGwC6jcjoyhOw==";
4964 };
4965 };
4966 "q-1.5.1" = {
4967 name = "q";
4968 packageName = "q";
4969 version = "1.5.1";
4970 src = fetchurl {
4971 url = "https://registry.npmjs.org/q/-/q-1.5.1.tgz";
4972 sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7";
4973 };
4974 };
4975 "qs-6.5.2" = {
4976 name = "qs";
4977 packageName = "qs";
4978 version = "6.5.2";
4979 src = fetchurl {
4980 url = "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz";
4981 sha512 = "N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==";
4982 };
4983 };
4984 "querystring-0.2.0" = {
4985 name = "querystring";
4986 packageName = "querystring";
4987 version = "0.2.0";
4988 src = fetchurl {
4989 url = "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz";
4990 sha1 = "b209849203bb25df820da756e747005878521620";
4991 };
4992 };
4993 "querystring-es3-0.2.1" = {
4994 name = "querystring-es3";
4995 packageName = "querystring-es3";
4996 version = "0.2.1";
4997 src = fetchurl {
4998 url = "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz";
4999 sha1 = "9ec61f79049875707d69414596fd907a4d711e73";
5000 };
5001 };
5002 "quote-stream-1.0.2" = {
5003 name = "quote-stream";
5004 packageName = "quote-stream";
5005 version = "1.0.2";
5006 src = fetchurl {
5007 url = "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz";
5008 sha1 = "84963f8c9c26b942e153feeb53aae74652b7e0b2";
5009 };
5010 };
5011 "randombytes-2.1.0" = {
5012 name = "randombytes";
5013 packageName = "randombytes";
5014 version = "2.1.0";
5015 src = fetchurl {
5016 url = "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz";
5017 sha512 = "vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==";
5018 };
5019 };
5020 "randomfill-1.0.4" = {
5021 name = "randomfill";
5022 packageName = "randomfill";
5023 version = "1.0.4";
5024 src = fetchurl {
5025 url = "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz";
5026 sha512 = "87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==";
5027 };
5028 };
5029 "range-parser-1.2.1" = {
5030 name = "range-parser";
5031 packageName = "range-parser";
5032 version = "1.2.1";
5033 src = fetchurl {
5034 url = "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz";
5035 sha512 = "Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==";
5036 };
5037 };
5038 "readable-stream-2.3.7" = {
5039 name = "readable-stream";
5040 packageName = "readable-stream";
5041 version = "2.3.7";
5042 src = fetchurl {
5043 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz";
5044 sha512 = "Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==";
5045 };
5046 };
5047 "readable-stream-3.6.0" = {
5048 name = "readable-stream";
5049 packageName = "readable-stream";
5050 version = "3.6.0";
5051 src = fetchurl {
5052 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz";
5053 sha512 = "BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==";
5054 };
5055 };
5056 "readdirp-2.2.1" = {
5057 name = "readdirp";
5058 packageName = "readdirp";
5059 version = "2.2.1";
5060 src = fetchurl {
5061 url = "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz";
5062 sha512 = "1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==";
5063 };
5064 };
5065 "regenerate-1.4.0" = {
5066 name = "regenerate";
5067 packageName = "regenerate";
5068 version = "1.4.0";
5069 src = fetchurl {
5070 url = "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz";
5071 sha512 = "1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==";
5072 };
5073 };
5074 "regenerate-unicode-properties-8.2.0" = {
5075 name = "regenerate-unicode-properties";
5076 packageName = "regenerate-unicode-properties";
5077 version = "8.2.0";
5078 src = fetchurl {
5079 url = "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz";
5080 sha512 = "F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==";
5081 };
5082 };
5083 "regenerator-runtime-0.11.1" = {
5084 name = "regenerator-runtime";
5085 packageName = "regenerator-runtime";
5086 version = "0.11.1";
5087 src = fetchurl {
5088 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
5089 sha512 = "MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==";
5090 };
5091 };
5092 "regenerator-runtime-0.12.1" = {
5093 name = "regenerator-runtime";
5094 packageName = "regenerator-runtime";
5095 version = "0.12.1";
5096 src = fetchurl {
5097 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz";
5098 sha512 = "odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==";
5099 };
5100 };
5101 "regenerator-runtime-0.13.5" = {
5102 name = "regenerator-runtime";
5103 packageName = "regenerator-runtime";
5104 version = "0.13.5";
5105 src = fetchurl {
5106 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz";
5107 sha512 = "ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==";
5108 };
5109 };
5110 "regenerator-transform-0.14.4" = {
5111 name = "regenerator-transform";
5112 packageName = "regenerator-transform";
5113 version = "0.14.4";
5114 src = fetchurl {
5115 url = "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz";
5116 sha512 = "EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==";
5117 };
5118 };
5119 "regex-not-1.0.2" = {
5120 name = "regex-not";
5121 packageName = "regex-not";
5122 version = "1.0.2";
5123 src = fetchurl {
5124 url = "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz";
5125 sha512 = "J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==";
5126 };
5127 };
5128 "regexpu-core-4.7.0" = {
5129 name = "regexpu-core";
5130 packageName = "regexpu-core";
5131 version = "4.7.0";
5132 src = fetchurl {
5133 url = "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz";
5134 sha512 = "TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==";
5135 };
5136 };
5137 "regjsgen-0.5.1" = {
5138 name = "regjsgen";
5139 packageName = "regjsgen";
5140 version = "0.5.1";
5141 src = fetchurl {
5142 url = "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz";
5143 sha512 = "5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==";
5144 };
5145 };
5146 "regjsparser-0.6.4" = {
5147 name = "regjsparser";
5148 packageName = "regjsparser";
5149 version = "0.6.4";
5150 src = fetchurl {
5151 url = "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz";
5152 sha512 = "64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==";
5153 };
5154 };
5155 "remove-trailing-separator-1.1.0" = {
5156 name = "remove-trailing-separator";
5157 packageName = "remove-trailing-separator";
5158 version = "1.1.0";
5159 src = fetchurl {
5160 url = "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
5161 sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
5162 };
5163 };
5164 "repeat-element-1.1.3" = {
5165 name = "repeat-element";
5166 packageName = "repeat-element";
5167 version = "1.1.3";
5168 src = fetchurl {
5169 url = "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz";
5170 sha512 = "ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==";
5171 };
5172 };
5173 "repeat-string-1.6.1" = {
5174 name = "repeat-string";
5175 packageName = "repeat-string";
5176 version = "1.6.1";
5177 src = fetchurl {
5178 url = "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz";
5179 sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
5180 };
5181 };
5182 "request-2.88.2" = {
5183 name = "request";
5184 packageName = "request";
5185 version = "2.88.2";
5186 src = fetchurl {
5187 url = "https://registry.npmjs.org/request/-/request-2.88.2.tgz";
5188 sha512 = "MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==";
5189 };
5190 };
5191 "request-promise-core-1.1.3" = {
5192 name = "request-promise-core";
5193 packageName = "request-promise-core";
5194 version = "1.1.3";
5195 src = fetchurl {
5196 url = "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz";
5197 sha512 = "QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==";
5198 };
5199 };
5200 "request-promise-native-1.0.8" = {
5201 name = "request-promise-native";
5202 packageName = "request-promise-native";
5203 version = "1.0.8";
5204 src = fetchurl {
5205 url = "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz";
5206 sha512 = "dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==";
5207 };
5208 };
5209 "require-directory-2.1.1" = {
5210 name = "require-directory";
5211 packageName = "require-directory";
5212 version = "2.1.1";
5213 src = fetchurl {
5214 url = "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz";
5215 sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
5216 };
5217 };
5218 "require-main-filename-2.0.0" = {
5219 name = "require-main-filename";
5220 packageName = "require-main-filename";
5221 version = "2.0.0";
5222 src = fetchurl {
5223 url = "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz";
5224 sha512 = "NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==";
5225 };
5226 };
5227 "resolve-1.17.0" = {
5228 name = "resolve";
5229 packageName = "resolve";
5230 version = "1.17.0";
5231 src = fetchurl {
5232 url = "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz";
5233 sha512 = "ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==";
5234 };
5235 };
5236 "resolve-from-3.0.0" = {
5237 name = "resolve-from";
5238 packageName = "resolve-from";
5239 version = "3.0.0";
5240 src = fetchurl {
5241 url = "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz";
5242 sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
5243 };
5244 };
5245 "resolve-url-0.2.1" = {
5246 name = "resolve-url";
5247 packageName = "resolve-url";
5248 version = "0.2.1";
5249 src = fetchurl {
5250 url = "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz";
5251 sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
5252 };
5253 };
5254 "restore-cursor-2.0.0" = {
5255 name = "restore-cursor";
5256 packageName = "restore-cursor";
5257 version = "2.0.0";
5258 src = fetchurl {
5259 url = "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz";
5260 sha1 = "9f7ee287f82fd326d4fd162923d62129eee0dfaf";
5261 };
5262 };
5263 "ret-0.1.15" = {
5264 name = "ret";
5265 packageName = "ret";
5266 version = "0.1.15";
5267 src = fetchurl {
5268 url = "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz";
5269 sha512 = "TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==";
5270 };
5271 };
5272 "rgb-regex-1.0.1" = {
5273 name = "rgb-regex";
5274 packageName = "rgb-regex";
5275 version = "1.0.1";
5276 src = fetchurl {
5277 url = "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz";
5278 sha1 = "c0e0d6882df0e23be254a475e8edd41915feaeb1";
5279 };
5280 };
5281 "rgba-regex-1.0.0" = {
5282 name = "rgba-regex";
5283 packageName = "rgba-regex";
5284 version = "1.0.0";
5285 src = fetchurl {
5286 url = "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz";
5287 sha1 = "43374e2e2ca0968b0ef1523460b7d730ff22eeb3";
5288 };
5289 };
5290 "rimraf-2.6.3" = {
5291 name = "rimraf";
5292 packageName = "rimraf";
5293 version = "2.6.3";
5294 src = fetchurl {
5295 url = "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";
5296 sha512 = "mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==";
5297 };
5298 };
5299 "ripemd160-2.0.2" = {
5300 name = "ripemd160";
5301 packageName = "ripemd160";
5302 version = "2.0.2";
5303 src = fetchurl {
5304 url = "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz";
5305 sha512 = "ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==";
5306 };
5307 };
5308 "safe-buffer-5.1.2" = {
5309 name = "safe-buffer";
5310 packageName = "safe-buffer";
5311 version = "5.1.2";
5312 src = fetchurl {
5313 url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";
5314 sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
5315 };
5316 };
5317 "safe-regex-1.1.0" = {
5318 name = "safe-regex";
5319 packageName = "safe-regex";
5320 version = "1.1.0";
5321 src = fetchurl {
5322 url = "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz";
5323 sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
5324 };
5325 };
5326 "safer-buffer-2.1.2" = {
5327 name = "safer-buffer";
5328 packageName = "safer-buffer";
5329 version = "2.1.2";
5330 src = fetchurl {
5331 url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";
5332 sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
5333 };
5334 };
5335 "safer-eval-1.3.6" = {
5336 name = "safer-eval";
5337 packageName = "safer-eval";
5338 version = "1.3.6";
5339 src = fetchurl {
5340 url = "https://registry.npmjs.org/safer-eval/-/safer-eval-1.3.6.tgz";
5341 sha512 = "DN9tBsZgtUOHODzSfO1nGCLhZtxc7Qq/d8/2SNxQZ9muYXZspSh1fO7HOsrf4lcelBNviAJLCxB/ggmG+jV1aw==";
5342 };
5343 };
5344 "sax-1.2.4" = {
5345 name = "sax";
5346 packageName = "sax";
5347 version = "1.2.4";
5348 src = fetchurl {
5349 url = "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";
5350 sha512 = "NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==";
5351 };
5352 };
5353 "saxes-3.1.11" = {
5354 name = "saxes";
5355 packageName = "saxes";
5356 version = "3.1.11";
5357 src = fetchurl {
5358 url = "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz";
5359 sha512 = "Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==";
5360 };
5361 };
5362 "semver-5.7.1" = {
5363 name = "semver";
5364 packageName = "semver";
5365 version = "5.7.1";
5366 src = fetchurl {
5367 url = "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz";
5368 sha512 = "sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==";
5369 };
5370 };
5371 "send-0.17.1" = {
5372 name = "send";
5373 packageName = "send";
5374 version = "0.17.1";
5375 src = fetchurl {
5376 url = "https://registry.npmjs.org/send/-/send-0.17.1.tgz";
5377 sha512 = "BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==";
5378 };
5379 };
5380 "serialize-to-js-1.2.2" = {
5381 name = "serialize-to-js";
5382 packageName = "serialize-to-js";
5383 version = "1.2.2";
5384 src = fetchurl {
5385 url = "https://registry.npmjs.org/serialize-to-js/-/serialize-to-js-1.2.2.tgz";
5386 sha512 = "mUc8vA5iJghe+O+3s0YDGFLMJcqitVFk787YKiv8a4sf6RX5W0u81b+gcHrp15O0fFa010dRBVZvwcKXOWsL9Q==";
5387 };
5388 };
5389 "serve-static-1.14.1" = {
5390 name = "serve-static";
5391 packageName = "serve-static";
5392 version = "1.14.1";
5393 src = fetchurl {
5394 url = "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz";
5395 sha512 = "JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==";
5396 };
5397 };
5398 "set-blocking-2.0.0" = {
5399 name = "set-blocking";
5400 packageName = "set-blocking";
5401 version = "2.0.0";
5402 src = fetchurl {
5403 url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";
5404 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
5405 };
5406 };
5407 "set-value-2.0.1" = {
5408 name = "set-value";
5409 packageName = "set-value";
5410 version = "2.0.1";
5411 src = fetchurl {
5412 url = "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz";
5413 sha512 = "JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==";
5414 };
5415 };
5416 "setimmediate-1.0.5" = {
5417 name = "setimmediate";
5418 packageName = "setimmediate";
5419 version = "1.0.5";
5420 src = fetchurl {
5421 url = "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz";
5422 sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285";
5423 };
5424 };
5425 "setprototypeof-1.1.1" = {
5426 name = "setprototypeof";
5427 packageName = "setprototypeof";
5428 version = "1.1.1";
5429 src = fetchurl {
5430 url = "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz";
5431 sha512 = "JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==";
5432 };
5433 };
5434 "sha.js-2.4.11" = {
5435 name = "sha.js";
5436 packageName = "sha.js";
5437 version = "2.4.11";
5438 src = fetchurl {
5439 url = "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz";
5440 sha512 = "QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==";
5441 };
5442 };
5443 "shallow-copy-0.0.1" = {
5444 name = "shallow-copy";
5445 packageName = "shallow-copy";
5446 version = "0.0.1";
5447 src = fetchurl {
5448 url = "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz";
5449 sha1 = "415f42702d73d810330292cc5ee86eae1a11a170";
5450 };
5451 };
5452 "shebang-command-1.2.0" = {
5453 name = "shebang-command";
5454 packageName = "shebang-command";
5455 version = "1.2.0";
5456 src = fetchurl {
5457 url = "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz";
5458 sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
5459 };
5460 };
5461 "shebang-regex-1.0.0" = {
5462 name = "shebang-regex";
5463 packageName = "shebang-regex";
5464 version = "1.0.0";
5465 src = fetchurl {
5466 url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz";
5467 sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
5468 };
5469 };
5470 "sigmund-1.0.1" = {
5471 name = "sigmund";
5472 packageName = "sigmund";
5473 version = "1.0.1";
5474 src = fetchurl {
5475 url = "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz";
5476 sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
5477 };
5478 };
5479 "signal-exit-3.0.3" = {
5480 name = "signal-exit";
5481 packageName = "signal-exit";
5482 version = "3.0.3";
5483 src = fetchurl {
5484 url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz";
5485 sha512 = "VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==";
5486 };
5487 };
5488 "simple-swizzle-0.2.2" = {
5489 name = "simple-swizzle";
5490 packageName = "simple-swizzle";
5491 version = "0.2.2";
5492 src = fetchurl {
5493 url = "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz";
5494 sha1 = "a4da6b635ffcccca33f70d17cb92592de95e557a";
5495 };
5496 };
5497 "snapdragon-0.8.2" = {
5498 name = "snapdragon";
5499 packageName = "snapdragon";
5500 version = "0.8.2";
5501 src = fetchurl {
5502 url = "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz";
5503 sha512 = "FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==";
5504 };
5505 };
5506 "snapdragon-node-2.1.1" = {
5507 name = "snapdragon-node";
5508 packageName = "snapdragon-node";
5509 version = "2.1.1";
5510 src = fetchurl {
5511 url = "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
5512 sha512 = "O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==";
5513 };
5514 };
5515 "snapdragon-util-3.0.1" = {
5516 name = "snapdragon-util";
5517 packageName = "snapdragon-util";
5518 version = "3.0.1";
5519 src = fetchurl {
5520 url = "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
5521 sha512 = "mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==";
5522 };
5523 };
5524 "source-map-0.5.7" = {
5525 name = "source-map";
5526 packageName = "source-map";
5527 version = "0.5.7";
5528 src = fetchurl {
5529 url = "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz";
5530 sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
5531 };
5532 };
5533 "source-map-0.6.1" = {
5534 name = "source-map";
5535 packageName = "source-map";
5536 version = "0.6.1";
5537 src = fetchurl {
5538 url = "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz";
5539 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
5540 };
5541 };
5542 "source-map-resolve-0.5.3" = {
5543 name = "source-map-resolve";
5544 packageName = "source-map-resolve";
5545 version = "0.5.3";
5546 src = fetchurl {
5547 url = "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz";
5548 sha512 = "Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==";
5549 };
5550 };
5551 "source-map-support-0.5.19" = {
5552 name = "source-map-support";
5553 packageName = "source-map-support";
5554 version = "0.5.19";
5555 src = fetchurl {
5556 url = "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz";
5557 sha512 = "Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==";
5558 };
5559 };
5560 "source-map-url-0.4.0" = {
5561 name = "source-map-url";
5562 packageName = "source-map-url";
5563 version = "0.4.0";
5564 src = fetchurl {
5565 url = "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz";
5566 sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
5567 };
5568 };
5569 "split-string-3.1.0" = {
5570 name = "split-string";
5571 packageName = "split-string";
5572 version = "3.1.0";
5573 src = fetchurl {
5574 url = "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz";
5575 sha512 = "NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==";
5576 };
5577 };
5578 "sprintf-js-1.0.3" = {
5579 name = "sprintf-js";
5580 packageName = "sprintf-js";
5581 version = "1.0.3";
5582 src = fetchurl {
5583 url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz";
5584 sha1 = "04e6926f662895354f3dd015203633b857297e2c";
5585 };
5586 };
5587 "sshpk-1.16.1" = {
5588 name = "sshpk";
5589 packageName = "sshpk";
5590 version = "1.16.1";
5591 src = fetchurl {
5592 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz";
5593 sha512 = "HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==";
5594 };
5595 };
5596 "stable-0.1.8" = {
5597 name = "stable";
5598 packageName = "stable";
5599 version = "0.1.8";
5600 src = fetchurl {
5601 url = "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz";
5602 sha512 = "ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==";
5603 };
5604 };
5605 "static-eval-2.0.5" = {
5606 name = "static-eval";
5607 packageName = "static-eval";
5608 version = "2.0.5";
5609 src = fetchurl {
5610 url = "https://registry.npmjs.org/static-eval/-/static-eval-2.0.5.tgz";
5611 sha512 = "nNbV6LbGtMBgv7e9LFkt5JV8RVlRsyJrphfAt9tOtBBW/SfnzZDf2KnS72an8e434A+9e/BmJuTxeGPvrAK7KA==";
5612 };
5613 };
5614 "static-extend-0.1.2" = {
5615 name = "static-extend";
5616 packageName = "static-extend";
5617 version = "0.1.2";
5618 src = fetchurl {
5619 url = "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz";
5620 sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
5621 };
5622 };
5623 "static-module-2.2.5" = {
5624 name = "static-module";
5625 packageName = "static-module";
5626 version = "2.2.5";
5627 src = fetchurl {
5628 url = "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz";
5629 sha512 = "D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==";
5630 };
5631 };
5632 "statuses-1.5.0" = {
5633 name = "statuses";
5634 packageName = "statuses";
5635 version = "1.5.0";
5636 src = fetchurl {
5637 url = "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz";
5638 sha1 = "161c7dac177659fd9811f43771fa99381478628c";
5639 };
5640 };
5641 "stealthy-require-1.1.1" = {
5642 name = "stealthy-require";
5643 packageName = "stealthy-require";
5644 version = "1.1.1";
5645 src = fetchurl {
5646 url = "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz";
5647 sha1 = "35b09875b4ff49f26a777e509b3090a3226bf24b";
5648 };
5649 };
5650 "stream-browserify-2.0.2" = {
5651 name = "stream-browserify";
5652 packageName = "stream-browserify";
5653 version = "2.0.2";
5654 src = fetchurl {
5655 url = "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz";
5656 sha512 = "nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==";
5657 };
5658 };
5659 "stream-http-2.8.3" = {
5660 name = "stream-http";
5661 packageName = "stream-http";
5662 version = "2.8.3";
5663 src = fetchurl {
5664 url = "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz";
5665 sha512 = "+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==";
5666 };
5667 };
5668 "string-width-3.1.0" = {
5669 name = "string-width";
5670 packageName = "string-width";
5671 version = "3.1.0";
5672 src = fetchurl {
5673 url = "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz";
5674 sha512 = "vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==";
5675 };
5676 };
5677 "string.prototype.trimend-1.0.1" = {
5678 name = "string.prototype.trimend";
5679 packageName = "string.prototype.trimend";
5680 version = "1.0.1";
5681 src = fetchurl {
5682 url = "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz";
5683 sha512 = "LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==";
5684 };
5685 };
5686 "string.prototype.trimleft-2.1.2" = {
5687 name = "string.prototype.trimleft";
5688 packageName = "string.prototype.trimleft";
5689 version = "2.1.2";
5690 src = fetchurl {
5691 url = "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz";
5692 sha512 = "gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==";
5693 };
5694 };
5695 "string.prototype.trimright-2.1.2" = {
5696 name = "string.prototype.trimright";
5697 packageName = "string.prototype.trimright";
5698 version = "2.1.2";
5699 src = fetchurl {
5700 url = "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz";
5701 sha512 = "ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==";
5702 };
5703 };
5704 "string.prototype.trimstart-1.0.1" = {
5705 name = "string.prototype.trimstart";
5706 packageName = "string.prototype.trimstart";
5707 version = "1.0.1";
5708 src = fetchurl {
5709 url = "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz";
5710 sha512 = "XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==";
5711 };
5712 };
5713 "string_decoder-1.1.1" = {
5714 name = "string_decoder";
5715 packageName = "string_decoder";
5716 version = "1.1.1";
5717 src = fetchurl {
5718 url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
5719 sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
5720 };
5721 };
5722 "strip-ansi-3.0.1" = {
5723 name = "strip-ansi";
5724 packageName = "strip-ansi";
5725 version = "3.0.1";
5726 src = fetchurl {
5727 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
5728 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
5729 };
5730 };
5731 "strip-ansi-4.0.0" = {
5732 name = "strip-ansi";
5733 packageName = "strip-ansi";
5734 version = "4.0.0";
5735 src = fetchurl {
5736 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz";
5737 sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
5738 };
5739 };
5740 "strip-ansi-5.2.0" = {
5741 name = "strip-ansi";
5742 packageName = "strip-ansi";
5743 version = "5.2.0";
5744 src = fetchurl {
5745 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz";
5746 sha512 = "DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==";
5747 };
5748 };
5749 "stylehacks-4.0.3" = {
5750 name = "stylehacks";
5751 packageName = "stylehacks";
5752 version = "4.0.3";
5753 src = fetchurl {
5754 url = "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz";
5755 sha512 = "7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==";
5756 };
5757 };
5758 "supports-color-2.0.0" = {
5759 name = "supports-color";
5760 packageName = "supports-color";
5761 version = "2.0.0";
5762 src = fetchurl {
5763 url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
5764 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
5765 };
5766 };
5767 "supports-color-3.2.3" = {
5768 name = "supports-color";
5769 packageName = "supports-color";
5770 version = "3.2.3";
5771 src = fetchurl {
5772 url = "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz";
5773 sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6";
5774 };
5775 };
5776 "supports-color-5.5.0" = {
5777 name = "supports-color";
5778 packageName = "supports-color";
5779 version = "5.5.0";
5780 src = fetchurl {
5781 url = "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";
5782 sha512 = "QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==";
5783 };
5784 };
5785 "supports-color-6.1.0" = {
5786 name = "supports-color";
5787 packageName = "supports-color";
5788 version = "6.1.0";
5789 src = fetchurl {
5790 url = "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz";
5791 sha512 = "qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==";
5792 };
5793 };
5794 "svgo-1.3.2" = {
5795 name = "svgo";
5796 packageName = "svgo";
5797 version = "1.3.2";
5798 src = fetchurl {
5799 url = "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz";
5800 sha512 = "yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==";
5801 };
5802 };
5803 "symbol-tree-3.2.4" = {
5804 name = "symbol-tree";
5805 packageName = "symbol-tree";
5806 version = "3.2.4";
5807 src = fetchurl {
5808 url = "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz";
5809 sha512 = "9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==";
5810 };
5811 };
5812 "temp-0.9.0" = {
5813 name = "temp";
5814 packageName = "temp";
5815 version = "0.9.0";
5816 src = fetchurl {
5817 url = "https://registry.npmjs.org/temp/-/temp-0.9.0.tgz";
5818 sha512 = "YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ==";
5819 };
5820 };
5821 "terser-3.17.0" = {
5822 name = "terser";
5823 packageName = "terser";
5824 version = "3.17.0";
5825 src = fetchurl {
5826 url = "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz";
5827 sha512 = "/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==";
5828 };
5829 };
5830 "terser-4.6.12" = {
5831 name = "terser";
5832 packageName = "terser";
5833 version = "4.6.12";
5834 src = fetchurl {
5835 url = "https://registry.npmjs.org/terser/-/terser-4.6.12.tgz";
5836 sha512 = "fnIwuaKjFPANG6MAixC/k1TDtnl1YlPLUlLVIxxGZUn1gfUx2+l3/zGNB72wya+lgsb50QBi2tUV75RiODwnww==";
5837 };
5838 };
5839 "through2-2.0.5" = {
5840 name = "through2";
5841 packageName = "through2";
5842 version = "2.0.5";
5843 src = fetchurl {
5844 url = "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz";
5845 sha512 = "/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==";
5846 };
5847 };
5848 "timers-browserify-2.0.11" = {
5849 name = "timers-browserify";
5850 packageName = "timers-browserify";
5851 version = "2.0.11";
5852 src = fetchurl {
5853 url = "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz";
5854 sha512 = "60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==";
5855 };
5856 };
5857 "timsort-0.3.0" = {
5858 name = "timsort";
5859 packageName = "timsort";
5860 version = "0.3.0";
5861 src = fetchurl {
5862 url = "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz";
5863 sha1 = "405411a8e7e6339fe64db9a234de11dc31e02bd4";
5864 };
5865 };
5866 "tiny-inflate-1.0.3" = {
5867 name = "tiny-inflate";
5868 packageName = "tiny-inflate";
5869 version = "1.0.3";
5870 src = fetchurl {
5871 url = "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz";
5872 sha512 = "pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==";
5873 };
5874 };
5875 "to-arraybuffer-1.0.1" = {
5876 name = "to-arraybuffer";
5877 packageName = "to-arraybuffer";
5878 version = "1.0.1";
5879 src = fetchurl {
5880 url = "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
5881 sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
5882 };
5883 };
5884 "to-fast-properties-1.0.3" = {
5885 name = "to-fast-properties";
5886 packageName = "to-fast-properties";
5887 version = "1.0.3";
5888 src = fetchurl {
5889 url = "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz";
5890 sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47";
5891 };
5892 };
5893 "to-fast-properties-2.0.0" = {
5894 name = "to-fast-properties";
5895 packageName = "to-fast-properties";
5896 version = "2.0.0";
5897 src = fetchurl {
5898 url = "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz";
5899 sha1 = "dc5e698cbd079265bc73e0377681a4e4e83f616e";
5900 };
5901 };
5902 "to-object-path-0.3.0" = {
5903 name = "to-object-path";
5904 packageName = "to-object-path";
5905 version = "0.3.0";
5906 src = fetchurl {
5907 url = "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz";
5908 sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
5909 };
5910 };
5911 "to-regex-3.0.2" = {
5912 name = "to-regex";
5913 packageName = "to-regex";
5914 version = "3.0.2";
5915 src = fetchurl {
5916 url = "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz";
5917 sha512 = "FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==";
5918 };
5919 };
5920 "to-regex-range-2.1.1" = {
5921 name = "to-regex-range";
5922 packageName = "to-regex-range";
5923 version = "2.1.1";
5924 src = fetchurl {
5925 url = "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz";
5926 sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
5927 };
5928 };
5929 "toidentifier-1.0.0" = {
5930 name = "toidentifier";
5931 packageName = "toidentifier";
5932 version = "1.0.0";
5933 src = fetchurl {
5934 url = "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz";
5935 sha512 = "yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==";
5936 };
5937 };
5938 "tough-cookie-2.5.0" = {
5939 name = "tough-cookie";
5940 packageName = "tough-cookie";
5941 version = "2.5.0";
5942 src = fetchurl {
5943 url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz";
5944 sha512 = "nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==";
5945 };
5946 };
5947 "tr46-1.0.1" = {
5948 name = "tr46";
5949 packageName = "tr46";
5950 version = "1.0.1";
5951 src = fetchurl {
5952 url = "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz";
5953 sha1 = "a8b13fd6bfd2489519674ccde55ba3693b706d09";
5954 };
5955 };
5956 "trim-right-1.0.1" = {
5957 name = "trim-right";
5958 packageName = "trim-right";
5959 version = "1.0.1";
5960 src = fetchurl {
5961 url = "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz";
5962 sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003";
5963 };
5964 };
5965 "tty-browserify-0.0.0" = {
5966 name = "tty-browserify";
5967 packageName = "tty-browserify";
5968 version = "0.0.0";
5969 src = fetchurl {
5970 url = "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz";
5971 sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6";
5972 };
5973 };
5974 "tunnel-agent-0.6.0" = {
5975 name = "tunnel-agent";
5976 packageName = "tunnel-agent";
5977 version = "0.6.0";
5978 src = fetchurl {
5979 url = "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
5980 sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
5981 };
5982 };
5983 "tweetnacl-0.14.5" = {
5984 name = "tweetnacl";
5985 packageName = "tweetnacl";
5986 version = "0.14.5";
5987 src = fetchurl {
5988 url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
5989 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
5990 };
5991 };
5992 "type-check-0.3.2" = {
5993 name = "type-check";
5994 packageName = "type-check";
5995 version = "0.3.2";
5996 src = fetchurl {
5997 url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
5998 sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
5999 };
6000 };
6001 "typedarray-0.0.6" = {
6002 name = "typedarray";
6003 packageName = "typedarray";
6004 version = "0.0.6";
6005 src = fetchurl {
6006 url = "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz";
6007 sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
6008 };
6009 };
6010 "uncss-0.17.3" = {
6011 name = "uncss";
6012 packageName = "uncss";
6013 version = "0.17.3";
6014 src = fetchurl {
6015 url = "https://registry.npmjs.org/uncss/-/uncss-0.17.3.tgz";
6016 sha512 = "ksdDWl81YWvF/X14fOSw4iu8tESDHFIeyKIeDrK6GEVTQvqJc1WlOEXqostNwOCi3qAj++4EaLsdAgPmUbEyog==";
6017 };
6018 };
6019 "unicode-canonical-property-names-ecmascript-1.0.4" = {
6020 name = "unicode-canonical-property-names-ecmascript";
6021 packageName = "unicode-canonical-property-names-ecmascript";
6022 version = "1.0.4";
6023 src = fetchurl {
6024 url = "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz";
6025 sha512 = "jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==";
6026 };
6027 };
6028 "unicode-match-property-ecmascript-1.0.4" = {
6029 name = "unicode-match-property-ecmascript";
6030 packageName = "unicode-match-property-ecmascript";
6031 version = "1.0.4";
6032 src = fetchurl {
6033 url = "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz";
6034 sha512 = "L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==";
6035 };
6036 };
6037 "unicode-match-property-value-ecmascript-1.2.0" = {
6038 name = "unicode-match-property-value-ecmascript";
6039 packageName = "unicode-match-property-value-ecmascript";
6040 version = "1.2.0";
6041 src = fetchurl {
6042 url = "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz";
6043 sha512 = "wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==";
6044 };
6045 };
6046 "unicode-property-aliases-ecmascript-1.1.0" = {
6047 name = "unicode-property-aliases-ecmascript";
6048 packageName = "unicode-property-aliases-ecmascript";
6049 version = "1.1.0";
6050 src = fetchurl {
6051 url = "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz";
6052 sha512 = "PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==";
6053 };
6054 };
6055 "unicode-trie-0.3.1" = {
6056 name = "unicode-trie";
6057 packageName = "unicode-trie";
6058 version = "0.3.1";
6059 src = fetchurl {
6060 url = "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz";
6061 sha1 = "d671dddd89101a08bac37b6a5161010602052085";
6062 };
6063 };
6064 "union-value-1.0.1" = {
6065 name = "union-value";
6066 packageName = "union-value";
6067 version = "1.0.1";
6068 src = fetchurl {
6069 url = "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz";
6070 sha512 = "tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==";
6071 };
6072 };
6073 "uniq-1.0.1" = {
6074 name = "uniq";
6075 packageName = "uniq";
6076 version = "1.0.1";
6077 src = fetchurl {
6078 url = "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz";
6079 sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
6080 };
6081 };
6082 "uniqs-2.0.0" = {
6083 name = "uniqs";
6084 packageName = "uniqs";
6085 version = "2.0.0";
6086 src = fetchurl {
6087 url = "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz";
6088 sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02";
6089 };
6090 };
6091 "unquote-1.1.1" = {
6092 name = "unquote";
6093 packageName = "unquote";
6094 version = "1.1.1";
6095 src = fetchurl {
6096 url = "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz";
6097 sha1 = "8fded7324ec6e88a0ff8b905e7c098cdc086d544";
6098 };
6099 };
6100 "unset-value-1.0.0" = {
6101 name = "unset-value";
6102 packageName = "unset-value";
6103 version = "1.0.0";
6104 src = fetchurl {
6105 url = "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz";
6106 sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
6107 };
6108 };
6109 "upath-1.2.0" = {
6110 name = "upath";
6111 packageName = "upath";
6112 version = "1.2.0";
6113 src = fetchurl {
6114 url = "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz";
6115 sha512 = "aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==";
6116 };
6117 };
6118 "uri-js-4.2.2" = {
6119 name = "uri-js";
6120 packageName = "uri-js";
6121 version = "4.2.2";
6122 src = fetchurl {
6123 url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz";
6124 sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==";
6125 };
6126 };
6127 "urix-0.1.0" = {
6128 name = "urix";
6129 packageName = "urix";
6130 version = "0.1.0";
6131 src = fetchurl {
6132 url = "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz";
6133 sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
6134 };
6135 };
6136 "url-0.11.0" = {
6137 name = "url";
6138 packageName = "url";
6139 version = "0.11.0";
6140 src = fetchurl {
6141 url = "https://registry.npmjs.org/url/-/url-0.11.0.tgz";
6142 sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
6143 };
6144 };
6145 "use-3.1.1" = {
6146 name = "use";
6147 packageName = "use";
6148 version = "3.1.1";
6149 src = fetchurl {
6150 url = "https://registry.npmjs.org/use/-/use-3.1.1.tgz";
6151 sha512 = "cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==";
6152 };
6153 };
6154 "util-0.10.3" = {
6155 name = "util";
6156 packageName = "util";
6157 version = "0.10.3";
6158 src = fetchurl {
6159 url = "https://registry.npmjs.org/util/-/util-0.10.3.tgz";
6160 sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
6161 };
6162 };
6163 "util-0.11.1" = {
6164 name = "util";
6165 packageName = "util";
6166 version = "0.11.1";
6167 src = fetchurl {
6168 url = "https://registry.npmjs.org/util/-/util-0.11.1.tgz";
6169 sha512 = "HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==";
6170 };
6171 };
6172 "util-deprecate-1.0.2" = {
6173 name = "util-deprecate";
6174 packageName = "util-deprecate";
6175 version = "1.0.2";
6176 src = fetchurl {
6177 url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
6178 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
6179 };
6180 };
6181 "util.promisify-1.0.1" = {
6182 name = "util.promisify";
6183 packageName = "util.promisify";
6184 version = "1.0.1";
6185 src = fetchurl {
6186 url = "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz";
6187 sha512 = "g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==";
6188 };
6189 };
6190 "uuid-3.4.0" = {
6191 name = "uuid";
6192 packageName = "uuid";
6193 version = "3.4.0";
6194 src = fetchurl {
6195 url = "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz";
6196 sha512 = "HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==";
6197 };
6198 };
6199 "v8-compile-cache-2.1.0" = {
6200 name = "v8-compile-cache";
6201 packageName = "v8-compile-cache";
6202 version = "2.1.0";
6203 src = fetchurl {
6204 url = "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz";
6205 sha512 = "usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==";
6206 };
6207 };
6208 "vendors-1.0.4" = {
6209 name = "vendors";
6210 packageName = "vendors";
6211 version = "1.0.4";
6212 src = fetchurl {
6213 url = "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz";
6214 sha512 = "/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==";
6215 };
6216 };
6217 "verror-1.10.0" = {
6218 name = "verror";
6219 packageName = "verror";
6220 version = "1.10.0";
6221 src = fetchurl {
6222 url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
6223 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
6224 };
6225 };
6226 "vlq-0.2.3" = {
6227 name = "vlq";
6228 packageName = "vlq";
6229 version = "0.2.3";
6230 src = fetchurl {
6231 url = "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz";
6232 sha512 = "DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==";
6233 };
6234 };
6235 "vm-browserify-1.1.2" = {
6236 name = "vm-browserify";
6237 packageName = "vm-browserify";
6238 version = "1.1.2";
6239 src = fetchurl {
6240 url = "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz";
6241 sha512 = "2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==";
6242 };
6243 };
6244 "w3c-hr-time-1.0.2" = {
6245 name = "w3c-hr-time";
6246 packageName = "w3c-hr-time";
6247 version = "1.0.2";
6248 src = fetchurl {
6249 url = "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz";
6250 sha512 = "z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==";
6251 };
6252 };
6253 "w3c-xmlserializer-1.1.2" = {
6254 name = "w3c-xmlserializer";
6255 packageName = "w3c-xmlserializer";
6256 version = "1.1.2";
6257 src = fetchurl {
6258 url = "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz";
6259 sha512 = "p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==";
6260 };
6261 };
6262 "wcwidth-1.0.1" = {
6263 name = "wcwidth";
6264 packageName = "wcwidth";
6265 version = "1.0.1";
6266 src = fetchurl {
6267 url = "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz";
6268 sha1 = "f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8";
6269 };
6270 };
6271 "webidl-conversions-4.0.2" = {
6272 name = "webidl-conversions";
6273 packageName = "webidl-conversions";
6274 version = "4.0.2";
6275 src = fetchurl {
6276 url = "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz";
6277 sha512 = "YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==";
6278 };
6279 };
6280 "whatwg-encoding-1.0.5" = {
6281 name = "whatwg-encoding";
6282 packageName = "whatwg-encoding";
6283 version = "1.0.5";
6284 src = fetchurl {
6285 url = "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz";
6286 sha512 = "b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==";
6287 };
6288 };
6289 "whatwg-mimetype-2.3.0" = {
6290 name = "whatwg-mimetype";
6291 packageName = "whatwg-mimetype";
6292 version = "2.3.0";
6293 src = fetchurl {
6294 url = "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz";
6295 sha512 = "M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==";
6296 };
6297 };
6298 "whatwg-url-7.1.0" = {
6299 name = "whatwg-url";
6300 packageName = "whatwg-url";
6301 version = "7.1.0";
6302 src = fetchurl {
6303 url = "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz";
6304 sha512 = "WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==";
6305 };
6306 };
6307 "which-1.3.1" = {
6308 name = "which";
6309 packageName = "which";
6310 version = "1.3.1";
6311 src = fetchurl {
6312 url = "https://registry.npmjs.org/which/-/which-1.3.1.tgz";
6313 sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
6314 };
6315 };
6316 "which-module-2.0.0" = {
6317 name = "which-module";
6318 packageName = "which-module";
6319 version = "2.0.0";
6320 src = fetchurl {
6321 url = "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz";
6322 sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
6323 };
6324 };
6325 "word-wrap-1.2.3" = {
6326 name = "word-wrap";
6327 packageName = "word-wrap";
6328 version = "1.2.3";
6329 src = fetchurl {
6330 url = "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz";
6331 sha512 = "Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==";
6332 };
6333 };
6334 "wrap-ansi-5.1.0" = {
6335 name = "wrap-ansi";
6336 packageName = "wrap-ansi";
6337 version = "5.1.0";
6338 src = fetchurl {
6339 url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz";
6340 sha512 = "QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==";
6341 };
6342 };
6343 "wrappy-1.0.2" = {
6344 name = "wrappy";
6345 packageName = "wrappy";
6346 version = "1.0.2";
6347 src = fetchurl {
6348 url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
6349 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
6350 };
6351 };
6352 "ws-5.2.2" = {
6353 name = "ws";
6354 packageName = "ws";
6355 version = "5.2.2";
6356 src = fetchurl {
6357 url = "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz";
6358 sha512 = "jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==";
6359 };
6360 };
6361 "ws-6.2.1" = {
6362 name = "ws";
6363 packageName = "ws";
6364 version = "6.2.1";
6365 src = fetchurl {
6366 url = "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz";
6367 sha512 = "GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==";
6368 };
6369 };
6370 "xml-name-validator-3.0.0" = {
6371 name = "xml-name-validator";
6372 packageName = "xml-name-validator";
6373 version = "3.0.0";
6374 src = fetchurl {
6375 url = "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz";
6376 sha512 = "A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==";
6377 };
6378 };
6379 "xmlchars-2.2.0" = {
6380 name = "xmlchars";
6381 packageName = "xmlchars";
6382 version = "2.2.0";
6383 src = fetchurl {
6384 url = "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz";
6385 sha512 = "JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==";
6386 };
6387 };
6388 "xtend-4.0.2" = {
6389 name = "xtend";
6390 packageName = "xtend";
6391 version = "4.0.2";
6392 src = fetchurl {
6393 url = "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz";
6394 sha512 = "LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==";
6395 };
6396 };
6397 "y18n-4.0.0" = {
6398 name = "y18n";
6399 packageName = "y18n";
6400 version = "4.0.0";
6401 src = fetchurl {
6402 url = "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz";
6403 sha512 = "r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==";
6404 };
6405 };
6406 "yallist-2.1.2" = {
6407 name = "yallist";
6408 packageName = "yallist";
6409 version = "2.1.2";
6410 src = fetchurl {
6411 url = "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz";
6412 sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
6413 };
6414 };
6415 "yargs-14.2.3" = {
6416 name = "yargs";
6417 packageName = "yargs";
6418 version = "14.2.3";
6419 src = fetchurl {
6420 url = "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz";
6421 sha512 = "ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==";
6422 };
6423 };
6424 "yargs-parser-15.0.1" = {
6425 name = "yargs-parser";
6426 packageName = "yargs-parser";
6427 version = "15.0.1";
6428 src = fetchurl {
6429 url = "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz";
6430 sha512 = "0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==";
6431 };
6432 };
6433 };
6434 args = {
6435 name = "codenamesgreen";
6436 packageName = "codenamesgreen";
6437 version = "1.0.0";
6438 src = let
6439 upstream = fetchFromGitHub {
6440 owner = "jbowens";
6441 repo = "codenamesgreen";
6442 rev = "6d014d0df14bee72495e01f12885ef31cba3bd6b";
6443 sha256 = "0bkaf52rnjw792q0755in4k5jbcrmgq06cl03fdl6zdr8kq2mhm0";
6444 };
6445 in
6446 runCommand "codenamesgreen-src" {} ''
6447 cp -a ${upstream} $out
6448 chmod -R u+w $out
6449 cd $out
6450 patch -p1 < ${./codenames.patch}
6451 patch -p1 < ${./immae-assets.patch}
6452 '';
6453 dependencies = [
6454 sources."@babel/code-frame-7.0.0"
6455 (sources."@babel/core-7.3.4" // {
6456 dependencies = [
6457 sources."json5-2.1.3"
6458 sources."source-map-0.5.7"
6459 ];
6460 })
6461 (sources."@babel/generator-7.3.4" // {
6462 dependencies = [
6463 sources."source-map-0.5.7"
6464 ];
6465 })
6466 (sources."@babel/helper-annotate-as-pure-7.8.3" // {
6467 dependencies = [
6468 sources."@babel/types-7.9.5"
6469 ];
6470 })
6471 (sources."@babel/helper-builder-binary-assignment-operator-visitor-7.8.3" // {
6472 dependencies = [
6473 sources."@babel/types-7.9.5"
6474 ];
6475 })
6476 (sources."@babel/helper-builder-react-jsx-7.9.0" // {
6477 dependencies = [
6478 sources."@babel/types-7.9.5"
6479 ];
6480 })
6481 sources."@babel/helper-create-regexp-features-plugin-7.8.8"
6482 (sources."@babel/helper-define-map-7.8.3" // {
6483 dependencies = [
6484 sources."@babel/types-7.9.5"
6485 ];
6486 })
6487 (sources."@babel/helper-explode-assignable-expression-7.8.3" // {
6488 dependencies = [
6489 sources."@babel/code-frame-7.8.3"
6490 sources."@babel/generator-7.9.5"
6491 sources."@babel/parser-7.9.4"
6492 sources."@babel/traverse-7.9.5"
6493 sources."@babel/types-7.9.5"
6494 sources."source-map-0.5.7"
6495 ];
6496 })
6497 (sources."@babel/helper-function-name-7.9.5" // {
6498 dependencies = [
6499 sources."@babel/code-frame-7.8.3"
6500 sources."@babel/parser-7.9.4"
6501 sources."@babel/template-7.8.6"
6502 sources."@babel/types-7.9.5"
6503 ];
6504 })
6505 (sources."@babel/helper-get-function-arity-7.8.3" // {
6506 dependencies = [
6507 sources."@babel/types-7.9.5"
6508 ];
6509 })
6510 (sources."@babel/helper-hoist-variables-7.8.3" // {
6511 dependencies = [
6512 sources."@babel/types-7.9.5"
6513 ];
6514 })
6515 (sources."@babel/helper-member-expression-to-functions-7.8.3" // {
6516 dependencies = [
6517 sources."@babel/types-7.9.5"
6518 ];
6519 })
6520 (sources."@babel/helper-module-imports-7.8.3" // {
6521 dependencies = [
6522 sources."@babel/types-7.9.5"
6523 ];
6524 })
6525 (sources."@babel/helper-module-transforms-7.9.0" // {
6526 dependencies = [
6527 sources."@babel/code-frame-7.8.3"
6528 sources."@babel/parser-7.9.4"
6529 sources."@babel/template-7.8.6"
6530 sources."@babel/types-7.9.5"
6531 ];
6532 })
6533 (sources."@babel/helper-optimise-call-expression-7.8.3" // {
6534 dependencies = [
6535 sources."@babel/types-7.9.5"
6536 ];
6537 })
6538 sources."@babel/helper-plugin-utils-7.8.3"
6539 sources."@babel/helper-regex-7.8.3"
6540 (sources."@babel/helper-remap-async-to-generator-7.8.3" // {
6541 dependencies = [
6542 sources."@babel/code-frame-7.8.3"
6543 sources."@babel/generator-7.9.5"
6544 sources."@babel/parser-7.9.4"
6545 sources."@babel/template-7.8.6"
6546 sources."@babel/traverse-7.9.5"
6547 sources."@babel/types-7.9.5"
6548 sources."source-map-0.5.7"
6549 ];
6550 })
6551 (sources."@babel/helper-replace-supers-7.8.6" // {
6552 dependencies = [
6553 sources."@babel/code-frame-7.8.3"
6554 sources."@babel/generator-7.9.5"
6555 sources."@babel/parser-7.9.4"
6556 sources."@babel/traverse-7.9.5"
6557 sources."@babel/types-7.9.5"
6558 sources."source-map-0.5.7"
6559 ];
6560 })
6561 (sources."@babel/helper-simple-access-7.8.3" // {
6562 dependencies = [
6563 sources."@babel/code-frame-7.8.3"
6564 sources."@babel/parser-7.9.4"
6565 sources."@babel/template-7.8.6"
6566 sources."@babel/types-7.9.5"
6567 ];
6568 })
6569 (sources."@babel/helper-split-export-declaration-7.8.3" // {
6570 dependencies = [
6571 sources."@babel/types-7.9.5"
6572 ];
6573 })
6574 sources."@babel/helper-validator-identifier-7.9.5"
6575 (sources."@babel/helper-wrap-function-7.8.3" // {
6576 dependencies = [
6577 sources."@babel/code-frame-7.8.3"
6578 sources."@babel/generator-7.9.5"
6579 sources."@babel/parser-7.9.4"
6580 sources."@babel/template-7.8.6"
6581 sources."@babel/traverse-7.9.5"
6582 sources."@babel/types-7.9.5"
6583 sources."source-map-0.5.7"
6584 ];
6585 })
6586 (sources."@babel/helpers-7.9.2" // {
6587 dependencies = [
6588 sources."@babel/code-frame-7.8.3"
6589 sources."@babel/generator-7.9.5"
6590 sources."@babel/parser-7.9.4"
6591 sources."@babel/template-7.8.6"
6592 sources."@babel/traverse-7.9.5"
6593 sources."@babel/types-7.9.5"
6594 sources."source-map-0.5.7"
6595 ];
6596 })
6597 sources."@babel/highlight-7.9.0"
6598 sources."@babel/parser-7.3.4"
6599 sources."@babel/plugin-proposal-async-generator-functions-7.8.3"
6600 sources."@babel/plugin-proposal-json-strings-7.8.3"
6601 sources."@babel/plugin-proposal-object-rest-spread-7.9.5"
6602 sources."@babel/plugin-proposal-optional-catch-binding-7.8.3"
6603 sources."@babel/plugin-proposal-unicode-property-regex-7.8.8"
6604 sources."@babel/plugin-syntax-async-generators-7.8.4"
6605 sources."@babel/plugin-syntax-flow-7.8.3"
6606 sources."@babel/plugin-syntax-json-strings-7.8.3"
6607 sources."@babel/plugin-syntax-jsx-7.8.3"
6608 sources."@babel/plugin-syntax-object-rest-spread-7.8.3"
6609 sources."@babel/plugin-syntax-optional-catch-binding-7.8.3"
6610 sources."@babel/plugin-transform-arrow-functions-7.8.3"
6611 sources."@babel/plugin-transform-async-to-generator-7.8.3"
6612 sources."@babel/plugin-transform-block-scoped-functions-7.8.3"
6613 sources."@babel/plugin-transform-block-scoping-7.8.3"
6614 sources."@babel/plugin-transform-classes-7.9.5"
6615 sources."@babel/plugin-transform-computed-properties-7.8.3"
6616 sources."@babel/plugin-transform-destructuring-7.9.5"
6617 sources."@babel/plugin-transform-dotall-regex-7.8.3"
6618 sources."@babel/plugin-transform-duplicate-keys-7.8.3"
6619 sources."@babel/plugin-transform-exponentiation-operator-7.8.3"
6620 sources."@babel/plugin-transform-flow-strip-types-7.3.4"
6621 sources."@babel/plugin-transform-for-of-7.9.0"
6622 sources."@babel/plugin-transform-function-name-7.8.3"
6623 sources."@babel/plugin-transform-literals-7.8.3"
6624 sources."@babel/plugin-transform-modules-amd-7.9.0"
6625 sources."@babel/plugin-transform-modules-commonjs-7.2.0"
6626 sources."@babel/plugin-transform-modules-systemjs-7.9.0"
6627 sources."@babel/plugin-transform-modules-umd-7.9.0"
6628 sources."@babel/plugin-transform-named-capturing-groups-regex-7.8.3"
6629 sources."@babel/plugin-transform-new-target-7.8.3"
6630 sources."@babel/plugin-transform-object-super-7.8.3"
6631 sources."@babel/plugin-transform-parameters-7.9.5"
6632 sources."@babel/plugin-transform-react-jsx-7.3.0"
6633 sources."@babel/plugin-transform-regenerator-7.8.7"
6634 sources."@babel/plugin-transform-shorthand-properties-7.8.3"
6635 sources."@babel/plugin-transform-spread-7.8.3"
6636 sources."@babel/plugin-transform-sticky-regex-7.8.3"
6637 sources."@babel/plugin-transform-template-literals-7.8.3"
6638 sources."@babel/plugin-transform-typeof-symbol-7.8.4"
6639 sources."@babel/plugin-transform-unicode-regex-7.8.3"
6640 sources."@babel/preset-env-7.3.4"
6641 (sources."@babel/runtime-7.3.4" // {
6642 dependencies = [
6643 sources."regenerator-runtime-0.12.1"
6644 ];
6645 })
6646 sources."@babel/template-7.2.2"
6647 sources."@babel/traverse-7.3.4"
6648 sources."@babel/types-7.3.4"
6649 sources."@iarna/toml-2.2.5"
6650 sources."@mrmlnc/readdir-enhanced-2.2.1"
6651 sources."@nodelib/fs.stat-1.1.3"
6652 sources."@parcel/fs-1.11.0"
6653 sources."@parcel/logger-1.11.1"
6654 sources."@parcel/utils-1.11.0"
6655 sources."@parcel/watcher-1.12.1"
6656 sources."@parcel/workers-1.11.0"
6657 sources."@types/q-1.5.2"
6658 sources."abab-2.0.3"
6659 sources."abbrev-1.1.1"
6660 sources."acorn-7.1.1"
6661 (sources."acorn-globals-4.3.4" // {
6662 dependencies = [
6663 sources."acorn-6.4.1"
6664 ];
6665 })
6666 sources."acorn-walk-6.2.0"
6667 sources."ajv-6.12.2"
6668 sources."alphanum-sort-1.0.2"
6669 sources."ansi-regex-3.0.0"
6670 sources."ansi-styles-3.2.1"
6671 (sources."ansi-to-html-0.6.14" // {
6672 dependencies = [
6673 sources."entities-1.1.2"
6674 ];
6675 })
6676 (sources."anymatch-2.0.0" // {
6677 dependencies = [
6678 sources."normalize-path-2.1.1"
6679 ];
6680 })
6681 sources."argparse-1.0.10"
6682 sources."arr-diff-4.0.0"
6683 sources."arr-flatten-1.1.0"
6684 sources."arr-union-3.1.0"
6685 sources."array-equal-1.0.0"
6686 sources."array-unique-0.3.2"
6687 sources."asn1-0.2.4"
6688 sources."asn1.js-4.10.1"
6689 (sources."assert-1.5.0" // {
6690 dependencies = [
6691 sources."inherits-2.0.1"
6692 sources."util-0.10.3"
6693 ];
6694 })
6695 sources."assert-plus-1.0.0"
6696 sources."assign-symbols-1.0.0"
6697 sources."async-each-1.0.3"
6698 sources."async-limiter-1.0.1"
6699 sources."asynckit-0.4.0"
6700 sources."atob-2.1.2"
6701 sources."aws-sign2-0.7.0"
6702 sources."aws4-1.9.1"
6703 sources."babel-plugin-dynamic-import-node-2.3.3"
6704 (sources."babel-runtime-6.26.0" // {
6705 dependencies = [
6706 sources."regenerator-runtime-0.11.1"
6707 ];
6708 })
6709 (sources."babel-types-6.26.0" // {
6710 dependencies = [
6711 sources."to-fast-properties-1.0.3"
6712 ];
6713 })
6714 sources."babylon-walk-1.0.2"
6715 sources."balanced-match-1.0.0"
6716 (sources."base-0.11.2" // {
6717 dependencies = [
6718 sources."define-property-1.0.0"
6719 sources."is-accessor-descriptor-1.0.0"
6720 sources."is-data-descriptor-1.0.0"
6721 sources."is-descriptor-1.0.2"
6722 ];
6723 })
6724 sources."base64-js-1.3.1"
6725 sources."bcrypt-pbkdf-1.0.2"
6726 sources."binary-extensions-1.13.1"
6727 sources."bindings-1.5.0"
6728 sources."bn.js-4.11.8"
6729 sources."boolbase-1.0.0"
6730 sources."brace-expansion-1.1.11"
6731 (sources."braces-2.3.2" // {
6732 dependencies = [
6733 sources."extend-shallow-2.0.1"
6734 ];
6735 })
6736 sources."brfs-1.6.1"
6737 sources."brorand-1.1.0"
6738 sources."browser-process-hrtime-1.0.0"
6739 sources."browserify-aes-1.2.0"
6740 sources."browserify-cipher-1.0.1"
6741 sources."browserify-des-1.0.2"
6742 sources."browserify-rsa-4.0.1"
6743 sources."browserify-sign-4.0.4"
6744 (sources."browserify-zlib-0.2.0" // {
6745 dependencies = [
6746 sources."pako-1.0.11"
6747 ];
6748 })
6749 sources."browserslist-4.12.0"
6750 sources."buffer-4.9.2"
6751 sources."buffer-equal-0.0.1"
6752 sources."buffer-from-1.1.1"
6753 sources."buffer-xor-1.0.3"
6754 sources."builtin-status-codes-3.0.0"
6755 sources."cache-base-1.0.1"
6756 sources."call-me-maybe-1.0.1"
6757 sources."caller-callsite-2.0.0"
6758 sources."caller-path-2.0.0"
6759 sources."callsites-2.0.0"
6760 sources."camelcase-5.3.1"
6761 sources."caniuse-api-3.0.0"
6762 sources."caniuse-lite-1.0.30001048"
6763 sources."caseless-0.12.0"
6764 (sources."chalk-2.4.2" // {
6765 dependencies = [
6766 sources."supports-color-5.5.0"
6767 ];
6768 })
6769 (sources."chokidar-2.1.8" // {
6770 dependencies = [
6771 sources."fsevents-1.2.12"
6772 ];
6773 })
6774 sources."cipher-base-1.0.4"
6775 (sources."class-utils-0.3.6" // {
6776 dependencies = [
6777 sources."define-property-0.2.5"
6778 ];
6779 })
6780 sources."cli-cursor-2.1.0"
6781 sources."cli-spinners-1.3.1"
6782 (sources."cliui-5.0.0" // {
6783 dependencies = [
6784 sources."ansi-regex-4.1.0"
6785 sources."strip-ansi-5.2.0"
6786 ];
6787 })
6788 sources."clone-2.1.2"
6789 sources."clones-1.2.0"
6790 sources."coa-2.0.2"
6791 sources."collection-visit-1.0.0"
6792 sources."color-3.1.2"
6793 sources."color-convert-1.9.3"
6794 sources."color-name-1.1.3"
6795 sources."color-string-1.5.3"
6796 sources."combined-stream-1.0.8"
6797 sources."command-exists-1.2.9"
6798 sources."commander-2.20.3"
6799 sources."component-emitter-1.3.0"
6800 sources."concat-map-0.0.1"
6801 sources."concat-stream-1.6.2"
6802 sources."config-chain-1.1.12"
6803 sources."console-browserify-1.2.0"
6804 sources."constants-browserify-1.0.0"
6805 sources."convert-source-map-1.7.0"
6806 sources."copy-descriptor-0.1.1"
6807 sources."core-js-2.6.11"
6808 sources."core-util-is-1.0.2"
6809 sources."cosmiconfig-5.2.1"
6810 sources."create-ecdh-4.0.3"
6811 sources."create-hash-1.2.0"
6812 sources."create-hmac-1.1.7"
6813 sources."cross-spawn-6.0.5"
6814 sources."crypto-browserify-3.12.0"
6815 sources."css-color-names-0.0.4"
6816 sources."css-declaration-sorter-4.0.1"
6817 (sources."css-modules-loader-core-1.1.0" // {
6818 dependencies = [
6819 sources."ansi-regex-2.1.1"
6820 sources."ansi-styles-2.2.1"
6821 (sources."chalk-1.1.3" // {
6822 dependencies = [
6823 sources."supports-color-2.0.0"
6824 ];
6825 })
6826 sources."has-flag-1.0.0"
6827 sources."postcss-6.0.1"
6828 sources."source-map-0.5.7"
6829 sources."strip-ansi-3.0.1"
6830 sources."supports-color-3.2.3"
6831 ];
6832 })
6833 sources."css-select-2.1.0"
6834 sources."css-select-base-adapter-0.1.1"
6835 sources."css-selector-tokenizer-0.7.2"
6836 sources."css-tree-1.0.0-alpha.37"
6837 sources."css-what-3.2.1"
6838 sources."cssesc-3.0.0"
6839 sources."cssnano-4.1.10"
6840 sources."cssnano-preset-default-4.0.7"
6841 sources."cssnano-util-get-arguments-4.0.0"
6842 sources."cssnano-util-get-match-4.0.0"
6843 sources."cssnano-util-raw-cache-4.0.1"
6844 sources."cssnano-util-same-parent-4.0.1"
6845 (sources."csso-4.0.3" // {
6846 dependencies = [
6847 sources."css-tree-1.0.0-alpha.39"
6848 sources."mdn-data-2.0.6"
6849 ];
6850 })
6851 sources."cssom-0.3.8"
6852 sources."cssstyle-1.4.0"
6853 sources."dashdash-1.14.1"
6854 sources."data-urls-1.1.0"
6855 sources."deasync-0.1.19"
6856 sources."debug-4.1.1"
6857 sources."decamelize-1.2.0"
6858 sources."decode-uri-component-0.2.0"
6859 sources."deep-is-0.1.3"
6860 (sources."defaults-1.0.3" // {
6861 dependencies = [
6862 sources."clone-1.0.4"
6863 ];
6864 })
6865 sources."define-properties-1.1.3"
6866 (sources."define-property-2.0.2" // {
6867 dependencies = [
6868 sources."is-accessor-descriptor-1.0.0"
6869 sources."is-data-descriptor-1.0.0"
6870 sources."is-descriptor-1.0.2"
6871 ];
6872 })
6873 sources."delayed-stream-1.0.0"
6874 sources."depd-1.1.2"
6875 sources."des.js-1.0.1"
6876 sources."destroy-1.0.4"
6877 sources."diffie-hellman-5.0.3"
6878 (sources."dom-serializer-0.2.2" // {
6879 dependencies = [
6880 sources."domelementtype-2.0.1"
6881 ];
6882 })
6883 sources."domain-browser-1.2.0"
6884 sources."domelementtype-1.3.1"
6885 sources."domexception-1.0.1"
6886 sources."domhandler-2.4.2"
6887 sources."domutils-1.7.0"
6888 sources."dot-prop-5.2.0"
6889 sources."dotenv-5.0.1"
6890 sources."dotenv-expand-4.2.0"
6891 sources."duplexer2-0.1.4"
6892 sources."ecc-jsbn-0.1.2"
6893 sources."editorconfig-0.15.3"
6894 sources."ee-first-1.1.1"
6895 sources."electron-to-chromium-1.3.418"
6896 sources."elliptic-6.5.2"
6897 sources."elm-hot-1.1.1"
6898 sources."emoji-regex-7.0.3"
6899 sources."encodeurl-1.0.2"
6900 sources."entities-2.0.0"
6901 sources."error-ex-1.3.2"
6902 sources."es-abstract-1.17.5"
6903 sources."es-to-primitive-1.2.1"
6904 sources."escape-html-1.0.3"
6905 sources."escape-string-regexp-1.0.5"
6906 (sources."escodegen-1.9.1" // {
6907 dependencies = [
6908 sources."esprima-3.1.3"
6909 ];
6910 })
6911 sources."esprima-4.0.1"
6912 sources."estraverse-4.3.0"
6913 sources."esutils-2.0.3"
6914 sources."etag-1.8.1"
6915 sources."events-3.1.0"
6916 sources."evp_bytestokey-1.0.3"
6917 (sources."expand-brackets-2.1.4" // {
6918 dependencies = [
6919 sources."debug-2.6.9"
6920 sources."define-property-0.2.5"
6921 sources."extend-shallow-2.0.1"
6922 sources."ms-2.0.0"
6923 ];
6924 })
6925 sources."extend-3.0.2"
6926 (sources."extend-shallow-3.0.2" // {
6927 dependencies = [
6928 sources."is-extendable-1.0.1"
6929 ];
6930 })
6931 (sources."extglob-2.0.4" // {
6932 dependencies = [
6933 sources."define-property-1.0.0"
6934 sources."extend-shallow-2.0.1"
6935 sources."is-accessor-descriptor-1.0.0"
6936 sources."is-data-descriptor-1.0.0"
6937 sources."is-descriptor-1.0.2"
6938 ];
6939 })
6940 sources."extsprintf-1.3.0"
6941 (sources."falafel-2.2.4" // {
6942 dependencies = [
6943 sources."isarray-2.0.5"
6944 ];
6945 })
6946 sources."fast-deep-equal-3.1.1"
6947 sources."fast-glob-2.2.7"
6948 sources."fast-json-stable-stringify-2.1.0"
6949 sources."fast-levenshtein-2.0.6"
6950 sources."fastparse-1.1.2"
6951 sources."file-uri-to-path-1.0.0"
6952 sources."filesize-3.6.1"
6953 (sources."fill-range-4.0.0" // {
6954 dependencies = [
6955 sources."extend-shallow-2.0.1"
6956 ];
6957 })
6958 sources."find-elm-dependencies-2.0.2"
6959 sources."find-up-2.1.0"
6960 sources."firstline-1.2.0"
6961 sources."for-in-1.0.2"
6962 sources."foreach-2.0.5"
6963 sources."forever-agent-0.6.1"
6964 sources."form-data-2.3.3"
6965 sources."fragment-cache-0.2.1"
6966 sources."fresh-0.5.2"
6967 sources."fs.realpath-1.0.0"
6968 sources."function-bind-1.1.1"
6969 sources."get-caller-file-2.0.5"
6970 sources."get-port-3.2.0"
6971 sources."get-value-2.0.6"
6972 sources."getpass-0.1.7"
6973 sources."glob-7.1.4"
6974 (sources."glob-parent-3.1.0" // {
6975 dependencies = [
6976 sources."is-glob-3.1.0"
6977 ];
6978 })
6979 sources."glob-to-regexp-0.3.0"
6980 sources."globals-11.12.0"
6981 sources."graceful-fs-4.2.3"
6982 sources."grapheme-breaker-0.3.2"
6983 sources."har-schema-2.0.0"
6984 sources."har-validator-5.1.3"
6985 sources."has-1.0.3"
6986 (sources."has-ansi-2.0.0" // {
6987 dependencies = [
6988 sources."ansi-regex-2.1.1"
6989 ];
6990 })
6991 sources."has-flag-3.0.0"
6992 sources."has-symbols-1.0.1"
6993 sources."has-value-1.0.0"
6994 (sources."has-values-1.0.0" // {
6995 dependencies = [
6996 sources."kind-of-4.0.0"
6997 ];
6998 })
6999 sources."hash-base-3.0.4"
7000 sources."hash.js-1.1.7"
7001 sources."hex-color-regex-1.1.0"
7002 sources."hmac-drbg-1.0.1"
7003 sources."hsl-regex-1.0.0"
7004 sources."hsla-regex-1.0.0"
7005 sources."html-comment-regex-1.1.2"
7006 sources."html-encoding-sniffer-1.0.2"
7007 sources."html-tags-1.2.0"
7008 (sources."htmlnano-0.2.5" // {
7009 dependencies = [
7010 sources."posthtml-0.12.3"
7011 sources."terser-4.6.12"
7012 ];
7013 })
7014 (sources."htmlparser2-3.10.1" // {
7015 dependencies = [
7016 sources."entities-1.1.2"
7017 sources."readable-stream-3.6.0"
7018 ];
7019 })
7020 sources."http-errors-1.7.3"
7021 sources."http-signature-1.2.0"
7022 sources."https-browserify-1.0.0"
7023 sources."iconv-lite-0.4.24"
7024 sources."icss-replace-symbols-1.1.0"
7025 sources."ieee754-1.1.13"
7026 sources."import-fresh-2.0.0"
7027 sources."indexes-of-1.0.1"
7028 sources."inflight-1.0.6"
7029 sources."inherits-2.0.4"
7030 sources."ini-1.3.5"
7031 sources."invariant-2.2.4"
7032 sources."is-absolute-url-2.1.0"
7033 (sources."is-accessor-descriptor-0.1.6" // {
7034 dependencies = [
7035 sources."kind-of-3.2.2"
7036 ];
7037 })
7038 sources."is-arrayish-0.2.1"
7039 sources."is-binary-path-1.0.1"
7040 sources."is-buffer-1.1.6"
7041 sources."is-callable-1.1.5"
7042 sources."is-color-stop-1.1.0"
7043 (sources."is-data-descriptor-0.1.4" // {
7044 dependencies = [
7045 sources."kind-of-3.2.2"
7046 ];
7047 })
7048 sources."is-date-object-1.0.2"
7049 (sources."is-descriptor-0.1.6" // {
7050 dependencies = [
7051 sources."kind-of-5.1.0"
7052 ];
7053 })
7054 sources."is-directory-0.3.1"
7055 sources."is-extendable-0.1.1"
7056 sources."is-extglob-2.1.1"
7057 sources."is-fullwidth-code-point-2.0.0"
7058 sources."is-glob-4.0.1"
7059 sources."is-html-1.1.0"
7060 (sources."is-number-3.0.0" // {
7061 dependencies = [
7062 sources."kind-of-3.2.2"
7063 ];
7064 })
7065 sources."is-obj-2.0.0"
7066 sources."is-plain-object-2.0.4"
7067 sources."is-regex-1.0.5"
7068 sources."is-resolvable-1.1.0"
7069 sources."is-svg-3.0.0"
7070 sources."is-symbol-1.0.3"
7071 sources."is-typedarray-1.0.0"
7072 sources."is-url-1.2.4"
7073 sources."is-windows-1.0.2"
7074 sources."is-wsl-1.1.0"
7075 sources."isarray-1.0.0"
7076 sources."isexe-2.0.0"
7077 sources."isobject-3.0.1"
7078 sources."isstream-0.1.2"
7079 (sources."js-beautify-1.11.0" // {
7080 dependencies = [
7081 sources."mkdirp-1.0.4"
7082 ];
7083 })
7084 sources."js-levenshtein-1.1.6"
7085 sources."js-tokens-4.0.0"
7086 sources."js-yaml-3.13.1"
7087 sources."jsbn-0.1.1"
7088 (sources."jsdom-14.1.0" // {
7089 dependencies = [
7090 sources."acorn-6.4.1"
7091 sources."escodegen-1.14.1"
7092 sources."ws-6.2.1"
7093 ];
7094 })
7095 sources."jsesc-2.5.2"
7096 sources."json-parse-better-errors-1.0.2"
7097 sources."json-schema-0.2.3"
7098 sources."json-schema-traverse-0.4.1"
7099 sources."json-stringify-safe-5.0.1"
7100 sources."json5-1.0.1"
7101 sources."jsprim-1.4.1"
7102 sources."kind-of-6.0.3"
7103 sources."levn-0.3.0"
7104 sources."locate-path-2.0.0"
7105 sources."lodash-4.17.15"
7106 sources."lodash.clone-4.5.0"
7107 sources."lodash.memoize-4.1.2"
7108 sources."lodash.sortby-4.7.0"
7109 sources."lodash.uniq-4.5.0"
7110 sources."log-symbols-2.2.0"
7111 sources."loose-envify-1.4.0"
7112 sources."lru-cache-4.1.5"
7113 sources."magic-string-0.22.5"
7114 sources."map-cache-0.2.2"
7115 sources."map-visit-1.0.0"
7116 sources."md5.js-1.3.5"
7117 sources."mdn-data-2.0.4"
7118 (sources."merge-source-map-1.0.4" // {
7119 dependencies = [
7120 sources."source-map-0.5.7"
7121 ];
7122 })
7123 sources."merge2-1.3.0"
7124 sources."micromatch-3.1.10"
7125 sources."miller-rabin-4.0.1"
7126 sources."mime-1.6.0"
7127 sources."mime-db-1.44.0"
7128 sources."mime-types-2.1.27"
7129 sources."mimic-fn-1.2.0"
7130 sources."minimalistic-assert-1.0.1"
7131 sources."minimalistic-crypto-utils-1.0.1"
7132 sources."minimatch-3.0.4"
7133 sources."minimist-1.2.5"
7134 (sources."mixin-deep-1.3.2" // {
7135 dependencies = [
7136 sources."is-extendable-1.0.1"
7137 ];
7138 })
7139 sources."mkdirp-0.5.5"
7140 sources."ms-2.1.2"
7141 sources."nan-2.14.1"
7142 sources."nanomatch-1.2.13"
7143 sources."nice-try-1.0.5"
7144 sources."node-addon-api-1.7.1"
7145 sources."node-elm-compiler-5.0.4"
7146 sources."node-forge-0.7.6"
7147 (sources."node-libs-browser-2.2.1" // {
7148 dependencies = [
7149 sources."punycode-1.4.1"
7150 ];
7151 })
7152 sources."node-releases-1.1.53"
7153 sources."nopt-4.0.3"
7154 sources."normalize-html-whitespace-1.0.0"
7155 sources."normalize-path-3.0.0"
7156 sources."normalize-url-3.3.0"
7157 sources."nth-check-1.0.2"
7158 sources."nwsapi-2.2.0"
7159 sources."oauth-sign-0.9.0"
7160 sources."object-assign-4.1.1"
7161 (sources."object-copy-0.1.0" // {
7162 dependencies = [
7163 sources."define-property-0.2.5"
7164 sources."kind-of-3.2.2"
7165 ];
7166 })
7167 sources."object-inspect-1.7.0"
7168 sources."object-keys-1.1.1"
7169 sources."object-visit-1.0.1"
7170 sources."object.assign-4.1.0"
7171 sources."object.getownpropertydescriptors-2.1.0"
7172 sources."object.pick-1.3.0"
7173 sources."object.values-1.1.1"
7174 sources."on-finished-2.3.0"
7175 sources."once-1.4.0"
7176 sources."onetime-2.0.1"
7177 sources."opn-5.5.0"
7178 sources."optionator-0.8.3"
7179 sources."ora-2.1.0"
7180 sources."os-browserify-0.3.0"
7181 sources."os-homedir-1.0.2"
7182 sources."os-tmpdir-1.0.2"
7183 sources."osenv-0.1.5"
7184 sources."p-limit-1.3.0"
7185 sources."p-locate-2.0.0"
7186 sources."p-try-1.0.0"
7187 sources."pako-0.2.9"
7188 (sources."parcel-bundler-1.12.3" // {
7189 dependencies = [
7190 sources."postcss-value-parser-3.3.1"
7191 ];
7192 })
7193 sources."parse-asn1-5.1.5"
7194 sources."parse-json-4.0.0"
7195 sources."parse5-5.1.0"
7196 sources."parseurl-1.3.3"
7197 sources."pascalcase-0.1.1"
7198 sources."path-browserify-0.0.1"
7199 sources."path-dirname-1.0.2"
7200 sources."path-exists-3.0.0"
7201 sources."path-is-absolute-1.0.1"
7202 sources."path-key-2.0.1"
7203 sources."path-parse-1.0.6"
7204 sources."pbkdf2-3.0.17"
7205 sources."performance-now-2.1.0"
7206 sources."physical-cpu-count-2.0.0"
7207 sources."pkg-up-2.0.0"
7208 sources."pn-1.1.0"
7209 sources."posix-character-classes-0.1.1"
7210 sources."postcss-7.0.27"
7211 sources."postcss-calc-7.0.2"
7212 (sources."postcss-colormin-4.0.3" // {
7213 dependencies = [
7214 sources."postcss-value-parser-3.3.1"
7215 ];
7216 })
7217 (sources."postcss-convert-values-4.0.1" // {
7218 dependencies = [
7219 sources."postcss-value-parser-3.3.1"
7220 ];
7221 })
7222 sources."postcss-discard-comments-4.0.2"
7223 sources."postcss-discard-duplicates-4.0.2"
7224 sources."postcss-discard-empty-4.0.1"
7225 sources."postcss-discard-overridden-4.0.1"
7226 (sources."postcss-merge-longhand-4.0.11" // {
7227 dependencies = [
7228 sources."postcss-value-parser-3.3.1"
7229 ];
7230 })
7231 (sources."postcss-merge-rules-4.0.3" // {
7232 dependencies = [
7233 sources."postcss-selector-parser-3.1.2"
7234 ];
7235 })
7236 (sources."postcss-minify-font-values-4.0.2" // {
7237 dependencies = [
7238 sources."postcss-value-parser-3.3.1"
7239 ];
7240 })
7241 (sources."postcss-minify-gradients-4.0.2" // {
7242 dependencies = [
7243 sources."postcss-value-parser-3.3.1"
7244 ];
7245 })
7246 (sources."postcss-minify-params-4.0.2" // {
7247 dependencies = [
7248 sources."postcss-value-parser-3.3.1"
7249 ];
7250 })
7251 (sources."postcss-minify-selectors-4.0.2" // {
7252 dependencies = [
7253 sources."postcss-selector-parser-3.1.2"
7254 ];
7255 })
7256 (sources."postcss-modules-extract-imports-1.1.0" // {
7257 dependencies = [
7258 sources."postcss-6.0.23"
7259 sources."supports-color-5.5.0"
7260 ];
7261 })
7262 (sources."postcss-modules-local-by-default-1.2.0" // {
7263 dependencies = [
7264 sources."postcss-6.0.23"
7265 sources."supports-color-5.5.0"
7266 ];
7267 })
7268 (sources."postcss-modules-scope-1.1.0" // {
7269 dependencies = [
7270 sources."postcss-6.0.23"
7271 sources."supports-color-5.5.0"
7272 ];
7273 })
7274 (sources."postcss-modules-values-1.3.0" // {
7275 dependencies = [
7276 sources."postcss-6.0.23"
7277 sources."supports-color-5.5.0"
7278 ];
7279 })
7280 sources."postcss-normalize-charset-4.0.1"
7281 (sources."postcss-normalize-display-values-4.0.2" // {
7282 dependencies = [
7283 sources."postcss-value-parser-3.3.1"
7284 ];
7285 })
7286 (sources."postcss-normalize-positions-4.0.2" // {
7287 dependencies = [
7288 sources."postcss-value-parser-3.3.1"
7289 ];
7290 })
7291 (sources."postcss-normalize-repeat-style-4.0.2" // {
7292 dependencies = [
7293 sources."postcss-value-parser-3.3.1"
7294 ];
7295 })
7296 (sources."postcss-normalize-string-4.0.2" // {
7297 dependencies = [
7298 sources."postcss-value-parser-3.3.1"
7299 ];
7300 })
7301 (sources."postcss-normalize-timing-functions-4.0.2" // {
7302 dependencies = [
7303 sources."postcss-value-parser-3.3.1"
7304 ];
7305 })
7306 (sources."postcss-normalize-unicode-4.0.1" // {
7307 dependencies = [
7308 sources."postcss-value-parser-3.3.1"
7309 ];
7310 })
7311 (sources."postcss-normalize-url-4.0.1" // {
7312 dependencies = [
7313 sources."postcss-value-parser-3.3.1"
7314 ];
7315 })
7316 (sources."postcss-normalize-whitespace-4.0.2" // {
7317 dependencies = [
7318 sources."postcss-value-parser-3.3.1"
7319 ];
7320 })
7321 (sources."postcss-ordered-values-4.1.2" // {
7322 dependencies = [
7323 sources."postcss-value-parser-3.3.1"
7324 ];
7325 })
7326 sources."postcss-reduce-initial-4.0.3"
7327 (sources."postcss-reduce-transforms-4.0.2" // {
7328 dependencies = [
7329 sources."postcss-value-parser-3.3.1"
7330 ];
7331 })
7332 sources."postcss-selector-parser-6.0.2"
7333 (sources."postcss-svgo-4.0.2" // {
7334 dependencies = [
7335 sources."postcss-value-parser-3.3.1"
7336 ];
7337 })
7338 sources."postcss-unique-selectors-4.0.1"
7339 sources."postcss-value-parser-4.0.3"
7340 sources."posthtml-0.11.6"
7341 sources."posthtml-parser-0.4.2"
7342 sources."posthtml-render-1.2.2"
7343 sources."prelude-ls-1.1.2"
7344 sources."private-0.1.8"
7345 sources."process-0.11.10"
7346 sources."process-nextick-args-2.0.1"
7347 sources."proto-list-1.2.4"
7348 sources."pseudomap-1.0.2"
7349 sources."psl-1.8.0"
7350 sources."public-encrypt-4.0.3"
7351 sources."punycode-2.1.1"
7352 sources."purgecss-1.4.2"
7353 sources."q-1.5.1"
7354 sources."qs-6.5.2"
7355 sources."querystring-0.2.0"
7356 sources."querystring-es3-0.2.1"
7357 sources."quote-stream-1.0.2"
7358 sources."randombytes-2.1.0"
7359 sources."randomfill-1.0.4"
7360 sources."range-parser-1.2.1"
7361 sources."readable-stream-2.3.7"
7362 sources."readdirp-2.2.1"
7363 sources."regenerate-1.4.0"
7364 sources."regenerate-unicode-properties-8.2.0"
7365 sources."regenerator-runtime-0.13.5"
7366 (sources."regenerator-transform-0.14.4" // {
7367 dependencies = [
7368 sources."@babel/runtime-7.9.2"
7369 ];
7370 })
7371 sources."regex-not-1.0.2"
7372 sources."regexpu-core-4.7.0"
7373 sources."regjsgen-0.5.1"
7374 (sources."regjsparser-0.6.4" // {
7375 dependencies = [
7376 sources."jsesc-0.5.0"
7377 ];
7378 })
7379 sources."remove-trailing-separator-1.1.0"
7380 sources."repeat-element-1.1.3"
7381 sources."repeat-string-1.6.1"
7382 sources."request-2.88.2"
7383 sources."request-promise-core-1.1.3"
7384 sources."request-promise-native-1.0.8"
7385 sources."require-directory-2.1.1"
7386 sources."require-main-filename-2.0.0"
7387 sources."resolve-1.17.0"
7388 sources."resolve-from-3.0.0"
7389 sources."resolve-url-0.2.1"
7390 sources."restore-cursor-2.0.0"
7391 sources."ret-0.1.15"
7392 sources."rgb-regex-1.0.1"
7393 sources."rgba-regex-1.0.0"
7394 sources."rimraf-2.6.3"
7395 sources."ripemd160-2.0.2"
7396 sources."safe-buffer-5.1.2"
7397 sources."safe-regex-1.1.0"
7398 sources."safer-buffer-2.1.2"
7399 sources."safer-eval-1.3.6"
7400 sources."sax-1.2.4"
7401 sources."saxes-3.1.11"
7402 sources."semver-5.7.1"
7403 (sources."send-0.17.1" // {
7404 dependencies = [
7405 (sources."debug-2.6.9" // {
7406 dependencies = [
7407 sources."ms-2.0.0"
7408 ];
7409 })
7410 sources."ms-2.1.1"
7411 ];
7412 })
7413 sources."serialize-to-js-1.2.2"
7414 sources."serve-static-1.14.1"
7415 sources."set-blocking-2.0.0"
7416 (sources."set-value-2.0.1" // {
7417 dependencies = [
7418 sources."extend-shallow-2.0.1"
7419 ];
7420 })
7421 sources."setimmediate-1.0.5"
7422 sources."setprototypeof-1.1.1"
7423 sources."sha.js-2.4.11"
7424 sources."shallow-copy-0.0.1"
7425 sources."shebang-command-1.2.0"
7426 sources."shebang-regex-1.0.0"
7427 sources."sigmund-1.0.1"
7428 sources."signal-exit-3.0.3"
7429 (sources."simple-swizzle-0.2.2" // {
7430 dependencies = [
7431 sources."is-arrayish-0.3.2"
7432 ];
7433 })
7434 (sources."snapdragon-0.8.2" // {
7435 dependencies = [
7436 sources."debug-2.6.9"
7437 sources."define-property-0.2.5"
7438 sources."extend-shallow-2.0.1"
7439 sources."ms-2.0.0"
7440 sources."source-map-0.5.7"
7441 ];
7442 })
7443 (sources."snapdragon-node-2.1.1" // {
7444 dependencies = [
7445 sources."define-property-1.0.0"
7446 sources."is-accessor-descriptor-1.0.0"
7447 sources."is-data-descriptor-1.0.0"
7448 sources."is-descriptor-1.0.2"
7449 ];
7450 })
7451 (sources."snapdragon-util-3.0.1" // {
7452 dependencies = [
7453 sources."kind-of-3.2.2"
7454 ];
7455 })
7456 sources."source-map-0.6.1"
7457 sources."source-map-resolve-0.5.3"
7458 sources."source-map-support-0.5.19"
7459 sources."source-map-url-0.4.0"
7460 sources."split-string-3.1.0"
7461 sources."sprintf-js-1.0.3"
7462 sources."sshpk-1.16.1"
7463 sources."stable-0.1.8"
7464 (sources."static-eval-2.0.5" // {
7465 dependencies = [
7466 sources."escodegen-1.14.1"
7467 ];
7468 })
7469 (sources."static-extend-0.1.2" // {
7470 dependencies = [
7471 sources."define-property-0.2.5"
7472 ];
7473 })
7474 (sources."static-module-2.2.5" // {
7475 dependencies = [
7476 sources."object-inspect-1.4.1"
7477 ];
7478 })
7479 sources."statuses-1.5.0"
7480 sources."stealthy-require-1.1.1"
7481 sources."stream-browserify-2.0.2"
7482 sources."stream-http-2.8.3"
7483 (sources."string-width-3.1.0" // {
7484 dependencies = [
7485 sources."ansi-regex-4.1.0"
7486 sources."strip-ansi-5.2.0"
7487 ];
7488 })
7489 sources."string.prototype.trimend-1.0.1"
7490 sources."string.prototype.trimleft-2.1.2"
7491 sources."string.prototype.trimright-2.1.2"
7492 sources."string.prototype.trimstart-1.0.1"
7493 sources."string_decoder-1.1.1"
7494 sources."strip-ansi-4.0.0"
7495 (sources."stylehacks-4.0.3" // {
7496 dependencies = [
7497 sources."postcss-selector-parser-3.1.2"
7498 ];
7499 })
7500 sources."supports-color-6.1.0"
7501 sources."svgo-1.3.2"
7502 sources."symbol-tree-3.2.4"
7503 sources."temp-0.9.0"
7504 sources."terser-3.17.0"
7505 sources."through2-2.0.5"
7506 sources."timers-browserify-2.0.11"
7507 sources."timsort-0.3.0"
7508 sources."tiny-inflate-1.0.3"
7509 sources."to-arraybuffer-1.0.1"
7510 sources."to-fast-properties-2.0.0"
7511 (sources."to-object-path-0.3.0" // {
7512 dependencies = [
7513 sources."kind-of-3.2.2"
7514 ];
7515 })
7516 sources."to-regex-3.0.2"
7517 sources."to-regex-range-2.1.1"
7518 sources."toidentifier-1.0.0"
7519 sources."tough-cookie-2.5.0"
7520 sources."tr46-1.0.1"
7521 sources."trim-right-1.0.1"
7522 sources."tty-browserify-0.0.0"
7523 sources."tunnel-agent-0.6.0"
7524 sources."tweetnacl-0.14.5"
7525 sources."type-check-0.3.2"
7526 sources."typedarray-0.0.6"
7527 (sources."uncss-0.17.3" // {
7528 dependencies = [
7529 sources."is-absolute-url-3.0.3"
7530 ];
7531 })
7532 sources."unicode-canonical-property-names-ecmascript-1.0.4"
7533 sources."unicode-match-property-ecmascript-1.0.4"
7534 sources."unicode-match-property-value-ecmascript-1.2.0"
7535 sources."unicode-property-aliases-ecmascript-1.1.0"
7536 sources."unicode-trie-0.3.1"
7537 sources."union-value-1.0.1"
7538 sources."uniq-1.0.1"
7539 sources."uniqs-2.0.0"
7540 sources."unquote-1.1.1"
7541 (sources."unset-value-1.0.0" // {
7542 dependencies = [
7543 (sources."has-value-0.3.1" // {
7544 dependencies = [
7545 sources."isobject-2.1.0"
7546 ];
7547 })
7548 sources."has-values-0.1.4"
7549 ];
7550 })
7551 sources."upath-1.2.0"
7552 sources."uri-js-4.2.2"
7553 sources."urix-0.1.0"
7554 (sources."url-0.11.0" // {
7555 dependencies = [
7556 sources."punycode-1.3.2"
7557 ];
7558 })
7559 sources."use-3.1.1"
7560 (sources."util-0.11.1" // {
7561 dependencies = [
7562 sources."inherits-2.0.3"
7563 ];
7564 })
7565 sources."util-deprecate-1.0.2"
7566 sources."util.promisify-1.0.1"
7567 sources."uuid-3.4.0"
7568 sources."v8-compile-cache-2.1.0"
7569 sources."vendors-1.0.4"
7570 sources."verror-1.10.0"
7571 sources."vlq-0.2.3"
7572 sources."vm-browserify-1.1.2"
7573 sources."w3c-hr-time-1.0.2"
7574 sources."w3c-xmlserializer-1.1.2"
7575 sources."wcwidth-1.0.1"
7576 sources."webidl-conversions-4.0.2"
7577 sources."whatwg-encoding-1.0.5"
7578 sources."whatwg-mimetype-2.3.0"
7579 sources."whatwg-url-7.1.0"
7580 sources."which-1.3.1"
7581 sources."which-module-2.0.0"
7582 sources."word-wrap-1.2.3"
7583 (sources."wrap-ansi-5.1.0" // {
7584 dependencies = [
7585 sources."ansi-regex-4.1.0"
7586 sources."strip-ansi-5.2.0"
7587 ];
7588 })
7589 sources."wrappy-1.0.2"
7590 sources."ws-5.2.2"
7591 sources."xml-name-validator-3.0.0"
7592 sources."xmlchars-2.2.0"
7593 sources."xtend-4.0.2"
7594 sources."y18n-4.0.0"
7595 sources."yallist-2.1.2"
7596 (sources."yargs-14.2.3" // {
7597 dependencies = [
7598 sources."find-up-3.0.0"
7599 sources."locate-path-3.0.0"
7600 sources."p-limit-2.3.0"
7601 sources."p-locate-3.0.0"
7602 sources."p-try-2.2.0"
7603 ];
7604 })
7605 sources."yargs-parser-15.0.1"
7606 ];
7607 buildInputs = globalBuildInputs;
7608 meta = {
7609 license = "MIT";
7610 };
7611 production = false;
7612 bypassCache = true;
7613 reconstructLock = false;
7614 };
7615in
7616{
7617 args = args;
7618 sources = sources;
7619 tarball = nodeEnv.buildNodeSourceDist args;
7620 package = nodeEnv.buildNodePackage args;
7621 shell = nodeEnv.buildNodeShell args;
7622}
diff --git a/modules/private/websites/tools/games/codenames/registry.dat b/systems/eldiron/websites/games/codenames/registry.dat
index a8585a8..a8585a8 100644
--- a/modules/private/websites/tools/games/codenames/registry.dat
+++ b/systems/eldiron/websites/games/codenames/registry.dat
Binary files differ
diff --git a/modules/private/websites/tools/games/codenames/shell.nix b/systems/eldiron/websites/games/codenames/shell.nix
index 053696b..053696b 100644
--- a/modules/private/websites/tools/games/codenames/shell.nix
+++ b/systems/eldiron/websites/games/codenames/shell.nix
diff --git a/modules/private/websites/tools/games/codenames/wordlists/french.txt b/systems/eldiron/websites/games/codenames/wordlists/french.txt
index 462ddc4..462ddc4 100644
--- a/modules/private/websites/tools/games/codenames/wordlists/french.txt
+++ b/systems/eldiron/websites/games/codenames/wordlists/french.txt
diff --git a/systems/eldiron/websites/games/terraforming-mars/default.nix b/systems/eldiron/websites/games/terraforming-mars/default.nix
new file mode 100644
index 0000000..e90e72f
--- /dev/null
+++ b/systems/eldiron/websites/games/terraforming-mars/default.nix
@@ -0,0 +1,75 @@
1{ config, lib, pkgs, ... }:
2let
3 cfg = config.myServices.websites.games.terraforming-mars;
4 terraforming-mars = pkgs.callPackage ./terraforming-mars.nix {};
5in
6{
7 options.myServices.websites.games.terraforming-mars.enable = lib.mkEnableOption "Enable Terraforming mars game";
8 config = lib.mkIf cfg.enable {
9 myServices.dns.zones."immae.eu".subdomains.games.subdomains.terraforming-mars = with config.myServices.dns.helpers;
10 ips servers.eldiron.ips.main;
11 myServices.chatonsProperties.services.terraforming-mars = {
12 file.datetime = "2022-08-27T14:20:00";
13 service = {
14 name = "Terraforming Mars";
15 description = "Terraforming Mars Boardgame";
16 website = "https://terraforming-mars.games.immae.eu/";
17 logo = "https://terraforming-mars.games.immae.eu/favicon.ico";
18 status.level = "OK";
19 status.description = "OK";
20 registration."" = ["NONE"];
21 registration.load = "OPEN";
22 install.type = "PACKAGE";
23 };
24 software = {
25 name = "Terraforming Mars";
26 website = "https://github.com/terraforming-mars/terraforming-mars";
27 license.url = "https://github.com/terraforming-mars/terraforming-mars/blob/main/LICENSE";
28 license.name = "GNU General Public License v3.0";
29 version = "unversionned";
30 source.url = "https://github.com/terraforming-mars/terraforming-mars";
31 };
32 };
33 systemd.services.terraforming-mars = {
34 path = [ pkgs.nodejs_16 pkgs.bashInteractive ];
35 description = "Terraforming mars game";
36 wantedBy = [ "multi-user.target" ];
37 script = ''
38 export PORT=/run/terraforming-mars/socket.sock
39 export NODE_ENV=production
40 mkdir -p /var/lib/terraforming-mars/db
41 npm run start
42 '';
43 postStart = ''
44 sleep 5;
45 chown :wwwrun /run/terraforming-mars/socket.sock
46 chmod g+w /run/terraforming-mars/socket.sock
47 '';
48 environment.NPM_CONFIG_LOGS_DIR = "%S/terraforming-mars/npm_logs";
49 environment.NPM_CONFIG_CACHE = "%S/terraforming-mars/npm_cache";
50 serviceConfig = {
51 User = "terraformingmars";
52 DynamicUser = true;
53 SupplementaryGroups = [ "wwwrun" ];
54 Type = "simple";
55 WorkingDirectory = terraforming-mars;
56 RuntimeDirectory = "terraforming-mars";
57 StateDirectory = "terraforming-mars";
58 };
59 };
60
61 security.acme.certs.games.extraDomainNames = [ "terraforming-mars.games.immae.eu" ];
62 security.acme.certs.games.domain = "games.immae.eu";
63 services.websites.env.tools.vhostConfs.games_terraforming-mars = {
64 certName = "games";
65 hosts = [ "terraforming-mars.games.immae.eu" ];
66 root = null;
67 extraConfig = [
68 ''
69 ProxyPass / unix:///run/terraforming-mars/socket.sock|http://terraforming-mars.games.immae.eu/
70 ProxyPassReverse / unix:///run/terraforming-mars/socket.sock|http://terraforming-mars.games.immae.eu/
71 ''
72 ];
73 };
74 };
75}
diff --git a/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch b/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch
new file mode 100644
index 0000000..684a7df
--- /dev/null
+++ b/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch
@@ -0,0 +1,13 @@
1diff --git a/assets/index.html b/assets/index.html
2index 220192834..d77a0fc80 100644
3--- a/assets/index.html
4+++ b/assets/index.html
5@@ -2,7 +2,7 @@
6 <html>
7 <head>
8 <link
9- href="https://fonts.googleapis.com/css?family=Ubuntu&display=swap"
10+ href="https://assets.immae.eu/fonts/Ubuntu_swap/font.css"
11 rel="stylesheet"
12 />
13 <link rel="stylesheet" type="text/css" media="all" href="/styles.css" />
diff --git a/modules/private/websites/tools/games/terraforming-mars/node-packages.nix b/systems/eldiron/websites/games/terraforming-mars/node-packages.nix
index e5fac49..e5fac49 100644
--- a/modules/private/websites/tools/games/terraforming-mars/node-packages.nix
+++ b/systems/eldiron/websites/games/terraforming-mars/node-packages.nix
diff --git a/systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix b/systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix
new file mode 100644
index 0000000..f190221
--- /dev/null
+++ b/systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix
@@ -0,0 +1,39 @@
1{ fetchgit, runCommand, callPackage, mylibs, nodePackages, nodejs_16, git }:
2let
3 source = fetchgit {
4 url = "https://github.com/bafolts/terraforming-mars";
5 rev = "25b3f80e276cc0c1fc283a78b6ae94b13c545ab6";
6 sha256 = "03xcwvxv2mlmswngklzqp3lf30hgkvdilqq7p1z4h8xmy50cy12k";
7 leaveDotGit = true;
8 fetchSubmodules = true;
9 };
10 patchedSource = runCommand "patch-source" {} ''
11 cp -r ${source} $out
12 chmod -R u+w $out
13 sed -i -e 's/"lockfileVersion": 2,/"lockfileVersion": 1,/' $out/package-lock.json
14 '';
15 packages = callPackage ./node-packages.nix {
16 src = patchedSource;
17 nodeEnv = callPackage mylibs.nodeEnv { nodejs = nodejs_16; };
18 globalBuildInputs = [ nodejs_16.pkgs.node-pre-gyp ];
19 };
20 terraforming-mars = runCommand "terraforming-mars" {
21 buildInputs = [ nodejs_16 git ];
22 } ''
23 cp -r ${source} ./source
24 chmod -R u+w source
25 cd source
26 patch -p1 < ${./immae-assets.patch}
27 ln -s ${packages.package}/lib/node_modules/terraforming-mars/node_modules .
28 # See https://stackoverflow.com/questions/74548318/how-to-resolve-error-error0308010cdigital-envelope-routinesunsupported-no
29 export NODE_OPTIONS=--openssl-legacy-provider
30 npm run build
31 mkdir $out
32 cp -a build $out/
33 cp -a assets $out/
34 cp package.json $out/
35 ln -s ${packages.package}/lib/node_modules/terraforming-mars/node_modules $out
36 ln -s /var/lib/terraforming-mars/db $out/db
37 '';
38in
39 terraforming-mars
diff --git a/systems/eldiron/websites/git/cgit_js.html b/systems/eldiron/websites/git/cgit_js.html
new file mode 100644
index 0000000..4101071
--- /dev/null
+++ b/systems/eldiron/websites/git/cgit_js.html
@@ -0,0 +1,16 @@
1<script src="https://assets.immae.eu/jquery/3.5.1/jquery.min.js"></script>
2<script type="application/javascript">
3 $(document).ready(function() {
4 const linksObject = {
5 "/github/fretlink": "Fretlink Open-source Github forks",
6 "/github": "Github forks",
7 "/perso/Denise": "Denise",
8 "/perso/Immae": "Immae",
9 }
10 function toRow(href, name) {
11 return `<a href='/cgit${href}'>${name}</a>`;
12 }
13 const links = Object.keys(linksObject).map(function(k) { return toRow(k, linksObject[k]); }).join("");
14 $("table.tabs a.active[href='/cgit/']").after(links);
15 });
16</script>
diff --git a/systems/eldiron/websites/git/default.nix b/systems/eldiron/websites/git/default.nix
new file mode 100644
index 0000000..46ba34d
--- /dev/null
+++ b/systems/eldiron/websites/git/default.nix
@@ -0,0 +1,98 @@
1{ lib, pkgs, config, ... }:
2let
3 mantisbt = pkgs.callPackage ./mantisbt.nix {
4 mantisbt_2 = pkgs.webapps-mantisbt_2;
5 mantisbt_2-plugins = pkgs.webapps-mantisbt_2-plugins;
6 env = config.myEnv.tools.mantisbt;
7 inherit config;
8 };
9 gitweb = pkgs.callPackage ./gitweb.nix {
10 gitoliteDir = config.myServices.gitolite.gitoliteDir;
11 };
12
13 cfg = config.myServices.websites.tools.git;
14in {
15 options.myServices.websites.tools.git = {
16 enable = lib.mkEnableOption "enable git's website";
17 };
18
19 config = lib.mkIf cfg.enable {
20 myServices.chatonsProperties.services.mantisbt = {
21 file.datetime = "2022-08-21T10:08:00";
22 service = {
23 name = "MantisBT";
24 description = "Mantis Bug Tracker";
25 website = "https://git.immae.eu/mantisbt";
26 logo = "https://git.immae.eu/mantisbt/images/favicon.ico";
27 status.level = "OK";
28 status.description = "OK";
29 registration."" = ["MEMBER" "CLIENT"];
30 registration.load = "OPEN";
31 install.type = "PACKAGE";
32 guide.user = "https://www.immae.eu/docs/forge-logicielle.html";
33 };
34 software = {
35 name = "MantisBT";
36 website = "https://mantisbt.org/";
37 license.url = "https://opensource.org/licenses/gpl-license";
38 license.name = "GNU General Public License";
39 version = mantisbt.webRoot.version;
40 source.url = "https://github.com/mantisbt/mantisbt";
41 modules = mantisbt.webRoot.pluginNames;
42 };
43 };
44 secrets.keys = mantisbt.keys;
45 services.websites.env.tools.modules =
46 gitweb.apache.modules ++
47 mantisbt.apache.modules;
48
49 security.acme.certs.eldiron.extraDomainNames = [ "git.immae.eu" ];
50 services.websites.env.tools.vhostConfs.git = {
51 certName = "eldiron";
52 hosts = ["git.immae.eu" ];
53 root = gitweb.apache.root;
54 extraConfig = [
55 gitweb.apache.vhostConf
56 (mantisbt.apache.vhostConf config.services.phpfpm.pools.mantisbt.socket)
57 ''
58 RewriteEngine on
59 RewriteCond %{REQUEST_URI} ^/releases
60 RewriteRule /releases(.*) https://release.immae.eu$1 [P,L]
61 ''
62 ];
63 };
64 services.phpfpm.pools = {
65 mantisbt = {
66 user = config.services.websites.env.tools.user;
67 group = config.services.websites.env.tools.group;
68 settings = mantisbt.phpFpm.pool;
69 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
70 };
71 };
72
73 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
74 myServices.monitoring.fromMasterObjects.service = [
75 {
76 service_description = "gitweb website is running on git.immae.eu";
77 host_name = config.hostEnv.fqdn;
78 use = "external-web-service";
79 check_command = ["check_https" "git.immae.eu" "/cgit" "<title>Immae’s git"];
80
81 servicegroups = "webstatus-webapps";
82 _webstatus_name = "Git";
83 _webstatus_url = "https://git.immae.eu/";
84 }
85
86 {
87 service_description = "mantisbt website is running on git.immae.eu";
88 host_name = config.hostEnv.fqdn;
89 use = "external-web-service";
90 check_command = ["check_https" "git.immae.eu" "/mantisbt/" "<title>My View - MantisBT"];
91
92 servicegroups = "webstatus-webapps";
93 _webstatus_name = "Mantisbt";
94 _webstatus_url = "https://git.immae.eu/mantisbt";
95 }
96 ];
97 };
98}
diff --git a/systems/eldiron/websites/git/gitweb.nix b/systems/eldiron/websites/git/gitweb.nix
new file mode 100644
index 0000000..40f99e0
--- /dev/null
+++ b/systems/eldiron/websites/git/gitweb.nix
@@ -0,0 +1,124 @@
1{ gitweb, writeText, stdenv, coreutils, writeScript, gitolite, git, cgit, gitoliteDir, mailcap, highlight }:
2rec {
3 varDir = gitoliteDir;
4 config = writeText "gitweb.conf" ''
5 $git_temp = "/tmp";
6
7 # The directories where your projects are. Must not end with a
8 # slash.
9 $projectroot = "${varDir}/repositories";
10
11 $projects_list = "${varDir}/projects.list";
12 $strict_export = "true";
13
14 # Base URLs for links displayed in the web interface.
15 our @git_base_url_list = qw(ssh://gitolite@git.immae.eu https://git.immae.eu);
16
17 $feature{'blame'}{'default'} = [1];
18 $feature{'avatar'}{'default'} = ['gravatar'];
19 $feature{'highlight'}{'default'} = [1];
20
21 @stylesheets = ("gitweb-theme/gitweb.css");
22 $logo = "gitweb-theme/git-logo.png";
23 $favicon = "gitweb-theme/git-favicon.png";
24 $javascript = "gitweb-theme/gitweb.js";
25 $logo_url = "https://git.immae.eu/";
26 $projects_list_group_categories = "true";
27 $projects_list_description_width = 60;
28 $project_list_default_category = "__Others__";
29 $highlight_bin = "${highlight}/bin/highlight";
30 '';
31 aboutFilter = writeScript "about-filter.sh" ''
32 #!${stdenv.shell}
33
34 if [ -f "$CGIT_REPO_PATH/README.html" ]; then
35 cat "$CGIT_REPO_PATH/README.html"
36 else
37 ${cgit}/lib/cgit/filters/about-formatting.sh "$@"
38 fi
39 '';
40 cgitConfig = writeText "cgitrc" ''
41 css=/cgit-css/cgit.css
42 logo=/cgit-css/cgit.png
43 favicon=/cgit-css/favicon.ico
44 head-include=${./cgit_js.html}
45
46 root-title=Immae’s git
47 root-desc=To go back to the old interface: https://git.immae.eu/?old
48 readme=:README.md
49 readme=:readme.md
50 readme=:README
51 readme=:DOCUMENTATION.md
52 about-filter=${aboutFilter}
53 #${cgit}/lib/cgit/filters/about-formatting.sh
54 source-filter=${cgit}/lib/cgit/filters/syntax-highlighting.py
55
56 enable-blame=1
57 enable-index-links=1
58 enable-commit-graph=1
59 enable-log-filecount=1
60 enable-log-linecount=1
61
62 enable-html-serving=1
63 # Allow using gitweb.* keys
64 enable-git-config=1
65
66 side-by-side-diffs=1
67 snapshots=tar.gz tar.zst zip
68 mimetype-file=${mailcap}/etc/mime.types
69
70 section=__Others__
71 clone-url=ssh://gitolite@git.immae.eu/$CGIT_REPO_URL https://git.immae.eu/$CGIT_REPO_URL
72 #section-from-path=1
73 project-list=${varDir}/projects.list
74 scan-path=${varDir}/repositories
75 '';
76 apache = rec {
77 user = "wwwrun";
78 group = "wwwrun";
79 modules = [ "cgid" ];
80 root = gitweb;
81 vhostConf = ''
82 SetEnv GIT_PROJECT_ROOT ${varDir}/repositories/
83 ScriptAliasMatch \
84 "(?x)^/(.*/(HEAD | \
85 info/refs | \
86 objects/(info/[^/]+ | \
87 [0-9a-f]{2}/[0-9a-f]{38} | \
88 pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
89 git-(upload|receive)-pack))$" \
90 ${git}/libexec/git-core/git-http-backend/$1
91
92 <Directory "${git}/libexec/git-core">
93 Require all granted
94 </Directory>
95 <Directory "${root}">
96 DirectoryIndex gitweb.cgi
97 Require all granted
98 AllowOverride None
99 Options ExecCGI FollowSymLinks
100 <Files gitweb.cgi>
101 SetHandler cgi-script
102 SetEnv GITWEB_CONFIG "${config}"
103 </Files>
104 </Directory>
105
106 SetEnv CGIT_CONFIG ${cgitConfig}
107 ScriptAlias /cgit "${cgit}/cgit/cgit.cgi/"
108 Alias /cgit-css "${cgit}/cgit"
109 <Directory "${cgit}/cgit/">
110 AllowOverride None
111 Options ExecCGI FollowSymlinks
112 Require all granted
113 </Directory>
114
115 RewriteEngine On
116 RewriteCond %{QUERY_STRING} ^$
117 RewriteRule ^/?$ /cgit [L,R=302]
118
119 RewriteCond %{REQUEST_URI} ^(.*)(\.git)?/?$
120 RewriteCond ${varDir}/repositories/%1.git/HEAD -f
121 RewriteRule ^(.+)$ /cgit$1 [L,R=302]
122 '';
123 };
124}
diff --git a/systems/eldiron/websites/git/mantisbt.nix b/systems/eldiron/websites/git/mantisbt.nix
new file mode 100644
index 0000000..3bd78e1
--- /dev/null
+++ b/systems/eldiron/websites/git/mantisbt.nix
@@ -0,0 +1,86 @@
1{ env, mantisbt_2, mantisbt_2-plugins, config }:
2rec {
3 keys."webapps/tools-mantisbt" = {
4 user = apache.user;
5 group = apache.group;
6 permissions = "0400";
7 text = ''
8 <?php
9 $g_hostname = '${env.postgresql.socket}';
10 $g_db_username = '${env.postgresql.user}';
11 $g_db_password = '${env.postgresql.password}';
12 $g_database_name = '${env.postgresql.database}';
13 $g_db_type = 'pgsql';
14 $g_crypto_master_salt = '${env.master_salt}';
15 $g_allow_signup = OFF;
16 $g_allow_anonymous_login = ON;
17 $g_anonymous_account = 'anonymous';
18
19 $g_phpMailer_method = PHPMAILER_METHOD_SENDMAIL;
20 $g_smtp_host = 'localhost';
21 $g_smtp_username = ''';
22 $g_smtp_password = ''';
23 $g_webmaster_email = 'mantisbt@tools.immae.eu';
24 $g_from_email = 'mantisbt@tools.immae.eu';
25 $g_return_path_email = 'mantisbt@tools.immae.eu';
26 $g_from_name = 'Mantis Bug Tracker at git.immae.eu';
27 $g_email_receive_own = ON;
28 # --- LDAP ---
29 $g_login_method = LDAP;
30 $g_ldap_protocol_version = 3;
31 $g_ldap_server = 'ldaps://${env.ldap.host}:636';
32 $g_ldap_root_dn = 'ou=users,${env.ldap.base}';
33 $g_ldap_bind_dn = '${env.ldap.dn}';
34 $g_ldap_bind_passwd = '${env.ldap.password}';
35 $g_use_ldap_email = ON;
36 $g_use_ldap_realname = ON;
37 $g_ldap_uid_field = 'uid';
38 $g_ldap_realname_field = 'cn';
39 $g_ldap_organization = '${env.ldap.filter}';
40 '';
41 };
42 webRoot = (mantisbt_2.override { mantis_config = config.secrets.fullPaths."webapps/tools-mantisbt"; }).withPlugins (p: [p.slack p.source-integration]);
43 apache = rec {
44 user = "wwwrun";
45 group = "wwwrun";
46 modules = [ "proxy_fcgi" ];
47 root = webRoot;
48 vhostConf = socket: ''
49 Alias /mantisbt "${root}"
50 <Directory "${root}">
51 DirectoryIndex index.php
52 <FilesMatch "\.php$">
53 SetHandler "proxy:unix:${socket}|fcgi://localhost"
54 </FilesMatch>
55
56 AllowOverride All
57 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
58 Options FollowSymlinks
59 Require all granted
60 </Directory>
61 <Directory "${root}/admin">
62 #Reenable during upgrade
63 Require all denied
64 </Directory>
65 '';
66 };
67 phpFpm = rec {
68 serviceDeps = [ "postgresql.service" "openldap.service" ];
69 basedir = builtins.concatStringsSep ":" (
70 [ webRoot config.secrets.fullPaths."webapps/tools-mantisbt" ]
71 ++ webRoot.plugins);
72 pool = {
73 "listen.owner" = apache.user;
74 "listen.group" = apache.group;
75 "pm" = "ondemand";
76 "pm.max_children" = "60";
77 "pm.process_idle_timeout" = "60";
78
79 "php_admin_value[upload_max_filesize]" = "5000000";
80
81 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
82 "php_admin_value[session.save_handler]" = "redis";
83 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:MantisBT:'";
84 };
85 };
86}
diff --git a/systems/eldiron/websites/im/default.nix b/systems/eldiron/websites/im/default.nix
new file mode 100644
index 0000000..7755a5c
--- /dev/null
+++ b/systems/eldiron/websites/im/default.nix
@@ -0,0 +1,118 @@
1{ config, lib, pkgs, ... }:
2let
3 cfg = config.myServices.websites.tools.im;
4 converseVersion = "9.1.1";
5 www = pkgs.runCommand "www" {} ''
6 cp -a ${./www} $out
7 substituteInPlace $out/converse.html --replace {{converseVersion}} ${converseVersion}
8 '';
9in
10{
11 options.myServices.websites.tools.im = {
12 enable = lib.mkEnableOption "enable im website";
13 };
14
15 config = lib.mkIf cfg.enable {
16 myServices.chatonsProperties.services.converse = {
17 file.datetime = "2022-08-21T19:20:00";
18 service = {
19 name = "Converse";
20 description = "A free and open-source XMPP chat client in your browser";
21 website = "https://im.immae.fr/converse";
22 logo = "https://conversejs.org/docs/html/_static/favicon.ico";
23 status.level = "OK";
24 status.description = "OK";
25 registration."" = ["NONE" "FREE"];
26 registration.load = "OPEN";
27 install.type = "PACKAGE";
28 };
29 software = {
30 name = "Converse";
31 website = "https://conversejs.org/";
32 license.name = "Mozilla Public License 2.0";
33 license.url = "https://github.com/conversejs/converse.js/blob/master/LICENSE";
34 version = "9.1.1";
35 source.url = "https://github.com/conversejs/converse.js";
36 };
37 };
38 myServices.chatonsProperties.services.weechat-bridge = {
39 file.datetime = "2022-08-21T19:20:00";
40 service = {
41 name = "Weechat bridge";
42 description = "WeeChat web frontend";
43 website = "https://im.immae.fr/glowing-bear";
44 logo = "https://im.immae.fr/glowing-bear/assets/img/glowing_bear_128x128.png";
45 status.level = "OK";
46 status.description = "OK";
47 registration."" = ["NONE" "FREE"];
48 registration.load = "OPEN";
49 install.type = "PACKAGE";
50 };
51 software = {
52 name = "Glowing bear";
53 website = "https://www.ejabberd.im/";
54 license.name = "GNU General Public License v3.0";
55 license.url = "https://github.com/processone/ejabberd";
56 version = pkgs.glowing-bear.version;
57 source.url = "https://github.com/glowing-bear/glowing-bear";
58 };
59 };
60 myServices.chatonsProperties.services.xmpp = {
61 file.datetime = "2022-08-21T19:20:00";
62 service = {
63 name = "XMPP";
64 description = "Universal messaging standard";
65 website = "https://im.immae.fr/";
66 logo = "https://xmpp.org/favicon-32x32.png";
67 status.level = "OK";
68 status.description = "OK";
69 registration."" = ["MEMBER" "CLIENT"];
70 registration.load = "OPEN";
71 install.type = "PACKAGE";
72 };
73 software = {
74 name = "ejabberd";
75 website = "https://www.ejabberd.im/";
76 license.url = "https://github.com/processone/ejabberd/blob/master/COPYING";
77 license.name = "GNU GENERAL PUBLIC LICENSE Version 2";
78 version = pkgs.ejabberd.version;
79 source.url = "https://github.com/processone/ejabberd";
80 modules = "converse";
81 };
82 };
83 security.acme.certs.eldiron.extraDomainNames = [ "im.immae.fr" ];
84 services.websites.env.tools.vhostConfs.im = {
85 certName = "eldiron";
86 hosts = ["im.immae.fr"];
87 root = www;
88 extraConfig = [
89 ''
90 Alias /glowing-bear ${pkgs.glowing-bear}
91 Alias /converse ${www}/converse.html
92 ProxyPreserveHost On
93 <Location "/bosh">
94 ProxyPass http://localhost:5280/bosh
95 ProxyPassReverse http://localhost:5280/bosh
96 </Location>
97 <Location "/ws">
98 ProxyPass ws://localhost:5280/ws
99 </Location>
100 ProxyPass /upload http://localhost:5280/upload
101 ProxyPassReverse /upload http://localhost:5280/upload
102 ProxyPass /admin http://localhost:5280/admin
103 ProxyPassReverse /admin http://localhost:5280/admin
104 ProxyPass /api http://localhost:5280/api
105 ProxyPassReverse /api http://localhost:5280/api
106 <Directory ${pkgs.glowing-bear}>
107 AllowOverride none
108 Require all granted
109 </Directory>
110 <Directory ${www}>
111 Require all granted
112 AllowOverride none
113 </Directory>
114 ''
115 ];
116 };
117 };
118}
diff --git a/systems/eldiron/websites/im/www/converse.html b/systems/eldiron/websites/im/www/converse.html
new file mode 100644
index 0000000..4ca451d
--- /dev/null
+++ b/systems/eldiron/websites/im/www/converse.html
@@ -0,0 +1,57 @@
1<!DOCTYPE html>
2<html lang="en">
3 <head>
4 <title>Converse</title>
5 <meta charset="utf-8">
6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8 <meta name="description" content="Converse: An XMPP chat client which can be integrated into any website" />
9 <meta name="keywords" content="xmpp chat webchat converse.js Converse" />
10
11 <link type="text/css" rel="stylesheet" media="screen" href="https://assets.immae.eu/converse/{{converseVersion}}/dist/converse.min.css" />
12 <style type="text/css">
13 #conversejs div.chat-msg__text pre {
14 background-color: #eee;
15 padding: 10px;
16 }
17 </style>
18 <script src="https://assets.immae.eu/converse/{{converseVersion}}/3rdparty/libsignal-protocol.min.js"></script>
19 <script src="https://assets.immae.eu/converse/{{converseVersion}}/dist/converse.min.js"></script>
20 <script src="https://assets.immae.eu/marked/1.2.6/marked.min.js"></script>
21 <script src="https://assets.immae.eu/markdown-it/10.0.0/markdown-it.min.js"></script>
22 </head>
23 <body>
24 <script>
25 var md = window.markdownit({
26 html: true,
27 });
28 converse.plugins.add('markdown', {
29 //initialize () {
30 // const { _converse } = this;
31 // _converse.api.listen.on('afterMessageBodyTransformed', (view, text) => {
32 // let newtext = text.replace(/<br\/>/g, '\n').replace(/```/g, "\n```\n");
33 // newtext = md.render(newtext).replace(/^<p>/, "").replace(/<\/p>\s*$/, "");
34 // view.model.save({'message': newtext}, {'silent': true });
35 // });
36 //}
37 overrides: {
38 MessageView: {
39 transformBodyText: async function(text) {
40 let newtext = await this.__super__.transformBodyText.apply(this, arguments);
41 newtext = newtext.replace(/<br\/>/g, '\n').replace(/```/g, "\n```\n");
42 return md.render(newtext).replace(/^<p>/, "").replace(/<\/p>\s*$/, "");
43 }
44 }
45 }
46 });
47 converse.initialize({
48 //bosh_service_url: 'https://im.immae.fr/bosh',
49 websocket_url: 'wss://im.immae.fr/ws',
50 view_mode: 'fullscreen',
51 show_controlbox_by_default: true,
52 whitelisted_plugins: ['markdown'],
53 });
54 </script>
55 </body>
56</html>
57
diff --git a/modules/private/websites/tools/im/www/index.html b/systems/eldiron/websites/im/www/index.html
index 90c5458..90c5458 100644
--- a/modules/private/websites/tools/im/www/index.html
+++ b/systems/eldiron/websites/im/www/index.html
diff --git a/systems/eldiron/websites/immae/matrix/client b/systems/eldiron/websites/immae/matrix/client
new file mode 100644
index 0000000..89136a0
--- /dev/null
+++ b/systems/eldiron/websites/immae/matrix/client
@@ -0,0 +1,11 @@
1{
2 "m.homeserver": {
3 "base_url": "https://immae.ems.host"
4 },
5 "m.identity_server": {
6 "base_url": "https://vector.im"
7 },
8 "org.matrix.msc3575.proxy": {
9 "url": "https://immae.ems.host"
10 }
11}
diff --git a/modules/private/websites/immae/matrix/server b/systems/eldiron/websites/immae/matrix/server
index 449155a..449155a 100644
--- a/modules/private/websites/immae/matrix/server
+++ b/systems/eldiron/websites/immae/matrix/server
diff --git a/systems/eldiron/websites/immae/production.nix b/systems/eldiron/websites/immae/production.nix
new file mode 100644
index 0000000..e4060ba
--- /dev/null
+++ b/systems/eldiron/websites/immae/production.nix
@@ -0,0 +1,107 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.immae.production;
4 varDir = "/var/lib/buildbot/outputs/immae/blog";
5 historyDir = "/var/lib/buildbot/outputs/immae/history";
6 docsDir = "/var/lib/buildbot/outputs/immae/docs/";
7in {
8 options.myServices.websites.immae.production.enable = lib.mkEnableOption "enable Immae's website";
9
10 config = lib.mkIf cfg.enable {
11 myServices.dns.zones."immae.eu".subdomains = with config.myServices.dns.helpers;
12 {
13 www = ips servers.eldiron.ips.production;
14 matrix.CNAME = [ "immae.element.io." ];
15 };
16 services.webstats.sites = [ { name = "www.immae.eu"; } ];
17
18 security.acme.certs.immae.domain = "www.immae.eu";
19 security.acme.certs.immae.extraDomainNames = [ "immae.eu" ];
20 services.websites.env.production.bindMounts."${varDir}" = {};
21 services.websites.env.production.bindMounts."${docsDir}" = {};
22 services.websites.env.production.bindMounts."${historyDir}" = {};
23 services.websites.env.production.vhostConfs.immae_production = {
24 certName = "immae";
25 hosts = [ "www.immae.eu" "immae.eu" ];
26 root = varDir;
27 extraConfig = [
28 ''
29 Use Stats www.immae.eu
30 Header always set Strict-Transport-Security "max-age=31536000"
31
32 <LocationMatch /.well-known/(webfinger|host-meta)>
33 Header always set Referrer-Policy "strict-origin-when-cross-origin"
34 RequestHeader set X-Forwarded-Proto "https"
35
36 RewriteRule ^(.*)$ https://mastodon.immae.eu%{REQUEST_URI} [QSA,L]
37 </LocationMatch>
38
39 RewriteEngine On
40 RewriteCond "%{REQUEST_URI}" "!^/.well-known/(webfinger|host-meta)"
41 RewriteCond "%{HTTP_HOST}" "!^www\.immae\.eu$" [NC]
42 RewriteRule ^(.+)$ https://www.immae.eu$1 [R=302,L]
43
44 <Directory ${varDir}>
45 DirectoryIndex index.htm index.html
46 Options Indexes FollowSymLinks MultiViews Includes
47 AllowOverride All
48 Require all granted
49 </Directory>
50
51 Alias /.well-known/matrix ${./matrix}
52 <Directory ${./matrix}>
53 Options Indexes FollowSymLinks MultiViews Includes
54 AllowOverride None
55 Require all granted
56 Header always set Access-Control-Allow-Origin "*"
57 </Directory>
58
59 Alias /docs ${docsDir}
60 <Directory ${docsDir}>
61 DirectoryIndex index.htm index.html
62 Options Indexes FollowSymLinks MultiViews Includes
63 AllowOverride All
64 Require all granted
65 </Directory>
66
67 Alias /eurl ${./sarl}
68 Alias /eurl ${./sarl}
69 <Directory ${./sarl}>
70 DirectoryIndex index.htm index.html
71 Options Indexes FollowSymLinks MultiViews Includes
72 AllowOverride None
73 Require all granted
74 </Directory>
75
76 Alias /history ${historyDir}
77 <Directory ${historyDir}>
78 DirectoryIndex index.html
79 AllowOverride None
80 Require all granted
81 </Directory>
82
83 Alias /.well-known/chatonsinfos ${config.myServices.chatonsProperties.propertiesPath}
84 <Directory ${config.myServices.chatonsProperties.propertiesPath}>
85 Options Indexes FollowSymLinks MultiViews Includes
86 AllowOverride None
87 Require all granted
88 </Directory>
89 ''
90 ];
91 };
92
93 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
94 myServices.monitoring.fromMasterObjects.service = [
95 {
96 service_description = "blog website is running on immae.eu";
97 host_name = config.hostEnv.fqdn;
98 use = "external-web-service";
99 check_command = ["check_https" "www.immae.eu" "/blog/" "egrep -ri TODO /etc"];
100
101 servicegroups = "webstatus-websites";
102 _webstatus_name = "Immae’s Blog";
103 _webstatus_url = "https://www.immae.eu/blog";
104 }
105 ];
106 };
107}
diff --git a/systems/eldiron/websites/immae/release.nix b/systems/eldiron/websites/immae/release.nix
new file mode 100644
index 0000000..4882bac
--- /dev/null
+++ b/systems/eldiron/websites/immae/release.nix
@@ -0,0 +1,40 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.immae.release;
4 varDir = "/var/lib/ftp/release.immae.eu";
5in {
6 options.myServices.websites.immae.release.enable = lib.mkEnableOption "enable Release' website";
7
8 config = lib.mkIf cfg.enable {
9 myServices.dns.zones."immae.eu".subdomains.release = with config.myServices.dns.helpers;
10 ips servers.eldiron.ips.production;
11 services.webstats.sites = [ { name = "release.immae.eu"; } ];
12
13 security.acme.certs.immae.extraDomainNames = [ "release.immae.eu" ];
14 services.websites.env.production.vhostConfs.immae_release = {
15 certName = "immae";
16 hosts = [ "release.immae.eu" ];
17 root = varDir;
18 extraConfig = [
19 ''
20 Use Stats release.immae.eu
21
22 Use Apaxy "${varDir}" "title .duplicity-ignore"
23 <Directory "${varDir}">
24 Use LDAPConnect
25 Options Indexes
26 AllowOverride All
27 Require all granted
28 </Directory>
29
30 <Directory "${varDir}/packages">
31 Use LDAPConnect
32 Options Indexes FollowSymlinks
33 AllowOverride None
34 Require all granted
35 </Directory>
36 ''
37 ];
38 };
39 };
40}
diff --git a/modules/private/websites/immae/eurl/certificates/2021-certificate.crt b/systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt
index 671534c..671534c 100644
--- a/modules/private/websites/immae/eurl/certificates/2021-certificate.crt
+++ b/systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt
diff --git a/systems/eldiron/websites/kanboard/farm.nix b/systems/eldiron/websites/kanboard/farm.nix
new file mode 100644
index 0000000..a70d0d6
--- /dev/null
+++ b/systems/eldiron/websites/kanboard/farm.nix
@@ -0,0 +1,183 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.tools.kanboard.farm;
4 apacheUser = config.services.websites.env.tools.user;
5 apacheGroup = config.services.websites.env.tools.group;
6 toVardir = name: "/var/lib/kanboard_farm/${name}";
7 varDirs = lib.mapAttrsToList (name: v: toVardir name) cfg.instances;
8 toPhpBaseDir = name: [ rootDir (toVardir name) ];
9 phpBaseDir = builtins.concatStringsSep ":" (lib.unique (lib.flatten (lib.mapAttrsToList (name: v: toPhpBaseDir name) cfg.instances)));
10 rootDir = pkgs.kanboard;
11
12 toVhost = name: ''
13 Alias /${name} "${rootDir}"
14 <Location /${name}>
15 SetEnv DATA_DIR "${toVardir name}"
16 SetEnv MAIL_FROM "kanboard@tools.immae.eu"
17 </Location>
18 '';
19 toCustomVhost = name: lib.optionalAttrs (cfg.instances."${name}".customHost != null) {
20 "kanboard_farm_${name}" = {
21 certName = "eldiron";
22 hosts = [cfg.instances."${name}".customHost];
23 root = null;
24 extraConfig = [
25 ''
26 Alias / "${rootDir}"
27 <Location />
28 SetEnv DATA_DIR "${toVardir name}"
29 SetEnv MAIL_FROM "kanboard@tools.immae.eu"
30 </Location>
31 <Directory "${rootDir}">
32 DirectoryIndex index.php
33 AllowOverride All
34 Options FollowSymlinks
35 Require all granted
36
37 <FilesMatch "\.php$">
38 SetHandler "proxy:unix:${config.services.phpfpm.pools.kanboard_farm.socket}|fcgi://localhost"
39 </FilesMatch>
40 </Directory>
41 <DirectoryMatch "${rootDir}/data">
42 Require all denied
43 </DirectoryMatch>
44 ''
45 ];
46 };
47 };
48 customHosts = lib.filter (n: n != null) (map (n: cfg.instances."${n}".customHost) (builtins.attrNames cfg.instances));
49 customVhosts = lib.foldl (o: n: o // n) {} (map toCustomVhost (builtins.attrNames cfg.instances));
50 phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [all.redis]);
51in
52{
53 options.myServices.tools.kanboard.farm = {
54 instances = lib.mkOption {
55 description = "Instances names for the kanboard Farm";
56 default = {};
57 type = lib.types.attrsOf (lib.types.submodule {
58 options = {
59 customHost = lib.mkOption {
60 description = "Custom host to use for the kanboard instance";
61 default = null;
62 type = lib.types.nullOr lib.types.str;
63 };
64 };
65 });
66 };
67 vhosts = lib.mkOption {
68 description = "Instance vhosts configs";
69 readOnly = true;
70 type = lib.types.attrsOf lib.types.str;
71 default = lib.mapAttrs (name: v: toVhost name) cfg.instances;
72 };
73 };
74
75 config = lib.mkIf (builtins.length (builtins.attrNames cfg.instances) > 0) {
76 myServices.dns.zones."immae.eu".subdomains.kanboard =
77 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
78
79 myServices.chatonsProperties.hostings.kanboard = {
80 file.datetime = "2022-08-21T19:40:00";
81 hosting = {
82 name = "Kanboard";
83 description = "Kanban project management software";
84 website = "https://tools.immae.eu/kanboard";
85 logo = "https://tools.immae.eu/kanboard/assets/img/favicon.png";
86 type = "INSTANCE";
87 status.level = "OK";
88 status.description = "OK";
89 registration.load = "OPEN";
90 install.type = "PACKAGE";
91 };
92 };
93 myServices.chatonsProperties.services.kanboard = {
94 file.datetime = "2022-08-21T19:40:00";
95 service = {
96 name = "Kanboard";
97 description = "Kanban project management software";
98 website = "https://tools.immae.eu/kanboard";
99 logo = "https://tools.immae.eu/kanboard/assets/img/favicon.png";
100 status.level = "OK";
101 status.description = "OK";
102 registration."" = ["MEMBER" "CLIENT"];
103 registration.load = "OPEN";
104 install.type = "PACKAGE";
105 };
106 software = {
107 name = "Kanboard";
108 website = "https://kanboard.org/";
109 license.url = "https://github.com/kanboard/kanboard/blob/main/LICENSE";
110 license.name = "MIT License";
111 version = pkgs.kanboard.version;
112 source.url = "https://github.com/kanboard/kanboard";
113 };
114 };
115 system.activationScripts.kanboard_farm_vardirs = {
116 deps = [ "httpd" ];
117 text = ''
118 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${builtins.concatStringsSep " " varDirs}
119 '';
120 };
121 services.phpfpm.pools.kanboard_farm = {
122 user = apacheUser;
123 group = apacheGroup;
124 settings = let
125 instanceNb = builtins.length (builtins.attrNames cfg.instances);
126 in {
127 "listen.owner" = apacheUser;
128 "listen.group" = apacheGroup;
129 "pm" = "dynamic";
130 "pm.max_children" = builtins.toString (60 * instanceNb);
131 "pm.start_servers" = builtins.toString (2 * instanceNb);
132 "pm.min_spare_servers" = builtins.toString (2 * instanceNb);
133 "pm.max_spare_servers" = builtins.toString (3 * instanceNb);
134 "pm.process_idle_timeout" = "60";
135
136 "php_admin_value[output_buffering]" = "0";
137 "php_admin_value[max_execution_time]" = "1800";
138 "php_admin_value[zend_extension]" = "opcache";
139 "php_value[apcu.enable_cli]" = "1";
140 "php_value[apcu.enabled]" = "1";
141 #already enabled by default?
142 #"php_value[opcache.enable]" = "1";
143 "php_value[opcache.enable_cli]" = "1";
144 "php_value[opcache.interned_strings_buffer]" = "8";
145 "php_value[opcache.max_accelerated_files]" = "10000";
146 "php_value[opcache.memory_consumption]" = "128";
147 "php_value[opcache.save_comments]" = "1";
148 "php_value[opcache.revalidate_freq]" = "1";
149 "php_admin_value[memory_limit]" = "512M";
150
151 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${phpBaseDir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp";
152 "php_admin_value[session.save_handler]" = "redis";
153 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:KanboardFarm:'";
154 };
155 inherit phpPackage;
156 };
157 security.acme.certs.eldiron.extraDomainNames = customHosts ++ [ "kanboard.immae.eu" ];
158 services.websites.env.tools.vhostConfs = {
159 kanboard = {
160 certName = "eldiron";
161 hosts = ["kanboard.immae.eu"];
162 root = null;
163 extraConfig = [
164 ''
165 <Directory "${rootDir}">
166 DirectoryIndex index.php
167 AllowOverride All
168 Options FollowSymlinks
169 Require all granted
170
171 <FilesMatch "\.php$">
172 SetHandler "proxy:unix:${config.services.phpfpm.pools.kanboard_farm.socket}|fcgi://localhost"
173 </FilesMatch>
174 </Directory>
175 <DirectoryMatch "${rootDir}/data">
176 Require all denied
177 </DirectoryMatch>
178 ''
179 ] ++ builtins.attrValues cfg.vhosts;
180 };
181 } // customVhosts;
182 };
183}
diff --git a/systems/eldiron/websites/mail/default.nix b/systems/eldiron/websites/mail/default.nix
new file mode 100644
index 0000000..0a0342b
--- /dev/null
+++ b/systems/eldiron/websites/mail/default.nix
@@ -0,0 +1,141 @@
1{ lib, pkgs, config, ... }:
2let
3 roundcubemail = pkgs.callPackage ./roundcubemail.nix {
4 roundcubemail = pkgs.webapps-roundcubemail;
5 env = config.myEnv.tools.roundcubemail;
6 inherit config;
7 };
8 rainloop = pkgs.callPackage ./rainloop.nix {
9 rainloop = pkgs.rainloop-community;
10 };
11 cfg = config.myServices.websites.tools.email;
12 pcfg = config.services.phpfpm.pools;
13in
14{
15 options.myServices.websites.tools.email = {
16 enable = lib.mkEnableOption "enable email website";
17 };
18
19 imports = [
20 ./mta-sts.nix
21 ];
22
23 config = lib.mkIf cfg.enable {
24 #myServices.chatonsProperties.services.mail-rainloop = {
25 # file.datetime = "2022-08-22T00:30:00";
26 # service = {
27 # name = "Rainloop";
28 # description = "Simple, modern & fast web-based email client";
29 # website = "https://mail.immae.eu/rainloop";
30 # logo = "https://www.rainloop.net/static/img/logo-16x16.png";
31 # status.level = "ERROR";
32 # status.description = "Stopped due to CVE-2022-29360";
33 # registration."" = ["MEMBER" "CLIENT"];
34 # registration.load = "OPEN";
35 # install.type = "PACKAGE";
36 # };
37 # software = {
38 # name = "Rainloop";
39 # website = "https://www.rainloop.net/";
40 # license.url = "https://www.rainloop.net/licensing/";
41 # license.name = "GNU Affero General Public License v3.0";
42 # version = rainloop.webRoot.version;
43 # source.url = "https://github.com/RainLoop/rainloop-webmail";
44 # };
45 #};
46 #myServices.chatonsProperties.services.mail-roundcube = {
47 # file.datetime = "2022-08-22T00:30:00";
48 # service = {
49 # name = "Roundcube";
50 # description = "The Roundcube Webmail suite";
51 # website = "https://mail.immae.eu/roundcube";
52 # logo = "https://mail.immae.eu/roundcube/skins/elastic/images/favicon.ico";
53 # status.level = "OK";
54 # status.description = "OK";
55 # registration."" = ["MEMBER" "CLIENT"];
56 # registration.load = "OPEN";
57 # install.type = "PACKAGE";
58 # };
59 # software = {
60 # name = "Roundcube";
61 # website = "https://roundcube.net/";
62 # license.url = "https://github.com/roundcube/roundcubemail/blob/master/LICENSE";
63 # license.name = "GNU General Public License v3.0";
64 # version = roundcubemail.webRoot.version;
65 # source.url = "https://github.com/roundcube/roundcubemail";
66 # modules = map (a: a.pluginName) roundcubemail.webRoot.plugins ++ map (a: a.skinName) roundcubemail.webRoot.skins;
67 # };
68 #};
69
70 myServices.dns.zones."immae.eu".subdomains.mail =
71 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
72
73 secrets.keys = roundcubemail.keys;
74
75 services.websites.env.tools.modules =
76 [ "proxy_fcgi" ]
77 ++ rainloop.apache.modules
78 ++ roundcubemail.apache.modules;
79
80 security.acme.certs.mail.extraDomainNames = [ "mail.immae.eu" ];
81 services.websites.env.tools.vhostConfs.mail = {
82 certName = "mail";
83 hosts = ["mail.immae.eu"];
84 root = ./www;
85 extraConfig = [
86 (rainloop.apache.vhostConf pcfg.rainloop.socket)
87 (roundcubemail.apache.vhostConf pcfg.roundcubemail.socket)
88 ''
89 <Directory ${./www}>
90 Require all granted
91 Options -Indexes
92 </Directory>
93 ''
94 ];
95 };
96 systemd.services = {
97 phpfpm-rainloop = {
98 after = lib.mkAfter rainloop.phpFpm.serviceDeps;
99 wants = rainloop.phpFpm.serviceDeps;
100 };
101 phpfpm-roundcubemail = {
102 after = lib.mkAfter roundcubemail.phpFpm.serviceDeps;
103 wants = roundcubemail.phpFpm.serviceDeps;
104 };
105 };
106
107 services.phpfpm.pools.roundcubemail = {
108 user = "wwwrun";
109 group = "wwwrun";
110 settings = roundcubemail.phpFpm.pool;
111 phpOptions = config.services.phpfpm.phpOptions + ''
112 date.timezone = 'CET'
113 '';
114 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick all.redis ]);
115 };
116 services.phpfpm.pools.rainloop = {
117 user = "wwwrun";
118 group = "wwwrun";
119 settings = rainloop.phpFpm.pool;
120 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]);
121 };
122 system.activationScripts = {
123 roundcubemail = roundcubemail.activationScript;
124 rainloop = rainloop.activationScript;
125 };
126 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
127 myServices.monitoring.fromMasterObjects.service = [
128 {
129 service_description = "roundcube website is running on mail.immae.eu";
130 host_name = config.hostEnv.fqdn;
131 use = "external-web-service";
132 check_command = ["check_https" "mail.immae.eu" "/roundcube/" "<title>Roundcube"];
133
134 servicegroups = "webstatus-webapps,webstatus-email";
135 _webstatus_name = "Roundcube";
136 _webstatus_url = "https://mail.immae.eu/roundcube/";
137 }
138 ];
139 };
140
141}
diff --git a/systems/eldiron/websites/mail/mta-sts.nix b/systems/eldiron/websites/mail/mta-sts.nix
new file mode 100644
index 0000000..2438702
--- /dev/null
+++ b/systems/eldiron/websites/mail/mta-sts.nix
@@ -0,0 +1,42 @@
1{ lib, pkgs, config, ... }:
2let
3 getDomains = p: lib.mapAttrsToList (n: v: v) (lib.filterAttrs (n: v: v.receive) p.emailPolicies);
4 bydomain = builtins.mapAttrs (n: getDomains) config.myServices.dns.zones;
5 domains = lib.flatten (builtins.attrValues bydomain);
6 mxes = lib.mapAttrsToList
7 (n: v: v.mx.subdomain)
8 (lib.attrsets.filterAttrs (n: v: v.mx.enable) config.myEnv.servers);
9 file = d: pkgs.writeText "mta-sts-${d.fqdn}.txt" (
10 builtins.concatStringsSep "\r\n" ([ "version: STSv1" "mode: testing" ]
11 ++ (map (v: "mx: ${v}.${d.domain}") mxes)
12 ++ [ "max_age: 604800" ]
13 ));
14 root = pkgs.runCommand "mta-sts_root" {} ''
15 mkdir -p $out
16 ${builtins.concatStringsSep "\n" (map (d:
17 "cp ${file d} $out/${d.fqdn}.txt"
18 ) domains)}
19 '';
20 cfg = config.myServices.websites.tools.email;
21in
22{
23 config = lib.mkIf cfg.enable {
24 security.acme.certs.mail.extraDomainNames = ["mta-sts.mail.immae.eu"] ++ map (v: "mta-sts.${v.fqdn}") domains;
25 services.websites.env.tools.vhostConfs.mta_sts = {
26 certName = "mail";
27 hosts = ["mta-sts.mail.immae.eu"] ++ map (v: "mta-sts.${v.fqdn}") domains;
28 root = root;
29 extraConfig = [
30 ''
31 RewriteEngine on
32 RewriteCond %{HTTP_HOST} ^mta-sts.(.*)$
33 RewriteRule ^/.well-known/mta-sts.txt$ %{DOCUMENT_ROOT}/%1.txt [L]
34 <Directory ${root}>
35 Require all granted
36 Options -Indexes
37 </Directory>
38 ''
39 ];
40 };
41 };
42}
diff --git a/systems/eldiron/websites/mail/rainloop.nix b/systems/eldiron/websites/mail/rainloop.nix
new file mode 100644
index 0000000..f821005
--- /dev/null
+++ b/systems/eldiron/websites/mail/rainloop.nix
@@ -0,0 +1,54 @@
1{ lib, rainloop, writeText, stdenv, fetchurl }:
2rec {
3 varDir = "/var/lib/rainloop";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}
8 install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
9 '';
10 };
11 webRoot = rainloop.override { dataPath = "${varDir}/data"; };
12 apache = rec {
13 user = "wwwrun";
14 group = "wwwrun";
15 modules = [ "proxy_fcgi" ];
16 root = webRoot;
17 vhostConf = socket: ''
18 Alias /rainloop "${root}"
19 <Directory "${root}">
20 DirectoryIndex index.php
21 AllowOverride All
22 Options -FollowSymlinks
23 Require all denied
24
25 <FilesMatch "\.php$">
26 SetHandler "proxy:unix:${socket}|fcgi://localhost"
27 </FilesMatch>
28 </Directory>
29
30 <DirectoryMatch "${root}/data">
31 Require all denied
32 </DirectoryMatch>
33 '';
34 };
35 phpFpm = rec {
36 serviceDeps = [ "postgresql.service" ];
37 basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
38 pool = {
39 "listen.owner" = apache.user;
40 "listen.group" = apache.group;
41 "pm" = "ondemand";
42 "pm.max_children" = "60";
43 "pm.process_idle_timeout" = "60";
44
45 # Needed to avoid clashes in browser cookies (same domain)
46 "php_value[session.name]" = "RainloopPHPSESSID";
47 "php_admin_value[upload_max_filesize]" = "200M";
48 "php_admin_value[post_max_size]" = "200M";
49 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
50 "php_admin_value[session.save_handler]" = "redis";
51 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Rainloop:'";
52 };
53 };
54}
diff --git a/systems/eldiron/websites/mail/roundcubemail.nix b/systems/eldiron/websites/mail/roundcubemail.nix
new file mode 100644
index 0000000..21a10fe
--- /dev/null
+++ b/systems/eldiron/websites/mail/roundcubemail.nix
@@ -0,0 +1,119 @@
1{ env, roundcubemail, apacheHttpd, config }:
2rec {
3 varDir = "/var/lib/roundcubemail";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
8 ${varDir}/cache ${varDir}/logs
9 '';
10 };
11 keys."webapps/tools-roundcube" = {
12 user = apache.user;
13 group = apache.group;
14 permissions = "0400";
15 text =
16 let
17 psql_url = with env.postgresql; "pgsql://${user}:${password}@unix(${socket}:${port})/${database}";
18 in ''
19 <?php
20 $config['db_dsnw'] = '${psql_url}';
21 $config['default_host'] = 'ssl://imap.immae.eu';
22 $config['username_domain'] = array(
23 "imap.immae.eu" => "mail.immae.eu"
24 );
25 $config['imap_conn_options'] = array("ssl" => array("verify_peer" => false));
26 $config['smtp_server'] = 'tls://smtp.immae.eu';
27 $config['smtp_port'] = '587';
28 $config['managesieve_host'] = 'imap.immae.eu';
29 $config['managesieve_port'] = '4190';
30 $config['managesieve_usetls'] = true;
31 $config['managesieve_conn_options'] = array("ssl" => array("verify_peer" => false));
32
33 $config['imap_cache'] = 'db';
34 $config['messages_cache'] = 'db';
35
36 $config['support_url'] = ''';
37
38 $config['des_key'] = '${env.secret}';
39
40 $config['skin'] = 'elastic';
41 $config['plugins'] = array(
42 'attachment_reminder',
43 'emoticons',
44 'filesystem_attachments',
45 'hide_blockquote',
46 'identicon',
47 'identity_select',
48 'jqueryui',
49 'markasjunk',
50 'managesieve',
51 'newmail_notifier',
52 'vcard_attachments',
53 'zipdownload',
54
55 'automatic_addressbook',
56 'message_highlight',
57 'carddav',
58 // Ne marche pas ?: 'ident_switch',
59 // Ne marche pas ?: 'thunderbird_labels',
60 );
61
62 $config['language'] = 'fr_FR';
63
64 $config['drafts_mbox'] = 'Drafts';
65 $config['junk_mbox'] = 'Junk';
66 $config['sent_mbox'] = 'Sent';
67 $config['trash_mbox'] = 'Trash';
68 $config['default_folders'] = array('INBOX', 'Drafts', 'Sent', 'Junk', 'Trash');
69 $config['draft_autosave'] = 60;
70 $config['enable_installer'] = false;
71 $config['log_driver'] = 'file';
72 $config['temp_dir'] = '${varDir}/cache';
73 $config['mime_types'] = '${apacheHttpd}/conf/mime.types';
74 '';
75 keyDependencies = [ apacheHttpd ];
76 };
77 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 ]);
78 apache = rec {
79 user = "wwwrun";
80 group = "wwwrun";
81 modules = [ "proxy_fcgi" ];
82 root = webRoot;
83 vhostConf = socket: ''
84 Alias /roundcube "${root}"
85 <Directory "${root}">
86 DirectoryIndex index.php
87 AllowOverride All
88 Options FollowSymlinks
89 Require all granted
90
91 <FilesMatch "\.php$">
92 SetHandler "proxy:unix:${socket}|fcgi://localhost"
93 </FilesMatch>
94 </Directory>
95 '';
96 };
97 phpFpm = rec {
98 serviceDeps = [ "postgresql.service" ];
99 basedir = builtins.concatStringsSep ":" (
100 [ webRoot config.secrets.fullPaths."webapps/tools-roundcube" varDir ]
101 ++ webRoot.plugins
102 ++ webRoot.skins);
103 pool = {
104 "listen.owner" = apache.user;
105 "listen.group" = apache.group;
106 "pm" = "ondemand";
107 "pm.max_children" = "60";
108 "pm.process_idle_timeout" = "60";
109
110 # Needed to avoid clashes in browser cookies (same domain)
111 "php_value[session.name]" = "RoundcubemailPHPSESSID";
112 "php_admin_value[upload_max_filesize]" = "200M";
113 "php_admin_value[post_max_size]" = "200M";
114 "php_admin_value[open_basedir]" = "${basedir}:${apacheHttpd}/conf/mime.types:/tmp";
115 "php_admin_value[session.save_handler]" = "redis";
116 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Roundcubemail:'";
117 };
118 };
119}
diff --git a/modules/private/websites/tools/mail/www/index.html b/systems/eldiron/websites/mail/www/index.html
index 88b0ebd..88b0ebd 100644
--- a/modules/private/websites/tools/mail/www/index.html
+++ b/systems/eldiron/websites/mail/www/index.html
diff --git a/systems/eldiron/websites/mastodon/default.nix b/systems/eldiron/websites/mastodon/default.nix
new file mode 100644
index 0000000..603fc9e
--- /dev/null
+++ b/systems/eldiron/websites/mastodon/default.nix
@@ -0,0 +1,174 @@
1{ lib, pkgs, config, ... }:
2let
3 env = config.myEnv.tools.mastodon;
4 root = "${mcfg.workdir}/public/";
5 cfg = config.myServices.websites.tools.mastodon;
6 mcfg = config.immaeServices.mastodon;
7in {
8 options.myServices.websites.tools.mastodon = {
9 enable = lib.mkEnableOption "enable mastodon's website";
10 };
11
12 config = lib.mkIf cfg.enable {
13 myServices.dns.zones."immae.eu".subdomains.mastodon =
14 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
15
16 myServices.chatonsProperties.services.mastodon = {
17 file.datetime = "2022-08-21T19:50:00";
18 service = {
19 name = "Mastodon";
20 description = "Your self-hosted, globally interconnected microblogging community";
21 website = "https://mastodon.immae.eu/";
22 logo = "https://mastodon.immae.eu/apple-touch-icon.png";
23 status.level = "OK";
24 status.description = "OK";
25 registration."" = ["MEMBER" "CLIENT"];
26 registration.load = "OPEN";
27 install.type = "PACKAGE";
28 };
29 software = {
30 name = "Mastodon";
31 website = "https://joinmastodon.org/";
32 license.url = "https://github.com/tootsuite/mastodon/blob/master/LICENSE";
33 license.name = "GNU General Public License v3.0";
34 version = mcfg.package.version;
35 source.url = "https://github.com/tootsuite/mastodon";
36 };
37 };
38 secrets.keys."webapps/tools-mastodon" = {
39 user = "mastodon";
40 group = "mastodon";
41 permissions = "0400";
42 text = ''
43 REDIS_HOST=${env.redis.host}
44 REDIS_PORT=${env.redis.port}
45 REDIS_DB=${env.redis.db}
46 DB_HOST=${env.postgresql.socket}
47 DB_USER=${env.postgresql.user}
48 DB_NAME=${env.postgresql.database}
49 DB_PASS=${env.postgresql.password}
50 DB_PORT=${env.postgresql.port}
51
52 LOCAL_DOMAIN=mastodon.immae.eu
53 LOCAL_HTTPS=true
54 ALTERNATE_DOMAINS=immae.eu
55
56 PAPERCLIP_SECRET=${env.paperclip_secret}
57 SECRET_KEY_BASE=${env.secret_key_base}
58 OTP_SECRET=${env.otp_secret}
59
60 VAPID_PRIVATE_KEY=${env.vapid.private}
61 VAPID_PUBLIC_KEY=${env.vapid.public}
62
63 SMTP_DELIVERY_METHOD=sendmail
64 SMTP_FROM_ADDRESS=mastodon@tools.immae.eu
65 SENDMAIL_LOCATION="/run/wrappers/bin/sendmail"
66 PAPERCLIP_ROOT_PATH=${mcfg.dataDir}
67
68 STREAMING_CLUSTER_NUM=1
69
70 RAILS_LOG_LEVEL=warn
71
72 # LDAP authentication (optional)
73 LDAP_ENABLED=true
74 LDAP_HOST=${env.ldap.host}
75 LDAP_PORT=636
76 LDAP_METHOD=simple_tls
77 LDAP_BASE="${env.ldap.base}"
78 LDAP_BIND_DN="${env.ldap.dn}"
79 LDAP_PASSWORD="${env.ldap.password}"
80 LDAP_UID="uid"
81 LDAP_SEARCH_FILTER="${env.ldap.filter}"
82 '';
83 };
84 immaeServices.mastodon = {
85 enable = true;
86 configFile = config.secrets.fullPaths."webapps/tools-mastodon";
87 socketsPrefix = "live_immae";
88 dataDir = "/var/lib/mastodon_immae";
89 };
90 services.filesWatcher.mastodon-streaming = {
91 restart = true;
92 paths = [ mcfg.configFile ];
93 };
94 services.filesWatcher.mastodon-web = {
95 restart = true;
96 paths = [ mcfg.configFile ];
97 };
98 services.filesWatcher.mastodon-sidekiq = {
99 restart = true;
100 paths = [ mcfg.configFile ];
101 };
102
103
104 services.websites.env.tools.modules = [
105 "headers" "proxy" "proxy_wstunnel" "proxy_http"
106 ];
107 security.acme.certs.eldiron.extraDomainNames = [ "mastodon.immae.eu" ];
108 services.websites.env.tools.vhostConfs.mastodon = {
109 certName = "eldiron";
110 hosts = ["mastodon.immae.eu" ];
111 root = root;
112 extraConfig = [ ''
113 Header always set Referrer-Policy "strict-origin-when-cross-origin"
114 Header always set Strict-Transport-Security "max-age=31536000"
115
116 <LocationMatch "^/(assets|avatars|emoji|headers|packs|sounds|system)>
117 Header always set Cache-Control "public, max-age=31536000, immutable"
118 Require all granted
119 </LocationMatch>
120
121 ProxyPreserveHost On
122 RequestHeader set X-Forwarded-Proto "https"
123
124 RewriteEngine On
125
126 RewriteRule ^/api/v1/streaming/(.+)$ unix://${mcfg.sockets.node}|http://mastodon.immae.eu/api/v1/streaming/$1 [P,NE,QSA,L]
127 RewriteRule ^/api/v1/streaming/public$ unix://${mcfg.sockets.node}|http://mastodon.immae.eu/api/v1/streaming/public [P,NE,QSA,L]
128 RewriteRule ^/api/v1/streaming/$ unix://${mcfg.sockets.node}|ws://mastodon.immae.eu/ [P,NE,QSA,L]
129 RewriteCond %{REQUEST_URI} !/500.html
130 RewriteCond %{REQUEST_URI} !/sw.js
131 RewriteCond %{REQUEST_URI} !/embed.js
132 RewriteCond %{REQUEST_URI} !/robots.txt
133 RewriteCond %{REQUEST_URI} !/manifest.json
134 RewriteCond %{REQUEST_URI} !/browserconfig.xml
135 RewriteCond %{REQUEST_URI} !/mask-icon.svg
136 RewriteCond %{REQUEST_URI} !^(/.*\.(png|ico|gif)$)
137 RewriteCond %{REQUEST_URI} !^/(assets|avatars|emoji|headers|packs|sounds|system|.well-known/acme-challenge)
138 RewriteRule ^/(.*)$ unix:///run/mastodon/live_immae_puma.sock|http://mastodon.immae.eu/$1 [P,NE,QSA,L]
139 ProxyPassReverse / unix://${mcfg.sockets.rails}|http://mastodon.immae.eu/
140
141 Alias /system ${mcfg.dataDir}
142
143 <Directory ${mcfg.dataDir}>
144 Require all granted
145 Options -MultiViews
146 </Directory>
147
148 <Directory ${root}>
149 Require all granted
150 Options -MultiViews +FollowSymlinks
151 </Directory>
152
153 ErrorDocument 500 /500.html
154 ErrorDocument 501 /500.html
155 ErrorDocument 502 /500.html
156 ErrorDocument 503 /500.html
157 ErrorDocument 504 /500.html
158 '' ];
159 };
160 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
161 myServices.monitoring.fromMasterObjects.service = [
162 {
163 service_description = "mastodon website is running on mastodon.immae.eu";
164 host_name = config.hostEnv.fqdn;
165 use = "external-web-service";
166 check_command = ["check_https" "mastodon.immae.eu" "/" "Mastodon</title>"];
167
168 servicegroups = "webstatus-webapps";
169 _webstatus_name = "Mastodon";
170 _webstatus_url = "https://mastodon.immae.eu/";
171 }
172 ];
173 };
174}
diff --git a/systems/eldiron/websites/mgoblin/default.nix b/systems/eldiron/websites/mgoblin/default.nix
new file mode 100644
index 0000000..f276c62
--- /dev/null
+++ b/systems/eldiron/websites/mgoblin/default.nix
@@ -0,0 +1,173 @@
1{ lib, pkgs, config, mediagoblin, ... }:
2let
3 env = config.myEnv.tools.mediagoblin;
4 cfg = config.myServices.websites.tools.mediagoblin;
5 mcfg = config.services.mediagoblin;
6in {
7 options.myServices.websites.tools.mediagoblin = {
8 enable = lib.mkEnableOption "enable mediagoblin's website";
9 };
10
11 config = lib.mkIf cfg.enable {
12 myServices.dns.zones."immae.eu".subdomains.mgoblin =
13 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
14
15 myServices.chatonsProperties.services.mediagoblin = {
16 file.datetime = "2022-08-21T20:00:00";
17 service = {
18 name = "Mediagoblin";
19 description = "MediaGoblin is a free software media publishing platform that anyone can run";
20 website = "https://mgoblin.immae.eu/";
21 logo = "https://mgoblin.immae.eu/mgoblin_static/images/goblin.ico";
22 status.level = "OK";
23 status.description = "OK";
24 registration."" = ["MEMBER" "CLIENT"];
25 registration.load = "OPEN";
26 install.type = "PACKAGE";
27 };
28 software = {
29 name = "Mediagoblin";
30 website = "https://mediagoblin.org/";
31 license.url = "http://www.gnu.org/licenses/agpl.html";
32 license.name = "GNU Affero General Public License";
33 version = mcfg.package.version;
34 source.url = "https://git.savannah.gnu.org/git/mediagoblin.git";
35 modules = map (a: a.pluginName) mcfg.package.plugins;
36 };
37 };
38 secrets.keys."webapps/tools-mediagoblin" = {
39 user = "mediagoblin";
40 group = "mediagoblin";
41 permissions = "0400";
42 text =
43 let
44 psql_url = with env.postgresql; "postgresql://${user}:${password}@:${port}/${database}?host=${socket}";
45 redis_url = with env.redis; "redis+socket://${socket}?virtual_host=${db}";
46 in
47 ''
48 [DEFAULT]
49 data_basedir = "${mcfg.dataDir}"
50
51 [mediagoblin]
52 direct_remote_path = /mgoblin_static/
53 email_sender_address = "mediagoblin@tools.immae.eu"
54
55 #sql_engine = sqlite:///%(data_basedir)s/mediagoblin.db
56 sql_engine = ${psql_url}
57
58 email_debug_mode = false
59 allow_registration = false
60 allow_reporting = true
61
62 theme = airymodified
63
64 user_privilege_scheme = "uploader,commenter,reporter"
65
66 # We need to redefine them here since we override data_basedir
67 # cf /usr/share/webapps/mediagoblin/mediagoblin/config_spec.ini
68 workbench_path = %(data_basedir)s/media/workbench
69 crypto_path = %(data_basedir)s/crypto
70 theme_install_dir = %(data_basedir)s/themes/
71 theme_linked_assets_dir = %(data_basedir)s/theme_static/
72 plugin_linked_assets_dir = %(data_basedir)s/plugin_static/
73
74 [storage:queuestore]
75 base_dir = %(data_basedir)s/media/queue
76
77 [storage:publicstore]
78 base_dir = %(data_basedir)s/media/public
79 base_url = /mgoblin_media/
80
81 [celery]
82 CELERY_RESULT_DBURI = ${redis_url}
83 BROKER_URL = ${redis_url}
84 CELERYD_CONCURRENCY = 1
85
86 [plugins]
87 [[mediagoblin.plugins.geolocation]]
88 [[mediagoblin.plugins.ldap]]
89 [[[immae.eu]]]
90 LDAP_SERVER_URI = 'ldaps://${env.ldap.host}:636'
91 LDAP_SEARCH_BASE = '${env.ldap.base}'
92 LDAP_BIND_DN = '${env.ldap.dn}'
93 LDAP_BIND_PW = '${env.ldap.password}'
94 LDAP_SEARCH_FILTER = '${env.ldap.filter}'
95 EMAIL_SEARCH_FIELD = 'mail'
96 [[mediagoblin.plugins.basicsearch]]
97 [[mediagoblin.plugins.piwigo]]
98 [[mediagoblin.plugins.processing_info]]
99 [[mediagoblin.media_types.image]]
100 [[mediagoblin.media_types.video]]
101 '';
102 };
103
104 users.users.mediagoblin.extraGroups = [ "keys" ];
105
106 services.mediagoblin = {
107 enable = true;
108 package = mediagoblin.withPlugins (p: [p.basicsearch]);
109 configFile = config.secrets.fullPaths."webapps/tools-mediagoblin";
110 };
111 services.filesWatcher.mediagoblin-web = {
112 restart = true;
113 paths = [ mcfg.configFile ];
114 };
115 services.filesWatcher.mediagoblin-celeryd = {
116 restart = true;
117 paths = [ mcfg.configFile ];
118 };
119
120 services.websites.env.tools.modules = [
121 "proxy" "proxy_http"
122 ];
123 users.users.wwwrun.extraGroups = [ "mediagoblin" ];
124 security.acme.certs.eldiron.extraDomainNames = [ "mgoblin.immae.eu" ];
125 services.websites.env.tools.vhostConfs.mgoblin = {
126 certName = "eldiron";
127 hosts = ["mgoblin.immae.eu" ];
128 root = null;
129 extraConfig = [ ''
130 Alias /mgoblin_media ${mcfg.dataDir}/media/public
131 <Directory ${mcfg.dataDir}/media/public>
132 Options -Indexes +FollowSymLinks +MultiViews +Includes
133 Require all granted
134 </Directory>
135
136 Alias /theme_static ${mcfg.dataDir}/theme_static
137 <Directory ${mcfg.dataDir}/theme_static>
138 Options -Indexes +FollowSymLinks +MultiViews +Includes
139 Require all granted
140 </Directory>
141
142 Alias /plugin_static ${mcfg.dataDir}/plugin_static
143 <Directory ${mcfg.dataDir}/plugin_static>
144 Options -Indexes +FollowSymLinks +MultiViews +Includes
145 Require all granted
146 </Directory>
147
148 ProxyPreserveHost on
149 ProxyVia On
150 ProxyRequests Off
151 ProxyPass /mgoblin_media !
152 ProxyPass /theme_static !
153 ProxyPass /plugin_static !
154 ProxyPassMatch ^/.well-known/acme-challenge !
155 ProxyPass / unix://${mcfg.sockets.paster}|http://mgoblin.immae.eu/
156 ProxyPassReverse / unix://${mcfg.sockets.paster}|http://mgoblin.immae.eu/
157 '' ];
158 };
159 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
160 myServices.monitoring.fromMasterObjects.service = [
161 {
162 service_description = "mediagoblin website is running on mgoblin.immae.eu";
163 host_name = config.hostEnv.fqdn;
164 use = "external-web-service";
165 check_command = ["check_https" "mgoblin.immae.eu" "/" "<title>GNU MediaGoblin"];
166
167 servicegroups = "webstatus-webapps";
168 _webstatus_name = "Mediagoblin";
169 _webstatus_url = "https://mgoblin.immae.eu/";
170 }
171 ];
172 };
173}
diff --git a/modules/private/websites/moomin.txt b/systems/eldiron/websites/moomin.txt
index 036fb1c..036fb1c 100644
--- a/modules/private/websites/moomin.txt
+++ b/systems/eldiron/websites/moomin.txt
diff --git a/modules/websites/nosslVhost/index.html b/systems/eldiron/websites/nossl/index.html
index 4401a80..4401a80 100644
--- a/modules/websites/nosslVhost/index.html
+++ b/systems/eldiron/websites/nossl/index.html
diff --git a/systems/eldiron/websites/peertube/default.nix b/systems/eldiron/websites/peertube/default.nix
new file mode 100644
index 0000000..0ebe4e7
--- /dev/null
+++ b/systems/eldiron/websites/peertube/default.nix
@@ -0,0 +1,147 @@
1{ lib, pkgs, config, ... }:
2let
3 env = config.myEnv.tools.peertube;
4 cfg = config.myServices.websites.tools.peertube;
5 pcfg = config.immaeServices.peertube;
6in {
7 options.myServices.websites.tools.peertube = {
8 enable = lib.mkEnableOption "enable Peertube's website";
9 };
10
11 config = lib.mkIf cfg.enable {
12 myServices.dns.zones."immae.eu".subdomains.peertube =
13 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
14
15 myServices.chatonsProperties.hostings.peertube = {
16 file.datetime = "2022-08-21T20:00:00";
17 hosting = {
18 name = "Peertube";
19 description = "Free software to take back control of your videos";
20 website = "https://peertube.immae.eu/";
21 logo = "https://peertube.immae.eu/client/assets/images/icons/icon-192x192.png";
22 type = "INSTANCE";
23 status.level = "OK";
24 status.description = "OK";
25 registration.load = "OPEN";
26 install.type = "PACKAGE";
27 };
28 };
29 myServices.chatonsProperties.services.peertube = {
30 file.datetime = "2022-08-21T20:00:00";
31 service = {
32 name = "Peertube";
33 description = "Free software to take back control of your videos";
34 website = "https://peertube.immae.eu/";
35 logo = "https://peertube.immae.eu/client/assets/images/icons/icon-192x192.png";
36 status.level = "OK";
37 status.description = "OK";
38 registration."" = ["MEMBER" "CLIENT"];
39 registration.load = "OPEN";
40 install.type = "PACKAGE";
41 };
42 software = {
43 name = "Peertube";
44 website = "https://joinpeertube.org/";
45 license.url = "https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE";
46 license.name = "GNU Affero General Public License";
47 version = pcfg.package.version;
48 source.url = "https://github.com/Chocobozzz/PeerTube";
49 };
50 };
51 immaeServices.peertube = {
52 enable = true;
53 configFile = config.secrets.fullPaths."webapps/tools-peertube";
54 };
55 users.users.peertube.extraGroups = [ "keys" ];
56
57 secrets.keys."webapps/tools-peertube" = {
58 user = "peertube";
59 group = "peertube";
60 permissions = "0640";
61 text = ''
62 listen:
63 hostname: 'localhost'
64 port: ${toString config.myEnv.ports.peertube}
65 webserver:
66 https: true
67 hostname: 'peertube.immae.eu'
68 port: 443
69 database:
70 hostname: '${env.postgresql.socket}'
71 port: 5432
72 suffix: '_prod'
73 username: '${env.postgresql.user}'
74 password: '${env.postgresql.password}'
75 pool:
76 max: 5
77 redis:
78 socket: '${env.redis.socket}'
79 auth: null
80 db: ${env.redis.db}
81 smtp:
82 transport: sendmail
83 sendmail: '/run/wrappers/bin/sendmail'
84 from_address: 'peertube@tools.immae.eu'
85 storage:
86 tmp: '${pcfg.dataDir}/storage/tmp/'
87 avatars: '${pcfg.dataDir}/storage/avatars/'
88 videos: '${pcfg.dataDir}/storage/videos/'
89 streaming_playlists: '${pcfg.dataDir}/storage/streaming-playlists/'
90 redundancy: '${pcfg.dataDir}/storage/videos/'
91 logs: '${pcfg.dataDir}/storage/logs/'
92 previews: '${pcfg.dataDir}/storage/previews/'
93 thumbnails: '${pcfg.dataDir}/storage/thumbnails/'
94 torrents: '${pcfg.dataDir}/storage/torrents/'
95 captions: '${pcfg.dataDir}/storage/captions/'
96 cache: '${pcfg.dataDir}/storage/cache/'
97 plugins: '${pcfg.dataDir}/storage/plugins/'
98 client_overrides: '${pcfg.dataDir}/storage/client-overrides/'
99 '';
100 };
101
102 services.websites.env.tools.modules = [
103 "headers" "proxy" "proxy_http" "proxy_wstunnel"
104 ];
105 services.filesWatcher.peertube = {
106 restart = true;
107 paths = [ pcfg.configFile ];
108 };
109
110 security.acme.certs.eldiron.extraDomainNames = [ "peertube.immae.eu" ];
111 services.websites.env.tools.vhostConfs.peertube = {
112 certName = "eldiron";
113 hosts = [ "peertube.immae.eu" ];
114 root = null;
115 extraConfig = [ ''
116 RewriteEngine On
117
118 RewriteCond %{REQUEST_URI} ^/socket.io [NC]
119 RewriteCond %{QUERY_STRING} transport=websocket [NC]
120 RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L]
121
122 RewriteCond %{REQUEST_URI} ^/tracker/socket [NC]
123 RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L]
124
125 ProxyPass / http://localhost:${toString env.listenPort}/
126 ProxyPassReverse / http://localhost:${toString env.listenPort}/
127
128 ProxyPreserveHost On
129 RequestHeader set X-Real-IP %{REMOTE_ADDR}s
130 '' ];
131 };
132
133 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
134 myServices.monitoring.fromMasterObjects.service = [
135 {
136 service_description = "peertube website is running on peertube.immae.eu";
137 host_name = config.hostEnv.fqdn;
138 use = "external-web-service";
139 check_command = ["check_https" "peertube.immae.eu" "/" "<title>Immae’s PeerTube"];
140
141 servicegroups = "webstatus-webapps";
142 _webstatus_name = "Peertube";
143 _webstatus_url = "https://peertube.immae.eu/";
144 }
145 ];
146 };
147}
diff --git a/systems/eldiron/websites/performance/default.nix b/systems/eldiron/websites/performance/default.nix
new file mode 100644
index 0000000..23f754a
--- /dev/null
+++ b/systems/eldiron/websites/performance/default.nix
@@ -0,0 +1,93 @@
1{ pkgs, lib, config, ... }:
2let
3 env = config.myEnv.tools.status_engine;
4 package = pkgs.status-engine-interface.override({ config_file = config.secrets.fullPaths."status_engine_ui"; });
5 apacheRoot = "${package}/public";
6 cfg = config.myServices.websites.tools.performance;
7in
8{
9 options.myServices.websites.tools.performance = {
10 enable = lib.mkEnableOption "Enable performance website";
11 };
12
13 config = lib.mkIf cfg.enable {
14 myServices.dns.zones."immae.eu".subdomains.performance =
15 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
16
17 secrets.keys = {
18 status_engine_ui = {
19 permissions = "0400";
20 user = "wwwrun";
21 group = "wwwrun";
22 text = ''
23 allow_anonymous: 0
24 anonymous_can_submit_commands: 0
25 urls_without_login:
26 - login
27 - loginstate
28 auth_type: ldap
29 ldap_server: ${env.ldap.host}
30 ldap_use_ssl: 1
31 ldap_port: 636
32 ldap_bind_dn: ${env.ldap.dn}
33 ldap_bind_password: ${env.ldap.password}
34 ldap_base_dn: ${env.ldap.base}
35 ldap_filter: "${env.ldap.filter}"
36 ldap_attribute:
37 - memberOf
38 use_crate: 0
39 use_mysql: 1
40 mysql:
41 host: 127.0.0.1
42 port: ${builtins.toString env.mysql.port}
43 username: ${env.mysql.user}
44 password: ${env.mysql.password}
45 database: ${env.mysql.database}
46 display_perfdata: 1
47 perfdata_backend: mysql
48 '';
49 };
50 };
51
52 services.websites.env.tools.modules = [ "proxy_fcgi" ];
53
54 security.acme.certs.eldiron.extraDomainNames = [ "performance.immae.eu" ];
55 services.websites.env.tools.vhostConfs.performance = {
56 certName = "eldiron";
57 hosts = [ "performance.immae.eu" ];
58 root = apacheRoot;
59 extraConfig = [
60 ''
61 <Directory ${apacheRoot}>
62 DirectoryIndex index.html
63 AllowOverride None
64 Require all granted
65 <FilesMatch "\.php$">
66 SetHandler "proxy:unix:${config.services.phpfpm.pools.status_engine.socket}|fcgi://localhost"
67 </FilesMatch>
68 </Directory>
69 ''
70 ];
71 };
72
73 services.phpfpm.pools.status_engine = {
74 user = "wwwrun";
75 group = "wwwrun";
76 settings = {
77 "listen.owner" = "wwwrun";
78 "listen.group" = "wwwrun";
79 "pm" = "dynamic";
80 "pm.max_children" = "60";
81 "pm.start_servers" = "2";
82 "pm.min_spare_servers" = "1";
83 "pm.max_spare_servers" = "10";
84
85 "php_admin_value[session.save_handler]" = "redis";
86 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:StatusEngine:'";
87 "php_admin_value[open_basedir]" = "${package}:/tmp:${config.secrets.fullPaths."status_engine_ui"}";
88 };
89 phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis ]);
90 };
91
92 };
93}
diff --git a/systems/eldiron/websites/stats/default.nix b/systems/eldiron/websites/stats/default.nix
new file mode 100644
index 0000000..665010b
--- /dev/null
+++ b/systems/eldiron/websites/stats/default.nix
@@ -0,0 +1,51 @@
1{ config, lib, pkgs, ... }:
2let
3 cfg = config.myServices.websites.tools.stats;
4 myCfg = config.myEnv.tools.umami;
5in
6{
7 options.myServices.websites.tools.stats.enable = lib.mkEnableOption "Enable stats site";
8 config = lib.mkIf cfg.enable {
9 secrets.keys = {
10 "uami/env" = {
11 permission = "0400";
12 text = ''
13 PORT=${toString myCfg.listenPort}
14 HOSTNAME=127.0.0.1
15 DATABASE_URL=postgresql://${myCfg.postgresql.user}:${myCfg.postgresql.password}@localhost:${myCfg.postgresql.port}/${myCfg.postgresql.database}?sslmode=disable&host=${myCfg.postgresql.socket}
16 HASH_SALT=${myCfg.hashSalt}
17 '';
18 };
19 };
20
21 security.acme.certs.eldiron.extraDomainNames = [ "stats.immae.eu" ];
22 services.websites.env.tools.vhostConfs.stats = {
23 certName = "eldiron";
24 hosts = [ "stats.immae.eu" ];
25 root = null;
26 extraConfig = [
27 ''
28 ProxyPass / http://localhost:${toString myCfg.listenPort}/
29 ProxyPassReverse / http://localhost:${toString myCfg.listenPort}/
30 ProxyPreserveHost On
31 ''
32 ];
33 };
34 systemd.services.umami = {
35 description = "Umami service";
36 wantedBy = [ "multi-user.target" ];
37 after = [ "network.target" ];
38 wants = [ "postgresql.service" ];
39 path = [ pkgs.nodejs pkgs.bashInteractive ];
40 serviceConfig = {
41 Type = "simple";
42 User = "umami";
43 Group = "umami";
44 DynamicUser = true;
45 SupplementaryGroups = [ "keys" ];
46 ExecStart = "${pkgs.umami}/bin/umami";
47 EnvironmentFile = config.secrets.fullPaths."umami/env";
48 };
49 };
50 };
51}
diff --git a/systems/eldiron/websites/tools/adminer.nix b/systems/eldiron/websites/tools/adminer.nix
new file mode 100644
index 0000000..5e865b1
--- /dev/null
+++ b/systems/eldiron/websites/tools/adminer.nix
@@ -0,0 +1,83 @@
1{ config, webapps-adminer, php82, lib, forcePhpSocket ? null }:
2rec {
3 webRoot = webapps-adminer;
4 phpFpm = rec {
5 user = apache.user;
6 group = apache.group;
7 phpPackage = let
8 #mysqli_pam = php81.extensions.mysqli.overrideAttrs(old: {
9 # configureFlags = [ "--with-mysqli=${libmysqlclient_pam.dev}/bin/mysql_config" "--with-mysql-sock=/run/mysqld/mysqld.sock" ];
10 #});
11 in
12 php82.withExtensions ({ enabled, all }: [all.mysqli all.redis all.pgsql]);
13 settings = {
14 "listen.owner" = apache.user;
15 "listen.group" = apache.group;
16 "pm" = "ondemand";
17 "pm.max_children" = "5";
18 "pm.process_idle_timeout" = "60";
19 #"php_admin_flag[log_errors]" = "on";
20 # Needed to avoid clashes in browser cookies (same domain)
21 "php_value[session.name]" = "AdminerPHPSESSID";
22 "php_admin_value[open_basedir]" = "${webRoot}:/tmp";
23 "php_admin_value[session.save_handler]" = "redis";
24 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Adminer:'";
25 };
26 };
27 apache = rec {
28 user = "wwwrun";
29 group = "wwwrun";
30 modules = [ "proxy_fcgi" ];
31 root = webRoot;
32 vhostConf = socket: ''
33 Alias /adminer ${webRoot}
34 <Directory ${webRoot}>
35 DirectoryIndex index.php
36 <FilesMatch "\.php$">
37 SetHandler "proxy:unix:${if forcePhpSocket != null then forcePhpSocket else socket}|fcgi://localhost"
38 </FilesMatch>
39
40 Use LDAPConnect
41 Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu
42 Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu
43 </Directory>
44 '';
45 };
46 monitoringPlugins = [ "http" ];
47 monitoringObjects.service = [
48 {
49 service_description = "adminer website is running on tools.immae.eu";
50 host_name = config.hostEnv.fqdn;
51 use = "external-web-service";
52 check_command = ["check_https_auth" "tools.immae.eu" "/adminer/" "www.adminerevo.org"];
53
54 servicegroups = "webstatus-webapps";
55 _webstatus_name = "Adminer";
56 _webstatus_url = "https://tools.immae.eu/adminer/";
57 }
58 ];
59
60 chatonsProperties = {
61 published = false;
62 file.datetime = "2023-08-21T15:20:00";
63 service = {
64 name = "Adminer";
65 description = "Database management in a single PHP file";
66 website = "https://tools.immae.eu/adminer/";
67 logo = "https://tools.immae.eu/adminer/?file=favicon.ico";
68 status.level = "OK";
69 status.description = "OK";
70 registration."" = ["MEMBER" "CLIENT"];
71 registration.load = "OPEN";
72 install.type = "PACKAGE";
73 };
74 software = {
75 name = "Adminer";
76 website = "https://docs.adminerevo.org/";
77 license.url = "https://github.com/adminerevo/adminerevo/blob/main/readme.md";
78 license.name = "Apache License 2.0 or GPL 2";
79 version = webRoot.version;
80 source.url = "https://github.com/adminerevo/adminerevo/";
81 };
82 };
83}
diff --git a/systems/eldiron/websites/tools/default.nix b/systems/eldiron/websites/tools/default.nix
new file mode 100644
index 0000000..4d9e3c1
--- /dev/null
+++ b/systems/eldiron/websites/tools/default.nix
@@ -0,0 +1,547 @@
1{ lib, pkgs, config, mypackages-lib, grocy, ... }:
2let
3 composerEnv = mypackages-lib.composerEnv;
4 adminer = pkgs.callPackage ./adminer.nix { inherit config; };
5 ympd = pkgs.callPackage ./ympd.nix {
6 env = config.myEnv.tools.ympd;
7 inherit config;
8 };
9 ttrss = pkgs.callPackage ./ttrss.nix {
10 ttrss = pkgs.webapps-ttrss;
11 ttrss-plugins = pkgs.webapps-ttrss-plugins;
12 env = config.myEnv.tools.ttrss;
13 php = pkgs.php72;
14 inherit config;
15 };
16 kanboard = pkgs.callPackage ./kanboard.nix {
17 inherit config;
18 env = config.myEnv.tools.kanboard;
19 };
20 wallabag = pkgs.callPackage ./wallabag.nix {
21 wallabag = pkgs.webapps-wallabag.override {
22 composerEnv = composerEnv.override {
23 php = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy]);
24 };
25 };
26 env = config.myEnv.tools.wallabag;
27 inherit config;
28 };
29 yourls = pkgs.callPackage ./yourls.nix {
30 yourls = pkgs.webapps-yourls;
31 yourls-plugins = pkgs.webapps-yourls-plugins;
32 env = config.myEnv.tools.yourls;
33 inherit config;
34 };
35 rompr = pkgs.callPackage ./rompr.nix {
36 rompr = pkgs.webapps-rompr;
37 env = config.myEnv.tools.rompr;
38 inherit config;
39 };
40 shaarli = pkgs.callPackage ./shaarli.nix {
41 env = config.myEnv.tools.shaarli;
42 inherit config;
43 };
44 dokuwiki = pkgs.callPackage ./dokuwiki.nix {
45 dokuwiki = pkgs.webapps-dokuwiki;
46 dokuwiki-plugins = pkgs.webapps-dokuwiki-plugins;
47 inherit config;
48 };
49 ldap = pkgs.callPackage ./ldap.nix {
50 phpldapadmin = pkgs.webapps-phpldapadmin;
51 env = config.myEnv.tools.phpldapadmin;
52 inherit config;
53 };
54 grocy' = pkgs.callPackage ./grocy.nix {
55 grocy = grocy.override { composerEnv = composerEnv.override { php = pkgs.php72; }; };
56 };
57 phpbb = pkgs.callPackage ./phpbb.nix {
58 phpbb = (pkgs.webapps-phpbb.withLangs (l: [ l.fr ])).withExts (e: [
59 e.alfredoramos.markdown e.davidiq.mailinglist e.dmzx.mchat
60 e.empteintesduweb.monitoranswers e.lr94.autosubscribe
61 e.phpbbmodders.adduser ]);
62 };
63 webhooks-bin-env = pkgs.buildEnv {
64 name = "webhook-env";
65 paths = [ pkgs.apprise ];
66 pathsToLink = [ "/bin" ];
67 };
68 webhooks = pkgs.callPackage ./webhooks.nix {
69 env = config.myEnv.tools.webhooks;
70 binEnv = webhooks-bin-env;
71 };
72 dmarc-reports = pkgs.callPackage ./dmarc_reports.nix {
73 env = config.myEnv.tools.dmarc_reports;
74 inherit config;
75 };
76
77 landing = pkgs.callPackage ./landing.nix { };
78
79 cfg = config.myServices.websites.tools.tools;
80 pcfg = config.services.phpfpm.pools;
81in {
82 options.myServices.websites.tools.tools = {
83 enable = lib.mkEnableOption "enable tools website";
84 };
85
86 config = lib.mkIf cfg.enable {
87 # Services needing to send e-mails
88 myServices.dns.zones."immae.eu".emailPolicies."tools".receive = true;
89 myServices.dns.zones."immae.eu".subdomains =
90 with config.myServices.dns.helpers;
91 {
92 outils = ips servers.eldiron.ips.main;
93 tools = lib.mkMerge [
94 (mailCommon "immae.eu")
95 mailSend
96 (ips servers.eldiron.ips.main)
97 ];
98 };
99
100 myServices.chatonsProperties.services = {
101 adminer = adminer.chatonsProperties;
102 dokuwiki = dokuwiki.chatonsProperties;
103 shaarli = shaarli.chatonsProperties;
104 ttrss = ttrss.chatonsProperties;
105 wallabag = wallabag.chatonsProperties;
106 paste = {
107 file.datetime = "2022-08-22T00:15:00";
108 service = {
109 name = "Paste";
110 description = "A simple paster script with syntax highlight";
111 website = "https://tools.immae.eu/paste/";
112 logo = "https://assets.immae.eu/logo.jpg";
113 status.level = "OK";
114 status.description = "OK";
115 registration."" = ["MEMBER" "CLIENT"];
116 registration.load = "OPEN";
117 install.type = "PACKAGE";
118 guide.user = "https://tools.immae.eu/paste/";
119 };
120 software = {
121 name = "Paste";
122 website = "https://tools.immae.eu/paste/";
123 license.url = "https://tools.immae.eu/paste/license";
124 license.name = "MIT License";
125 version = "Unversioned";
126 source.url = "https://tools.immae.eu/paste/abcd123/py";
127 };
128 };
129 };
130 myServices.chatonsProperties.hostings = {
131 dokuwiki = dokuwiki.chatonsHostingProperties;
132 phpbb = phpbb.chatonsHostingProperties;
133 };
134 secrets.keys =
135 kanboard.keys
136 // ldap.keys
137 // shaarli.keys
138 // ttrss.keys
139 // wallabag.keys
140 // yourls.keys
141 // dmarc-reports.keys
142 // webhooks.keys
143 // ({ "webapps/tools-landing-sql-rw" = {
144 user = "wwwrun";
145 group = "wwwrun";
146 permissions = "0400";
147 text = let
148 env = config.myEnv.tools.landing;
149 in ''
150 SetEnv PGUSER "${env.postgresql.user}"
151 SetEnv PGPASSWORD "${env.postgresql.password}"
152 SetEnv PGDATABASE "${env.postgresql.database}"
153 SetEnv PGHOST "${env.postgresql.socket}"
154 '';
155 }; });
156 services.websites.env.tools.modules =
157 [ "proxy_fcgi" ]
158 ++ adminer.apache.modules
159 ++ ympd.apache.modules
160 ++ ttrss.apache.modules
161 ++ wallabag.apache.modules
162 ++ yourls.apache.modules
163 ++ rompr.apache.modules
164 ++ shaarli.apache.modules
165 ++ dokuwiki.apache.modules
166 ++ dmarc-reports.apache.modules
167 ++ phpbb.apache.modules
168 ++ ldap.apache.modules
169 ++ kanboard.apache.modules;
170
171 myServices.dns.zones."immae.dev" = with config.myServices.dns.helpers; {
172 subdomains.tools = ips servers.eldiron.ips.integration;
173 };
174 security.acme.certs.integration.domain = "tools.immae.dev";
175 services.websites.env.integration.vhostConfs.devtools = {
176 certName = "integration";
177 hosts = [ "tools.immae.dev" ];
178 root = "/var/lib/ftp/immae/devtools";
179 extraConfig = [
180 ''
181 Use Apaxy "/var/lib/ftp/immae/devtools" "title"
182 Timeout 600
183 ProxyTimeout 600
184 Header always set Content-Security-Policy-Report-Only "${config.myEnv.tools.csp_reports.policies.inline}"
185 <Directory "/var/lib/ftp/immae/devtools">
186 DirectoryIndex index.php index.htm index.html
187 AllowOverride all
188 Require all granted
189 <FilesMatch "\.php$">
190 SetHandler "proxy:unix:${pcfg.devtools.socket}|fcgi://localhost"
191 </FilesMatch>
192 </Directory>
193 ''
194 ];
195 };
196
197
198 security.acme.certs.eldiron.extraDomainNames = [ "outils.immae.eu" "tools.immae.eu" ];
199 services.websites.env.tools.vhostConfs.tools = {
200 certName = "eldiron";
201 hosts = ["tools.immae.eu" ];
202 root = landing;
203 extraConfig = [
204 ''
205 RedirectMatch 301 ^/vpn(.*)$ https://vpn.immae.eu$1
206 RedirectMatch 301 ^/roundcube(.*)$ https://mail.immae.eu/roundcube$1
207 RedirectMatch 301 ^/jappix(.*)$ https://im.immae.fr/converse
208
209 <Directory "${landing}">
210 Include ${config.secrets.fullPaths."webapps/tools-landing-sql-rw"}
211 DirectoryIndex index.html
212 AllowOverride None
213 Require all granted
214
215 <FilesMatch "\.php$">
216 SetHandler "proxy:unix:${pcfg.tools.socket}|fcgi://localhost"
217 </FilesMatch>
218 </Directory>
219 ''
220 (adminer.apache.vhostConf pcfg.adminer.socket)
221 ympd.apache.vhostConf
222 (ttrss.apache.vhostConf pcfg.ttrss.socket)
223 (wallabag.apache.vhostConf pcfg.wallabag.socket)
224 (yourls.apache.vhostConf pcfg.yourls.socket)
225 (rompr.apache.vhostConf pcfg.rompr.socket)
226 (shaarli.apache.vhostConf pcfg.shaarli.socket)
227 (dokuwiki.apache.vhostConf pcfg.dokuwiki.socket)
228 (ldap.apache.vhostConf pcfg.ldap.socket)
229 (kanboard.apache.vhostConf pcfg.kanboard.socket)
230 (grocy'.apache.vhostConf pcfg.grocy.socket)
231 (phpbb.apache.vhostConf pcfg.phpbb.socket)
232 (dmarc-reports.apache.vhostConf pcfg.dmarc-reports.socket)
233 ''
234 <Location "/paste/">
235 ProxyPass unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
236 ProxyPassReverse unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
237 ProxyPreserveHost on
238 </Location>
239 <Location "/paste">
240 ProxyPass unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
241 ProxyPassReverse unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
242 ProxyPreserveHost on
243 </Location>
244
245 <Location "/ntfy/">
246 SetEnv proxy-nokeepalive 1
247 SetEnv proxy-sendchunked 1
248 LimitRequestBody 102400
249
250 RewriteEngine On
251
252 # FIXME: why is landing prefixed in the url?
253 RewriteCond %{HTTP:Upgrade} websocket [NC]
254 RewriteCond %{HTTP:Connection} upgrade [NC]
255 RewriteRule ^(${landing}/ntfy)?/?(.*) unix:///run/ntfy/ntfy.sock|ws://tools.immae.eu/$2 [P,NE,QSA,L]
256
257 RewriteRule ^(${landing}/ntfy)?/?(.*) unix:///run/ntfy/ntfy.sock|http://tools.immae.eu/$2 [P,NE,QSA,L]
258 </Location>
259 Alias /BIP39 /var/lib/buildbot/outputs/immae/bip39
260 <Directory "/var/lib/buildbot/outputs/immae/bip39">
261 DirectoryIndex index.html
262 AllowOverride None
263 Require all granted
264 </Directory>
265
266 Alias /webhooks ${config.secrets.fullPaths."webapps/webhooks"}
267 <Directory "${config.secrets.fullPaths."webapps/webhooks"}">
268 Options -Indexes
269 DirectoryIndex index.php
270 Require all granted
271 AllowOverride None
272 <FilesMatch "\.php$">
273 SetHandler "proxy:unix:${pcfg.tools.socket}|fcgi://localhost"
274 </FilesMatch>
275 </Directory>
276 ''
277 ];
278 };
279
280 services.websites.env.tools.vhostConfs.outils = {
281 certName = "eldiron";
282 hosts = [ "outils.immae.eu" ];
283 root = null;
284 extraConfig = [
285 ''
286 RedirectMatch 301 ^/mediagoblin(.*)$ https://mgoblin.immae.eu$1
287
288 RedirectMatch 301 ^/ether(.*)$ https://ether.immae.eu$1
289
290 RedirectMatch 301 ^/nextcloud(.*)$ https://cloud.immae.eu$1
291 RedirectMatch 301 ^/owncloud(.*)$ https://cloud.immae.eu$1
292
293 RedirectMatch 301 ^/carddavmate(.*)$ https://dav.immae.eu/infcloud$1
294 RedirectMatch 301 ^/caldavzap(.*)$ https://dav.immae.eu/infcloud$1
295 RedirectMatch 301 ^/caldav.php(.*)$ https://dav.immae.eu/caldav.php$1
296 RedirectMatch 301 ^/davical(.*)$ https://dav.immae.eu/davical$1
297
298 RedirectMatch 301 ^/taskweb(.*)$ https://task.immae.eu/taskweb$1
299
300 RedirectMatch 301 ^/roundcube(.*)$ https://mail.immae.eu/roundcube$1
301
302 RedirectMatch 301 ^/jappix(.*)$ https://im.immae.fr/converse
303
304 RedirectMatch 301 ^/vpn(.*)$ https://vpn.immae.eu$1
305
306 RedirectMatch 301 ^/(.*)$ https://tools.immae.eu/$1
307 ''
308 ];
309 };
310
311 systemd.services = {
312 phpfpm-dokuwiki = {
313 after = lib.mkAfter dokuwiki.phpFpm.serviceDeps;
314 wants = dokuwiki.phpFpm.serviceDeps;
315 };
316 phpfpm-phpbb = {
317 after = lib.mkAfter phpbb.phpFpm.serviceDeps;
318 wants = phpbb.phpFpm.serviceDeps;
319 };
320 phpfpm-kanboard = {
321 after = lib.mkAfter kanboard.phpFpm.serviceDeps;
322 wants = kanboard.phpFpm.serviceDeps;
323 };
324 phpfpm-ldap = {
325 after = lib.mkAfter ldap.phpFpm.serviceDeps;
326 wants = ldap.phpFpm.serviceDeps;
327 };
328 phpfpm-shaarli = {
329 after = lib.mkAfter shaarli.phpFpm.serviceDeps;
330 wants = shaarli.phpFpm.serviceDeps;
331 };
332 phpfpm-ttrss = {
333 after = lib.mkAfter ttrss.phpFpm.serviceDeps;
334 wants = ttrss.phpFpm.serviceDeps;
335 };
336 phpfpm-wallabag = {
337 after = lib.mkAfter wallabag.phpFpm.serviceDeps;
338 wants = wallabag.phpFpm.serviceDeps;
339 preStart = lib.mkAfter wallabag.phpFpm.preStart;
340 };
341 phpfpm-yourls = {
342 after = lib.mkAfter yourls.phpFpm.serviceDeps;
343 wants = yourls.phpFpm.serviceDeps;
344 };
345 ntfy = {
346 description = "send push notifications to your phone or desktop via scripts from any computer";
347 wantedBy = [ "multi-user.target" ];
348 serviceConfig = {
349 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";
350 Type = "simple";
351 WorkingDirectory = "%S/ntfy";
352 RuntimeDirectory = "ntfy";
353 StateDirectory = "ntfy";
354 User = "wwwrun";
355 };
356 };
357 ympd = {
358 description = "Standalone MPD Web GUI written in C";
359 wantedBy = [ "multi-user.target" ];
360 script = ''
361 export MPD_PASSWORD=$(cat ${config.secrets.fullPaths."mpd"})
362 ${pkgs.ympd}/bin/ympd --host ${ympd.config.host} --port ${toString ympd.config.port} --webport ${ympd.config.webPort} --user nobody
363 '';
364 };
365 tt-rss = {
366 description = "Tiny Tiny RSS feeds update daemon";
367 serviceConfig = {
368 User = "wwwrun";
369 ExecStart = "${pkgs.php72}/bin/php ${ttrss.webRoot}/update.php --daemon";
370 StandardOutput = "syslog";
371 StandardError = "syslog";
372 PermissionsStartOnly = true;
373 };
374
375 wantedBy = [ "multi-user.target" ];
376 requires = ["postgresql.service"];
377 after = ["network.target" "postgresql.service"];
378 };
379 };
380
381 services.filesWatcher.ympd = {
382 restart = true;
383 paths = [ config.secrets.fullPaths."mpd" ];
384 };
385
386 services.phpfpm.pools = {
387 tools = {
388 user = "wwwrun";
389 group = "wwwrun";
390 settings = {
391 "listen.owner" = "wwwrun";
392 "listen.group" = "wwwrun";
393 "pm" = "dynamic";
394 "pm.max_children" = "60";
395 "pm.start_servers" = "2";
396 "pm.min_spare_servers" = "1";
397 "pm.max_spare_servers" = "10";
398
399 "php_admin_value[sendmail_path]" = "/run/wrappers/bin/sendmail -t -i";
400 "php_admin_value[session.save_handler]" = "redis";
401 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Tools:'";
402 # Needed to avoid clashes in browser cookies (same domain)
403 "php_value[session.name]" = "ToolsPHPSESSID";
404 "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" [
405 "/run/wrappers/bin/sendmail" landing "/tmp"
406 config.secrets.fullPaths."webapps/webhooks"
407 "${webhooks-bin-env}/bin"
408 ];
409 };
410 phpEnv = {
411 CONTACT_EMAIL = config.myEnv.tools.contact;
412 };
413 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]);
414 };
415 devtools = {
416 user = "wwwrun";
417 group = "wwwrun";
418 settings = {
419 "listen.owner" = "wwwrun";
420 "listen.group" = "wwwrun";
421 "pm" = "dynamic";
422 "pm.max_children" = "60";
423 "pm.start_servers" = "2";
424 "pm.min_spare_servers" = "1";
425 "pm.max_spare_servers" = "10";
426
427 "php_admin_value[sendmail_path]" = "/run/wrappers/bin/sendmail -t -i";
428 "php_admin_value[session.save_handler]" = "redis";
429 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Devtools:'";
430 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:/var/lib/ftp/immae/devtools:/tmp";
431 };
432 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.mysqli all.sqlite3 all.redis all.apcu all.opcache ]);
433 };
434 adminer = adminer.phpFpm;
435 ttrss = {
436 user = "wwwrun";
437 group = "wwwrun";
438 settings = ttrss.phpFpm.pool;
439 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
440 };
441 wallabag = {
442 user = "wwwrun";
443 group = "wwwrun";
444 settings = wallabag.phpFpm.pool;
445 phpPackage = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy all.redis]);
446 };
447 yourls = {
448 user = "wwwrun";
449 group = "wwwrun";
450 settings = yourls.phpFpm.pool;
451 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
452 };
453 rompr = {
454 user = "wwwrun";
455 group = "wwwrun";
456 settings = rompr.phpFpm.pool;
457 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
458 };
459 shaarli = {
460 user = "wwwrun";
461 group = "wwwrun";
462 settings = shaarli.phpFpm.pool;
463 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
464 };
465 dmarc-reports = {
466 user = "wwwrun";
467 group = "wwwrun";
468 settings = dmarc-reports.phpFpm.pool;
469 phpEnv = dmarc-reports.phpFpm.phpEnv;
470 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
471 };
472 dokuwiki = {
473 user = "wwwrun";
474 group = "wwwrun";
475 settings = dokuwiki.phpFpm.pool;
476 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
477 };
478 phpbb = {
479 user = "wwwrun";
480 group = "wwwrun";
481 settings = phpbb.phpFpm.pool;
482 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
483 };
484 ldap = {
485 user = "wwwrun";
486 group = "wwwrun";
487 settings = ldap.phpFpm.pool;
488 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
489 };
490 kanboard = {
491 user = "wwwrun";
492 group = "wwwrun";
493 settings = kanboard.phpFpm.pool;
494 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
495 };
496 grocy = {
497 user = "wwwrun";
498 group = "wwwrun";
499 settings = grocy'.phpFpm.pool;
500 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
501 };
502 };
503
504 system.activationScripts = {
505 grocy = grocy'.activationScript;
506 ttrss = ttrss.activationScript;
507 wallabag = wallabag.activationScript;
508 rompr = rompr.activationScript;
509 shaarli = shaarli.activationScript;
510 dokuwiki = dokuwiki.activationScript;
511 phpbb = phpbb.activationScript;
512 kanboard = kanboard.activationScript;
513 };
514
515 services.websites.env.tools.watchPaths = [
516 config.secrets.fullPaths."webapps/tools-shaarli"
517 ];
518 services.filesWatcher.phpfpm-wallabag = {
519 restart = true;
520 paths = [ config.secrets.fullPaths."webapps/tools-wallabag" ];
521 };
522
523 myServices.monitoring.fromMasterActivatedPlugins = lib.mkMerge [
524 ttrss.monitoringPlugins
525 rompr.monitoringPlugins
526 wallabag.monitoringPlugins
527 yourls.monitoringPlugins
528 ympd.monitoringPlugins
529 dokuwiki.monitoringPlugins
530 shaarli.monitoringPlugins
531 ldap.monitoringPlugins
532 adminer.monitoringPlugins
533 ];
534 myServices.monitoring.fromMasterObjects = lib.mkMerge [
535 ttrss.monitoringObjects
536 rompr.monitoringObjects
537 wallabag.monitoringObjects
538 yourls.monitoringObjects
539 ympd.monitoringObjects
540 dokuwiki.monitoringObjects
541 shaarli.monitoringObjects
542 ldap.monitoringObjects
543 adminer.monitoringObjects
544 ];
545 };
546}
547
diff --git a/systems/eldiron/websites/tools/dmarc_reports.nix b/systems/eldiron/websites/tools/dmarc_reports.nix
new file mode 100644
index 0000000..8b3aa99
--- /dev/null
+++ b/systems/eldiron/websites/tools/dmarc_reports.nix
@@ -0,0 +1,61 @@
1{ env, config }:
2rec {
3 keys."webapps/tools-dmarc-reports.php" = {
4 user = "wwwrun";
5 group = "wwwrun";
6 permissions = "0400";
7 text = ''
8 <?php
9 $dbhost = "${env.mysql.host}";
10 $dbname = "${env.mysql.database}";
11 $dbuser = "${env.mysql.user}";
12 $dbpass = "${env.mysql.password}";
13 $dbport = "${builtins.toString env.mysql.port}";
14 $anonymous_key = "${env.anonymous_key}";
15 ?>
16 '';
17 };
18 webRoot = ./dmarc_reports;
19 apache = rec {
20 user = "wwwrun";
21 group = "wwwrun";
22 modules = [ "proxy_fcgi" ];
23 root = webRoot;
24 vhostConf = socket: ''
25 Alias /dmarc-reports "${root}"
26 <Directory "${root}">
27 DirectoryIndex index.html
28 <FilesMatch "\.php$">
29 SetHandler "proxy:unix:${socket}|fcgi://localhost"
30 </FilesMatch>
31
32 AllowOverride None
33 Options +FollowSymlinks
34
35 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
36 Use LDAPConnect
37 Require all granted
38 Require ldap-attribute uid=immae
39 </Directory>
40 '';
41 };
42 phpFpm = rec {
43 basedir = builtins.concatStringsSep ":"
44 [ webRoot config.secrets.fullPaths."webapps/tools-dmarc-reports.php" ];
45 pool = {
46 "listen.owner" = apache.user;
47 "listen.group" = apache.group;
48 "pm" = "ondemand";
49 "pm.max_children" = "60";
50 "pm.process_idle_timeout" = "60";
51
52 "php_admin_value[session.save_handler]" = "redis";
53 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:DmarcReports:'";
54 # Needed to avoid clashes in browser cookies (same domain)
55 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
56 };
57 phpEnv = {
58 SECRETS_FILE = config.secrets.fullPaths."webapps/tools-dmarc-reports.php";
59 };
60 };
61}
diff --git a/modules/private/websites/tools/tools/dmarc_reports/api.php b/systems/eldiron/websites/tools/dmarc_reports/api.php
index 850f9ce..850f9ce 100644
--- a/modules/private/websites/tools/tools/dmarc_reports/api.php
+++ b/systems/eldiron/websites/tools/dmarc_reports/api.php
diff --git a/modules/private/websites/tools/tools/dmarc_reports/app.js b/systems/eldiron/websites/tools/dmarc_reports/app.js
index 8e8a6c4..8e8a6c4 100644
--- a/modules/private/websites/tools/tools/dmarc_reports/app.js
+++ b/systems/eldiron/websites/tools/dmarc_reports/app.js
diff --git a/modules/private/websites/tools/tools/dmarc_reports/default.css b/systems/eldiron/websites/tools/dmarc_reports/default.css
index 9e0c63f..9e0c63f 100644
--- a/modules/private/websites/tools/tools/dmarc_reports/default.css
+++ b/systems/eldiron/websites/tools/dmarc_reports/default.css
diff --git a/modules/private/websites/tools/tools/dmarc_reports/index.html b/systems/eldiron/websites/tools/dmarc_reports/index.html
index 0afc82f..0afc82f 100644
--- a/modules/private/websites/tools/tools/dmarc_reports/index.html
+++ b/systems/eldiron/websites/tools/dmarc_reports/index.html
diff --git a/systems/eldiron/websites/tools/dokuwiki.nix b/systems/eldiron/websites/tools/dokuwiki.nix
new file mode 100644
index 0000000..813c426
--- /dev/null
+++ b/systems/eldiron/websites/tools/dokuwiki.nix
@@ -0,0 +1,106 @@
1{ lib, stdenv, dokuwiki, dokuwiki-plugins, config }:
2rec {
3 varDir = "/var/lib/dokuwiki";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 if [ ! -d ${varDir} ]; then
8 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
9 ${varDir}/animals
10 cp -a ${webRoot}/conf.dist ${varDir}/conf
11 cp -a ${webRoot}/data.dist ${varDir}/data
12 cp -a ${webRoot}/
13 chown -R ${apache.user}:${apache.user} ${varDir}/config ${varDir}/data
14 chmod -R 755 ${varDir}/config ${varDir}/data
15 fi
16 '';
17 };
18 chatonsHostingProperties = {
19 file.datetime = "2022-08-21T22:50:00";
20 hosting = {
21 name = "Dokuwiki";
22 description = "DokuWiki is a simple to use and highly versatile Open Source wiki software";
23 website = "https://tools.immae.eu/dokuwiki/";
24 logo = "https://tools.immae.eu/dokuwiki/lib/tpl/dokuwiki/images/apple-touch-icon.png";
25 type = "INSTANCE";
26 status.level = "OK";
27 status.description = "OK";
28 registration.load = "OPEN";
29 install.type = "PACKAGE";
30 };
31 };
32 chatonsProperties = {
33 file.datetime = "2022-08-21T22:50:00";
34 service = {
35 name = "Dokuwiki";
36 description = "DokuWiki is a simple to use and highly versatile Open Source wiki software";
37 website = "https://tools.immae.eu/dokuwiki/";
38 logo = "https://tools.immae.eu/dokuwiki/lib/tpl/dokuwiki/images/apple-touch-icon.png";
39 status.level = "OK";
40 status.description = "OK";
41 registration."" = ["MEMBER" "CLIENT"];
42 registration.load = "OPEN";
43 install.type = "PACKAGE";
44 };
45 software = {
46 name = "Dokuwiki";
47 website = "https://www.dokuwiki.org/dokuwiki";
48 license.url = "http://www.gnu.org/licenses/gpl-2.0.html";
49 license.name = "GNU General Public License Version 2";
50 version = webRoot.version;
51 source.url = "https://download.dokuwiki.org/";
52 modules = map (a: a.pluginName) webRoot.plugins;
53 };
54 };
55 webRoot = dokuwiki.withPlugins (p: [ p.farmer p.todo ]);
56 apache = rec {
57 user = "wwwrun";
58 group = "wwwrun";
59 modules = [ "proxy_fcgi" ];
60 root = webRoot;
61 vhostConf = socket: ''
62 Alias /dokuwiki "${root}"
63 <Directory "${root}">
64 DirectoryIndex index.php
65 <FilesMatch "\.php$">
66 SetHandler "proxy:unix:${socket}|fcgi://localhost"
67 </FilesMatch>
68
69 AllowOverride All
70 Options +FollowSymlinks
71 Require all granted
72 </Directory>
73 '';
74 };
75 phpFpm = rec {
76 serviceDeps = [ "openldap.service" ];
77 basedir = builtins.concatStringsSep ":" (
78 [ webRoot varDir ] ++ webRoot.plugins);
79 pool = {
80 "listen.owner" = apache.user;
81 "listen.group" = apache.group;
82 "pm" = "ondemand";
83 "pm.max_children" = "60";
84 "pm.process_idle_timeout" = "60";
85
86 # Needed to avoid clashes in browser cookies (same domain)
87 "php_value[session.name]" = "DokuwikiPHPSESSID";
88 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
89 "php_admin_value[session.save_handler]" = "redis";
90 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Dokuwiki:'";
91 };
92 };
93 monitoringPlugins = [ "http" ];
94 monitoringObjects.service = [
95 {
96 service_description = "dokuwiki website is running on tools.immae.eu";
97 host_name = config.hostEnv.fqdn;
98 use = "external-web-service";
99 check_command = ["check_https" "tools.immae.eu" "/dokuwiki/" "<title>start"];
100
101 servicegroups = "webstatus-webapps";
102 _webstatus_name = "Dokuwiki";
103 _webstatus_url = "https://tools.immae.eu/dokuwiki/";
104 }
105 ];
106}
diff --git a/systems/eldiron/websites/tools/grocy.nix b/systems/eldiron/websites/tools/grocy.nix
new file mode 100644
index 0000000..96e18a3
--- /dev/null
+++ b/systems/eldiron/websites/tools/grocy.nix
@@ -0,0 +1,48 @@
1{ lib, stdenv, grocy }:
2rec {
3 varDir = "/var/lib/grocy";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
8 '';
9 };
10 webRoot = grocy.webRoot;
11 apache = rec {
12 user = "wwwrun";
13 group = "wwwrun";
14 modules = [ "proxy_fcgi" ];
15 root = webRoot;
16 vhostConf = socket: ''
17 Alias /grocy "${root}"
18 <Directory "${root}">
19 DirectoryIndex index.php
20 <FilesMatch "\.php$">
21 SetHandler "proxy:unix:${socket}|fcgi://localhost"
22 </FilesMatch>
23
24 AllowOverride All
25 Options +FollowSymlinks
26 Require all granted
27 </Directory>
28 '';
29 };
30 phpFpm = rec {
31 basedir = builtins.concatStringsSep ":" (
32 [ grocy grocy.yarnModules varDir ]);
33 pool = {
34 "listen.owner" = apache.user;
35 "listen.group" = apache.group;
36 "pm" = "ondemand";
37 "pm.max_children" = "60";
38 "pm.process_idle_timeout" = "60";
39
40 # Needed to avoid clashes in browser cookies (same domain)
41 "php_value[session.name]" = "grocyPHPSESSID";
42 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
43 "php_admin_value[session.save_handler]" = "redis";
44 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Grocy:'";
45 };
46 };
47}
48
diff --git a/systems/eldiron/websites/tools/kanboard.nix b/systems/eldiron/websites/tools/kanboard.nix
new file mode 100644
index 0000000..db39ecd
--- /dev/null
+++ b/systems/eldiron/websites/tools/kanboard.nix
@@ -0,0 +1,81 @@
1{ env, kanboard, config }:
2rec {
3 varDir = "/var/lib/kanboard";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
8 install -TDm644 ${webRoot}/dataold/.htaccess ${varDir}/data/.htaccess
9 install -TDm644 ${webRoot}/dataold/web.config ${varDir}/data/web.config
10 '';
11 };
12 keys."webapps/tools-kanboard" = {
13 user = apache.user;
14 group = apache.group;
15 permissions = "0400";
16 text = ''
17 SetEnv MAIL_FROM "kanboard@tools.immae.eu"
18
19 SetEnv DB_DRIVER "postgres"
20 SetEnv DB_USERNAME "${env.postgresql.user}"
21 SetEnv DB_PASSWORD "${env.postgresql.password}"
22 SetEnv DB_HOSTNAME "${env.postgresql.socket}"
23 SetEnv DB_NAME "${env.postgresql.database}"
24
25 SetEnv DATA_DIR "${varDir}"
26 SetEnv LDAP_AUTH "true"
27 SetEnv LDAP_SERVER "${env.ldap.host}"
28 SetEnv LDAP_START_TLS "true"
29
30 SetEnv LDAP_BIND_TYPE "proxy"
31 SetEnv LDAP_USERNAME "${env.ldap.dn}"
32 SetEnv LDAP_PASSWORD "${env.ldap.password}"
33 SetEnv LDAP_USER_BASE_DN "${env.ldap.base}"
34 SetEnv LDAP_USER_FILTER "${env.ldap.filter}"
35 SetEnv LDAP_GROUP_ADMIN_DN "${env.ldap.admin_dn}"
36 '';
37 };
38 webRoot = kanboard;
39 apache = rec {
40 user = "wwwrun";
41 group = "wwwrun";
42 modules = [ "proxy_fcgi" ];
43 root = webRoot;
44 vhostConf = socket: ''
45 Alias /kanboard "${root}"
46 <Location /kanboard>
47 Include ${config.secrets.fullPaths."webapps/tools-kanboard"}
48 </Location>
49 <Directory "${root}">
50 DirectoryIndex index.php
51 AllowOverride All
52 Options FollowSymlinks
53 Require all granted
54
55 <FilesMatch "\.php$">
56 SetHandler "proxy:unix:${socket}|fcgi://localhost"
57 </FilesMatch>
58 </Directory>
59 <DirectoryMatch "${root}/data">
60 Require all denied
61 </DirectoryMatch>
62 '';
63 };
64 phpFpm = rec {
65 serviceDeps = [ "postgresql.service" "openldap.service" ];
66 basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
67 pool = {
68 "listen.owner" = apache.user;
69 "listen.group" = apache.group;
70 "pm" = "ondemand";
71 "pm.max_children" = "60";
72 "pm.process_idle_timeout" = "60";
73
74 # Needed to avoid clashes in browser cookies (same domain)
75 "php_value[session.name]" = "KanboardPHPSESSID";
76 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
77 "php_admin_value[session.save_handler]" = "redis";
78 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Kanboard:'";
79 };
80 };
81}
diff --git a/systems/eldiron/websites/tools/landing.nix b/systems/eldiron/websites/tools/landing.nix
new file mode 100644
index 0000000..f5d851e
--- /dev/null
+++ b/systems/eldiron/websites/tools/landing.nix
@@ -0,0 +1,38 @@
1{ stdenv, yarn2nix-moretea, nodejs_16 }:
2let
3 source = builtins.fetchGit {
4 url = "https://git.immae.eu/github/bastienwirtz/homer.git";
5 ref = "gitolite_local/local_changes";
6 rev = "bb60c5b869931f305f15c5bfa9cdb3f68702f01f";
7 narHash = "sha256-xBIBUJhQ7KPY0d92pW9ErA9OvGafWcxyuGkbHShF4Bs=";
8 };
9 yarnModules = yarn2nix-moretea.mkYarnModules rec {
10 nodejs = nodejs_16;
11 name = "landing";
12 pname = name;
13 version = "v1.0.0";
14 packageJSON = "${source}/package.json";
15 yarnLock = "${source}/yarn.lock";
16 yarnNix = ./landing/yarn-packages.nix;
17 };
18in
19 stdenv.mkDerivation rec {
20 pname = "landing";
21 version = "v1.0.0";
22 src = source;
23
24 buildInputs = [ yarnModules yarn2nix-moretea.yarn ];
25 configurePhase = ''
26 ln -s ${yarnModules}/node_modules .
27 '';
28 buildPhase = ''
29 # See https://stackoverflow.com/questions/74548318/how-to-resolve-error-error0308010cdigital-envelope-routinesunsupported-no
30 export NODE_OPTIONS=--openssl-legacy-provider
31 yarn build
32 '';
33 installPhase = ''
34 cp -a dist $out
35 cp ${./landing}/*.php $out/
36 ln -s service-worker.js $out/worker.js
37 '';
38 }
diff --git a/systems/eldiron/websites/tools/landing/ldap_password.php b/systems/eldiron/websites/tools/landing/ldap_password.php
new file mode 100644
index 0000000..efb4f57
--- /dev/null
+++ b/systems/eldiron/websites/tools/landing/ldap_password.php
@@ -0,0 +1,170 @@
1<?php
2
3/**
4 * LDAP PHP Change Password Webpage
5 * @author: Matt Rude <http://mattrude.com>
6 * @website: http://technology.mattrude.com/2010/11/ldap-php-change-password-webpage/
7 *
8 *
9 * GNU GENERAL PUBLIC LICENSE
10 * Version 2, June 1991
11 *
12 * Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
13 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
14 * Everyone is permitted to copy and distribute verbatim copies
15 * of this license document, but changing it is not allowed.
16 */
17
18$message = array();
19$message_css = "";
20
21function changePasswordLDAP($con, $user_dn, $newPassword){
22 global $message;
23 $salt = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',4)),0,4);
24 $encoded_newPassword = "{SSHA}" . base64_encode(pack("H*", sha1($newPassword.$salt)).$salt);
25
26 $entry = array();
27 $entry["userPassword"] = "$encoded_newPassword";
28
29 if (ldap_modify($con,$user_dn,$entry) === false){
30 $error = ldap_error($con);
31 $errno = ldap_errno($con);
32 $message[] = "$errno - $error";
33 return false;
34 } else {
35 return true;
36 }
37}
38
39function changePasswordSQL($user_realm, $newPassword) {
40 global $message;
41
42 foreach(["PGUSER", "PGPASSWORD", "PGDATABASE", "PGHOST"] as $k) {
43 if (isset($_SERVER[$k]) && !isset($_ENV[$k])) {
44 putenv("${k}=" . $_SERVER[$k]);
45 }
46 }
47 $con = pg_connect("");
48 $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));
49 if (!$result) {
50 $message[] = "Error when accessing database";
51 return false;
52 } else {
53 return true;
54 }
55}
56
57function changePassword($user,$oldPassword,$newPassword,$newPasswordCnf){
58 global $message;
59 global $message_css;
60
61 $server = "ldaps://ldap.immae.eu";
62
63 error_reporting(0);
64 $con = ldap_connect($server);
65 ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
66
67 $user_dn = "uid=$user,ou=users,dc=immae,dc=eu";
68
69 if (ldap_bind($con, $user_dn, $oldPassword) === false) {
70 $user_dn = "uid=$user,ou=group_users,dc=immae,dc=eu";
71 if (ldap_bind($con, $user_dn, $oldPassword) === false) {
72 $message[] = "Error E101 - Current Username or Password is wrong.";
73 return false;
74 }
75 }
76 if ($newPassword != $newPasswordCnf ) {
77 $message[] = "Error E102 - Your New passwords do not match!";
78 return false;
79 }
80 if (strlen($newPassword) < 6 ) {
81 $message[] = "Error E103 - Your new password is too short.<br/>Your password must be at least 6 characters long.";
82 return false;
83 }
84
85 $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)");
86 $auth_entry = ldap_first_entry($con, $user_search);
87
88 $mail_address = ldap_get_values($con, $auth_entry, "mail")[0];
89 $first_name = ldap_get_values($con, $auth_entry, "givenName")[0];
90 $existing_password = ldap_get_values($con, $auth_entry, "userPassword")[0];
91 if (substr($existing_password, 0, 6) == "{SASL}") {
92 $result = changePasswordSQL(substr($existing_password, 6), $newPassword);
93 } else {
94 $result = changePasswordLDAP($con, $user_dn, $newPassword);
95 }
96
97 if (!$result) {
98 $message[] = "E201 - Your password cannot be changed, please contact the administrator.";
99 } else {
100 $message_css = "yes";
101 mail($mail_address,"Password change notice","Dear $first_name,
102Your password on https://tools.immae.eu/ldap_password.php for account $user was just changed.
103If you did not make this change, please contact me.
104If you were the one who changed your password, you may disregard this message.
105
106Thanks
107--
108Immae / Ismaël", "From: " . getenv("CONTACT_EMAIL"));
109 $message[] = "The password for $user has been changed.<br/>An informational email has been sent to $mail_address.<br/>Your new password is now fully active.";
110 }
111}
112
113?>
114<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
115<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
116<head>
117<title>Password Change Page</title>
118<meta name="viewport" content="width=device-width, initial-scale=1" />
119<link rel="stylesheet" href="https://assets.immae.eu/skeleton/2.0.4/skeleton.min.css" integrity="sha256-2YQRJMXD7pIAPHiXr0s+vlRWA7GYJEK0ARns7k2sbHY=" crossorigin="anonymous" />
120<style type="text/css">
121 body { font-family: Verdana,Arial,Courier New; margin: auto; }
122
123 .msg_yes { margin: 0 auto; text-align: center; color: green; background: #D4EAD4; border: 1px solid green; border-radius: 10px; margin: 2px; }
124 .msg_no { margin: 0 auto; text-align: center; color: red; background: #FFF0F0; border: 1px solid red; border-radius: 10px; margin: 2px; }
125</style>
126<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
127</head>
128<body>
129<div class="container">
130<form action="<?php print $_SERVER['PHP_SELF']; ?>" name="passwordChange" method="post">
131<h3>Password Change Page</h3>
132<?php
133if (isset($_POST["submitted"])) {
134 echo '<div class="row">';
135 changePassword($_POST['username'],$_POST['oldPassword'],$_POST['newPassword1'],$_POST['newPassword2']);
136 global $message_css;
137 if ($message_css == "yes") {
138 echo '<div class="msg_yes">';
139 } else {
140 echo '<div class="msg_no">';
141 $message[] = "Your password was not changed.";
142 }
143 foreach ( $message as $one ) { echo "<p>$one</p>"; }
144 ?></div></div><?php
145} ?>
146 <div class="row">
147 <div class="one-third column"><label for="username">Username</label></div>
148 <div class="two-thirds column"><input id="username" name="username" type="text" autocomplete="off" /></div>
149 </div>
150 <div class="row">
151 <div class="one-third column"><label for="oldPassword">Current password</label></div>
152 <div class="two-thirds column"><input id="oldPassword" name="oldPassword" type="password" /></div>
153 </div>
154 <div class="row">
155 <div class="one-third column"><label for="newPassword1">New password</label></div>
156 <div class="two-thirds column"><input id="newPassword1" name="newPassword1" type="password" /></div>
157 </div>
158 <div class="row">
159 <div class="one-third column"><label for="newPassword2">New password (again)</label></div>
160 <div class="two-thirds column"><input id="newPassword2" name="newPassword2" type="password" /></div>
161 </div>
162 <div class="row">
163 <div class="column">
164 <input name="submitted" type="submit" value="Change Password"/>
165 </div>
166 </div>
167</form>
168</div>
169</body>
170</html>
diff --git a/systems/eldiron/websites/tools/landing/ldap_ssh_keys.php b/systems/eldiron/websites/tools/landing/ldap_ssh_keys.php
new file mode 100644
index 0000000..85ed973
--- /dev/null
+++ b/systems/eldiron/websites/tools/landing/ldap_ssh_keys.php
@@ -0,0 +1,343 @@
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
3 <head>
4 <title>ImmaeEu Account</title>
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6 <meta name="viewport" content="width=device-width, initial-scale=1" />
7 <link rel="stylesheet" href="https://assets.immae.eu/skeleton/2.0.4/skeleton.min.css" integrity="sha256-2YQRJMXD7pIAPHiXr0s+vlRWA7GYJEK0ARns7k2sbHY=" crossorigin="anonymous" />
8 <style type="text/css">
9 body {
10 font-family: Verdana,Arial,Courier New;
11 margin: auto;
12 }
13 table#ssh_keys_list textarea {
14 width: 100%;
15 height: 100%;
16 }
17 table#ssh_keys_list tbody tr.sshkeyrow {
18 height: 130px;
19 }
20 table#ssh_keys_list tbody tr.headrow th {
21 border-bottom: 0px !important;
22 padding-bottom: 0px !important;
23 }
24 table#ssh_keys_list tbody tr.mainrow td:not(.delete-button) {
25 border-bottom: 0px !important;
26 padding-bottom: 0px !important;
27 }
28 table#ssh_keys_list td.sshkey {
29 min-width: 600px;
30 height: 100%;
31 padding-top: 0px !important;
32 }
33
34 table#ssh_keys_list td.comment {
35 min-width: 160px;
36 }
37
38 </style>
39 </head>
40 <body>
41 <div class="container">
42 <h1>Gestion des clés SSH</h1>
43<?php
44
45$connection = NULL;
46
47session_start();
48
49// Liste des applications gérées
50const apps = [
51 'git',
52 'pub',
53 'ftp',
54 'ssh',
55 'forward',
56];
57
58function checkSshKey($sshKey)
59{
60 $exploded = explode(' ', $sshKey);
61 if (count($exploded) != 2) {
62 return false;
63 }
64 if (!in_array($exploded[0], array('ssh-rsa', 'ssh-ed25519'))) {
65 return false;
66 }
67 $decoded = base64_decode($exploded[1], true);
68 if ($decoded === FALSE) {
69 return false;
70 }
71 $decoded = preg_replace("/[^\w\-]/","", (string) $decoded);
72 if (substr($decoded, 0, strlen($exploded[0])) !== $exploded[0]) {
73 return false;
74 }
75
76 return true;
77}
78
79function isUserLogged()
80{
81 return (isset($_SESSION["login"]));
82}
83
84function checkLogin($user, $password)
85{
86 $server = "ldaps://ldap.immae.eu";
87 $con = ldap_connect($server);
88 ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
89
90 $user_dn = "uid=$user,ou=users,dc=immae,dc=eu";
91
92 if (ldap_bind($con, $user_dn, $password) === false) {
93 return false;
94 }
95 $_SESSION["user_dn"] = $user_dn;
96
97 $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)");
98 $auth_entry = ldap_first_entry($con, $user_search);
99
100 return true;
101}
102
103function connectPg() {
104 foreach(["PGUSER", "PGPASSWORD", "PGDATABASE", "PGHOST"] as $k) {
105 if (isset($_SERVER[$k]) && !isset($_ENV[$k])) {
106 putenv("${k}=" . $_SERVER[$k]);
107 }
108 }
109 $con = pg_connect("");
110 if (!$con) {
111 die("database access error");
112 }
113 return $con;
114}
115
116function getKeys()
117{
118 $keys = [];
119 if (!isset($_SESSION["login"]))
120 return $keys;
121 $pg = connectPg();
122 $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"]));
123 if (!$result) {
124 die("database access error");
125 }
126 $keys = [];
127 while ($row = pg_fetch_assoc($result)) {
128 $keys[] = array(
129 'id' => $row["id"],
130 'apps' => json_decode($row["usage"]),
131 'public_key' => $row["key"],
132 'comment' => $row["comment"],
133 );
134 }
135
136 pg_close($pg);
137 return $keys;
138}
139
140function saveKeys($keys)
141{
142 if (!isset($_SESSION["login"])) {
143 return false;
144 }
145 $pg = connectPg();
146 $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"])));
147 foreach ($keys as $key) {
148 if (isset($key["id"])) {
149 unset($existingIds[array_search($key["id"],$existingIds)]);
150 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"]));
151 } else {
152 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"]));
153 }
154 }
155 foreach ($existingIds as $removedKeyId) {
156 pg_query_params($pg, "DELETE FROM ldap_users_ssh_keys WHERE login = $1 AND realm = 'immae' AND id = $2", array($_SESSION["login"], $removedKeyId));
157 }
158}
159
160
161// Script
162if (isset($_POST['deconnexion'])) {
163 $_SESSION = [];
164}
165
166if (isset($_POST['sauvegarder'])) {
167 $editedKeys = [];
168 $errors = false;
169 $keysToSave = [];
170 foreach($_POST['keys'] as $id => $key) {
171 $editedKeys[$id] = $key;
172 if (!checkSshKey($key['public_key'])) {
173 $editedKeys[$id]['error'] = true;
174 $errors = true;
175 }
176
177 if (!isset($key['apps'])) {
178 $editedKeys[$id]['apps'] = $key['apps'] = [];
179
180 }
181 foreach ($key['apps'] as $app) {
182 if (!in_array($app, apps)) {
183 die("integrity");
184 }
185 }
186
187 if (!isset($editedKeys[$id]['error']) || $editedKeys[$id]['error'] !== true) {
188 $keysToSave[] = $key;
189 }
190 }
191
192 if (!$errors) {
193 $successSave = saveKeys($keysToSave);
194 }
195}
196
197$loginErrors = "";
198if (isset($_POST['login'])) {
199 if (empty($_POST['username']) || empty($_POST['password'])) {
200 $loginErrors = "Le nom d'utilisateur et le mot de passe sont requis.";
201 } elseif (!checkLogin($_POST['username'], $_POST['password'])) {
202 $loginErrors = "Identifiants incorrects.";
203 } else {
204 $_SESSION['login'] = $_POST['username'];
205 }
206}
207
208if (isUserLogged()) :
209 $keys = isset($editedKeys) ? $editedKeys : getKeys();
210?>
211 <p>Connecté en tant que <b><?= $_SESSION['login']; ?></b></p>
212
213 <form method="post">
214 <input type="submit" name="deconnexion" value="Déconnexion">
215 </form>
216
217 <?php if (isset($successSave) && $successSave === true) : ?>
218 <p style="color: green;">Clés enregistrées avec succès.</p>
219 <?php endif; ?>
220
221 <form method="post">
222 <table id="ssh_keys_list">
223 <tbody>
224 <?php
225 foreach ($keys as $id => $sshKey) :
226 ?>
227 <tr class="headrow">
228 <th>Description</th>
229 <?php foreach (apps as $app) : ?>
230 <th><?= $app ?></th>
231 <?php endforeach; ?>
232 <th></th>
233 </tr>
234 <tr class="mainrow">
235 <td class="comment"><textarea name="keys[<?= $id ?>][comment]"><?= $sshKey['comment'] ?></textarea></td>
236 <?php
237 foreach (apps as $app) :
238 $checked = in_array($app, $sshKey['apps']);
239 ?>
240 <td><input type="checkbox" name="keys[<?= $id ?>][apps][]" value="<?= $app ?>"<?= $checked ? ' checked' : '' ?>></td>
241 <?php endforeach; ?>
242 <td class="delete-button" rowspan="2"><input type="hidden" name="keys[<?= $id ?>][id]" value="<?= $sshKey["id"] ?>"><button class="delete">Suppr.</button></td>
243 </tr>
244 <tr class="sshkeyrow">
245 <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>
246 </tr>
247 <?php
248 endforeach;
249 ?>
250 </tbody>
251 </table>
252
253 <button id="add">Ajouter</button>
254
255 <hr>
256
257 <input type="submit" value="Sauvegarder" name="sauvegarder">
258 </form>
259 <script>
260 function deleteLine(element) {
261 element.addEventListener('click', function(e) {
262 e.preventDefault();
263 e.target.closest('tr').nextElementSibling.remove();
264 e.target.closest('tr').previousElementSibling.remove();
265 e.target.closest('tr').remove();
266 }, false);
267 }
268
269 var suppr = document.getElementsByClassName('delete');
270 var add = document.getElementById('add');
271 var list = document.querySelector('#ssh_keys_list > tbody');
272
273 for (var i = 0; i < suppr.length; i++) {
274 deleteLine(suppr[i]);
275 }
276
277 add.addEventListener('click', function (e) {
278 e.preventDefault();
279 i++;
280
281 var newLine = `
282 <tr class="headrow">
283 <th>Description</th>
284 <?php foreach (apps as $app) : ?>
285 <th><?= $app ?></th>
286 <?php endforeach; ?>
287 <th></th>
288 </tr>
289 <tr class="mainrow">
290 <td class="comment"><textarea name="keys[${i}][comment]"></textarea></td>
291 `;
292
293
294 <?php
295 foreach (apps as $app) :
296 ?>
297 newLine += `<td><input type="checkbox" name="keys[${i}][apps][]" value="<?= $app ?>"></td>`;
298 <?php endforeach; ?>
299
300 newLine += `<td class="delete-button" rowspan="2"><button class="delete" id="delete-${i}">Suppr.</button></td>
301 </tr>`;
302
303 newLine += `<tr class="sshkeyrow">
304 <td colspan="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name="keys[${i}][public_key]"></textarea></td>
305 </tr>`;
306
307
308 list.insertAdjacentHTML('beforeend', newLine);
309
310 deleteLine(document.getElementById("delete-" + i));
311
312 }, false)
313 </script>
314<?php
315else:
316?>
317 <form action="" method="post">
318 <h2>Login</h2>
319
320 <?php
321 if (!empty($loginErrors)):
322 ?>
323 <p style="color: red;"><?= $loginErrors; ?></p>
324 <?php
325 endif;
326 ?>
327
328 <label for="username">Utilisateur :</label>
329 <input type="text" id="username" name="username"/>
330
331 <label for="password">Mot de passe :</label>
332 <input type="password" id="password" name="password"/>
333
334 <input type="submit" value="OK" name="login" />
335 </form>
336<?php
337endif;
338?>
339 </div>
340 </body>
341</html>
342
343
diff --git a/modules/private/websites/tools/tools/landing/myip.php b/systems/eldiron/websites/tools/landing/myip.php
index 9ec1c6c..9ec1c6c 100644
--- a/modules/private/websites/tools/tools/landing/myip.php
+++ b/systems/eldiron/websites/tools/landing/myip.php
diff --git a/modules/private/websites/tools/tools/landing/node-packages.nix b/systems/eldiron/websites/tools/landing/node-packages.nix
index 9ebf254..9ebf254 100644
--- a/modules/private/websites/tools/tools/landing/node-packages.nix
+++ b/systems/eldiron/websites/tools/landing/node-packages.nix
diff --git a/modules/private/websites/tools/tools/landing/yarn-packages.nix b/systems/eldiron/websites/tools/landing/yarn-packages.nix
index 9621c3e..9621c3e 100644
--- a/modules/private/websites/tools/tools/landing/yarn-packages.nix
+++ b/systems/eldiron/websites/tools/landing/yarn-packages.nix
diff --git a/systems/eldiron/websites/tools/ldap.nix b/systems/eldiron/websites/tools/ldap.nix
new file mode 100644
index 0000000..9509169
--- /dev/null
+++ b/systems/eldiron/websites/tools/ldap.nix
@@ -0,0 +1,77 @@
1{ lib, php, env, writeText, phpldapadmin, config }:
2rec {
3 keys."webapps/tools-ldap" = {
4 user = apache.user;
5 group = apache.group;
6 permissions = "0400";
7 text = ''
8 <?php
9 $config->custom->appearance['show_clear_password'] = true;
10 $config->custom->appearance['hide_template_warning'] = true;
11 $config->custom->appearance['theme'] = "tango";
12 $config->custom->appearance['minimalMode'] = false;
13 $config->custom->appearance['tree'] = 'AJAXTree';
14
15 $servers = new Datastore();
16
17 $servers->newServer('ldap_pla');
18 $servers->setValue('server','name','Immae&#x2019;s LDAP');
19 $servers->setValue('server','host','ldaps://${env.ldap.host}');
20 $servers->setValue('login','auth_type','cookie');
21 $servers->setValue('login','bind_id','${env.ldap.dn}');
22 $servers->setValue('login','bind_pass','${env.ldap.password}');
23 $servers->setValue('appearance','pla_password_hash','ssha');
24 $servers->setValue('login','attr','uid');
25 $servers->setValue('login','fallback_dn',true);
26 '';
27 };
28 webRoot = phpldapadmin.override { config = config.secrets.fullPaths."webapps/tools-ldap"; };
29 apache = rec {
30 user = "wwwrun";
31 group = "wwwrun";
32 modules = [ "proxy_fcgi" ];
33 root = "${webRoot}/htdocs";
34 vhostConf = socket: ''
35 Alias /ldap "${root}"
36 <Directory "${root}">
37 DirectoryIndex index.php
38 <FilesMatch "\.php$">
39 SetHandler "proxy:unix:${socket}|fcgi://localhost"
40 </FilesMatch>
41
42 AllowOverride None
43 Require all granted
44 </Directory>
45 '';
46 };
47 phpFpm = rec {
48 serviceDeps = [ "openldap.service" ];
49 basedir = builtins.concatStringsSep ":" [ webRoot config.secrets.fullPaths."webapps/tools-ldap" ];
50 pool = {
51 "listen.owner" = apache.user;
52 "listen.group" = apache.group;
53 "pm" = "ondemand";
54 "pm.max_children" = "60";
55 "pm.process_idle_timeout" = "60";
56
57 # Needed to avoid clashes in browser cookies (same domain)
58 "php_value[session.name]" = "LdapPHPSESSID";
59 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
60 "php_admin_value[session.save_handler]" = "redis";
61 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:PhpLDAPAdmin:'";
62 };
63 };
64 monitoringPlugins = [ "http" ];
65 monitoringObjects.service = [
66 {
67 service_description = "ldap website is running on tools.immae.eu";
68 host_name = config.hostEnv.fqdn;
69 use = "external-web-service";
70 check_command = ["check_https" "tools.immae.eu" "/ldap/" "<title>phpLDAPadmin"];
71
72 servicegroups = "webstatus-webapps";
73 _webstatus_name = "LDAP";
74 _webstatus_url = "https://tools.immae.eu/ldap/";
75 }
76 ];
77}
diff --git a/systems/eldiron/websites/tools/phpbb.nix b/systems/eldiron/websites/tools/phpbb.nix
new file mode 100644
index 0000000..c1cbd6f
--- /dev/null
+++ b/systems/eldiron/websites/tools/phpbb.nix
@@ -0,0 +1,69 @@
1{ lib, phpbb, gnused }:
2rec {
3 varDir = "/var/lib/phpbb";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 if [ ! -d ${varDir} ]; then
8 install -m 0755 -o ${apache.user} -g ${apache.user} -d ${varDir}
9 cp -a ${phpbb}/vars/* ${varDir}
10 chown -R ${apache.user}:${apache.user} ${varDir}
11 fi
12 '';
13 };
14 chatonsHostingProperties = {
15 file.datetime = "2022-08-21T22:50:00";
16 hosting = {
17 name = "phpBB";
18 description = "Forum software";
19 website = "https://tools.immae.eu/forum";
20 logo = "https://www.phpbb.com/favicon.ico";
21 type = "INSTANCE";
22 status.level = "OK";
23 status.description = "OK";
24 registration.load = "OPEN";
25 install.type = "PACKAGE";
26 };
27 };
28 webRoot = phpbb;
29 apache = rec {
30 user = "wwwrun";
31 group = "wwwrun";
32 modules = [ "proxy_fcgi" ];
33 root = webRoot;
34 vhostConf = socket: ''
35 Alias /forum "${root}"
36 <Directory "${root}">
37 DirectoryIndex index.php
38 <FilesMatch "\.php$">
39 SetHandler "proxy:unix:${socket}|fcgi://localhost"
40 </FilesMatch>
41
42 AllowOverride All
43 Options FollowSymlinks
44 Require all granted
45 </Directory>
46 # add instal to the list after install
47 <LocationMatch "^/(cache|files|install|store)>
48 Require all denied
49 </LocationMatch>
50 '';
51 };
52 phpFpm = rec {
53 serviceDeps = [ "postgresql.service" ];
54 basedir = builtins.concatStringsSep ":" [ "/run/wrappers/bin/sendmail" phpbb varDir ];
55 pool = {
56 "listen.owner" = apache.user;
57 "listen.group" = apache.group;
58 "pm" = "ondemand";
59 "pm.max_children" = "60";
60 "pm.process_idle_timeout" = "60";
61
62 # Needed to avoid clashes in browser cookies (same domain)
63 "php_value[session.name]" = "PhpBBPHPSESSID";
64 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
65 "php_admin_value[session.save_handler]" = "redis";
66 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:PhpBB:'";
67 };
68 };
69}
diff --git a/systems/eldiron/websites/tools/rompr.nix b/systems/eldiron/websites/tools/rompr.nix
new file mode 100644
index 0000000..a7308ce
--- /dev/null
+++ b/systems/eldiron/websites/tools/rompr.nix
@@ -0,0 +1,86 @@
1{ lib, env, rompr, config }:
2rec {
3 varDir = "/var/lib/rompr";
4 activationScript = ''
5 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
6 ${varDir}/prefs ${varDir}/albumart
7 '';
8 webRoot = rompr;
9 apache = rec {
10 user = "wwwrun";
11 group = "wwwrun";
12 modules = [ "headers" "mime" "proxy_fcgi" ];
13 root = webRoot;
14 vhostConf = socket: ''
15 Alias /rompr ${root}
16
17 <Directory ${root}>
18 Options Indexes FollowSymLinks
19 DirectoryIndex index.php
20 AllowOverride all
21 Require all granted
22 Order allow,deny
23 Allow from all
24 ErrorDocument 404 /rompr/404.php
25 AddType image/x-icon .ico
26
27 <FilesMatch "\.php$">
28 SetHandler "proxy:unix:${socket}|fcgi://localhost"
29 </FilesMatch>
30 </Directory>
31
32 <Directory ${root}/albumart/small>
33 Header Set Cache-Control "max-age=0, no-store"
34 Header Set Cache-Control "no-cache, must-revalidate"
35 </Directory>
36
37 <Directory ${root}/albumart/asdownloaded>
38 Header Set Cache-Control "max-age=0, no-store"
39 Header Set Cache-Control "no-cache, must-revalidate"
40 </Directory>
41
42 <LocationMatch "^/rompr">
43 Use LDAPConnect
44 Require ldap-group cn=users,cn=mpd,ou=services,dc=immae,dc=eu
45 </LocationMatch>
46 '';
47 };
48 phpFpm = rec {
49 basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
50 pool = {
51 "listen.owner" = apache.user;
52 "listen.group" = apache.group;
53 "pm" = "ondemand";
54 "pm.max_children" = "60";
55 "pm.process_idle_timeout" = "60";
56
57 # Needed to avoid clashes in browser cookies (same domain)
58 "php_value[session.name]" = "RomprPHPSESSID";
59 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
60 "php_admin_value[session.save_handler]" = "redis";
61 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Rompr:'";
62 "php_flag[magic_quotes_gpc]" = "Off";
63 "php_flag[track_vars]" = "On";
64 "php_flag[register_globals]" = "Off";
65 "php_admin_flag[allow_url_fopen]" = "On";
66 "php_value[include_path]" = "${webRoot}";
67 "php_admin_value[upload_tmp_dir]" = "${varDir}/prefs";
68 "php_admin_value[post_max_size]" = "32M";
69 "php_admin_value[upload_max_filesize]" = "32M";
70 "php_admin_value[memory_limit]" = "256M";
71 };
72 };
73 monitoringPlugins = [ "http" ];
74 monitoringObjects.service = [
75 {
76 service_description = "rompr mpd website is running on tools.immae.eu";
77 host_name = config.hostEnv.fqdn;
78 use = "external-web-service";
79 check_command = ["check_https_auth" "tools.immae.eu" "/rompr/" "<title>RompЯ"];
80
81 servicegroups = "webstatus-webapps";
82 _webstatus_name = "MPD (ROMPR)";
83 _webstatus_url = "https://tools.immae.eu/rompr/";
84 }
85 ];
86}
diff --git a/systems/eldiron/websites/tools/shaarli.nix b/systems/eldiron/websites/tools/shaarli.nix
new file mode 100644
index 0000000..35f1edb
--- /dev/null
+++ b/systems/eldiron/websites/tools/shaarli.nix
@@ -0,0 +1,102 @@
1{ lib, env, stdenv, fetchurl, shaarli, config }:
2let
3 varDir = "/var/lib/shaarli";
4in rec {
5 activationScript = ''
6 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
7 ${varDir}/cache ${varDir}/pagecache ${varDir}/tmp ${varDir}/data
8 '';
9 webRoot = shaarli.override { inherit varDir; };
10 apache = rec {
11 user = "wwwrun";
12 group = "wwwrun";
13 modules = [ "proxy_fcgi" "rewrite" "env" ];
14 root = webRoot;
15 vhostConf = socket: ''
16 Alias /Shaarli "${root}"
17
18 Include ${config.secrets.fullPaths."webapps/tools-shaarli"}
19 <Location /Shaarli>
20 Header set Access-Control-Allow-Origin "*"
21 Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
22 Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization, Client-Security-Token, Accept-Encoding"
23 </Location>
24 <Directory "${root}">
25 DirectoryIndex index.php index.htm index.html
26 Options Indexes FollowSymLinks MultiViews Includes
27 AllowOverride All
28 Require all granted
29 <FilesMatch "\.php$">
30 SetHandler "proxy:unix:${socket}|fcgi://localhost"
31 </FilesMatch>
32 </Directory>
33 '';
34 };
35 chatonsProperties = {
36 file.datetime = "2022-08-21T22:50:00";
37 service = {
38 name = "Shaarli";
39 description = "The personal, minimalist, super-fast, database free, bookmarking service - community repo";
40 website = "https://tools.immae.eu/Shaarli/";
41 logo = "https://tools.immae.eu/Shaarli/tpl/default/img/apple-touch-icon.png";
42 status.level = "OK";
43 status.description = "OK";
44 registration."" = ["MEMBER" "CLIENT"];
45 registration.load = "OPEN";
46 install.type = "PACKAGE";
47 };
48 software = {
49 name = "Shaarli";
50 website = "https://shaarli.readthedocs.io/";
51 license.url = "https://github.com/shaarli/Shaarli/blob/master/COPYING";
52 license.name = "GNU General Public License Version 3";
53 version = webRoot.version;
54 source.url = "https://github.com/shaarli/Shaarli";
55 modules = "ldap-connection-patch";
56 };
57 };
58 keys."webapps/tools-shaarli" = {
59 user = apache.user;
60 group = apache.group;
61 permissions = "0400";
62 text = ''
63 SetEnv SHAARLI_LDAP_PASSWORD "${env.ldap.password}"
64 SetEnv SHAARLI_LDAP_DN "${env.ldap.dn}"
65 SetEnv SHAARLI_LDAP_HOST "ldaps://${env.ldap.host}"
66 SetEnv SHAARLI_LDAP_BASE "${env.ldap.base}"
67 SetEnv SHAARLI_LDAP_FILTER "${env.ldap.filter}"
68 '';
69 };
70 phpFpm = rec {
71 serviceDeps = [ "openldap.service" ];
72 basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
73 pool = {
74 "listen.owner" = apache.user;
75 "listen.group" = apache.group;
76 "pm" = "ondemand";
77 "pm.max_children" = "60";
78 "pm.process_idle_timeout" = "60";
79
80 # Needed to avoid clashes in browser cookies (same domain)
81 "php_value[session.name]" = "ShaarliPHPSESSID";
82 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
83 "php_admin_value[session.save_handler]" = "redis";
84 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Shaarli:'";
85 "php_admin_value[upload_max_filesize]" = "200M";
86 "php_admin_value[post_max_size]" = "200M";
87 };
88 };
89 monitoringPlugins = [ "http" ];
90 monitoringObjects.service = [
91 {
92 service_description = "shaarli website is running on tools.immae.eu";
93 host_name = config.hostEnv.fqdn;
94 use = "external-web-service";
95 check_command = ["check_https" "tools.immae.eu" "/Shaarli/immae" "<title>Immae"];
96
97 servicegroups = "webstatus-webapps";
98 _webstatus_name = "Shaarli";
99 _webstatus_url = "https://tools.immae.eu/Shaarli/";
100 }
101 ];
102}
diff --git a/systems/eldiron/websites/tools/ttrss.nix b/systems/eldiron/websites/tools/ttrss.nix
new file mode 100644
index 0000000..6393256
--- /dev/null
+++ b/systems/eldiron/websites/tools/ttrss.nix
@@ -0,0 +1,167 @@
1{ php, env, ttrss, ttrss-plugins, config }:
2rec {
3 varDir = "/var/lib/ttrss";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
8 ${varDir}/lock ${varDir}/cache ${varDir}/feed-icons
9 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/cache/export/ \
10 ${varDir}/cache/feeds/ \
11 ${varDir}/cache/images/ \
12 ${varDir}/cache/js/ \
13 ${varDir}/cache/simplepie/ \
14 ${varDir}/cache/upload/
15 touch ${varDir}/feed-icons/index.html
16 '';
17 };
18 chatonsProperties = {
19 file.datetime = "2022-08-21T22:50:00";
20 service = {
21 name = "RSS";
22 description = "Tiny Tiny RSS is a free and open source web-based news feed (RSS/Atom) reader and aggregator";
23 website = "https://tools.immae.eu/ttrss/";
24 logo = "https://tools.immae.eu/ttrss/images/favicon.png";
25 status.level = "OK";
26 status.description = "OK";
27 registration."" = ["MEMBER" "CLIENT"];
28 registration.load = "OPEN";
29 install.type = "PACKAGE";
30 };
31 software = {
32 name = "Tiny Tiny RSS";
33 website = "https://tt-rss.org/";
34 license.url = "https://www.gnu.org/copyleft/gpl.html";
35 license.name = "GNU General Public License Version 3";
36 version = webRoot.version;
37 source.url = "https://git.tt-rss.org/fox/tt-rss.git/";
38 modules = map (p: p.pluginName) webRoot.plugins;
39 };
40 };
41 keys."webapps/tools-ttrss" = {
42 user = apache.user;
43 group = apache.group;
44 permissions = "0400";
45 keyDependencies = [ php ];
46 text = ''
47 <?php
48
49 define('PHP_EXECUTABLE', '${php}/bin/php');
50
51 define('LOCK_DIRECTORY', 'lock');
52 define('CACHE_DIR', 'cache');
53 define('ICONS_DIR', 'feed-icons');
54 define('ICONS_URL', 'feed-icons');
55 define('SELF_URL_PATH', 'https://tools.immae.eu/ttrss/');
56
57 define('MYSQL_CHARSET', 'UTF8');
58
59 define('DB_TYPE', 'pgsql');
60 define('DB_HOST', '${env.postgresql.socket}');
61 define('DB_USER', '${env.postgresql.user}');
62 define('DB_NAME', '${env.postgresql.database}');
63 define('DB_PASS', '${env.postgresql.password}');
64 define('DB_PORT', '${env.postgresql.port}');
65
66 define('AUTH_AUTO_CREATE', true);
67 define('AUTH_AUTO_LOGIN', true);
68
69 define('SINGLE_USER_MODE', false);
70
71 define('SIMPLE_UPDATE_MODE', false);
72 define('CHECK_FOR_UPDATES', true);
73
74 define('FORCE_ARTICLE_PURGE', 0);
75 define('SESSION_COOKIE_LIFETIME', 60*60*24*120);
76 define('ENABLE_GZIP_OUTPUT', false);
77
78 define('PLUGINS', 'auth_ldap, note, instances');
79
80 define('LOG_DESTINATION', ''');
81 define('CONFIG_VERSION', 26);
82
83 define('DAEMON_UPDATE_LOGIN_LIMIT', 0);
84
85 define('SPHINX_SERVER', 'localhost:9312');
86 define('SPHINX_INDEX', 'ttrss, delta');
87
88 define('ENABLE_REGISTRATION', false);
89 define('REG_NOTIFY_ADDRESS', 'ttrss@tools.immae.eu');
90 define('REG_MAX_USERS', 10);
91
92 define('SMTP_FROM_NAME', 'Tiny Tiny RSS');
93 define('SMTP_FROM_ADDRESS', 'ttrss@tools.immae.eu');
94 define('DIGEST_SUBJECT', '[tt-rss] New headlines for last 24 hours');
95
96 define('LDAP_AUTH_SERVER_URI', 'ldap://${env.ldap.host}:389/');
97 define('LDAP_AUTH_USETLS', TRUE);
98 define('LDAP_AUTH_ALLOW_UNTRUSTED_CERT', TRUE);
99 define('LDAP_AUTH_BASEDN', '${env.ldap.base}');
100 define('LDAP_AUTH_ANONYMOUSBEFOREBIND', FALSE);
101 define('LDAP_AUTH_SEARCHFILTER', '${env.ldap.filter}');
102
103 define('LDAP_AUTH_BINDDN', '${env.ldap.dn}');
104 define('LDAP_AUTH_BINDPW', '${env.ldap.password}');
105 define('LDAP_AUTH_LOGIN_ATTRIB', 'immaeTtrssLogin');
106
107 define('LDAP_AUTH_LOG_ATTEMPTS', FALSE);
108 define('LDAP_AUTH_DEBUG', FALSE);
109 '';
110 };
111 webRoot = (ttrss.override { ttrss_config = config.secrets.fullPaths."webapps/tools-ttrss"; }).withPlugins (p: [
112 p.auth_ldap p.ff_instagram p.tumblr_gdpr_ua
113 (p.af_feedmod.override { patched = true; })
114 (p.feediron.override { patched = true; })
115 ]);
116 apache = rec {
117 user = "wwwrun";
118 group = "wwwrun";
119 modules = [ "proxy_fcgi" ];
120 root = webRoot;
121 vhostConf = socket: ''
122 Alias /ttrss "${root}"
123 <Directory "${root}">
124 DirectoryIndex index.php
125 <FilesMatch "\.php$">
126 SetHandler "proxy:unix:${socket}|fcgi://localhost"
127 </FilesMatch>
128
129 AllowOverride All
130 Options FollowSymlinks
131 Require all granted
132 </Directory>
133 '';
134 };
135 phpFpm = rec {
136 serviceDeps = [ "postgresql.service" "openldap.service" ];
137 basedir = builtins.concatStringsSep ":" (
138 [ webRoot config.secrets.fullPaths."webapps/tools-ttrss" varDir ]
139 ++ webRoot.plugins);
140 pool = {
141 "listen.owner" = apache.user;
142 "listen.group" = apache.group;
143 "pm" = "ondemand";
144 "pm.max_children" = "60";
145 "pm.process_idle_timeout" = "60";
146
147 # Needed to avoid clashes in browser cookies (same domain)
148 "php_value[session.name]" = "TtrssPHPSESSID";
149 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
150 "php_admin_value[session.save_handler]" = "redis";
151 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:TTRSS:'";
152 };
153 };
154 monitoringPlugins = [ "http" ];
155 monitoringObjects.service = [
156 {
157 service_description = "ttrss website is running on tools.immae.eu";
158 host_name = config.hostEnv.fqdn;
159 use = "external-web-service";
160 check_command = ["check_https" "tools.immae.eu" "/ttrss/" "<title>Tiny Tiny RSS"];
161
162 servicegroups = "webstatus-webapps";
163 _webstatus_name = "TT-RSS";
164 _webstatus_url = "https://tools.immae.eu/ttrss/";
165 }
166 ];
167}
diff --git a/systems/eldiron/websites/tools/wallabag.nix b/systems/eldiron/websites/tools/wallabag.nix
new file mode 100644
index 0000000..0a5750d
--- /dev/null
+++ b/systems/eldiron/websites/tools/wallabag.nix
@@ -0,0 +1,180 @@
1{ env, wallabag, mylibs, config }:
2rec {
3 varDir = "/var/lib/wallabag";
4 keys."webapps/tools-wallabag" = {
5 user = apache.user;
6 group = apache.group;
7 permissions = "0400";
8 text = ''
9 # This file is auto-generated during the composer install
10 parameters:
11 database_driver: pdo_pgsql
12 database_driver_class: Wallabag\CoreBundle\Doctrine\DBAL\Driver\CustomPostgreSQLDriver
13 database_host: ${env.postgresql.socket}
14 database_port: ${env.postgresql.port}
15 database_name: ${env.postgresql.database}
16 database_user: ${env.postgresql.user}
17 database_password: ${env.postgresql.password}
18 database_path: null
19 database_table_prefix: wallabag_
20 database_socket: null
21 database_charset: utf8
22 domain_name: https://tools.immae.eu/wallabag
23 mailer_transport: sendmail
24 mailer_host: 127.0.0.1
25 mailer_user: null
26 mailer_password: null
27 locale: fr
28 secret: ${env.secret}
29 twofactor_auth: true
30 twofactor_sender: wallabag@tools.immae.eu
31 fosuser_registration: false
32 fosuser_confirmation: true
33 from_email: wallabag@tools.immae.eu
34 rss_limit: 50
35 rabbitmq_host: localhost
36 rabbitmq_port: 5672
37 rabbitmq_user: guest
38 rabbitmq_password: guest
39 rabbitmq_prefetch_count: 10
40 redis_scheme: unix
41 redis_host: null
42 redis_port: null
43 redis_path: ${env.redis.socket}
44 redis_password: null
45 sites_credentials: { }
46 ldap_enabled: true
47 ldap_host: ${env.ldap.host}
48 ldap_port: 636
49 ldap_tls: false
50 ldap_ssl: true
51 ldap_bind_requires_dn: true
52 ldap_base: '${env.ldap.base}'
53 ldap_manager_dn: '${env.ldap.dn}'
54 ldap_manager_pw: ${env.ldap.password}
55 ldap_filter: '${env.ldap.filter}'
56 ldap_admin_filter: '${env.ldap.admin_filter}'
57 ldap_username_attribute: uid
58 ldap_email_attribute: mail
59 ldap_name_attribute: cn
60 ldap_enabled_attribute: null
61 services:
62 swiftmailer.mailer.default.transport:
63 class: Swift_SendmailTransport
64 arguments: ['/run/wrappers/bin/sendmail -bs']
65 '';
66 };
67 chatonsProperties = {
68 file.datetime = "2022-08-21T22:50:00";
69 service = {
70 name = "Wallabag";
71 description = "wallabag is a self hostable application for saving web pages: Save and classify articles. Read them later. Freely.";
72 website = "https://tools.immae.eu/wallabag/";
73 logo = "https://tools.immae.eu/wallabag/wallassets/themes/_global/img/appicon/apple-touch-icon-120.png";
74 status.level = "OK";
75 status.description = "OK";
76 registration."" = ["MEMBER" "CLIENT"];
77 registration.load = "OPEN";
78 install.type = "PACKAGE";
79 };
80 software = {
81 name = "Wallabag";
82 website = "https://wallabag.org/en";
83 license.url = "https://github.com/wallabag/wallabag/blob/master/COPYING.md";
84 license.name = "MIT License";
85 version = webappDir.version;
86 source.url = "https://github.com/wallabag/wallabag";
87 modules = "ldap-patch";
88 };
89 };
90 webappDir = wallabag.override { ldap = true; wallabag_config = config.secrets.fullPaths."webapps/tools-wallabag"; };
91 activationScript = ''
92 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
93 ${varDir}/var ${varDir}/data/db ${varDir}/assets/images
94 '';
95 webRoot = "${webappDir}/web";
96 # Domain migration: Table wallabag_entry contains whole
97 # https://tools.immae.eu/wallabag domain name in preview_picture
98 apache = rec {
99 user = "wwwrun";
100 group = "wwwrun";
101 modules = [ "proxy_fcgi" ];
102 root = webRoot;
103 vhostConf = socket: ''
104 Alias /wallabag "${root}"
105 <Directory "${root}">
106 AllowOverride None
107 Require all granted
108 # For OAuth (apps)
109 CGIPassAuth On
110
111 <FilesMatch "\.php$">
112 SetHandler "proxy:unix:${socket}|fcgi://localhost"
113 </FilesMatch>
114
115 <IfModule mod_rewrite.c>
116 Options -MultiViews
117 RewriteEngine On
118 RewriteCond %{REQUEST_FILENAME} !-f
119 RewriteRule ^(.*)$ app.php [QSA,L]
120 </IfModule>
121 </Directory>
122 <Directory "${root}/bundles">
123 <IfModule mod_rewrite.c>
124 RewriteEngine Off
125 </IfModule>
126 </Directory>
127 <Directory "${varDir}/assets">
128 AllowOverride None
129 Require all granted
130 </Directory>
131 '';
132 };
133 phpFpm = rec {
134 preStart = ''
135 if [ ! -f "${varDir}/currentWebappDir" -o \
136 ! -f "${varDir}/currentKey" -o \
137 "${webappDir}" != "$(cat ${varDir}/currentWebappDir 2>/dev/null)" ] \
138 || ! sha512sum -c --status ${varDir}/currentKey; then
139 pushd ${webappDir} > /dev/null
140 /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod cache:clear
141 rm -rf /var/lib/wallabag/var/cache/pro_
142 /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod doctrine:migrations:migrate --no-interaction
143 popd > /dev/null
144 echo -n "${webappDir}" > ${varDir}/currentWebappDir
145 sha512sum ${config.secrets.fullPaths."webapps/tools-wallabag"} > ${varDir}/currentKey
146 fi
147 '';
148 serviceDeps = [ "postgresql.service" "openldap.service" ];
149 basedir = builtins.concatStringsSep ":" [ webappDir config.secrets.fullPaths."webapps/tools-wallabag" varDir ];
150 pool = {
151 "listen.owner" = apache.user;
152 "listen.group" = apache.group;
153 "pm" = "dynamic";
154 "pm.max_children" = "60";
155 "pm.start_servers" = "2";
156 "pm.min_spare_servers" = "1";
157 "pm.max_spare_servers" = "10";
158
159 # Needed to avoid clashes in browser cookies (same domain)
160 "php_value[session.name]" = "WallabagPHPSESSID";
161 "php_admin_value[session.save_handler]" = "redis";
162 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Wallabag:'";
163 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/tmp";
164 "php_value[max_execution_time]" = "300";
165 };
166 };
167 monitoringPlugins = [ "http" ];
168 monitoringObjects.service = [
169 {
170 service_description = "wallabag website is running on tools.immae.eu";
171 host_name = config.hostEnv.fqdn;
172 use = "external-web-service";
173 check_command = ["check_https" "tools.immae.eu" "/wallabag/" "<title>Bienvenue sur wallabag"];
174
175 servicegroups = "webstatus-webapps";
176 _webstatus_name = "Wallabag";
177 _webstatus_url = "https://tools.immae.eu/wallabag/";
178 }
179 ];
180}
diff --git a/systems/eldiron/websites/tools/webhooks.nix b/systems/eldiron/websites/tools/webhooks.nix
new file mode 100644
index 0000000..337c8f8
--- /dev/null
+++ b/systems/eldiron/websites/tools/webhooks.nix
@@ -0,0 +1,25 @@
1{ lib, env, binEnv }:
2{
3 keys = lib.attrsets.mapAttrs' (k: v:
4 lib.nameValuePair "webapps/webhooks/${k}.php" {
5 user = "wwwrun";
6 group = "wwwrun";
7 permissions = "0400";
8 text = builtins.replaceStrings ["{{webhooks-bin-env}}"] [ "${binEnv}" ] v;
9 keyDependencies = [ binEnv ];
10 }) env // lib.attrsets.mapAttrs' (k: v:
11 lib.nameValuePair "webapps/webhooks/${k}/index.php" {
12 user = "wwwrun";
13 group = "wwwrun";
14 permissions = "0400";
15 text = builtins.replaceStrings ["{{webhooks-bin-env}}"] [ "${binEnv}" ] v;
16 keyDependencies = [ binEnv ];
17 }) env // {
18 "webapps/webhooks" = {
19 isDir = true;
20 user = "wwwrun";
21 group = "wwwrun";
22 permissions = "0500";
23 };
24 };
25}
diff --git a/systems/eldiron/websites/tools/ympd.nix b/systems/eldiron/websites/tools/ympd.nix
new file mode 100644
index 0000000..0d8d41d
--- /dev/null
+++ b/systems/eldiron/websites/tools/ympd.nix
@@ -0,0 +1,54 @@
1{ env, config }:
2let
3 ympd = rec {
4 config = {
5 webPort = "localhost:${toString env.listenPort}";
6 host = env.mpd.host;
7 port = env.mpd.port;
8 };
9 apache = {
10 modules = [
11 "proxy_wstunnel"
12 ];
13 vhostConf = ''
14 <LocationMatch "^/mpd(?!/music.(mp3|ogg))">
15 Use LDAPConnect
16 Require ldap-group cn=users,cn=mpd,ou=services,dc=immae,dc=eu
17 </LocationMatch>
18
19 RedirectMatch permanent "^/mpd$" "/mpd/"
20 <Location "/mpd/">
21 ProxyPass http://${config.webPort}/
22 ProxyPassReverse http://${config.webPort}/
23 ProxyPreserveHost on
24 </Location>
25 <Location "/mpd/ws">
26 ProxyPass ws://${config.webPort}/ws
27 </Location>
28 <Location "/mpd/music.mp3">
29 ProxyPass unix:///run/mpd/mp3.sock|http://tools.immae.eu/mpd/mp3
30 ProxyPassReverse unix:///run/mpd/mp3.sock|http://tools.immae.eu/mpd/mp3
31 </Location>
32 <Location "/mpd/music.ogg">
33 ProxyPass unix:///run/mpd/ogg.sock|http://tools.immae.eu/mpd/ogg
34 ProxyPassReverse unix:///run/mpd/ogg.sock|http://tools.immae.eu/mpd/ogg
35 </Location>
36 '';
37 };
38 };
39in
40 ympd // {
41 monitoringPlugins = [ "http" ];
42 monitoringObjects.service = [
43 {
44 service_description = "mpd website is running on tools.immae.eu";
45 host_name = config.hostEnv.fqdn;
46 use = "external-web-service";
47 check_command = ["check_https_auth" "tools.immae.eu" "/mpd/" "<title>ympd"];
48
49 servicegroups = "webstatus-webapps";
50 _webstatus_name = "MPD (YMPD)";
51 _webstatus_url = "https://tools.immae.eu/mpd/";
52 }
53 ];
54 }
diff --git a/systems/eldiron/websites/tools/yourls.nix b/systems/eldiron/websites/tools/yourls.nix
new file mode 100644
index 0000000..9e54b0d
--- /dev/null
+++ b/systems/eldiron/websites/tools/yourls.nix
@@ -0,0 +1,118 @@
1{ env, yourls, yourls-plugins, config }:
2rec {
3 keys."webapps/tools-yourls" = {
4 user = apache.user;
5 group = apache.group;
6 permissions = "0400";
7 text = ''
8 <?php
9 define( 'YOURLS_DB_USER', '${env.mysql.user}' );
10 define( 'YOURLS_DB_PASS', '${env.mysql.password}' );
11 define( 'YOURLS_DB_NAME', '${env.mysql.database}' );
12 define( 'YOURLS_DB_HOST', '${env.mysql.host}' );
13 define( 'YOURLS_DB_PREFIX', 'yourls_' );
14 define( 'YOURLS_SITE', 'https://tools.immae.eu/url' );
15 define( 'YOURLS_HOURS_OFFSET', 0 );
16 define( 'YOURLS_LANG', ''' );
17 define( 'YOURLS_UNIQUE_URLS', true );
18 define( 'YOURLS_PRIVATE', true );
19 define( 'YOURLS_COOKIEKEY', '${env.cookieKey}' );
20 $yourls_user_passwords = array();
21 define( 'YOURLS_DEBUG', false );
22 define( 'YOURLS_URL_CONVERT', 36 );
23 $yourls_reserved_URL = array();
24 define( 'LDAPAUTH_HOST', 'ldaps://${env.ldap.host}' );
25 define( 'LDAPAUTH_PORT', '636' );
26 define( 'LDAPAUTH_BASE', '${env.ldap.base}' );
27 define( 'LDAPAUTH_SEARCH_USER', '${env.ldap.dn}' );
28 define( 'LDAPAUTH_SEARCH_PASS', '${env.ldap.password}' );
29
30 define( 'LDAPAUTH_GROUP_ATTR', 'memberof' );
31 define( 'LDAPAUTH_GROUP_REQ', 'cn=admin,cn=yourls,ou=services,dc=immae,dc=eu');
32
33 define( 'LDAPAUTH_USERCACHE_TYPE', 0);
34 '';
35 };
36 chatonsProperties = {
37 file.datetime = "2022-08-27T18:00:00";
38 service = {
39 name = "Yourls";
40 description = "Your own URL shortener";
41 website = "https://tools.immae.eu/url/admin/";
42 logo = "https://tools.immae.eu/url/images/favicon.gif";
43 status.level = "OK";
44 status.description = "OK";
45 registration."" = ["MEMBER" "CLIENT"];
46 registration.load = "FULL";
47 install.type = "PACKAGE";
48 };
49 software = {
50 name = "YOURLS";
51 website = "http://yourls.org/";
52 license.url = "https://github.com/YOURLS/YOURLS/blob/master/LICENSE";
53 license.name = "MIT License";
54 version = webRoot.version;
55 source.url = "https://github.com/YOURLS/YOURLS";
56 modules = map (a: a.pluginName) webRoot.plugins;
57 };
58 };
59 webRoot = (yourls.override { yourls_config = config.secrets.fullPaths."webapps/tools-yourls"; }).withPlugins (p: [p.ldap]);
60 apache = rec {
61 user = "wwwrun";
62 group = "wwwrun";
63 modules = [ "proxy_fcgi" ];
64 root = webRoot;
65 vhostConf = socket: ''
66 Alias /url "${root}"
67 <Directory "${root}">
68 <FilesMatch "\.php$">
69 SetHandler "proxy:unix:${socket}|fcgi://localhost"
70 </FilesMatch>
71
72 AllowOverride None
73 Require all granted
74 <IfModule mod_rewrite.c>
75 RewriteEngine On
76 RewriteBase /url/
77 RewriteCond %{REQUEST_FILENAME} !-f
78 RewriteCond %{REQUEST_FILENAME} !-d
79 RewriteRule ^.*$ /url/yourls-loader.php [L]
80 </IfModule>
81 DirectoryIndex index.php
82 </Directory>
83 '';
84 };
85 phpFpm = rec {
86 serviceDeps = [ "mysql.service" "openldap.service" ];
87 basedir = builtins.concatStringsSep ":" (
88 [ webRoot config.secrets.fullPaths."webapps/tools-yourls" ]
89 ++ webRoot.plugins);
90 pool = {
91 "listen.owner" = apache.user;
92 "listen.group" = apache.group;
93 "pm" = "ondemand";
94 "pm.max_children" = "60";
95 "pm.process_idle_timeout" = "60";
96
97 # Needed to avoid clashes in browser cookies (same domain)
98 "php_value[session.name]" = "YourlsPHPSESSID";
99 "php_admin_value[session.save_handler]" = "redis";
100 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Yourls:'";
101 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
102 };
103 };
104 monitoringPlugins = [ "http" ];
105 monitoringObjects.service = [
106 {
107 service_description = "yourl website is running on tools.immae.eu";
108 host_name = config.hostEnv.fqdn;
109 use = "external-web-service";
110 check_command = ["check_https" "tools.immae.eu" "/url/admin/" "<title>YOURLS"];
111
112 servicegroups = "webstatus-webapps";
113 _webstatus_name = "YOURLS";
114 _webstatus_url = "https://tools.immae.eu/url/admin/";
115 }
116
117 ];
118}
diff --git a/systems/eldiron/websites/visio/default.nix b/systems/eldiron/websites/visio/default.nix
new file mode 100644
index 0000000..76d1960
--- /dev/null
+++ b/systems/eldiron/websites/visio/default.nix
@@ -0,0 +1,63 @@
1{ lib, pkgs, config, ... }:
2let
3 port = config.myEnv.ports.galene_port;
4 cfg = config.myServices.websites.tools.visio;
5in {
6 options.myServices.websites.tools.visio = {
7 enable = lib.mkEnableOption "enable visio website";
8 };
9
10 config = lib.mkIf cfg.enable {
11 myServices.dns.zones."immae.eu".subdomains.visio =
12 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
13
14 myServices.chatonsProperties.services.galene = {
15 file.datetime = "2022-08-21T22:45:00";
16 service = {
17 name = "Galene";
18 description = "The Galène videoconference server";
19 website = "https://visio.immae.eu/";
20 status.level = "OK";
21 status.description = "OK";
22 registration."" = ["NONE"];
23 registration.load = "OPEN";
24 install.type = "PACKAGE";
25 };
26 software = {
27 name = "Galene";
28 website = "https://galene.org/";
29 license.url = "https://github.com/jech/galene/blob/master/LICENCE";
30 license.name = "MIT License";
31 version = pkgs.galene.version;
32 source.url = "https://github.com/jech/galene";
33 };
34 };
35 services.galene = {
36 enable = true;
37 httpPort = port;
38 insecure = true;
39 # hack to bypass module's limitations
40 dataDir = "/var/lib/galene/data -http localhost:${builtins.toString port}";
41 };
42 systemd.services.galene.serviceConfig.RestrictAddressFamilies = lib.mkForce [ "AF_INET" "AF_INET6" "AF_NETLINK" ];
43 security.acme.certs.eldiron.extraDomainNames = [ "visio.immae.eu" ];
44 services.websites.env.tools.vhostConfs.visio = {
45 certName = "eldiron";
46 hosts = ["visio.immae.eu" ];
47 root = null;
48 extraConfig = [
49 ''
50 ProxyPass /ws ws://localhost:${builtins.toString port}/ws
51 ProxyPassReverse /ws ws://localhost:${builtins.toString port}/ws
52
53 ProxyPass / http://localhost:${builtins.toString port}/
54 ProxyPassReverse / http://localhost:${builtins.toString port}/
55
56 ProxyPreserveHost On
57 ''
58 ];
59 };
60
61 };
62}
63
diff --git a/systems/eldiron/websites/vpn/default.nix b/systems/eldiron/websites/vpn/default.nix
new file mode 100644
index 0000000..ea54691
--- /dev/null
+++ b/systems/eldiron/websites/vpn/default.nix
@@ -0,0 +1,13 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.vpn;
4in {
5 config = lib.mkIf cfg.enable {
6 security.acme.certs.eldiron.extraDomainNames = [ "vpn.immae.eu" ];
7 services.websites.env.tools.vhostConfs.vpn = {
8 certName = "eldiron";
9 hosts = [ "vpn.immae.eu" ];
10 root = ./www;
11 };
12 };
13}
diff --git a/modules/private/websites/tools/vpn/www/index.html b/systems/eldiron/websites/vpn/www/index.html
index fc2618a..fc2618a 100644
--- a/modules/private/websites/tools/vpn/www/index.html
+++ b/systems/eldiron/websites/vpn/www/index.html
diff --git a/modules/private/websites/tools/vpn/www/style.css b/systems/eldiron/websites/vpn/www/style.css
index b177fec..b177fec 100644
--- a/modules/private/websites/tools/vpn/www/style.css
+++ b/systems/eldiron/websites/vpn/www/style.css
diff --git a/systems/eldiron/webstats/default.nix b/systems/eldiron/webstats/default.nix
new file mode 100644
index 0000000..0057f64
--- /dev/null
+++ b/systems/eldiron/webstats/default.nix
@@ -0,0 +1,80 @@
1{ lib, pkgs, config, ... }:
2let
3 name = "goaccess";
4 cfg = config.services.webstats;
5in {
6 options.services.webstats = {
7 dataDir = lib.mkOption {
8 type = lib.types.path;
9 default = "/var/lib/${name}";
10 description = ''
11 The directory where Goaccess stores its data.
12 '';
13 };
14 sites = lib.mkOption {
15 type = lib.types.listOf (lib.types.submodule {
16 options = {
17 conf = lib.mkOption {
18 type = lib.types.nullOr lib.types.path;
19 default = null;
20 description = ''
21 use custom goaccess configuration file instead of the
22 default one.
23 '';
24 };
25 name = lib.mkOption {
26 type = lib.types.str;
27 description = ''
28 Domain name. Corresponds to the Apache file name and the
29 folder name in which the state will be saved.
30 '';
31 };
32 };
33 });
34 default = [];
35 description = "Sites to generate stats";
36 };
37 };
38
39 config = lib.mkIf (builtins.length cfg.sites > 0) {
40 environment.systemPackages = [
41 pkgs.goaccess
42 ];
43
44 services.cron = {
45 enable = true;
46 systemCronJobs = let
47 stats = domain: conf: let
48 config = if builtins.isNull conf
49 then pkgs.runCommand "goaccess.conf" {
50 dbPath = "${cfg.dataDir}/${domain}";
51 } "substituteAll ${./goaccess.conf} $out"
52 else conf;
53 d = pkgs.writeScriptBin "stats-${domain}" ''
54 #!${pkgs.stdenv.shell}
55 set -e
56 shopt -s nullglob
57 TMPFILE=$(mktemp)
58 trap "rm -f $TMPFILE" EXIT
59
60 mkdir -p ${cfg.dataDir}/${domain}
61 for i in /var/log/httpd/access-${domain}*.gz /var/log/httpd/*/access-${domain}*.gz; do
62 zcat "$i" >> $TMPFILE
63 done
64 cat /var/log/httpd/*access-${domain}.log /var/log/httpd/*/access-${domain}.log > $TMPFILE
65 ${pkgs.goaccess}/bin/goaccess $TMPFILE --no-progress -o ${cfg.dataDir}/${domain}/index.html -p ${config}
66 '';
67 in "${d}/bin/stats-${domain}";
68 allStats = sites: pkgs.writeScript "stats" ''
69 #!${pkgs.stdenv.shell}
70
71 mkdir -p ${cfg.dataDir}
72 ${builtins.concatStringsSep "\n" (map (v: stats v.name v.conf) sites)}
73 '';
74 in
75 [
76 "5 0 * * * root ${allStats cfg.sites}"
77 ];
78 };
79 };
80}
diff --git a/modules/webapps/webstats/goaccess.conf b/systems/eldiron/webstats/goaccess.conf
index c6c244a..c6c244a 100644
--- a/modules/webapps/webstats/goaccess.conf
+++ b/systems/eldiron/webstats/goaccess.conf
diff --git a/systems/monitoring-1/base.nix b/systems/monitoring-1/base.nix
new file mode 100644
index 0000000..8bfacc1
--- /dev/null
+++ b/systems/monitoring-1/base.nix
@@ -0,0 +1,75 @@
1{ config, pkgs, lib, nixpkgs, php, secrets, ... }:
2{
3 # ssh-keyscan monitoring-1 | nix-shell -p ssh-to-age --run ssh-to-age
4 secrets.ageKeys = [ "age1dn4lzhgxusqrpjjnzm7w8ml39ptf326htuzmpqdqs2gg3wq7cqzqxuvx8k" ];
5 boot.kernelPackages = pkgs.linuxPackages_latest;
6
7 imports = [
8 secrets.nixosModules.users-config-monitoring-1
9 (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix")
10 ./monitoring-master.nix
11 ./monitoring.nix
12 ./status.nix
13 ./status_engine.nix
14 ];
15
16 nixpkgs.overlays = builtins.attrValues php.overlays;
17 nixpkgs.config.permittedInsecurePackages = [
18 "python-2.7.18.6" # for nagios-cli
19 ];
20
21 myServices.monitoring.enable = true;
22 myServices.monitoring.master = true;
23 myServices.status.enable = true;
24 networking = {
25 firewall.enable = true;
26 interfaces."ens3".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
27 (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or []))
28 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips));
29 interfaces."ens3".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
30 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
31 config.hostEnv.ips);
32 defaultGateway6 = { address = "fe80::1"; interface = "ens3"; };
33 };
34 boot.loader.grub.device = "nodev";
35 fileSystems."/" = { device = "/dev/sda1"; fsType = "ext4"; };
36 myServices.mailRelay.enable = true;
37
38 security.pki.certificateFiles = [
39 (pkgs.fetchurl {
40 url = "http://downloads.e.eriomem.net/eriomemca.pem";
41 sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh";
42 })
43 ];
44
45 services.netdata.enable = true;
46 services.netdata.configDir."stream.conf" = config.secrets.fullPaths."netdata-stream.conf";
47 services.netdata.config.web."allow dashboard from" = "localhost";
48 services.netdata.config.web."allow badges from" = "*";
49 services.netdata.config.web."allow streaming from" = "*";
50 services.netdata.config.web."allow netdata.conf from" = "fd*";
51 services.netdata.config.web."allow management from" = "fd*";
52 networking.firewall.allowedTCPPorts = [ 19999 ];
53
54 secrets.keys = {
55 "netdata-stream.conf" = {
56 user = config.services.netdata.user;
57 group = config.services.netdata.group;
58 permissions = "0400";
59 text = builtins.concatStringsSep "\n" (pkgs.lib.mapAttrsToList (_: key: ''
60 [${key}]
61 enabled = yes
62 default history = 3600
63 default memory = ram
64 health enabled by default = auto
65 '') config.myEnv.monitoring.netdata_keys);
66 };
67 };
68 users.users."${config.services.netdata.user}".extraGroups = [ "keys" ];
69 # This value determines the NixOS release with which your system is
70 # to be compatible, in order to avoid breaking some software such as
71 # database servers. You should change this only after NixOS release
72 # notes say you should.
73 # https://nixos.org/nixos/manual/release-notes.html
74 system.stateVersion = "23.05"; # Did you read the comment?
75}
diff --git a/systems/monitoring-1/flake.lock b/systems/monitoring-1/flake.lock
new file mode 100644
index 0000000..d4a2c8d
--- /dev/null
+++ b/systems/monitoring-1/flake.lock
@@ -0,0 +1,790 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_3",
6 "nixpkgs": "nixpkgs_7"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "chatons": {
20 "inputs": {
21 "environment": "environment"
22 },
23 "locked": {
24 "lastModified": 1,
25 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
26 "path": "../../flakes/private/chatons",
27 "type": "path"
28 },
29 "original": {
30 "path": "../../flakes/private/chatons",
31 "type": "path"
32 }
33 },
34 "colmena": {
35 "inputs": {
36 "flake-compat": "flake-compat",
37 "flake-utils": "flake-utils",
38 "nixpkgs": "nixpkgs",
39 "stable": "stable"
40 },
41 "locked": {
42 "lastModified": 1687954574,
43 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
44 "owner": "immae",
45 "repo": "colmena",
46 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
47 "type": "github"
48 },
49 "original": {
50 "owner": "immae",
51 "ref": "add-lib-get-flake",
52 "repo": "colmena",
53 "type": "github"
54 }
55 },
56 "disko": {
57 "inputs": {
58 "nixpkgs": "nixpkgs_2"
59 },
60 "locked": {
61 "lastModified": 1687968164,
62 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
63 "owner": "nix-community",
64 "repo": "disko",
65 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
66 "type": "github"
67 },
68 "original": {
69 "owner": "nix-community",
70 "repo": "disko",
71 "type": "github"
72 }
73 },
74 "environment": {
75 "locked": {
76 "lastModified": 1,
77 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
78 "path": "../environment",
79 "type": "path"
80 },
81 "original": {
82 "path": "../environment",
83 "type": "path"
84 }
85 },
86 "environment_2": {
87 "locked": {
88 "lastModified": 1,
89 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
90 "path": "../../flakes/private/environment",
91 "type": "path"
92 },
93 "original": {
94 "path": "../../flakes/private/environment",
95 "type": "path"
96 }
97 },
98 "environment_3": {
99 "locked": {
100 "lastModified": 1,
101 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
102 "path": "../environment",
103 "type": "path"
104 },
105 "original": {
106 "path": "../environment",
107 "type": "path"
108 }
109 },
110 "environment_4": {
111 "locked": {
112 "lastModified": 1,
113 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
114 "path": "../environment",
115 "type": "path"
116 },
117 "original": {
118 "path": "../environment",
119 "type": "path"
120 }
121 },
122 "environment_5": {
123 "locked": {
124 "lastModified": 1,
125 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
126 "path": "../environment",
127 "type": "path"
128 },
129 "original": {
130 "path": "../environment",
131 "type": "path"
132 }
133 },
134 "files-watcher": {
135 "locked": {
136 "lastModified": 1,
137 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
138 "path": "../../flakes/files-watcher",
139 "type": "path"
140 },
141 "original": {
142 "path": "../../flakes/files-watcher",
143 "type": "path"
144 }
145 },
146 "flake-compat": {
147 "flake": false,
148 "locked": {
149 "lastModified": 1650374568,
150 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
151 "owner": "edolstra",
152 "repo": "flake-compat",
153 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
154 "type": "github"
155 },
156 "original": {
157 "owner": "edolstra",
158 "repo": "flake-compat",
159 "type": "github"
160 }
161 },
162 "flake-parts": {
163 "inputs": {
164 "nixpkgs-lib": "nixpkgs-lib_2"
165 },
166 "locked": {
167 "lastModified": 1687762428,
168 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
169 "owner": "hercules-ci",
170 "repo": "flake-parts",
171 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
172 "type": "github"
173 },
174 "original": {
175 "owner": "hercules-ci",
176 "repo": "flake-parts",
177 "type": "github"
178 }
179 },
180 "flake-parts_2": {
181 "inputs": {
182 "nixpkgs-lib": "nixpkgs-lib_3"
183 },
184 "locked": {
185 "lastModified": 1675295133,
186 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
187 "owner": "hercules-ci",
188 "repo": "flake-parts",
189 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
190 "type": "github"
191 },
192 "original": {
193 "owner": "hercules-ci",
194 "repo": "flake-parts",
195 "type": "github"
196 }
197 },
198 "flake-utils": {
199 "locked": {
200 "lastModified": 1659877975,
201 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
202 "owner": "numtide",
203 "repo": "flake-utils",
204 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
205 "type": "github"
206 },
207 "original": {
208 "owner": "numtide",
209 "repo": "flake-utils",
210 "type": "github"
211 }
212 },
213 "flake-utils_2": {
214 "locked": {
215 "lastModified": 1648297722,
216 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
217 "owner": "numtide",
218 "repo": "flake-utils",
219 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
220 "type": "github"
221 },
222 "original": {
223 "owner": "numtide",
224 "repo": "flake-utils",
225 "type": "github"
226 }
227 },
228 "flake-utils_3": {
229 "locked": {
230 "lastModified": 1667395993,
231 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
232 "owner": "numtide",
233 "repo": "flake-utils",
234 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
235 "type": "github"
236 },
237 "original": {
238 "owner": "numtide",
239 "repo": "flake-utils",
240 "type": "github"
241 }
242 },
243 "loginctl-linger": {
244 "locked": {
245 "lastModified": 1,
246 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
247 "path": "../../flakes/loginctl-linger",
248 "type": "path"
249 },
250 "original": {
251 "path": "../../flakes/loginctl-linger",
252 "type": "path"
253 }
254 },
255 "mail-relay": {
256 "inputs": {
257 "environment": "environment_3",
258 "secrets": "secrets"
259 },
260 "locked": {
261 "lastModified": 1,
262 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
263 "path": "../../flakes/private/mail-relay",
264 "type": "path"
265 },
266 "original": {
267 "path": "../../flakes/private/mail-relay",
268 "type": "path"
269 }
270 },
271 "monitoring": {
272 "inputs": {
273 "environment": "environment_4",
274 "naemon": "naemon",
275 "nixpkgs-lib": "nixpkgs-lib",
276 "secrets": "secrets_2"
277 },
278 "locked": {
279 "lastModified": 1,
280 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
281 "path": "../../flakes/private/monitoring",
282 "type": "path"
283 },
284 "original": {
285 "path": "../../flakes/private/monitoring",
286 "type": "path"
287 }
288 },
289 "my-lib": {
290 "inputs": {
291 "colmena": "colmena",
292 "disko": "disko",
293 "flake-parts": "flake-parts",
294 "nixos-anywhere": "nixos-anywhere",
295 "nixpkgs": "nixpkgs_4"
296 },
297 "locked": {
298 "lastModified": 1,
299 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
300 "path": "../../flakes/lib",
301 "type": "path"
302 },
303 "original": {
304 "path": "../../flakes/lib",
305 "type": "path"
306 }
307 },
308 "mypackages": {
309 "inputs": {
310 "flake-parts": "flake-parts_2",
311 "nixpkgs": "nixpkgs_8",
312 "webapps-ttrss": "webapps-ttrss"
313 },
314 "locked": {
315 "lastModified": 1,
316 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
317 "path": "../../mypackages",
318 "type": "path"
319 },
320 "original": {
321 "path": "../../mypackages",
322 "type": "path"
323 }
324 },
325 "myuids": {
326 "locked": {
327 "lastModified": 1,
328 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
329 "path": "../../flakes/myuids",
330 "type": "path"
331 },
332 "original": {
333 "path": "../../flakes/myuids",
334 "type": "path"
335 }
336 },
337 "myuids_2": {
338 "locked": {
339 "lastModified": 1,
340 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
341 "path": "../../myuids",
342 "type": "path"
343 },
344 "original": {
345 "path": "../../myuids",
346 "type": "path"
347 }
348 },
349 "naemon": {
350 "locked": {
351 "lastModified": 1,
352 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
353 "path": "../../naemon",
354 "type": "path"
355 },
356 "original": {
357 "path": "../../naemon",
358 "type": "path"
359 }
360 },
361 "nixos-2305": {
362 "locked": {
363 "lastModified": 1687938137,
364 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
365 "owner": "NixOS",
366 "repo": "nixpkgs",
367 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
368 "type": "github"
369 },
370 "original": {
371 "owner": "NixOS",
372 "ref": "release-23.05",
373 "repo": "nixpkgs",
374 "type": "github"
375 }
376 },
377 "nixos-anywhere": {
378 "inputs": {
379 "disko": [
380 "my-lib",
381 "disko"
382 ],
383 "flake-parts": [
384 "my-lib",
385 "flake-parts"
386 ],
387 "nixos-2305": "nixos-2305",
388 "nixos-images": "nixos-images",
389 "nixpkgs": "nixpkgs_3",
390 "treefmt-nix": "treefmt-nix"
391 },
392 "locked": {
393 "lastModified": 1689945193,
394 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
395 "owner": "numtide",
396 "repo": "nixos-anywhere",
397 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
398 "type": "github"
399 },
400 "original": {
401 "owner": "numtide",
402 "repo": "nixos-anywhere",
403 "type": "github"
404 }
405 },
406 "nixos-images": {
407 "inputs": {
408 "nixos-2305": [
409 "my-lib",
410 "nixos-anywhere",
411 "nixos-2305"
412 ],
413 "nixos-unstable": [
414 "my-lib",
415 "nixos-anywhere",
416 "nixpkgs"
417 ]
418 },
419 "locked": {
420 "lastModified": 1686819168,
421 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
422 "owner": "nix-community",
423 "repo": "nixos-images",
424 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
425 "type": "github"
426 },
427 "original": {
428 "owner": "nix-community",
429 "repo": "nixos-images",
430 "type": "github"
431 }
432 },
433 "nixpkgs": {
434 "locked": {
435 "lastModified": 1683408522,
436 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
437 "owner": "NixOS",
438 "repo": "nixpkgs",
439 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
440 "type": "github"
441 },
442 "original": {
443 "owner": "NixOS",
444 "ref": "nixos-unstable",
445 "repo": "nixpkgs",
446 "type": "github"
447 }
448 },
449 "nixpkgs-4": {
450 "flake": false,
451 "locked": {
452 "lastModified": 1646497237,
453 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
454 "owner": "NixOS",
455 "repo": "nixpkgs",
456 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
457 "type": "github"
458 },
459 "original": {
460 "owner": "NixOS",
461 "repo": "nixpkgs",
462 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
463 "type": "github"
464 }
465 },
466 "nixpkgs-lib": {
467 "locked": {
468 "dir": "lib",
469 "lastModified": 1691269286,
470 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
471 "owner": "NixOS",
472 "repo": "nixpkgs",
473 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
474 "type": "github"
475 },
476 "original": {
477 "dir": "lib",
478 "owner": "NixOS",
479 "repo": "nixpkgs",
480 "type": "github"
481 }
482 },
483 "nixpkgs-lib_2": {
484 "locked": {
485 "dir": "lib",
486 "lastModified": 1685564631,
487 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
488 "owner": "NixOS",
489 "repo": "nixpkgs",
490 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
491 "type": "github"
492 },
493 "original": {
494 "dir": "lib",
495 "owner": "NixOS",
496 "ref": "nixos-unstable",
497 "repo": "nixpkgs",
498 "type": "github"
499 }
500 },
501 "nixpkgs-lib_3": {
502 "locked": {
503 "dir": "lib",
504 "lastModified": 1675183161,
505 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
506 "owner": "NixOS",
507 "repo": "nixpkgs",
508 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
509 "type": "github"
510 },
511 "original": {
512 "dir": "lib",
513 "owner": "NixOS",
514 "ref": "nixos-unstable",
515 "repo": "nixpkgs",
516 "type": "github"
517 }
518 },
519 "nixpkgs_2": {
520 "locked": {
521 "lastModified": 1687701825,
522 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
523 "owner": "NixOS",
524 "repo": "nixpkgs",
525 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
526 "type": "github"
527 },
528 "original": {
529 "owner": "NixOS",
530 "ref": "nixpkgs-unstable",
531 "repo": "nixpkgs",
532 "type": "github"
533 }
534 },
535 "nixpkgs_3": {
536 "locked": {
537 "lastModified": 1687893427,
538 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
539 "owner": "nixos",
540 "repo": "nixpkgs",
541 "rev": "4b14ab2a916508442e685089672681dff46805be",
542 "type": "github"
543 },
544 "original": {
545 "owner": "nixos",
546 "ref": "nixos-unstable-small",
547 "repo": "nixpkgs",
548 "type": "github"
549 }
550 },
551 "nixpkgs_4": {
552 "locked": {
553 "lastModified": 1648725829,
554 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
555 "owner": "NixOS",
556 "repo": "nixpkgs",
557 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
558 "type": "github"
559 },
560 "original": {
561 "owner": "NixOS",
562 "repo": "nixpkgs",
563 "type": "github"
564 }
565 },
566 "nixpkgs_5": {
567 "locked": {
568 "lastModified": 1693158576,
569 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
570 "owner": "nixos",
571 "repo": "nixpkgs",
572 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
573 "type": "github"
574 },
575 "original": {
576 "owner": "nixos",
577 "ref": "nixos-unstable",
578 "repo": "nixpkgs",
579 "type": "github"
580 }
581 },
582 "nixpkgs_6": {
583 "flake": false,
584 "locked": {
585 "lastModified": 1596265691,
586 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
587 "owner": "NixOS",
588 "repo": "nixpkgs",
589 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
590 "type": "github"
591 },
592 "original": {
593 "owner": "NixOS",
594 "repo": "nixpkgs",
595 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
596 "type": "github"
597 }
598 },
599 "nixpkgs_7": {
600 "locked": {
601 "lastModified": 1687502512,
602 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
603 "owner": "NixOS",
604 "repo": "nixpkgs",
605 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
606 "type": "github"
607 },
608 "original": {
609 "owner": "NixOS",
610 "ref": "nixos-unstable",
611 "repo": "nixpkgs",
612 "type": "github"
613 }
614 },
615 "nixpkgs_8": {
616 "locked": {
617 "lastModified": 1646497237,
618 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
619 "owner": "nixos",
620 "repo": "nixpkgs",
621 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
622 "type": "github"
623 },
624 "original": {
625 "owner": "nixos",
626 "repo": "nixpkgs",
627 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
628 "type": "github"
629 }
630 },
631 "php": {
632 "inputs": {
633 "flake-utils": "flake-utils_2",
634 "nixpkgs": "nixpkgs_6",
635 "nixpkgs-4": "nixpkgs-4"
636 },
637 "locked": {
638 "lastModified": 1,
639 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
640 "path": "../../flakes/private/php",
641 "type": "path"
642 },
643 "original": {
644 "path": "../../flakes/private/php",
645 "type": "path"
646 }
647 },
648 "root": {
649 "inputs": {
650 "chatons": "chatons",
651 "environment": "environment_2",
652 "files-watcher": "files-watcher",
653 "loginctl-linger": "loginctl-linger",
654 "mail-relay": "mail-relay",
655 "monitoring": "monitoring",
656 "my-lib": "my-lib",
657 "myuids": "myuids",
658 "nixpkgs": "nixpkgs_5",
659 "php": "php",
660 "secrets": "secrets_3",
661 "system": "system"
662 }
663 },
664 "secrets": {
665 "locked": {
666 "lastModified": 1,
667 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
668 "path": "../../secrets",
669 "type": "path"
670 },
671 "original": {
672 "path": "../../secrets",
673 "type": "path"
674 }
675 },
676 "secrets-public": {
677 "locked": {
678 "lastModified": 1,
679 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
680 "path": "../../secrets",
681 "type": "path"
682 },
683 "original": {
684 "path": "../../secrets",
685 "type": "path"
686 }
687 },
688 "secrets_2": {
689 "locked": {
690 "lastModified": 1,
691 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
692 "path": "../../secrets",
693 "type": "path"
694 },
695 "original": {
696 "path": "../../secrets",
697 "type": "path"
698 }
699 },
700 "secrets_3": {
701 "locked": {
702 "lastModified": 1,
703 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
704 "path": "../../flakes/secrets",
705 "type": "path"
706 },
707 "original": {
708 "path": "../../flakes/secrets",
709 "type": "path"
710 }
711 },
712 "stable": {
713 "locked": {
714 "lastModified": 1669735802,
715 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
716 "owner": "NixOS",
717 "repo": "nixpkgs",
718 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
719 "type": "github"
720 },
721 "original": {
722 "owner": "NixOS",
723 "ref": "nixos-22.11",
724 "repo": "nixpkgs",
725 "type": "github"
726 }
727 },
728 "system": {
729 "inputs": {
730 "backports": "backports",
731 "environment": "environment_5",
732 "mypackages": "mypackages",
733 "myuids": "myuids_2",
734 "secrets-public": "secrets-public"
735 },
736 "locked": {
737 "lastModified": 1,
738 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
739 "path": "../../flakes/private/system",
740 "type": "path"
741 },
742 "original": {
743 "path": "../../flakes/private/system",
744 "type": "path"
745 }
746 },
747 "treefmt-nix": {
748 "inputs": {
749 "nixpkgs": [
750 "my-lib",
751 "nixos-anywhere",
752 "nixpkgs"
753 ]
754 },
755 "locked": {
756 "lastModified": 1687940979,
757 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
758 "owner": "numtide",
759 "repo": "treefmt-nix",
760 "rev": "0a4f06c27610a99080b69433873885df82003aae",
761 "type": "github"
762 },
763 "original": {
764 "owner": "numtide",
765 "repo": "treefmt-nix",
766 "type": "github"
767 }
768 },
769 "webapps-ttrss": {
770 "flake": false,
771 "locked": {
772 "lastModified": 1546759381,
773 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
774 "ref": "master",
775 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
776 "revCount": 9256,
777 "type": "git",
778 "url": "https://git.tt-rss.org/fox/tt-rss.git"
779 },
780 "original": {
781 "ref": "master",
782 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
783 "type": "git",
784 "url": "https://git.tt-rss.org/fox/tt-rss.git"
785 }
786 }
787 },
788 "root": "root",
789 "version": 7
790}
diff --git a/systems/monitoring-1/flake.nix b/systems/monitoring-1/flake.nix
new file mode 100644
index 0000000..e97cb05
--- /dev/null
+++ b/systems/monitoring-1/flake.nix
@@ -0,0 +1,45 @@
1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
4
5 my-lib.url = "path:../../flakes/lib";
6
7 monitoring.url = "path:../../flakes/private/monitoring";
8 mail-relay.url = "path:../../flakes/private/mail-relay";
9 chatons.url = "path:../../flakes/private/chatons";
10 environment.url = "path:../../flakes/private/environment";
11 system.url = "path:../../flakes/private/system";
12 php.url = "path:../../flakes/private/php";
13
14 myuids.url = "path:../../flakes/myuids";
15 secrets.url = "path:../../flakes/secrets";
16 files-watcher.url = "path:../../flakes/files-watcher";
17 loginctl-linger.url = "path:../../flakes/loginctl-linger";
18 };
19 outputs = inputs@{ self, my-lib, nixpkgs, ...}:
20 my-lib.lib.mkColmenaFlake {
21 name = "monitoring-1";
22 inherit self nixpkgs;
23 system = "x86_64-linux";
24 targetHost = "95.216.164.150";
25 targetUser = "root";
26 nixosModules = {
27 base = ./base.nix;
28 system = inputs.system.nixosModule;
29 mail-relay = inputs.mail-relay.nixosModule;
30 chatons = inputs.chatons.nixosModule;
31 monitoring = inputs.monitoring.nixosModule;
32 environment = inputs.environment.nixosModule;
33
34 myuids = inputs.myuids.nixosModule;
35 secrets = inputs.secrets.nixosModule;
36 files-watcher = inputs.files-watcher.nixosModule;
37 loginctl-linger = inputs.loginctl-linger.nixosModule;
38 };
39 moduleArgs = {
40 nixpkgs = inputs.nixpkgs;
41 monitoring = inputs.monitoring;
42 php = inputs.php;
43 };
44 };
45}
diff --git a/systems/monitoring-1/monitoring-master.nix b/systems/monitoring-1/monitoring-master.nix
new file mode 100644
index 0000000..09319b8
--- /dev/null
+++ b/systems/monitoring-1/monitoring-master.nix
@@ -0,0 +1,87 @@
1{ config, pkgs, lib, nodes, name, monitoring, ... }:
2let
3 mlib = monitoring.lib;
4 nodesWithMonitoring = lib.filterAttrs (n: v: (v.config.myServices or {}) ? "monitoring") nodes;
5in
6{
7 imports = [
8 ./monitoring/master.nix
9 ./monitoring/phare.nix
10 ./monitoring/ulminfo-fr.nix
11 ];
12 myServices.monitoring.activatedPlugins = lib.flatten (lib.mapAttrsToList (_: n: n.config.myServices.monitoring.fromMasterActivatedPlugins) nodesWithMonitoring);
13 myServices.monitoring.objects = lib.mkMerge (
14 lib.mapAttrsToList (_: n:
15 mlib.toMasterPassiveObject "external-passive-service" 1.5 n.config.myServices.monitoring.objects
16 ) (lib.filterAttrs (n: v: n != name) nodesWithMonitoring)
17 ++
18 lib.mapAttrsToList (_: n: n.config.myServices.monitoring.fromMasterObjects) nodesWithMonitoring
19 );
20 myServices.chatonsProperties.hostings.monitoring = {
21 file.datetime = "2022-08-27T16:00:00";
22 hosting = {
23 name = "Monitoring";
24 description = "Website and server health monitoring";
25 website = "https://status.immae.eu";
26 logo = "https://www.naemon.io/favicon.ico";
27 status.level = "OK";
28 status.description = "OK";
29 registration.load = "OPEN";
30 install.type = "PACKAGE";
31 };
32 software = {
33 name = "naemon";
34 website = "https://www.naemon.io/";
35 license.url = "https://github.com/naemon/naemon-core/blob/master/COPYING";
36 license.name = "GNU General Public License v2.0";
37 version = config.services.naemon.package.version;
38 source.url = "https://github.com/naemon/naemon-core";
39 modules = "livestatus,status-engine";
40 };
41 };
42
43 services.nginx = {
44 virtualHosts."status.immae.eu".locations = {
45 "=/common/immae.cfg" = {
46 alias = pkgs.writeText "immae.cfg" ''
47 # put me for instance in /etc/naemon/module-conf.d/immae.cfg
48 # Make sure that you have include_dir=module-conf.d in
49 # naemon.cfg
50 log_initial_states=1
51 date_format=iso8601
52 admin_email=${config.myEnv.monitoring.email}
53 obsess_over_services=1
54 ocsp_command=notify-master
55 '';
56 };
57 "=/common/resource.cfg" = {
58 alias = pkgs.writeText "resource.cfg" ''
59 # Resource.cfg file
60 # Replace this with path to monitoring plugins
61 $USER1$=@@COMMON_PLUGINS@@
62 # Replace this with a path to scripts from
63 # https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/tree/modules/private/monitoring/plugins
64 $USER2$=@@IMMAE_PLUGINS@@
65 $USER200$=https://status.immae.eu/
66 $USER201$=@@TOKEN@@
67 '';
68 };
69 };
70 };
71
72 secrets.keys = lib.mapAttrs' (k: v: lib.nameValuePair "${k}_access_key" {
73 user = "naemon";
74 group = "naemon";
75 permissions = "0400";
76 text = ''
77 export AWS_ACCESS_KEY_ID="${v.accessKeyId}"
78 export AWS_SECRET_ACCESS_KEY="${v.secretAccessKey}"
79 export BASE_URL="${v.remote "immae-eldiron"}"
80 '';
81 }) config.myEnv.backup.remotes;
82
83 services.naemon.extraConfig = ''
84 broker_module=${pkgs.naemon-livestatus}/lib/naemon-livestatus/livestatus.so ${config.services.naemon.runDir}/live
85 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
86 '';
87}
diff --git a/systems/monitoring-1/monitoring.nix b/systems/monitoring-1/monitoring.nix
new file mode 100644
index 0000000..421c71f
--- /dev/null
+++ b/systems/monitoring-1/monitoring.nix
@@ -0,0 +1,61 @@
1{ config, pkgs, lib, name, monitoring, ... }:
2let
3 hostFQDN = config.hostEnv.fqdn;
4 emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
5in
6{
7 config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "emails" "ovh" "notify-primary" ];
8 config.myServices.monitoring.objects = lib.mkMerge [
9 (monitoring.lib.objectsCommon {
10 inherit hostFQDN;
11 hostName = name;
12 master = true;
13 processWarn = "70"; processAlert = "80";
14 loadWarn = "4.0"; loadAlert = "5.0";
15 load15Warn = "1.0"; load15Alert = "2.0";
16 interface = builtins.head (builtins.attrNames config.networking.interfaces);
17 })
18
19 {
20 service = [
21 (emailCheck "monitoring-1" hostFQDN)
22
23 {
24 service_description = "OVH account has enough sms";
25 host_name = hostFQDN;
26 use = "external-service";
27 check_command = "check_ovh_sms";
28
29 check_interval = 120;
30 notification_interval = "1440";
31 }
32
33 # Dummy service for testing
34 # {
35 # service_description = "Dummy failing test";
36 # host_name = "dummy-host";
37 # use = "local-service";
38 # check_interval = 0.3;
39 # max_check_attempts = "1";
40 # flap_detection_enabled = "0";
41 # notification_interval = "0.1";
42 # check_command = "check_critical";
43 # }
44 ];
45
46 host = {
47 # Dummy host for testing
48 # "dummy-host" = {
49 # alias = "dummy.host";
50 # check_interval = 0.3;
51 # max_check_attempts = "1";
52 # flap_detection_enabled = "0";
53 # notification_interval = "0.1";
54 # address = "dummy.host";
55 # use = "linux-server";
56 # check_command = "check_ok";
57 # };
58 };
59 }
60 ];
61}
diff --git a/systems/monitoring-1/monitoring/master.nix b/systems/monitoring-1/monitoring/master.nix
new file mode 100644
index 0000000..c8f52ea
--- /dev/null
+++ b/systems/monitoring-1/monitoring/master.nix
@@ -0,0 +1,43 @@
1{ config, ... }:
2{
3 myServices.monitoring.objects = {
4 contact = {
5 immae = {
6 alias = "Immae";
7 email = config.myEnv.monitoring.immae_contact;
8 use = "generic-contact";
9 contactgroups = "admins";
10 host_notification_commands = "notify-host-by-email,notify-host-by-apprise!$USER210$";
11 service_notification_commands = "notify-service-by-email,notify-service-by-apprise!$USER210$";
12 };
13 };
14 command = {
15 check_passive = "$USER1$/check_dummy 3 \"Service result are stale\"";
16 };
17 templates = {
18 service = {
19 external-passive-service = {
20 active_checks_enabled = "0";
21 check_freshness = "1";
22 check_period = "24x7";
23 contact_groups = "admins";
24 event_handler_enabled = "1";
25 flap_detection_enabled = "1";
26 is_volatile = "0";
27 max_check_attempts = "3";
28 notification_interval = "60";
29 notification_options = "w,u,c,r,f,s";
30 notification_period = "24x7";
31 notifications_enabled = "1";
32 passive_checks_enabled = "1";
33 process_perf_data = "1";
34 retain_nonstatus_information = "1";
35 retain_status_information = "1";
36 retry_interval = "2";
37 check_command = "check_passive";
38 _webstatus_namespace = "immae";
39 };
40 };
41 };
42 };
43}
diff --git a/systems/monitoring-1/monitoring/phare.nix b/systems/monitoring-1/monitoring/phare.nix
new file mode 100644
index 0000000..0ce9ffe
--- /dev/null
+++ b/systems/monitoring-1/monitoring/phare.nix
@@ -0,0 +1,20 @@
1{ monitoring, config, ... }:
2let
3 emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
4in
5{
6 config.myServices.monitoring.activatedPlugins = [ "emails" ];
7 config.myServices.monitoring.objects.host = {
8 "phare.normalesup.org" = {
9 alias = "phare.normalesup.org";
10 address = "phare.normalesup.org";
11 use = "linux-server";
12 hostgroups = "webstatus-hosts";
13 _webstatus_name = "phare";
14 _webstatus_vhost = "status.immae.eu";
15 };
16 };
17 config.myServices.monitoring.objects.service = [
18 (emailCheck "phare" "phare.normalesup.org")
19 ];
20}
diff --git a/systems/monitoring-1/monitoring/ulminfo-fr.nix b/systems/monitoring-1/monitoring/ulminfo-fr.nix
new file mode 100644
index 0000000..b0c6657
--- /dev/null
+++ b/systems/monitoring-1/monitoring/ulminfo-fr.nix
@@ -0,0 +1,20 @@
1{ monitoring, config, ... }:
2let
3 emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
4in
5{
6 config.myServices.monitoring.activatedPlugins = [ "emails" ];
7 config.myServices.monitoring.objects.host = {
8 "ulminfo.fr" = {
9 alias = "ulminfo.fr";
10 address = "ulminfo.fr";
11 use = "linux-server";
12 hostgroups = "webstatus-hosts";
13 _webstatus_name = "ulminfo";
14 _webstatus_vhost = "status.immae.eu";
15 };
16 };
17 config.myServices.monitoring.objects.service = [
18 (emailCheck "ulminfo" "ulminfo.fr")
19 ];
20}
diff --git a/systems/monitoring-1/status.nix b/systems/monitoring-1/status.nix
new file mode 100644
index 0000000..8b6615f
--- /dev/null
+++ b/systems/monitoring-1/status.nix
@@ -0,0 +1,84 @@
1{ config, pkgs, lib, name, ... }:
2{
3 options = {
4 myServices.status = {
5 enable = lib.mkOption {
6 type = lib.types.bool;
7 default = false;
8 description = ''
9 Whether to enable status app.
10 '';
11 };
12 };
13 };
14 config = lib.mkIf config.myServices.status.enable {
15 secrets.keys."naemon-status/environment" = {
16 user = "naemon";
17 group = "naemon";
18 permissions = "0400";
19 text = ''
20 TOKENS=${builtins.concatStringsSep " " config.myEnv.monitoring.nrdp_tokens}
21 '';
22 };
23 services.nginx = {
24 enable = true;
25 recommendedOptimisation = true;
26 recommendedGzipSettings = true;
27 recommendedProxySettings = true;
28 upstreams."netdata".servers = { "127.0.0.1:19999" = {}; };
29 upstreams."netdata".extraConfig = ''
30 keepalive 64;
31 '';
32 virtualHosts."status.immae.eu" = {
33 acmeRoot = config.security.acme.defaults.webroot;
34 useACMEHost = name;
35 forceSSL = true;
36 locations."/".proxyPass = "http://unix:/run/naemon-status/socket.sock:/";
37
38 locations."= /netdata".return = "301 /netdata/";
39 locations."~ /netdata/(?<ndpath>.*)".extraConfig = ''
40 proxy_redirect off;
41 proxy_set_header Host $host;
42
43 proxy_set_header X-Forwarded-Host $host;
44 proxy_set_header X-Forwarded-Server $host;
45 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
46 proxy_http_version 1.1;
47 proxy_pass_request_headers on;
48 proxy_set_header Connection "keep-alive";
49 proxy_store off;
50 proxy_pass http://netdata/$ndpath$is_args$args;
51
52 gzip on;
53 gzip_proxied any;
54 gzip_types *;
55 '';
56 };
57 };
58 security.acme.certs."${name}" = {
59 extraDomainNames = [ "status.immae.eu" ];
60 group = config.services.nginx.group;
61 };
62
63 networking.firewall.allowedTCPPorts = [ 80 443 ];
64 systemd.services.naemon-status = {
65 description = "Naemon status";
66 after = [ "network.target" ];
67 wantedBy = [ "multi-user.target" ];
68
69 serviceConfig = {
70 EnvironmentFile = config.secrets.fullPaths."naemon-status/environment";
71 Type = "simple";
72 WorkingDirectory = "${./status}";
73 ExecStart = let
74 python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.flask_login ]);
75 in
76 "${python}/bin/gunicorn -w4 --bind unix:/run/naemon-status/socket.sock app:app";
77 User = "naemon";
78 RuntimeDirectory = "naemon-status";
79 StandardOutput = "journal";
80 StandardError = "inherit";
81 };
82 };
83 };
84}
diff --git a/modules/private/monitoring/status/app.py b/systems/monitoring-1/status/app.py
index ff92891..ff92891 100755
--- a/modules/private/monitoring/status/app.py
+++ b/systems/monitoring-1/status/app.py
diff --git a/systems/monitoring-1/status_engine.nix b/systems/monitoring-1/status_engine.nix
new file mode 100644
index 0000000..fc6afc0
--- /dev/null
+++ b/systems/monitoring-1/status_engine.nix
@@ -0,0 +1,123 @@
1{ config, pkgs, lib, name, ... }:
2let
3 package = pkgs.status-engine-worker.override { config_file = config.secrets.fullPaths."status_engine"; };
4 env = config.myEnv.tools.status_engine;
5in
6{
7 config = lib.mkIf config.myServices.status.enable {
8 systemd.services.gearmand = {
9 description = "Gearman daemon";
10 after = [ "network.target" ];
11 wantedBy = [ "multi-user.target" ];
12 serviceConfig = {
13 DynamicUser = true;
14 User = "gearmand";
15 Type = "simple";
16 ExecStart = "${pkgs.gearmand}/bin/gearmand --syslog -L 127.0.0.1 -q libsqlite3 --libsqlite3-db /var/lib/gearmand/gearmand.db --store-queue-on-shutdown -l stderr -P /run/gearmand/gearmand.pid";
17 RuntimeDirectory = "gearmand";
18 StateDirectory = "gearmand";
19 };
20 };
21
22 secrets.keys."status_engine" = {
23 permissions = "0400";
24 user = "naemon";
25 group = "naemon";
26 text = ''
27 node_name: ${name}
28 use_gearman: 1
29 gearman:
30 address: 127.0.0.1
31 port: 4730
32 timeout: 1000
33 use_rabbitmq: 0
34 use_redis: 1
35 redis:
36 address: 127.0.0.1
37 port: 6379
38 db: 0
39 store_live_data_in_archive_backend: 1
40 use_mysql: 1
41 mysql:
42 host: ${env.mysql.remoteHost}
43 port: ${builtins.toString env.mysql.port}
44 username: ${env.mysql.user}
45 password: ${env.mysql.password}
46 database: ${env.mysql.database}
47 use_crate: 0
48 number_of_bulk_records: 100
49 max_bulk_delay: 5
50 number_servicestatus_worker: 1
51 number_hoststatus_worker: 1
52 number_logentry_worker: 1
53 number_statechange_worker: 1
54 number_hostcheck_worker: 1
55 number_servicecheck_worker: 1
56 number_misc_worker: 1
57
58 process_perfdata: 1
59 number_perfdata_worker: 1
60 perfdata_backend:
61 - mysql
62
63 check_for_commands: 1
64 command_check_interval: 15
65 external_command_file: /run/naemon/naemon.cmd
66 query_handler: /run/naemon/naemon.qh
67 submit_method: qh
68
69 syslog_enabled: 1
70 syslog_tag: statusengine-worker
71
72 # Archive age
73 age_hostchecks: 5
74 age_host_acknowledgements: 60
75 age_host_notifications: 60
76 age_host_statehistory: 365
77 age_host_downtimes: 60
78 age_servicechecks: 5
79 age_service_acknowledgements: 60
80 age_service_notifications: 60
81 age_service_statehistory: 365
82 age_service_downtimes: 60
83 age_logentries: 5
84 age_tasks: 1
85 age_perfdata: 90
86
87 disable_http_proxy: 1
88 '';
89 };
90
91 services.redis.servers."" = rec {
92 enable = true;
93 bind = "127.0.0.1";
94 };
95
96 services.cron = {
97 mailto = "cron@immae.eu";
98 systemCronJobs = [
99 "0 0 * * * naemon cd ${package} && ./bin/Console.php cleanup"
100 ];
101 };
102
103 environment.systemPackages = [
104 pkgs.gearmand
105 (pkgs.writeScriptBin "status-engine-worker" ''
106 #! ${pkgs.stdenv.shell}
107 cd ${package}
108 exec sudo -E -u naemon ./bin/Console.php "$@"
109 '')
110 ];
111 systemd.services.status_engine_worker = {
112 description = "Status engine worker";
113 after = [ "network.target" ];
114 wantedBy = [ "multi-user.target" ];
115 serviceConfig = {
116 Type = "simple";
117 Restart = "on-failure";
118 User = "naemon";
119 ExecStart = "${package}/bin/StatusengineWorker.php";
120 };
121 };
122 };
123}
diff --git a/systems/quatresaisons/flake.lock b/systems/quatresaisons/flake.lock
new file mode 100644
index 0000000..6f2ccca
--- /dev/null
+++ b/systems/quatresaisons/flake.lock
@@ -0,0 +1,767 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_3",
6 "nixpkgs": "nixpkgs_7"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "colmena": {
20 "inputs": {
21 "flake-compat": "flake-compat",
22 "flake-utils": "flake-utils",
23 "nixpkgs": "nixpkgs",
24 "stable": "stable"
25 },
26 "locked": {
27 "lastModified": 1687954574,
28 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
29 "owner": "immae",
30 "repo": "colmena",
31 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
32 "type": "github"
33 },
34 "original": {
35 "owner": "immae",
36 "ref": "add-lib-get-flake",
37 "repo": "colmena",
38 "type": "github"
39 }
40 },
41 "disko": {
42 "inputs": {
43 "nixpkgs": "nixpkgs_2"
44 },
45 "locked": {
46 "lastModified": 1687968164,
47 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
48 "owner": "nix-community",
49 "repo": "disko",
50 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
51 "type": "github"
52 },
53 "original": {
54 "owner": "nix-community",
55 "repo": "disko",
56 "type": "github"
57 }
58 },
59 "environment": {
60 "locked": {
61 "lastModified": 1,
62 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
63 "path": "../../flakes/private/environment",
64 "type": "path"
65 },
66 "original": {
67 "path": "../../flakes/private/environment",
68 "type": "path"
69 }
70 },
71 "environment_2": {
72 "locked": {
73 "lastModified": 1,
74 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
75 "path": "../environment",
76 "type": "path"
77 },
78 "original": {
79 "path": "../environment",
80 "type": "path"
81 }
82 },
83 "environment_3": {
84 "locked": {
85 "lastModified": 1,
86 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
87 "path": "../environment",
88 "type": "path"
89 },
90 "original": {
91 "path": "../environment",
92 "type": "path"
93 }
94 },
95 "files-watcher": {
96 "locked": {
97 "lastModified": 1,
98 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
99 "path": "../../flakes/files-watcher",
100 "type": "path"
101 },
102 "original": {
103 "path": "../../flakes/files-watcher",
104 "type": "path"
105 }
106 },
107 "files-watcher_2": {
108 "locked": {
109 "lastModified": 1,
110 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
111 "path": "../files-watcher",
112 "type": "path"
113 },
114 "original": {
115 "path": "../files-watcher",
116 "type": "path"
117 }
118 },
119 "flake-compat": {
120 "flake": false,
121 "locked": {
122 "lastModified": 1650374568,
123 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
124 "owner": "edolstra",
125 "repo": "flake-compat",
126 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
127 "type": "github"
128 },
129 "original": {
130 "owner": "edolstra",
131 "repo": "flake-compat",
132 "type": "github"
133 }
134 },
135 "flake-parts": {
136 "inputs": {
137 "nixpkgs-lib": "nixpkgs-lib_2"
138 },
139 "locked": {
140 "lastModified": 1687762428,
141 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
142 "owner": "hercules-ci",
143 "repo": "flake-parts",
144 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
145 "type": "github"
146 },
147 "original": {
148 "owner": "hercules-ci",
149 "repo": "flake-parts",
150 "type": "github"
151 }
152 },
153 "flake-parts_2": {
154 "inputs": {
155 "nixpkgs-lib": "nixpkgs-lib_3"
156 },
157 "locked": {
158 "lastModified": 1675295133,
159 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
160 "owner": "hercules-ci",
161 "repo": "flake-parts",
162 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
163 "type": "github"
164 },
165 "original": {
166 "owner": "hercules-ci",
167 "repo": "flake-parts",
168 "type": "github"
169 }
170 },
171 "flake-utils": {
172 "locked": {
173 "lastModified": 1659877975,
174 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
175 "owner": "numtide",
176 "repo": "flake-utils",
177 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
178 "type": "github"
179 },
180 "original": {
181 "owner": "numtide",
182 "repo": "flake-utils",
183 "type": "github"
184 }
185 },
186 "flake-utils_2": {
187 "locked": {
188 "lastModified": 1648297722,
189 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
190 "owner": "numtide",
191 "repo": "flake-utils",
192 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
193 "type": "github"
194 },
195 "original": {
196 "owner": "numtide",
197 "repo": "flake-utils",
198 "type": "github"
199 }
200 },
201 "flake-utils_3": {
202 "locked": {
203 "lastModified": 1667395993,
204 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
205 "owner": "numtide",
206 "repo": "flake-utils",
207 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
208 "type": "github"
209 },
210 "original": {
211 "owner": "numtide",
212 "repo": "flake-utils",
213 "type": "github"
214 }
215 },
216 "landing-page": {
217 "flake": false,
218 "locked": {
219 "lastModified": 1691524124,
220 "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=",
221 "ref": "main",
222 "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf",
223 "revCount": 573,
224 "type": "git",
225 "url": "https://github.com/bastienwirtz/homer.git"
226 },
227 "original": {
228 "ref": "main",
229 "type": "git",
230 "url": "https://github.com/bastienwirtz/homer.git"
231 }
232 },
233 "monitoring": {
234 "inputs": {
235 "environment": "environment_2",
236 "naemon": "naemon",
237 "nixpkgs-lib": "nixpkgs-lib",
238 "secrets": "secrets"
239 },
240 "locked": {
241 "lastModified": 1,
242 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
243 "path": "../../flakes/private/monitoring",
244 "type": "path"
245 },
246 "original": {
247 "path": "../../flakes/private/monitoring",
248 "type": "path"
249 }
250 },
251 "multi-apache-container": {
252 "inputs": {
253 "files-watcher": "files-watcher_2",
254 "myuids": "myuids"
255 },
256 "locked": {
257 "lastModified": 1,
258 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
259 "path": "../../flakes/multi-apache-container",
260 "type": "path"
261 },
262 "original": {
263 "path": "../../flakes/multi-apache-container",
264 "type": "path"
265 }
266 },
267 "my-lib": {
268 "inputs": {
269 "colmena": "colmena",
270 "disko": "disko",
271 "flake-parts": "flake-parts",
272 "nixos-anywhere": "nixos-anywhere",
273 "nixpkgs": "nixpkgs_4"
274 },
275 "locked": {
276 "lastModified": 1,
277 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
278 "path": "../../flakes/lib",
279 "type": "path"
280 },
281 "original": {
282 "path": "../../flakes/lib",
283 "type": "path"
284 }
285 },
286 "mypackages": {
287 "inputs": {
288 "flake-parts": "flake-parts_2",
289 "nixpkgs": "nixpkgs_8",
290 "webapps-ttrss": "webapps-ttrss"
291 },
292 "locked": {
293 "lastModified": 1,
294 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
295 "path": "../../mypackages",
296 "type": "path"
297 },
298 "original": {
299 "path": "../../mypackages",
300 "type": "path"
301 }
302 },
303 "myuids": {
304 "locked": {
305 "lastModified": 1,
306 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
307 "path": "../myuids",
308 "type": "path"
309 },
310 "original": {
311 "path": "../myuids",
312 "type": "path"
313 }
314 },
315 "myuids_2": {
316 "locked": {
317 "lastModified": 1,
318 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
319 "path": "../../flakes/myuids",
320 "type": "path"
321 },
322 "original": {
323 "path": "../../flakes/myuids",
324 "type": "path"
325 }
326 },
327 "myuids_3": {
328 "locked": {
329 "lastModified": 1,
330 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
331 "path": "../../myuids",
332 "type": "path"
333 },
334 "original": {
335 "path": "../../myuids",
336 "type": "path"
337 }
338 },
339 "naemon": {
340 "locked": {
341 "lastModified": 1,
342 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
343 "path": "../../naemon",
344 "type": "path"
345 },
346 "original": {
347 "path": "../../naemon",
348 "type": "path"
349 }
350 },
351 "nixos-2305": {
352 "locked": {
353 "lastModified": 1687938137,
354 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
355 "owner": "NixOS",
356 "repo": "nixpkgs",
357 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
358 "type": "github"
359 },
360 "original": {
361 "owner": "NixOS",
362 "ref": "release-23.05",
363 "repo": "nixpkgs",
364 "type": "github"
365 }
366 },
367 "nixos-anywhere": {
368 "inputs": {
369 "disko": [
370 "my-lib",
371 "disko"
372 ],
373 "flake-parts": [
374 "my-lib",
375 "flake-parts"
376 ],
377 "nixos-2305": "nixos-2305",
378 "nixos-images": "nixos-images",
379 "nixpkgs": "nixpkgs_3",
380 "treefmt-nix": "treefmt-nix"
381 },
382 "locked": {
383 "lastModified": 1689945193,
384 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
385 "owner": "numtide",
386 "repo": "nixos-anywhere",
387 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
388 "type": "github"
389 },
390 "original": {
391 "owner": "numtide",
392 "repo": "nixos-anywhere",
393 "type": "github"
394 }
395 },
396 "nixos-images": {
397 "inputs": {
398 "nixos-2305": [
399 "my-lib",
400 "nixos-anywhere",
401 "nixos-2305"
402 ],
403 "nixos-unstable": [
404 "my-lib",
405 "nixos-anywhere",
406 "nixpkgs"
407 ]
408 },
409 "locked": {
410 "lastModified": 1686819168,
411 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
412 "owner": "nix-community",
413 "repo": "nixos-images",
414 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
415 "type": "github"
416 },
417 "original": {
418 "owner": "nix-community",
419 "repo": "nixos-images",
420 "type": "github"
421 }
422 },
423 "nixpkgs": {
424 "locked": {
425 "lastModified": 1683408522,
426 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
427 "owner": "NixOS",
428 "repo": "nixpkgs",
429 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
430 "type": "github"
431 },
432 "original": {
433 "owner": "NixOS",
434 "ref": "nixos-unstable",
435 "repo": "nixpkgs",
436 "type": "github"
437 }
438 },
439 "nixpkgs-4": {
440 "flake": false,
441 "locked": {
442 "lastModified": 1646497237,
443 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
444 "owner": "NixOS",
445 "repo": "nixpkgs",
446 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
447 "type": "github"
448 },
449 "original": {
450 "owner": "NixOS",
451 "repo": "nixpkgs",
452 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
453 "type": "github"
454 }
455 },
456 "nixpkgs-lib": {
457 "locked": {
458 "dir": "lib",
459 "lastModified": 1691269286,
460 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
461 "owner": "NixOS",
462 "repo": "nixpkgs",
463 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
464 "type": "github"
465 },
466 "original": {
467 "dir": "lib",
468 "owner": "NixOS",
469 "repo": "nixpkgs",
470 "type": "github"
471 }
472 },
473 "nixpkgs-lib_2": {
474 "locked": {
475 "dir": "lib",
476 "lastModified": 1685564631,
477 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
478 "owner": "NixOS",
479 "repo": "nixpkgs",
480 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
481 "type": "github"
482 },
483 "original": {
484 "dir": "lib",
485 "owner": "NixOS",
486 "ref": "nixos-unstable",
487 "repo": "nixpkgs",
488 "type": "github"
489 }
490 },
491 "nixpkgs-lib_3": {
492 "locked": {
493 "dir": "lib",
494 "lastModified": 1675183161,
495 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
496 "owner": "NixOS",
497 "repo": "nixpkgs",
498 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
499 "type": "github"
500 },
501 "original": {
502 "dir": "lib",
503 "owner": "NixOS",
504 "ref": "nixos-unstable",
505 "repo": "nixpkgs",
506 "type": "github"
507 }
508 },
509 "nixpkgs_2": {
510 "locked": {
511 "lastModified": 1687701825,
512 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
513 "owner": "NixOS",
514 "repo": "nixpkgs",
515 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
516 "type": "github"
517 },
518 "original": {
519 "owner": "NixOS",
520 "ref": "nixpkgs-unstable",
521 "repo": "nixpkgs",
522 "type": "github"
523 }
524 },
525 "nixpkgs_3": {
526 "locked": {
527 "lastModified": 1687893427,
528 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
529 "owner": "nixos",
530 "repo": "nixpkgs",
531 "rev": "4b14ab2a916508442e685089672681dff46805be",
532 "type": "github"
533 },
534 "original": {
535 "owner": "nixos",
536 "ref": "nixos-unstable-small",
537 "repo": "nixpkgs",
538 "type": "github"
539 }
540 },
541 "nixpkgs_4": {
542 "locked": {
543 "lastModified": 1648725829,
544 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
545 "owner": "NixOS",
546 "repo": "nixpkgs",
547 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
548 "type": "github"
549 },
550 "original": {
551 "owner": "NixOS",
552 "repo": "nixpkgs",
553 "type": "github"
554 }
555 },
556 "nixpkgs_5": {
557 "locked": {
558 "lastModified": 1693158576,
559 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
560 "owner": "nixos",
561 "repo": "nixpkgs",
562 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
563 "type": "github"
564 },
565 "original": {
566 "owner": "nixos",
567 "ref": "nixos-unstable",
568 "repo": "nixpkgs",
569 "type": "github"
570 }
571 },
572 "nixpkgs_6": {
573 "flake": false,
574 "locked": {
575 "lastModified": 1596265691,
576 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
577 "owner": "NixOS",
578 "repo": "nixpkgs",
579 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
580 "type": "github"
581 },
582 "original": {
583 "owner": "NixOS",
584 "repo": "nixpkgs",
585 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
586 "type": "github"
587 }
588 },
589 "nixpkgs_7": {
590 "locked": {
591 "lastModified": 1687502512,
592 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
593 "owner": "NixOS",
594 "repo": "nixpkgs",
595 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
596 "type": "github"
597 },
598 "original": {
599 "owner": "NixOS",
600 "ref": "nixos-unstable",
601 "repo": "nixpkgs",
602 "type": "github"
603 }
604 },
605 "nixpkgs_8": {
606 "locked": {
607 "lastModified": 1646497237,
608 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
609 "owner": "nixos",
610 "repo": "nixpkgs",
611 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
612 "type": "github"
613 },
614 "original": {
615 "owner": "nixos",
616 "repo": "nixpkgs",
617 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
618 "type": "github"
619 }
620 },
621 "php": {
622 "inputs": {
623 "flake-utils": "flake-utils_2",
624 "nixpkgs": "nixpkgs_6",
625 "nixpkgs-4": "nixpkgs-4"
626 },
627 "locked": {
628 "lastModified": 1,
629 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
630 "path": "../../flakes/private/php",
631 "type": "path"
632 },
633 "original": {
634 "path": "../../flakes/private/php",
635 "type": "path"
636 }
637 },
638 "root": {
639 "inputs": {
640 "environment": "environment",
641 "files-watcher": "files-watcher",
642 "landing-page": "landing-page",
643 "monitoring": "monitoring",
644 "multi-apache-container": "multi-apache-container",
645 "my-lib": "my-lib",
646 "myuids": "myuids_2",
647 "nixpkgs": "nixpkgs_5",
648 "php": "php",
649 "secrets": "secrets_2",
650 "system": "system"
651 }
652 },
653 "secrets": {
654 "locked": {
655 "lastModified": 1,
656 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
657 "path": "../../secrets",
658 "type": "path"
659 },
660 "original": {
661 "path": "../../secrets",
662 "type": "path"
663 }
664 },
665 "secrets-public": {
666 "locked": {
667 "lastModified": 1,
668 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
669 "path": "../../secrets",
670 "type": "path"
671 },
672 "original": {
673 "path": "../../secrets",
674 "type": "path"
675 }
676 },
677 "secrets_2": {
678 "locked": {
679 "lastModified": 1,
680 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
681 "path": "../../flakes/secrets",
682 "type": "path"
683 },
684 "original": {
685 "path": "../../flakes/secrets",
686 "type": "path"
687 }
688 },
689 "stable": {
690 "locked": {
691 "lastModified": 1669735802,
692 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
693 "owner": "NixOS",
694 "repo": "nixpkgs",
695 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
696 "type": "github"
697 },
698 "original": {
699 "owner": "NixOS",
700 "ref": "nixos-22.11",
701 "repo": "nixpkgs",
702 "type": "github"
703 }
704 },
705 "system": {
706 "inputs": {
707 "backports": "backports",
708 "environment": "environment_3",
709 "mypackages": "mypackages",
710 "myuids": "myuids_3",
711 "secrets-public": "secrets-public"
712 },
713 "locked": {
714 "lastModified": 1,
715 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
716 "path": "../../flakes/private/system",
717 "type": "path"
718 },
719 "original": {
720 "path": "../../flakes/private/system",
721 "type": "path"
722 }
723 },
724 "treefmt-nix": {
725 "inputs": {
726 "nixpkgs": [
727 "my-lib",
728 "nixos-anywhere",
729 "nixpkgs"
730 ]
731 },
732 "locked": {
733 "lastModified": 1687940979,
734 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
735 "owner": "numtide",
736 "repo": "treefmt-nix",
737 "rev": "0a4f06c27610a99080b69433873885df82003aae",
738 "type": "github"
739 },
740 "original": {
741 "owner": "numtide",
742 "repo": "treefmt-nix",
743 "type": "github"
744 }
745 },
746 "webapps-ttrss": {
747 "flake": false,
748 "locked": {
749 "lastModified": 1546759381,
750 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
751 "ref": "master",
752 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
753 "revCount": 9256,
754 "type": "git",
755 "url": "https://git.tt-rss.org/fox/tt-rss.git"
756 },
757 "original": {
758 "ref": "master",
759 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
760 "type": "git",
761 "url": "https://git.tt-rss.org/fox/tt-rss.git"
762 }
763 }
764 },
765 "root": "root",
766 "version": 7
767}
diff --git a/systems/quatresaisons/flake.nix b/systems/quatresaisons/flake.nix
new file mode 100644
index 0000000..8b269f6
--- /dev/null
+++ b/systems/quatresaisons/flake.nix
@@ -0,0 +1,49 @@
1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
4
5 my-lib.url = "path:../../flakes/lib";
6
7 monitoring.url = "path:../../flakes/private/monitoring";
8 environment.url = "path:../../flakes/private/environment";
9 php.url = "path:../../flakes/private/php";
10 system.url = "path:../../flakes/private/system";
11
12 myuids.url = "path:../../flakes/myuids";
13 secrets.url = "path:../../flakes/secrets";
14 files-watcher.url = "path:../../flakes/files-watcher";
15 multi-apache-container.url = "path:../../flakes/multi-apache-container";
16
17 landing-page = {
18 url = "https://github.com/bastienwirtz/homer.git";
19 ref = "main";
20 type = "git";
21 flake = false;
22 };
23 };
24 outputs = inputs@{ self, my-lib, nixpkgs, ...}:
25 my-lib.lib.mkColmenaFlake {
26 name = "quatresaisons";
27 inherit self nixpkgs;
28 system = "x86_64-linux";
29 targetHost = "144.76.76.162";
30 targetUser = "root";
31 nixosModules = {
32 base = { secrets, ... }: { imports = [ secrets.nixosModules.users-config-quatresaisons ]; };
33 system = inputs.system.nixosModule;
34 monitoring = inputs.monitoring.nixosModule;
35 environment = inputs.environment.nixosModule;
36
37 myuids = inputs.myuids.nixosModule;
38 secrets = inputs.secrets.nixosModule;
39 files-watcher = inputs.files-watcher.nixosModule;
40 multi-apache-container = inputs.multi-apache-container.nixosModule;
41 };
42 moduleArgs = {
43 monitoring = inputs.monitoring;
44 php = inputs.php;
45 landing-page = inputs.landing-page;
46 pkgs-no-overlay = inputs.nixpkgs.legacyPackages.x86_64-linux;
47 };
48 };
49}
diff --git a/systems/zoldene/Immae.pub b/systems/zoldene/Immae.pub
new file mode 100644
index 0000000..dd42b04
--- /dev/null
+++ b/systems/zoldene/Immae.pub
@@ -0,0 +1,322 @@
1-----BEGIN PGP PUBLIC KEY BLOCK-----
2
3mQINBFvwA+gBEADlchQGPyI2M9RNRUsk8wsL9XLc8qAFWTYlVp5p7177ucxTQf6S
4rny9yRCF69UqtE0ugwt+432sAAsDPi7BRA/JE95bIRBiewOiY1jYiivccP5dR6Jr
558HJ3QOHYPekqZIQhxzCWjdD2nRhhCbbxeWFJsJyaG8idGBiLkgNKxEEmqE5LIat
6tzMpQFwOpL2FoYZ7+e4ZTMc+x+yqpOnGcQD1qwouqx68okSCjrVBWo5S2tK5AzzU
7X8esBLNpgkhpUEZVltiNc4bmj7GZPdy4+mvS33/HQTed8YpatCFVWzcK+/uK0SYE
8P8Hj1mguT9idBhAf+kv7qbTycrFkTBliP3oDNUoARWDmfQdV4nlxqW03QxUY18mL
9KPByduK3hEXAZnD+/8QfVzbNVVP+70/jdSB+ckF88Li2g4bv/9uqjaObKVJB9ocG
10EWslm1h7tvdCLBRgIl8b2+Zl0fComRAMuwUr+LYlWLnfygAi8Uy9hl7UcRWAAj99
11PG4ba0+y8eD8k1J2IE8HpeIzMzRwYTLtvLyJBvrKiQHJb1PGM5cS8iry81wjUPZm
12dO5p5rbC8z99w7UNMaiz6iqAFAaDyLLsBZ5gWD+1ps9XxCA0zf28Z/Tc/Gj4QKAf
13kpMd7lQ+gprsFyRtzcRD4WhsOL2ogKYFHYi4LE0GYduspGdQPlK/YfrKQwARAQAB
14tB9Jc21hZWwgQm91eWEgPGlzbWFlbEBib3V5YS5vcmc+iQJRBBMBCAA7AhsDBQsJ
15CAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvw
16BU4CGQEACgkQyfztbKa3lFR/kA//cHVrb/RRTLQZy514vMkOBKgAk+dj+j0lrgvJ
17yR0JK1KjodduSoccPq7qRFAU+KVa3FsXMn8yY/lWaCXYJoF0DT5iEHsEuzJRc7Cn
18N4aq2h42DD7z8dJCXZvtvJs+vZ7G/rlLl322TjLb2OyIybBEoPOmJl0dVG0wKBFC
19r7EJmOKl3ytUWUpEbuxs1U/pP4GKrPT2CK3QcLF8JHKIPkEO347RorseeHcHhMxs
20Bz5JXojts1NyLJh7lErT42atgEdTGzSmkkGm8OifZVIH2rgmnRsPHnCqrXYsa7dE
21yPsC01Ns3DPYk4C5FtbpfiNvATbnkOicEwb2U55OpYUZLsFCKo7Bl+duJVY0nPRN
22WiLCALPcdJL+a6hbh1hSuqHt5eNGxyrDtRPowXRTS1D4nTCgAh6+wpH47xXWEwXZ
23mEnkXqHLIjsW4CSIz2gc+Bza40+wkWz6NQDEb3ncytDZu9vKK1CYwl7RGW4RFkAO
24j3FWZvZp8ETPLNRVy64BhZzHY3uOxbYreE+T6JfiIZux8X+Bh4cPJHizfhSMLLS5
25kwABzalaTD33XnjKn5wQ/DfGJ+fGbF54fMlGFjne5VTNwY1ju2ieXTgVrUyzfKPF
2696zcvnxo/MWwqcQ8+dXFCZjldP76puo1eVATEBeOCQs8Vj7eL9eN/eo+BfzhS3S8
27CfFFYWeIXQQQEQIAHRYhBNw4R0hwnSYZ/yhnIW0Mr/3bHP6QBQJb8AgDAAoJEG0M
28r/3bHP6Q/TsAnA6vTjmrX4nY3QnevNrKefWaQvf3AJ0TALTqXhTcVYVLxfzRt/Qd
29u5W2/rQvSXNtYWVsIEJvdXlhIChXb3JrKSA8aXNtYWVsLmJvdXlhQGZyZXRsaW5r
30LmNvbT6JAk4EEwEIADgWIQT4KAb9ob9bmhswFOfJ/O1spreUVAUCW/AFCwIbAwUL
31CQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ/O1spreUVKlBD/sE/eDbJtL8UKc6
32CN7zmA038RSjxlcJrMRoBoThCFKOFtBsYLPebnIkzCDiUwQJaIMYe2RNBHKKz0p+
332Kvzf7q+xq8W1e72aK1DRhsBTL8/LA1kQkvh3GwMS8z3SOcbXLWqKQuQ7ztYReQG
34wsT2/S8reVM96eV67K9vMHKMDF3NyYZewahX0I44YIbQJfLVG5elCkBrfHjGSeIt
35tSAv56BhN8J8ky+9nGx5jwWmxc/4Oquyfe9Lf0NMTCjw1xess7UoHlzSMp57yF3T
36AaqDcqD2Jdgr2meN9Yo4/Yb9dEvHFy34ppXYanX1nrHGev7YaaQWLoKLVZc3f6gR
37+D7sEJUJm3IxO041CR7DBwQ1CQkx3sa66mcHxe+wchOoXBZdsqyl5Ds+zqh6eMyO
38UiixDcXDxZuimEY0/+7XjlFjtzhGVNKsjV/Azh+Hx3GZnGHMVpTw73qQFHkWeDrX
39FPUbinjtEVTxw0fS9PkDZB5ysgAWlXs2cqoNDMcbdyJn2xszbV5+vjlmcofsQZTr
40PiX+hB6P5RQP5ogtnotvbkPDSfPfqdUk5HjGFrGX08FoP4rCromHvSL6Un2lP4I2
41mJbbQzBU/bQUGzfz6U6VEbUHtOL+7woGuXuzTYsRZ/O7/fKohyi/+qsmOozQpLFN
42k5xocbF1PgpFphrKYpHaSkf6DS2/F4hdBBARAgAdFiEE3DhHSHCdJhn/KGchbQyv
43/dsc/pAFAlvwCAQACgkQbQyv/dsc/pDXWACeKMbL/Dtifpd466TqQP8isfWedtIA
44n2xbEmlpxG8yk0w4HQ4djwgY4RbutCpJc21hZWwgQm91eWEgPGlzbWFlbC5ib3V5
45YUBub3JtYWxlc3VwLm9yZz6JAk4EEwEIADgWIQT4KAb9ob9bmhswFOfJ/O1spreU
46VAUCW/AEawIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ/O1spreUVMGJ
47EAC5hKt5NCanRxEl13nQUu4+n05tdRl9C3sTczR8EUZ30zhpBV4chKgeJSD0r1VA
48zBSQHMNzroGawaQn38qxFtbcSmkGRDd+0y798x1HFHp+UFiYOdQDQJVsyDuwjq4k
49RF7zV+FBj0ffjn5JBy6R3wLmWCFxz1mPmkImdyyS8GEeifwTftC+SSotqfg1lh0K
50C+DSQGYtPk0jLvxVPRllnjltDOSPUt9xRE785I6E9oyYrCa5Om51e0eEMzwpkl4e
51QschAYILb6SNrVyEMRD5E3lJHD2r6dPvIPFNcLxIQuK/Kdco2jNq7dCL6ukdGI40
52j/oZi7XRrlFCQW321BuipJZ/7t9JWOXOrrEndQv+hOb6PeWkwF1rigjbQq+IipdJ
53DUXGBfiIzlpJM5tLhs7BGfLxYNn09rOpkotXrdBzRO62lYyRdQepKpD33v96bQV2
540w64U44+CxuicjGDw/6no54LY4J7bM1lLGwqvHSeqgYoc+Zs9WH95TNNSmaAHGSf
55An4LpzW5nOXbq2rsWVbZpvsVHz3VmC9qmpsYl5tT/ninkLta3tN6TrYUFHXcDWz9
56K+HW+/oARzEmN8eg3iMmWtOnV59YEr/x2vvOHndguUL0tUpRjwuTunH9KOGZE0Kb
57uI3ovgLLO2kCSGk4SdXlntu/eLq9FPYqlOpjM9CtLf9JdIhdBBARAgAdFiEE3DhH
58SHCdJhn/KGchbQyv/dsc/pAFAlvwCAQACgkQbQyv/dsc/pCHCQCfdPdGx0FmknAs
59rPvjuUmuCj9Q8xUAn32dsgQYTlgfTdwLSxWGj4mTD2h6tClJc21hZWwgQm91eWEg
60PGJvdXlhQHBoYXJlLm5vcm1hbGVzdXAub3JnPokCTgQTAQgAOBYhBPgoBv2hv1ua
61GzAU58n87Wymt5RUBQJb8ASdAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJ
62EMn87Wymt5RU58QQALMGlOJzcQj/arHezum5H/PiYIpZ1yY+QMCzpSgPdwupwawW
63VN88aQRfU6k9xwmsU+Ghjreja09AuqYi/D2+61TM/Tmqi/9HdU6NRYw0hvaZnwFc
64vudFBII2XrxmU5k9PnSR6Sq4uLUGkXmvhJddV0q+cjtif+vDi5pl9mqbWBQY8d9S
655Q6ZFZPeEeASUK7Xt/tSq9iXpb1tQsmEJ94Czl5G+gNFJcqj7nlHQ1/c9XeNsvJT
66GZVLGM/cAZNzB6AC8Kz+iWUypFuXifC2PYGpJDJ8klqTmDQikGQtM1HMHda6rnwU
67L7JIfbuwGbMk65CtG2YE8QqB+/GIfkzWySenmIrldn9Vp5EKB0DD529TyOwQWgzz
68+HuVP/4QfkNRxNquWxlAPXmcNfV1SV+/Xn1KwSspb7QlAjiXXOL13J2dwYFpV+21
69vsSW5XqJXfWUU8d4YVOdq1kUTwLjWnWyxwtt8j68KSuTOT4JTA8oNXg87r0B4Fzr
706AoxCM8ePywm5IW55gNAwViTKWBAcNrcwRTP647oNOM5+8D7NZIBpnKffNc/S2S5
71iI1tmaM0yXavmCm0Hb7lkFIsxM2Y2lxwHexPck2ftPXIrjhPYLcFVBdLVx2V2yXe
72cFW2vMGZiasVobFqqp1g8htmAlTkN0cTDY7l96wDuirC6OeCbVomEgxQEd0MiF0E
73EBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/92xz+kHsv
74AJ4+zdfjTdO1FUWb42bWdPQfiFe9nACeMIRp1Iu3tNVJkfS9CGGqhrChpfu0LUlz
75bWFlbCBCb3V5YSA8aXNtYWVsLmJvdXlhLjA2QG5vcm1hbGVzdXAub3JnPokCTgQT
76AQgAOBYhBPgoBv2hv1uaGzAU58n87Wymt5RUBQJb8ASsAhsDBQsJCAcCBhUKCQgL
77AgQWAgMBAh4BAheAAAoJEMn87Wymt5RUxa8P/i7zdQ9i5BfWITbdyCgXNoQYIcE3
78J6lIa15eLUcfDcL707zOrUSbhSkthLjeqZoNRCalqjeDOdgCQC1PNoISdkMGd9PO
79VOwS3G7Pjt4FSjPVHyw9+Su57pwTcLXBhEyBAkv+tx/QrB/UBCFzPUnsl71QH51y
80T8+bNdOiBxssdgn/9IrObn7tu8xDf+d/yGsA493x+mxalai+fhd/t0yzQcdcTrvD
81EKRxAaU8wXe8oSwcW5cRmXIi+N4aEnLRO/so9YDGf4z2FQVSL0ktoZYMqZ1ZvIb0
82MNCNl2NgNXThhrAPk9Rhs+S5nRzazJ+tS+D2S728EPpRHpUE43+vewtCdu5c5NWd
83Lz88o/jxLwcNwQa2iJoFMyqr15lHt+vM7OyD9X650IJwQw24n4tF6TijzH5GhWcN
84SnB7RpLSkftQldpK/zK+tmFH4vVpv+bI3JKAfzRga+5Fu42kB5uHVzXF3qMwYgEO
85sRNL5d4xV4SATce1mb8vFpsQmGOWnZAcCaQYhLKfMl7zR5ukytTjf3hRMRH0GAjh
8606QAoBMJZhWosYehPi1odjTngIf6hFOqA5prz8Cu/AFe/8aftp9UorJOekAj2io0
87CENRv21qrN8R4bNo04aTMD6WrY+mBL8MteR0ooD3ENQEAZ6UUyZwTzUJk2UUl+5M
88ch/HgJ+rQozmRGYeiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AI
89BAAKCRBtDK/92xz+kPsmAJ4wGQ0Hly2eTVzsU8Ht4609Q5kf2wCdHGuu863a0GHv
90uUdEokzQEsumYPG0OElzbWFlbCBCb3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVy
91ZSkgPGlfYm91eWFAeWFob28uZnI+iQJOBBMBCAA4FiEE+CgG/aG/W5obMBTnyfzt
92bKa3lFQFAlvwBMkCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQyfztbKa3
93lFQTlxAAjbuDy3prdEBNMYfi/870MO5eeDOCMtiDJDae4fQjj2NANjeuDGNP659B
94/k9uS7o5nrWB7E6rdG4a1J+Qzj5I775xTP/zVbrNSchcLwSoHMMXBm2IdbIanCX0
95JX+dRg2YX6yX+6ZmL8UaWRVICQ84ZxGtYHZ8o8hMCFOuxFklNjYFEPciO9M9m+rv
96fUEihQgcBF7+x9KVntlxad61Aa9AzUJLULgY3snaZK687tHUq3yYwXpF9s1CuJ81
97SfZxH32dKqy+2cpJqwQ38BZrTUwjBxxIMR5TRC7h/O9aRIBKQZKlpLcmxWPv18i7
98DwWlrJVb2Sd2WUh+TwPNa7VQc3NjlGtu74SfZqmirE0FyuB86fnsQaF8zhJnRsqE
99lagnLoW24PCvc8A9TK95tj+0JO8DIeM49Gg+Br/NBtRB8q5q/ICJOREber6Ke+/I
100p90q5VkZafIgeuO+EkyQ6Dq+58NRqC2qEs209xnKOd6exxT+2tEzx6Hy0PKwaay3
101h8WzUamJOTqRv1WG4GmlCeRUQGx8BtdIAEMdww26cN8rmxh5Foh5CH+V75bcybkv
102yH+FBDoKFYSpEPg0axHM/e13/nujgLNnSTHuMf7ILvpwoNkkIcQwSpH17B5hZdgl
103y0xD7aIS5XU9OoP9mKs1unzUKerWQWY6CxgYOqpssyDTUG+fohuIXQQQEQIAHRYh
104BNw4R0hwnSYZ/yhnIW0Mr/3bHP6QBQJb8AgEAAoJEG0Mr/3bHP6QFPAAn3DbFqHo
105hjznqQvg15QjlGFaPJaaAJ4ps0+VWG9BN7UBQPG+fcCRwqLaVLQ0SXNtYWVsIEJv
106dXlhIChEb24ndCBjb250YWN0IG1lIHRoZXJlKSA8Ym91eWFAa3RoLnNlPokCTgQT
107AQgAOBYhBPgoBv2hv1uaGzAU58n87Wymt5RUBQJb8ATfAhsDBQsJCAcCBhUKCQgL
108AgQWAgMBAh4BAheAAAoJEMn87Wymt5RU2vAP/12b6S0yJdZ1rgNLj+ZohY36PhCm
10930/amkGPQp7HCBylYIRv+y5m4IdiqynzJoap547cFMWNsCyfyU2VKbcy1Uy44FCI
110PCUcBME95jD1JWviINDKqLhglciKlJnWUhupiolqFcr2ro+rJVc/fBMWJoBjM5fJ
1119eq1ge2LxuYKbu9cpSEtopk7ZBeo69khhrFACdZEqfJtW4qp0hEC0pAKLjN8LhpQ
112EEVcq4zejksB+1e1qkuJ6be3/Q2Sj+1ijaJBElJIVJ8qyYs9XSlTlUA1USfy3Yqu
113jOkFrIaycxYgKooFgwYfYXCniuqXWZ2geCm2IE90lanQC2w7ZDN/JGwwVuAFVi4H
114Mrx6x/yEreqy2AUMesB1eGxqQQG9cgssMLoMAN2IDDJ6FS+e0imWTTMZ6r3ou9W8
115+pFzSIT8LMnBNwp+RxrW3QzBs8sXDw5mS6WroiZMRlfJdA1sUPsrW0GV4/AFuEaK
116PhCUvIvoh6zxYR0lA/gYqtszCHGzHeNLoczOhytUZM+KQpOtO3TSING/+o59HHuM
117niD6k3mWcyk6MkSgIXquJRGUVGVFeLGlXXf7aWEkIOrXeqjBZpBchZUIxZfkg100
118xxmEgNVGG4vxB/UIGeVqV2S4JscJmCyDGs130nRp7Qp5YGfkaTLKyOdutssrqatP
119m5Zcjl2VGr4Xt4uXiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AI
120BAAKCRBtDK/92xz+kEViAJ9zBTPNNTYIxPxt8BEvb3pUDeZkiQCffsDGKi7kdlTj
121oZ26K7yxdjexaYS0OUlzbWFlbCBCb3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVy
122ZSkgPGJvdXlhQG1lY2gua3RoLnNlPokCTgQTAQgAOBYhBPgoBv2hv1uaGzAU58n8
1237Wymt5RUBQJb8ATwAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEMn87Wym
124t5RUIzgP/0/7+y7UOgj4Yja6Lwa+Lm7ESRZnbVmR1ERSAa9RKKr8BbPT4KhgwN2R
125x8c3CedFupS02sG1G57u+4qQbEeZylaMu6rusf/XyQ+esh06cRXfR7Vb2d14yFQg
126xun9PgPR7jL0RiU2fsgvF6O+u9KwnGRmABZXILDBxzGZBXKBIkmqBM8+rBkXFVWc
127gezZqD106KcuGewciuWM7bfyLj+2yV9GhvX8iRyptgkx9/CNEdOqQzKYEbXVTSkh
128tUW4QUmNnIiTnD/pZ4kr3UsQV6y0GC1kf9G5EeQHbD+kVROFM0/sX6qGn99IeC+j
12996MflMnKuXJeXjlxNFZIYPoolBAC7CvpRfdky5q0KB2xWh+x2jQbn3fPpa6lVZdQ
130De14guXdcEsj1QVUMRL3wFCDwHIsi3gqOpCHdy5GmunFRNqUWmoGU+uHt3Kk031w
131DJdQY4YP+8tFWLPG3vKoPSf5EcG2Mf0hZiWiiIAX8sVw13W+oDlAQ0HKah/uxV77
132gM2ScBiiiOr92JIf3ftq2AjMuzrGhpKME/wG2DdcOqmq7U+tcVbambSc7SVa5nTM
133JXm8ZPOSH0Fax1PULPd3pyLLhfF0rnPiDLcVa6UzG1MaSJiGBurIf3D3OCHRjQQ6
134kVpF9VtXhWeziV8wkyt66HNcuqUs6HDBNkpxPTNacKcZmW8J/FlaiF0EEBECAB0W
135IQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/92xz+kKOiAJ4shO9b
136nZ2Nx9XzBBg4C0nUl05LyQCbBpk7t2NIPMKaNtjsPb+RV5HbiQa0O0lzbWFlbCBC
137b3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVyZSkgPGlzbWFlbC5ib3V5YUBlbnMu
138ZnI+iQJOBBMBCAA4FiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvwBZYCGwMFCwkI
139BwIGFQoJCAsCBBYCAwECHgECF4AACgkQyfztbKa3lFRK1w//cqsweiuXGPepyn0t
140AL/S/scM6r9IwcjD3HrZqmUNSDAqU6PJ0FFialOPuSQIyEvrpY1GL+TiVtnYyAit
141sbotxNxNQFwiBvqchg6xd1ftpjJihuo7RysNdSNAnlOxFlEz9X+EGkRqq8rCTpoS
142GA9+4uFyFKzfv9CDg7YUVX5GVsE3bsPWymfCW1boW0TQyL7xNrDPfzKpVRHFu7hi
1435OghiTbHbifmIolj5Mo0hGuXxz26gFzrufCjgxK9ycW7LnHEnnK0zX8Qfueir8RV
144EisuAXtKILgS5mmOj0ywsrva4Qtf5JW5SKymhgsKCWskfz0lq6S6ceIKaYBr4Syk
1450MLI82M0zDfGlLuRP6yQ3DTiTC4lWfXHdjyd0w4SwcuAQPCWz34gtUEGfMTyrd6O
146le6pYreL1NPzd/NakYsR1H1fsXVJkgpESktoDIkzooLmBV6Pjr+PEt4DvPZYqgKl
147AyD+aZeZ5HlTZCLbN9O38nDttWdAvsGjq82qvNI8A/d2Vvz4L1ND6NT71+wtC2QT
148a95epSBD64l/JtK99SW/HjLjyvV9O+Nu2p8ESTOEaQhyIudnWYU+er+Vwy7YtLvY
149y8L9/Xu9KvlBMjHBXAAV047KwkIQNrNyoTla5yQFSpv57hFYbx5CKTprpsl9Ic4v
150uPjC/GMgkAJ3yTwIgxa47hgUAtKIXQQQEQIAHRYhBNw4R0hwnSYZ/yhnIW0Mr/3b
151HP6QBQJb8AgEAAoJEG0Mr/3bHP6QyCcAnRuTQIMOpwxbyzjj+t0C9GdNJYmGAJ9v
1525c5kvNCFiJAFCbUD4OxJBNA28rQ9SXNtYWVsIEJvdXlhIChEb24ndCBjb250YWN0
153IG1lIHRoZXJlKSA8Ym91eWFAbWF0aC5qdXNzaWV1LmZyPokCTgQTAQgAOBYhBPgo
154Bv2hv1uaGzAU58n87Wymt5RUBQJb8AW0AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4B
155AheAAAoJEMn87Wymt5RUaT8P/2OvKAfgqu0zQX0JhKu/wd9AATVmLa8C48JPQMUn
1565Z9dQyDcFyKKfKbGCz9B5jTOrzHNX0VJfpDujOTiPIk6ci0KqAJ3Fz0gdpxIcEoW
157B2zg0nwDtGHsGMX8togpcbVgKqblp0XSsMAFV2FN5PsAnxkqdXPDmZ5iZSgs9roi
1589nxHPavbcr1cSAjsiRoFxFudzo7Q0Z/KLRlTuTSAX6B+vRAeyRB4NcXThKYZlAi6
159cr+xXTvPFddiQZgVBT+ICZRQY0gwgHpQcj70fNx1w6tTHfThlxInojKGlreOZov9
160A4TVeex/QagVTsjRAQuZ9yLMkx7JxakAxBPZ/OHuv7/K1Qdx90AJ8zQZ6uOXpUNl
161c2MDEBoTI/nbsgMeHI/Mj4ndxCBUMperZ1oCITl+AhaqEZ+LxTKyne41YJedlqjc
1625xnUVigz4ajmZPYmbO6eRDxisx4fMG7hI2HnNWak2xBDVOp1z2aqZY0xsG7o697d
163I9BeR9JxbIusx0Szq6GabwI5beEI1xLlT333Fe3XDtT0NIQQvW9byuYuyfp7H6Xm
164hFj2ut7jVI9xG932sJ8ioRJGCK1UcGYEL0ei4YZRv+mVysEJFjki2nlxspnG4C/V
165Q20jXnLAXOpKLiStkNJ15WsnzeoL4eq0AUOYMMmYKAquXXgpVs+xUDv6XathWA2v
166oZkAiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/9
1672xz+kEBpAJ4x7hASmdnDcyFGTyuRHj6NwsDtNwCfRVfqoiRcGmvDRA8U25cPk5XT
168ZYTRzlXOUwEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQEASABIAAD/2wBD
169AAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcp
170LDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
171MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACMAG4D
172AREAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAABgcEBQACAwEI/8QAQhAAAQIE
173BAIGBgYIBwEAAAAAAQIDAAQFEQYSITFBURMUImFxsQcjMoGRwUJDUmJjchUlNTaC
174odHwFiYzc4OS4bL/xAAZAQADAQEBAAAAAAAAAAAAAAAAAQIDBAX/xAAgEQEBAAID
175AQEBAQEBAAAAAAAAAQIRAyExQRJREyIy/9oADAMBAAIRAxEAPwB2JHaECEjiPGA4
1766GA3kMMgDy8AZAGQAp8XD/Nc5+VP/wAiJT9GeBv3e/5VQ4cEu8M3sAZAGQBFT7Qh
177JSOUBt4DZYww8O0AeQB5cc4AgzNXk5dfRh1Dj1r9Ghab/wAzpE3KQFdiSotTGIph
1784trQFpAFyDwtwjO8mqqYbHeByDQNCD61R0jTGyzcTrQmigyAMsYAyxgCtTNt5hqI
179SUnrKOYgN06yjnCVtnWUc4BtyenmWGVuurSlttJUpR2AGpMGyKbEHpZm3ulapLSW
180GTcIdWm6yOZ1sIj92q0Cf8UVp2Y6b9IOIVtZkkD366xOzkjujFc83mROKZcCjc9M
181kE/1hbV+Yq1VhC3TkUEKvcWNxE6UY3o4xKpueVIuKGRaSoWO5GsXhdXSM59Nhucb
182cbStJFlAEeEa7Q26yj7UPdJ71pv7Qhboedab+0Iexsu2p2ZuD0sJltZom5gkEuaQ
183jldxMPkZuk0gW2E05cetgIvfSJihZY/RcvODKpXr0NntKA4HkCeHdEWrkLBc67fK
184EoF+Khc/CEuMYZn5tYyMFwX0KQRbwtCtkXMbUk4eqBKgpC9eYN4n9xf+Vczh+fYv
185maUoDUHlD/cF47EmlTz0hPtFalsrQsdoGxtx1hs7DpolaTO5JZl7sdHmZPNKbAjx
186Fx7jFY34ys+rcl4/XGL0jbVQmODpgsG2JD/F1UVIVqmRKgcT8YbNcy8qOrqO/ZiL
1876uRLTKAU8WGloF/A3WpgUqjTc8gjOy0Si+2bYQr1C9pAzM469NOuKdUpxxRN766x
188LUXYWw6mYbEw+m9zpeMc8/kdPHh/THp9LaYQAlCR4CMvXRNLASSCbqSOUGha0ekW
189ym2QW8INBRVbCkjUJJ1BbCHCLpcA1SeBiscrEZ4ygLD1XmaFXUNzCypcutSSgnTX
190Q2jbf2OTLH5TvkHGpuVbfTey0hWpvvHRjdxzWdrJiXSraHRi1cZQlVjDhUFGqNgX
191zDaCxAtpjgepRcHFMQvHxaNIzUoG30YF/Cl9JM0sYVW2nNZb6EqI5an5ROXgw9LX
192DEiieniVpBCNLGMuTLUdPHNmzTpdEu2lKUgJHARzW9uqToQy1iBDhpRtaKJ4bFO0
193A+oTygLxKiXxS2WMSqWNFGyzaN8L/wAuXlnY9whWn2qX0SyS2k3bJ5co14/45uXX
194pjYYnOvpcUdcpt/KNazxaVWotys8W1HWwMBX0s0yM8sWyDbTtCK2z0ZNBys0INPO
195thwIsRmEQ0x8XLEzLimhBfazBNvaEJfwtMeU0PYXnCVIOSzicqrm4MK+Fj6XeBmg
1963LuuH2s9o5+V2cRgsz7DashKlHiEi8YadMqwYr9NS4lourSs8FIMVoerxDzTiLg7
197xW4WkWZqkhK9mYm2m1HYKO8IIipyXmFXYeQsDkYiztW+iwxmwheJAyDYrQlV78yY
19834/HNy+jOkUZCqQyEzLbRCbZSNY6OOfXHyW0Y4TXK0lp1ExNt3Uq4+EXU49K3Eja
199ahVS/LTSMmQJhwspuhRc20nUz7dvGIDZmYbWq6ZtKtDteAK1AeW0XElwoG6glRA9
2008JfTkp7MhSOnGoI3MTlLpWNm44YdkhKiYlr3UHLE8zaObO7jswx1dLadROyqkplz
201kSsi6xwiJZb231Z4i081l0zJnnAgIUOg49IL8deWusVlMNdFj/pvsZ0guO0txbg9
202Yi4FuNoz1dKvoPrM1WOtN9Tlm3hm7YNiUjgf75ReEx13U5/rf/MWtPdmzNOMvNhS
203Uq7DgTa45wrZL0NWzsP4ukutYokg3bpFNpzC17gE8PCNuPxy8vq1ammGWg31lQt9
204wxvjLI5rd1IYdMySJdb7pG/RsqV8orsumrs0GHC286+2sbpUyoHygLcQQhpSkHKk
205gnlFMqaOHZdkUI2Zb9k/RETV4+L2ntNijpSEJtk2AhxfwAzbTIdc9UjQn6IgjOg8
206ASlaW1fTQ352J1jhynseljd2X+ixltuYbGZIULcYjTqk6Y9KtMsKUEITpuBBelad
2076SvNT1FI02EOeM/XPqMu+c/RpUR3awo0+OqZZtkWQkCFpNnSfhuiSk3PzFYdZSp6
208XXkaWe5JGngSfjHXwzp53PQfOPFM1Mg7dKoD4x0uQZejxZWzM34OfKFVYIGMr/pw
209AH6seZhxOXoClnCpSQf71gSbmHf2D/CYmrx8XdO/Y6b75YIv4AZ0WcdP3j5xTOl7
210UOtMYkPS3U0U5m1HdQO49x090cvLjJt18Wdup/BfSpglsDhHNvT0ML0ytTWVlCm5
211hKXG1ZshTmze6FO7s8spEalVqeZQ+2uUzIOqFIQRvwsdovxHqdKz6lqz5wHL9pGX
212KbRF3LtpLPE1+ZyIzngLxU7RnlqC7CssZfDDeY3W6OkV4nWO3jx1HmZ5fqlhU05a
213g+k8XFecbRz0aejtIS3M2+2PKFkrBExgi9bB/DHmYIWfpdygs4k+ECThw5rQP4TC
214q8fF1TtaQm/2YS/gAqH+o9+Y+cUyoWxNklaVIzJSi/WVoJ2Psgxjyzrpvw3vtrSZ
2154XzZzkWNDyMcWUehhk7Lpk7Jzhf6wtTLlipIAKx/FBLNaaY49rlpMsWdVzpNtgtO
216/wAItprP+xBNPmUTInFzDnQJUAlpdlFPffv5RGV+M8vfXs9N5gWxYlZypHO8XxY7
217sjDlz1jaaVDFsPsDk2PKO5wTwqKwgmpPH8Q+cWxo09HySG5m/wBseULJeCNjAE1Z
218On0PmYIMi8ZFn0i0NmbeGz+oB+U+cTWmPi6p6gqlAjbLCXPC2xDPJpsnOTa05g1m
219OUfSN9BDt0zk3dF+1XprF9BmGX5Zlhlp3MwpBJUVW1uT7o5+XPVjq4uP1UyFWXIu
220dXfAQ6g+0rYjmIzuP67jWZfnqmXR6tIz8olsrvbTX+sYXCyujDOWLhFNkmLv5la8
221OkNoeulb0HazX2ULLSVZGxcbjwiphazyzkQKMtycfdnHgRlA6FJ5Hj746+HCTtwc
222/JbdHNQ1ZqAyfwx5RpU4+FnUtZ5/T6xXnF7ZaGGBT6t8Wt2h5Qsl4oWK1XrOX8MH
223+ZggsLmUN3UlXdDZG5hz9hC3IxFaY+Leln9Tp/LAv4RnpEqahUxIJPqkErcAO5US
224Nfd5wqWE+oWFZNtmTYlEG6bE35m+scXLv9Xbv4pNPK9hhbt1JbVobpUOELDPR54b
225DDTlTo7pBbK0g7jjGu8cmWssVpMY3qEzLpl0srFhYgA3I+EKYRV5MrHeh0KerlVQ
226/UG1NSvtKSrQqHL3w8spjOk443K9iOj1aVqU3PBgpSQuyUfdT2QR3aCOnj6mnLyz
227vZyUD93mf9sRVGPhbz6gZ18X+tV5xWmWxfgdeZDwtqFfKFkvFVYxWUV5JHFr5wQZ
228eoLHo+m21AmbR/1/9hbT+aNqVTHKdTjLqWFGxFwIVVjNRS1fGdOwpTTJqUJufCbB
229hs6A/ePDw3hKkIGqzj9QemZ15RW46orUfE/KBUTqDVxITjZevkvfSMuTj/U6bcef
2305vZryjrM3LocQpK0LFwRqDHJZ/XXL9jSYpjDuvRI8csJSKaWhBu20gHnYQi1GPI6
231tJulBAWoGyu+KhXwmqa9N0esKbKih9lw5rbf2fIx3Y3fccOWPyvqHB861UsKyr7S
232hZaMqkj6KhoR/fdFbZya6QH8DtPPrdM04CtRVaw4xX6R+FrQ6EmilwJeU4Fm/agt
2332cx0gV3DT1WqImEzCUAIy2y34wbFxBLWO6iUlSsgA3JhaR+rVZW/SJVJ1gyss6WE
234EWWtGi1DlfgPCE0k/oEecU4sklVz3wKQ7WcUyq2VYJT8x84DaS4DjRaX7aNP/YAJ
235sK4lVRpoSk8SZN09le/Rq5+HMRjycf67nrbj5Pz1fDWllNzDCXEKStChdKkm4UOY
236jm18rp3/AB4tnXQQtK2qag2S6G+65gKlJWQhzFs84kdkry+8C0dfF/5cvJ6JMO4w
237qeHWnGpZ31CiFKbUnMkm1r24HbaNWFgrlPSS/NKQkvNt3PaJJ0hzSLL8HWHKoupv
238qzPBxNgRlMOyQsbbe0bEdZnqbUQ1LrbyFN+2qx3hyDLLVJWamweyDoNkxC5jpXrW
239V7QG4lRO1r84DR5hpbqUqSrK4ghST3/0gPTmhwOuIeQLH2VjlASUUh1JSRfXUQGn
240UrGUzhR9ptbinZZau00o3FufcfD+cRlhMl48lxNuk12RrcqJiTdC08Qd0+Mc2WNl
2411XVjlMpuK/EU+mlyz02QCVdlNzbW0TMbbpWVkm6S70+/1t0hpokqvmNySd47ccZJ
242pw223bnKTU4mdbadc6Rp0ELSRsddRDSnq6RhwkXAuFAwGJsLYvn8NzqX2CHWFH1j
243K9ljuPA98BWbG9dqTGJ52Vnqcq7a2LqSrQoObVJ74ueMMuqVSlG+u8Q6HNSiIA8J
244SdYA8NucAQVlUrNlxKFKbXbOEi5B52hBKXMC3qknMRuRDCKqX6W/SDPffNxgDrTl
245zNImumkHXGuYQsix7v6QrJfTls8XFYxBO10s9YASptOWw0BPFXjE44TGqz5LlNVT
246mXGc+MWh6ZZKilRSCU8YA7FG45jSAMaJSgDkbQBd0SsPUxbuUZkKHsnnzh70jLHa
247qHHxiVtV6JvDDjt8YA3ygI4wBrlGf3QBsEjLtAbLDlAG6QIQcrdpR5GGTpYWvAGx
248FlECAPLa35QBooBPSW4C8ASZXVRvyhlX/9mJAk4EEwEIADgWIQT4KAb9ob9bmhsw
249FOfJ/O1spreUVAUCW/AHrgIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ
250/O1spreUVJ4nD/9tGS8cg2eUSwd0ExCl0dWsJRdM0mUYh17mXyVNLcvbglIkSdma
251v/Ty3ke533izRN/SkkU8vNthjKAohZmmXlaXrruEyHq2vfXcDg4+C7FJQ+O3PT2B
252S5ft3Ht2GmRpD2lWpeUlJ9BXF2EF5pSnHPOrlTHRUfjBCDU4uuSeKgioSyoc2iWb
253BBaSXyeQAUR+ppM1AYKUlCDxpLbe3nVCOUc+JgJzv+47EqwMyVODwzk7oFO4GMRm
254KTKlctb1ym75oV1tiZi2fL/KA2uAab/RMO0rfxa9HVWnJGvUEDMPlTfs7222zuLB
25555Fzllfx5rQlou+MLBQIV978HRZrDxZesQOOJ4/BwTPgQ42GREf+uf5/SG4Fn3Qh
256NZsvoaePMLN/QQEjM7eqOUzRJRVcdJfRH+LinIFrAqcmbbcp1bvq8LV5lbmlFJLF
257gimvW/shf/6Zu1YsfBhvLWInUCyoOPFa1tASF6qqi1hEOd8tQgNE/H/FSIehmTHT
25874kYPNRm+DzlvrW2JPVl24Nf/SWbOG/IzGBY/pDActTwYqnpXKR7eUt/YcPpmrPi
259kyIKX32U2vTBCE3yvCm0KRzrcSbTJGfVgmlxxqIuOtbeaBtf96m+o5z/xw9ro7Ek
260VZbsx6fPuWuLY/MqeLXl1EuiU6X1sr+skDY8lJeeiRt+Uq5mCZuEgWdM1IhdBBAR
261AgAdFiEE3DhHSHCdJhn/KGchbQyv/dsc/pAFAlvwCAQACgkQbQyv/dsc/pABQACf
262YaUOqzlafrzeGdwHwDleootu0UcAn2adbaKJ79QBtDVPkR77zV801JlXuQINBFvw
263A+gBEACt8AiUTMcyNXwN6kiOLPd+85IPlLwEVyofz8p2QBAxJsqKozlXXpnK7ahC
264RSiHt02EK39WiyZpeY1/2dGmdvyI1vc7ld3814Dveh4nf1GRSpDZ427cxayaclh+
265wRQ8nDWFOQUsMB3He/Z+aO6l/ZNvdVdzRUHda1XvN41nwXUL9FQUn/TLYgHbxa7P
266Yy18ZnNzH/xGSwDgRrqPEAZ8KOpbHEbNyYuYuv6IM8Xmbp8Q6bl2RyBNnrlphksJ
267kLvO6RLHUvvw5uX5bt+u3umoZ+yHUkP13NtQHTyZ8VTCQimkB6OisisOTnV8OjLG
268xtLEF/TjeGFAAoEnc8bQAPvrtONQL19rPkMB0gXYXPBbGw7eWYr3QpuOujUXcz9U
2690JSSEov7cUepdTY8LEYFw8U5WimKY6f/uJUVx/ukNPtuAljJji0cjIGEOX2XGlBV
270Ix/U3vywLBfUFW5hT+75z7UB3yG3Zexo0WSaQxxZ5PHxyPYBK1PvVkH0LvkbxJcr
271rouJJQ66chjRglUbv4lf85/cG1ZLu3Ds0UbuD0gE9sAEwXtfdgDmp/HB7mxwJr1O
272BRbTRv0Okx/lovWXkxt+hX+DXZ1u1qdZUW3zjmge8W7xag3epD21jIjFDODgUfDT
273fgJi2FQq+szpagfPN5j5aIQKHCZf0DLbBD+ZWYQdld5JZs2V5QARAQABiQI2BBgB
274CAAgFiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvwA+gCGwwACgkQyfztbKa3lFTa
275yxAAxQo/9dvOO74J+9XznCYb5iO1B1ksnVegSGVuId45JKXkCkuWvDOkcU8+ma38
276wo3MBoPLpSMCXc/mKQ0p0ntO1tD/Wf4nBBCvseWcsR6RR5Su5jYorm0qZ89IOEPN
277K2W2Z41X6DHyteB1dAyIyexOYoLKD7iWcQzga4/EoUPEwcr8BWWgGLBfRhXsYySz
278F3fQPS7KaemDLGbJfTDZCSqmsZPnlksSvGxEBwUwfCjfY+QHxzWPRFPkuQJJR6YW
279tiZ3z7jBRdRk/R5v2CJZJuGHcPPYQy6j2TYGONojm+ifaq1hz+A0aoy4P9qRW5Nl
280mm6yiqEoJe07DrMLxn3H3ucuOo7DiNWmkkjW8DfhFSd+3pFMSvKGujOJWN27UDEp
281ERWFX50gE15Sq4aPbMPNRejFQ1n75B4jfFQXg6WuwF3kwgHK3Y5T5vTEkbPgce9c
282SyyFWU7EA4DJGnt7/FoaPDTKOWI9WSkmjOSABTBNSaUiMSFA3Wg/T0aS5pETpkv2
283S/GVVX022orAGK8zEY1vr2a24itOAKpQwFRuMjqDCBVgKAsMtlPu8jv3Zm/AMcYM
284sRRnDWJh2TO8bqXXUG/o783fcTE3d1Ff7s4BfmBqpGHigZeehNvu+FshRDYaDrDN
285IS0fTqbsX/JjaCXwU/o2E6G4aE79Ut/IMsCYzItTDh2UmcS5Ag0EW/G8wgEQALBi
2862/A7Ev/92mYi4Gm//IJEKjm2Vc3NcX5LdSyPwdSLlHSRwvzZz7M0VeflcTYqssto
287VPVf4maDtLGbQJn43CLqjvIW/C6jzjfvoZf0gbHpNfKY1ENs5xgE0wd3ZdsqpQC6
288W9Pu+kN31QS9+RUKwiG2bNBIREChL/omqiLhNu3hDbZnB+uSByOk901XVrNmKa8G
289NzXSfJSCt0gP7XU6VpMqjxppA8Y2Vo7jnylbrgVJriTt6jtjDylBBQqmHSOXMT+q
2909kIWDSocKhSFHBMO6LYnAwbMef2kqio5zaKzZAuwis0zjOqKHwW54xL2T7djFav9
291VlgcAYN105iMLUiIl39HLeZnS5pUESOXRUv/qLwiQRvBlWBPIep3+ycM2eK8r5a1
2925EwCgN2nSl3KYjzTOisCmK1nQs+gQ1RMraeBGYEG0uIUvDxfoONTuYkM3dhWq2Xx
293V/OO6yUkfyOlBGUREe1PXAOsP0LtAFJha7kbh7Eg6GGU7gRYh2dG2Ln6Vmx1ldbS
294F3woFYPGNMsQmgEKxwyjKaq0Qhd/sKHrTpPz8PXfGP4dHegExKegS7Yof1VrKBB+
295L8Q8o1Oi8JPCjRp47iga5OYS1Vn3h5a07ajzSAxPsmF0lmF4tYk2MFxSs403ShiE
296BTjN4t6rjmnoQV/b+CuhpmvzxaYr736/jkY7s0I5ABEBAAGJBGwEGAEIACAWIQT4
297KAb9ob9bmhswFOfJ/O1spreUVAUCW/G8wgIbAgJACRDJ/O1spreUVMF0IAQZAQgA
298HRYhBB2wOl45wX3kd77c+/0dTvV/qVkCBQJb8bzCAAoJEP0dTvV/qVkC3tUP/2rR
299VDaSPj9+UYJtHGDfQmYCEqxROm5wGCJbNrUQspLeL8+XrsaUDh1ldNAQtoDqGjRp
300kwjJAS0OZfvCv7pI052NK/KVGaK5Tj2+0lxTAcGbAKoH8E2HWPlERpU9CRLvzvDE
3014GGxw2nw7aobNGbf9d98c9RpZuAul92BOClnpGEU4VzjKUk9IsSjZQVJnggQujxL
302qWWiwfGwVsj2PdgPao/P48cYNl5CACBgY19AAh7WzgJVz/6je/5NLdAAV+E31qSE
303EaZsvTBqrMOtH6iTn1GpJ73FsJ0BYVt9X99bRT0Vi0iWulBuhYfZG4PdCY6fv6uC
304d+6pAC+Y/M9npaLbBHscSlJheTyvfuB7bzYBY+Q87VHSOMuNni7U08FuiILFoF+e
305/ESU/v0Hde44ghiXKSaFO8djxc874KM9UlGWvw9UbmI8Z2uM0kDcrPZ/8tcjXOhp
306PEBib54ab4tKCUCtOmsF9ZiT0hOqYdP9bXW+6OGfCignJ7ABhPpANfx2Sn/28L9l
307PbF1nA5CkHdyo/ku1Z/lNq44yvrB8r0Ljq6s3KS69dUZqqrADeogOdi0/TrghtKU
308DERWGmQagYSzMIvsXoAI56MxXFLriSObmpFLTWq7cr/+Ju3AcaSkrpDSYi3U6vLL
3098NuXPhul1S/+yPwvX6Mk1Zkip9/Wg4SQeiT2R7xj8zMP/RJ8uKbnKpOftY89Kv0Y
310FZ4hE3FeBR3UJvkuPdQYNLQRluzh63Bzc4ClSxB9Ma7fmAEiuFtgEi4HLTMBDOHO
311uVMuWYcgubu9VBlAGLJ++gnKxCAJXEntuB49il8MjMsy+uv/cFCjPG9z/1pmWYrE
312XBNA+vcaOrNTS2IykAbqybcPYbBcN47bm+A4i5yqiahk0q++j4LOW/nf88xXO7xI
313V/4vQgemh7RHgHJOkKfzOPw/Kx3UjV1jA9gEUrusHE4R3Upxh0ZeQW19hUnVlao1
314TxxKEUryrRzckuRfc5ziMWNyJaZsPMkeBEhyY/CizDFPrsSXIAijfu8KFnxCsnaM
315ylFBWOu5FwsKMDXxu0QdwqpL2CM8p+q12z1VruNjpIc8bAc0/YMndjYnxzsqQEMV
316GQIDKWqh/m6v7sqbn65ZQcVAzSAriGcQxCOIoT/TA/J+/4BSk5c8TKlqT8NBT77B
317Z70vMr41mZus1A/ciI8AxgbYwlhuvTehdm74k/c7NSzTxeG3OumTlBR1I18C4AIi
318y4iM3O4H4jvEssWBUzpm3VJG0NvcN/M4YVZHX5yxWQuIFcghzb7sLYddmRvR9B0M
319Xowot//r/sgn43xv54sIvwe9MkCCU6j7ePYUlOUnn+vQ5i7rFN/UPub3V3toI2gg
320DRuKdymWEii1jA9KlmheLTFr
321=r9L+
322-----END PGP PUBLIC KEY BLOCK-----
diff --git a/systems/zoldene/base.nix b/systems/zoldene/base.nix
new file mode 100644
index 0000000..8ca5d52
--- /dev/null
+++ b/systems/zoldene/base.nix
@@ -0,0 +1,122 @@
1{ name, config, lib, pkgs, secrets, ... }:
2let
3 # udev rules to be able to boot from qemu in a rescue
4 udev-qemu-rules =
5 let disks = config.disko.devices.disk;
6 in builtins.concatStringsSep "\n" (lib.imap1 (i: d: ''
7 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}"
8 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}"
9 '') (builtins.attrNames disks));
10in
11{
12 services.openssh = {
13 settings.KbdInteractiveAuthentication = false;
14 hostKeys = [
15 {
16 path = "/persist/zpool/etc/ssh/ssh_host_ed25519_key";
17 type = "ed25519";
18 }
19 {
20 path = "/persist/zpool/etc/ssh/ssh_host_rsa_key";
21 type = "rsa";
22 bits = 4096;
23 }
24 ];
25 };
26
27 system.stateVersion = "23.05";
28
29 # Useful when booting from qemu in rescue
30 console = {
31 earlySetup = true;
32 keyMap = "fr";
33 };
34
35 services.udev.extraRules = udev-qemu-rules;
36 fileSystems."/persist/zfast".neededForBoot = true;
37 boot = {
38 zfs.forceImportAll = true; # needed for the first boot after
39 # install, because nixos-anywhere
40 # doesn't export filesystems properly
41 # after install (only affects fs not
42 # needed for boot, see fsNeededForBoot
43 # in nixos/lib/utils.nix
44 kernelParams = [ "boot.shell_on_fail" ];
45 loader.grub.devices = [
46 config.disko.devices.disk.sda.device
47 config.disko.devices.disk.sdb.device
48 ];
49 extraModulePackages = [ ];
50 kernelModules = [ "kvm-intel" ];
51 supportedFilesystems = [ "zfs" ];
52 kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
53 initrd = {
54 postDeviceCommands = lib.mkAfter ''
55 zfs rollback -r zfast/root@blank
56 '';
57 services.udev.rules = udev-qemu-rules;
58 availableKernelModules = [ "e1000e" "ahci" "sd_mod" ];
59 network = {
60 enable = true;
61 postCommands = "echo 'cryptsetup-askpass' >> /root/.profile";
62 flushBeforeStage2 = true;
63 ssh = {
64 enable = true;
65 port = 2222;
66 authorizedKeys = config.users.extraUsers.root.openssh.authorizedKeys.keys;
67 hostKeys = [
68 "/boot/initrdSecrets/ssh_host_rsa_key"
69 "/boot/initrdSecrets/ssh_host_ed25519_key"
70 ];
71 };
72 };
73 };
74 };
75 networking = {
76 hostId = "6251d3d5";
77 firewall.enable = false;
78 firewall.allowedUDPPorts = [ 43484 ];
79 # needed for initrd proper network setup too
80 useDHCP = lib.mkDefault true;
81
82 wireguard.interfaces.wg0 = {
83 generatePrivateKeyFile = true;
84 privateKeyFile = "/persist/zpool/etc/wireguard/wg0";
85 #presharedKeyFile = config.secrets.fullPaths."wireguard/preshared_key";
86 listenPort = 43484;
87
88 ips = [
89 "192.168.1.25/24"
90 ];
91 peers = [
92 ];
93 };
94 };
95
96 powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
97 hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
98 hardware.enableRedistributableFirmware = lib.mkDefault true;
99 system.activationScripts.createDatasets = {
100 deps = [ ];
101 text = ''
102 PATH=${pkgs.zfs}/bin:$PATH
103 '' + builtins.concatStringsSep "\n" (lib.mapAttrsToList (name: c: ''
104 if ! zfs list "${c._parent.name}/${name}" 2>/dev/null >/dev/null; then
105 ${c._create { zpool = c._parent.name; }}
106 fi
107 '') (config.disko.devices.zpool.zfast.datasets // config.disko.devices.zpool.zpool.datasets));
108 };
109
110 secrets.keys."wireguard/preshared_key/eldiron" = {
111 permissions = "0400";
112 user = "root";
113 group = "root";
114 text = let
115 key = builtins.concatStringsSep "_" (builtins.sort builtins.lessThan [ name "eldiron" ]);
116 in
117 "{{ .wireguard.preshared_keys.${key} }}";
118 };
119 secrets.decryptKey = "/persist/zpool/etc/ssh/ssh_host_ed25519_key";
120 # ssh-keyscan zoldene | nix-shell -p ssh-to-age --run ssh-to-age
121 secrets.ageKeys = [ "age1rqr7qdpjm8fy9nf3x07fa824v87n40g0ljrgdysuayuklnvhcynq4c8en8" ];
122}
diff --git a/systems/zoldene/disko.nix b/systems/zoldene/disko.nix
new file mode 100644
index 0000000..7df5697
--- /dev/null
+++ b/systems/zoldene/disko.nix
@@ -0,0 +1,87 @@
1{ cryptKeyFile, ... }: {
2 disko.devices = let
3 zpoolDatasets = {
4 "root" = { type = "zfs_fs"; options.mountpoint = "none"; };
5 "root/persist" = { type = "zfs_fs"; mountpoint = "/persist/zpool"; options.mountpoint = "legacy"; };
6 };
7 zfastDatasets = {
8 "root" = { type = "zfs_fs"; mountpoint = "/"; options.mountpoint = "legacy"; postCreateHook = "zfs snapshot zfast/root@blank"; };
9 "root/nix" = { type = "zfs_fs"; mountpoint = "/nix"; options.mountpoint = "legacy"; };
10 "root/persist" = { type = "zfs_fs"; mountpoint = "/persist/zfast"; options.mountpoint = "legacy"; };
11 "root/persist/var" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var"; options.mountpoint = "legacy"; };
12 "root/persist/var/lib" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib"; options.mountpoint = "legacy"; };
13 };
14 in {
15 disk = {
16 sda = {
17 type = "disk";
18 device = "/dev/disk/by-id/ata-SAMSUNG_MZ7LM480HCHP-00003_S1YJNYAG700613";
19 content = {
20 type = "table";
21 format = "gpt";
22 partitions = [
23 { start = "2GiB"; end = "-8GiB"; name = "ssdLuksA"; content = { type = "luks"; name = "ssdA"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zfast"; }; }; }
24 { start = "-8GiB"; end = "-2MiB"; name = "swapA"; flags = [ "swap" ]; content = { type = "swap"; }; }
25 { start = "2048s"; end = "4095s"; name = "ssdGrubA"; flags = [ "bios_grub" ]; }
26 { start = "4096s"; end = "2GiB"; name = "ssdBootA"; content = { type = "filesystem"; format = "ext4"; mountpoint = "/boot"; }; }
27 ];
28 };
29 };
30 sdb = {
31 type = "disk";
32 device = "/dev/disk/by-id/ata-SAMSUNG_MZ7LM480HCHP-00003_S1YJNYAG700682";
33 content = {
34 type = "table";
35 format = "gpt";
36 partitions = [
37 { start = "2GiB"; end = "-8GiB"; name = "ssdLuksB"; content = { type = "luks"; name = "ssdB"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zfast"; }; }; }
38 { start = "-8GiB"; end = "-2MiB"; name = "swapB"; flags = [ "swap" ]; content = { type = "swap"; }; }
39 { start = "2048s"; end = "4095s"; name = "ssdGrubB"; flags = [ "bios_grub" ]; }
40 #{ start = "4096s"; end = "2GiB"; name = "ssdBootB"; content = { type = "filesystem"; format = "ext4"; }; } # non monté
41 ];
42 };
43 };
44 sdc = {
45 type = "disk";
46 device = "/dev/disk/by-id/ata-ST4000NM0245-1Z2107_ZC110SY1";
47 content = {
48 type = "table";
49 format = "gpt";
50 partitions = [
51 { start = "2048s"; end = "-34s"; name = "hddLuksA"; content = { type = "luks"; name = "bigA"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zpool"; }; }; }
52 ];
53 };
54 };
55 sdd = {
56 type = "disk";
57 device = "/dev/disk/by-id/ata-ST4000NM0245-1Z2107_ZC110YXX";
58 content = {
59 type = "table";
60 format = "gpt";
61 partitions = [
62 { start = "2048s"; end = "-34s"; name = "hddLuksB"; content = { type = "luks"; name = "bigB"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zpool"; }; }; }
63 ];
64 };
65 };
66 };
67
68 zpool = {
69 zpool = {
70 type = "zpool";
71 mode = "mirror";
72 mountRoot = "/";
73 rootFsOptions = { mountpoint = "none"; atime = "off"; xattr = "sa"; acltype = "posix"; };
74 options = { ashift = "12"; };
75 datasets = zpoolDatasets;
76 };
77 zfast = {
78 type = "zpool";
79 mode = "mirror";
80 mountRoot = "/";
81 rootFsOptions = { mountpoint = "none"; atime = "off"; xattr = "sa"; acltype = "posix"; };
82 options = { ashift = "12"; };
83 datasets = zfastDatasets;
84 };
85 };
86 };
87}
diff --git a/systems/zoldene/flake.lock b/systems/zoldene/flake.lock
new file mode 100644
index 0000000..0a9ba64
--- /dev/null
+++ b/systems/zoldene/flake.lock
@@ -0,0 +1,560 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_2",
6 "nixpkgs": "nixpkgs_6"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "colmena": {
20 "inputs": {
21 "flake-compat": "flake-compat",
22 "flake-utils": "flake-utils",
23 "nixpkgs": "nixpkgs",
24 "stable": "stable"
25 },
26 "locked": {
27 "lastModified": 1687954574,
28 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
29 "owner": "immae",
30 "repo": "colmena",
31 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
32 "type": "github"
33 },
34 "original": {
35 "owner": "immae",
36 "ref": "add-lib-get-flake",
37 "repo": "colmena",
38 "type": "github"
39 }
40 },
41 "disko": {
42 "inputs": {
43 "nixpkgs": "nixpkgs_2"
44 },
45 "locked": {
46 "lastModified": 1687968164,
47 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
48 "owner": "nix-community",
49 "repo": "disko",
50 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
51 "type": "github"
52 },
53 "original": {
54 "owner": "nix-community",
55 "repo": "disko",
56 "type": "github"
57 }
58 },
59 "environment": {
60 "locked": {
61 "lastModified": 1,
62 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
63 "path": "../environment",
64 "type": "path"
65 },
66 "original": {
67 "path": "../environment",
68 "type": "path"
69 }
70 },
71 "flake-compat": {
72 "flake": false,
73 "locked": {
74 "lastModified": 1650374568,
75 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
76 "owner": "edolstra",
77 "repo": "flake-compat",
78 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
79 "type": "github"
80 },
81 "original": {
82 "owner": "edolstra",
83 "repo": "flake-compat",
84 "type": "github"
85 }
86 },
87 "flake-parts": {
88 "inputs": {
89 "nixpkgs-lib": "nixpkgs-lib"
90 },
91 "locked": {
92 "lastModified": 1687762428,
93 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
94 "owner": "hercules-ci",
95 "repo": "flake-parts",
96 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
97 "type": "github"
98 },
99 "original": {
100 "owner": "hercules-ci",
101 "repo": "flake-parts",
102 "type": "github"
103 }
104 },
105 "flake-parts_2": {
106 "inputs": {
107 "nixpkgs-lib": "nixpkgs-lib_2"
108 },
109 "locked": {
110 "lastModified": 1675295133,
111 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
112 "owner": "hercules-ci",
113 "repo": "flake-parts",
114 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
115 "type": "github"
116 },
117 "original": {
118 "owner": "hercules-ci",
119 "repo": "flake-parts",
120 "type": "github"
121 }
122 },
123 "flake-utils": {
124 "locked": {
125 "lastModified": 1659877975,
126 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
127 "owner": "numtide",
128 "repo": "flake-utils",
129 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
130 "type": "github"
131 },
132 "original": {
133 "owner": "numtide",
134 "repo": "flake-utils",
135 "type": "github"
136 }
137 },
138 "flake-utils_2": {
139 "locked": {
140 "lastModified": 1667395993,
141 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
142 "owner": "numtide",
143 "repo": "flake-utils",
144 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
145 "type": "github"
146 },
147 "original": {
148 "owner": "numtide",
149 "repo": "flake-utils",
150 "type": "github"
151 }
152 },
153 "impermanence": {
154 "locked": {
155 "lastModified": 1684264534,
156 "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=",
157 "owner": "nix-community",
158 "repo": "impermanence",
159 "rev": "89253fb1518063556edd5e54509c30ac3089d5e6",
160 "type": "github"
161 },
162 "original": {
163 "owner": "nix-community",
164 "ref": "master",
165 "repo": "impermanence",
166 "type": "github"
167 }
168 },
169 "my-lib": {
170 "inputs": {
171 "colmena": "colmena",
172 "disko": "disko",
173 "flake-parts": "flake-parts",
174 "nixos-anywhere": "nixos-anywhere",
175 "nixpkgs": "nixpkgs_4"
176 },
177 "locked": {
178 "lastModified": 1,
179 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
180 "path": "../../flakes/lib",
181 "type": "path"
182 },
183 "original": {
184 "path": "../../flakes/lib",
185 "type": "path"
186 }
187 },
188 "mypackages": {
189 "inputs": {
190 "flake-parts": "flake-parts_2",
191 "nixpkgs": "nixpkgs_7",
192 "webapps-ttrss": "webapps-ttrss"
193 },
194 "locked": {
195 "lastModified": 1,
196 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
197 "path": "../../mypackages",
198 "type": "path"
199 },
200 "original": {
201 "path": "../../mypackages",
202 "type": "path"
203 }
204 },
205 "myuids": {
206 "locked": {
207 "lastModified": 1,
208 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
209 "path": "../../myuids",
210 "type": "path"
211 },
212 "original": {
213 "path": "../../myuids",
214 "type": "path"
215 }
216 },
217 "nixos-2305": {
218 "locked": {
219 "lastModified": 1687938137,
220 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
221 "owner": "NixOS",
222 "repo": "nixpkgs",
223 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
224 "type": "github"
225 },
226 "original": {
227 "owner": "NixOS",
228 "ref": "release-23.05",
229 "repo": "nixpkgs",
230 "type": "github"
231 }
232 },
233 "nixos-anywhere": {
234 "inputs": {
235 "disko": [
236 "my-lib",
237 "disko"
238 ],
239 "flake-parts": [
240 "my-lib",
241 "flake-parts"
242 ],
243 "nixos-2305": "nixos-2305",
244 "nixos-images": "nixos-images",
245 "nixpkgs": "nixpkgs_3",
246 "treefmt-nix": "treefmt-nix"
247 },
248 "locked": {
249 "lastModified": 1689945193,
250 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
251 "owner": "numtide",
252 "repo": "nixos-anywhere",
253 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
254 "type": "github"
255 },
256 "original": {
257 "owner": "numtide",
258 "repo": "nixos-anywhere",
259 "type": "github"
260 }
261 },
262 "nixos-images": {
263 "inputs": {
264 "nixos-2305": [
265 "my-lib",
266 "nixos-anywhere",
267 "nixos-2305"
268 ],
269 "nixos-unstable": [
270 "my-lib",
271 "nixos-anywhere",
272 "nixpkgs"
273 ]
274 },
275 "locked": {
276 "lastModified": 1686819168,
277 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
278 "owner": "nix-community",
279 "repo": "nixos-images",
280 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
281 "type": "github"
282 },
283 "original": {
284 "owner": "nix-community",
285 "repo": "nixos-images",
286 "type": "github"
287 }
288 },
289 "nixpkgs": {
290 "locked": {
291 "lastModified": 1683408522,
292 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
293 "owner": "NixOS",
294 "repo": "nixpkgs",
295 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
296 "type": "github"
297 },
298 "original": {
299 "owner": "NixOS",
300 "ref": "nixos-unstable",
301 "repo": "nixpkgs",
302 "type": "github"
303 }
304 },
305 "nixpkgs-lib": {
306 "locked": {
307 "dir": "lib",
308 "lastModified": 1685564631,
309 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
310 "owner": "NixOS",
311 "repo": "nixpkgs",
312 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
313 "type": "github"
314 },
315 "original": {
316 "dir": "lib",
317 "owner": "NixOS",
318 "ref": "nixos-unstable",
319 "repo": "nixpkgs",
320 "type": "github"
321 }
322 },
323 "nixpkgs-lib_2": {
324 "locked": {
325 "dir": "lib",
326 "lastModified": 1675183161,
327 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
328 "owner": "NixOS",
329 "repo": "nixpkgs",
330 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
331 "type": "github"
332 },
333 "original": {
334 "dir": "lib",
335 "owner": "NixOS",
336 "ref": "nixos-unstable",
337 "repo": "nixpkgs",
338 "type": "github"
339 }
340 },
341 "nixpkgs_2": {
342 "locked": {
343 "lastModified": 1687701825,
344 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
345 "owner": "NixOS",
346 "repo": "nixpkgs",
347 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
348 "type": "github"
349 },
350 "original": {
351 "owner": "NixOS",
352 "ref": "nixpkgs-unstable",
353 "repo": "nixpkgs",
354 "type": "github"
355 }
356 },
357 "nixpkgs_3": {
358 "locked": {
359 "lastModified": 1687893427,
360 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
361 "owner": "nixos",
362 "repo": "nixpkgs",
363 "rev": "4b14ab2a916508442e685089672681dff46805be",
364 "type": "github"
365 },
366 "original": {
367 "owner": "nixos",
368 "ref": "nixos-unstable-small",
369 "repo": "nixpkgs",
370 "type": "github"
371 }
372 },
373 "nixpkgs_4": {
374 "locked": {
375 "lastModified": 1648725829,
376 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
377 "owner": "NixOS",
378 "repo": "nixpkgs",
379 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
380 "type": "github"
381 },
382 "original": {
383 "owner": "NixOS",
384 "repo": "nixpkgs",
385 "type": "github"
386 }
387 },
388 "nixpkgs_5": {
389 "locked": {
390 "lastModified": 1693158576,
391 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
392 "owner": "nixos",
393 "repo": "nixpkgs",
394 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
395 "type": "github"
396 },
397 "original": {
398 "owner": "NixOS",
399 "ref": "nixos-unstable",
400 "repo": "nixpkgs",
401 "type": "github"
402 }
403 },
404 "nixpkgs_6": {
405 "locked": {
406 "lastModified": 1687502512,
407 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
408 "owner": "NixOS",
409 "repo": "nixpkgs",
410 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
411 "type": "github"
412 },
413 "original": {
414 "owner": "NixOS",
415 "ref": "nixos-unstable",
416 "repo": "nixpkgs",
417 "type": "github"
418 }
419 },
420 "nixpkgs_7": {
421 "locked": {
422 "lastModified": 1646497237,
423 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
424 "owner": "nixos",
425 "repo": "nixpkgs",
426 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
427 "type": "github"
428 },
429 "original": {
430 "owner": "nixos",
431 "repo": "nixpkgs",
432 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
433 "type": "github"
434 }
435 },
436 "private-environment": {
437 "locked": {
438 "lastModified": 1,
439 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
440 "path": "../../flakes/private/environment",
441 "type": "path"
442 },
443 "original": {
444 "path": "../../flakes/private/environment",
445 "type": "path"
446 }
447 },
448 "private-system": {
449 "inputs": {
450 "backports": "backports",
451 "environment": "environment",
452 "mypackages": "mypackages",
453 "myuids": "myuids",
454 "secrets-public": "secrets-public"
455 },
456 "locked": {
457 "lastModified": 1,
458 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
459 "path": "../../flakes/private/system",
460 "type": "path"
461 },
462 "original": {
463 "path": "../../flakes/private/system",
464 "type": "path"
465 }
466 },
467 "public-secrets": {
468 "locked": {
469 "lastModified": 1,
470 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
471 "path": "../../flakes/secrets",
472 "type": "path"
473 },
474 "original": {
475 "path": "../../flakes/secrets",
476 "type": "path"
477 }
478 },
479 "root": {
480 "inputs": {
481 "impermanence": "impermanence",
482 "my-lib": "my-lib",
483 "nixpkgs": "nixpkgs_5",
484 "private-environment": "private-environment",
485 "private-system": "private-system",
486 "public-secrets": "public-secrets"
487 }
488 },
489 "secrets-public": {
490 "locked": {
491 "lastModified": 1,
492 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
493 "path": "../../secrets",
494 "type": "path"
495 },
496 "original": {
497 "path": "../../secrets",
498 "type": "path"
499 }
500 },
501 "stable": {
502 "locked": {
503 "lastModified": 1669735802,
504 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
505 "owner": "NixOS",
506 "repo": "nixpkgs",
507 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
508 "type": "github"
509 },
510 "original": {
511 "owner": "NixOS",
512 "ref": "nixos-22.11",
513 "repo": "nixpkgs",
514 "type": "github"
515 }
516 },
517 "treefmt-nix": {
518 "inputs": {
519 "nixpkgs": [
520 "my-lib",
521 "nixos-anywhere",
522 "nixpkgs"
523 ]
524 },
525 "locked": {
526 "lastModified": 1687940979,
527 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
528 "owner": "numtide",
529 "repo": "treefmt-nix",
530 "rev": "0a4f06c27610a99080b69433873885df82003aae",
531 "type": "github"
532 },
533 "original": {
534 "owner": "numtide",
535 "repo": "treefmt-nix",
536 "type": "github"
537 }
538 },
539 "webapps-ttrss": {
540 "flake": false,
541 "locked": {
542 "lastModified": 1546759381,
543 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
544 "ref": "master",
545 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
546 "revCount": 9256,
547 "type": "git",
548 "url": "https://git.tt-rss.org/fox/tt-rss.git"
549 },
550 "original": {
551 "ref": "master",
552 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
553 "type": "git",
554 "url": "https://git.tt-rss.org/fox/tt-rss.git"
555 }
556 }
557 },
558 "root": "root",
559 "version": 7
560}
diff --git a/systems/zoldene/flake.nix b/systems/zoldene/flake.nix
new file mode 100644
index 0000000..42466e8
--- /dev/null
+++ b/systems/zoldene/flake.nix
@@ -0,0 +1,29 @@
1{
2 inputs = {
3 nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
4 impermanence.url = "github:nix-community/impermanence/master";
5 my-lib.url = "path:../../flakes/lib";
6 public-secrets.url = "path:../../flakes/secrets";
7 private-environment.url = "path:../../flakes/private/environment";
8 private-system.url = "path:../../flakes/private/system";
9 };
10 outputs = inputs@{ self, nixpkgs, my-lib, ... }:
11 my-lib.lib.mkColmenaFlake {
12 name = "zoldene";
13 inherit self nixpkgs;
14 system = "x86_64-linux";
15 targetHost = "88.198.39.152";
16 targetUser = "root";
17 nixosModules = with inputs; {
18 impermanence = impermanence.nixosModule;
19 base = ./base.nix;
20 disko = ./disko.nix;
21 logging = ./logging.nix;
22
23 secrets = public-secrets.nixosModule;
24
25 environment = private-environment.nixosModule;
26 system = private-system.nixosModule;
27 };
28 };
29}
diff --git a/systems/zoldene/logging.nix b/systems/zoldene/logging.nix
new file mode 100644
index 0000000..09ee104
--- /dev/null
+++ b/systems/zoldene/logging.nix
@@ -0,0 +1,138 @@
1{ config, pkgs, name, ... }:
2# Initialization
3# CREATE INDEX ON LOGS (tag);
4# CREATE INDEX ON LOGS (time);
5# CREATE INDEX ON LOGS (((data->>'PRIORITY')::int));
6# CREATE INDEX ON LOGS ((data->>'_SYSTEMD_UNIT'));
7# CREATE INDEX ON LOGS ((data->>'SYSLOG_IDENTIFIER'));
8let
9 fluent-bit-config = {
10 pipeline = {
11 inputs = [
12 {
13 name = "systemd";
14 tag = "${name}.systemd";
15 DB = "/var/lib/fluentbit/fluent-bit.db";
16 }
17 ];
18 outputs = [
19 {
20 name = "loki";
21 match = "${name}.systemd";
22 line_format = "json";
23 labels = "job=fluentbit, server=${name}, priority=$PRIORITY, syslog_identifier=$SYSLOG_IDENTIFIER, systemd_unit=$_SYSTEMD_UNIT";
24 }
25 {
26 name = "pgsql";
27 match = "*";
28 host = "/run/postgresql";
29 user = "fluentbit";
30 table = "logs";
31 database = "fluentbit";
32 timestamp_key = "event_timestamp";
33 }
34 ];
35 };
36 };
37 yamlFormat = pkgs.formats.yaml {};
38 psqlVersion = pkgs.postgresql_13.psqlSchema;
39in
40{
41 disko.devices.zpool.zfast.datasets."root/persist/var/lib/loki" =
42 { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/loki"; options.mountpoint = "legacy"; };
43 disko.devices.zpool.zfast.datasets."root/persist/var/lib/fluentbit" =
44 { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/fluentbit"; options.mountpoint = "legacy"; };
45 disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql" =
46 { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql"; options.mountpoint = "legacy"; };
47 disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql/${psqlVersion}" =
48 { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql/${psqlVersion}"; options.mountpoint = "legacy"; };
49 environment.persistence."/persist/zfast".directories = [
50 {
51 directory = "/var/lib/postgresql";
52 user = config.users.users.postgres.name;
53 group = config.users.users.postgres.group;
54 mode = "0755";
55 }
56 {
57 directory = "/var/lib/fluentbit";
58 user = config.users.users.fluentbit.name;
59 group = config.users.users.fluentbit.group;
60 mode = "0755";
61 }
62 {
63 directory = "/var/lib/loki";
64 user = config.users.users.loki.name;
65 group = config.users.users.loki.group;
66 mode = "0755";
67 }
68 ];
69
70 ids.uids.fluentbit = 500;
71 ids.gids.fluentbit = 500;
72 users.users.fluentbit = {
73 name = "fluentbit";
74 home = "/var/lib/fluentbit";
75 uid = config.ids.uids.fluentbit;
76 group = "fluentbit";
77 isSystemUser = true;
78 extraGroups = [ "systemd-journal" ];
79 };
80 users.groups.fluentbit.gid = config.ids.gids.fluentbit;
81
82 services.loki = {
83 enable = true;
84 configuration = {
85 auth_enabled = false;
86 common = {
87 ring.kvstore.store = "inmemory";
88 ring.instance_addr = "127.0.0.1";
89 replication_factor = 1;
90 path_prefix = "/var/lib/loki";
91 };
92 server.log_level = "warn";
93 limits_config = {
94 reject_old_samples = false;
95 ingestion_rate_mb = 100;
96 ingestion_burst_size_mb = 200;
97 per_stream_rate_limit = "100MB";
98 per_stream_rate_limit_burst = "200MB";
99 };
100
101 schema_config.configs = [
102 {
103 from = "2020-10-24";
104 store = "boltdb-shipper";
105 object_store = "filesystem";
106 schema = "v11";
107 index.prefix = "index_";
108 index.period = "24h";
109 }
110 ];
111 };
112 };
113 services.postgresql = {
114 enable = true;
115 package = pkgs.postgresql_13;
116 ensureDatabases = [ "fluentbit" ];
117 ensureUsers = [
118 {
119 name = "fluentbit";
120 ensurePermissions."DATABASE \"fluentbit\"" = "ALL PRIVILEGES";
121 }
122 ];
123 };
124
125 environment.systemPackages = [
126 pkgs.fluent-bit
127 ];
128 systemd.services.fluent-bit = {
129 description = "Fluent-bit daemon";
130 wantedBy = [ "multi-user.target" ];
131 serviceConfig = {
132 ExecStart = "${pkgs.fluent-bit}/bin/fluent-bit -c ${yamlFormat.generate "fluent.yaml" fluent-bit-config}";
133 User = "fluentbit";
134 Group = "fluentbit";
135 SupplementaryGroups = [ "systemd-journal" ];
136 };
137 };
138}